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

// SPDX-License-Identifier: GPL-2.0+
/* Copyright (C) 2009 - 2019 Broadcom */

#include <linux/bitfield.h>
#include <linux/bitops.h>
#include <linux/clk.h>
#include <linux/compiler.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/ioport.h>
#include <linux/irqchip/chained_irq.h>
#include <linux/irqdomain.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/log2.h>
#include <linux/module.h>
#include <linux/msi.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/of_pci.h>
#include <linux/of_platform.h>
#include <linux/pci.h>
#include <linux/pci-ecam.h>
#include <linux/printk.h>
#include <linux/regulator/consumer.h>
#include <linux/reset.h>
#include <linux/sizes.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/types.h>

#include "../pci.h"

/* BRCM_PCIE_CAP_REGS - Offset for the mandatory capability config regs */
#define BRCM_PCIE_CAP_REGS

/* Broadcom STB PCIe Register Offsets */
#define PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1
#define PCIE_RC_CFG_VENDOR_VENDOR_SPECIFIC_REG1_ENDIAN_MODE_BAR2_MASK
#define PCIE_RC_CFG_VENDOR_SPCIFIC_REG1_LITTLE_ENDIAN

#define PCIE_RC_CFG_PRIV1_ID_VAL3
#define PCIE_RC_CFG_PRIV1_ID_VAL3_CLASS_CODE_MASK

#define PCIE_RC_CFG_PRIV1_LINK_CAPABILITY
#define PCIE_RC_CFG_PRIV1_LINK_CAPABILITY_ASPM_SUPPORT_MASK

#define PCIE_RC_CFG_PRIV1_ROOT_CAP
#define PCIE_RC_CFG_PRIV1_ROOT_CAP_L1SS_MODE_MASK

#define PCIE_RC_DL_MDIO_ADDR
#define PCIE_RC_DL_MDIO_WR_DATA
#define PCIE_RC_DL_MDIO_RD_DATA

#define PCIE_MISC_MISC_CTRL
#define PCIE_MISC_MISC_CTRL_PCIE_RCB_64B_MODE_MASK
#define PCIE_MISC_MISC_CTRL_PCIE_RCB_MPS_MODE_MASK
#define PCIE_MISC_MISC_CTRL_SCB_ACCESS_EN_MASK
#define PCIE_MISC_MISC_CTRL_CFG_READ_UR_MODE_MASK
#define PCIE_MISC_MISC_CTRL_MAX_BURST_SIZE_MASK

#define PCIE_MISC_MISC_CTRL_SCB0_SIZE_MASK
#define PCIE_MISC_MISC_CTRL_SCB1_SIZE_MASK
#define PCIE_MISC_MISC_CTRL_SCB2_SIZE_MASK
#define SCB_SIZE_MASK(x)

#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LO
#define PCIE_MEM_WIN0_LO(win)

#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_HI
#define PCIE_MEM_WIN0_HI(win)

#define PCIE_MISC_RC_BAR1_CONFIG_LO
#define PCIE_MISC_RC_BAR1_CONFIG_LO_SIZE_MASK

#define PCIE_MISC_RC_BAR2_CONFIG_LO
#define PCIE_MISC_RC_BAR2_CONFIG_LO_SIZE_MASK
#define PCIE_MISC_RC_BAR2_CONFIG_HI

#define PCIE_MISC_RC_BAR3_CONFIG_LO
#define PCIE_MISC_RC_BAR3_CONFIG_LO_SIZE_MASK

#define PCIE_MISC_MSI_BAR_CONFIG_LO
#define PCIE_MISC_MSI_BAR_CONFIG_HI

#define PCIE_MISC_MSI_DATA_CONFIG
#define PCIE_MISC_MSI_DATA_CONFIG_VAL_32
#define PCIE_MISC_MSI_DATA_CONFIG_VAL_8

#define PCIE_MISC_PCIE_CTRL
#define PCIE_MISC_PCIE_CTRL_PCIE_L23_REQUEST_MASK
#define PCIE_MISC_PCIE_CTRL_PCIE_PERSTB_MASK

#define PCIE_MISC_PCIE_STATUS
#define PCIE_MISC_PCIE_STATUS_PCIE_PORT_MASK
#define PCIE_MISC_PCIE_STATUS_PCIE_DL_ACTIVE_MASK
#define PCIE_MISC_PCIE_STATUS_PCIE_PHYLINKUP_MASK
#define PCIE_MISC_PCIE_STATUS_PCIE_LINK_IN_L23_MASK

#define PCIE_MISC_REVISION
#define BRCM_PCIE_HW_REV_33
#define BRCM_PCIE_HW_REV_3_20

#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT_LIMIT_MASK
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_LIMIT_BASE_MASK
#define PCIE_MEM_WIN0_BASE_LIMIT(win)

#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_HI
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_BASE_HI_BASE_MASK
#define PCIE_MEM_WIN0_BASE_HI(win)

#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI
#define PCIE_MISC_CPU_2_PCIE_MEM_WIN0_LIMIT_HI_LIMIT_MASK
#define PCIE_MEM_WIN0_LIMIT_HI(win)

#define PCIE_MISC_HARD_PCIE_HARD_DEBUG
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_CLKREQ_DEBUG_ENABLE_MASK
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_L1SS_ENABLE_MASK
#define PCIE_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK
#define PCIE_BMIPS_MISC_HARD_PCIE_HARD_DEBUG_SERDES_IDDQ_MASK
#define PCIE_CLKREQ_MASK

#define PCIE_INTR2_CPU_BASE
#define PCIE_MSI_INTR2_BASE
/* Offsets from PCIE_INTR2_CPU_BASE and PCIE_MSI_INTR2_BASE */
#define MSI_INT_STATUS
#define MSI_INT_CLR
#define MSI_INT_MASK_SET
#define MSI_INT_MASK_CLR

#define PCIE_EXT_CFG_DATA
#define PCIE_EXT_CFG_INDEX

#define PCIE_RGR1_SW_INIT_1_PERST_MASK
#define PCIE_RGR1_SW_INIT_1_PERST_SHIFT

#define RGR1_SW_INIT_1_INIT_GENERIC_MASK
#define RGR1_SW_INIT_1_INIT_GENERIC_SHIFT
#define RGR1_SW_INIT_1_INIT_7278_MASK
#define RGR1_SW_INIT_1_INIT_7278_SHIFT

/* PCIe parameters */
#define BRCM_NUM_PCIE_OUT_WINS
#define BRCM_INT_PCI_MSI_NR
#define BRCM_INT_PCI_MSI_LEGACY_NR
#define BRCM_INT_PCI_MSI_SHIFT
#define BRCM_INT_PCI_MSI_MASK
#define BRCM_INT_PCI_MSI_LEGACY_MASK

/* MSI target addresses */
#define BRCM_MSI_TARGET_ADDR_LT_4GB
#define BRCM_MSI_TARGET_ADDR_GT_4GB

/* MDIO registers */
#define MDIO_PORT0
#define MDIO_DATA_MASK
#define MDIO_PORT_MASK
#define MDIO_REGAD_MASK
#define MDIO_CMD_MASK
#define MDIO_CMD_READ
#define MDIO_CMD_WRITE
#define MDIO_DATA_DONE_MASK
#define MDIO_RD_DONE(x)
#define MDIO_WT_DONE(x)
#define SSC_REGS_ADDR
#define SET_ADDR_OFFSET
#define SSC_CNTL_OFFSET
#define SSC_CNTL_OVRD_EN_MASK
#define SSC_CNTL_OVRD_VAL_MASK
#define SSC_STATUS_OFFSET
#define SSC_STATUS_SSC_MASK
#define SSC_STATUS_PLL_LOCK_MASK
#define PCIE_BRCM_MAX_MEMC

#define IDX_ADDR(pcie)
#define DATA_ADDR(pcie)
#define PCIE_RGR1_SW_INIT_1(pcie)

/* Rescal registers */
#define PCIE_DVT_PMU_PCIE_PHY_CTRL
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_NFLDS
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_DIG_RESET_MASK
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_DIG_RESET_SHIFT
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_MASK
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_RESET_SHIFT
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_MASK
#define PCIE_DVT_PMU_PCIE_PHY_CTRL_DAST_PWRDN_SHIFT

/* Forward declarations */
struct brcm_pcie;

enum {};

enum {};

enum pcie_type {};

struct pcie_cfg_data {};

struct subdev_regulators {};

struct brcm_msi {};

/* Internal PCIe Host Controller Information.*/
struct brcm_pcie {};

static inline bool is_bmips(const struct brcm_pcie *pcie)
{}

/*
 * This is to convert the size of the inbound "BAR" region to the
 * non-linear values of PCIE_X_MISC_RC_BAR[123]_CONFIG_LO.SIZE
 */
static int brcm_pcie_encode_ibar_size(u64 size)
{}

static u32 brcm_pcie_mdio_form_pkt(int port, int regad, int cmd)
{}

/* negative return value indicates error */
static int brcm_pcie_mdio_read(void __iomem *base, u8 port, u8 regad, u32 *val)
{}

/* negative return value indicates error */
static int brcm_pcie_mdio_write(void __iomem *base, u8 port,
				u8 regad, u16 wrdata)
{}

/*
 * Configures device for Spread Spectrum Clocking (SSC) mode; a negative
 * return value indicates error.
 */
static int brcm_pcie_set_ssc(struct brcm_pcie *pcie)
{}

/* Limits operation to a specific generation (1, 2, or 3) */
static void brcm_pcie_set_gen(struct brcm_pcie *pcie, int gen)
{}

static void brcm_pcie_set_outbound_win(struct brcm_pcie *pcie,
				       unsigned int win, u64 cpu_addr,
				       u64 pcie_addr, u64 size)
{}

static struct irq_chip brcm_msi_irq_chip =;

static struct msi_domain_info brcm_msi_domain_info =;

static void brcm_pcie_msi_isr(struct irq_desc *desc)
{}

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

static int brcm_msi_set_affinity(struct irq_data *irq_data,
				 const struct cpumask *mask, bool force)
{}

static void brcm_msi_ack_irq(struct irq_data *data)
{}


static struct irq_chip brcm_msi_bottom_irq_chip =;

static int brcm_msi_alloc(struct brcm_msi *msi, unsigned int nr_irqs)
{}

static void brcm_msi_free(struct brcm_msi *msi, unsigned long hwirq,
			  unsigned int nr_irqs)
{}

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

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

static const struct irq_domain_ops msi_domain_ops =;

static int brcm_allocate_domains(struct brcm_msi *msi)
{}

static void brcm_free_domains(struct brcm_msi *msi)
{}

static void brcm_msi_remove(struct brcm_pcie *pcie)
{}

static void brcm_msi_set_regs(struct brcm_msi *msi)
{}

static int brcm_pcie_enable_msi(struct brcm_pcie *pcie)
{}

/* The controller is capable of serving in both RC and EP roles */
static bool brcm_pcie_rc_mode(struct brcm_pcie *pcie)
{}

static bool brcm_pcie_link_up(struct brcm_pcie *pcie)
{}

static void __iomem *brcm_pcie_map_bus(struct pci_bus *bus,
				       unsigned int devfn, int where)
{}

static void __iomem *brcm7425_pcie_map_bus(struct pci_bus *bus,
					   unsigned int devfn, int where)
{}

static void brcm_pcie_bridge_sw_init_set_generic(struct brcm_pcie *pcie, u32 val)
{}

static void brcm_pcie_bridge_sw_init_set_7278(struct brcm_pcie *pcie, u32 val)
{}

static void brcm_pcie_perst_set_4908(struct brcm_pcie *pcie, u32 val)
{}

static void brcm_pcie_perst_set_7278(struct brcm_pcie *pcie, u32 val)
{}

static void brcm_pcie_perst_set_generic(struct brcm_pcie *pcie, u32 val)
{}

static int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie,
							u64 *rc_bar2_size,
							u64 *rc_bar2_offset)
{}

static int brcm_pcie_setup(struct brcm_pcie *pcie)
{}

/*
 * This extends the timeout period for an access to an internal bus.  This
 * access timeout may occur during L1SS sleep periods, even without the
 * presence of a PCIe access.
 */
static void brcm_extend_rbus_timeout(struct brcm_pcie *pcie)
{}

static void brcm_config_clkreq(struct brcm_pcie *pcie)
{}

static int brcm_pcie_start_link(struct brcm_pcie *pcie)
{}

static const char * const supplies[] =;

static void *alloc_subdev_regulators(struct device *dev)
{}

static int brcm_pcie_add_bus(struct pci_bus *bus)
{}

static void brcm_pcie_remove_bus(struct pci_bus *bus)
{}

/* L23 is a low-power PCIe link state */
static void brcm_pcie_enter_l23(struct brcm_pcie *pcie)
{}

static int brcm_phy_cntl(struct brcm_pcie *pcie, const int start)
{}

static inline int brcm_phy_start(struct brcm_pcie *pcie)
{}

static inline int brcm_phy_stop(struct brcm_pcie *pcie)
{}

static void brcm_pcie_turn_off(struct brcm_pcie *pcie)
{}

static int pci_dev_may_wakeup(struct pci_dev *dev, void *data)
{}

static int brcm_pcie_suspend_noirq(struct device *dev)
{}

static int brcm_pcie_resume_noirq(struct device *dev)
{}

static void __brcm_pcie_remove(struct brcm_pcie *pcie)
{}

static void brcm_pcie_remove(struct platform_device *pdev)
{}

static const int pcie_offsets[] =;

static const int pcie_offsets_bmips_7425[] =;

static const struct pcie_cfg_data generic_cfg =;

static const struct pcie_cfg_data bcm7425_cfg =;

static const struct pcie_cfg_data bcm7435_cfg =;

static const struct pcie_cfg_data bcm4908_cfg =;

static const int pcie_offset_bcm7278[] =;

static const struct pcie_cfg_data bcm7278_cfg =;

static const struct pcie_cfg_data bcm2711_cfg =;

static const struct of_device_id brcm_pcie_match[] =;

static struct pci_ops brcm_pcie_ops =;

static struct pci_ops brcm7425_pcie_ops =;

static int brcm_pcie_probe(struct platform_device *pdev)
{}

MODULE_DEVICE_TABLE(of, brcm_pcie_match);

static const struct dev_pm_ops brcm_pcie_pm_ops =;

static struct platform_driver brcm_pcie_driver =;
module_platform_driver();

MODULE_LICENSE();
MODULE_DESCRIPTION();
MODULE_AUTHOR();