Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/pci: PCI adapter interrupts for MSI/MSI-X

Support PCI adapter interrupts using the Single-IRQ-mode. Single-IRQ-mode
disables an adapter IRQ automatically after delivering it until the SIC
instruction enables it again. This is used to reduce the number of IRQs
for streaming workloads.

Up to 64 MSI handlers can be registered per PCI function.
A hash table is used to map interrupt numbers to MSI descriptors.
The interrupt vector is scanned using the flogr instruction.
Only MSI/MSI-X interrupts are supported, no legacy INTs.

Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Jan Glauber and committed by
Martin Schwidefsky
9a4da8a5 e56e4e87

+683 -7
+22
arch/s390/include/asm/hw_irq.h
··· 1 + #ifndef _HW_IRQ_H 2 + #define _HW_IRQ_H 3 + 4 + #include <linux/msi.h> 5 + #include <linux/pci.h> 6 + 7 + static inline struct msi_desc *irq_get_msi_desc(unsigned int irq) 8 + { 9 + return __irq_get_msi_desc(irq); 10 + } 11 + 12 + /* Must be called with msi map lock held */ 13 + static inline int irq_set_msi_desc(unsigned int irq, struct msi_desc *msi) 14 + { 15 + if (!msi) 16 + return -EINVAL; 17 + 18 + msi->irq = irq; 19 + return 0; 20 + } 21 + 22 + #endif
+12
arch/s390/include/asm/irq.h
··· 33 33 IOINT_APB, 34 34 IOINT_ADM, 35 35 IOINT_CSC, 36 + IOINT_PCI, 37 + IOINT_MSI, 36 38 NMI_NMI, 37 39 NR_IRQS, 38 40 }; ··· 52 50 void service_subclass_irq_unregister(void); 53 51 void measurement_alert_subclass_register(void); 54 52 void measurement_alert_subclass_unregister(void); 53 + 54 + #ifdef CONFIG_LOCKDEP 55 + # define disable_irq_nosync_lockdep(irq) disable_irq_nosync(irq) 56 + # define disable_irq_nosync_lockdep_irqsave(irq, flags) \ 57 + disable_irq_nosync(irq) 58 + # define disable_irq_lockdep(irq) disable_irq(irq) 59 + # define enable_irq_lockdep(irq) enable_irq(irq) 60 + # define enable_irq_lockdep_irqrestore(irq, flags) \ 61 + enable_irq(irq) 62 + #endif 55 63 56 64 #endif /* _ASM_IRQ_H */
+1
arch/s390/include/asm/isc.h
··· 18 18 #define CHSC_SCH_ISC 7 /* CHSC subchannels */ 19 19 /* Adapter interrupts. */ 20 20 #define QDIO_AIRQ_ISC IO_SCH_ISC /* I/O subchannel in qdio mode */ 21 + #define PCI_ISC 2 /* PCI I/O subchannels */ 21 22 #define AP_ISC 6 /* adjunct processor (crypto) devices */ 22 23 23 24 /* Functions for registration of I/O interruption subclasses */
+27
arch/s390/include/asm/pci.h
··· 20 20 int pci_domain_nr(struct pci_bus *); 21 21 int pci_proc_domain(struct pci_bus *); 22 22 23 + /* MSI arch hooks */ 24 + #define arch_setup_msi_irqs arch_setup_msi_irqs 25 + #define arch_teardown_msi_irqs arch_teardown_msi_irqs 26 + 23 27 #define ZPCI_BUS_NR 0 /* default bus number */ 24 28 #define ZPCI_DEVFN 0 /* default device number */ 25 29 ··· 32 28 #define ZPCI_FC_ERROR 0x40 33 29 #define ZPCI_FC_BLOCKED 0x20 34 30 #define ZPCI_FC_DMA_ENABLED 0x10 31 + 32 + struct msi_map { 33 + unsigned long irq; 34 + struct msi_desc *msi; 35 + struct hlist_node msi_chain; 36 + }; 37 + 38 + #define ZPCI_NR_MSI_VECS 64 39 + #define ZPCI_MSI_MASK (ZPCI_NR_MSI_VECS - 1) 35 40 36 41 enum zpci_state { 37 42 ZPCI_FN_STATE_RESERVED, ··· 69 56 u8 pfgid; /* function group ID */ 70 57 u16 domain; 71 58 59 + /* IRQ stuff */ 60 + u64 msi_addr; /* MSI address */ 61 + struct zdev_irq_map *irq_map; 62 + struct msi_map *msi_map[ZPCI_NR_MSI_VECS]; 63 + unsigned int aisb; /* number of the summary bit */ 64 + 72 65 struct zpci_bar_struct bars[PCI_BAR_COUNT]; 73 66 74 67 enum pci_bus_speed max_bus_speed; ··· 101 82 int clp_add_pci_device(u32, u32, int); 102 83 int clp_enable_fh(struct zpci_dev *, u8); 103 84 int clp_disable_fh(struct zpci_dev *); 85 + 86 + /* MSI */ 87 + struct msi_desc *__irq_get_msi_desc(unsigned int); 88 + int zpci_msi_set_mask_bits(struct msi_desc *, u32, u32); 89 + int zpci_setup_msi_irq(struct zpci_dev *, struct msi_desc *, unsigned int, int); 90 + void zpci_teardown_msi_irq(struct zpci_dev *, struct msi_desc *); 91 + int zpci_msihash_init(void); 92 + void zpci_msihash_exit(void); 104 93 105 94 /* Helpers */ 106 95 struct zpci_dev *get_zdev(struct pci_dev *);
+2
arch/s390/kernel/irq.c
··· 58 58 [IOINT_APB] = {.name = "APB", .desc = "[I/O] AP Bus"}, 59 59 [IOINT_ADM] = {.name = "ADM", .desc = "[I/O] EADM Subchannel"}, 60 60 [IOINT_CSC] = {.name = "CSC", .desc = "[I/O] CHSC Subchannel"}, 61 + [IOINT_PCI] = {.name = "PCI", .desc = "[I/O] PCI Interrupt" }, 62 + [IOINT_MSI] = {.name = "MSI", .desc = "[I/O] MSI Interrupt" }, 61 63 [NMI_NMI] = {.name = "NMI", .desc = "[NMI] Machine Check"}, 62 64 }; 63 65
+1 -1
arch/s390/pci/Makefile
··· 2 2 # Makefile for the s390 PCI subsystem. 3 3 # 4 4 5 - obj-$(CONFIG_PCI) += pci.o pci_clp.o 5 + obj-$(CONFIG_PCI) += pci.o pci_clp.o pci_msi.o
+463 -1
arch/s390/pci/pci.c
··· 23 23 #include <linux/err.h> 24 24 #include <linux/export.h> 25 25 #include <linux/delay.h> 26 + #include <linux/irq.h> 27 + #include <linux/kernel_stat.h> 26 28 #include <linux/seq_file.h> 27 29 #include <linux/pci.h> 28 30 #include <linux/msi.h> 29 31 32 + #include <asm/isc.h> 33 + #include <asm/airq.h> 30 34 #include <asm/facility.h> 31 35 #include <asm/pci_insn.h> 32 36 #include <asm/pci_clp.h> 33 37 34 38 #define DEBUG /* enable pr_debug */ 35 39 40 + #define SIC_IRQ_MODE_ALL 0 41 + #define SIC_IRQ_MODE_SINGLE 1 42 + 36 43 #define ZPCI_NR_DMA_SPACES 1 44 + #define ZPCI_MSI_VEC_BITS 6 37 45 #define ZPCI_NR_DEVICES CONFIG_PCI_NR_FUNCTIONS 38 46 39 47 /* list of all detected zpci devices */ ··· 51 43 static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES); 52 44 static DEFINE_SPINLOCK(zpci_domain_lock); 53 45 46 + struct callback { 47 + irq_handler_t handler; 48 + void *data; 49 + }; 50 + 51 + struct zdev_irq_map { 52 + unsigned long aibv; /* AI bit vector */ 53 + int msi_vecs; /* consecutive MSI-vectors used */ 54 + int __unused; 55 + struct callback cb[ZPCI_NR_MSI_VECS]; /* callback handler array */ 56 + spinlock_t lock; /* protect callbacks against de-reg */ 57 + }; 58 + 59 + struct intr_bucket { 60 + /* amap of adapters, one bit per dev, corresponds to one irq nr */ 61 + unsigned long *alloc; 62 + /* AI summary bit, global page for all devices */ 63 + unsigned long *aisb; 64 + /* pointer to aibv and callback data in zdev */ 65 + struct zdev_irq_map *imap[ZPCI_NR_DEVICES]; 66 + /* protects the whole bucket struct */ 67 + spinlock_t lock; 68 + }; 69 + 70 + static struct intr_bucket *bucket; 71 + 72 + /* Adapter local summary indicator */ 73 + static u8 *zpci_irq_si; 74 + 75 + static atomic_t irq_retries = ATOMIC_INIT(0); 76 + 54 77 /* I/O Map */ 55 78 static DEFINE_SPINLOCK(zpci_iomap_lock); 56 79 static DECLARE_BITMAP(zpci_iomap, ZPCI_IOMAP_MAX_ENTRIES); 57 80 struct zpci_iomap_entry *zpci_iomap_start; 58 81 EXPORT_SYMBOL_GPL(zpci_iomap_start); 82 + 83 + /* highest irq summary bit */ 84 + static int __read_mostly aisb_max; 85 + 86 + static struct kmem_cache *zdev_irq_cache; 87 + 88 + static inline int irq_to_msi_nr(unsigned int irq) 89 + { 90 + return irq & ZPCI_MSI_MASK; 91 + } 92 + 93 + static inline int irq_to_dev_nr(unsigned int irq) 94 + { 95 + return irq >> ZPCI_MSI_VEC_BITS; 96 + } 97 + 98 + static inline struct zdev_irq_map *get_imap(unsigned int irq) 99 + { 100 + return bucket->imap[irq_to_dev_nr(irq)]; 101 + } 59 102 60 103 struct zpci_dev *get_zdev(struct pci_dev *pdev) 61 104 { ··· 179 120 return (cc) ? -EIO : 0; 180 121 } 181 122 123 + /* Modify PCI: Register adapter interruptions */ 124 + static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb, 125 + u64 aibv) 126 + { 127 + u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_REG_INT); 128 + struct zpci_fib *fib; 129 + int rc; 130 + 131 + fib = (void *) get_zeroed_page(GFP_KERNEL); 132 + if (!fib) 133 + return -ENOMEM; 134 + 135 + fib->isc = PCI_ISC; 136 + fib->noi = zdev->irq_map->msi_vecs; 137 + fib->sum = 1; /* enable summary notifications */ 138 + fib->aibv = aibv; 139 + fib->aibvo = 0; /* every function has its own page */ 140 + fib->aisb = (u64) bucket->aisb + aisb / 8; 141 + fib->aisbo = aisb & ZPCI_MSI_MASK; 142 + 143 + rc = mpcifc_instr(req, fib); 144 + pr_debug("%s mpcifc returned noi: %d\n", __func__, fib->noi); 145 + 146 + free_page((unsigned long) fib); 147 + return rc; 148 + } 149 + 150 + struct mod_pci_args { 151 + u64 base; 152 + u64 limit; 153 + u64 iota; 154 + }; 155 + 156 + static int mod_pci(struct zpci_dev *zdev, int fn, u8 dmaas, struct mod_pci_args *args) 157 + { 158 + u64 req = ZPCI_CREATE_REQ(zdev->fh, dmaas, fn); 159 + struct zpci_fib *fib; 160 + int rc; 161 + 162 + /* The FIB must be available even if it's not used */ 163 + fib = (void *) get_zeroed_page(GFP_KERNEL); 164 + if (!fib) 165 + return -ENOMEM; 166 + 167 + fib->pba = args->base; 168 + fib->pal = args->limit; 169 + fib->iota = args->iota; 170 + 171 + rc = mpcifc_instr(req, fib); 172 + free_page((unsigned long) fib); 173 + return rc; 174 + } 175 + 176 + /* Modify PCI: Unregister adapter interruptions */ 177 + static int zpci_unregister_airq(struct zpci_dev *zdev) 178 + { 179 + struct mod_pci_args args = { 0, 0, 0 }; 180 + 181 + return mod_pci(zdev, ZPCI_MOD_FC_DEREG_INT, 0, &args); 182 + } 183 + 182 184 #define ZPCI_PCIAS_CFGSPC 15 183 185 184 186 static int zpci_cfg_load(struct zpci_dev *zdev, int offset, u32 *val, u8 len) ··· 269 149 rc = pcistg_instr(data, req, offset); 270 150 return rc; 271 151 } 152 + 153 + void synchronize_irq(unsigned int irq) 154 + { 155 + /* 156 + * Not needed, the handler is protected by a lock and IRQs that occur 157 + * after the handler is deleted are just NOPs. 158 + */ 159 + } 160 + EXPORT_SYMBOL_GPL(synchronize_irq); 161 + 162 + void enable_irq(unsigned int irq) 163 + { 164 + struct msi_desc *msi = irq_get_msi_desc(irq); 165 + 166 + zpci_msi_set_mask_bits(msi, 1, 0); 167 + } 168 + EXPORT_SYMBOL_GPL(enable_irq); 169 + 170 + void disable_irq(unsigned int irq) 171 + { 172 + struct msi_desc *msi = irq_get_msi_desc(irq); 173 + 174 + zpci_msi_set_mask_bits(msi, 1, 1); 175 + } 176 + EXPORT_SYMBOL_GPL(disable_irq); 177 + 178 + void disable_irq_nosync(unsigned int irq) 179 + { 180 + disable_irq(irq); 181 + } 182 + EXPORT_SYMBOL_GPL(disable_irq_nosync); 183 + 184 + unsigned long probe_irq_on(void) 185 + { 186 + return 0; 187 + } 188 + EXPORT_SYMBOL_GPL(probe_irq_on); 189 + 190 + int probe_irq_off(unsigned long val) 191 + { 192 + return 0; 193 + } 194 + EXPORT_SYMBOL_GPL(probe_irq_off); 195 + 196 + unsigned int probe_irq_mask(unsigned long val) 197 + { 198 + return val; 199 + } 200 + EXPORT_SYMBOL_GPL(probe_irq_mask); 272 201 273 202 void __devinit pcibios_fixup_bus(struct pci_bus *bus) 274 203 { ··· 388 219 .write = pci_write, 389 220 }; 390 221 222 + /* store the last handled bit to implement fair scheduling of devices */ 223 + static DEFINE_PER_CPU(unsigned long, next_sbit); 224 + 225 + static void zpci_irq_handler(void *dont, void *need) 226 + { 227 + unsigned long sbit, mbit, last = 0, start = __get_cpu_var(next_sbit); 228 + int rescan = 0, max = aisb_max; 229 + struct zdev_irq_map *imap; 230 + 231 + kstat_cpu(smp_processor_id()).irqs[IOINT_PCI]++; 232 + sbit = start; 233 + 234 + scan: 235 + /* find summary_bit */ 236 + for_each_set_bit_left_cont(sbit, bucket->aisb, max) { 237 + clear_bit(63 - (sbit & 63), bucket->aisb + (sbit >> 6)); 238 + last = sbit; 239 + 240 + /* find vector bit */ 241 + imap = bucket->imap[sbit]; 242 + for_each_set_bit_left(mbit, &imap->aibv, imap->msi_vecs) { 243 + kstat_cpu(smp_processor_id()).irqs[IOINT_MSI]++; 244 + clear_bit(63 - mbit, &imap->aibv); 245 + 246 + spin_lock(&imap->lock); 247 + if (imap->cb[mbit].handler) 248 + imap->cb[mbit].handler(mbit, 249 + imap->cb[mbit].data); 250 + spin_unlock(&imap->lock); 251 + } 252 + } 253 + 254 + if (rescan) 255 + goto out; 256 + 257 + /* scan the skipped bits */ 258 + if (start > 0) { 259 + sbit = 0; 260 + max = start; 261 + start = 0; 262 + goto scan; 263 + } 264 + 265 + /* enable interrupts again */ 266 + sic_instr(SIC_IRQ_MODE_SINGLE, NULL, PCI_ISC); 267 + 268 + /* check again to not lose initiative */ 269 + rmb(); 270 + max = aisb_max; 271 + sbit = find_first_bit_left(bucket->aisb, max); 272 + if (sbit != max) { 273 + atomic_inc(&irq_retries); 274 + rescan++; 275 + goto scan; 276 + } 277 + out: 278 + /* store next device bit to scan */ 279 + __get_cpu_var(next_sbit) = (++last >= aisb_max) ? 0 : last; 280 + } 281 + 282 + /* msi_vecs - number of requested interrupts, 0 place function to error state */ 283 + static int zpci_setup_msi(struct pci_dev *pdev, int msi_vecs) 284 + { 285 + struct zpci_dev *zdev = get_zdev(pdev); 286 + unsigned int aisb, msi_nr; 287 + struct msi_desc *msi; 288 + int rc; 289 + 290 + /* store the number of used MSI vectors */ 291 + zdev->irq_map->msi_vecs = min(msi_vecs, ZPCI_NR_MSI_VECS); 292 + 293 + spin_lock(&bucket->lock); 294 + aisb = find_first_zero_bit(bucket->alloc, PAGE_SIZE); 295 + /* alloc map exhausted? */ 296 + if (aisb == PAGE_SIZE) { 297 + spin_unlock(&bucket->lock); 298 + return -EIO; 299 + } 300 + set_bit(aisb, bucket->alloc); 301 + spin_unlock(&bucket->lock); 302 + 303 + zdev->aisb = aisb; 304 + if (aisb + 1 > aisb_max) 305 + aisb_max = aisb + 1; 306 + 307 + /* wire up IRQ shortcut pointer */ 308 + bucket->imap[zdev->aisb] = zdev->irq_map; 309 + pr_debug("%s: imap[%u] linked to %p\n", __func__, zdev->aisb, zdev->irq_map); 310 + 311 + /* TODO: irq number 0 wont be found if we return less than requested MSIs. 312 + * ignore it for now and fix in common code. 313 + */ 314 + msi_nr = aisb << ZPCI_MSI_VEC_BITS; 315 + 316 + list_for_each_entry(msi, &pdev->msi_list, list) { 317 + rc = zpci_setup_msi_irq(zdev, msi, msi_nr, 318 + aisb << ZPCI_MSI_VEC_BITS); 319 + if (rc) 320 + return rc; 321 + msi_nr++; 322 + } 323 + 324 + rc = zpci_register_airq(zdev, aisb, (u64) &zdev->irq_map->aibv); 325 + if (rc) { 326 + clear_bit(aisb, bucket->alloc); 327 + dev_err(&pdev->dev, "register MSI failed with: %d\n", rc); 328 + return rc; 329 + } 330 + return (zdev->irq_map->msi_vecs == msi_vecs) ? 331 + 0 : zdev->irq_map->msi_vecs; 332 + } 333 + 334 + static void zpci_teardown_msi(struct pci_dev *pdev) 335 + { 336 + struct zpci_dev *zdev = get_zdev(pdev); 337 + struct msi_desc *msi; 338 + int aisb, rc; 339 + 340 + rc = zpci_unregister_airq(zdev); 341 + if (rc) { 342 + dev_err(&pdev->dev, "deregister MSI failed with: %d\n", rc); 343 + return; 344 + } 345 + 346 + msi = list_first_entry(&pdev->msi_list, struct msi_desc, list); 347 + aisb = irq_to_dev_nr(msi->irq); 348 + 349 + list_for_each_entry(msi, &pdev->msi_list, list) 350 + zpci_teardown_msi_irq(zdev, msi); 351 + 352 + clear_bit(aisb, bucket->alloc); 353 + if (aisb + 1 == aisb_max) 354 + aisb_max--; 355 + } 356 + 357 + int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) 358 + { 359 + pr_debug("%s: requesting %d MSI-X interrupts...", __func__, nvec); 360 + if (type != PCI_CAP_ID_MSIX && type != PCI_CAP_ID_MSI) 361 + return -EINVAL; 362 + return zpci_setup_msi(pdev, nvec); 363 + } 364 + 365 + void arch_teardown_msi_irqs(struct pci_dev *pdev) 366 + { 367 + pr_info("%s: on pdev: %p\n", __func__, pdev); 368 + zpci_teardown_msi(pdev); 369 + } 370 + 391 371 static void zpci_map_resources(struct zpci_dev *zdev) 392 372 { 393 373 struct pci_dev *pdev = zdev->pdev; ··· 575 257 zdev = kzalloc(sizeof(*zdev), GFP_KERNEL); 576 258 if (!zdev) 577 259 return ERR_PTR(-ENOMEM); 260 + 261 + /* Alloc aibv & callback space */ 262 + zdev->irq_map = kmem_cache_alloc(zdev_irq_cache, GFP_KERNEL); 263 + if (!zdev->irq_map) 264 + goto error; 265 + memset(zdev->irq_map, 0, sizeof(*zdev->irq_map)); 266 + WARN_ON((u64) zdev->irq_map & 0xff); 578 267 return zdev; 268 + 269 + error: 270 + kfree(zdev); 271 + return ERR_PTR(-ENOMEM); 579 272 } 580 273 581 274 void zpci_free_device(struct zpci_dev *zdev) 582 275 { 276 + kmem_cache_free(zdev_irq_cache, zdev->irq_map); 583 277 kfree(zdev); 584 278 } 585 279 ··· 648 318 { 649 319 zpci_remove_device(pdev); 650 320 pdev->sysdata = NULL; 321 + } 322 + 323 + int zpci_request_irq(unsigned int irq, irq_handler_t handler, void *data) 324 + { 325 + int msi_nr = irq_to_msi_nr(irq); 326 + struct zdev_irq_map *imap; 327 + struct msi_desc *msi; 328 + 329 + msi = irq_get_msi_desc(irq); 330 + if (!msi) 331 + return -EIO; 332 + 333 + imap = get_imap(irq); 334 + spin_lock_init(&imap->lock); 335 + 336 + pr_debug("%s: register handler for IRQ:MSI %d:%d\n", __func__, irq >> 6, msi_nr); 337 + imap->cb[msi_nr].handler = handler; 338 + imap->cb[msi_nr].data = data; 339 + 340 + /* 341 + * The generic MSI code returns with the interrupt disabled on the 342 + * card, using the MSI mask bits. Firmware doesn't appear to unmask 343 + * at that level, so we do it here by hand. 344 + */ 345 + zpci_msi_set_mask_bits(msi, 1, 0); 346 + return 0; 347 + } 348 + 349 + void zpci_free_irq(unsigned int irq) 350 + { 351 + struct zdev_irq_map *imap = get_imap(irq); 352 + int msi_nr = irq_to_msi_nr(irq); 353 + unsigned long flags; 354 + 355 + pr_debug("%s: for irq: %d\n", __func__, irq); 356 + 357 + spin_lock_irqsave(&imap->lock, flags); 358 + imap->cb[msi_nr].handler = NULL; 359 + imap->cb[msi_nr].data = NULL; 360 + spin_unlock_irqrestore(&imap->lock, flags); 361 + } 362 + 363 + int request_irq(unsigned int irq, irq_handler_t handler, 364 + unsigned long irqflags, const char *devname, void *dev_id) 365 + { 366 + pr_debug("%s: irq: %d handler: %p flags: %lx dev: %s\n", 367 + __func__, irq, handler, irqflags, devname); 368 + 369 + return zpci_request_irq(irq, handler, dev_id); 370 + } 371 + EXPORT_SYMBOL_GPL(request_irq); 372 + 373 + void free_irq(unsigned int irq, void *dev_id) 374 + { 375 + zpci_free_irq(irq); 376 + } 377 + EXPORT_SYMBOL_GPL(free_irq); 378 + 379 + static int __init zpci_irq_init(void) 380 + { 381 + int cpu, rc; 382 + 383 + bucket = kzalloc(sizeof(*bucket), GFP_KERNEL); 384 + if (!bucket) 385 + return -ENOMEM; 386 + 387 + bucket->aisb = (unsigned long *) get_zeroed_page(GFP_KERNEL); 388 + if (!bucket->aisb) { 389 + rc = -ENOMEM; 390 + goto out_aisb; 391 + } 392 + 393 + bucket->alloc = (unsigned long *) get_zeroed_page(GFP_KERNEL); 394 + if (!bucket->alloc) { 395 + rc = -ENOMEM; 396 + goto out_alloc; 397 + } 398 + 399 + isc_register(PCI_ISC); 400 + zpci_irq_si = s390_register_adapter_interrupt(&zpci_irq_handler, NULL, PCI_ISC); 401 + if (IS_ERR(zpci_irq_si)) { 402 + rc = PTR_ERR(zpci_irq_si); 403 + zpci_irq_si = NULL; 404 + goto out_ai; 405 + } 406 + 407 + for_each_online_cpu(cpu) 408 + per_cpu(next_sbit, cpu) = 0; 409 + 410 + spin_lock_init(&bucket->lock); 411 + /* set summary to 1 to be called every time for the ISC */ 412 + *zpci_irq_si = 1; 413 + sic_instr(SIC_IRQ_MODE_SINGLE, NULL, PCI_ISC); 414 + return 0; 415 + 416 + out_ai: 417 + isc_unregister(PCI_ISC); 418 + free_page((unsigned long) bucket->alloc); 419 + out_alloc: 420 + free_page((unsigned long) bucket->aisb); 421 + out_aisb: 422 + kfree(bucket); 423 + return rc; 424 + } 425 + 426 + static void zpci_irq_exit(void) 427 + { 428 + free_page((unsigned long) bucket->alloc); 429 + free_page((unsigned long) bucket->aisb); 430 + s390_unregister_adapter_interrupt(zpci_irq_si, PCI_ISC); 431 + isc_unregister(PCI_ISC); 432 + kfree(bucket); 651 433 } 652 434 653 435 static struct resource *zpci_alloc_bus_resource(unsigned long start, unsigned long size, ··· 965 523 966 524 static int zpci_mem_init(void) 967 525 { 526 + zdev_irq_cache = kmem_cache_create("PCI_IRQ_cache", sizeof(struct zdev_irq_map), 527 + L1_CACHE_BYTES, SLAB_HWCACHE_ALIGN, NULL); 528 + if (!zdev_irq_cache) 529 + goto error_zdev; 530 + 968 531 /* TODO: use realloc */ 969 532 zpci_iomap_start = kzalloc(ZPCI_IOMAP_MAX_ENTRIES * sizeof(*zpci_iomap_start), 970 533 GFP_KERNEL); 971 534 if (!zpci_iomap_start) 972 - goto error_zdev; 535 + goto error_iomap; 973 536 return 0; 974 537 538 + error_iomap: 539 + kmem_cache_destroy(zdev_irq_cache); 975 540 error_zdev: 976 541 return -ENOMEM; 977 542 } ··· 986 537 static void zpci_mem_exit(void) 987 538 { 988 539 kfree(zpci_iomap_start); 540 + kmem_cache_destroy(zdev_irq_cache); 989 541 } 990 542 991 543 unsigned int pci_probe = 1; ··· 1020 570 if (rc) 1021 571 goto out_mem; 1022 572 573 + rc = zpci_msihash_init(); 574 + if (rc) 575 + goto out_hash; 576 + 577 + rc = zpci_irq_init(); 578 + if (rc) 579 + goto out_irq; 580 + 1023 581 rc = clp_find_pci_devices(); 1024 582 if (rc) 1025 583 goto out_find; ··· 1036 578 return 0; 1037 579 1038 580 out_find: 581 + zpci_irq_exit(); 582 + out_irq: 583 + zpci_msihash_exit(); 584 + out_hash: 1039 585 zpci_mem_exit(); 1040 586 out_mem: 1041 587 return rc;
+3
arch/s390/pci/pci_clp.c
··· 48 48 static void clp_store_query_pci_fngrp(struct zpci_dev *zdev, 49 49 struct clp_rsp_query_pci_grp *response) 50 50 { 51 + zdev->msi_addr = response->msia; 52 + 53 + pr_debug("Supported number of MSI vectors: %u\n", response->noi); 51 54 switch (response->version) { 52 55 case 1: 53 56 zdev->max_bus_speed = PCIE_SPEED_5_0GT;
+141
arch/s390/pci/pci_msi.c
··· 1 + /* 2 + * Copyright IBM Corp. 2012 3 + * 4 + * Author(s): 5 + * Jan Glauber <jang@linux.vnet.ibm.com> 6 + */ 7 + 8 + #define COMPONENT "zPCI" 9 + #define pr_fmt(fmt) COMPONENT ": " fmt 10 + 11 + #include <linux/kernel.h> 12 + #include <linux/err.h> 13 + #include <linux/rculist.h> 14 + #include <linux/hash.h> 15 + #include <linux/pci.h> 16 + #include <linux/msi.h> 17 + #include <asm/hw_irq.h> 18 + 19 + /* mapping of irq numbers to msi_desc */ 20 + static struct hlist_head *msi_hash; 21 + static unsigned int msihash_shift = 6; 22 + #define msi_hashfn(nr) hash_long(nr, msihash_shift) 23 + 24 + static DEFINE_SPINLOCK(msi_map_lock); 25 + 26 + struct msi_desc *__irq_get_msi_desc(unsigned int irq) 27 + { 28 + struct hlist_node *entry; 29 + struct msi_map *map; 30 + 31 + hlist_for_each_entry_rcu(map, entry, 32 + &msi_hash[msi_hashfn(irq)], msi_chain) 33 + if (map->irq == irq) 34 + return map->msi; 35 + return NULL; 36 + } 37 + 38 + int zpci_msi_set_mask_bits(struct msi_desc *msi, u32 mask, u32 flag) 39 + { 40 + if (msi->msi_attrib.is_msix) { 41 + int offset = msi->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + 42 + PCI_MSIX_ENTRY_VECTOR_CTRL; 43 + msi->masked = readl(msi->mask_base + offset); 44 + writel(flag, msi->mask_base + offset); 45 + } else { 46 + if (msi->msi_attrib.maskbit) { 47 + int pos; 48 + u32 mask_bits; 49 + 50 + pos = (long) msi->mask_base; 51 + pci_read_config_dword(msi->dev, pos, &mask_bits); 52 + mask_bits &= ~(mask); 53 + mask_bits |= flag & mask; 54 + pci_write_config_dword(msi->dev, pos, mask_bits); 55 + } else { 56 + return 0; 57 + } 58 + } 59 + 60 + msi->msi_attrib.maskbit = !!flag; 61 + return 1; 62 + } 63 + 64 + int zpci_setup_msi_irq(struct zpci_dev *zdev, struct msi_desc *msi, 65 + unsigned int nr, int offset) 66 + { 67 + struct msi_map *map; 68 + struct msi_msg msg; 69 + int rc; 70 + 71 + map = kmalloc(sizeof(*map), GFP_KERNEL); 72 + if (map == NULL) 73 + return -ENOMEM; 74 + 75 + map->irq = nr; 76 + map->msi = msi; 77 + zdev->msi_map[nr & ZPCI_MSI_MASK] = map; 78 + 79 + pr_debug("%s hashing irq: %u to bucket nr: %llu\n", 80 + __func__, nr, msi_hashfn(nr)); 81 + hlist_add_head_rcu(&map->msi_chain, &msi_hash[msi_hashfn(nr)]); 82 + 83 + spin_lock(&msi_map_lock); 84 + rc = irq_set_msi_desc(nr, msi); 85 + if (rc) { 86 + spin_unlock(&msi_map_lock); 87 + hlist_del_rcu(&map->msi_chain); 88 + kfree(map); 89 + zdev->msi_map[nr & ZPCI_MSI_MASK] = NULL; 90 + return rc; 91 + } 92 + spin_unlock(&msi_map_lock); 93 + 94 + msg.data = nr - offset; 95 + msg.address_lo = zdev->msi_addr & 0xffffffff; 96 + msg.address_hi = zdev->msi_addr >> 32; 97 + write_msi_msg(nr, &msg); 98 + return 0; 99 + } 100 + 101 + void zpci_teardown_msi_irq(struct zpci_dev *zdev, struct msi_desc *msi) 102 + { 103 + int irq = msi->irq & ZPCI_MSI_MASK; 104 + struct msi_map *map; 105 + 106 + msi->msg.address_lo = 0; 107 + msi->msg.address_hi = 0; 108 + msi->msg.data = 0; 109 + msi->irq = 0; 110 + zpci_msi_set_mask_bits(msi, 1, 1); 111 + 112 + spin_lock(&msi_map_lock); 113 + map = zdev->msi_map[irq]; 114 + hlist_del_rcu(&map->msi_chain); 115 + kfree(map); 116 + zdev->msi_map[irq] = NULL; 117 + spin_unlock(&msi_map_lock); 118 + } 119 + 120 + /* 121 + * The msi hash table has 256 entries which is good for 4..20 122 + * devices (a typical device allocates 10 + CPUs MSI's). Maybe make 123 + * the hash table size adjustable later. 124 + */ 125 + int __init zpci_msihash_init(void) 126 + { 127 + unsigned int i; 128 + 129 + msi_hash = kmalloc(256 * sizeof(*msi_hash), GFP_KERNEL); 130 + if (!msi_hash) 131 + return -ENOMEM; 132 + 133 + for (i = 0; i < (1U << msihash_shift); i++) 134 + INIT_HLIST_HEAD(&msi_hash[i]); 135 + return 0; 136 + } 137 + 138 + void __init zpci_msihash_exit(void) 139 + { 140 + kfree(msi_hash); 141 + }
+6
drivers/pci/msi.c
··· 207 207 desc->masked = __msix_mask_irq(desc, flag); 208 208 } 209 209 210 + #ifdef CONFIG_GENERIC_HARDIRQS 211 + 210 212 static void msi_set_mask_bit(struct irq_data *data, u32 flag) 211 213 { 212 214 struct msi_desc *desc = irq_data_get_msi(data); ··· 231 229 { 232 230 msi_set_mask_bit(data, 0); 233 231 } 232 + 233 + #endif /* CONFIG_GENERIC_HARDIRQS */ 234 234 235 235 void __read_msi_msg(struct msi_desc *entry, struct msi_msg *msg) 236 236 { ··· 341 337 if (!entry->irq) 342 338 continue; 343 339 nvec = 1 << entry->msi_attrib.multiple; 340 + #ifdef CONFIG_GENERIC_HARDIRQS 344 341 for (i = 0; i < nvec; i++) 345 342 BUG_ON(irq_has_action(entry->irq + i)); 343 + #endif 346 344 } 347 345 348 346 arch_teardown_msi_irqs(dev);
+5 -5
include/linux/irq.h
··· 10 10 */ 11 11 12 12 #include <linux/smp.h> 13 - 14 - #ifndef CONFIG_S390 15 - 16 13 #include <linux/linkage.h> 17 14 #include <linux/cache.h> 18 15 #include <linux/spinlock.h> ··· 734 737 static inline void irq_gc_unlock(struct irq_chip_generic *gc) { } 735 738 #endif 736 739 737 - #endif /* CONFIG_GENERIC_HARDIRQS */ 740 + #else /* !CONFIG_GENERIC_HARDIRQS */ 738 741 739 - #endif /* !CONFIG_S390 */ 742 + extern struct msi_desc *irq_get_msi_desc(unsigned int irq); 743 + extern int irq_set_msi_desc(unsigned int irq, struct msi_desc *entry); 744 + 745 + #endif /* CONFIG_GENERIC_HARDIRQS */ 740 746 741 747 #endif /* _LINUX_IRQ_H */