1 // SPDX-License-Identifier: GPL-2.0-only
3 * arch/arm/mach-mv78xx0/pcie.c
5 * PCIe functions for Marvell MV78xx0 SoCs
8 #include <linux/kernel.h>
10 #include <linux/mbus.h>
11 #include <video/vga.h>
13 #include <asm/mach/pci.h>
14 #include <plat/pcie.h>
18 #define MV78XX0_MBUS_PCIE_MEM_TARGET(port, lane) ((port) ? 8 : 4)
19 #define MV78XX0_MBUS_PCIE_MEM_ATTR(port, lane) (0xf8 & ~(0x10 << (lane)))
20 #define MV78XX0_MBUS_PCIE_IO_TARGET(port, lane) ((port) ? 8 : 4)
21 #define MV78XX0_MBUS_PCIE_IO_ATTR(port, lane) (0xf0 & ~(0x10 << (lane)))
29 char mem_space_name
[20];
33 static struct pcie_port pcie_port
[8];
34 static int num_pcie_ports
;
35 static struct resource pcie_io_space
;
37 void __init
mv78xx0_pcie_id(u32
*dev
, u32
*rev
)
39 *dev
= orion_pcie_dev_id(PCIE00_VIRT_BASE
);
40 *rev
= orion_pcie_rev(PCIE00_VIRT_BASE
);
43 u32 pcie_port_size
[8] = {
54 static void __init
mv78xx0_pcie_preinit(void)
60 pcie_io_space
.name
= "PCIe I/O Space";
61 pcie_io_space
.start
= MV78XX0_PCIE_IO_PHYS_BASE(0);
63 MV78XX0_PCIE_IO_PHYS_BASE(0) + MV78XX0_PCIE_IO_SIZE
* 8 - 1;
64 pcie_io_space
.flags
= IORESOURCE_MEM
;
65 if (request_resource(&iomem_resource
, &pcie_io_space
))
66 panic("can't allocate PCIe I/O space");
68 if (num_pcie_ports
> 7)
69 panic("invalid number of PCIe ports");
71 size_each
= pcie_port_size
[num_pcie_ports
];
73 start
= MV78XX0_PCIE_MEM_PHYS_BASE
;
74 for (i
= 0; i
< num_pcie_ports
; i
++) {
75 struct pcie_port
*pp
= pcie_port
+ i
;
77 snprintf(pp
->mem_space_name
, sizeof(pp
->mem_space_name
),
78 "PCIe %d.%d MEM", pp
->maj
, pp
->min
);
79 pp
->mem_space_name
[sizeof(pp
->mem_space_name
) - 1] = 0;
80 pp
->res
.name
= pp
->mem_space_name
;
81 pp
->res
.flags
= IORESOURCE_MEM
;
82 pp
->res
.start
= start
;
83 pp
->res
.end
= start
+ size_each
- 1;
86 if (request_resource(&iomem_resource
, &pp
->res
))
87 panic("can't allocate PCIe MEM sub-space");
89 mvebu_mbus_add_window_by_id(MV78XX0_MBUS_PCIE_MEM_TARGET(pp
->maj
, pp
->min
),
90 MV78XX0_MBUS_PCIE_MEM_ATTR(pp
->maj
, pp
->min
),
91 pp
->res
.start
, resource_size(&pp
->res
));
92 mvebu_mbus_add_window_remap_by_id(MV78XX0_MBUS_PCIE_IO_TARGET(pp
->maj
, pp
->min
),
93 MV78XX0_MBUS_PCIE_IO_ATTR(pp
->maj
, pp
->min
),
94 i
* SZ_64K
, SZ_64K
, 0);
98 static int __init
mv78xx0_pcie_setup(int nr
, struct pci_sys_data
*sys
)
100 struct pcie_port
*pp
;
101 struct resource realio
;
103 if (nr
>= num_pcie_ports
)
107 sys
->private_data
= pp
;
108 pp
->root_bus_nr
= sys
->busnr
;
111 * Generic PCIe unit setup.
113 orion_pcie_set_local_bus_nr(pp
->base
, sys
->busnr
);
114 orion_pcie_setup(pp
->base
);
116 realio
.start
= nr
* SZ_64K
;
117 realio
.end
= realio
.start
+ SZ_64K
- 1;
118 pci_remap_iospace(&realio
, MV78XX0_PCIE_IO_PHYS_BASE(nr
));
120 pci_add_resource_offset(&sys
->resources
, &pp
->res
, sys
->mem_offset
);
125 static int pcie_valid_config(struct pcie_port
*pp
, int bus
, int dev
)
128 * Don't go out when trying to access nonexisting devices
131 if (bus
== pp
->root_bus_nr
&& dev
> 1)
137 static int pcie_rd_conf(struct pci_bus
*bus
, u32 devfn
, int where
,
140 struct pci_sys_data
*sys
= bus
->sysdata
;
141 struct pcie_port
*pp
= sys
->private_data
;
145 if (pcie_valid_config(pp
, bus
->number
, PCI_SLOT(devfn
)) == 0) {
147 return PCIBIOS_DEVICE_NOT_FOUND
;
150 spin_lock_irqsave(&pp
->conf_lock
, flags
);
151 ret
= orion_pcie_rd_conf(pp
->base
, bus
, devfn
, where
, size
, val
);
152 spin_unlock_irqrestore(&pp
->conf_lock
, flags
);
157 static int pcie_wr_conf(struct pci_bus
*bus
, u32 devfn
,
158 int where
, int size
, u32 val
)
160 struct pci_sys_data
*sys
= bus
->sysdata
;
161 struct pcie_port
*pp
= sys
->private_data
;
165 if (pcie_valid_config(pp
, bus
->number
, PCI_SLOT(devfn
)) == 0)
166 return PCIBIOS_DEVICE_NOT_FOUND
;
168 spin_lock_irqsave(&pp
->conf_lock
, flags
);
169 ret
= orion_pcie_wr_conf(pp
->base
, bus
, devfn
, where
, size
, val
);
170 spin_unlock_irqrestore(&pp
->conf_lock
, flags
);
175 static struct pci_ops pcie_ops
= {
176 .read
= pcie_rd_conf
,
177 .write
= pcie_wr_conf
,
181 * The root complex has a hardwired class of PCI_CLASS_MEMORY_OTHER, when it
182 * is operating as a root complex this needs to be switched to
183 * PCI_CLASS_BRIDGE_HOST or Linux will errantly try to process the BAR's on
184 * the device. Decoding setup is handled by the orion code.
186 static void rc_pci_fixup(struct pci_dev
*dev
)
188 if (dev
->bus
->parent
== NULL
&& dev
->devfn
== 0) {
192 dev
->class |= PCI_CLASS_BRIDGE_HOST
<< 8;
193 pci_dev_for_each_resource(dev
, r
) {
200 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL
, PCI_ANY_ID
, rc_pci_fixup
);
202 static int __init
mv78xx0_pcie_scan_bus(int nr
, struct pci_host_bridge
*bridge
)
204 struct pci_sys_data
*sys
= pci_host_bridge_priv(bridge
);
206 if (nr
>= num_pcie_ports
) {
211 list_splice_init(&sys
->resources
, &bridge
->windows
);
212 bridge
->dev
.parent
= NULL
;
213 bridge
->sysdata
= sys
;
214 bridge
->busnr
= sys
->busnr
;
215 bridge
->ops
= &pcie_ops
;
217 return pci_scan_root_bus_bridge(bridge
);
220 static int __init
mv78xx0_pcie_map_irq(const struct pci_dev
*dev
, u8 slot
,
223 struct pci_sys_data
*sys
= dev
->bus
->sysdata
;
224 struct pcie_port
*pp
= sys
->private_data
;
226 return IRQ_MV78XX0_PCIE_00
+ (pp
->maj
<< 2) + pp
->min
;
229 static struct hw_pci mv78xx0_pci __initdata
= {
231 .preinit
= mv78xx0_pcie_preinit
,
232 .setup
= mv78xx0_pcie_setup
,
233 .scan
= mv78xx0_pcie_scan_bus
,
234 .map_irq
= mv78xx0_pcie_map_irq
,
237 static void __init
add_pcie_port(int maj
, int min
, void __iomem
*base
)
239 printk(KERN_INFO
"MV78xx0 PCIe port %d.%d: ", maj
, min
);
241 if (orion_pcie_link_up(base
)) {
242 struct pcie_port
*pp
= &pcie_port
[num_pcie_ports
++];
248 pp
->root_bus_nr
= -1;
250 spin_lock_init(&pp
->conf_lock
);
251 memset(&pp
->res
, 0, sizeof(pp
->res
));
253 printk("link down, ignoring\n");
257 void __init
mv78xx0_pcie_init(int init_port0
, int init_port1
)
259 vga_base
= MV78XX0_PCIE_MEM_PHYS_BASE
;
262 add_pcie_port(0, 0, PCIE00_VIRT_BASE
);
263 if (!orion_pcie_x4_mode(PCIE00_VIRT_BASE
)) {
264 add_pcie_port(0, 1, PCIE01_VIRT_BASE
);
265 add_pcie_port(0, 2, PCIE02_VIRT_BASE
);
266 add_pcie_port(0, 3, PCIE03_VIRT_BASE
);
271 add_pcie_port(1, 0, PCIE10_VIRT_BASE
);
272 if (!orion_pcie_x4_mode((void __iomem
*)PCIE10_VIRT_BASE
)) {
273 add_pcie_port(1, 1, PCIE11_VIRT_BASE
);
274 add_pcie_port(1, 2, PCIE12_VIRT_BASE
);
275 add_pcie_port(1, 3, PCIE13_VIRT_BASE
);
279 pci_common_init(&mv78xx0_pci
);