Lines Matching +full:segment +full:- +full:no +full:- +full:remap
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * pci_irq.c - ACPI PCI Interrupt Routing ($Revision: 11 $)
8 * (c) Copyright 2008 Hewlett-Packard Development Company, L.P.
39 return 'A' + pin - 1; in pin_name()
42 /* --------------------------------------------------------------------------
44 -------------------------------------------------------------------------- */
49 .ident = "Medion MD9580-F laptop",
75 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
85 unsigned int segment; member
93 #define PCI_INTX_PIN(c) (c - 'A' + 1)
97 * interrupt at the listed segment/bus/device/pin is connected to the first
122 if (dmi_check_system(quirk->system) && in do_prt_fixups()
123 entry->id.segment == quirk->segment && in do_prt_fixups()
124 entry->id.bus == quirk->bus && in do_prt_fixups()
125 entry->id.device == quirk->device && in do_prt_fixups()
126 entry->pin == quirk->pin && in do_prt_fixups()
127 !strcmp(prt->source, quirk->source) && in do_prt_fixups()
128 strlen(prt->source) >= strlen(quirk->actual_source)) { in do_prt_fixups()
132 entry->id.segment, entry->id.bus, in do_prt_fixups()
133 entry->id.device, pin_name(entry->pin), in do_prt_fixups()
134 prt->source, quirk->actual_source); in do_prt_fixups()
135 strcpy(prt->source, quirk->actual_source); in do_prt_fixups()
144 int segment = pci_domain_nr(dev->bus); in acpi_pci_irq_check_entry() local
145 int bus = dev->bus->number; in acpi_pci_irq_check_entry()
146 int device = pci_ari_enabled(dev->bus) ? 0 : PCI_SLOT(dev->devfn); in acpi_pci_irq_check_entry()
149 if (((prt->address >> 16) & 0xffff) != device || in acpi_pci_irq_check_entry()
150 prt->pin + 1 != pin) in acpi_pci_irq_check_entry()
151 return -ENODEV; in acpi_pci_irq_check_entry()
155 return -ENOMEM; in acpi_pci_irq_check_entry()
162 entry->id.segment = segment; in acpi_pci_irq_check_entry()
163 entry->id.bus = bus; in acpi_pci_irq_check_entry()
164 entry->id.device = (prt->address >> 16) & 0xFFFF; in acpi_pci_irq_check_entry()
165 entry->pin = prt->pin + 1; in acpi_pci_irq_check_entry()
169 entry->index = prt->source_index; in acpi_pci_irq_check_entry()
173 * --------------- in acpi_pci_irq_check_entry()
184 if (prt->source[0]) in acpi_pci_irq_check_entry()
185 acpi_get_handle(handle, prt->source, &entry->link); in acpi_pci_irq_check_entry()
189 * -------------- in acpi_pci_irq_check_entry()
196 " %04x:%02x:%02x[%c] -> %s[%d]\n", in acpi_pci_irq_check_entry()
197 entry->id.segment, entry->id.bus, in acpi_pci_irq_check_entry()
198 entry->id.device, pin_name(entry->pin), in acpi_pci_irq_check_entry()
199 prt->source, entry->index)); in acpi_pci_irq_check_entry()
214 if (dev->bus->bridge) in acpi_pci_irq_find_prt_entry()
215 handle = ACPI_HANDLE(dev->bus->bridge); in acpi_pci_irq_find_prt_entry()
218 return -ENODEV; in acpi_pci_irq_find_prt_entry()
220 /* 'handle' is the _PRT's parent (root bridge or PCI-PCI bridge) */ in acpi_pci_irq_find_prt_entry()
224 return -ENODEV; in acpi_pci_irq_find_prt_entry()
228 while (entry && (entry->length > 0)) { in acpi_pci_irq_find_prt_entry()
233 ((unsigned long)entry + entry->length); in acpi_pci_irq_find_prt_entry()
240 /* --------------------------------------------------------------------------
242 -------------------------------------------------------------------------- */
251 for (bus_it = bus ; bus_it ; bus_it = bus_it->parent) { in bridge_has_boot_interrupt_variant()
252 if (!bus_it->self) in bridge_has_boot_interrupt_variant()
254 if (bus_it->self->irq_reroute_variant) in bridge_has_boot_interrupt_variant()
255 return bus_it->self->irq_reroute_variant; in bridge_has_boot_interrupt_variant()
262 * entry in the chipset's IO-APIC is masked (as, e.g. the RT kernel does
273 switch (bridge_has_boot_interrupt_variant(dev->bus)) { in acpi_reroute_boot_interrupt()
275 /* no rerouting necessary */ in acpi_reroute_boot_interrupt()
279 * Remap according to INTx routing table in 6700PXH in acpi_reroute_boot_interrupt()
280 * specs, intel order number 302628-002, section in acpi_reroute_boot_interrupt()
284 dev_info(&dev->dev, "PCI IRQ %d -> rerouted to legacy " in acpi_reroute_boot_interrupt()
285 "IRQ %d\n", entry->index, in acpi_reroute_boot_interrupt()
286 (entry->index % 4) + 16); in acpi_reroute_boot_interrupt()
287 entry->index = (entry->index % 4) + 16; in acpi_reroute_boot_interrupt()
290 dev_warn(&dev->dev, "Cannot reroute IRQ %d to legacy " in acpi_reroute_boot_interrupt()
291 "IRQ: unknown mapping\n", entry->index); in acpi_reroute_boot_interrupt()
292 return -1; in acpi_reroute_boot_interrupt()
317 * PCI interrupt routing entry (eg. yenta bridge and add-in card bridge). in acpi_pci_irq_lookup()
319 bridge = dev->bus->self; in acpi_pci_irq_lookup()
323 if ((bridge->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS) { in acpi_pci_irq_lookup()
325 bridge_pin = bridge->pin; in acpi_pci_irq_lookup()
328 "No interrupt pin configured for device %s\n", in acpi_pci_irq_lookup()
345 bridge = dev->bus->self; in acpi_pci_irq_lookup()
348 dev_warn(&dev->dev, "can't derive routing for PCI INT %c\n", in acpi_pci_irq_lookup()
359 if (dev->irq > 0 && (dev->irq <= 0xF) && in acpi_isa_register_gsi()
360 acpi_isa_irq_available(dev->irq) && in acpi_isa_register_gsi()
361 (acpi_isa_irq_to_gsi(dev->irq, &dev_gsi) == 0)) { in acpi_isa_register_gsi()
362 dev_warn(&dev->dev, "PCI INT %c: no GSI - using ISA IRQ %d\n", in acpi_isa_register_gsi()
363 pin_name(dev->pin), dev->irq); in acpi_isa_register_gsi()
364 acpi_register_gsi(&dev->dev, dev_gsi, in acpi_isa_register_gsi()
369 return -EINVAL; in acpi_isa_register_gsi()
374 return -ENODEV; in acpi_isa_register_gsi()
382 * On x86 irq line 0xff means "unknown" or "no connection" in acpi_pci_irq_valid()
385 if (dev->irq == 0xff) { in acpi_pci_irq_valid()
386 dev->irq = IRQ_NOTCONNECTED; in acpi_pci_irq_valid()
387 dev_warn(&dev->dev, "PCI INT %c: not connected\n", in acpi_pci_irq_valid()
415 pin = dev->pin; in acpi_pci_irq_enable()
418 "No interrupt pin configured for device %s\n", in acpi_pci_irq_enable()
423 if (dev->irq_managed && dev->irq > 0) in acpi_pci_irq_enable()
432 if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && in acpi_pci_irq_enable()
433 (dev->class & 0x05) == 0) in acpi_pci_irq_enable()
438 if (entry->link) in acpi_pci_irq_enable()
439 gsi = acpi_pci_link_allocate_irq(entry->link, in acpi_pci_irq_enable()
440 entry->index, in acpi_pci_irq_enable()
444 gsi = entry->index; in acpi_pci_irq_enable()
446 gsi = -1; in acpi_pci_irq_enable()
450 * No IRQ known to the ACPI subsystem - maybe the BIOS / in acpi_pci_irq_enable()
459 dev_warn(&dev->dev, "PCI INT %c: no GSI\n", in acpi_pci_irq_enable()
466 rc = acpi_register_gsi(&dev->dev, gsi, triggering, polarity); in acpi_pci_irq_enable()
468 dev_warn(&dev->dev, "PCI INT %c: failed to register GSI\n", in acpi_pci_irq_enable()
473 dev->irq = rc; in acpi_pci_irq_enable()
474 dev->irq_managed = 1; in acpi_pci_irq_enable()
477 snprintf(link_desc, sizeof(link_desc), " -> Link[%s]", link); in acpi_pci_irq_enable()
481 dev_dbg(&dev->dev, "PCI INT %c%s -> GSI %u (%s, %s) -> IRQ %d\n", in acpi_pci_irq_enable()
484 (polarity == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq); in acpi_pci_irq_enable()
496 pin = dev->pin; in acpi_pci_irq_disable()
497 if (!pin || !dev->irq_managed || dev->irq <= 0) in acpi_pci_irq_disable()
501 if (dev->dev.power.is_prepared) in acpi_pci_irq_disable()
504 if (dev->dev.power.runtime_status == RPM_SUSPENDING) in acpi_pci_irq_disable()
512 if (entry->link) in acpi_pci_irq_disable()
513 gsi = acpi_pci_link_free_irq(entry->link); in acpi_pci_irq_disable()
515 gsi = entry->index; in acpi_pci_irq_disable()
520 * TBD: It might be worth clearing dev->irq by magic constant in acpi_pci_irq_disable()
524 dev_dbg(&dev->dev, "PCI INT %c disabled\n", pin_name(pin)); in acpi_pci_irq_disable()
527 dev->irq_managed = 0; in acpi_pci_irq_disable()