diff options
author | Rob Herring <rob.herring@calxeda.com> | 2012-07-10 00:26:58 -0400 |
---|---|---|
committer | Rob Herring <rob.herring@calxeda.com> | 2012-07-26 10:10:03 -0400 |
commit | 0b9b18e0166d8925ed222335efbc3cfd66aa882f (patch) | |
tree | d10fe7312e7873d1f9474b51a133a58782bf54ce | |
parent | e7adf1e0a5ed7d15a9ed8679a59156118f4a63c4 (diff) |
ARM: mv78xx0: use fixed pci i/o mapping
Move mv78xx0 PCI to fixed i/o mapping and remove io.h. This changes the PCI
bus addresses from the cpu address to 0 based. It appears that there is
translation h/w for this, but its untested.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
-rw-r--r-- | arch/arm/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-mv78xx0/addr-map.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-mv78xx0/common.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-mv78xx0/include/mach/io.h | 24 | ||||
-rw-r--r-- | arch/arm/mach-mv78xx0/include/mach/mv78xx0.h | 21 | ||||
-rw-r--r-- | arch/arm/mach-mv78xx0/pcie.c | 110 |
6 files changed, 45 insertions, 119 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index c61e0a41d799..1b7faa5a085d 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -571,7 +571,6 @@ config ARCH_MV78XX0 | |||
571 | select PCI | 571 | select PCI |
572 | select ARCH_REQUIRE_GPIOLIB | 572 | select ARCH_REQUIRE_GPIOLIB |
573 | select GENERIC_CLOCKEVENTS | 573 | select GENERIC_CLOCKEVENTS |
574 | select NEED_MACH_IO_H | ||
575 | select PLAT_ORION | 574 | select PLAT_ORION |
576 | help | 575 | help |
577 | Support for the following Marvell MV78xx0 series SoCs: | 576 | Support for the following Marvell MV78xx0 series SoCs: |
diff --git a/arch/arm/mach-mv78xx0/addr-map.c b/arch/arm/mach-mv78xx0/addr-map.c index 62b53d710efd..7764d9386f2a 100644 --- a/arch/arm/mach-mv78xx0/addr-map.c +++ b/arch/arm/mach-mv78xx0/addr-map.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | #include <plat/addr-map.h> | 15 | #include <plat/addr-map.h> |
16 | #include <mach/mv78xx0.h> | ||
16 | #include "common.h" | 17 | #include "common.h" |
17 | 18 | ||
18 | /* | 19 | /* |
@@ -81,7 +82,7 @@ void __init mv78xx0_setup_pcie_io_win(int window, u32 base, u32 size, | |||
81 | int maj, int min) | 82 | int maj, int min) |
82 | { | 83 | { |
83 | orion_setup_cpu_win(&addr_map_cfg, window, base, size, | 84 | orion_setup_cpu_win(&addr_map_cfg, window, base, size, |
84 | TARGET_PCIE(maj), ATTR_PCIE_IO(min), -1); | 85 | TARGET_PCIE(maj), ATTR_PCIE_IO(min), 0); |
85 | } | 86 | } |
86 | 87 | ||
87 | void __init mv78xx0_setup_pcie_mem_win(int window, u32 base, u32 size, | 88 | void __init mv78xx0_setup_pcie_mem_win(int window, u32 base, u32 size, |
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index b4c53b846c9c..20826449e61b 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
@@ -135,11 +135,6 @@ static struct map_desc mv78xx0_io_desc[] __initdata = { | |||
135 | .length = MV78XX0_CORE_REGS_SIZE, | 135 | .length = MV78XX0_CORE_REGS_SIZE, |
136 | .type = MT_DEVICE, | 136 | .type = MT_DEVICE, |
137 | }, { | 137 | }, { |
138 | .virtual = MV78XX0_PCIE_IO_VIRT_BASE(0), | ||
139 | .pfn = __phys_to_pfn(MV78XX0_PCIE_IO_PHYS_BASE(0)), | ||
140 | .length = MV78XX0_PCIE_IO_SIZE * 8, | ||
141 | .type = MT_DEVICE, | ||
142 | }, { | ||
143 | .virtual = MV78XX0_REGS_VIRT_BASE, | 138 | .virtual = MV78XX0_REGS_VIRT_BASE, |
144 | .pfn = __phys_to_pfn(MV78XX0_REGS_PHYS_BASE), | 139 | .pfn = __phys_to_pfn(MV78XX0_REGS_PHYS_BASE), |
145 | .length = MV78XX0_REGS_SIZE, | 140 | .length = MV78XX0_REGS_SIZE, |
diff --git a/arch/arm/mach-mv78xx0/include/mach/io.h b/arch/arm/mach-mv78xx0/include/mach/io.h deleted file mode 100644 index c7d9d00d8fc1..000000000000 --- a/arch/arm/mach-mv78xx0/include/mach/io.h +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-mv78xx0/include/mach/io.h | ||
3 | * | ||
4 | * This file is licensed under the terms of the GNU General Public | ||
5 | * License version 2. This program is licensed "as is" without any | ||
6 | * warranty of any kind, whether express or implied. | ||
7 | */ | ||
8 | |||
9 | #ifndef __ASM_ARCH_IO_H | ||
10 | #define __ASM_ARCH_IO_H | ||
11 | |||
12 | #include "mv78xx0.h" | ||
13 | |||
14 | #define IO_SPACE_LIMIT 0xffffffff | ||
15 | |||
16 | static inline void __iomem *__io(unsigned long addr) | ||
17 | { | ||
18 | return (void __iomem *)((addr - MV78XX0_PCIE_IO_PHYS_BASE(0)) | ||
19 | + MV78XX0_PCIE_IO_VIRT_BASE(0)); | ||
20 | } | ||
21 | |||
22 | #define __io(a) __io(a) | ||
23 | |||
24 | #endif | ||
diff --git a/arch/arm/mach-mv78xx0/include/mach/mv78xx0.h b/arch/arm/mach-mv78xx0/include/mach/mv78xx0.h index e807c4c52a0b..bd03fed1128e 100644 --- a/arch/arm/mach-mv78xx0/include/mach/mv78xx0.h +++ b/arch/arm/mach-mv78xx0/include/mach/mv78xx0.h | |||
@@ -29,15 +29,15 @@ | |||
29 | * | 29 | * |
30 | * virt phys size | 30 | * virt phys size |
31 | * fe400000 f102x000 16K core-specific peripheral registers | 31 | * fe400000 f102x000 16K core-specific peripheral registers |
32 | * fe700000 f0800000 1M PCIe #0 I/O space | 32 | * fee00000 f0800000 64K PCIe #0 I/O space |
33 | * fe800000 f0900000 1M PCIe #1 I/O space | 33 | * fee10000 f0900000 64K PCIe #1 I/O space |
34 | * fe900000 f0a00000 1M PCIe #2 I/O space | 34 | * fee20000 f0a00000 64K PCIe #2 I/O space |
35 | * fea00000 f0b00000 1M PCIe #3 I/O space | 35 | * fee30000 f0b00000 64K PCIe #3 I/O space |
36 | * feb00000 f0c00000 1M PCIe #4 I/O space | 36 | * fee40000 f0c00000 64K PCIe #4 I/O space |
37 | * fec00000 f0d00000 1M PCIe #5 I/O space | 37 | * fee50000 f0d00000 64K PCIe #5 I/O space |
38 | * fed00000 f0e00000 1M PCIe #6 I/O space | 38 | * fee60000 f0e00000 64K PCIe #6 I/O space |
39 | * fee00000 f0f00000 1M PCIe #7 I/O space | 39 | * fee70000 f0f00000 64K PCIe #7 I/O space |
40 | * fef00000 f1000000 1M on-chip peripheral registers | 40 | * fd000000 f1000000 1M on-chip peripheral registers |
41 | */ | 41 | */ |
42 | #define MV78XX0_CORE0_REGS_PHYS_BASE 0xf1020000 | 42 | #define MV78XX0_CORE0_REGS_PHYS_BASE 0xf1020000 |
43 | #define MV78XX0_CORE1_REGS_PHYS_BASE 0xf1024000 | 43 | #define MV78XX0_CORE1_REGS_PHYS_BASE 0xf1024000 |
@@ -46,11 +46,10 @@ | |||
46 | #define MV78XX0_CORE_REGS_SIZE SZ_16K | 46 | #define MV78XX0_CORE_REGS_SIZE SZ_16K |
47 | 47 | ||
48 | #define MV78XX0_PCIE_IO_PHYS_BASE(i) (0xf0800000 + ((i) << 20)) | 48 | #define MV78XX0_PCIE_IO_PHYS_BASE(i) (0xf0800000 + ((i) << 20)) |
49 | #define MV78XX0_PCIE_IO_VIRT_BASE(i) (0xfe700000 + ((i) << 20)) | ||
50 | #define MV78XX0_PCIE_IO_SIZE SZ_1M | 49 | #define MV78XX0_PCIE_IO_SIZE SZ_1M |
51 | 50 | ||
52 | #define MV78XX0_REGS_PHYS_BASE 0xf1000000 | 51 | #define MV78XX0_REGS_PHYS_BASE 0xf1000000 |
53 | #define MV78XX0_REGS_VIRT_BASE 0xfef00000 | 52 | #define MV78XX0_REGS_VIRT_BASE 0xfd000000 |
54 | #define MV78XX0_REGS_SIZE SZ_1M | 53 | #define MV78XX0_REGS_SIZE SZ_1M |
55 | 54 | ||
56 | #define MV78XX0_PCIE_MEM_PHYS_BASE 0xc0000000 | 55 | #define MV78XX0_PCIE_MEM_PHYS_BASE 0xc0000000 |
diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c index 2e56e86b6d68..26a059b4f472 100644 --- a/arch/arm/mach-mv78xx0/pcie.c +++ b/arch/arm/mach-mv78xx0/pcie.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <asm/mach/pci.h> | 15 | #include <asm/mach/pci.h> |
16 | #include <plat/pcie.h> | 16 | #include <plat/pcie.h> |
17 | #include <plat/addr-map.h> | 17 | #include <plat/addr-map.h> |
18 | #include <mach/mv78xx0.h> | ||
18 | #include "common.h" | 19 | #include "common.h" |
19 | 20 | ||
20 | struct pcie_port { | 21 | struct pcie_port { |
@@ -23,16 +24,13 @@ struct pcie_port { | |||
23 | u8 root_bus_nr; | 24 | u8 root_bus_nr; |
24 | void __iomem *base; | 25 | void __iomem *base; |
25 | spinlock_t conf_lock; | 26 | spinlock_t conf_lock; |
26 | char io_space_name[16]; | ||
27 | char mem_space_name[16]; | 27 | char mem_space_name[16]; |
28 | struct resource res[2]; | 28 | struct resource res; |
29 | }; | 29 | }; |
30 | 30 | ||
31 | static struct pcie_port pcie_port[8]; | 31 | static struct pcie_port pcie_port[8]; |
32 | static int num_pcie_ports; | 32 | static int num_pcie_ports; |
33 | static struct resource pcie_io_space; | 33 | static struct resource pcie_io_space; |
34 | static struct resource pcie_mem_space; | ||
35 | |||
36 | 34 | ||
37 | void __init mv78xx0_pcie_id(u32 *dev, u32 *rev) | 35 | void __init mv78xx0_pcie_id(u32 *dev, u32 *rev) |
38 | { | 36 | { |
@@ -40,102 +38,59 @@ void __init mv78xx0_pcie_id(u32 *dev, u32 *rev) | |||
40 | *rev = orion_pcie_rev((void __iomem *)PCIE00_VIRT_BASE); | 38 | *rev = orion_pcie_rev((void __iomem *)PCIE00_VIRT_BASE); |
41 | } | 39 | } |
42 | 40 | ||
41 | u32 pcie_port_size[8] = { | ||
42 | 0, | ||
43 | 0x30000000, | ||
44 | 0x10000000, | ||
45 | 0x10000000, | ||
46 | 0x08000000, | ||
47 | 0x08000000, | ||
48 | 0x08000000, | ||
49 | 0x04000000, | ||
50 | }; | ||
51 | |||
43 | static void __init mv78xx0_pcie_preinit(void) | 52 | static void __init mv78xx0_pcie_preinit(void) |
44 | { | 53 | { |
45 | int i; | 54 | int i; |
46 | u32 size_each; | 55 | u32 size_each; |
47 | u32 start; | 56 | u32 start; |
48 | int win; | 57 | int win = 0; |
49 | 58 | ||
50 | pcie_io_space.name = "PCIe I/O Space"; | 59 | pcie_io_space.name = "PCIe I/O Space"; |
51 | pcie_io_space.start = MV78XX0_PCIE_IO_PHYS_BASE(0); | 60 | pcie_io_space.start = MV78XX0_PCIE_IO_PHYS_BASE(0); |
52 | pcie_io_space.end = | 61 | pcie_io_space.end = |
53 | MV78XX0_PCIE_IO_PHYS_BASE(0) + MV78XX0_PCIE_IO_SIZE * 8 - 1; | 62 | MV78XX0_PCIE_IO_PHYS_BASE(0) + MV78XX0_PCIE_IO_SIZE * 8 - 1; |
54 | pcie_io_space.flags = IORESOURCE_IO; | 63 | pcie_io_space.flags = IORESOURCE_MEM; |
55 | if (request_resource(&iomem_resource, &pcie_io_space)) | 64 | if (request_resource(&iomem_resource, &pcie_io_space)) |
56 | panic("can't allocate PCIe I/O space"); | 65 | panic("can't allocate PCIe I/O space"); |
57 | 66 | ||
58 | pcie_mem_space.name = "PCIe MEM Space"; | 67 | if (num_pcie_ports > 7) |
59 | pcie_mem_space.start = MV78XX0_PCIE_MEM_PHYS_BASE; | 68 | panic("invalid number of PCIe ports"); |
60 | pcie_mem_space.end = | 69 | |
61 | MV78XX0_PCIE_MEM_PHYS_BASE + MV78XX0_PCIE_MEM_SIZE - 1; | 70 | size_each = pcie_port_size[num_pcie_ports]; |
62 | pcie_mem_space.flags = IORESOURCE_MEM; | ||
63 | if (request_resource(&iomem_resource, &pcie_mem_space)) | ||
64 | panic("can't allocate PCIe MEM space"); | ||
65 | 71 | ||
72 | start = MV78XX0_PCIE_MEM_PHYS_BASE; | ||
66 | for (i = 0; i < num_pcie_ports; i++) { | 73 | for (i = 0; i < num_pcie_ports; i++) { |
67 | struct pcie_port *pp = pcie_port + i; | 74 | struct pcie_port *pp = pcie_port + i; |
68 | 75 | ||
69 | snprintf(pp->io_space_name, sizeof(pp->io_space_name), | ||
70 | "PCIe %d.%d I/O", pp->maj, pp->min); | ||
71 | pp->io_space_name[sizeof(pp->io_space_name) - 1] = 0; | ||
72 | pp->res[0].name = pp->io_space_name; | ||
73 | pp->res[0].start = MV78XX0_PCIE_IO_PHYS_BASE(i); | ||
74 | pp->res[0].end = pp->res[0].start + MV78XX0_PCIE_IO_SIZE - 1; | ||
75 | pp->res[0].flags = IORESOURCE_IO; | ||
76 | |||
77 | snprintf(pp->mem_space_name, sizeof(pp->mem_space_name), | 76 | snprintf(pp->mem_space_name, sizeof(pp->mem_space_name), |
78 | "PCIe %d.%d MEM", pp->maj, pp->min); | 77 | "PCIe %d.%d MEM", pp->maj, pp->min); |
79 | pp->mem_space_name[sizeof(pp->mem_space_name) - 1] = 0; | 78 | pp->mem_space_name[sizeof(pp->mem_space_name) - 1] = 0; |
80 | pp->res[1].name = pp->mem_space_name; | 79 | pp->res.name = pp->mem_space_name; |
81 | pp->res[1].flags = IORESOURCE_MEM; | 80 | pp->res.flags = IORESOURCE_MEM; |
82 | } | 81 | pp->res.start = start; |
83 | 82 | pp->res.end = start + size_each - 1; | |
84 | switch (num_pcie_ports) { | ||
85 | case 0: | ||
86 | size_each = 0; | ||
87 | break; | ||
88 | |||
89 | case 1: | ||
90 | size_each = 0x30000000; | ||
91 | break; | ||
92 | |||
93 | case 2 ... 3: | ||
94 | size_each = 0x10000000; | ||
95 | break; | ||
96 | |||
97 | case 4 ... 6: | ||
98 | size_each = 0x08000000; | ||
99 | break; | ||
100 | |||
101 | case 7: | ||
102 | size_each = 0x04000000; | ||
103 | break; | ||
104 | |||
105 | default: | ||
106 | panic("invalid number of PCIe ports"); | ||
107 | } | ||
108 | |||
109 | start = MV78XX0_PCIE_MEM_PHYS_BASE; | ||
110 | for (i = 0; i < num_pcie_ports; i++) { | ||
111 | struct pcie_port *pp = pcie_port + i; | ||
112 | |||
113 | pp->res[1].start = start; | ||
114 | pp->res[1].end = start + size_each - 1; | ||
115 | start += size_each; | 83 | start += size_each; |
116 | } | ||
117 | |||
118 | for (i = 0; i < num_pcie_ports; i++) { | ||
119 | struct pcie_port *pp = pcie_port + i; | ||
120 | 84 | ||
121 | if (request_resource(&pcie_io_space, &pp->res[0])) | 85 | if (request_resource(&iomem_resource, &pp->res)) |
122 | panic("can't allocate PCIe I/O sub-space"); | ||
123 | |||
124 | if (request_resource(&pcie_mem_space, &pp->res[1])) | ||
125 | panic("can't allocate PCIe MEM sub-space"); | 86 | panic("can't allocate PCIe MEM sub-space"); |
126 | } | ||
127 | 87 | ||
128 | win = 0; | 88 | mv78xx0_setup_pcie_mem_win(win + i + 8, pp->res.start, |
129 | for (i = 0; i < num_pcie_ports; i++) { | 89 | resource_size(&pp->res), |
130 | struct pcie_port *pp = pcie_port + i; | 90 | pp->maj, pp->min); |
131 | 91 | ||
132 | mv78xx0_setup_pcie_io_win(win++, pp->res[0].start, | 92 | mv78xx0_setup_pcie_io_win(win + i, i * SZ_64K, SZ_64K, |
133 | resource_size(&pp->res[0]), | ||
134 | pp->maj, pp->min); | 93 | pp->maj, pp->min); |
135 | |||
136 | mv78xx0_setup_pcie_mem_win(win++, pp->res[1].start, | ||
137 | resource_size(&pp->res[1]), | ||
138 | pp->maj, pp->min); | ||
139 | } | 94 | } |
140 | } | 95 | } |
141 | 96 | ||
@@ -156,8 +111,9 @@ static int __init mv78xx0_pcie_setup(int nr, struct pci_sys_data *sys) | |||
156 | orion_pcie_set_local_bus_nr(pp->base, sys->busnr); | 111 | orion_pcie_set_local_bus_nr(pp->base, sys->busnr); |
157 | orion_pcie_setup(pp->base); | 112 | orion_pcie_setup(pp->base); |
158 | 113 | ||
159 | pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset); | 114 | pci_ioremap_io(nr * SZ_64K, MV78XX0_PCIE_IO_PHYS_BASE(nr)); |
160 | pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset); | 115 | |
116 | pci_add_resource_offset(&sys->resources, &pp->res, sys->mem_offset); | ||
161 | 117 | ||
162 | return 1; | 118 | return 1; |
163 | } | 119 | } |
@@ -281,7 +237,7 @@ static void __init add_pcie_port(int maj, int min, unsigned long base) | |||
281 | pp->root_bus_nr = -1; | 237 | pp->root_bus_nr = -1; |
282 | pp->base = (void __iomem *)base; | 238 | pp->base = (void __iomem *)base; |
283 | spin_lock_init(&pp->conf_lock); | 239 | spin_lock_init(&pp->conf_lock); |
284 | memset(pp->res, 0, sizeof(pp->res)); | 240 | memset(&pp->res, 0, sizeof(pp->res)); |
285 | } else { | 241 | } else { |
286 | printk("link down, ignoring\n"); | 242 | printk("link down, ignoring\n"); |
287 | } | 243 | } |