Lines Matching +full:ecam +full:- +full:based
1 // SPDX-License-Identifier: GPL-2.0+
5 * Copyright (c) 2012 - 2014 Xilinx, Inc.
7 * Based on the Tegra PCIe driver
89 /* ECAM definitions */
97 * struct xilinx_pcie_port - PCIe port information
120 return readl(port->reg_base + reg); in pcie_read()
125 writel(val, port->reg_base + reg); in pcie_write()
135 * xilinx_pcie_clear_err_interrupts - Clear Error Interrupts
140 struct device *dev = port->dev; in xilinx_pcie_clear_err_interrupts()
152 * xilinx_pcie_valid_device - Check if a valid device is present on bus
160 struct xilinx_pcie_port *port = bus->sysdata; in xilinx_pcie_valid_device()
174 * xilinx_pcie_map_bus - Get configuration base
185 struct xilinx_pcie_port *port = bus->sysdata; in xilinx_pcie_map_bus()
191 relbus = (bus->number << ECAM_BUS_NUM_SHIFT) | in xilinx_pcie_map_bus()
194 return port->reg_base + relbus + where; in xilinx_pcie_map_bus()
207 * xilinx_pcie_destroy_msi - Free MSI number
220 dev_err(port->dev, "Trying to free unused MSI#%d\n", irq); in xilinx_pcie_destroy_msi()
227 * xilinx_pcie_assign_msi - Allocate MSI number
239 return -ENOSPC; in xilinx_pcie_assign_msi()
245 * xilinx_msi_teardown_irq - Destroy the MSI
257 * xilinx_pcie_msi_setup_irq - Setup MSI request
268 struct xilinx_pcie_port *port = pdev->bus->sysdata; in xilinx_pcie_msi_setup_irq()
278 irq = irq_create_mapping(port->msi_domain, hwirq); in xilinx_pcie_msi_setup_irq()
280 return -EINVAL; in xilinx_pcie_msi_setup_irq()
284 msg_addr = virt_to_phys((void *)port->msi_pages); in xilinx_pcie_msi_setup_irq()
311 * xilinx_pcie_msi_map - Set the handler for the MSI and mark IRQ as valid
322 irq_set_chip_data(irq, domain->host_data); in xilinx_pcie_msi_map()
333 * xilinx_pcie_enable_msi - Enable MSI support
340 port->msi_pages = __get_free_pages(GFP_KERNEL, 0); in xilinx_pcie_enable_msi()
341 if (!port->msi_pages) in xilinx_pcie_enable_msi()
342 return -ENOMEM; in xilinx_pcie_enable_msi()
344 msg_addr = virt_to_phys((void *)port->msi_pages); in xilinx_pcie_enable_msi()
354 * xilinx_pcie_intx_map - Set the handler for the INTx and mark IRQ as valid
365 irq_set_chip_data(irq, domain->host_data); in xilinx_pcie_intx_map()
379 * xilinx_pcie_intr_handler - Interrupt Service Handler
388 struct device *dev = port->dev; in xilinx_pcie_intr_handler()
412 dev_warn(dev, "ECAM access timeout\n"); in xilinx_pcie_intr_handler()
445 val = irq_find_mapping(port->leg_domain, val); in xilinx_pcie_intr_handler()
493 * xilinx_pcie_init_irq_domain - Initialize IRQ domain
500 struct device *dev = port->dev; in xilinx_pcie_init_irq_domain()
501 struct device_node *node = dev->of_node; in xilinx_pcie_init_irq_domain()
509 return -ENODEV; in xilinx_pcie_init_irq_domain()
512 port->leg_domain = irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, in xilinx_pcie_init_irq_domain()
516 if (!port->leg_domain) { in xilinx_pcie_init_irq_domain()
518 return -ENODEV; in xilinx_pcie_init_irq_domain()
523 port->msi_domain = irq_domain_add_linear(node, in xilinx_pcie_init_irq_domain()
527 if (!port->msi_domain) { in xilinx_pcie_init_irq_domain()
529 return -ENODEV; in xilinx_pcie_init_irq_domain()
541 * xilinx_pcie_init_port - Initialize hardware
546 struct device *dev = port->dev; in xilinx_pcie_init_port()
572 * xilinx_pcie_parse_dt - Parse Device tree
579 struct device *dev = port->dev; in xilinx_pcie_parse_dt()
580 struct device_node *node = dev->of_node; in xilinx_pcie_parse_dt()
590 port->reg_base = devm_pci_remap_cfg_resource(dev, ®s); in xilinx_pcie_parse_dt()
591 if (IS_ERR(port->reg_base)) in xilinx_pcie_parse_dt()
592 return PTR_ERR(port->reg_base); in xilinx_pcie_parse_dt()
594 port->irq = irq_of_parse_and_map(node, 0); in xilinx_pcie_parse_dt()
595 err = devm_request_irq(dev, port->irq, xilinx_pcie_intr_handler, in xilinx_pcie_parse_dt()
597 "xilinx-pcie", port); in xilinx_pcie_parse_dt()
599 dev_err(dev, "unable to request irq %d\n", port->irq); in xilinx_pcie_parse_dt()
607 * xilinx_pcie_probe - Probe function
614 struct device *dev = &pdev->dev; in xilinx_pcie_probe()
619 if (!dev->of_node) in xilinx_pcie_probe()
620 return -ENODEV; in xilinx_pcie_probe()
624 return -ENODEV; in xilinx_pcie_probe()
628 port->dev = dev; in xilinx_pcie_probe()
644 bridge->sysdata = port; in xilinx_pcie_probe()
645 bridge->ops = &xilinx_pcie_ops; in xilinx_pcie_probe()
649 bridge->msi = &xilinx_pcie_msi_chip; in xilinx_pcie_probe()
655 { .compatible = "xlnx,axi-pcie-host-1.00.a", },
661 .name = "xilinx-pcie",