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>
17 #include <asm/pci/bridge.h>
26 * Common phys<->dma mapping for platforms using pci xtalk bridge
31 struct bridge_controller *bc = BRIDGE_CONTROLLER(pdev->bus); in phys_to_dma()
33 return bc->baddr + paddr; in phys_to_dma()
42 * Most of the IOC3 PCI config register aren't present
43 * we emulate what is needed for a normal PCI enumeration
67 mask = 0xffffffffU >> ((4 - size) << 3); in ioc3_cfg_rd()
84 mask = (0xffffffffU >> ((4 - size) << 3)); in ioc3_cfg_wr()
96 struct bridge_controller *bc = BRIDGE_CONTROLLER(dev->bus); in bridge_disable_swapping()
97 int slot = PCI_SLOT(dev->devfn); in bridge_disable_swapping()
112 * correctly for PCI-to-PCI bridges.
115 * which is used in SGI systems. The IOC3 can only handle 32-bit PCI
122 struct bridge_regs *bridge = bc->base; in pci_conf0_read_config()
129 addr = &bridge->b_type0_cfg_dev[slot].f[fn].c[PCI_VENDOR_ID]; in pci_conf0_read_config()
135 * generic PCI code a chance to look at it for real ... in pci_conf0_read_config()
138 addr = &bridge->b_type0_cfg_dev[slot].f[fn].l[where >> 2]; in pci_conf0_read_config()
140 bc->ioc3_sid[slot]); in pci_conf0_read_config()
143 addr = &bridge->b_type0_cfg_dev[slot].f[fn].c[where ^ (4 - size)]; in pci_conf0_read_config()
159 struct bridge_regs *bridge = bc->base; in pci_conf1_read_config()
160 int busno = bus->number; in pci_conf1_read_config()
168 addr = &bridge->b_type1_cfg.c[(fn << 8) | PCI_VENDOR_ID]; in pci_conf1_read_config()
174 * generic PCI code a chance to look at it for real ... in pci_conf1_read_config()
177 addr = &bridge->b_type1_cfg.c[(fn << 8) | (where & ~3)]; in pci_conf1_read_config()
179 bc->ioc3_sid[slot]); in pci_conf1_read_config()
182 addr = &bridge->b_type1_cfg.c[(fn << 8) | (where ^ (4 - size))]; in pci_conf1_read_config()
207 struct bridge_regs *bridge = bc->base; in pci_conf0_write_config()
214 addr = &bridge->b_type0_cfg_dev[slot].f[fn].c[PCI_VENDOR_ID]; in pci_conf0_write_config()
220 * generic PCI code a chance to look at it for real ... in pci_conf0_write_config()
223 addr = &bridge->b_type0_cfg_dev[slot].f[fn].l[where >> 2]; in pci_conf0_write_config()
227 addr = &bridge->b_type0_cfg_dev[slot].f[fn].c[where ^ (4 - size)]; in pci_conf0_write_config()
246 struct bridge_regs *bridge = bc->base; in pci_conf1_write_config()
249 int busno = bus->number; in pci_conf1_write_config()
255 addr = &bridge->b_type1_cfg.c[(fn << 8) | PCI_VENDOR_ID]; in pci_conf1_write_config()
261 * generic PCI code a chance to look at it for real ... in pci_conf1_write_config()
264 addr = &bridge->b_type0_cfg_dev[slot].f[fn].l[where >> 2]; in pci_conf1_write_config()
268 addr = &bridge->b_type1_cfg.c[(fn << 8) | (where ^ (4 - size))]; in pci_conf1_write_config()
306 struct bridge_irq_chip_data *data = d->chip_data; in bridge_set_affinity()
307 int bit = d->parent_data->hwirq; in bridge_set_affinity()
308 int pin = d->hwirq; in bridge_set_affinity()
314 data->nasid = cpu_to_node(cpu); in bridge_set_affinity()
315 bridge_write(data->bc, b_int_addr[pin].addr, in bridge_set_affinity()
316 (((data->bc->intr_addr >> 30) & 0x30000) | in bridge_set_affinity()
317 bit | (data->nasid << 8))); in bridge_set_affinity()
318 bridge_read(data->bc, b_wid_tflush); in bridge_set_affinity()
333 static int bridge_domain_alloc(struct irq_domain *domain, unsigned int virq, in bridge_domain_alloc() argument
341 return -EINVAL; in bridge_domain_alloc()
345 return -ENOMEM; in bridge_domain_alloc()
347 ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg); in bridge_domain_alloc()
349 data->bc = info->ctrl; in bridge_domain_alloc()
350 data->nasid = info->nasid; in bridge_domain_alloc()
351 irq_domain_set_info(domain, virq, info->pin, &bridge_irq_chip, in bridge_domain_alloc()
360 static void bridge_domain_free(struct irq_domain *domain, unsigned int virq, in bridge_domain_free() argument
363 struct irq_data *irqd = irq_domain_get_irq_data(domain, virq); in bridge_domain_free()
368 kfree(irqd->chip_data); in bridge_domain_free()
369 irq_domain_free_irqs_top(domain, virq, nr_irqs); in bridge_domain_free()
372 static int bridge_domain_activate(struct irq_domain *domain, in bridge_domain_activate() argument
375 struct bridge_irq_chip_data *data = irqd->chip_data; in bridge_domain_activate()
376 struct bridge_controller *bc = data->bc; in bridge_domain_activate()
377 int bit = irqd->parent_data->hwirq; in bridge_domain_activate()
378 int pin = irqd->hwirq; in bridge_domain_activate()
382 (((bc->intr_addr >> 30) & 0x30000) | in bridge_domain_activate()
383 bit | (data->nasid << 8))); in bridge_domain_activate()
409 static void bridge_domain_deactivate(struct irq_domain *domain, in bridge_domain_deactivate() argument
412 struct bridge_irq_chip_data *data = irqd->chip_data; in bridge_domain_deactivate()
414 bridge_clr(data->bc, b_int_enable, (1 << irqd->hwirq)); in bridge_domain_deactivate()
415 bridge_read(data->bc, b_wid_tflush); in bridge_domain_deactivate()
427 * gets incremented and returned every time - unfortunately, pci_map_irq
429 * same value. On O2000, pin can be 0 or 1, and PCI slots can be [0..7].
431 * A given PCI device, in general, should be able to intr any of the cpus
436 struct bridge_controller *bc = BRIDGE_CONTROLLER(dev->bus); in bridge_map_irq()
451 irq = bc->pci_int[slot][pin]; in bridge_map_irq()
452 if (irq == -1) { in bridge_map_irq()
454 info.nasid = bc->nasid; in bridge_map_irq()
455 info.pin = bc->int_mapping[slot][pin]; in bridge_map_irq()
457 irq = irq_domain_alloc_irqs(bc->domain, 1, bc->nasid, &info); in bridge_map_irq()
461 bc->pci_int[slot][pin] = irq; in bridge_map_irq()
470 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_IP27_BASEIO6G); in bridge_setup_ip27_baseio6g()
471 bc->ioc3_sid[6] = IOC3_SID(IOC3_SUBSYS_IP27_MIO); in bridge_setup_ip27_baseio6g()
472 bc->int_mapping[2][1] = 4; in bridge_setup_ip27_baseio6g()
473 bc->int_mapping[6][1] = 6; in bridge_setup_ip27_baseio6g()
478 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_IP27_BASEIO); in bridge_setup_ip27_baseio()
479 bc->int_mapping[2][1] = 4; in bridge_setup_ip27_baseio()
484 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_IP29_SYSBOARD); in bridge_setup_ip29_baseio()
485 bc->int_mapping[2][1] = 3; in bridge_setup_ip29_baseio()
490 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_IP30_SYSBOARD); in bridge_setup_ip30_sysboard()
491 bc->int_mapping[2][1] = 4; in bridge_setup_ip30_sysboard()
496 bc->ioc3_sid[0] = IOC3_SID(IOC3_SUBSYS_MENET); in bridge_setup_menet()
497 bc->ioc3_sid[1] = IOC3_SID(IOC3_SUBSYS_MENET); in bridge_setup_menet()
498 bc->ioc3_sid[2] = IOC3_SID(IOC3_SUBSYS_MENET); in bridge_setup_menet()
499 bc->ioc3_sid[3] = IOC3_SID(IOC3_SUBSYS_MENET4); in bridge_setup_menet()
504 bc->ioc3_sid[4] = IOC3_SID(IOC3_SUBSYS_IO7); in bridge_setup_io7()
509 bc->ioc3_sid[4] = IOC3_SID(IOC3_SUBSYS_IO8); in bridge_setup_io8()
514 bc->ioc3_sid[1] = IOC3_SID(IOC3_SUBSYS_IO9); in bridge_setup_io9()
519 bc->ioc3_sid[4] = IOC3_SID(IOC3_SUBSYS_IP34_SYSBOARD); in bridge_setup_ip34_fuel_sysboard()
529 BRIDGE_BOARD_SETUP("030-0734-", bridge_setup_ip27_baseio6g),
530 BRIDGE_BOARD_SETUP("030-0880-", bridge_setup_ip27_baseio6g),
531 BRIDGE_BOARD_SETUP("030-1023-", bridge_setup_ip27_baseio),
532 BRIDGE_BOARD_SETUP("030-1124-", bridge_setup_ip27_baseio),
533 BRIDGE_BOARD_SETUP("030-1025-", bridge_setup_ip29_baseio),
534 BRIDGE_BOARD_SETUP("030-1244-", bridge_setup_ip29_baseio),
535 BRIDGE_BOARD_SETUP("030-1389-", bridge_setup_ip29_baseio),
536 BRIDGE_BOARD_SETUP("030-0887-", bridge_setup_ip30_sysboard),
537 BRIDGE_BOARD_SETUP("030-1467-", bridge_setup_ip30_sysboard),
538 BRIDGE_BOARD_SETUP("030-0873-", bridge_setup_menet),
539 BRIDGE_BOARD_SETUP("030-1557-", bridge_setup_io7),
540 BRIDGE_BOARD_SETUP("030-1673-", bridge_setup_io8),
541 BRIDGE_BOARD_SETUP("030-1771-", bridge_setup_io9),
542 BRIDGE_BOARD_SETUP("030-1707-", bridge_setup_ip34_fuel_sysboard),
575 snprintf(prefix, sizeof(prefix), "bridge-%012llx-0b-", baddr); in bridge_get_partnum()
589 return -EINVAL; in bridge_get_partnum()
608 struct xtalk_bridge_platform_data *bd = dev_get_platdata(&pdev->dev); in bridge_probe()
609 struct device *dev = &pdev->dev; in bridge_probe()
612 struct irq_domain *domain, *parent; in bridge_probe() local
619 if (bridge_get_partnum(virt_to_phys((void *)bd->bridge_addr), partnum)) in bridge_probe()
620 return -EPROBE_DEFER; /* not available yet */ in bridge_probe()
624 return -ENODEV; in bridge_probe()
627 return -ENOMEM; in bridge_probe()
628 domain = irq_domain_create_hierarchy(parent, 0, 8, fn, in bridge_probe()
630 if (!domain) { in bridge_probe()
632 return -ENOMEM; in bridge_probe()
639 err = -ENOMEM; in bridge_probe()
645 bc->busn.name = "Bridge PCI busn"; in bridge_probe()
646 bc->busn.start = 0; in bridge_probe()
647 bc->busn.end = 0xff; in bridge_probe()
648 bc->busn.flags = IORESOURCE_BUS; in bridge_probe()
650 bc->domain = domain; in bridge_probe()
652 pci_add_resource_offset(&host->windows, &bd->mem, bd->mem_offset); in bridge_probe()
653 pci_add_resource_offset(&host->windows, &bd->io, bd->io_offset); in bridge_probe()
654 pci_add_resource(&host->windows, &bc->busn); in bridge_probe()
656 err = devm_request_pci_bus_resources(dev, &host->windows); in bridge_probe()
660 bc->nasid = bd->nasid; in bridge_probe()
662 bc->baddr = (u64)bd->masterwid << 60 | PCI64_ATTR_BAR; in bridge_probe()
663 bc->base = (struct bridge_regs *)bd->bridge_addr; in bridge_probe()
664 bc->intr_addr = bd->intr_addr; in bridge_probe()
692 ((bc->intr_addr >> 32) & 0xffff) | (bd->masterwid << 16)); in bridge_probe()
693 bridge_write(bc, b_wid_int_lower, bc->intr_addr & 0xffffffff); in bridge_probe()
694 bridge_write(bc, b_dir_map, (bd->masterwid << 20)); /* DMA */ in bridge_probe()
699 bc->pci_int[slot][0] = -1; in bridge_probe()
700 bc->pci_int[slot][1] = -1; in bridge_probe()
702 bc->int_mapping[slot][0] = slot; in bridge_probe()
703 bc->int_mapping[slot][1] = slot ^ 4; in bridge_probe()
709 host->dev.parent = dev; in bridge_probe()
710 host->sysdata = bc; in bridge_probe()
711 host->busnr = 0; in bridge_probe()
712 host->ops = &bridge_pci_ops; in bridge_probe()
713 host->map_irq = bridge_map_irq; in bridge_probe()
714 host->swizzle_irq = pci_common_swizzle; in bridge_probe()
720 pci_bus_claim_resources(host->bus); in bridge_probe()
721 pci_bus_add_devices(host->bus); in bridge_probe()
723 platform_set_drvdata(pdev, host->bus); in bridge_probe()
728 pci_free_resource_list(&host->windows); in bridge_probe()
730 irq_domain_remove(domain); in bridge_probe()
739 struct fwnode_handle *fn = bc->domain->fwnode; in bridge_remove()
741 irq_domain_remove(bc->domain); in bridge_remove()
755 .name = "xtalk-bridge",