Lines Matching +full:pci +full:- +full:domain

1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (C) 1999, 2000, 04 Ralf Baechle (ralf@linux-mips.org)
9 #include <linux/pci.h>
11 #include <linux/dma-direct.h>
13 #include <linux/platform_data/xtalk-bridge.h>
14 #include <linux/nvmem-consumer.h>
18 #include <asm/pci/bridge.h>
27 * Common phys<->dma mapping for platforms using pci xtalk bridge
32 struct bridge_controller *bc = BRIDGE_CONTROLLER(pdev->bus); in phys_to_dma()
34 return bc->baddr + paddr; in phys_to_dma()
43 * Most of the IOC3 PCI config register aren't present
44 * we emulate what is needed for a normal PCI enumeration
68 mask = 0xffffffffU >> ((4 - size) << 3); in ioc3_cfg_rd()
85 mask = (0xffffffffU >> ((4 - size) << 3)); in ioc3_cfg_wr()
97 struct bridge_controller *bc = BRIDGE_CONTROLLER(dev->bus); in bridge_disable_swapping()
98 int slot = PCI_SLOT(dev->devfn); in bridge_disable_swapping()
113 * correctly for PCI-to-PCI bridges.
116 * which is used in SGI systems. The IOC3 can only handle 32-bit PCI
123 struct bridge_regs *bridge = bc->base; in pci_conf0_read_config()
130 addr = &bridge->b_type0_cfg_dev[slot].f[fn].c[PCI_VENDOR_ID]; in pci_conf0_read_config()
136 * generic PCI code a chance to look at it for real ... in pci_conf0_read_config()
139 addr = &bridge->b_type0_cfg_dev[slot].f[fn].l[where >> 2]; in pci_conf0_read_config()
141 bc->ioc3_sid[slot]); in pci_conf0_read_config()
144 addr = &bridge->b_type0_cfg_dev[slot].f[fn].c[where ^ (4 - size)]; in pci_conf0_read_config()
160 struct bridge_regs *bridge = bc->base; in pci_conf1_read_config()
161 int busno = bus->number; in pci_conf1_read_config()
169 addr = &bridge->b_type1_cfg.c[(fn << 8) | PCI_VENDOR_ID]; in pci_conf1_read_config()
175 * generic PCI code a chance to look at it for real ... in pci_conf1_read_config()
178 addr = &bridge->b_type1_cfg.c[(fn << 8) | (where & ~3)]; in pci_conf1_read_config()
180 bc->ioc3_sid[slot]); in pci_conf1_read_config()
183 addr = &bridge->b_type1_cfg.c[(fn << 8) | (where ^ (4 - size))]; in pci_conf1_read_config()
208 struct bridge_regs *bridge = bc->base; in pci_conf0_write_config()
215 addr = &bridge->b_type0_cfg_dev[slot].f[fn].c[PCI_VENDOR_ID]; in pci_conf0_write_config()
221 * generic PCI code a chance to look at it for real ... in pci_conf0_write_config()
224 addr = &bridge->b_type0_cfg_dev[slot].f[fn].l[where >> 2]; in pci_conf0_write_config()
228 addr = &bridge->b_type0_cfg_dev[slot].f[fn].c[where ^ (4 - size)]; in pci_conf0_write_config()
247 struct bridge_regs *bridge = bc->base; in pci_conf1_write_config()
250 int busno = bus->number; in pci_conf1_write_config()
256 addr = &bridge->b_type1_cfg.c[(fn << 8) | PCI_VENDOR_ID]; in pci_conf1_write_config()
262 * generic PCI code a chance to look at it for real ... in pci_conf1_write_config()
265 addr = &bridge->b_type0_cfg_dev[slot].f[fn].l[where >> 2]; in pci_conf1_write_config()
269 addr = &bridge->b_type1_cfg.c[(fn << 8) | (where ^ (4 - size))]; in pci_conf1_write_config()
307 struct bridge_irq_chip_data *data = d->chip_data; in bridge_set_affinity()
308 int bit = d->parent_data->hwirq; in bridge_set_affinity()
309 int pin = d->hwirq; in bridge_set_affinity()
315 data->nasid = cpu_to_node(cpu); in bridge_set_affinity()
316 bridge_write(data->bc, b_int_addr[pin].addr, in bridge_set_affinity()
317 (((data->bc->intr_addr >> 30) & 0x30000) | in bridge_set_affinity()
318 bit | (data->nasid << 8))); in bridge_set_affinity()
319 bridge_read(data->bc, b_wid_tflush); in bridge_set_affinity()
334 static int bridge_domain_alloc(struct irq_domain *domain, unsigned int virq, in bridge_domain_alloc() argument
342 return -EINVAL; in bridge_domain_alloc()
346 return -ENOMEM; in bridge_domain_alloc()
348 ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg); in bridge_domain_alloc()
350 data->bc = info->ctrl; in bridge_domain_alloc()
351 data->nasid = info->nasid; in bridge_domain_alloc()
352 irq_domain_set_info(domain, virq, info->pin, &bridge_irq_chip, in bridge_domain_alloc()
361 static void bridge_domain_free(struct irq_domain *domain, unsigned int virq, in bridge_domain_free() argument
364 struct irq_data *irqd = irq_domain_get_irq_data(domain, virq); in bridge_domain_free()
369 kfree(irqd->chip_data); in bridge_domain_free()
370 irq_domain_free_irqs_top(domain, virq, nr_irqs); in bridge_domain_free()
373 static int bridge_domain_activate(struct irq_domain *domain, in bridge_domain_activate() argument
376 struct bridge_irq_chip_data *data = irqd->chip_data; in bridge_domain_activate()
377 struct bridge_controller *bc = data->bc; in bridge_domain_activate()
378 int bit = irqd->parent_data->hwirq; in bridge_domain_activate()
379 int pin = irqd->hwirq; in bridge_domain_activate()
383 (((bc->intr_addr >> 30) & 0x30000) | in bridge_domain_activate()
384 bit | (data->nasid << 8))); in bridge_domain_activate()
410 static void bridge_domain_deactivate(struct irq_domain *domain, in bridge_domain_deactivate() argument
413 struct bridge_irq_chip_data *data = irqd->chip_data; in bridge_domain_deactivate()
415 bridge_clr(data->bc, b_int_enable, (1 << irqd->hwirq)); in bridge_domain_deactivate()
416 bridge_read(data->bc, b_wid_tflush); in bridge_domain_deactivate()
428 * gets incremented and returned every time - unfortunately, pci_map_irq
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
437 struct bridge_controller *bc = BRIDGE_CONTROLLER(dev->bus); in bridge_map_irq()
452 irq = bc->pci_int[slot][pin]; in bridge_map_irq()
453 if (irq == -1) { in bridge_map_irq()
455 info.nasid = bc->nasid; in bridge_map_irq()
456 info.pin = bc->int_mapping[slot][pin]; in bridge_map_irq()
458 irq = irq_domain_alloc_irqs(bc->domain, 1, bc->nasid, &info); in bridge_map_irq()
462 bc->pci_int[slot][pin] = irq; in bridge_map_irq()
471 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_IP27_BASEIO6G); in bridge_setup_ip27_baseio6g()
472 bc->ioc3_sid[6] = IOC3_SID(IOC3_SUBSYS_IP27_MIO); in bridge_setup_ip27_baseio6g()
473 bc->int_mapping[2][1] = 4; in bridge_setup_ip27_baseio6g()
474 bc->int_mapping[6][1] = 6; in bridge_setup_ip27_baseio6g()
479 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_IP27_BASEIO); in bridge_setup_ip27_baseio()
480 bc->int_mapping[2][1] = 4; in bridge_setup_ip27_baseio()
485 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_IP29_SYSBOARD); in bridge_setup_ip29_baseio()
486 bc->int_mapping[2][1] = 3; in bridge_setup_ip29_baseio()
491 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_IP30_SYSBOARD); in bridge_setup_ip30_sysboard()
492 bc->int_mapping[2][1] = 4; in bridge_setup_ip30_sysboard()
497 bc->ioc3_sid[0] = IOC3_SID(IOC3_SUBSYS_MENET); in bridge_setup_menet()
498 bc->ioc3_sid[1] = IOC3_SID(IOC3_SUBSYS_MENET); in bridge_setup_menet()
499 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_MENET); in bridge_setup_menet()
500 bc->ioc3_sid[3] = IOC3_SID(IOC3_SUBSYS_MENET4); in bridge_setup_menet()
505 bc->ioc3_sid[4] = IOC3_SID(IOC3_SUBSYS_IO7); in bridge_setup_io7()
510 bc->ioc3_sid[4] = IOC3_SID(IOC3_SUBSYS_IO8); in bridge_setup_io8()
515 bc->ioc3_sid[1] = IOC3_SID(IOC3_SUBSYS_IO9); in bridge_setup_io9()
520 bc->ioc3_sid[4] = IOC3_SID(IOC3_SUBSYS_IP34_SYSBOARD); in bridge_setup_ip34_fuel_sysboard()
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),
576 snprintf(prefix, sizeof(prefix), "bridge-%012llx-0b-", baddr); in bridge_get_partnum()
590 return -EINVAL; in bridge_get_partnum()
609 struct xtalk_bridge_platform_data *bd = dev_get_platdata(&pdev->dev); in bridge_probe()
610 struct device *dev = &pdev->dev; in bridge_probe()
613 struct irq_domain *domain, *parent; in bridge_probe() local
620 if (bridge_get_partnum(virt_to_phys((void *)bd->bridge_addr), partnum)) in bridge_probe()
621 return -EPROBE_DEFER; /* not available yet */ in bridge_probe()
625 return -ENODEV; in bridge_probe()
628 return -ENOMEM; in bridge_probe()
629 domain = irq_domain_create_hierarchy(parent, 0, 8, fn, in bridge_probe()
631 if (!domain) { in bridge_probe()
633 return -ENOMEM; in bridge_probe()
640 err = -ENOMEM; in bridge_probe()
646 bc->busn.name = "Bridge PCI busn"; in bridge_probe()
647 bc->busn.start = 0; in bridge_probe()
648 bc->busn.end = 0xff; in bridge_probe()
649 bc->busn.flags = IORESOURCE_BUS; in bridge_probe()
651 bc->domain = domain; in bridge_probe()
653 pci_add_resource_offset(&host->windows, &bd->mem, bd->mem_offset); in bridge_probe()
654 pci_add_resource_offset(&host->windows, &bd->io, bd->io_offset); in bridge_probe()
655 pci_add_resource(&host->windows, &bc->busn); in bridge_probe()
657 err = devm_request_pci_bus_resources(dev, &host->windows); in bridge_probe()
661 bc->nasid = bd->nasid; in bridge_probe()
663 bc->baddr = (u64)bd->masterwid << 60 | PCI64_ATTR_BAR; in bridge_probe()
664 bc->base = (struct bridge_regs *)bd->bridge_addr; in bridge_probe()
665 bc->intr_addr = bd->intr_addr; in bridge_probe()
693 ((bc->intr_addr >> 32) & 0xffff) | (bd->masterwid << 16)); in bridge_probe()
694 bridge_write(bc, b_wid_int_lower, bc->intr_addr & 0xffffffff); in bridge_probe()
695 bridge_write(bc, b_dir_map, (bd->masterwid << 20)); /* DMA */ in bridge_probe()
700 bc->pci_int[slot][0] = -1; in bridge_probe()
701 bc->pci_int[slot][1] = -1; in bridge_probe()
703 bc->int_mapping[slot][0] = slot; in bridge_probe()
704 bc->int_mapping[slot][1] = slot ^ 4; in bridge_probe()
710 host->dev.parent = dev; in bridge_probe()
711 host->sysdata = bc; in bridge_probe()
712 host->busnr = 0; in bridge_probe()
713 host->ops = &bridge_pci_ops; in bridge_probe()
714 host->map_irq = bridge_map_irq; in bridge_probe()
715 host->swizzle_irq = pci_common_swizzle; in bridge_probe()
721 pci_bus_claim_resources(host->bus); in bridge_probe()
722 pci_bus_add_devices(host->bus); in bridge_probe()
724 platform_set_drvdata(pdev, host->bus); in bridge_probe()
729 pci_free_resource_list(&host->windows); in bridge_probe()
731 irq_domain_remove(domain); in bridge_probe()
740 struct fwnode_handle *fn = bc->domain->fwnode; in bridge_remove()
742 irq_domain_remove(bc->domain); in bridge_remove()
754 .name = "xtalk-bridge",