procd: fix service file tracking
[openwrt.git] / target / linux / imx6 / patches-3.10 / 0030-PCI-imx6-remove-outbound-io-mem-ATU-region-mapping.patch
1 From 93d2b52fe73294d59bbce3a6d4da031647b1f3b2 Mon Sep 17 00:00:00 2001
2 From: Tim Harvey <tharvey@gateworks.com>
3 Date: Tue, 22 Oct 2013 15:56:40 -0700
4 Subject: [PATCH] PCI: imx6: remove outbound io/mem ATU region mapping
5
6 The IMX6 iATU is used for address translation between the AXI bus
7 address space and PCI address space.  This is used for type0 and type1
8 config cycles but is not necessary for outbound io/mem regions.
9
10 This patch removes the calls that inappropriately re-configures the ATU
11 viewport for outbound memory and IO after config cycles and removes them
12 altogether as they are not necessary.
13
14 This resolves issues with PCI devices behind switches and has been tested with
15 a Gige device behind a PLX PEX860x switch.
16
17 Signed-off-by: Tim Harvey <tharvey@gateworks.com>
18 ---
19  drivers/pci/host/pcie-designware.c |   41 +++---------------------------------
20  1 file changed, 3 insertions(+), 38 deletions(-)
21
22 --- a/drivers/pci/host/pcie-designware.c
23 +++ b/drivers/pci/host/pcie-designware.c
24 @@ -43,7 +43,6 @@
25  #define PCIE_ATU_VIEWPORT              0x900
26  #define PCIE_ATU_REGION_INBOUND                (0x1 << 31)
27  #define PCIE_ATU_REGION_OUTBOUND       (0x0 << 31)
28 -#define PCIE_ATU_REGION_INDEX1         (0x1 << 0)
29  #define PCIE_ATU_REGION_INDEX0         (0x0 << 0)
30  #define PCIE_ATU_CR1                   0x904
31  #define PCIE_ATU_TYPE_MEM              (0x0 << 0)
32 @@ -264,8 +263,8 @@ static void dw_pcie_prog_viewport_cfg0(s
33  
34  static void dw_pcie_prog_viewport_cfg1(struct pcie_port *pp, u32 busdev)
35  {
36 -       /* Program viewport 1 : OUTBOUND : CFG1 */
37 -       dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1,
38 +       /* Program viewport 0 : OUTBOUND : CFG1 */
39 +       dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0,
40                           PCIE_ATU_VIEWPORT);
41         dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, PCIE_ATU_CR1);
42         dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
43 @@ -275,38 +274,8 @@ static void dw_pcie_prog_viewport_cfg1(s
44                           PCIE_ATU_LIMIT);
45         dw_pcie_writel_rc(pp, busdev, PCIE_ATU_LOWER_TARGET);
46         dw_pcie_writel_rc(pp, 0, PCIE_ATU_UPPER_TARGET);
47 -}
48 -
49 -static void dw_pcie_prog_viewport_mem_outbound(struct pcie_port *pp)
50 -{
51 -       /* Program viewport 0 : OUTBOUND : MEM */
52 -       dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX0,
53 -                         PCIE_ATU_VIEWPORT);
54 -       dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_MEM, PCIE_ATU_CR1);
55 -       dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
56 -       dw_pcie_writel_rc(pp, pp->mem_base, PCIE_ATU_LOWER_BASE);
57 -       dw_pcie_writel_rc(pp, (pp->mem_base >> 32), PCIE_ATU_UPPER_BASE);
58 -       dw_pcie_writel_rc(pp, pp->mem_base + pp->config.mem_size - 1,
59 -                         PCIE_ATU_LIMIT);
60 -       dw_pcie_writel_rc(pp, pp->config.mem_bus_addr, PCIE_ATU_LOWER_TARGET);
61 -       dw_pcie_writel_rc(pp, upper_32_bits(pp->config.mem_bus_addr),
62 -                         PCIE_ATU_UPPER_TARGET);
63 -}
64 -
65 -static void dw_pcie_prog_viewport_io_outbound(struct pcie_port *pp)
66 -{
67 -       /* Program viewport 1 : OUTBOUND : IO */
68 -       dw_pcie_writel_rc(pp, PCIE_ATU_REGION_OUTBOUND | PCIE_ATU_REGION_INDEX1,
69 -                         PCIE_ATU_VIEWPORT);
70 -       dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_IO, PCIE_ATU_CR1);
71 +       dw_pcie_writel_rc(pp, PCIE_ATU_TYPE_CFG1, PCIE_ATU_CR1);
72         dw_pcie_writel_rc(pp, PCIE_ATU_ENABLE, PCIE_ATU_CR2);
73 -       dw_pcie_writel_rc(pp, pp->io_base, PCIE_ATU_LOWER_BASE);
74 -       dw_pcie_writel_rc(pp, (pp->io_base >> 32), PCIE_ATU_UPPER_BASE);
75 -       dw_pcie_writel_rc(pp, pp->io_base + pp->config.io_size - 1,
76 -                         PCIE_ATU_LIMIT);
77 -       dw_pcie_writel_rc(pp, pp->config.io_bus_addr, PCIE_ATU_LOWER_TARGET);
78 -       dw_pcie_writel_rc(pp, upper_32_bits(pp->config.io_bus_addr),
79 -                         PCIE_ATU_UPPER_TARGET);
80  }
81  
82  static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,
83 @@ -322,11 +291,9 @@ static int dw_pcie_rd_other_conf(struct
84         if (bus->parent->number == pp->root_bus_nr) {
85                 dw_pcie_prog_viewport_cfg0(pp, busdev);
86                 ret = cfg_read(pp->va_cfg0_base + address, where, size, val);
87 -               dw_pcie_prog_viewport_mem_outbound(pp);
88         } else {
89                 dw_pcie_prog_viewport_cfg1(pp, busdev);
90                 ret = cfg_read(pp->va_cfg1_base + address, where, size, val);
91 -               dw_pcie_prog_viewport_io_outbound(pp);
92         }
93  
94         return ret;
95 @@ -345,11 +312,9 @@ static int dw_pcie_wr_other_conf(struct
96         if (bus->parent->number == pp->root_bus_nr) {
97                 dw_pcie_prog_viewport_cfg0(pp, busdev);
98                 ret = cfg_write(pp->va_cfg0_base + address, where, size, val);
99 -               dw_pcie_prog_viewport_mem_outbound(pp);
100         } else {
101                 dw_pcie_prog_viewport_cfg1(pp, busdev);
102                 ret = cfg_write(pp->va_cfg1_base + address, where, size, val);
103 -               dw_pcie_prog_viewport_io_outbound(pp);
104         }
105  
106         return ret;