linux/drivers/parisc/iosapic.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3** I/O Sapic Driver - PCI interrupt line support
   4**
   5**      (c) Copyright 1999 Grant Grundler
   6**      (c) Copyright 1999 Hewlett-Packard Company
   7**
   8**
   9** The I/O sapic driver manages the Interrupt Redirection Table which is
  10** the control logic to convert PCI line based interrupts into a Message
  11** Signaled Interrupt (aka Transaction Based Interrupt, TBI).
  12**
  13** Acronyms
  14** --------
  15** HPA  Hard Physical Address (aka MMIO address)
  16** IRQ  Interrupt ReQuest. Implies Line based interrupt.
  17** IRT  Interrupt Routing Table (provided by PAT firmware)
  18** IRdT Interrupt Redirection Table. IRQ line to TXN ADDR/DATA
  19**      table which is implemented in I/O SAPIC.
  20** ISR  Interrupt Service Routine. aka Interrupt handler.
  21** MSI  Message Signaled Interrupt. PCI 2.2 functionality.
  22**      aka Transaction Based Interrupt (or TBI).
  23** PA   Precision Architecture. HP's RISC architecture.
  24** RISC Reduced Instruction Set Computer.
  25**
  26**
  27** What's a Message Signalled Interrupt?
  28** -------------------------------------
  29** MSI is a write transaction which targets a processor and is similar
  30** to a processor write to memory or MMIO. MSIs can be generated by I/O
  31** devices as well as processors and require *architecture* to work.
  32**
  33** PA only supports MSI. So I/O subsystems must either natively generate
  34** MSIs (e.g. GSC or HP-PB) or convert line based interrupts into MSIs
  35** (e.g. PCI and EISA).  IA64 supports MSIs via a "local SAPIC" which
  36** acts on behalf of a processor.
  37**
  38** MSI allows any I/O device to interrupt any processor. This makes
  39** load balancing of the interrupt processing possible on an SMP platform.
  40** Interrupts are also ordered WRT to DMA data.  It's possible on I/O
  41** coherent systems to completely eliminate PIO reads from the interrupt
  42** path. The device and driver must be designed and implemented to
  43** guarantee all DMA has been issued (issues about atomicity here)
  44** before the MSI is issued. I/O status can then safely be read from
  45** DMA'd data by the ISR.
  46**
  47**
  48** PA Firmware
  49** -----------
  50** PA-RISC platforms have two fundamentally different types of firmware.
  51** For PCI devices, "Legacy" PDC initializes the "INTERRUPT_LINE" register
  52** and BARs similar to a traditional PC BIOS.
  53** The newer "PAT" firmware supports PDC calls which return tables.
  54** PAT firmware only initializes the PCI Console and Boot interface.
  55** With these tables, the OS can program all other PCI devices.
  56**
  57** One such PAT PDC call returns the "Interrupt Routing Table" (IRT).
  58** The IRT maps each PCI slot's INTA-D "output" line to an I/O SAPIC
  59** input line.  If the IRT is not available, this driver assumes
  60** INTERRUPT_LINE register has been programmed by firmware. The latter
  61** case also means online addition of PCI cards can NOT be supported
  62** even if HW support is present.
  63**
  64** All platforms with PAT firmware to date (Oct 1999) use one Interrupt
  65** Routing Table for the entire platform.
  66**
  67** Where's the iosapic?
  68** --------------------
  69** I/O sapic is part of the "Core Electronics Complex". And on HP platforms
  70** it's integrated as part of the PCI bus adapter, "lba".  So no bus walk
  71** will discover I/O Sapic. I/O Sapic driver learns about each device
  72** when lba driver advertises the presence of the I/O sapic by calling
  73** iosapic_register().
  74**
  75**
  76** IRQ handling notes
  77** ------------------
  78** The IO-SAPIC can indicate to the CPU which interrupt was asserted.
  79** So, unlike the GSC-ASIC and Dino, we allocate one CPU interrupt per
  80** IO-SAPIC interrupt and call the device driver's handler directly.
  81** The IO-SAPIC driver hijacks the CPU interrupt handler so it can
  82** issue the End Of Interrupt command to the IO-SAPIC.
  83**
  84** Overview of exported iosapic functions
  85** --------------------------------------
  86** (caveat: code isn't finished yet - this is just the plan)
  87**
  88** iosapic_init:
  89**   o initialize globals (lock, etc)
  90**   o try to read IRT. Presence of IRT determines if this is
  91**     a PAT platform or not.
  92**
  93** iosapic_register():
  94**   o create iosapic_info instance data structure
  95**   o allocate vector_info array for this iosapic
  96**   o initialize vector_info - read corresponding IRdT?
  97**
  98** iosapic_xlate_pin: (only called by fixup_irq for PAT platform)
  99**   o intr_pin = read cfg (INTERRUPT_PIN);
 100**   o if (device under PCI-PCI bridge)
 101**               translate slot/pin
 102**
 103** iosapic_fixup_irq:
 104**   o if PAT platform (IRT present)
 105**         intr_pin = iosapic_xlate_pin(isi,pcidev):
 106**         intr_line = find IRT entry(isi, PCI_SLOT(pcidev), intr_pin)
 107**         save IRT entry into vector_info later
 108**         write cfg INTERRUPT_LINE (with intr_line)?
 109**     else
 110**         intr_line = pcidev->irq
 111**         IRT pointer = NULL
 112**     endif
 113**   o locate vector_info (needs: isi, intr_line)
 114**   o allocate processor "irq" and get txn_addr/data
 115**   o request_irq(processor_irq,  iosapic_interrupt, vector_info,...)
 116**
 117** iosapic_enable_irq:
 118**   o clear any pending IRQ on that line
 119**   o enable IRdT - call enable_irq(vector[line]->processor_irq)
 120**   o write EOI in case line is already asserted.
 121**
 122** iosapic_disable_irq:
 123**   o disable IRdT - call disable_irq(vector[line]->processor_irq)
 124*/
 125
 126#include <linux/pci.h>
 127
 128#include <asm/pdc.h>
 129#include <asm/pdcpat.h>
 130#ifdef CONFIG_SUPERIO
 131#include <asm/superio.h>
 132#endif
 133
 134#include <asm/ropes.h>
 135#include "iosapic_private.h"
 136
 137#define MODULE_NAME "iosapic"
 138
 139/* "local" compile flags */
 140#undef PCI_BRIDGE_FUNCS
 141#undef DEBUG_IOSAPIC
 142#undef DEBUG_IOSAPIC_IRT
 143
 144
 145#ifdef DEBUG_IOSAPIC
 146#define DBG(x...) printk(x)
 147#else /* DEBUG_IOSAPIC */
 148#define DBG(x...)
 149#endif /* DEBUG_IOSAPIC */
 150
 151#ifdef DEBUG_IOSAPIC_IRT
 152#define DBG_IRT(x...) printk(x)
 153#else
 154#define DBG_IRT(x...)
 155#endif
 156
 157#ifdef CONFIG_64BIT
 158#define COMPARE_IRTE_ADDR(irte, hpa)    ((irte)->dest_iosapic_addr == (hpa))
 159#else
 160#define COMPARE_IRTE_ADDR(irte, hpa)    \
 161                ((irte)->dest_iosapic_addr == ((hpa) | 0xffffffff00000000ULL))
 162#endif
 163
 164#define IOSAPIC_REG_SELECT              0x00
 165#define IOSAPIC_REG_WINDOW              0x10
 166#define IOSAPIC_REG_EOI                 0x40
 167
 168#define IOSAPIC_REG_VERSION             0x1
 169
 170#define IOSAPIC_IRDT_ENTRY(idx)         (0x10+(idx)*2)
 171#define IOSAPIC_IRDT_ENTRY_HI(idx)      (0x11+(idx)*2)
 172
 173static inline unsigned int iosapic_read(void __iomem *iosapic, unsigned int reg)
 174{
 175        writel(reg, iosapic + IOSAPIC_REG_SELECT);
 176        return readl(iosapic + IOSAPIC_REG_WINDOW);
 177}
 178
 179static inline void iosapic_write(void __iomem *iosapic, unsigned int reg, u32 val)
 180{
 181        writel(reg, iosapic + IOSAPIC_REG_SELECT);
 182        writel(val, iosapic + IOSAPIC_REG_WINDOW);
 183}
 184
 185#define IOSAPIC_VERSION_MASK    0x000000ff
 186#define IOSAPIC_VERSION(ver)    ((int) (ver & IOSAPIC_VERSION_MASK))
 187
 188#define IOSAPIC_MAX_ENTRY_MASK          0x00ff0000
 189#define IOSAPIC_MAX_ENTRY_SHIFT         0x10
 190#define IOSAPIC_IRDT_MAX_ENTRY(ver)     \
 191        (int) (((ver) & IOSAPIC_MAX_ENTRY_MASK) >> IOSAPIC_MAX_ENTRY_SHIFT)
 192
 193/* bits in the "low" I/O Sapic IRdT entry */
 194#define IOSAPIC_IRDT_ENABLE       0x10000
 195#define IOSAPIC_IRDT_PO_LOW       0x02000
 196#define IOSAPIC_IRDT_LEVEL_TRIG   0x08000
 197#define IOSAPIC_IRDT_MODE_LPRI    0x00100
 198
 199/* bits in the "high" I/O Sapic IRdT entry */
 200#define IOSAPIC_IRDT_ID_EID_SHIFT              0x10
 201
 202
 203static DEFINE_SPINLOCK(iosapic_lock);
 204
 205static inline void iosapic_eoi(void __iomem *addr, unsigned int data)
 206{
 207        __raw_writel(data, addr);
 208}
 209
 210/*
 211** REVISIT: future platforms may have more than one IRT.
 212** If so, the following three fields form a structure which
 213** then be linked into a list. Names are chosen to make searching
 214** for them easy - not necessarily accurate (eg "cell").
 215**
 216** Alternative: iosapic_info could point to the IRT it's in.
 217** iosapic_register() could search a list of IRT's.
 218*/
 219static struct irt_entry *irt_cell;
 220static size_t irt_num_entry;
 221
 222static struct irt_entry *iosapic_alloc_irt(int num_entries)
 223{
 224        unsigned long a;
 225
 226        /* The IRT needs to be 8-byte aligned for the PDC call. 
 227         * Normally kmalloc would guarantee larger alignment, but
 228         * if CONFIG_DEBUG_SLAB is enabled, then we can get only
 229         * 4-byte alignment on 32-bit kernels
 230         */
 231        a = (unsigned long)kmalloc(sizeof(struct irt_entry) * num_entries + 8, GFP_KERNEL);
 232        a = (a + 7UL) & ~7UL;
 233        return (struct irt_entry *)a;
 234}
 235
 236/**
 237 * iosapic_load_irt - Fill in the interrupt routing table
 238 * @cell_num: The cell number of the CPU we're currently executing on
 239 * @irt: The address to place the new IRT at
 240 * @return The number of entries found
 241 *
 242 * The "Get PCI INT Routing Table Size" option returns the number of 
 243 * entries in the PCI interrupt routing table for the cell specified 
 244 * in the cell_number argument.  The cell number must be for a cell 
 245 * within the caller's protection domain.
 246 *
 247 * The "Get PCI INT Routing Table" option returns, for the cell 
 248 * specified in the cell_number argument, the PCI interrupt routing 
 249 * table in the caller allocated memory pointed to by mem_addr.
 250 * We assume the IRT only contains entries for I/O SAPIC and
 251 * calculate the size based on the size of I/O sapic entries.
 252 *
 253 * The PCI interrupt routing table entry format is derived from the
 254 * IA64 SAL Specification 2.4.   The PCI interrupt routing table defines
 255 * the routing of PCI interrupt signals between the PCI device output
 256 * "pins" and the IO SAPICs' input "lines" (including core I/O PCI
 257 * devices).  This table does NOT include information for devices/slots
 258 * behind PCI to PCI bridges. See PCI to PCI Bridge Architecture Spec.
 259 * for the architected method of routing of IRQ's behind PPB's.
 260 */
 261
 262
 263static int __init
 264iosapic_load_irt(unsigned long cell_num, struct irt_entry **irt)
 265{
 266        long status;              /* PDC return value status */
 267        struct irt_entry *table;  /* start of interrupt routing tbl */
 268        unsigned long num_entries = 0UL;
 269
 270        BUG_ON(!irt);
 271
 272        if (is_pdc_pat()) {
 273                /* Use pat pdc routine to get interrupt routing table size */
 274                DBG("calling get_irt_size (cell %ld)\n", cell_num);
 275                status = pdc_pat_get_irt_size(&num_entries, cell_num);
 276                DBG("get_irt_size: %ld\n", status);
 277
 278                BUG_ON(status != PDC_OK);
 279                BUG_ON(num_entries == 0);
 280
 281                /*
 282                ** allocate memory for interrupt routing table
 283                ** This interface isn't really right. We are assuming
 284                ** the contents of the table are exclusively
 285                ** for I/O sapic devices.
 286                */
 287                table = iosapic_alloc_irt(num_entries);
 288                if (table == NULL) {
 289                        printk(KERN_WARNING MODULE_NAME ": read_irt : can "
 290                                        "not alloc mem for IRT\n");
 291                        return 0;
 292                }
 293
 294                /* get PCI INT routing table */
 295                status = pdc_pat_get_irt(table, cell_num);
 296                DBG("pdc_pat_get_irt: %ld\n", status);
 297                WARN_ON(status != PDC_OK);
 298        } else {
 299                /*
 300                ** C3000/J5000 (and similar) platforms with Sprockets PDC
 301                ** will return exactly one IRT for all iosapics.
 302                ** So if we have one, don't need to get it again.
 303                */
 304                if (irt_cell)
 305                        return 0;
 306
 307                /* Should be using the Elroy's HPA, but it's ignored anyway */
 308                status = pdc_pci_irt_size(&num_entries, 0);
 309                DBG("pdc_pci_irt_size: %ld\n", status);
 310
 311                if (status != PDC_OK) {
 312                        /* Not a "legacy" system with I/O SAPIC either */
 313                        return 0;
 314                }
 315
 316                BUG_ON(num_entries == 0);
 317
 318                table = iosapic_alloc_irt(num_entries);
 319                if (!table) {
 320                        printk(KERN_WARNING MODULE_NAME ": read_irt : can "
 321                                        "not alloc mem for IRT\n");
 322                        return 0;
 323                }
 324
 325                /* HPA ignored by this call too. */
 326                status = pdc_pci_irt(num_entries, 0, table);
 327                BUG_ON(status != PDC_OK);
 328        }
 329
 330        /* return interrupt table address */
 331        *irt = table;
 332
 333#ifdef DEBUG_IOSAPIC_IRT
 334{
 335        struct irt_entry *p = table;
 336        int i;
 337
 338        printk(MODULE_NAME " Interrupt Routing Table (cell %ld)\n", cell_num);
 339        printk(MODULE_NAME " start = 0x%p num_entries %ld entry_size %d\n",
 340                table,
 341                num_entries,
 342                (int) sizeof(struct irt_entry));
 343
 344        for (i = 0 ; i < num_entries ; i++, p++) {
 345                printk(MODULE_NAME " %02x %02x %02x %02x %02x %02x %02x %02x %08x%08x\n",
 346                p->entry_type, p->entry_length, p->interrupt_type,
 347                p->polarity_trigger, p->src_bus_irq_devno, p->src_bus_id,
 348                p->src_seg_id, p->dest_iosapic_intin,
 349                ((u32 *) p)[2],
 350                ((u32 *) p)[3]
 351                );
 352        }
 353}
 354#endif /* DEBUG_IOSAPIC_IRT */
 355
 356        return num_entries;
 357}
 358
 359
 360
 361void __init iosapic_init(void)
 362{
 363        unsigned long cell = 0;
 364
 365        DBG("iosapic_init()\n");
 366
 367#ifdef __LP64__
 368        if (is_pdc_pat()) {
 369                int status;
 370                struct pdc_pat_cell_num cell_info;
 371
 372                status = pdc_pat_cell_get_number(&cell_info);
 373                if (status == PDC_OK) {
 374                        cell = cell_info.cell_num;
 375                }
 376        }
 377#endif
 378
 379        /* get interrupt routing table for this cell */
 380        irt_num_entry = iosapic_load_irt(cell, &irt_cell);
 381        if (irt_num_entry == 0)
 382                irt_cell = NULL;        /* old PDC w/o iosapic */
 383}
 384
 385
 386/*
 387** Return the IRT entry in case we need to look something else up.
 388*/
 389static struct irt_entry *
 390irt_find_irqline(struct iosapic_info *isi, u8 slot, u8 intr_pin)
 391{
 392        struct irt_entry *i = irt_cell;
 393        int cnt;        /* track how many entries we've looked at */
 394        u8 irq_devno = (slot << IRT_DEV_SHIFT) | (intr_pin-1);
 395
 396        DBG_IRT("irt_find_irqline() SLOT %d pin %d\n", slot, intr_pin);
 397
 398        for (cnt=0; cnt < irt_num_entry; cnt++, i++) {
 399
 400                /*
 401                ** Validate: entry_type, entry_length, interrupt_type
 402                **
 403                ** Difference between validate vs compare is the former
 404                ** should print debug info and is not expected to "fail"
 405                ** on current platforms.
 406                */
 407                if (i->entry_type != IRT_IOSAPIC_TYPE) {
 408                        DBG_IRT(KERN_WARNING MODULE_NAME ":find_irqline(0x%p): skipping entry %d type %d\n", i, cnt, i->entry_type);
 409                        continue;
 410                }
 411                
 412                if (i->entry_length != IRT_IOSAPIC_LENGTH) {
 413                        DBG_IRT(KERN_WARNING MODULE_NAME ":find_irqline(0x%p): skipping entry %d  length %d\n", i, cnt, i->entry_length);
 414                        continue;
 415                }
 416
 417                if (i->interrupt_type != IRT_VECTORED_INTR) {
 418                        DBG_IRT(KERN_WARNING MODULE_NAME ":find_irqline(0x%p): skipping entry  %d interrupt_type %d\n", i, cnt, i->interrupt_type);
 419                        continue;
 420                }
 421
 422                if (!COMPARE_IRTE_ADDR(i, isi->isi_hpa))
 423                        continue;
 424
 425                if ((i->src_bus_irq_devno & IRT_IRQ_DEVNO_MASK) != irq_devno)
 426                        continue;
 427
 428                /*
 429                ** Ignore: src_bus_id and rc_seg_id correlate with
 430                **         iosapic_info->isi_hpa on HP platforms.
 431                **         If needed, pass in "PFA" (aka config space addr)
 432                **         instead of slot.
 433                */
 434
 435                /* Found it! */
 436                return i;
 437        }
 438
 439        printk(KERN_WARNING MODULE_NAME ": 0x%lx : no IRT entry for slot %d, pin %d\n",
 440                        isi->isi_hpa, slot, intr_pin);
 441        return NULL;
 442}
 443
 444
 445/*
 446** xlate_pin() supports the skewing of IRQ lines done by subsidiary bridges.
 447** Legacy PDC already does this translation for us and stores it in INTR_LINE.
 448**
 449** PAT PDC needs to basically do what legacy PDC does:
 450** o read PIN
 451** o adjust PIN in case device is "behind" a PPB
 452**     (eg 4-port 100BT and SCSI/LAN "Combo Card")
 453** o convert slot/pin to I/O SAPIC input line.
 454**
 455** HP platforms only support:
 456** o one level of skewing for any number of PPBs
 457** o only support PCI-PCI Bridges.
 458*/
 459static struct irt_entry *
 460iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev)
 461{
 462        u8 intr_pin, intr_slot;
 463
 464        pci_read_config_byte(pcidev, PCI_INTERRUPT_PIN, &intr_pin);
 465
 466        DBG_IRT("iosapic_xlate_pin(%s) SLOT %d pin %d\n",
 467                pcidev->slot_name, PCI_SLOT(pcidev->devfn), intr_pin);
 468
 469        if (intr_pin == 0) {
 470                /* The device does NOT support/use IRQ lines.  */
 471                return NULL;
 472        }
 473
 474        /* Check if pcidev behind a PPB */
 475        if (pcidev->bus->parent) {
 476                /* Convert pcidev INTR_PIN into something we
 477                ** can lookup in the IRT.
 478                */
 479#ifdef PCI_BRIDGE_FUNCS
 480                /*
 481                ** Proposal #1:
 482                **
 483                ** call implementation specific translation function
 484                ** This is architecturally "cleaner". HP-UX doesn't
 485                ** support other secondary bus types (eg. E/ISA) directly.
 486                ** May be needed for other processor (eg IA64) architectures
 487                ** or by some ambitous soul who wants to watch TV.
 488                */
 489                if (pci_bridge_funcs->xlate_intr_line) {
 490                        intr_pin = pci_bridge_funcs->xlate_intr_line(pcidev);
 491                }
 492#else   /* PCI_BRIDGE_FUNCS */
 493                struct pci_bus *p = pcidev->bus;
 494                /*
 495                ** Proposal #2:
 496                ** The "pin" is skewed ((pin + dev - 1) % 4).
 497                **
 498                ** This isn't very clean since I/O SAPIC must assume:
 499                **   - all platforms only have PCI busses.
 500                **   - only PCI-PCI bridge (eg not PCI-EISA, PCI-PCMCIA)
 501                **   - IRQ routing is only skewed once regardless of
 502                **     the number of PPB's between iosapic and device.
 503                **     (Bit3 expansion chassis follows this rule)
 504                **
 505                ** Advantage is it's really easy to implement.
 506                */
 507                intr_pin = pci_swizzle_interrupt_pin(pcidev, intr_pin);
 508#endif /* PCI_BRIDGE_FUNCS */
 509
 510                /*
 511                 * Locate the host slot of the PPB.
 512                 */
 513                while (p->parent->parent)
 514                        p = p->parent;
 515
 516                intr_slot = PCI_SLOT(p->self->devfn);
 517        } else {
 518                intr_slot = PCI_SLOT(pcidev->devfn);
 519        }
 520        DBG_IRT("iosapic_xlate_pin:  bus %d slot %d pin %d\n",
 521                        pcidev->bus->busn_res.start, intr_slot, intr_pin);
 522
 523        return irt_find_irqline(isi, intr_slot, intr_pin);
 524}
 525
 526static void iosapic_rd_irt_entry(struct vector_info *vi , u32 *dp0, u32 *dp1)
 527{
 528        struct iosapic_info *isp = vi->iosapic;
 529        u8 idx = vi->irqline;
 530
 531        *dp0 = iosapic_read(isp->addr, IOSAPIC_IRDT_ENTRY(idx));
 532        *dp1 = iosapic_read(isp->addr, IOSAPIC_IRDT_ENTRY_HI(idx));
 533}
 534
 535
 536static void iosapic_wr_irt_entry(struct vector_info *vi, u32 dp0, u32 dp1)
 537{
 538        struct iosapic_info *isp = vi->iosapic;
 539
 540        DBG_IRT("iosapic_wr_irt_entry(): irq %d hpa %lx 0x%x 0x%x\n",
 541                vi->irqline, isp->isi_hpa, dp0, dp1);
 542
 543        iosapic_write(isp->addr, IOSAPIC_IRDT_ENTRY(vi->irqline), dp0);
 544
 545        /* Read the window register to flush the writes down to HW  */
 546        dp0 = readl(isp->addr+IOSAPIC_REG_WINDOW);
 547
 548        iosapic_write(isp->addr, IOSAPIC_IRDT_ENTRY_HI(vi->irqline), dp1);
 549
 550        /* Read the window register to flush the writes down to HW  */
 551        dp1 = readl(isp->addr+IOSAPIC_REG_WINDOW);
 552}
 553
 554/*
 555** set_irt prepares the data (dp0, dp1) according to the vector_info
 556** and target cpu (id_eid).  dp0/dp1 are then used to program I/O SAPIC
 557** IRdT for the given "vector" (aka IRQ line).
 558*/
 559static void
 560iosapic_set_irt_data( struct vector_info *vi, u32 *dp0, u32 *dp1)
 561{
 562        u32 mode = 0;
 563        struct irt_entry *p = vi->irte;
 564
 565        if ((p->polarity_trigger & IRT_PO_MASK) == IRT_ACTIVE_LO)
 566                mode |= IOSAPIC_IRDT_PO_LOW;
 567
 568        if (((p->polarity_trigger >> IRT_EL_SHIFT) & IRT_EL_MASK) == IRT_LEVEL_TRIG)
 569                mode |= IOSAPIC_IRDT_LEVEL_TRIG;
 570
 571        /*
 572        ** IA64 REVISIT
 573        ** PA doesn't support EXTINT or LPRIO bits.
 574        */
 575
 576        *dp0 = mode | (u32) vi->txn_data;
 577
 578        /*
 579        ** Extracting id_eid isn't a real clean way of getting it.
 580        ** But the encoding is the same for both PA and IA64 platforms.
 581        */
 582        if (is_pdc_pat()) {
 583                /*
 584                ** PAT PDC just hands it to us "right".
 585                ** txn_addr comes from cpu_data[x].txn_addr.
 586                */
 587                *dp1 = (u32) (vi->txn_addr);
 588        } else {
 589                /* 
 590                ** eg if base_addr == 0xfffa0000),
 591                **    we want to get 0xa0ff0000.
 592                **
 593                ** eid  0x0ff00000 -> 0x00ff0000
 594                ** id   0x000ff000 -> 0xff000000
 595                */
 596                *dp1 = (((u32)vi->txn_addr & 0x0ff00000) >> 4) |
 597                        (((u32)vi->txn_addr & 0x000ff000) << 12);
 598        }
 599        DBG_IRT("iosapic_set_irt_data(): 0x%x 0x%x\n", *dp0, *dp1);
 600}
 601
 602
 603static void iosapic_mask_irq(struct irq_data *d)
 604{
 605        unsigned long flags;
 606        struct vector_info *vi = irq_data_get_irq_chip_data(d);
 607        u32 d0, d1;
 608
 609        spin_lock_irqsave(&iosapic_lock, flags);
 610        iosapic_rd_irt_entry(vi, &d0, &d1);
 611        d0 |= IOSAPIC_IRDT_ENABLE;
 612        iosapic_wr_irt_entry(vi, d0, d1);
 613        spin_unlock_irqrestore(&iosapic_lock, flags);
 614}
 615
 616static void iosapic_unmask_irq(struct irq_data *d)
 617{
 618        struct vector_info *vi = irq_data_get_irq_chip_data(d);
 619        u32 d0, d1;
 620
 621        /* data is initialized by fixup_irq */
 622        WARN_ON(vi->txn_irq  == 0);
 623
 624        iosapic_set_irt_data(vi, &d0, &d1);
 625        iosapic_wr_irt_entry(vi, d0, d1);
 626
 627#ifdef DEBUG_IOSAPIC_IRT
 628{
 629        u32 *t = (u32 *) ((ulong) vi->eoi_addr & ~0xffUL);
 630        printk("iosapic_enable_irq(): regs %p", vi->eoi_addr);
 631        for ( ; t < vi->eoi_addr; t++)
 632                printk(" %x", readl(t));
 633        printk("\n");
 634}
 635
 636printk("iosapic_enable_irq(): sel ");
 637{
 638        struct iosapic_info *isp = vi->iosapic;
 639
 640        for (d0=0x10; d0<0x1e; d0++) {
 641                d1 = iosapic_read(isp->addr, d0);
 642                printk(" %x", d1);
 643        }
 644}
 645printk("\n");
 646#endif
 647
 648        /*
 649         * Issuing I/O SAPIC an EOI causes an interrupt IFF IRQ line is
 650         * asserted.  IRQ generally should not be asserted when a driver
 651         * enables their IRQ. It can lead to "interesting" race conditions
 652         * in the driver initialization sequence.
 653         */
 654        DBG(KERN_DEBUG "enable_irq(%d): eoi(%p, 0x%x)\n", d->irq,
 655                        vi->eoi_addr, vi->eoi_data);
 656        iosapic_eoi(vi->eoi_addr, vi->eoi_data);
 657}
 658
 659static void iosapic_eoi_irq(struct irq_data *d)
 660{
 661        struct vector_info *vi = irq_data_get_irq_chip_data(d);
 662
 663        iosapic_eoi(vi->eoi_addr, vi->eoi_data);
 664        cpu_eoi_irq(d);
 665}
 666
 667#ifdef CONFIG_SMP
 668static int iosapic_set_affinity_irq(struct irq_data *d,
 669                                    const struct cpumask *dest, bool force)
 670{
 671        struct vector_info *vi = irq_data_get_irq_chip_data(d);
 672        u32 d0, d1, dummy_d0;
 673        unsigned long flags;
 674        int dest_cpu;
 675
 676        dest_cpu = cpu_check_affinity(d, dest);
 677        if (dest_cpu < 0)
 678                return -1;
 679
 680        cpumask_copy(irq_data_get_affinity_mask(d), cpumask_of(dest_cpu));
 681        vi->txn_addr = txn_affinity_addr(d->irq, dest_cpu);
 682
 683        spin_lock_irqsave(&iosapic_lock, flags);
 684        /* d1 contains the destination CPU, so only want to set that
 685         * entry */
 686        iosapic_rd_irt_entry(vi, &d0, &d1);
 687        iosapic_set_irt_data(vi, &dummy_d0, &d1);
 688        iosapic_wr_irt_entry(vi, d0, d1);
 689        spin_unlock_irqrestore(&iosapic_lock, flags);
 690
 691        return 0;
 692}
 693#endif
 694
 695static struct irq_chip iosapic_interrupt_type = {
 696        .name           =       "IO-SAPIC-level",
 697        .irq_unmask     =       iosapic_unmask_irq,
 698        .irq_mask       =       iosapic_mask_irq,
 699        .irq_ack        =       cpu_ack_irq,
 700        .irq_eoi        =       iosapic_eoi_irq,
 701#ifdef CONFIG_SMP
 702        .irq_set_affinity =     iosapic_set_affinity_irq,
 703#endif
 704};
 705
 706int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev)
 707{
 708        struct iosapic_info *isi = isi_obj;
 709        struct irt_entry *irte = NULL;  /* only used if PAT PDC */
 710        struct vector_info *vi;
 711        int isi_line;   /* line used by device */
 712
 713        if (!isi) {
 714                printk(KERN_WARNING MODULE_NAME ": hpa not registered for %s\n",
 715                        pci_name(pcidev));
 716                return -1;
 717        }
 718
 719#ifdef CONFIG_SUPERIO
 720        /*
 721         * HACK ALERT! (non-compliant PCI device support)
 722         *
 723         * All SuckyIO interrupts are routed through the PIC's on function 1.
 724         * But SuckyIO OHCI USB controller gets an IRT entry anyway because
 725         * it advertises INT D for INT_PIN.  Use that IRT entry to get the
 726         * SuckyIO interrupt routing for PICs on function 1 (*BLEECCHH*).
 727         */
 728        if (is_superio_device(pcidev)) {
 729                /* We must call superio_fixup_irq() to register the pdev */
 730                pcidev->irq = superio_fixup_irq(pcidev);
 731
 732                /* Don't return if need to program the IOSAPIC's IRT... */
 733                if (PCI_FUNC(pcidev->devfn) != SUPERIO_USB_FN)
 734                        return pcidev->irq;
 735        }
 736#endif /* CONFIG_SUPERIO */
 737
 738        /* lookup IRT entry for isi/slot/pin set */
 739        irte = iosapic_xlate_pin(isi, pcidev);
 740        if (!irte) {
 741                printk("iosapic: no IRTE for %s (IRQ not connected?)\n",
 742                                pci_name(pcidev));
 743                return -1;
 744        }
 745        DBG_IRT("iosapic_fixup_irq(): irte %p %x %x %x %x %x %x %x %x\n",
 746                irte,
 747                irte->entry_type,
 748                irte->entry_length,
 749                irte->polarity_trigger,
 750                irte->src_bus_irq_devno,
 751                irte->src_bus_id,
 752                irte->src_seg_id,
 753                irte->dest_iosapic_intin,
 754                (u32) irte->dest_iosapic_addr);
 755        isi_line = irte->dest_iosapic_intin;
 756
 757        /* get vector info for this input line */
 758        vi = isi->isi_vector + isi_line;
 759        DBG_IRT("iosapic_fixup_irq:  line %d vi 0x%p\n", isi_line, vi);
 760
 761        /* If this IRQ line has already been setup, skip it */
 762        if (vi->irte)
 763                goto out;
 764
 765        vi->irte = irte;
 766
 767        /*
 768         * Allocate processor IRQ
 769         *
 770         * XXX/FIXME The txn_alloc_irq() code and related code should be
 771         * moved to enable_irq(). That way we only allocate processor IRQ
 772         * bits for devices that actually have drivers claiming them.
 773         * Right now we assign an IRQ to every PCI device present,
 774         * regardless of whether it's used or not.
 775         */
 776        vi->txn_irq = txn_alloc_irq(8);
 777
 778        if (vi->txn_irq < 0)
 779                panic("I/O sapic: couldn't get TXN IRQ\n");
 780
 781        /* enable_irq() will use txn_* to program IRdT */
 782        vi->txn_addr = txn_alloc_addr(vi->txn_irq);
 783        vi->txn_data = txn_alloc_data(vi->txn_irq);
 784
 785        vi->eoi_addr = isi->addr + IOSAPIC_REG_EOI;
 786        vi->eoi_data = cpu_to_le32(vi->txn_data);
 787
 788        cpu_claim_irq(vi->txn_irq, &iosapic_interrupt_type, vi);
 789
 790 out:
 791        pcidev->irq = vi->txn_irq;
 792
 793        DBG_IRT("iosapic_fixup_irq() %d:%d %x %x line %d irq %d\n",
 794                PCI_SLOT(pcidev->devfn), PCI_FUNC(pcidev->devfn),
 795                pcidev->vendor, pcidev->device, isi_line, pcidev->irq);
 796
 797        return pcidev->irq;
 798}
 799
 800static struct iosapic_info *iosapic_list;
 801
 802#ifdef CONFIG_64BIT
 803int iosapic_serial_irq(struct parisc_device *dev)
 804{
 805        struct iosapic_info *isi;
 806        struct irt_entry *irte;
 807        struct vector_info *vi;
 808        int cnt;
 809        int intin;
 810
 811        intin = (dev->mod_info >> 24) & 15;
 812
 813        /* lookup IRT entry for isi/slot/pin set */
 814        for (cnt = 0; cnt < irt_num_entry; cnt++) {
 815                irte = &irt_cell[cnt];
 816                if (COMPARE_IRTE_ADDR(irte, dev->mod0) &&
 817                    irte->dest_iosapic_intin == intin)
 818                        break;
 819        }
 820        if (cnt >= irt_num_entry)
 821                return 0; /* no irq found, force polling */
 822
 823        DBG_IRT("iosapic_serial_irq(): irte %p %x %x %x %x %x %x %x %x\n",
 824                irte,
 825                irte->entry_type,
 826                irte->entry_length,
 827                irte->polarity_trigger,
 828                irte->src_bus_irq_devno,
 829                irte->src_bus_id,
 830                irte->src_seg_id,
 831                irte->dest_iosapic_intin,
 832                (u32) irte->dest_iosapic_addr);
 833
 834        /* search for iosapic */
 835        for (isi = iosapic_list; isi; isi = isi->isi_next)
 836                if (isi->isi_hpa == dev->mod0)
 837                        break;
 838        if (!isi)
 839                return 0; /* no iosapic found, force polling */
 840
 841        /* get vector info for this input line */
 842        vi = isi->isi_vector + intin;
 843        DBG_IRT("iosapic_serial_irq:  line %d vi 0x%p\n", iosapic_intin, vi);
 844
 845        /* If this IRQ line has already been setup, skip it */
 846        if (vi->irte)
 847                goto out;
 848
 849        vi->irte = irte;
 850
 851        /*
 852         * Allocate processor IRQ
 853         *
 854         * XXX/FIXME The txn_alloc_irq() code and related code should be
 855         * moved to enable_irq(). That way we only allocate processor IRQ
 856         * bits for devices that actually have drivers claiming them.
 857         * Right now we assign an IRQ to every PCI device present,
 858         * regardless of whether it's used or not.
 859         */
 860        vi->txn_irq = txn_alloc_irq(8);
 861
 862        if (vi->txn_irq < 0)
 863                panic("I/O sapic: couldn't get TXN IRQ\n");
 864
 865        /* enable_irq() will use txn_* to program IRdT */
 866        vi->txn_addr = txn_alloc_addr(vi->txn_irq);
 867        vi->txn_data = txn_alloc_data(vi->txn_irq);
 868
 869        vi->eoi_addr = isi->addr + IOSAPIC_REG_EOI;
 870        vi->eoi_data = cpu_to_le32(vi->txn_data);
 871
 872        cpu_claim_irq(vi->txn_irq, &iosapic_interrupt_type, vi);
 873
 874 out:
 875
 876        return vi->txn_irq;
 877}
 878#endif
 879
 880
 881/*
 882** squirrel away the I/O Sapic Version
 883*/
 884static unsigned int
 885iosapic_rd_version(struct iosapic_info *isi)
 886{
 887        return iosapic_read(isi->addr, IOSAPIC_REG_VERSION);
 888}
 889
 890
 891/*
 892** iosapic_register() is called by "drivers" with an integrated I/O SAPIC.
 893** Caller must be certain they have an I/O SAPIC and know its MMIO address.
 894**
 895**      o allocate iosapic_info and add it to the list
 896**      o read iosapic version and squirrel that away
 897**      o read size of IRdT.
 898**      o allocate and initialize isi_vector[]
 899**      o allocate irq region
 900*/
 901void *iosapic_register(unsigned long hpa)
 902{
 903        struct iosapic_info *isi = NULL;
 904        struct irt_entry *irte = irt_cell;
 905        struct vector_info *vip;
 906        int cnt;        /* track how many entries we've looked at */
 907
 908        /*
 909         * Astro based platforms can only support PCI OLARD if they implement
 910         * PAT PDC.  Legacy PDC omits LBAs with no PCI devices from the IRT.
 911         * Search the IRT and ignore iosapic's which aren't in the IRT.
 912         */
 913        for (cnt=0; cnt < irt_num_entry; cnt++, irte++) {
 914                WARN_ON(IRT_IOSAPIC_TYPE != irte->entry_type);
 915                if (COMPARE_IRTE_ADDR(irte, hpa))
 916                        break;
 917        }
 918
 919        if (cnt >= irt_num_entry) {
 920                DBG("iosapic_register() ignoring 0x%lx (NOT FOUND)\n", hpa);
 921                return NULL;
 922        }
 923
 924        isi = kzalloc(sizeof(struct iosapic_info), GFP_KERNEL);
 925        if (!isi) {
 926                BUG();
 927                return NULL;
 928        }
 929
 930        isi->addr = ioremap(hpa, 4096);
 931        isi->isi_hpa = hpa;
 932        isi->isi_version = iosapic_rd_version(isi);
 933        isi->isi_num_vectors = IOSAPIC_IRDT_MAX_ENTRY(isi->isi_version) + 1;
 934
 935        vip = isi->isi_vector = kcalloc(isi->isi_num_vectors,
 936                                        sizeof(struct vector_info), GFP_KERNEL);
 937        if (vip == NULL) {
 938                kfree(isi);
 939                return NULL;
 940        }
 941
 942        for (cnt=0; cnt < isi->isi_num_vectors; cnt++, vip++) {
 943                vip->irqline = (unsigned char) cnt;
 944                vip->iosapic = isi;
 945        }
 946        isi->isi_next = iosapic_list;
 947        iosapic_list = isi;
 948        return isi;
 949}
 950
 951
 952#ifdef DEBUG_IOSAPIC
 953
 954static void
 955iosapic_prt_irt(void *irt, long num_entry)
 956{
 957        unsigned int i, *irp = (unsigned int *) irt;
 958
 959
 960        printk(KERN_DEBUG MODULE_NAME ": Interrupt Routing Table (%lx entries)\n", num_entry);
 961
 962        for (i=0; i<num_entry; i++, irp += 4) {
 963                printk(KERN_DEBUG "%p : %2d %.8x %.8x %.8x %.8x\n",
 964                                        irp, i, irp[0], irp[1], irp[2], irp[3]);
 965        }
 966}
 967
 968
 969static void
 970iosapic_prt_vi(struct vector_info *vi)
 971{
 972        printk(KERN_DEBUG MODULE_NAME ": vector_info[%d] is at %p\n", vi->irqline, vi);
 973        printk(KERN_DEBUG "\t\tstatus:   %.4x\n", vi->status);
 974        printk(KERN_DEBUG "\t\ttxn_irq:  %d\n",  vi->txn_irq);
 975        printk(KERN_DEBUG "\t\ttxn_addr: %lx\n", vi->txn_addr);
 976        printk(KERN_DEBUG "\t\ttxn_data: %lx\n", vi->txn_data);
 977        printk(KERN_DEBUG "\t\teoi_addr: %p\n",  vi->eoi_addr);
 978        printk(KERN_DEBUG "\t\teoi_data: %x\n",  vi->eoi_data);
 979}
 980
 981
 982static void
 983iosapic_prt_isi(struct iosapic_info *isi)
 984{
 985        printk(KERN_DEBUG MODULE_NAME ": io_sapic_info at %p\n", isi);
 986        printk(KERN_DEBUG "\t\tisi_hpa:       %lx\n", isi->isi_hpa);
 987        printk(KERN_DEBUG "\t\tisi_status:    %x\n", isi->isi_status);
 988        printk(KERN_DEBUG "\t\tisi_version:   %x\n", isi->isi_version);
 989        printk(KERN_DEBUG "\t\tisi_vector:    %p\n", isi->isi_vector);
 990}
 991#endif /* DEBUG_IOSAPIC */
 992