Lines Matching +full:msi +full:- +full:available +full:- +full:ranges
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2018 - 2020 Microchip Corporation. All rights reserved.
18 #include <linux/msi.h>
21 #include <linux/pci-ecam.h>
26 #include "../pci-host-common.h"
27 #include "pcie-plda.h"
88 /* PCIe Config space MSI capability structure */
301 struct plda_msi *msi = &port->plda.msi; in mc_pcie_enable_msi() local
305 /* Fixup MSI enable flag */ in mc_pcie_enable_msi()
310 /* Fixup PCI MSI queue flags */ in mc_pcie_enable_msi()
315 /* Fixup MSI addr fields */ in mc_pcie_enable_msi()
316 writel_relaxed(lower_32_bits(msi->vector_phy), in mc_pcie_enable_msi()
318 writel_relaxed(upper_32_bits(msi->vector_phy), in mc_pcie_enable_msi()
329 u32 reg = readl_relaxed(port->ctrl_base_addr + PCIE_EVENT_INT); in pcie_events()
341 u32 reg = readl_relaxed(port->ctrl_base_addr + SEC_ERROR_INT); in sec_errors()
353 u32 reg = readl_relaxed(port->ctrl_base_addr + DED_ERROR_INT); in ded_errors()
365 u32 reg = readl_relaxed(port->bridge_base_addr + ISTATUS_LOCAL); in local_events()
391 struct device *dev = port->dev; in mc_event_handler()
394 data = irq_domain_get_irq_data(port->event_domain, irq); in mc_event_handler()
396 if (event_cause[data->hwirq].str) in mc_event_handler()
397 dev_err_ratelimited(dev, "%s\n", event_cause[data->hwirq].str); in mc_event_handler()
399 dev_err_ratelimited(dev, "bad event IRQ %ld\n", data->hwirq); in mc_event_handler()
408 u32 event = data->hwirq; in mc_ack_event_irq()
413 addr = mc_port->bridge_base_addr; in mc_ack_event_irq()
415 addr = mc_port->ctrl_base_addr; in mc_ack_event_irq()
428 u32 event = data->hwirq; in mc_mask_event_irq()
434 addr = mc_port->bridge_base_addr; in mc_mask_event_irq()
436 addr = mc_port->ctrl_base_addr; in mc_mask_event_irq()
448 raw_spin_lock(&port->lock); in mc_mask_event_irq()
456 raw_spin_unlock(&port->lock); in mc_mask_event_irq()
463 u32 event = data->hwirq; in mc_unmask_event_irq()
469 addr = mc_port->bridge_base_addr; in mc_unmask_event_irq()
471 addr = mc_port->ctrl_base_addr; in mc_unmask_event_irq()
485 raw_spin_lock(&port->lock); in mc_unmask_event_irq()
492 raw_spin_unlock(&port->lock); in mc_unmask_event_irq()
550 return devm_request_irq(plda->dev, event_irq, mc_event_handler, in mc_request_event_irq()
567 port->ctrl_base_addr + SEC_ERROR_INT); in mc_clear_secs()
568 writel_relaxed(0, port->ctrl_base_addr + SEC_ERROR_EVENT_CNT); in mc_clear_secs()
574 port->ctrl_base_addr + DED_ERROR_INT); in mc_clear_deds()
575 writel_relaxed(0, port->ctrl_base_addr + DED_ERROR_EVENT_CNT); in mc_clear_deds()
587 writel_relaxed(val, port->ctrl_base_addr + ECC_CONTROL); in mc_disable_interrupts()
591 port->ctrl_base_addr + SEC_ERROR_INT_MASK); in mc_disable_interrupts()
596 port->ctrl_base_addr + DED_ERROR_INT_MASK); in mc_disable_interrupts()
600 writel_relaxed(0, port->bridge_base_addr + IMASK_LOCAL); in mc_disable_interrupts()
601 writel_relaxed(GENMASK(31, 0), port->bridge_base_addr + ISTATUS_LOCAL); in mc_disable_interrupts()
602 writel_relaxed(GENMASK(31, 0), port->bridge_base_addr + ISTATUS_MSI); in mc_disable_interrupts()
611 writel_relaxed(val, port->ctrl_base_addr + PCIE_EVENT_INT); in mc_disable_interrupts()
614 writel_relaxed(0, port->bridge_base_addr + IMASK_HOST); in mc_disable_interrupts()
615 writel_relaxed(GENMASK(31, 0), port->bridge_base_addr + ISTATUS_HOST); in mc_disable_interrupts()
622 void __iomem *table_addr = port->bridge_base_addr + table_offset; in mc_pcie_setup_inbound_atr()
626 atr_sz = ilog2(size) - 1; in mc_pcie_setup_inbound_atr()
645 struct device *dev = &pdev->dev; in mc_pcie_setup_inbound_ranges()
646 struct device_node *dn = dev->of_node; in mc_pcie_setup_inbound_ranges()
652 * MPFS PCIe Root Port is 32-bit only, behind a Fabric Interface in mc_pcie_setup_inbound_ranges()
653 * Controller FPGA logic block which contains the AXI-S interface. in mc_pcie_setup_inbound_ranges()
661 * Configuration 2: for use with non-coherent designs; supports two in mc_pcie_setup_inbound_ranges()
665 * MSI space is allocated in the AXI-S range on MPFS. in mc_pcie_setup_inbound_ranges()
671 if (device_property_read_bool(dev, "dma-noncoherent")) { in mc_pcie_setup_inbound_ranges()
681 /* Find any DMA ranges */ in mc_pcie_setup_inbound_ranges()
683 /* No DMA range property - setup default */ in mc_pcie_setup_inbound_ranges()
690 dev_err(dev, "too many inbound ranges; %d available tables\n", in mc_pcie_setup_inbound_ranges()
692 return -EINVAL; in mc_pcie_setup_inbound_ranges()
705 struct device *dev = cfg->parent; in mc_platform_init()
711 plda_pcie_setup_window(port->bridge_base_addr, 0, cfg->res.start, in mc_platform_init()
712 cfg->res.start, in mc_platform_init()
713 resource_size(&cfg->res)); in mc_platform_init()
716 mc_pcie_enable_msi(port, cfg->win); in mc_platform_init()
718 /* Configure non-config space outbound ranges */ in mc_platform_init()
719 ret = plda_pcie_setup_iomems(bridge, &port->plda); in mc_platform_init()
727 port->plda.event_ops = &mc_event_ops; in mc_platform_init()
728 port->plda.event_irq_chip = &mc_event_irq_chip; in mc_platform_init()
729 port->plda.events_bitmap = GENMASK(NUM_EVENTS - 1, 0); in mc_platform_init()
732 ret = plda_init_interrupts(pdev, &port->plda, &mc_event); in mc_platform_init()
741 struct device *dev = &pdev->dev; in mc_host_probe()
749 return -ENOMEM; in mc_host_probe()
751 plda = &port->plda; in mc_host_probe()
752 plda->dev = dev; in mc_host_probe()
754 port->bridge_base_addr = devm_platform_ioremap_resource_byname(pdev, in mc_host_probe()
756 port->ctrl_base_addr = devm_platform_ioremap_resource_byname(pdev, in mc_host_probe()
758 if (!IS_ERR(port->bridge_base_addr) && !IS_ERR(port->ctrl_base_addr)) in mc_host_probe()
770 port->bridge_base_addr = apb_base_addr + MC_PCIE1_BRIDGE_ADDR; in mc_host_probe()
771 port->ctrl_base_addr = apb_base_addr + MC_PCIE1_CTRL_ADDR; in mc_host_probe()
776 plda->bridge_addr = port->bridge_base_addr; in mc_host_probe()
777 plda->num_events = NUM_EVENTS; in mc_host_probe()
779 /* Allow enabling MSI by disabling MSI-X */ in mc_host_probe()
780 val = readl(port->bridge_base_addr + PCIE_PCI_IRQ_DW0); in mc_host_probe()
782 writel(val, port->bridge_base_addr + PCIE_PCI_IRQ_DW0); in mc_host_probe()
785 val = readl(port->bridge_base_addr + PCIE_PCI_IRQ_DW0); in mc_host_probe()
789 plda->msi.num_vectors = 1 << val; in mc_host_probe()
792 plda->msi.vector_phy = readl_relaxed(port->bridge_base_addr + IMSI_ADDR); in mc_host_probe()
797 return -ENODEV; in mc_host_probe()
814 .compatible = "microchip,pcie-host-1.0",
825 .name = "microchip-pcie",