1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2003 Christoph Hellwig (hch@lst.de)
4 * Copyright (C) 1999, 2000, 04 Ralf Baechle (ralf@linux-mips.org)
5 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
7 #include <linux/kernel.h>
8 #include <linux/export.h>
10 #include <linux/smp.h>
11 #include <linux/dma-direct.h>
12 #include <linux/platform_device.h>
13 #include <linux/platform_data/xtalk-bridge.h>
14 #include <linux/nvmem-consumer.h>
15 #include <linux/crc16.h>
16 #include <linux/irqdomain.h>
18 #include <asm/pci/bridge.h>
19 #include <asm/paccess.h>
20 #include <asm/sn/irq_alloc.h>
21 #include <asm/sn/ioc3.h>
24 #define CRC16_VALID 0xb001
27 * Common phys<->dma mapping for platforms using pci xtalk bridge
29 dma_addr_t
phys_to_dma(struct device
*dev
, phys_addr_t paddr
)
31 struct pci_dev
*pdev
= to_pci_dev(dev
);
32 struct bridge_controller
*bc
= BRIDGE_CONTROLLER(pdev
->bus
);
34 return bc
->baddr
+ paddr
;
37 phys_addr_t
dma_to_phys(struct device
*dev
, dma_addr_t dma_addr
)
39 return dma_addr
& ~(0xffUL
<< 56);
43 * Most of the IOC3 PCI config register aren't present
44 * we emulate what is needed for a normal PCI enumeration
46 static int ioc3_cfg_rd(void *addr
, int where
, int size
, u32
*value
, u32 sid
)
53 if (get_dbe(cf
, (u32
*)addr
))
54 return PCIBIOS_DEVICE_NOT_FOUND
;
60 /* emulate sane interrupt pin value */
67 shift
= (where
& 3) << 3;
68 mask
= 0xffffffffU
>> ((4 - size
) << 3);
69 *value
= (cf
>> shift
) & mask
;
71 return PCIBIOS_SUCCESSFUL
;
74 static int ioc3_cfg_wr(void *addr
, int where
, int size
, u32 value
)
76 u32 cf
, shift
, mask
, smask
;
78 if ((where
>= 0x14 && where
< 0x40) || (where
>= 0x48))
79 return PCIBIOS_SUCCESSFUL
;
81 if (get_dbe(cf
, (u32
*)addr
))
82 return PCIBIOS_DEVICE_NOT_FOUND
;
84 shift
= ((where
& 3) << 3);
85 mask
= (0xffffffffU
>> ((4 - size
) << 3));
86 smask
= mask
<< shift
;
88 cf
= (cf
& ~smask
) | ((value
& mask
) << shift
);
89 if (put_dbe(cf
, (u32
*)addr
))
90 return PCIBIOS_DEVICE_NOT_FOUND
;
92 return PCIBIOS_SUCCESSFUL
;
95 static void bridge_disable_swapping(struct pci_dev
*dev
)
97 struct bridge_controller
*bc
= BRIDGE_CONTROLLER(dev
->bus
);
98 int slot
= PCI_SLOT(dev
->devfn
);
100 /* Turn off byte swapping */
101 bridge_clr(bc
, b_device
[slot
].reg
, BRIDGE_DEV_SWAP_DIR
);
102 bridge_read(bc
, b_widget
.w_tflush
); /* Flush */
105 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SGI
, PCI_DEVICE_ID_SGI_IOC3
,
106 bridge_disable_swapping
);
110 * The Bridge ASIC supports both type 0 and type 1 access. Type 1 is
111 * not really documented, so right now I can't write code which uses it.
112 * Therefore we use type 0 accesses for now even though they won't work
113 * correctly for PCI-to-PCI bridges.
115 * The function is complicated by the ultimate brokenness of the IOC3 chip
116 * which is used in SGI systems. The IOC3 can only handle 32-bit PCI
117 * accesses and does only decode parts of its address space.
119 static int pci_conf0_read_config(struct pci_bus
*bus
, unsigned int devfn
,
120 int where
, int size
, u32
*value
)
122 struct bridge_controller
*bc
= BRIDGE_CONTROLLER(bus
);
123 struct bridge_regs
*bridge
= bc
->base
;
124 int slot
= PCI_SLOT(devfn
);
125 int fn
= PCI_FUNC(devfn
);
130 addr
= &bridge
->b_type0_cfg_dev
[slot
].f
[fn
].c
[PCI_VENDOR_ID
];
131 if (get_dbe(cf
, (u32
*)addr
))
132 return PCIBIOS_DEVICE_NOT_FOUND
;
135 * IOC3 is broken beyond belief ... Don't even give the
136 * generic PCI code a chance to look at it for real ...
138 if (cf
== (PCI_VENDOR_ID_SGI
| (PCI_DEVICE_ID_SGI_IOC3
<< 16))) {
139 addr
= &bridge
->b_type0_cfg_dev
[slot
].f
[fn
].l
[where
>> 2];
140 return ioc3_cfg_rd(addr
, where
, size
, value
,
144 addr
= &bridge
->b_type0_cfg_dev
[slot
].f
[fn
].c
[where
^ (4 - size
)];
147 res
= get_dbe(*value
, (u8
*)addr
);
149 res
= get_dbe(*value
, (u16
*)addr
);
151 res
= get_dbe(*value
, (u32
*)addr
);
153 return res
? PCIBIOS_DEVICE_NOT_FOUND
: PCIBIOS_SUCCESSFUL
;
156 static int pci_conf1_read_config(struct pci_bus
*bus
, unsigned int devfn
,
157 int where
, int size
, u32
*value
)
159 struct bridge_controller
*bc
= BRIDGE_CONTROLLER(bus
);
160 struct bridge_regs
*bridge
= bc
->base
;
161 int busno
= bus
->number
;
162 int slot
= PCI_SLOT(devfn
);
163 int fn
= PCI_FUNC(devfn
);
168 bridge_write(bc
, b_pci_cfg
, (busno
<< 16) | (slot
<< 11));
169 addr
= &bridge
->b_type1_cfg
.c
[(fn
<< 8) | PCI_VENDOR_ID
];
170 if (get_dbe(cf
, (u32
*)addr
))
171 return PCIBIOS_DEVICE_NOT_FOUND
;
174 * IOC3 is broken beyond belief ... Don't even give the
175 * generic PCI code a chance to look at it for real ...
177 if (cf
== (PCI_VENDOR_ID_SGI
| (PCI_DEVICE_ID_SGI_IOC3
<< 16))) {
178 addr
= &bridge
->b_type1_cfg
.c
[(fn
<< 8) | (where
& ~3)];
179 return ioc3_cfg_rd(addr
, where
, size
, value
,
183 addr
= &bridge
->b_type1_cfg
.c
[(fn
<< 8) | (where
^ (4 - size
))];
186 res
= get_dbe(*value
, (u8
*)addr
);
188 res
= get_dbe(*value
, (u16
*)addr
);
190 res
= get_dbe(*value
, (u32
*)addr
);
192 return res
? PCIBIOS_DEVICE_NOT_FOUND
: PCIBIOS_SUCCESSFUL
;
195 static int pci_read_config(struct pci_bus
*bus
, unsigned int devfn
,
196 int where
, int size
, u32
*value
)
198 if (!pci_is_root_bus(bus
))
199 return pci_conf1_read_config(bus
, devfn
, where
, size
, value
);
201 return pci_conf0_read_config(bus
, devfn
, where
, size
, value
);
204 static int pci_conf0_write_config(struct pci_bus
*bus
, unsigned int devfn
,
205 int where
, int size
, u32 value
)
207 struct bridge_controller
*bc
= BRIDGE_CONTROLLER(bus
);
208 struct bridge_regs
*bridge
= bc
->base
;
209 int slot
= PCI_SLOT(devfn
);
210 int fn
= PCI_FUNC(devfn
);
215 addr
= &bridge
->b_type0_cfg_dev
[slot
].f
[fn
].c
[PCI_VENDOR_ID
];
216 if (get_dbe(cf
, (u32
*)addr
))
217 return PCIBIOS_DEVICE_NOT_FOUND
;
220 * IOC3 is broken beyond belief ... Don't even give the
221 * generic PCI code a chance to look at it for real ...
223 if (cf
== (PCI_VENDOR_ID_SGI
| (PCI_DEVICE_ID_SGI_IOC3
<< 16))) {
224 addr
= &bridge
->b_type0_cfg_dev
[slot
].f
[fn
].l
[where
>> 2];
225 return ioc3_cfg_wr(addr
, where
, size
, value
);
228 addr
= &bridge
->b_type0_cfg_dev
[slot
].f
[fn
].c
[where
^ (4 - size
)];
231 res
= put_dbe(value
, (u8
*)addr
);
233 res
= put_dbe(value
, (u16
*)addr
);
235 res
= put_dbe(value
, (u32
*)addr
);
238 return PCIBIOS_DEVICE_NOT_FOUND
;
240 return PCIBIOS_SUCCESSFUL
;
243 static int pci_conf1_write_config(struct pci_bus
*bus
, unsigned int devfn
,
244 int where
, int size
, u32 value
)
246 struct bridge_controller
*bc
= BRIDGE_CONTROLLER(bus
);
247 struct bridge_regs
*bridge
= bc
->base
;
248 int slot
= PCI_SLOT(devfn
);
249 int fn
= PCI_FUNC(devfn
);
250 int busno
= bus
->number
;
255 bridge_write(bc
, b_pci_cfg
, (busno
<< 16) | (slot
<< 11));
256 addr
= &bridge
->b_type1_cfg
.c
[(fn
<< 8) | PCI_VENDOR_ID
];
257 if (get_dbe(cf
, (u32
*)addr
))
258 return PCIBIOS_DEVICE_NOT_FOUND
;
261 * IOC3 is broken beyond belief ... Don't even give the
262 * generic PCI code a chance to look at it for real ...
264 if (cf
== (PCI_VENDOR_ID_SGI
| (PCI_DEVICE_ID_SGI_IOC3
<< 16))) {
265 addr
= &bridge
->b_type0_cfg_dev
[slot
].f
[fn
].l
[where
>> 2];
266 return ioc3_cfg_wr(addr
, where
, size
, value
);
269 addr
= &bridge
->b_type1_cfg
.c
[(fn
<< 8) | (where
^ (4 - size
))];
272 res
= put_dbe(value
, (u8
*)addr
);
274 res
= put_dbe(value
, (u16
*)addr
);
276 res
= put_dbe(value
, (u32
*)addr
);
279 return PCIBIOS_DEVICE_NOT_FOUND
;
281 return PCIBIOS_SUCCESSFUL
;
284 static int pci_write_config(struct pci_bus
*bus
, unsigned int devfn
,
285 int where
, int size
, u32 value
)
287 if (!pci_is_root_bus(bus
))
288 return pci_conf1_write_config(bus
, devfn
, where
, size
, value
);
290 return pci_conf0_write_config(bus
, devfn
, where
, size
, value
);
293 static struct pci_ops bridge_pci_ops
= {
294 .read
= pci_read_config
,
295 .write
= pci_write_config
,
298 struct bridge_irq_chip_data
{
299 struct bridge_controller
*bc
;
303 static int bridge_set_affinity(struct irq_data
*d
, const struct cpumask
*mask
,
307 struct bridge_irq_chip_data
*data
= d
->chip_data
;
308 int bit
= d
->parent_data
->hwirq
;
312 ret
= irq_chip_set_affinity_parent(d
, mask
, force
);
314 cpu
= cpumask_first_and(mask
, cpu_online_mask
);
315 data
->nasid
= cpu_to_node(cpu
);
316 bridge_write(data
->bc
, b_int_addr
[pin
].addr
,
317 (((data
->bc
->intr_addr
>> 30) & 0x30000) |
318 bit
| (data
->nasid
<< 8)));
319 bridge_read(data
->bc
, b_wid_tflush
);
323 return irq_chip_set_affinity_parent(d
, mask
, force
);
327 struct irq_chip bridge_irq_chip
= {
329 .irq_mask
= irq_chip_mask_parent
,
330 .irq_unmask
= irq_chip_unmask_parent
,
331 .irq_set_affinity
= bridge_set_affinity
334 static int bridge_domain_alloc(struct irq_domain
*domain
, unsigned int virq
,
335 unsigned int nr_irqs
, void *arg
)
337 struct bridge_irq_chip_data
*data
;
338 struct irq_alloc_info
*info
= arg
;
341 if (nr_irqs
> 1 || !info
)
344 data
= kzalloc(sizeof(*data
), GFP_KERNEL
);
348 ret
= irq_domain_alloc_irqs_parent(domain
, virq
, nr_irqs
, arg
);
350 data
->bc
= info
->ctrl
;
351 data
->nasid
= info
->nasid
;
352 irq_domain_set_info(domain
, virq
, info
->pin
, &bridge_irq_chip
,
353 data
, handle_level_irq
, NULL
, NULL
);
361 static void bridge_domain_free(struct irq_domain
*domain
, unsigned int virq
,
362 unsigned int nr_irqs
)
364 struct irq_data
*irqd
= irq_domain_get_irq_data(domain
, virq
);
369 kfree(irqd
->chip_data
);
370 irq_domain_free_irqs_top(domain
, virq
, nr_irqs
);
373 static int bridge_domain_activate(struct irq_domain
*domain
,
374 struct irq_data
*irqd
, bool reserve
)
376 struct bridge_irq_chip_data
*data
= irqd
->chip_data
;
377 struct bridge_controller
*bc
= data
->bc
;
378 int bit
= irqd
->parent_data
->hwirq
;
379 int pin
= irqd
->hwirq
;
382 bridge_write(bc
, b_int_addr
[pin
].addr
,
383 (((bc
->intr_addr
>> 30) & 0x30000) |
384 bit
| (data
->nasid
<< 8)));
385 bridge_set(bc
, b_int_enable
, (1 << pin
));
386 bridge_set(bc
, b_int_enable
, 0x7ffffe00); /* more stuff in int_enable */
389 * Enable sending of an interrupt clear packet to the hub on a high to
390 * low transition of the interrupt pin.
392 * IRIX sets additional bits in the address which are documented as
393 * reserved in the bridge docs.
395 bridge_set(bc
, b_int_mode
, (1UL << pin
));
398 * We assume the bridge to have a 1:1 mapping between devices
399 * (slots) and intr pins.
401 device
= bridge_read(bc
, b_int_device
);
402 device
&= ~(7 << (pin
*3));
403 device
|= (pin
<< (pin
*3));
404 bridge_write(bc
, b_int_device
, device
);
406 bridge_read(bc
, b_wid_tflush
);
410 static void bridge_domain_deactivate(struct irq_domain
*domain
,
411 struct irq_data
*irqd
)
413 struct bridge_irq_chip_data
*data
= irqd
->chip_data
;
415 bridge_clr(data
->bc
, b_int_enable
, (1 << irqd
->hwirq
));
416 bridge_read(data
->bc
, b_wid_tflush
);
419 static const struct irq_domain_ops bridge_domain_ops
= {
420 .alloc
= bridge_domain_alloc
,
421 .free
= bridge_domain_free
,
422 .activate
= bridge_domain_activate
,
423 .deactivate
= bridge_domain_deactivate
427 * All observed requests have pin == 1. We could have a global here, that
428 * gets incremented and returned every time - unfortunately, pci_map_irq
429 * may be called on the same device over and over, and need to return the
430 * same value. On O2000, pin can be 0 or 1, and PCI slots can be [0..7].
432 * A given PCI device, in general, should be able to intr any of the cpus
433 * on any one of the hubs connected to its xbow.
435 static int bridge_map_irq(const struct pci_dev
*dev
, u8 slot
, u8 pin
)
437 struct bridge_controller
*bc
= BRIDGE_CONTROLLER(dev
->bus
);
438 struct irq_alloc_info info
;
442 case PCI_INTERRUPT_UNKNOWN
:
443 case PCI_INTERRUPT_INTA
:
444 case PCI_INTERRUPT_INTC
:
447 case PCI_INTERRUPT_INTB
:
448 case PCI_INTERRUPT_INTD
:
452 irq
= bc
->pci_int
[slot
][pin
];
455 info
.nasid
= bc
->nasid
;
456 info
.pin
= bc
->int_mapping
[slot
][pin
];
458 irq
= irq_domain_alloc_irqs(bc
->domain
, 1, bc
->nasid
, &info
);
462 bc
->pci_int
[slot
][pin
] = irq
;
467 #define IOC3_SID(sid) (PCI_VENDOR_ID_SGI | ((sid) << 16))
469 static void bridge_setup_ip27_baseio6g(struct bridge_controller
*bc
)
471 bc
->ioc3_sid
[2] = IOC3_SID(IOC3_SUBSYS_IP27_BASEIO6G
);
472 bc
->ioc3_sid
[6] = IOC3_SID(IOC3_SUBSYS_IP27_MIO
);
473 bc
->int_mapping
[2][1] = 4;
474 bc
->int_mapping
[6][1] = 6;
477 static void bridge_setup_ip27_baseio(struct bridge_controller
*bc
)
479 bc
->ioc3_sid
[2] = IOC3_SID(IOC3_SUBSYS_IP27_BASEIO
);
480 bc
->int_mapping
[2][1] = 4;
483 static void bridge_setup_ip29_baseio(struct bridge_controller
*bc
)
485 bc
->ioc3_sid
[2] = IOC3_SID(IOC3_SUBSYS_IP29_SYSBOARD
);
486 bc
->int_mapping
[2][1] = 3;
489 static void bridge_setup_ip30_sysboard(struct bridge_controller
*bc
)
491 bc
->ioc3_sid
[2] = IOC3_SID(IOC3_SUBSYS_IP30_SYSBOARD
);
492 bc
->int_mapping
[2][1] = 4;
495 static void bridge_setup_menet(struct bridge_controller
*bc
)
497 bc
->ioc3_sid
[0] = IOC3_SID(IOC3_SUBSYS_MENET
);
498 bc
->ioc3_sid
[1] = IOC3_SID(IOC3_SUBSYS_MENET
);
499 bc
->ioc3_sid
[2] = IOC3_SID(IOC3_SUBSYS_MENET
);
500 bc
->ioc3_sid
[3] = IOC3_SID(IOC3_SUBSYS_MENET4
);
503 static void bridge_setup_io7(struct bridge_controller
*bc
)
505 bc
->ioc3_sid
[4] = IOC3_SID(IOC3_SUBSYS_IO7
);
508 static void bridge_setup_io8(struct bridge_controller
*bc
)
510 bc
->ioc3_sid
[4] = IOC3_SID(IOC3_SUBSYS_IO8
);
513 static void bridge_setup_io9(struct bridge_controller
*bc
)
515 bc
->ioc3_sid
[1] = IOC3_SID(IOC3_SUBSYS_IO9
);
518 static void bridge_setup_ip34_fuel_sysboard(struct bridge_controller
*bc
)
520 bc
->ioc3_sid
[4] = IOC3_SID(IOC3_SUBSYS_IP34_SYSBOARD
);
523 #define BRIDGE_BOARD_SETUP(_partno, _setup) \
524 { .match = _partno, .setup = _setup }
526 static const struct {
528 void (*setup
)(struct bridge_controller
*bc
);
529 } bridge_ioc3_devid
[] = {
530 BRIDGE_BOARD_SETUP("030-0734-", bridge_setup_ip27_baseio6g
),
531 BRIDGE_BOARD_SETUP("030-0880-", bridge_setup_ip27_baseio6g
),
532 BRIDGE_BOARD_SETUP("030-1023-", bridge_setup_ip27_baseio
),
533 BRIDGE_BOARD_SETUP("030-1124-", bridge_setup_ip27_baseio
),
534 BRIDGE_BOARD_SETUP("030-1025-", bridge_setup_ip29_baseio
),
535 BRIDGE_BOARD_SETUP("030-1244-", bridge_setup_ip29_baseio
),
536 BRIDGE_BOARD_SETUP("030-1389-", bridge_setup_ip29_baseio
),
537 BRIDGE_BOARD_SETUP("030-0887-", bridge_setup_ip30_sysboard
),
538 BRIDGE_BOARD_SETUP("030-1467-", bridge_setup_ip30_sysboard
),
539 BRIDGE_BOARD_SETUP("030-0873-", bridge_setup_menet
),
540 BRIDGE_BOARD_SETUP("030-1557-", bridge_setup_io7
),
541 BRIDGE_BOARD_SETUP("030-1673-", bridge_setup_io8
),
542 BRIDGE_BOARD_SETUP("030-1771-", bridge_setup_io9
),
543 BRIDGE_BOARD_SETUP("030-1707-", bridge_setup_ip34_fuel_sysboard
),
546 static void bridge_setup_board(struct bridge_controller
*bc
, char *partnum
)
550 for (i
= 0; i
< ARRAY_SIZE(bridge_ioc3_devid
); i
++)
551 if (!strncmp(partnum
, bridge_ioc3_devid
[i
].match
,
552 strlen(bridge_ioc3_devid
[i
].match
))) {
553 bridge_ioc3_devid
[i
].setup(bc
);
557 static int bridge_nvmem_match(struct device
*dev
, const void *data
)
559 const char *name
= dev_name(dev
);
560 const char *prefix
= data
;
562 if (strlen(name
) < strlen(prefix
))
565 return memcmp(prefix
, dev_name(dev
), strlen(prefix
)) == 0;
568 static int bridge_get_partnum(u64 baddr
, char *partnum
)
570 struct nvmem_device
*nvmem
;
576 snprintf(prefix
, sizeof(prefix
), "bridge-%012llx-0b-", baddr
);
578 nvmem
= nvmem_device_find(prefix
, bridge_nvmem_match
);
580 return PTR_ERR(nvmem
);
582 ret
= nvmem_device_read(nvmem
, 0, 64, prom
);
583 nvmem_device_put(nvmem
);
588 if (crc16(CRC16_INIT
, prom
, 32) != CRC16_VALID
||
589 crc16(CRC16_INIT
, prom
+ 32, 32) != CRC16_VALID
)
592 /* Assemble part number */
594 for (i
= 0; i
< 19; i
++)
595 if (prom
[i
+ 11] != ' ')
596 partnum
[j
++] = prom
[i
+ 11];
598 for (i
= 0; i
< 6; i
++)
599 if (prom
[i
+ 32] != ' ')
600 partnum
[j
++] = prom
[i
+ 32];
607 static int bridge_probe(struct platform_device
*pdev
)
609 struct xtalk_bridge_platform_data
*bd
= dev_get_platdata(&pdev
->dev
);
610 struct device
*dev
= &pdev
->dev
;
611 struct bridge_controller
*bc
;
612 struct pci_host_bridge
*host
;
613 struct irq_domain
*domain
, *parent
;
614 struct fwnode_handle
*fn
;
619 /* get part number from one wire prom */
620 if (bridge_get_partnum(virt_to_phys((void *)bd
->bridge_addr
), partnum
))
621 return -EPROBE_DEFER
; /* not available yet */
623 parent
= irq_get_default_host();
626 fn
= irq_domain_alloc_named_fwnode("BRIDGE");
629 domain
= irq_domain_create_hierarchy(parent
, 0, 8, fn
,
630 &bridge_domain_ops
, NULL
);
632 irq_domain_free_fwnode(fn
);
636 pci_set_flags(PCI_PROBE_ONLY
);
638 host
= devm_pci_alloc_host_bridge(dev
, sizeof(*bc
));
641 goto err_remove_domain
;
644 bc
= pci_host_bridge_priv(host
);
646 bc
->busn
.name
= "Bridge PCI busn";
649 bc
->busn
.flags
= IORESOURCE_BUS
;
653 pci_add_resource_offset(&host
->windows
, &bd
->mem
, bd
->mem_offset
);
654 pci_add_resource_offset(&host
->windows
, &bd
->io
, bd
->io_offset
);
655 pci_add_resource(&host
->windows
, &bc
->busn
);
657 err
= devm_request_pci_bus_resources(dev
, &host
->windows
);
659 goto err_free_resource
;
661 bc
->nasid
= bd
->nasid
;
663 bc
->baddr
= (u64
)bd
->masterwid
<< 60 | PCI64_ATTR_BAR
;
664 bc
->base
= (struct bridge_regs
*)bd
->bridge_addr
;
665 bc
->intr_addr
= bd
->intr_addr
;
668 * Clear all pending interrupts.
670 bridge_write(bc
, b_int_rst_stat
, BRIDGE_IRR_ALL_CLR
);
673 * Until otherwise set up, assume all interrupts are from slot 0
675 bridge_write(bc
, b_int_device
, 0x0);
678 * disable swapping for big windows
680 bridge_clr(bc
, b_wid_control
,
681 BRIDGE_CTRL_IO_SWAP
| BRIDGE_CTRL_MEM_SWAP
);
682 #ifdef CONFIG_PAGE_SIZE_4KB
683 bridge_clr(bc
, b_wid_control
, BRIDGE_CTRL_PAGE_SIZE
);
684 #else /* 16kB or larger */
685 bridge_set(bc
, b_wid_control
, BRIDGE_CTRL_PAGE_SIZE
);
689 * Hmm... IRIX sets additional bits in the address which
690 * are documented as reserved in the bridge docs.
692 bridge_write(bc
, b_wid_int_upper
,
693 ((bc
->intr_addr
>> 32) & 0xffff) | (bd
->masterwid
<< 16));
694 bridge_write(bc
, b_wid_int_lower
, bc
->intr_addr
& 0xffffffff);
695 bridge_write(bc
, b_dir_map
, (bd
->masterwid
<< 20)); /* DMA */
696 bridge_write(bc
, b_int_enable
, 0);
698 for (slot
= 0; slot
< 8; slot
++) {
699 bridge_set(bc
, b_device
[slot
].reg
, BRIDGE_DEV_SWAP_DIR
);
700 bc
->pci_int
[slot
][0] = -1;
701 bc
->pci_int
[slot
][1] = -1;
702 /* default interrupt pin mapping */
703 bc
->int_mapping
[slot
][0] = slot
;
704 bc
->int_mapping
[slot
][1] = slot
^ 4;
706 bridge_read(bc
, b_wid_tflush
); /* wait until Bridge PIO complete */
708 bridge_setup_board(bc
, partnum
);
710 host
->dev
.parent
= dev
;
713 host
->ops
= &bridge_pci_ops
;
714 host
->map_irq
= bridge_map_irq
;
715 host
->swizzle_irq
= pci_common_swizzle
;
717 err
= pci_scan_root_bus_bridge(host
);
719 goto err_free_resource
;
721 pci_bus_claim_resources(host
->bus
);
722 pci_bus_add_devices(host
->bus
);
724 platform_set_drvdata(pdev
, host
->bus
);
729 pci_free_resource_list(&host
->windows
);
731 irq_domain_remove(domain
);
732 irq_domain_free_fwnode(fn
);
736 static void bridge_remove(struct platform_device
*pdev
)
738 struct pci_bus
*bus
= platform_get_drvdata(pdev
);
739 struct bridge_controller
*bc
= BRIDGE_CONTROLLER(bus
);
740 struct fwnode_handle
*fn
= bc
->domain
->fwnode
;
742 irq_domain_remove(bc
->domain
);
743 irq_domain_free_fwnode(fn
);
744 pci_lock_rescan_remove();
745 pci_stop_root_bus(bus
);
746 pci_remove_root_bus(bus
);
747 pci_unlock_rescan_remove();
750 static struct platform_driver bridge_driver
= {
751 .probe
= bridge_probe
,
752 .remove
= bridge_remove
,
754 .name
= "xtalk-bridge",
758 builtin_platform_driver(bridge_driver
);