iosapic.c 27 KB

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