linux/drivers/pci/controller/pcie-xilinx.c

// SPDX-License-Identifier: GPL-2.0+
/*
 * PCIe host controller driver for Xilinx AXI PCIe Bridge
 *
 * Copyright (c) 2012 - 2014 Xilinx, Inc.
 *
 * Based on the Tegra PCIe driver
 *
 * Bits taken from Synopsys DesignWare Host controller driver and
 * ARM PCI Host generic driver.
 */

#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/irqdomain.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/msi.h>
#include <linux/of_address.h>
#include <linux/of_pci.h>
#include <linux/of_platform.h>
#include <linux/of_irq.h>
#include <linux/pci.h>
#include <linux/pci-ecam.h>
#include <linux/platform_device.h>

#include "../pci.h"

/* Register definitions */
#define XILINX_PCIE_REG_BIR
#define XILINX_PCIE_REG_IDR
#define XILINX_PCIE_REG_IMR
#define XILINX_PCIE_REG_PSCR
#define XILINX_PCIE_REG_RPSC
#define XILINX_PCIE_REG_MSIBASE1
#define XILINX_PCIE_REG_MSIBASE2
#define XILINX_PCIE_REG_RPEFR
#define XILINX_PCIE_REG_RPIFR1
#define XILINX_PCIE_REG_RPIFR2

/* Interrupt registers definitions */
#define XILINX_PCIE_INTR_LINK_DOWN
#define XILINX_PCIE_INTR_ECRC_ERR
#define XILINX_PCIE_INTR_STR_ERR
#define XILINX_PCIE_INTR_HOT_RESET
#define XILINX_PCIE_INTR_CFG_TIMEOUT
#define XILINX_PCIE_INTR_CORRECTABLE
#define XILINX_PCIE_INTR_NONFATAL
#define XILINX_PCIE_INTR_FATAL
#define XILINX_PCIE_INTR_INTX
#define XILINX_PCIE_INTR_MSI
#define XILINX_PCIE_INTR_SLV_UNSUPP
#define XILINX_PCIE_INTR_SLV_UNEXP
#define XILINX_PCIE_INTR_SLV_COMPL
#define XILINX_PCIE_INTR_SLV_ERRP
#define XILINX_PCIE_INTR_SLV_CMPABT
#define XILINX_PCIE_INTR_SLV_ILLBUR
#define XILINX_PCIE_INTR_MST_DECERR
#define XILINX_PCIE_INTR_MST_SLVERR
#define XILINX_PCIE_INTR_MST_ERRP
#define XILINX_PCIE_IMR_ALL_MASK
#define XILINX_PCIE_IMR_ENABLE_MASK
#define XILINX_PCIE_IDR_ALL_MASK

/* Root Port Error FIFO Read Register definitions */
#define XILINX_PCIE_RPEFR_ERR_VALID
#define XILINX_PCIE_RPEFR_REQ_ID
#define XILINX_PCIE_RPEFR_ALL_MASK

/* Root Port Interrupt FIFO Read Register 1 definitions */
#define XILINX_PCIE_RPIFR1_INTR_VALID
#define XILINX_PCIE_RPIFR1_MSI_INTR
#define XILINX_PCIE_RPIFR1_INTR_MASK
#define XILINX_PCIE_RPIFR1_ALL_MASK
#define XILINX_PCIE_RPIFR1_INTR_SHIFT

/* Bridge Info Register definitions */
#define XILINX_PCIE_BIR_ECAM_SZ_MASK
#define XILINX_PCIE_BIR_ECAM_SZ_SHIFT

/* Root Port Interrupt FIFO Read Register 2 definitions */
#define XILINX_PCIE_RPIFR2_MSG_DATA

/* Root Port Status/control Register definitions */
#define XILINX_PCIE_REG_RPSC_BEN

/* Phy Status/Control Register definitions */
#define XILINX_PCIE_REG_PSCR_LNKUP

/* Number of MSI IRQs */
#define XILINX_NUM_MSI_IRQS

/**
 * struct xilinx_pcie - PCIe port information
 * @dev: Device pointer
 * @reg_base: IO Mapped Register Base
 * @msi_map: Bitmap of allocated MSIs
 * @map_lock: Mutex protecting the MSI allocation
 * @msi_domain: MSI IRQ domain pointer
 * @leg_domain: Legacy IRQ domain pointer
 * @resources: Bus Resources
 */
struct xilinx_pcie {};

static inline u32 pcie_read(struct xilinx_pcie *pcie, u32 reg)
{}

static inline void pcie_write(struct xilinx_pcie *pcie, u32 val, u32 reg)
{}

static inline bool xilinx_pcie_link_up(struct xilinx_pcie *pcie)
{}

/**
 * xilinx_pcie_clear_err_interrupts - Clear Error Interrupts
 * @pcie: PCIe port information
 */
static void xilinx_pcie_clear_err_interrupts(struct xilinx_pcie *pcie)
{}

/**
 * xilinx_pcie_valid_device - Check if a valid device is present on bus
 * @bus: PCI Bus structure
 * @devfn: device/function
 *
 * Return: 'true' on success and 'false' if invalid device is found
 */
static bool xilinx_pcie_valid_device(struct pci_bus *bus, unsigned int devfn)
{}

/**
 * xilinx_pcie_map_bus - Get configuration base
 * @bus: PCI Bus structure
 * @devfn: Device/function
 * @where: Offset from base
 *
 * Return: Base address of the configuration space needed to be
 *	   accessed.
 */
static void __iomem *xilinx_pcie_map_bus(struct pci_bus *bus,
					 unsigned int devfn, int where)
{}

/* PCIe operations */
static struct pci_ops xilinx_pcie_ops =;

/* MSI functions */

static void xilinx_msi_top_irq_ack(struct irq_data *d)
{}

static struct irq_chip xilinx_msi_top_chip =;

static void xilinx_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
{}

static struct irq_chip xilinx_msi_bottom_chip =;

static int xilinx_msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
				  unsigned int nr_irqs, void *args)
{}

static void xilinx_msi_domain_free(struct irq_domain *domain, unsigned int virq,
				  unsigned int nr_irqs)
{}

static const struct irq_domain_ops xilinx_msi_domain_ops =;

static struct msi_domain_info xilinx_msi_info =;

static int xilinx_allocate_msi_domains(struct xilinx_pcie *pcie)
{}

static void xilinx_free_msi_domains(struct xilinx_pcie *pcie)
{}

/* INTx Functions */

/**
 * xilinx_pcie_intx_map - Set the handler for the INTx and mark IRQ as valid
 * @domain: IRQ domain
 * @irq: Virtual IRQ number
 * @hwirq: HW interrupt number
 *
 * Return: Always returns 0.
 */
static int xilinx_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
				irq_hw_number_t hwirq)
{}

/* INTx IRQ Domain operations */
static const struct irq_domain_ops intx_domain_ops =;

/* PCIe HW Functions */

/**
 * xilinx_pcie_intr_handler - Interrupt Service Handler
 * @irq: IRQ number
 * @data: PCIe port information
 *
 * Return: IRQ_HANDLED on success and IRQ_NONE on failure
 */
static irqreturn_t xilinx_pcie_intr_handler(int irq, void *data)
{}

/**
 * xilinx_pcie_init_irq_domain - Initialize IRQ domain
 * @pcie: PCIe port information
 *
 * Return: '0' on success and error value on failure
 */
static int xilinx_pcie_init_irq_domain(struct xilinx_pcie *pcie)
{}

/**
 * xilinx_pcie_init_port - Initialize hardware
 * @pcie: PCIe port information
 */
static void xilinx_pcie_init_port(struct xilinx_pcie *pcie)
{}

/**
 * xilinx_pcie_parse_dt - Parse Device tree
 * @pcie: PCIe port information
 *
 * Return: '0' on success and error value on failure
 */
static int xilinx_pcie_parse_dt(struct xilinx_pcie *pcie)
{}

/**
 * xilinx_pcie_probe - Probe function
 * @pdev: Platform device pointer
 *
 * Return: '0' on success and error value on failure
 */
static int xilinx_pcie_probe(struct platform_device *pdev)
{}

static const struct of_device_id xilinx_pcie_of_match[] =;

static struct platform_driver xilinx_pcie_driver =;
builtin_platform_driver();