linux/drivers/acpi/pci_irq.c
<<
>>
Prefs
   1/*
   2 *  pci_irq.c - ACPI PCI Interrupt Routing ($Revision: 11 $)
   3 *
   4 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
   5 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
   6 *  Copyright (C) 2002       Dominik Brodowski <devel@brodo.de>
   7 *  (c) Copyright 2008 Hewlett-Packard Development Company, L.P.
   8 *      Bjorn Helgaas <bjorn.helgaas@hp.com>
   9 *
  10 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  11 *
  12 *  This program is free software; you can redistribute it and/or modify
  13 *  it under the terms of the GNU General Public License as published by
  14 *  the Free Software Foundation; either version 2 of the License, or (at
  15 *  your option) any later version.
  16 *
  17 *  This program is distributed in the hope that it will be useful, but
  18 *  WITHOUT ANY WARRANTY; without even the implied warranty of
  19 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20 *  General Public License for more details.
  21 *
  22 *  You should have received a copy of the GNU General Public License along
  23 *  with this program; if not, write to the Free Software Foundation, Inc.,
  24 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  25 *
  26 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  27 */
  28
  29
  30#include <linux/dmi.h>
  31#include <linux/kernel.h>
  32#include <linux/module.h>
  33#include <linux/init.h>
  34#include <linux/types.h>
  35#include <linux/spinlock.h>
  36#include <linux/pm.h>
  37#include <linux/pci.h>
  38#include <linux/acpi.h>
  39#include <linux/slab.h>
  40#include <acpi/acpi_bus.h>
  41#include <acpi/acpi_drivers.h>
  42
  43#define PREFIX "ACPI: "
  44
  45#define _COMPONENT              ACPI_PCI_COMPONENT
  46ACPI_MODULE_NAME("pci_irq");
  47
  48struct acpi_prt_entry {
  49        struct list_head        list;
  50        struct acpi_pci_id      id;
  51        u8                      pin;
  52        acpi_handle             link;
  53        u32                     index;          /* GSI, or link _CRS index */
  54};
  55
  56static LIST_HEAD(acpi_prt_list);
  57static DEFINE_SPINLOCK(acpi_prt_lock);
  58
  59static inline char pin_name(int pin)
  60{
  61        return 'A' + pin - 1;
  62}
  63
  64/* --------------------------------------------------------------------------
  65                         PCI IRQ Routing Table (PRT) Support
  66   -------------------------------------------------------------------------- */
  67
  68static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(struct pci_dev *dev,
  69                                                          int pin)
  70{
  71        struct acpi_prt_entry *entry;
  72        int segment = pci_domain_nr(dev->bus);
  73        int bus = dev->bus->number;
  74        int device = PCI_SLOT(dev->devfn);
  75
  76        spin_lock(&acpi_prt_lock);
  77        list_for_each_entry(entry, &acpi_prt_list, list) {
  78                if ((segment == entry->id.segment)
  79                    && (bus == entry->id.bus)
  80                    && (device == entry->id.device)
  81                    && (pin == entry->pin)) {
  82                        spin_unlock(&acpi_prt_lock);
  83                        return entry;
  84                }
  85        }
  86        spin_unlock(&acpi_prt_lock);
  87        return NULL;
  88}
  89
  90/* http://bugzilla.kernel.org/show_bug.cgi?id=4773 */
  91static const struct dmi_system_id medion_md9580[] = {
  92        {
  93                .ident = "Medion MD9580-F laptop",
  94                .matches = {
  95                        DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"),
  96                        DMI_MATCH(DMI_PRODUCT_NAME, "A555"),
  97                },
  98        },
  99        { }
 100};
 101
 102/* http://bugzilla.kernel.org/show_bug.cgi?id=5044 */
 103static const struct dmi_system_id dell_optiplex[] = {
 104        {
 105                .ident = "Dell Optiplex GX1",
 106                .matches = {
 107                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
 108                        DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX1 600S+"),
 109                },
 110        },
 111        { }
 112};
 113
 114/* http://bugzilla.kernel.org/show_bug.cgi?id=10138 */
 115static const struct dmi_system_id hp_t5710[] = {
 116        {
 117                .ident = "HP t5710",
 118                .matches = {
 119                        DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
 120                        DMI_MATCH(DMI_PRODUCT_NAME, "hp t5000 series"),
 121                        DMI_MATCH(DMI_BOARD_NAME, "098Ch"),
 122                },
 123        },
 124        { }
 125};
 126
 127struct prt_quirk {
 128        const struct dmi_system_id *system;
 129        unsigned int            segment;
 130        unsigned int            bus;
 131        unsigned int            device;
 132        unsigned char           pin;
 133        const char              *source;        /* according to BIOS */
 134        const char              *actual_source;
 135};
 136
 137#define PCI_INTX_PIN(c)         (c - 'A' + 1)
 138
 139/*
 140 * These systems have incorrect _PRT entries.  The BIOS claims the PCI
 141 * interrupt at the listed segment/bus/device/pin is connected to the first
 142 * link device, but it is actually connected to the second.
 143 */
 144static const struct prt_quirk prt_quirks[] = {
 145        { medion_md9580, 0, 0, 9, PCI_INTX_PIN('A'),
 146                "\\_SB_.PCI0.ISA_.LNKA",
 147                "\\_SB_.PCI0.ISA_.LNKB"},
 148        { dell_optiplex, 0, 0, 0xd, PCI_INTX_PIN('A'),
 149                "\\_SB_.LNKB",
 150                "\\_SB_.LNKA"},
 151        { hp_t5710, 0, 0, 1, PCI_INTX_PIN('A'),
 152                "\\_SB_.PCI0.LNK1",
 153                "\\_SB_.PCI0.LNK3"},
 154};
 155
 156static void do_prt_fixups(struct acpi_prt_entry *entry,
 157                          struct acpi_pci_routing_table *prt)
 158{
 159        int i;
 160        const struct prt_quirk *quirk;
 161
 162        for (i = 0; i < ARRAY_SIZE(prt_quirks); i++) {
 163                quirk = &prt_quirks[i];
 164
 165                /* All current quirks involve link devices, not GSIs */
 166                if (!prt->source)
 167                        continue;
 168
 169                if (dmi_check_system(quirk->system) &&
 170                    entry->id.segment == quirk->segment &&
 171                    entry->id.bus == quirk->bus &&
 172                    entry->id.device == quirk->device &&
 173                    entry->pin == quirk->pin &&
 174                    !strcmp(prt->source, quirk->source) &&
 175                    strlen(prt->source) >= strlen(quirk->actual_source)) {
 176                        printk(KERN_WARNING PREFIX "firmware reports "
 177                                "%04x:%02x:%02x PCI INT %c connected to %s; "
 178                                "changing to %s\n",
 179                                entry->id.segment, entry->id.bus,
 180                                entry->id.device, pin_name(entry->pin),
 181                                prt->source, quirk->actual_source);
 182                        strcpy(prt->source, quirk->actual_source);
 183                }
 184        }
 185}
 186
 187static int acpi_pci_irq_add_entry(acpi_handle handle, struct pci_bus *bus,
 188                                  struct acpi_pci_routing_table *prt)
 189{
 190        struct acpi_prt_entry *entry;
 191
 192        entry = kzalloc(sizeof(struct acpi_prt_entry), GFP_KERNEL);
 193        if (!entry)
 194                return -ENOMEM;
 195
 196        /*
 197         * Note that the _PRT uses 0=INTA, 1=INTB, etc, while PCI uses
 198         * 1=INTA, 2=INTB.  We use the PCI encoding throughout, so convert
 199         * it here.
 200         */
 201        entry->id.segment = pci_domain_nr(bus);
 202        entry->id.bus = bus->number;
 203        entry->id.device = (prt->address >> 16) & 0xFFFF;
 204        entry->pin = prt->pin + 1;
 205
 206        do_prt_fixups(entry, prt);
 207
 208        entry->index = prt->source_index;
 209
 210        /*
 211         * Type 1: Dynamic
 212         * ---------------
 213         * The 'source' field specifies the PCI interrupt link device used to
 214         * configure the IRQ assigned to this slot|dev|pin.  The 'source_index'
 215         * indicates which resource descriptor in the resource template (of
 216         * the link device) this interrupt is allocated from.
 217         * 
 218         * NOTE: Don't query the Link Device for IRQ information at this time
 219         *       because Link Device enumeration may not have occurred yet
 220         *       (e.g. exists somewhere 'below' this _PRT entry in the ACPI
 221         *       namespace).
 222         */
 223        if (prt->source[0])
 224                acpi_get_handle(handle, prt->source, &entry->link);
 225
 226        /*
 227         * Type 2: Static
 228         * --------------
 229         * The 'source' field is NULL, and the 'source_index' field specifies
 230         * the IRQ value, which is hardwired to specific interrupt inputs on
 231         * the interrupt controller.
 232         */
 233
 234        ACPI_DEBUG_PRINT_RAW((ACPI_DB_INFO,
 235                              "      %04x:%02x:%02x[%c] -> %s[%d]\n",
 236                              entry->id.segment, entry->id.bus,
 237                              entry->id.device, pin_name(entry->pin),
 238                              prt->source, entry->index));
 239
 240        spin_lock(&acpi_prt_lock);
 241        list_add_tail(&entry->list, &acpi_prt_list);
 242        spin_unlock(&acpi_prt_lock);
 243
 244        return 0;
 245}
 246
 247int acpi_pci_irq_add_prt(acpi_pci_irq_add_entry(acpi_handle handle, struct  12     */
 1492/a>  2             <+code=d_entry" classt ((<="drivers/acpi/pci_irq.c#L245" id="L150" clas2="line" name="L150"> 1502/a>  25    struct number(number(DMI_SYS_VNFONULL;
 1512/a>  2     { acpi_pci_routing_table *entry;
 1522/a>  2      "drivers/acpi/pci_irq.c#L191" id="2143" class="line" name="L153"> 1532/a>  2             /* All curreld spf">acpld speis uses 0=Ice_ind paks in(root bridge orrrup-ruptbridge)>
 1542/a>};25    (pin_namehandle, DMI_BOARDNFOnumber( 1552/a>
<25             ef="+code=prt" clasNFODMI_BOARDNFO(<)="drivers/acpi/pci_irq.c#L2"L148"> 1156" clas2="line" name="L156"> 1562/a>st25                     a href="+code=ENOMEM" clasDEVe=pci_bus" cl)
lasDEVhref="drivers/acpi/pci_irq.c#L191" id="2147" class="line" name="L157"> 1572/a>  25href="drivers/acpi/pci_irq.c#L208" id="L158" clas2="line" name="L158"> 1582/a>{
25    printk(printk("A555"FO<:%ccontrolleRble,
 1592/a>  2     int number(<"+code=device" cpo contsref">printko conta>( 1602/a>  2     c"drivers/acpi/pci_irq.c#L243" id="L151" clas2="line" name="L161"> 1612/a>
<26    handlenumber(<"+code=device" cpo contsref">printko conta>( 1622/a>  26     "drivers/acpi/pci_irq.c#L191" id="2163" clas2="line" name="L163"> 1632/a>  26    number(<"+code=device" clengthsref">list, engtha>(DMI_SYS_VNFO 1642/a>
<26    number(<"+code=device" cpo contsref">printko conta>(NULL;
 1652/a>  26href="drivers/acpi/pci_irq.c#L226" id="L166" clas2="line" name="L166"> 1662/a>  26    (acpi_pci_routiehandle, number( 1672/a>  2              ef="+code=prt" clasNFODMI_BOARDNFO(<)=f="drivers/acpi/pci_irq.c#L176" id="2168" clas2="line" name="L168"> 1682/a>
<26                     +code=prt" clasNFOPCI_INTX_NFOACPI_DB_INE,
("098Ch&quoEich ae,
 1692/a>  2             if (acpi_pci_routi at th_excepnot ref="+code=handle" ct (<)=f="drivers/acpi/pci_irq.c#L243" id="L170" clas2="line" name="L170"> 1702/a>  2                 handlenumber(<"+code=device" cpo contsref">printko conta>( 1712/a>  2                  1722/a>  2              ="drivers/acpi/pci_irq.c#L246" id="L173" clas2="line" name="L173"> 1732/a>  27href="drivers/acpi/pci_irq.c#L244" id="L174" clas2="line" name="L174"> 1742/a>  27    entry->number(<"+code=device" cpo contsref">printko conta>(<="drivers/acpi/pci_irq.c#L191" id="2155" clas2="line" name="L175"> 1752/a>  2               uses<"+code=entry" class="sref">entry->entry->list, engtha>( 1762/a>  2                     <+code=acpi_pci_irq_add_prt" clasass="sref">acpi_pci_irq_add_entry(handle, bus,
entry-> 1772/a>  2                      +code=entry" class="sref">entry->acpi_pci_routing_table * 1178" clas2="line" name="L178"> 1782/a>  2                          ((char     long)+code=entry" class="sref">entry->entry->list, engtha>( 1792/a>  2              ="drivers/acpi/pci_irq.c#L246" id="L180" clas2="line" name="L180"> 1802/a>  28    c"drivers/acpi/pci_irq.c#L243" id="L181" clas2="line" name="L181"> 1812/a>  28    handlenumber(<"+code=device" cpo contsref">printko conta>( 1822/a>  2              
 1832/a>  2      ="drivers/acpi/pci_irq.c#L246" id="L174" clas2="line" name="L184"> 1842/a>  28href="drivers/acpi/pci_irq.c#L165" id="2185" clas2="line" name="L185"> 1852/a>}
2a hrefref="+code=do_prt_fiirq_add_entrydelss="sref">acpi_pci_irq_add_prt handle, struct  1186" clas2="line" name="L186"> 1862/a>
<2 href=="drivers/acpi/pci_irq.c#L176" id="2187" clas2="line" name="L187"> 1872/a>st28              href="+code=acpi_prt_entry" class="sref">acpi_prt_entry *entry,
strcmp 1882/a>  28href="drivers/acpi/pci_irq.c#L169" id="2189" clas2="line" name="L189"> 1892/a>{
28            <+code=d_entry" lass="sref">printk(printk(<"drivers/acpi/pci_irq.c#L169" id="2190" clas2="line" name="L190"> 1902/a>  29                "A555"FO<:&Delete%ccontrolleRble,
 1912/a>
<29                pci_domain_nr(bus);
bus,
number;
 1922/a>  2     spin_lock(&acpi_prt_lock);
 1932/a>  29     *handle *entry, strcmpacpi_prt_list);
list, & 1942/a>  2             return -pci_domain_nr(bus);
entry->id.segment,  1952/a>
<29                          bus,
number;
entry->id.bus);
 1962/a>  29                    handleentry->list, & 1972/a>handleentry-> 1982/a> 1992/a> 2003/a>spin_unlock(&acpi_prt_lock);
 2013/a>  3     <="drivers/acpi/pci_irq.c#L246" id="3221" clas3="line" name="L192"> 1923/a>  30     "drivers/acpi/pci_irq.c#L191" id="3203" clas3="line" name="L203"> 2033/a>  30n class="comment">         /--------
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 2043/a>  30n class="comment">         * configuuuuuuuuuuuuuuuuuu#37;ccontrolleRble 1953/a>
<30n class="comment">         * i------
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>
 2063/a>  3     <#ifdef"+code=spin_lockCONFIG_X86_IO_APICsref">acpi_prt_CONFIG_X86_IO_APIC    "drivers/acpi/pci_irq.c#L191" id="3276" clas3="line" name="L197"> 1973/a>
<3 href=exontnref="+code=acpi_pci_noioapicass="sref">quirknoioapicass="ref=="drivers/acpi/pci_irq.c#L245" id="3208" clas3="line" name="L208"> 2083/a>  3     handle 1993/a>
<3 href="drivers/acpi/pci_irq.c#L210" id="3210" clas3="line" name="L210"> 2103/a>  3     segment handle, struct  3211" clas3="line" name="L211"> 2113/a> 2123/a>handle, struct segment 2133/a> 2143/a>segmentbus->segmentsegmentsegmenthaaks i hrefe="drivers/acpi/pci_irq.c#L176" id="3215" clas3="line" name="L215"> 2153/a>segmentsegmentlfhref="drivers/acpi/pci_irq.c#L2"L148"> 3206" clas3="line" name="L216"> 2163/a> 2173/a>segmentsegmentlfhrefref="+code=id" class=tsegment 3208" clas3="line" name="L218"> 2183/a>segmentsegmentlfhrefref="+code=id" class=tsegment 2193/a> 2203/a> 2213/a> 2223/a> 2233/a>  32n class="comment">         /-a href="drivers/acpi/pci_irq.c#L233" id="3224" clas3="line" name="L224"> 2243/a>  32n class="comment">         ** Some chipsetsists socconl 6700PXH) genay ne a legacy;c cx whenvalue, wa href="drivers/acpi/pci_irq.c#L233" id="3215" clas3="line" name="L225"> 2253/a>
<32n class="comment">         ** the ACPI 2263/a>  32n class="comment">         ** duot;At controlle>,  2273/a>         ** we teable"o/spspt controllsslot|deir legacy;eassvals inlotget rid 
 2283/a>         ** spuotoupt is allocs 2293/a>         *
 2303/a>acpi_prt_lockpci_domain_nr, struct pci_domai, ="drivers/acpi/pci_irq.c#L236" id="3231" clas3="line" name="L231"> 2313/a> acpi_prt_entry *entry,
 3232" clas3="line" name="L232"> 2323/a> 2333/a>
<33    if (quirknoioapicass="ref= ||"+code=acpi_pci_noioapicreable"sref">handle 2343/a>  33            return -<
 2353/a>  3              } elspt="drivers/acpi/pci_irq.c#L176" id="3226" clas3="line" name="L236"> 2363/a>  3                      switch="+code=prt" classridge_has_boot_ controll_varia="sref">segmentpci_domai, ref="+code=bus" class="sref">bus &&am)=f="drivers/acpi/pci_irq.c#L176" id="3237" clas3="line" name="L237"> 2373/a>  3                      caspt0:"drivers/acpi/pci_irq.c#L176" id="3228" clas3="line" name="L238"> 2383/a>  3                                    /--no teablet;Atnecessa AC
 2393/a>
<33            if ( 2403/a>  34                bus &c cEL_, w_REROUTE_VARIANT    :"drivers/acpi/pci_irq.c#L176" id="3241" clas3="line" name="L241"> 2413/a>  34                                     /-a href="drivers/acpi/pci_irq.c#L233" id="3242" clas3="line" name="L242"> 2423/a>  34n class="comment">         */>>>>>>>>>>>>>>>>* Remap accord37;s\n&c cx ablet;At * 2433/a>
<34n class="comment">         * The >>>>>>>>>>>>>>>>* intes, iconl order >;
 2443/a>  34n class="comment">         * configuuuuuuuuuuuuuuuuu* 2.15.2. O|der chipsetsis803an, ...)urred /spasa
 2453/a>}
34n class="comment">         * indicatuuuuuuuuuuuuuuuu* mappt;At#39;ts &>, 
 as well 2463/a>
<34n class="comment">         * the linuuuuuuuuuuuuuuuu* 2473/a>in34                          pci_domaipci_domai, ref="+code=bus" clasdevsref">pci_domai, =h s="string">"A555"#37;cRQr%d37;s[&#reable"ific legacy;pan>
"A555"cRQr%d/span>,
entry->index));
 1493/a>  34            if (entry->index =  1503/a>  35                            <+code=entry" class="sref">entry->index = entry->index =  1513/a>  35                            <
 1523/a>  35                     1533/a>  3             <               <+code=entry" clacpi_pci_pci_domai, ref="+code=bus" clasdevsref">pci_domai, =h s="string">"A555"Canoccuteable"ocRQr%d3ic legacy;pan>
 1543/a>};35            return -<<               <+s="string">"A555"cRQ: unknown mappt;A/span>,
entry->index));
 1553/a>
<35                           1563/a>st35                     ="drivers/acpi/pci_irq.c#L246" id="3147" clas3="line" name="L157"> 1573/a>  35             ="drivers/acpi/pci_irq.c#L246" id="31     */<3="line" name="L158"> 1583/a>{
35    <="drivers/acpi/pci_irq.c#L246" id="3149" clas3="line" name="L159"> 1593/a>  3     i#endif ss="comment">         /--CONFIG_X86_IO_APICu* 1603/a>  3     c"drivers/acpi/pci_irq.c#L243" id="3151" clas3="line" name="L161"> 1613/a>
<36     acpi_prt_entry *strcmppci_domain_nr, struct pci_domai, =ref="+code=acpi_pci_s="sref">pin),
 1623/a>  36n cla="drivers/acpi/pci_irq.c#L176" id="3163" clas3="line" name="L163"> 1633/a>  36    acpi_prt_entry *entry;
 1643/a>
<36    pci_domain_nr, struct segment 1653/a>  36             ruct segmentpin),sridge_s="a>, =h code=prt" clasorig_s="sref">pin),orig_s="ref=f="+code=bus" class="sref">pin),
 1663/a>  36href="drivers/acpi/pci_irq.c#L247" id="3167" clas3="line" name="L167"> 1673/a>  3              +code=entry" class="sref">entry;
acpi_prt_entrypci_domai, ="+code=pin_name" clsref">pin),
 1683/a>
<36             ef="+code=prt" clasass="sref">entry,
 1693/a>  3      #ifdef"+code=spin_lockCONFIG_X86_IO_APICsref">acpi_prt_CONFIG_X86_IO_APIC    "drivers/acpi/pci_irq.c#L191" id="3170" clas3="line" name="L170"> 1703/a>  3                 acpi_prt_lockpci_domai, ="+code=pin_name"ass="sref">entry-> 1713/a>  3      #endif ss="comment">         /--CONFIG_X86_IO_APICu* 1723/a>  37                    <+code=pin_name"G_PRINT_RAW(sref">entryG_PRINT_RAW(ref=""+code=ACPI_DB_INFO" class="sref">ACPI_DB_INFO,
"A555"Found#37;d]\n"c]ry in the A/span>,
 1733/a>  37            <               <         <+code=pin_name"#L23ss="sref">pin_name<#L23ss="ref="ruct pci_domai, f="+code=prt" clas class="sref">pin_name(pin),
 1743/a>  37            return -<
entry;
 1753/a>  3              ="drivers/acpi/pci_irq.c#L246" id="3176" clas3="line" name="L176"> 1763/a>  37href="drivers/acpi/pci_irq.c#L247" id="3167" clas3="line" name="L177"> 1773/a>  3              ss="comment">         /--a href="drivers/acpi/pci_irq.c#L233" id="31     */<3="line" name="L178"> 1783/a>  37n class="comment">         * ---------At(of
 a paks insridgece_inda href="drivers/acpi/pci_irq.c#L233" id="3169" clas3="line" name="L179"> 1793/a>  37n class="comment">         * The 'rupt link deviablet;Atthe AC(eg. ythea bridge #39;tdd-i hcardtbridge) 1803/a>  38n class="comment">         * the IRQ  1813/a>  38    segmentpci_domai, ref="+code=bus" class="sref">bus &&amref="+code=pin" classelfsref">segmentlfhref="drivers/acpi/pci_irq.c#L191" id="3182" clas3="line" name="L182"> 1823/a>  3               uses<"+code=entry" clbridgesref">segment 1833/a>  38            <        +code=entry" cl clsref">pin),
pin),
L17swizzle_ controll_ clref="ruct pci_domai, ="+code=pin_name" clsref">pin),
 1843/a>  38href="drivers/acpi/pci_irq.c#L165" id="3185" clas3="line" name="L185"> 1853/a>}
38                     ref="+code=entry" clbridgesref">segmentssref">segments href&f=";s[fef="+code=quirk" clrup_CLASS_BRIDGE_CARDBUSsref">segment 1863/a>
<38                             /--PChcardthas /spasa
 1873/a>st38                          pin),sridge_s="a>, f="+code=bus" classridgesref">segmentpin),
 1883/a>  38                             ref="+code=entry" clsridge_s="sref">pin),sridge_s="a>, =f="drivers/acpi/pci_irq.c#L176" id="3169" clas3="line" name="L189"> 1893/a>{
38            if ((sref">entryG_PRINT_RAW(ref=""+code=ACPI_DB_INFO" class="sref">ACPI_DB_INFO,
 1903/a>  39                "A555"Not link devipi hconfiguecifref=ed to,
 1913/a>
<39                pin_name<#L23ss="ref="ruct segment 1923/a>  39                    <<<<<<<<<<<<<<<<<
NULL;
 1933/a>  39            <               <="drivers/acpi/pci_irq.c#L246" id="3194" clas3="line" name="L194"> 1943/a>  3             return -pin),
pin),sridge_s="a>, ="drivers/acpi/pci_irq.c#L243" id="3185" clas3="line" name="L195"> 1953/a>
<39                     ="drivers/acpi/pci_irq.c#L246" id="3176" clas3="line" name="L196"> 1963/a>  39href="drivers/acpi/pci_irq.c#L247" id="3187" clas3="line" name="L197"> 1973/a>entry;
acpi_prt_entrysegmentpin),
 1983/a>entry,
 1993/a>(sref">entryG_PRINT_RAW(ref=""+code=ACPI_DB_INFO" class="sref">ACPI_DB_INFO,
 2004/a>"A555"Depi/pd GSI nfor%s c cr%c/an>
 37;d]\/span>,
 2014/a>  40                pin_name<#L23ss="ref="ruct pci_domai, f="+code=prt" clas class="sref">pin_name(pin),orig_s="ref=f="drivers/acpi/pci_irq.c#L238" id="4221" clas4="line" name="L192"> 1924/a>  40                    <<<<<<<<<<<<<<<<pin_name<#L23ss="ref="ruct segment 2034/a>  40            <               <
entry;
 2044/a>  40            return -<="drivers/acpi/pci_irq.c#L246" id="4254" clas4="line" name="L195"> 1954/a>
<40href="drivers/acpi/pci_irq.c#L226" id="4206" clas4="line" name="L206"> 2064/a>  40                    <+code=acpi_pci_devsref">pci_domai, f="+code=bus" classridgesref">segment 1974/a>
<40                     +code=entry" clbridgesref">segmentpci_domai, ref="+code=bus" class="sref">bus &&amref="+code=pin" classelfsref">segmentlfhref="drivers/acpi/pci_irq.c#L191" id="4208" clas4="line" name="L208"> 2084/a>  40             ="drivers/acpi/pci_irq.c#L246" id="4298" clas4="line" name="L199"> 1994/a>
<4 href="drivers/acpi/pci_irq.c#L210" id="4210" clas4="line" name="L210"> 2104/a>  41    acpi_pci_pci_domai, ref="+code=bus" clasdevsref">pci_domai, =h s="string">"A555"cance_inttdepi/p ablet;Atforrrup c cr%c/span>,
 2114/a>pin_name(pin),orig_s="ref=ff="drivers/acpi/pci_irq.c#L243" id="4212" clas4="line" name="L212"> 2124/a>NULL;
 2134/a> 2144/a> 2154/a>acpi_pci_routing_trt" enss="ref="le pci_domain_nr, struct pci_domai, f"drivers/acpi/pci_irq.c#L243" id="4206" clas4="line" name="L216"> 2164/a> 2174/a>acpi_prt_entry *entry,
 2184/a>entrygsihref="drivers/acpi/pci_irq.c#L243" id="4298" clas4="line" name="L219"> 2194/a>segmentpin),
 2204/a>pin),uotggeot;Ahreff="+code=prt" clasNFOACPI_DB_INFO 2214/a>entrypolarit"hreff="+code=prt" clasNFOACPI_DB_INFO 2224/a>quirke=""hreff="+code=prt" classs="sref">NULL;
 2234/a>  423                 +code=prt" clase=""rquirke=""r 2244/a>  424   quirkrchref="drivers/acpi/pci_irq.c#L243" id="4215" clas4="line" name="L225"> 2254/a>
<42href="drivers/acpi/pci_irq.c#L226" id="4226" clas4="line" name="L226"> 2264/a>  42    pin),
pci_domai, ref="+code=bus" class="sref">pin),
 2274/a>pin),
 2284/a>(sref">entryG_PRINT_RAW(ref=""+code=ACPI_DB_INFO" class="sref">ACPI_DB_INFO,
 2294/a>"A555"Not link devipi hconfiguecifref=ed to,
 2304/a>pin_name<#L23ss="ref="ruct pci_domai, fff="drivers/acpi/pci_irq.c#L243" id="4231" clas4="line" name="L231"> 2314/a> 2324/a> 2334/a>
<43href="drivers/acpi/pci_irq.c#L244" id="4234" clas4="line" name="L234"> 2344/a>  43            r+code=entry" class="sref">entry;
strcmppci_domai, ="+code=pin_name" clsref">pin),
 2354/a>  4              ef=""+code=entry" class="sref">entry,
 2364/a>  4                      ss="comment">         /-a href="drivers/acpi/pci_irq.c#L233" id="4237" clas4="line" name="L237"> 2374/a>  43n class="comment">         ****************** IDE legacy;m" chcontrollergneds;ts &magic. Why dohcompa 2384/a>  43n class="comment">         * -------********* exonnsions;tlways make such a38"sty;mess 2394/a>
<43n class="comment">         * The ********* 2404/a>  44                pci_domai, ref="+code=bus" clasef">psref">segments href&f=";s[ef="+code=quirk" clrup_CLASS_STORAGE_IDEsref">segment 2414/a>  44                            <<<<<<<<<"+code=prt" clasdevsref">pci_domai, ref="+code=bus" clasef">psref">segments href&ref=<0x05fef="0f"drivers/acpi/pci_irq.c#L243" id="4242" clas4="line" name="L242"> 2424/a>  44                    <<<<<<<<<
 2434/a>
<443            ="drivers/acpi/pci_irq.c#L246" id="4234" clas4="line" name="L244"> 2444/a>  44href="drivers/acpi/pci_irq.c#L165" id="4245" clas4="line" name="L245"> 2454/a>}
44             ef="+code=entry" class="sref">entry,
 2464/a>
<44                     ef="+code=entry" class="sref">entry,
quirke=""hreff"drivers/acpi/pci_irq.c#L243" id="4237" clas4="line" name="L247"> 2474/a>in44                          entrygsihreff="+code=prt" clashandldd_pe=""rallocate43" sref">strcmpentry,
quirke=""href="drivers/acpi/pci_irq.c#L236" id="42     */<4span>
entry->index));
 1494/a>  44            if (pin),uotggeot;Ahref href="+code=acpi_prt_polarit"sref">entrypolarit"href="drivers/acpi/pci_irq.c#L236" id="4150" clas4="line" name="L150"> 1504/a>  45                            <        <<<<<<<<<<<<<<<<<<<<<<<<quirke=""hreff="drivers/acpi/pci_irq.c#L245" id="4141" clas4="line" name="L151"> 1514/a>  45                     elsp"drivers/acpi/pci_irq.c#L245" id="4142" clas4="line" name="L152"> 1524/a>  45                    <<<<<<<<<+code=list_add_gsisref">entrygsihreff="+code=prt" clasass="sref">entry->index));
 1534/a>  4             <} elsp"drivers/acpi/pci_irq.c#L245" id="4134" clas4="line" name="L154"> 1544/a>};45            return -<+code=list_add_gsisref">entrygsihreff=""f="drivers/acpi/pci_irq.c#L205" id="4145" clas4="line" name="L155"> 1554/a>
<45href="drivers/acpi/pci_irq.c#L226" id="4146" clas4="line" name="L156"> 1564/a>st45             ss="comment">         /-a href="drivers/acpi/pci_irq.c#L233" id="4147" clas4="line" name="L157"> 1574/a>  45n class="comment">         ********** Nogned known lot|de NFO< subsystem - maybd /spaBIOS /-a href="drivers/acpi/pci_irq.c#L233" id="41     */<4="line" name="L158"> 1584/a>{
45n class="comment">         * ---------cpi/pc<
 1594/a>  45n class="comment">         * The ' 1604/a>  460            ef="+code=entry" clgsisref">entrygsihreff&l[�=f="drivers/acpi/pci_irq.c#L176" id="4151" clas4="line" name="L161"> 1614/a>
<46                     +code=acpi_pci_u="line" nammententry 1624/a>  46                    <+code=pin_name"acpi_pci_pci_domai, ref="+code=bus" clasdevsref">pci_domai, =h s="string">"A555"rup c cr%c:-no GSIpan>,
pin_name(pin),
 1634/a>  46            <        +s="comment">         /--ccontrolleL="L values above<0xF;ts &forbiddpn 9 1644/a>
<46            return -pci_domai, ref="+code=bus" clas3" sref">strcmppci_domai, ref="+code=bus" clas3" sref">strcmp 1654/a>  46                         "+code=prt" clasirq_aisaprtentryirq_aisaprtpci_domai, ref="+code=bus" clas3" sref">strcmpentry 1664/a>  46                    printk("A555" - ust;AtISA cRQr%d/span>,
pci_domai, ref="+code=bus" clas3" sref">strcmp 1674/a>  46                          entryirq_aaegister_gsi;pci_domai, ref="+code=bus" clasdevsref">pci_domai, =h code=acpi_prt_entry 1684/a>
<46                              struct <         +code=prt" clasNFOACPI_DB_INFO 1694/a>  46            if (ACPI_DB_INFO 1704/a>  4                  1714/a>  47                     } elspt="drivers/acpi/pci_irq.c#L176" id="4172" clas4="line" name="L172"> 1724/a>  47                    <<<<<<<<<+code=prt" claslass="sref">printk("A555"/span>,
 1734/a>  47            <               <
 1744/a>  47            return -<="drivers/acpi/pci_irq.c#L246" id="4155" clas4="line" name="L175"> 1754/a>  4              ="drivers/acpi/pci_irq.c#L246" id="4176" clas4="line" name="L176"> 1764/a>  47href="drivers/acpi/pci_irq.c#L247" id="4167" clas4="line" name="L177"> 1774/a>  47             +code=entry" clrcsref">quirkrchreff="+code=prt" clashandlaegister_gsisref">entryirq_aaegister_gsi;pci_domai, ref="+code=bus" clasdevsref">pci_domai, =h code=acpi_prt_gsisref">entrygsihref=h code=acpi_prt_uotggeot;A5ref">pin),uotggeot;Ahref h+code=acpi_prt_polarit"sref">entrypolarit"href=="drivers/acpi/pci_irq.c#L245" id="41     */<4="line" name="L178"> 1784/a>  47             ef="+code=prt" clasrcsref">quirkrchreff&l[�=f="drivers/acpi/pci_irq.c#L176" id="4169" clas4="line" name="L179"> 1794/a>  47            if (acpi_pci_pci_domai, ref="+code=bus" clasdevsref">pci_domai, =h s="string">"A555"rup c cr%c:-fail"ific aegister GSI/span>,
 1804/a>  48                            < +code=entry" cl class="sref">pin_name(pin),
 1814/a>  48                     
quirkrchref="drivers/acpi/pci_irq.c#L245" id="4172" clas4="line" name="L182"> 1824/a>  48             ="drivers/acpi/pci_irq.c#L246" id="4183" clas4="line" name="L183"> 1834/a>  48            <+code=prt" clasdevsref">pci_domai, ref="+code=bus" clas3" sref">strcmpquirkrchref="drivers/acpi/pci_irq.c#L245" id="4134" clas4="line" name="L184"> 1844/a>  48href="drivers/acpi/pci_irq.c#L165" id="4185" clas4="line" name="L185"> 1854/a>}
48             ef="+code=entry" clss""sref">quirke=""hreff"drivers/acpi/pci_irq.c#L243" id="4176" clas4="line" name="L186"> 1864/a>
<48                    <+code=entry" clsn>(segment(quirke=""rquirke=""r"A555"37;s[&#L=""n"s]pan>,
quirke=""hreff="drivers/acpi/pci_irq.c#L245" id="4167" clas4="line" name="L187"> 1874/a>st48             elsp"drivers/acpi/pci_irq.c#L245" id="4178" clas4="line" name="L188"> 1884/a>  48                     +code=entry" cle=""rquirke=""r"A555e_in\05e_in 1894/a>{
48href="drivers/acpi/pci_irq.c#L210" id="4190" clas4="line" name="L190"> 1904/a>  49    pin),pci_domai, ref="+code=bus" clasdevsref">pci_domai, =h s="string">"A555"rup c cr%c%s 7;s[&#GSI %u (%s,/37;d]\) 7;s[&#cRQr%d/span>,
 1914/a>
<49                pin_name(pin),
quirke=""rentrygsihref="drivers/acpi/pci_irq.c#L210" id="4172" clas4="line" name="L192"> 1924/a>  49                    <"+code=entry" cluotggeot;A5ref">pin),uotggeot;Ahreff=="+code=prt" clasNFOACPI_DB_INFO"A555"levelpan>,
"A555"edgecan>,
 1934/a>  49            <        "+code=entry" cl olarit"sref">entrypolarit"hreff=="+code=prt" clasNFOACPI_DB_INFO"A555"lowpan>,
"A555"highpan>,
pci_domai, ref="+code=bus" clas3" sref">strcmp 1944/a>  49href="drivers/acpi/pci_irq.c#L165" id="4185" clas4="line" name="L195"> 1954/a>
<49             
 1964/a>  49href=="drivers/acpi/pci_irq.c#L246" id="4187" clas4="line" name="L197"> 1974/a> 1984/a>         /* FIXME: imple     x86/x86_64 /pciot h9 1994/a>strcmpquirkwea" href="+code=prt" clashandlunaegister_gsisref">entryirq_aunaegister_gsiref="+code=entry" clu="line" nammententryihreff"drivers/acpi/pci_irq.c#L243" id="5200" clas5="line" name="L200"> 2005/a> 2015/a>  50     ="drivers/acpi/pci_irq.c#L246" id="5221" clas5="line" name="L192"> 1925/a>  50     "drivers/acpi/pci_irq.c#L246" id="5231" clas5="line" name="L193"> 1935/a>  50     void"+code=entry" clirq_add_prtentryirq_add_prtpci_domain_nr, struct pci_domai, f"drivers/acpi/pci_irq.c#L243" id="5204" clas5="line" name="L204"> 2045/a>  50     ="drivers/acpi/pci_irq.c#L176" id="5254" clas5="line" name="L195"> 1955/a>
<50              href="+code=acpi_prt_entry" class="sref">acpi_prt_entry *entry,
 2065/a>  50             ef="+code=acpi_pci_gsisref">entrygsihref="drivers/acpi/pci_irq.c#L243" id="5276" clas5="line" name="L197"> 1975/a>
<50             +code=entry" clu8sref">segmentpin),
 2085/a>  50     "drivers/acpi/pci_irq.c#L191" id="5298" clas5="line" name="L199"> 1995/a>
<50             +code=acpi_pci_#clsref">pin),
pci_domai, ref="+code=bus" class="sref">pin),
 2105/a>  510            ef=""+code=entry" cl clsref">pin),
 2115/a> 2125/a> 2135/a>entry;
strcmppci_domai, ="+code=pin_name" clsref">pin),
 2145/a>entry,
 2155/a> 2165/a> 2175/a>entry,
quirke=""hreff"drivers/acpi/pci_irq.c#L243" id="5208" clas5="line" name="L218"> 2185/a>entrygsihreff="+code=prt" clashandldd_pe=""rfree43" sref">strcmpentry,
quirke=""hreff="drivers/acpi/pci_irq.c#L191" id="5298" clas5="line" name="L219"> 2195/a> 2205/a>entrygsihreff="+code=prt" clasass="sref">entry->index));
 2215/a> 2225/a>         /-a href="drivers/acpi/pci_irq.c#L233" id="5223" clas5="line" name="L223"> 2235/a>  52n class="comment">         * The * TBD: It might be worthommeaot;A=ed ref="3"  by&magichconstan 2245/a>  52n class="comment">         * configu* (e.g.rrup_UNDEFINED_IRQ) 2255/a>
<52n class="comment">         * indicat9 2265/a>  52href="drivers/acpi/pci_irq.c#L247" id="5217" clas5="line" name="L227"> 2275/a>pin),pci_domai, ref="+code=bus" clasdevsref">pci_domai, =h s="string">"A555"rup c cr%c dis*,
pin_name(pin),
 2285/a>entryirq_aunaegister_gsiref="+code=entry" clgsisref">entrygsihref=="drivers/acpi/pci_irq.c#L245" id="5298" clas5="line" name="L229"> 2295/a> 2305/a>


The original LXR softwts &by&/spadrivers/ahttp://sourceforge.net/projects/lxr">LXR unit"href==alis experi al /pciot hby&drivers/amailto:lxr@e="ux.noa>exr@e="ux.nohref.
exr.e="ux.no k));ly hos