diff options
author | Gustavo Pimentel <gustavo.pimentel@synopsys.com> | 2018-03-06 06:54:54 -0500 |
---|---|---|
committer | Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> | 2018-03-06 09:31:16 -0500 |
commit | 3f43ccc4ea1b912ff24679576b4278fafbb190b3 (patch) | |
tree | ec59e18820feb2466cc993fea613ac6aa9ddc15b | |
parent | 7c5925afbc58c6d6b384e1dc051bb992969bf787 (diff) |
PCI: dwc: Remove old MSI IRQs API
Remove the unused old MSI IRQs API from pcie-designware based on
struct msi_controller that should now be considered obsolete.
Signed-off-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tested-by: Niklas Cassel <niklas.cassel@axis.com>
Tested-by: Shawn Guo <shawn.guo@linaro.org>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
-rw-r--r-- | drivers/pci/dwc/pci-keystone-dw.c | 2 | ||||
-rw-r--r-- | drivers/pci/dwc/pci-keystone.h | 3 | ||||
-rw-r--r-- | drivers/pci/dwc/pci-layerscape.c | 3 | ||||
-rw-r--r-- | drivers/pci/dwc/pcie-designware-host.c | 190 | ||||
-rw-r--r-- | drivers/pci/dwc/pcie-designware.h | 2 |
5 files changed, 5 insertions, 195 deletions
diff --git a/drivers/pci/dwc/pci-keystone-dw.c b/drivers/pci/dwc/pci-keystone-dw.c index 86e613afb019..0682213328e9 100644 --- a/drivers/pci/dwc/pci-keystone-dw.c +++ b/drivers/pci/dwc/pci-keystone-dw.c | |||
@@ -157,7 +157,7 @@ void ks_dw_pcie_msi_clear_irq(struct pcie_port *pp, int irq) | |||
157 | BIT(bit_pos)); | 157 | BIT(bit_pos)); |
158 | } | 158 | } |
159 | 159 | ||
160 | int ks_dw_pcie_msi_host_init(struct pcie_port *pp, struct msi_controller *chip) | 160 | int ks_dw_pcie_msi_host_init(struct pcie_port *pp) |
161 | { | 161 | { |
162 | return dw_pcie_allocate_domains(pp); | 162 | return dw_pcie_allocate_domains(pp); |
163 | } | 163 | } |
diff --git a/drivers/pci/dwc/pci-keystone.h b/drivers/pci/dwc/pci-keystone.h index aa504483e83a..8a13da391543 100644 --- a/drivers/pci/dwc/pci-keystone.h +++ b/drivers/pci/dwc/pci-keystone.h | |||
@@ -53,6 +53,5 @@ void ks_dw_pcie_msi_irq_ack(int i, struct pcie_port *pp); | |||
53 | void ks_dw_pcie_msi_set_irq(struct pcie_port *pp, int irq); | 53 | void ks_dw_pcie_msi_set_irq(struct pcie_port *pp, int irq); |
54 | void ks_dw_pcie_msi_clear_irq(struct pcie_port *pp, int irq); | 54 | void ks_dw_pcie_msi_clear_irq(struct pcie_port *pp, int irq); |
55 | void ks_dw_pcie_v3_65_scan_bus(struct pcie_port *pp); | 55 | void ks_dw_pcie_v3_65_scan_bus(struct pcie_port *pp); |
56 | int ks_dw_pcie_msi_host_init(struct pcie_port *pp, | 56 | int ks_dw_pcie_msi_host_init(struct pcie_port *pp); |
57 | struct msi_controller *chip); | ||
58 | int ks_dw_pcie_link_up(struct dw_pcie *pci); | 57 | int ks_dw_pcie_link_up(struct dw_pcie *pci); |
diff --git a/drivers/pci/dwc/pci-layerscape.c b/drivers/pci/dwc/pci-layerscape.c index a7b4159631ae..3724d3ef7008 100644 --- a/drivers/pci/dwc/pci-layerscape.c +++ b/drivers/pci/dwc/pci-layerscape.c | |||
@@ -182,8 +182,7 @@ static int ls1021_pcie_host_init(struct pcie_port *pp) | |||
182 | return ls_pcie_host_init(pp); | 182 | return ls_pcie_host_init(pp); |
183 | } | 183 | } |
184 | 184 | ||
185 | static int ls_pcie_msi_host_init(struct pcie_port *pp, | 185 | static int ls_pcie_msi_host_init(struct pcie_port *pp) |
186 | struct msi_controller *chip) | ||
187 | { | 186 | { |
188 | struct dw_pcie *pci = to_dw_pcie_from_pp(pp); | 187 | struct dw_pcie *pci = to_dw_pcie_from_pp(pp); |
189 | struct device *dev = pci->dev; | 188 | struct device *dev = pci->dev; |
diff --git a/drivers/pci/dwc/pcie-designware-host.c b/drivers/pci/dwc/pcie-designware-host.c index a28c496f58ac..193a0fa7b709 100644 --- a/drivers/pci/dwc/pcie-designware-host.c +++ b/drivers/pci/dwc/pcie-designware-host.c | |||
@@ -43,14 +43,6 @@ static int dw_pcie_wr_own_conf(struct pcie_port *pp, int where, int size, | |||
43 | return dw_pcie_write(pci->dbi_base + where, size, val); | 43 | return dw_pcie_write(pci->dbi_base + where, size, val); |
44 | } | 44 | } |
45 | 45 | ||
46 | static struct irq_chip dw_msi_irq_chip = { | ||
47 | .name = "PCI-MSI", | ||
48 | .irq_enable = pci_msi_unmask_irq, | ||
49 | .irq_disable = pci_msi_mask_irq, | ||
50 | .irq_mask = pci_msi_mask_irq, | ||
51 | .irq_unmask = pci_msi_unmask_irq, | ||
52 | }; | ||
53 | |||
54 | static void dw_msi_ack_irq(struct irq_data *d) | 46 | static void dw_msi_ack_irq(struct irq_data *d) |
55 | { | 47 | { |
56 | irq_chip_ack_parent(d); | 48 | irq_chip_ack_parent(d); |
@@ -320,186 +312,6 @@ void dw_pcie_msi_init(struct pcie_port *pp) | |||
320 | upper_32_bits(msi_target)); | 312 | upper_32_bits(msi_target)); |
321 | } | 313 | } |
322 | 314 | ||
323 | static void dw_pcie_msi_clear_irq(struct pcie_port *pp, int irq) | ||
324 | { | ||
325 | unsigned int res, bit, ctrl; | ||
326 | |||
327 | ctrl = irq / 32; | ||
328 | res = ctrl * 12; | ||
329 | bit = irq % 32; | ||
330 | pp->irq_status[ctrl] &= ~(1 << bit); | ||
331 | dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4, | ||
332 | pp->irq_status[ctrl]); | ||
333 | } | ||
334 | |||
335 | static void clear_irq_range(struct pcie_port *pp, unsigned int irq_base, | ||
336 | unsigned int nvec, unsigned int pos) | ||
337 | { | ||
338 | unsigned int i; | ||
339 | |||
340 | for (i = 0; i < nvec; i++) { | ||
341 | irq_set_msi_desc_off(irq_base, i, NULL); | ||
342 | /* Disable corresponding interrupt on MSI controller */ | ||
343 | if (pp->ops->msi_clear_irq) | ||
344 | pp->ops->msi_clear_irq(pp, pos + i); | ||
345 | else | ||
346 | dw_pcie_msi_clear_irq(pp, pos + i); | ||
347 | } | ||
348 | |||
349 | bitmap_release_region(pp->msi_irq_in_use, pos, order_base_2(nvec)); | ||
350 | } | ||
351 | |||
352 | static void dw_pcie_msi_set_irq(struct pcie_port *pp, int irq) | ||
353 | { | ||
354 | unsigned int res, bit, ctrl; | ||
355 | |||
356 | ctrl = irq / 32; | ||
357 | res = ctrl * 12; | ||
358 | bit = irq % 32; | ||
359 | pp->irq_status[ctrl] |= 1 << bit; | ||
360 | dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_ENABLE + res, 4, | ||
361 | pp->irq_status[ctrl]); | ||
362 | } | ||
363 | |||
364 | static int assign_irq(int no_irqs, struct msi_desc *desc, int *pos) | ||
365 | { | ||
366 | int irq, pos0, i; | ||
367 | struct pcie_port *pp; | ||
368 | |||
369 | pp = (struct pcie_port *)msi_desc_to_pci_sysdata(desc); | ||
370 | pos0 = bitmap_find_free_region(pp->msi_irq_in_use, MAX_MSI_IRQS, | ||
371 | order_base_2(no_irqs)); | ||
372 | if (pos0 < 0) | ||
373 | goto no_valid_irq; | ||
374 | |||
375 | irq = irq_find_mapping(pp->irq_domain, pos0); | ||
376 | if (!irq) | ||
377 | goto no_valid_irq; | ||
378 | |||
379 | /* | ||
380 | * irq_create_mapping (called from dw_pcie_host_init) pre-allocates | ||
381 | * descs so there is no need to allocate descs here. We can therefore | ||
382 | * assume that if irq_find_mapping above returns non-zero, then the | ||
383 | * descs are also successfully allocated. | ||
384 | */ | ||
385 | |||
386 | for (i = 0; i < no_irqs; i++) { | ||
387 | if (irq_set_msi_desc_off(irq, i, desc) != 0) { | ||
388 | clear_irq_range(pp, irq, i, pos0); | ||
389 | goto no_valid_irq; | ||
390 | } | ||
391 | /*Enable corresponding interrupt in MSI interrupt controller */ | ||
392 | if (pp->ops->msi_set_irq) | ||
393 | pp->ops->msi_set_irq(pp, pos0 + i); | ||
394 | else | ||
395 | dw_pcie_msi_set_irq(pp, pos0 + i); | ||
396 | } | ||
397 | |||
398 | *pos = pos0; | ||
399 | desc->nvec_used = no_irqs; | ||
400 | desc->msi_attrib.multiple = order_base_2(no_irqs); | ||
401 | |||
402 | return irq; | ||
403 | |||
404 | no_valid_irq: | ||
405 | *pos = pos0; | ||
406 | return -ENOSPC; | ||
407 | } | ||
408 | |||
409 | static void dw_msi_setup_msg(struct pcie_port *pp, unsigned int irq, u32 pos) | ||
410 | { | ||
411 | struct msi_msg msg; | ||
412 | u64 msi_target; | ||
413 | |||
414 | if (pp->ops->get_msi_addr) | ||
415 | msi_target = pp->ops->get_msi_addr(pp); | ||
416 | else | ||
417 | msi_target = (u64)pp->msi_data; | ||
418 | |||
419 | msg.address_lo = (u32)(msi_target & 0xffffffff); | ||
420 | msg.address_hi = (u32)(msi_target >> 32 & 0xffffffff); | ||
421 | |||
422 | if (pp->ops->get_msi_data) | ||
423 | msg.data = pp->ops->get_msi_data(pp, pos); | ||
424 | else | ||
425 | msg.data = pos; | ||
426 | |||
427 | pci_write_msi_msg(irq, &msg); | ||
428 | } | ||
429 | |||
430 | static int dw_msi_setup_irq(struct msi_controller *chip, struct pci_dev *pdev, | ||
431 | struct msi_desc *desc) | ||
432 | { | ||
433 | int irq, pos; | ||
434 | struct pcie_port *pp = pdev->bus->sysdata; | ||
435 | |||
436 | if (desc->msi_attrib.is_msix) | ||
437 | return -EINVAL; | ||
438 | |||
439 | irq = assign_irq(1, desc, &pos); | ||
440 | if (irq < 0) | ||
441 | return irq; | ||
442 | |||
443 | dw_msi_setup_msg(pp, irq, pos); | ||
444 | |||
445 | return 0; | ||
446 | } | ||
447 | |||
448 | static int dw_msi_setup_irqs(struct msi_controller *chip, struct pci_dev *pdev, | ||
449 | int nvec, int type) | ||
450 | { | ||
451 | #ifdef CONFIG_PCI_MSI | ||
452 | int irq, pos; | ||
453 | struct msi_desc *desc; | ||
454 | struct pcie_port *pp = pdev->bus->sysdata; | ||
455 | |||
456 | /* MSI-X interrupts are not supported */ | ||
457 | if (type == PCI_CAP_ID_MSIX) | ||
458 | return -EINVAL; | ||
459 | |||
460 | WARN_ON(!list_is_singular(&pdev->dev.msi_list)); | ||
461 | desc = list_entry(pdev->dev.msi_list.next, struct msi_desc, list); | ||
462 | |||
463 | irq = assign_irq(nvec, desc, &pos); | ||
464 | if (irq < 0) | ||
465 | return irq; | ||
466 | |||
467 | dw_msi_setup_msg(pp, irq, pos); | ||
468 | |||
469 | return 0; | ||
470 | #else | ||
471 | return -EINVAL; | ||
472 | #endif | ||
473 | } | ||
474 | |||
475 | static void dw_msi_teardown_irq(struct msi_controller *chip, unsigned int irq) | ||
476 | { | ||
477 | struct irq_data *data = irq_get_irq_data(irq); | ||
478 | struct msi_desc *msi = irq_data_get_msi_desc(data); | ||
479 | struct pcie_port *pp = (struct pcie_port *)msi_desc_to_pci_sysdata(msi); | ||
480 | |||
481 | clear_irq_range(pp, irq, 1, data->hwirq); | ||
482 | } | ||
483 | |||
484 | static struct msi_controller dw_pcie_msi_chip = { | ||
485 | .setup_irq = dw_msi_setup_irq, | ||
486 | .setup_irqs = dw_msi_setup_irqs, | ||
487 | .teardown_irq = dw_msi_teardown_irq, | ||
488 | }; | ||
489 | |||
490 | static int dw_pcie_msi_map(struct irq_domain *domain, unsigned int irq, | ||
491 | irq_hw_number_t hwirq) | ||
492 | { | ||
493 | irq_set_chip_and_handler(irq, &dw_msi_irq_chip, handle_simple_irq); | ||
494 | irq_set_chip_data(irq, domain->host_data); | ||
495 | |||
496 | return 0; | ||
497 | } | ||
498 | |||
499 | static const struct irq_domain_ops msi_domain_ops = { | ||
500 | .map = dw_pcie_msi_map, | ||
501 | }; | ||
502 | |||
503 | int dw_pcie_host_init(struct pcie_port *pp) | 315 | int dw_pcie_host_init(struct pcie_port *pp) |
504 | { | 316 | { |
505 | struct dw_pcie *pci = to_dw_pcie_from_pp(pp); | 317 | struct dw_pcie *pci = to_dw_pcie_from_pp(pp); |
@@ -639,7 +451,7 @@ int dw_pcie_host_init(struct pcie_port *pp) | |||
639 | dw_chained_msi_isr, | 451 | dw_chained_msi_isr, |
640 | pp); | 452 | pp); |
641 | } else { | 453 | } else { |
642 | ret = pp->ops->msi_host_init(pp, &dw_pcie_msi_chip); | 454 | ret = pp->ops->msi_host_init(pp); |
643 | if (ret < 0) | 455 | if (ret < 0) |
644 | goto error; | 456 | goto error; |
645 | } | 457 | } |
diff --git a/drivers/pci/dwc/pcie-designware.h b/drivers/pci/dwc/pcie-designware.h index c80ee868e017..923f9565a385 100644 --- a/drivers/pci/dwc/pcie-designware.h +++ b/drivers/pci/dwc/pcie-designware.h | |||
@@ -151,7 +151,7 @@ struct dw_pcie_host_ops { | |||
151 | u32 (*get_msi_data)(struct pcie_port *pp, int pos); | 151 | u32 (*get_msi_data)(struct pcie_port *pp, int pos); |
152 | void (*scan_bus)(struct pcie_port *pp); | 152 | void (*scan_bus)(struct pcie_port *pp); |
153 | void (*set_num_vectors)(struct pcie_port *pp); | 153 | void (*set_num_vectors)(struct pcie_port *pp); |
154 | int (*msi_host_init)(struct pcie_port *pp, struct msi_controller *chip); | 154 | int (*msi_host_init)(struct pcie_port *pp); |
155 | void (*msi_irq_ack)(int irq, struct pcie_port *pp); | 155 | void (*msi_irq_ack)(int irq, struct pcie_port *pp); |
156 | }; | 156 | }; |
157 | 157 | ||