Lines Matching refs:pbm

15 	struct pci_pbm_info *pbm = msiq_cookie->pbm;  in sparc64_msiq_interrupt()  local
21 ops = pbm->msi_ops; in sparc64_msiq_interrupt()
23 err = ops->get_head(pbm, msiqid, &head); in sparc64_msiq_interrupt()
31 err = ops->dequeue_msi(pbm, msiqid, &head, &msi); in sparc64_msiq_interrupt()
35 irq = pbm->msi_irq_table[msi - pbm->msi_first]; in sparc64_msiq_interrupt()
46 err = ops->set_head(pbm, msiqid, head); in sparc64_msiq_interrupt()
73 static u32 pick_msiq(struct pci_pbm_info *pbm) in pick_msiq() argument
81 rotor = pbm->msiq_rotor; in pick_msiq()
82 ret = pbm->msiq_first + rotor; in pick_msiq()
84 if (++rotor >= pbm->msiq_num) in pick_msiq()
86 pbm->msiq_rotor = rotor; in pick_msiq()
94 static int alloc_msi(struct pci_pbm_info *pbm) in alloc_msi() argument
98 for (i = 0; i < pbm->msi_num; i++) { in alloc_msi()
99 if (!test_and_set_bit(i, pbm->msi_bitmap)) in alloc_msi()
100 return i + pbm->msi_first; in alloc_msi()
106 static void free_msi(struct pci_pbm_info *pbm, int msi_num) in free_msi() argument
108 msi_num -= pbm->msi_first; in free_msi()
109 clear_bit(msi_num, pbm->msi_bitmap); in free_msi()
125 struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; in sparc64_setup_msi_irq() local
126 const struct sparc64_msiq_ops *ops = pbm->msi_ops; in sparc64_setup_msi_irq()
139 err = alloc_msi(pbm); in sparc64_setup_msi_irq()
145 msiqid = pick_msiq(pbm); in sparc64_setup_msi_irq()
147 err = ops->msi_setup(pbm, msiqid, msi, in sparc64_setup_msi_irq()
152 pbm->msi_irq_table[msi - pbm->msi_first] = *irq_p; in sparc64_setup_msi_irq()
155 msg.address_hi = pbm->msi64_start >> 32; in sparc64_setup_msi_irq()
156 msg.address_lo = pbm->msi64_start & 0xffffffff; in sparc64_setup_msi_irq()
159 msg.address_lo = pbm->msi32_start; in sparc64_setup_msi_irq()
169 free_msi(pbm, msi); in sparc64_setup_msi_irq()
183 struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller; in sparc64_teardown_msi_irq() local
184 const struct sparc64_msiq_ops *ops = pbm->msi_ops; in sparc64_teardown_msi_irq()
188 for (i = 0; i < pbm->msi_num; i++) { in sparc64_teardown_msi_irq()
189 if (pbm->msi_irq_table[i] == irq) in sparc64_teardown_msi_irq()
192 if (i >= pbm->msi_num) { in sparc64_teardown_msi_irq()
194 pbm->name, irq); in sparc64_teardown_msi_irq()
198 msi_num = pbm->msi_first + i; in sparc64_teardown_msi_irq()
199 pbm->msi_irq_table[i] = ~0U; in sparc64_teardown_msi_irq()
201 err = ops->msi_teardown(pbm, msi_num); in sparc64_teardown_msi_irq()
205 pbm->name, msi_num, irq, err); in sparc64_teardown_msi_irq()
209 free_msi(pbm, msi_num); in sparc64_teardown_msi_irq()
215 static int msi_bitmap_alloc(struct pci_pbm_info *pbm) in msi_bitmap_alloc() argument
220 size = (pbm->msi_num + (bits_per_ulong - 1)) & ~(bits_per_ulong - 1); in msi_bitmap_alloc()
224 pbm->msi_bitmap = kzalloc(size, GFP_KERNEL); in msi_bitmap_alloc()
225 if (!pbm->msi_bitmap) in msi_bitmap_alloc()
231 static void msi_bitmap_free(struct pci_pbm_info *pbm) in msi_bitmap_free() argument
233 kfree(pbm->msi_bitmap); in msi_bitmap_free()
234 pbm->msi_bitmap = NULL; in msi_bitmap_free()
237 static int msi_table_alloc(struct pci_pbm_info *pbm) in msi_table_alloc() argument
241 size = pbm->msiq_num * sizeof(struct sparc64_msiq_cookie); in msi_table_alloc()
242 pbm->msiq_irq_cookies = kzalloc(size, GFP_KERNEL); in msi_table_alloc()
243 if (!pbm->msiq_irq_cookies) in msi_table_alloc()
246 for (i = 0; i < pbm->msiq_num; i++) { in msi_table_alloc()
249 p = &pbm->msiq_irq_cookies[i]; in msi_table_alloc()
250 p->pbm = pbm; in msi_table_alloc()
251 p->msiqid = pbm->msiq_first + i; in msi_table_alloc()
254 size = pbm->msi_num * sizeof(unsigned int); in msi_table_alloc()
255 pbm->msi_irq_table = kzalloc(size, GFP_KERNEL); in msi_table_alloc()
256 if (!pbm->msi_irq_table) { in msi_table_alloc()
257 kfree(pbm->msiq_irq_cookies); in msi_table_alloc()
258 pbm->msiq_irq_cookies = NULL; in msi_table_alloc()
265 static void msi_table_free(struct pci_pbm_info *pbm) in msi_table_free() argument
267 kfree(pbm->msiq_irq_cookies); in msi_table_free()
268 pbm->msiq_irq_cookies = NULL; in msi_table_free()
270 kfree(pbm->msi_irq_table); in msi_table_free()
271 pbm->msi_irq_table = NULL; in msi_table_free()
274 static int bringup_one_msi_queue(struct pci_pbm_info *pbm, in bringup_one_msi_queue() argument
279 int irq = ops->msiq_build_irq(pbm, msiqid, devino); in bringup_one_msi_queue()
285 nid = pbm->numa_node; in bringup_one_msi_queue()
294 &pbm->msiq_irq_cookies[msiqid - pbm->msiq_first]); in bringup_one_msi_queue()
301 static int sparc64_bringup_msi_queues(struct pci_pbm_info *pbm, in sparc64_bringup_msi_queues() argument
306 for (i = 0; i < pbm->msiq_num; i++) { in sparc64_bringup_msi_queues()
307 unsigned long msiqid = i + pbm->msiq_first; in sparc64_bringup_msi_queues()
308 unsigned long devino = i + pbm->msiq_first_devino; in sparc64_bringup_msi_queues()
311 err = bringup_one_msi_queue(pbm, ops, msiqid, devino); in sparc64_bringup_msi_queues()
319 void sparc64_pbm_msi_init(struct pci_pbm_info *pbm, in sparc64_pbm_msi_init() argument
325 val = of_get_property(pbm->op->dev.of_node, "#msi-eqs", &len); in sparc64_pbm_msi_init()
328 pbm->msiq_num = *val; in sparc64_pbm_msi_init()
329 if (pbm->msiq_num) { in sparc64_pbm_msi_init()
348 val = of_get_property(pbm->op->dev.of_node, "msi-eq-size", &len); in sparc64_pbm_msi_init()
352 pbm->msiq_ent_count = *val; in sparc64_pbm_msi_init()
354 mqp = of_get_property(pbm->op->dev.of_node, in sparc64_pbm_msi_init()
357 mqp = of_get_property(pbm->op->dev.of_node, in sparc64_pbm_msi_init()
362 pbm->msiq_first = mqp->first_msiq; in sparc64_pbm_msi_init()
363 pbm->msiq_first_devino = mqp->first_devino; in sparc64_pbm_msi_init()
365 val = of_get_property(pbm->op->dev.of_node, "#msi", &len); in sparc64_pbm_msi_init()
368 pbm->msi_num = *val; in sparc64_pbm_msi_init()
370 mrng = of_get_property(pbm->op->dev.of_node, "msi-ranges", &len); in sparc64_pbm_msi_init()
373 pbm->msi_first = mrng->first_msi; in sparc64_pbm_msi_init()
375 val = of_get_property(pbm->op->dev.of_node, "msi-data-mask", &len); in sparc64_pbm_msi_init()
378 pbm->msi_data_mask = *val; in sparc64_pbm_msi_init()
380 val = of_get_property(pbm->op->dev.of_node, "msix-data-width", &len); in sparc64_pbm_msi_init()
383 pbm->msix_data_width = *val; in sparc64_pbm_msi_init()
385 arng = of_get_property(pbm->op->dev.of_node, "msi-address-ranges", in sparc64_pbm_msi_init()
389 pbm->msi32_start = ((u64)arng->msi32_high << 32) | in sparc64_pbm_msi_init()
391 pbm->msi64_start = ((u64)arng->msi64_high << 32) | in sparc64_pbm_msi_init()
393 pbm->msi32_len = arng->msi32_len; in sparc64_pbm_msi_init()
394 pbm->msi64_len = arng->msi64_len; in sparc64_pbm_msi_init()
396 if (msi_bitmap_alloc(pbm)) in sparc64_pbm_msi_init()
399 if (msi_table_alloc(pbm)) { in sparc64_pbm_msi_init()
400 msi_bitmap_free(pbm); in sparc64_pbm_msi_init()
404 if (ops->msiq_alloc(pbm)) { in sparc64_pbm_msi_init()
405 msi_table_free(pbm); in sparc64_pbm_msi_init()
406 msi_bitmap_free(pbm); in sparc64_pbm_msi_init()
410 if (sparc64_bringup_msi_queues(pbm, ops)) { in sparc64_pbm_msi_init()
411 ops->msiq_free(pbm); in sparc64_pbm_msi_init()
412 msi_table_free(pbm); in sparc64_pbm_msi_init()
413 msi_bitmap_free(pbm); in sparc64_pbm_msi_init()
419 pbm->name, in sparc64_pbm_msi_init()
420 pbm->msiq_first, pbm->msiq_num, in sparc64_pbm_msi_init()
421 pbm->msiq_ent_count, in sparc64_pbm_msi_init()
422 pbm->msiq_first_devino); in sparc64_pbm_msi_init()
425 pbm->name, in sparc64_pbm_msi_init()
426 pbm->msi_first, pbm->msi_num, pbm->msi_data_mask, in sparc64_pbm_msi_init()
427 pbm->msix_data_width); in sparc64_pbm_msi_init()
430 pbm->name, in sparc64_pbm_msi_init()
431 pbm->msi32_start, pbm->msi32_len, in sparc64_pbm_msi_init()
432 pbm->msi64_start, pbm->msi64_len); in sparc64_pbm_msi_init()
434 pbm->name, in sparc64_pbm_msi_init()
435 __pa(pbm->msi_queues)); in sparc64_pbm_msi_init()
437 pbm->msi_ops = ops; in sparc64_pbm_msi_init()
438 pbm->setup_msi_irq = sparc64_setup_msi_irq; in sparc64_pbm_msi_init()
439 pbm->teardown_msi_irq = sparc64_teardown_msi_irq; in sparc64_pbm_msi_init()
444 pbm->msiq_num = 0; in sparc64_pbm_msi_init()
445 printk(KERN_INFO "%s: No MSI support.\n", pbm->name); in sparc64_pbm_msi_init()