cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pcie-designware.h (13906B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Synopsys DesignWare PCIe host controller driver
      4 *
      5 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
      6 *		https://www.samsung.com
      7 *
      8 * Author: Jingoo Han <jg1.han@samsung.com>
      9 */
     10
     11#ifndef _PCIE_DESIGNWARE_H
     12#define _PCIE_DESIGNWARE_H
     13
     14#include <linux/bitfield.h>
     15#include <linux/dma-mapping.h>
     16#include <linux/irq.h>
     17#include <linux/msi.h>
     18#include <linux/pci.h>
     19
     20#include <linux/pci-epc.h>
     21#include <linux/pci-epf.h>
     22
     23/* Parameters for the waiting for link up routine */
     24#define LINK_WAIT_MAX_RETRIES		10
     25#define LINK_WAIT_USLEEP_MIN		90000
     26#define LINK_WAIT_USLEEP_MAX		100000
     27
     28/* Parameters for the waiting for iATU enabled routine */
     29#define LINK_WAIT_MAX_IATU_RETRIES	5
     30#define LINK_WAIT_IATU			9
     31
     32/* Synopsys-specific PCIe configuration registers */
     33#define PCIE_PORT_AFR			0x70C
     34#define PORT_AFR_N_FTS_MASK		GENMASK(15, 8)
     35#define PORT_AFR_N_FTS(n)		FIELD_PREP(PORT_AFR_N_FTS_MASK, n)
     36#define PORT_AFR_CC_N_FTS_MASK		GENMASK(23, 16)
     37#define PORT_AFR_CC_N_FTS(n)		FIELD_PREP(PORT_AFR_CC_N_FTS_MASK, n)
     38#define PORT_AFR_ENTER_ASPM		BIT(30)
     39#define PORT_AFR_L0S_ENTRANCE_LAT_SHIFT	24
     40#define PORT_AFR_L0S_ENTRANCE_LAT_MASK	GENMASK(26, 24)
     41#define PORT_AFR_L1_ENTRANCE_LAT_SHIFT	27
     42#define PORT_AFR_L1_ENTRANCE_LAT_MASK	GENMASK(29, 27)
     43
     44#define PCIE_PORT_LINK_CONTROL		0x710
     45#define PORT_LINK_DLL_LINK_EN		BIT(5)
     46#define PORT_LINK_FAST_LINK_MODE	BIT(7)
     47#define PORT_LINK_MODE_MASK		GENMASK(21, 16)
     48#define PORT_LINK_MODE(n)		FIELD_PREP(PORT_LINK_MODE_MASK, n)
     49#define PORT_LINK_MODE_1_LANES		PORT_LINK_MODE(0x1)
     50#define PORT_LINK_MODE_2_LANES		PORT_LINK_MODE(0x3)
     51#define PORT_LINK_MODE_4_LANES		PORT_LINK_MODE(0x7)
     52#define PORT_LINK_MODE_8_LANES		PORT_LINK_MODE(0xf)
     53
     54#define PCIE_PORT_DEBUG0		0x728
     55#define PORT_LOGIC_LTSSM_STATE_MASK	0x1f
     56#define PORT_LOGIC_LTSSM_STATE_L0	0x11
     57#define PCIE_PORT_DEBUG1		0x72C
     58#define PCIE_PORT_DEBUG1_LINK_UP		BIT(4)
     59#define PCIE_PORT_DEBUG1_LINK_IN_TRAINING	BIT(29)
     60
     61#define PCIE_LINK_WIDTH_SPEED_CONTROL	0x80C
     62#define PORT_LOGIC_N_FTS_MASK		GENMASK(7, 0)
     63#define PORT_LOGIC_SPEED_CHANGE		BIT(17)
     64#define PORT_LOGIC_LINK_WIDTH_MASK	GENMASK(12, 8)
     65#define PORT_LOGIC_LINK_WIDTH(n)	FIELD_PREP(PORT_LOGIC_LINK_WIDTH_MASK, n)
     66#define PORT_LOGIC_LINK_WIDTH_1_LANES	PORT_LOGIC_LINK_WIDTH(0x1)
     67#define PORT_LOGIC_LINK_WIDTH_2_LANES	PORT_LOGIC_LINK_WIDTH(0x2)
     68#define PORT_LOGIC_LINK_WIDTH_4_LANES	PORT_LOGIC_LINK_WIDTH(0x4)
     69#define PORT_LOGIC_LINK_WIDTH_8_LANES	PORT_LOGIC_LINK_WIDTH(0x8)
     70
     71#define PCIE_MSI_ADDR_LO		0x820
     72#define PCIE_MSI_ADDR_HI		0x824
     73#define PCIE_MSI_INTR0_ENABLE		0x828
     74#define PCIE_MSI_INTR0_MASK		0x82C
     75#define PCIE_MSI_INTR0_STATUS		0x830
     76
     77#define PCIE_PORT_MULTI_LANE_CTRL	0x8C0
     78#define PORT_MLTI_UPCFG_SUPPORT		BIT(7)
     79
     80#define PCIE_ATU_VIEWPORT		0x900
     81#define PCIE_ATU_REGION_INBOUND		BIT(31)
     82#define PCIE_ATU_REGION_OUTBOUND	0
     83#define PCIE_ATU_CR1			0x904
     84#define PCIE_ATU_INCREASE_REGION_SIZE	BIT(13)
     85#define PCIE_ATU_TYPE_MEM		0x0
     86#define PCIE_ATU_TYPE_IO		0x2
     87#define PCIE_ATU_TYPE_CFG0		0x4
     88#define PCIE_ATU_TYPE_CFG1		0x5
     89#define PCIE_ATU_TD			BIT(8)
     90#define PCIE_ATU_FUNC_NUM(pf)           ((pf) << 20)
     91#define PCIE_ATU_CR2			0x908
     92#define PCIE_ATU_ENABLE			BIT(31)
     93#define PCIE_ATU_BAR_MODE_ENABLE	BIT(30)
     94#define PCIE_ATU_FUNC_NUM_MATCH_EN      BIT(19)
     95#define PCIE_ATU_LOWER_BASE		0x90C
     96#define PCIE_ATU_UPPER_BASE		0x910
     97#define PCIE_ATU_LIMIT			0x914
     98#define PCIE_ATU_LOWER_TARGET		0x918
     99#define PCIE_ATU_BUS(x)			FIELD_PREP(GENMASK(31, 24), x)
    100#define PCIE_ATU_DEV(x)			FIELD_PREP(GENMASK(23, 19), x)
    101#define PCIE_ATU_FUNC(x)		FIELD_PREP(GENMASK(18, 16), x)
    102#define PCIE_ATU_UPPER_TARGET		0x91C
    103#define PCIE_ATU_UPPER_LIMIT		0x924
    104
    105#define PCIE_MISC_CONTROL_1_OFF		0x8BC
    106#define PCIE_DBI_RO_WR_EN		BIT(0)
    107
    108#define PCIE_MSIX_DOORBELL		0x948
    109#define PCIE_MSIX_DOORBELL_PF_SHIFT	24
    110
    111#define PCIE_PL_CHK_REG_CONTROL_STATUS			0xB20
    112#define PCIE_PL_CHK_REG_CHK_REG_START			BIT(0)
    113#define PCIE_PL_CHK_REG_CHK_REG_CONTINUOUS		BIT(1)
    114#define PCIE_PL_CHK_REG_CHK_REG_COMPARISON_ERROR	BIT(16)
    115#define PCIE_PL_CHK_REG_CHK_REG_LOGIC_ERROR		BIT(17)
    116#define PCIE_PL_CHK_REG_CHK_REG_COMPLETE		BIT(18)
    117
    118#define PCIE_PL_CHK_REG_ERR_ADDR			0xB28
    119
    120/*
    121 * iATU Unroll-specific register definitions
    122 * From 4.80 core version the address translation will be made by unroll
    123 */
    124#define PCIE_ATU_UNR_REGION_CTRL1	0x00
    125#define PCIE_ATU_UNR_REGION_CTRL2	0x04
    126#define PCIE_ATU_UNR_LOWER_BASE		0x08
    127#define PCIE_ATU_UNR_UPPER_BASE		0x0C
    128#define PCIE_ATU_UNR_LOWER_LIMIT	0x10
    129#define PCIE_ATU_UNR_LOWER_TARGET	0x14
    130#define PCIE_ATU_UNR_UPPER_TARGET	0x18
    131#define PCIE_ATU_UNR_UPPER_LIMIT	0x20
    132
    133/*
    134 * The default address offset between dbi_base and atu_base. Root controller
    135 * drivers are not required to initialize atu_base if the offset matches this
    136 * default; the driver core automatically derives atu_base from dbi_base using
    137 * this offset, if atu_base not set.
    138 */
    139#define DEFAULT_DBI_ATU_OFFSET (0x3 << 20)
    140
    141/* Register address builder */
    142#define PCIE_GET_ATU_OUTB_UNR_REG_OFFSET(region) \
    143		((region) << 9)
    144
    145#define PCIE_GET_ATU_INB_UNR_REG_OFFSET(region) \
    146		(((region) << 9) | BIT(8))
    147
    148#define MAX_MSI_IRQS			256
    149#define MAX_MSI_IRQS_PER_CTRL		32
    150#define MAX_MSI_CTRLS			(MAX_MSI_IRQS / MAX_MSI_IRQS_PER_CTRL)
    151#define MSI_REG_CTRL_BLOCK_SIZE		12
    152#define MSI_DEF_NUM_VECTORS		32
    153
    154/* Maximum number of inbound/outbound iATUs */
    155#define MAX_IATU_IN			256
    156#define MAX_IATU_OUT			256
    157
    158struct pcie_port;
    159struct dw_pcie;
    160struct dw_pcie_ep;
    161
    162enum dw_pcie_region_type {
    163	DW_PCIE_REGION_UNKNOWN,
    164	DW_PCIE_REGION_INBOUND,
    165	DW_PCIE_REGION_OUTBOUND,
    166};
    167
    168enum dw_pcie_device_mode {
    169	DW_PCIE_UNKNOWN_TYPE,
    170	DW_PCIE_EP_TYPE,
    171	DW_PCIE_LEG_EP_TYPE,
    172	DW_PCIE_RC_TYPE,
    173};
    174
    175struct dw_pcie_host_ops {
    176	int (*host_init)(struct pcie_port *pp);
    177	int (*msi_host_init)(struct pcie_port *pp);
    178};
    179
    180struct pcie_port {
    181	bool			has_msi_ctrl:1;
    182	u64			cfg0_base;
    183	void __iomem		*va_cfg0_base;
    184	u32			cfg0_size;
    185	resource_size_t		io_base;
    186	phys_addr_t		io_bus_addr;
    187	u32			io_size;
    188	int			irq;
    189	const struct dw_pcie_host_ops *ops;
    190	int			msi_irq;
    191	struct irq_domain	*irq_domain;
    192	struct irq_domain	*msi_domain;
    193	u16			msi_msg;
    194	dma_addr_t		msi_data;
    195	struct irq_chip		*msi_irq_chip;
    196	u32			num_vectors;
    197	u32			irq_mask[MAX_MSI_CTRLS];
    198	struct pci_host_bridge  *bridge;
    199	raw_spinlock_t		lock;
    200	DECLARE_BITMAP(msi_irq_in_use, MAX_MSI_IRQS);
    201};
    202
    203enum dw_pcie_as_type {
    204	DW_PCIE_AS_UNKNOWN,
    205	DW_PCIE_AS_MEM,
    206	DW_PCIE_AS_IO,
    207};
    208
    209struct dw_pcie_ep_ops {
    210	void	(*ep_init)(struct dw_pcie_ep *ep);
    211	int	(*raise_irq)(struct dw_pcie_ep *ep, u8 func_no,
    212			     enum pci_epc_irq_type type, u16 interrupt_num);
    213	const struct pci_epc_features* (*get_features)(struct dw_pcie_ep *ep);
    214	/*
    215	 * Provide a method to implement the different func config space
    216	 * access for different platform, if different func have different
    217	 * offset, return the offset of func. if use write a register way
    218	 * return a 0, and implement code in callback function of platform
    219	 * driver.
    220	 */
    221	unsigned int (*func_conf_select)(struct dw_pcie_ep *ep, u8 func_no);
    222};
    223
    224struct dw_pcie_ep_func {
    225	struct list_head	list;
    226	u8			func_no;
    227	u8			msi_cap;	/* MSI capability offset */
    228	u8			msix_cap;	/* MSI-X capability offset */
    229};
    230
    231struct dw_pcie_ep {
    232	struct pci_epc		*epc;
    233	struct list_head	func_list;
    234	const struct dw_pcie_ep_ops *ops;
    235	phys_addr_t		phys_base;
    236	size_t			addr_size;
    237	size_t			page_size;
    238	u8			bar_to_atu[PCI_STD_NUM_BARS];
    239	phys_addr_t		*outbound_addr;
    240	unsigned long		*ib_window_map;
    241	unsigned long		*ob_window_map;
    242	void __iomem		*msi_mem;
    243	phys_addr_t		msi_mem_phys;
    244	struct pci_epf_bar	*epf_bar[PCI_STD_NUM_BARS];
    245};
    246
    247struct dw_pcie_ops {
    248	u64	(*cpu_addr_fixup)(struct dw_pcie *pcie, u64 cpu_addr);
    249	u32	(*read_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
    250			    size_t size);
    251	void	(*write_dbi)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
    252			     size_t size, u32 val);
    253	void    (*write_dbi2)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
    254			      size_t size, u32 val);
    255	int	(*link_up)(struct dw_pcie *pcie);
    256	int	(*start_link)(struct dw_pcie *pcie);
    257	void	(*stop_link)(struct dw_pcie *pcie);
    258};
    259
    260struct dw_pcie {
    261	struct device		*dev;
    262	void __iomem		*dbi_base;
    263	void __iomem		*dbi_base2;
    264	/* Used when iatu_unroll_enabled is true */
    265	void __iomem		*atu_base;
    266	size_t			atu_size;
    267	u32			num_ib_windows;
    268	u32			num_ob_windows;
    269	struct pcie_port	pp;
    270	struct dw_pcie_ep	ep;
    271	const struct dw_pcie_ops *ops;
    272	unsigned int		version;
    273	int			num_lanes;
    274	int			link_gen;
    275	u8			n_fts[2];
    276	bool			iatu_unroll_enabled: 1;
    277	bool			io_cfg_atu_shared: 1;
    278};
    279
    280#define to_dw_pcie_from_pp(port) container_of((port), struct dw_pcie, pp)
    281
    282#define to_dw_pcie_from_ep(endpoint)   \
    283		container_of((endpoint), struct dw_pcie, ep)
    284
    285u8 dw_pcie_find_capability(struct dw_pcie *pci, u8 cap);
    286u16 dw_pcie_find_ext_capability(struct dw_pcie *pci, u8 cap);
    287
    288int dw_pcie_read(void __iomem *addr, int size, u32 *val);
    289int dw_pcie_write(void __iomem *addr, int size, u32 val);
    290
    291u32 dw_pcie_read_dbi(struct dw_pcie *pci, u32 reg, size_t size);
    292void dw_pcie_write_dbi(struct dw_pcie *pci, u32 reg, size_t size, u32 val);
    293void dw_pcie_write_dbi2(struct dw_pcie *pci, u32 reg, size_t size, u32 val);
    294int dw_pcie_link_up(struct dw_pcie *pci);
    295void dw_pcie_upconfig_setup(struct dw_pcie *pci);
    296int dw_pcie_wait_for_link(struct dw_pcie *pci);
    297void dw_pcie_prog_outbound_atu(struct dw_pcie *pci, int index,
    298			       int type, u64 cpu_addr, u64 pci_addr,
    299			       u64 size);
    300void dw_pcie_prog_ep_outbound_atu(struct dw_pcie *pci, u8 func_no, int index,
    301				  int type, u64 cpu_addr, u64 pci_addr,
    302				  u64 size);
    303int dw_pcie_prog_inbound_atu(struct dw_pcie *pci, u8 func_no, int index,
    304			     int bar, u64 cpu_addr,
    305			     enum dw_pcie_as_type as_type);
    306void dw_pcie_disable_atu(struct dw_pcie *pci, int index,
    307			 enum dw_pcie_region_type type);
    308void dw_pcie_setup(struct dw_pcie *pci);
    309void dw_pcie_iatu_detect(struct dw_pcie *pci);
    310
    311static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val)
    312{
    313	dw_pcie_write_dbi(pci, reg, 0x4, val);
    314}
    315
    316static inline u32 dw_pcie_readl_dbi(struct dw_pcie *pci, u32 reg)
    317{
    318	return dw_pcie_read_dbi(pci, reg, 0x4);
    319}
    320
    321static inline void dw_pcie_writew_dbi(struct dw_pcie *pci, u32 reg, u16 val)
    322{
    323	dw_pcie_write_dbi(pci, reg, 0x2, val);
    324}
    325
    326static inline u16 dw_pcie_readw_dbi(struct dw_pcie *pci, u32 reg)
    327{
    328	return dw_pcie_read_dbi(pci, reg, 0x2);
    329}
    330
    331static inline void dw_pcie_writeb_dbi(struct dw_pcie *pci, u32 reg, u8 val)
    332{
    333	dw_pcie_write_dbi(pci, reg, 0x1, val);
    334}
    335
    336static inline u8 dw_pcie_readb_dbi(struct dw_pcie *pci, u32 reg)
    337{
    338	return dw_pcie_read_dbi(pci, reg, 0x1);
    339}
    340
    341static inline void dw_pcie_writel_dbi2(struct dw_pcie *pci, u32 reg, u32 val)
    342{
    343	dw_pcie_write_dbi2(pci, reg, 0x4, val);
    344}
    345
    346static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci)
    347{
    348	u32 reg;
    349	u32 val;
    350
    351	reg = PCIE_MISC_CONTROL_1_OFF;
    352	val = dw_pcie_readl_dbi(pci, reg);
    353	val |= PCIE_DBI_RO_WR_EN;
    354	dw_pcie_writel_dbi(pci, reg, val);
    355}
    356
    357static inline void dw_pcie_dbi_ro_wr_dis(struct dw_pcie *pci)
    358{
    359	u32 reg;
    360	u32 val;
    361
    362	reg = PCIE_MISC_CONTROL_1_OFF;
    363	val = dw_pcie_readl_dbi(pci, reg);
    364	val &= ~PCIE_DBI_RO_WR_EN;
    365	dw_pcie_writel_dbi(pci, reg, val);
    366}
    367
    368#ifdef CONFIG_PCIE_DW_HOST
    369irqreturn_t dw_handle_msi_irq(struct pcie_port *pp);
    370void dw_pcie_setup_rc(struct pcie_port *pp);
    371int dw_pcie_host_init(struct pcie_port *pp);
    372void dw_pcie_host_deinit(struct pcie_port *pp);
    373int dw_pcie_allocate_domains(struct pcie_port *pp);
    374void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus, unsigned int devfn,
    375				       int where);
    376#else
    377static inline irqreturn_t dw_handle_msi_irq(struct pcie_port *pp)
    378{
    379	return IRQ_NONE;
    380}
    381
    382static inline void dw_pcie_setup_rc(struct pcie_port *pp)
    383{
    384}
    385
    386static inline int dw_pcie_host_init(struct pcie_port *pp)
    387{
    388	return 0;
    389}
    390
    391static inline void dw_pcie_host_deinit(struct pcie_port *pp)
    392{
    393}
    394
    395static inline int dw_pcie_allocate_domains(struct pcie_port *pp)
    396{
    397	return 0;
    398}
    399static inline void __iomem *dw_pcie_own_conf_map_bus(struct pci_bus *bus,
    400						     unsigned int devfn,
    401						     int where)
    402{
    403	return NULL;
    404}
    405#endif
    406
    407#ifdef CONFIG_PCIE_DW_EP
    408void dw_pcie_ep_linkup(struct dw_pcie_ep *ep);
    409int dw_pcie_ep_init(struct dw_pcie_ep *ep);
    410int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep);
    411void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep);
    412void dw_pcie_ep_exit(struct dw_pcie_ep *ep);
    413int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no);
    414int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
    415			     u8 interrupt_num);
    416int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
    417			     u16 interrupt_num);
    418int dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep *ep, u8 func_no,
    419				       u16 interrupt_num);
    420void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar);
    421struct dw_pcie_ep_func *
    422dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no);
    423#else
    424static inline void dw_pcie_ep_linkup(struct dw_pcie_ep *ep)
    425{
    426}
    427
    428static inline int dw_pcie_ep_init(struct dw_pcie_ep *ep)
    429{
    430	return 0;
    431}
    432
    433static inline int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep)
    434{
    435	return 0;
    436}
    437
    438static inline void dw_pcie_ep_init_notify(struct dw_pcie_ep *ep)
    439{
    440}
    441
    442static inline void dw_pcie_ep_exit(struct dw_pcie_ep *ep)
    443{
    444}
    445
    446static inline int dw_pcie_ep_raise_legacy_irq(struct dw_pcie_ep *ep, u8 func_no)
    447{
    448	return 0;
    449}
    450
    451static inline int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
    452					   u8 interrupt_num)
    453{
    454	return 0;
    455}
    456
    457static inline int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
    458					   u16 interrupt_num)
    459{
    460	return 0;
    461}
    462
    463static inline int dw_pcie_ep_raise_msix_irq_doorbell(struct dw_pcie_ep *ep,
    464						     u8 func_no,
    465						     u16 interrupt_num)
    466{
    467	return 0;
    468}
    469
    470static inline void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar)
    471{
    472}
    473
    474static inline struct dw_pcie_ep_func *
    475dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no)
    476{
    477	return NULL;
    478}
    479#endif
    480#endif /* _PCIE_DESIGNWARE_H */