PCI: refactor the Mobiveil driver and add PCIe support for NXP LX SoCs
Subsystems (5)
Z.q. Hou
maintainercover PCI: refactor the Mobiveil driver and add PCIe support for NXP LX SoCs
From: Hou Zhiqiang <[email protected]>
This patch set is aim to refactor the Mobiveil driver and add PCIe support for NXP LX series SoCs.
Hou Zhiqiang (23):
PCI: mobiveil: uniform the register accessors
PCI: mobiveil: format the code without function change
PCI: mobiveil: correct the returned error number
PCI: mobiveil: remove flag MSI_FLAG_MULTI_PCI_MSI
PCI: mobiveil: correct PCI base address in MEM/IO outbound windows
PCI: mobiveil: replace the resource list iteration function
PCI: mobiveil: use WIN_NUM_0 explicitly for CFG outbound window
PCI: mobiveil: use the 1st inbound window for MEM inbound transactions
PCI: mobiveil: correct the inbound/outbound window setup routine
PCI: mobiveil: fix the INTx process error
PCI: mobiveil: only fixup the Class Code field
PCI: mobiveil: move out the link up waiting from mobiveil_host_init
PCI: mobiveil: move irq chained handler setup out of DT parse
PCI: mobiveil: initialize Primary/Secondary/Subordinate bus number
dt-bindings: pci: mobiveil: change gpio_slave and apb_csr to optional
PCI: mobiveil: refactor the Mobiveil driver
PCI: mobiveil: continue to initialize the host upon no PCIe link
PCI: mobiveil: disabled IB and OB windows set by bootloader
PCI: mobiveil: add Byte and Half-Word width register accessors
PCI: mobiveil: change prototype of function mobiveil_host_init
dt-bindings: pci: Add NXP LX SoCs PCIe controller
PCI: mobiveil: add PCIe RC driver for NXP LX series SoCs
arm64: dts: freescale: lx2160a: add pcie DT nodes
.../devicetree/bindings/pci/lx-pci.txt | 52 ++ .../devicetree/bindings/pci/mobiveil-pcie.txt | 2 + MAINTAINERS | 10 +- .../arm64/boot/dts/freescale/fsl-lx2160a.dtsi | 157 ++++ drivers/pci/controller/Kconfig | 11 +- drivers/pci/controller/Makefile | 2 +- drivers/pci/controller/mobiveil/Kconfig | 34 + drivers/pci/controller/mobiveil/Makefile | 5 + drivers/pci/controller/mobiveil/pci-lx.c | 222 +++++ .../controller/mobiveil/pcie-mobiveil-host.c | 622 +++++++++++++ .../controller/mobiveil/pcie-mobiveil-plat.c | 54 ++ .../pci/controller/mobiveil/pcie-mobiveil.c | 245 +++++ .../pci/controller/mobiveil/pcie-mobiveil.h | 221 +++++ drivers/pci/controller/pcie-mobiveil.c | 861 ------------------ 14 files changed, 1625 insertions(+), 873 deletions(-) create mode 100644 Documentation/devicetree/bindings/pci/lx-pci.txt create mode 100644 drivers/pci/controller/mobiveil/Kconfig create mode 100644 drivers/pci/controller/mobiveil/Makefile create mode 100644 drivers/pci/controller/mobiveil/pci-lx.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil-host.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.h delete mode 100644 drivers/pci/controller/pcie-mobiveil.c
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 1/23 PCI: mobiveil: uniform the register accessors
From: Hou Zhiqiang <[email protected]>
It's confused that R/W some registers by csr_readl()/csr_writel(), while others by read_paged_register()/write_paged_register(). Actually the low 3KB of 4KB PCIe configure space can be accessed directly and high 1KB is paging area. So this patch uniformed the register accessors to csr_readl() and csr_writel() by comparing the register offset with page access boundary 3KB in the accessor internal.
--- drivers/pci/controller/pcie-mobiveil.c | 179 +++++++++++++++++-------- 1 file changed, 124 insertions(+), 55 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +124 -55
@@ -47,7 +47,6 @@#define PAGE_SEL_SHIFT 13#define PAGE_SEL_MASK 0x3f#define PAGE_LO_MASK 0x3ff -#define PAGE_SEL_EN 0xc00#define PAGE_SEL_OFFSET_SHIFT 10#define PAB_AXI_PIO_CTRL 0x0840
@@ -117,6 +116,12 @@#define LINK_WAIT_MIN 90000#define LINK_WAIT_MAX 100000 +#define PAGED_ADDR_BNDRY 0xc00 +#define OFFSET_TO_PAGE_ADDR (off) \ + ((off & PAGE_LO_MASK) | PAGED_ADDR_BNDRY) +#define OFFSET_TO_PAGE_IDX (off) \ + ((off >> PAGE_SEL_OFFSET_SHIFT) & PAGE_SEL_MASK) +struct mobiveil_msi {/* MSI information */ struct mutex lock;/* protect bitmap variable */ struct irq_domain *msi_domain;
@@ -145,15 +150,119 @@ struct mobiveil_pcie {struct mobiveil_msi msi; }; -static inline void csr_writel (struct mobiveil_pcie *pcie,const u32 value, -const u32 reg) +/* +* mobiveil_pcie_sel_page - routine to access paged register +* +* Registers whose address greater than PAGED_ADDR_BNDRY (0xc00) are paged, +* for this scheme to work extracted higher 6 bits of the offset will be +* written to pg_sel field of PAB_CTRL register and rest of the lower 10 +* bits enabled with PAGED_ADDR_BNDRY are used as offset of the register. +*/ +static void mobiveil_pcie_sel_page (struct mobiveil_pcie *pcie,u8 pg_idx) { -writel_relaxed (value, pcie->csr_axi_slave_base + reg); +u32 val; + + val =readl (pcie->csr_axi_slave_base +PAB_CTRL ); + val &= ~(PAGE_SEL_MASK <<PAGE_SEL_SHIFT ); + val |= (pg_idx &PAGE_SEL_MASK ) <<PAGE_SEL_SHIFT ; + +writel (val, pcie->csr_axi_slave_base +PAB_CTRL ); } -static inline u32 csr_readl (struct mobiveil_pcie *pcie,const u32 reg) +static void *mobiveil_pcie_comp_addr (struct mobiveil_pcie *pcie,u32 off) { -return readl_relaxed (pcie->csr_axi_slave_base + reg); +if (off <PAGED_ADDR_BNDRY ) { +/* For directly accessed registers, clear the pg_sel field */ +mobiveil_pcie_sel_page (pcie,0 ); +return pcie->csr_axi_slave_base + off; + } + +mobiveil_pcie_sel_page (pcie,OFFSET_TO_PAGE_IDX (off)); +return pcie->csr_axi_slave_base +OFFSET_TO_PAGE_ADDR (off); +} + +static int mobiveil_pcie_read (void __iomem *addr,int size,u32 *val) +{ +if ((uintptr_t )addr & (size -1 )) { + *val =0 ; +return PCIBIOS_BAD_REGISTER_NUMBER ; + } + +switch (size) { +case 4 : + *val =readl (addr); +break ; +case 2 : + *val =readw (addr); +break ; +case 1 : + *val =readb (addr); +break ; +default : + *val =0 ; +return PCIBIOS_BAD_REGISTER_NUMBER ; + } + +return PCIBIOS_SUCCESSFUL ; +} + +static int mobiveil_pcie_write (void __iomem *addr,int size,u32 val) +{ +if ((uintptr_t )addr & (size -1 )) +return PCIBIOS_BAD_REGISTER_NUMBER ; + +switch (size) { +case 4 : +writel (val, addr); +break ; +case 2 : +writew (val, addr); +break ; +case 1 : +writeb (val, addr); +break ; +default : +return PCIBIOS_BAD_REGISTER_NUMBER ; + } + +return PCIBIOS_SUCCESSFUL ; +} + +static u32 csr_read (struct mobiveil_pcie *pcie,u32 off,size_t size) +{ +void *addr; +u32 val; +int ret; + + addr =mobiveil_pcie_comp_addr (pcie, off); + + ret =mobiveil_pcie_read (addr, size, &val); +if (ret) +dev_err (&pcie->pdev->dev,"read CSR address failed\n" ); + +return val; +} + +static void csr_write (struct mobiveil_pcie *pcie,u32 val,u32 off,size_t size) +{ +void *addr; +int ret; + + addr =mobiveil_pcie_comp_addr (pcie, off); + + ret =mobiveil_pcie_write (addr, size, val); +if (ret) +dev_err (&pcie->pdev->dev,"write CSR address failed\n" ); +} + +static u32 csr_readl (struct mobiveil_pcie *pcie,u32 off) +{ +return csr_read (pcie, off,0x4 ); +} + +static void csr_writel (struct mobiveil_pcie *pcie,u32 val,u32 off) +{ +csr_write (pcie, val, off,0x4 ); }static bool mobiveil_pcie_link_up (struct mobiveil_pcie *pcie)
@@ -342,45 +451,6 @@ static int mobiveil_pcie_parse_dt(struct mobiveil_pcie *pcie)return 0 ; } -/* -* select_paged_register - routine to access paged register of root complex -* -* registers of RC are paged, for this scheme to work -* extracted higher 6 bits of the offset will be written to pg_sel -* field of PAB_CTRL register and rest of the lower 10 bits enabled with -* PAGE_SEL_EN are used as offset of the register. -*/ -static void select_paged_register (struct mobiveil_pcie *pcie,u32 offset) -{ -int pab_ctrl_dw, pg_sel; - -/* clear pg_sel field */ - pab_ctrl_dw =csr_readl (pcie,PAB_CTRL ); - pab_ctrl_dw = (pab_ctrl_dw & ~(PAGE_SEL_MASK <<PAGE_SEL_SHIFT )); - -/* set pg_sel field */ - pg_sel = (offset >>PAGE_SEL_OFFSET_SHIFT ) &PAGE_SEL_MASK ; - pab_ctrl_dw |= ((pg_sel <<PAGE_SEL_SHIFT )); -csr_writel (pcie, pab_ctrl_dw,PAB_CTRL ); -} - -static void write_paged_register (struct mobiveil_pcie *pcie, -u32 val,u32 offset) -{ -u32 off = (offset &PAGE_LO_MASK ) |PAGE_SEL_EN ; - -select_paged_register (pcie, offset); -csr_writel (pcie, val, off); -} - -static u32 read_paged_register (struct mobiveil_pcie *pcie,u32 offset) -{ -u32 off = (offset &PAGE_LO_MASK ) |PAGE_SEL_EN ; - -select_paged_register (pcie, offset); -return csr_readl (pcie, off); -} -static void program_ib_windows (struct mobiveil_pcie *pcie,int win_num,int pci_addr,u32 type,u64 size) {
@@ -397,19 +467,19 @@ static void program_ib_windows(struct mobiveil_pcie *pcie, int win_num, pio_ctrl_val =csr_readl (pcie,PAB_PEX_PIO_CTRL );csr_writel (pcie, pio_ctrl_val | (1 <<PIO_ENABLE_SHIFT ),PAB_PEX_PIO_CTRL ); - amap_ctrl_dw =read_paged_register (pcie,PAB_PEX_AMAP_CTRL (win_num)); + amap_ctrl_dw =csr_readl (pcie,PAB_PEX_AMAP_CTRL (win_num)); amap_ctrl_dw = (amap_ctrl_dw | (type <<AMAP_CTRL_TYPE_SHIFT )); amap_ctrl_dw = (amap_ctrl_dw | (1 <<AMAP_CTRL_EN_SHIFT )); -write_paged_register (pcie, amap_ctrl_dw |lower_32_bits (size64), -PAB_PEX_AMAP_CTRL (win_num)); +csr_writel (pcie, amap_ctrl_dw |lower_32_bits (size64), +PAB_PEX_AMAP_CTRL (win_num)); -write_paged_register (pcie,upper_32_bits (size64), -PAB_EXT_PEX_AMAP_SIZEN (win_num)); +csr_writel (pcie,upper_32_bits (size64), +PAB_EXT_PEX_AMAP_SIZEN (win_num)); -write_paged_register (pcie, pci_addr,PAB_PEX_AMAP_AXI_WIN (win_num)); -write_paged_register (pcie, pci_addr,PAB_PEX_AMAP_PEX_WIN_L (win_num)); -write_paged_register (pcie,0 ,PAB_PEX_AMAP_PEX_WIN_H (win_num)); +csr_writel (pcie, pci_addr,PAB_PEX_AMAP_AXI_WIN (win_num)); +csr_writel (pcie, pci_addr,PAB_PEX_AMAP_PEX_WIN_L (win_num)); +csr_writel (pcie,0 ,PAB_PEX_AMAP_PEX_WIN_H (win_num)); }/*
@@ -437,8 +507,7 @@ static void program_ob_windows(struct mobiveil_pcie *pcie, int win_num,csr_writel (pcie,1 <<WIN_ENABLE_SHIFT | type <<WIN_TYPE_SHIFT |lower_32_bits (size64),PAB_AXI_AMAP_CTRL (win_num)); -write_paged_register (pcie,upper_32_bits (size64), -PAB_EXT_AXI_AMAP_SIZE (win_num)); +csr_writel (pcie,upper_32_bits (size64),PAB_EXT_AXI_AMAP_SIZE (win_num));/* * program AXI window base with appropriate value in
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 2/23 PCI: mobiveil: format the code without function change
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Just format the code without functionality change.
--- drivers/pci/controller/pcie-mobiveil.c | 261 +++++++++++++------------ 1 file changed, 137 insertions(+), 124 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +137 -124
@@ -31,38 +31,40 @@* translation tables are grouped into windows, each window registers are * grouped into blocks of 4 or 16 registers each */ -#define PAB_REG_BLOCK_SIZE 16 -#define PAB_EXT_REG_BLOCK_SIZE 4 +#define PAB_REG_BLOCK_SIZE 16 +#define PAB_EXT_REG_BLOCK_SIZE 4 -#define PAB_REG_ADDR (offset, win) (offset + (win * PAB_REG_BLOCK_SIZE)) -#define PAB_EXT_REG_ADDR (offset, win) (offset + (win * PAB_EXT_REG_BLOCK_SIZE)) +#define PAB_REG_ADDR (offset, win) \ + (offset + (win * PAB_REG_BLOCK_SIZE)) +#define PAB_EXT_REG_ADDR (offset, win) \ + (offset + (win * PAB_EXT_REG_BLOCK_SIZE)) -#define LTSSM_STATUS 0x0404 -#define LTSSM_STATUS_L0_MASK 0x3f -#define LTSSM_STATUS_L0 0x2d +#define LTSSM_STATUS 0x0404 +#define LTSSM_STATUS_L0_MASK 0x3f +#define LTSSM_STATUS_L0 0x2d -#define PAB_CTRL 0x0808 -#define AMBA_PIO_ENABLE_SHIFT 0 -#define PEX_PIO_ENABLE_SHIFT 1 -#define PAGE_SEL_SHIFT 13 -#define PAGE_SEL_MASK 0x3f -#define PAGE_LO_MASK 0x3ff -#define PAGE_SEL_OFFSET_SHIFT 10 +#define PAB_CTRL 0x0808 +#define AMBA_PIO_ENABLE_SHIFT 0 +#define PEX_PIO_ENABLE_SHIFT 1 +#define PAGE_SEL_SHIFT 13 +#define PAGE_SEL_MASK 0x3f +#define PAGE_LO_MASK 0x3ff +#define PAGE_SEL_OFFSET_SHIFT 10 -#define PAB_AXI_PIO_CTRL 0x0840 -#define APIO_EN_MASK 0xf +#define PAB_AXI_PIO_CTRL 0x0840 +#define APIO_EN_MASK 0xf -#define PAB_PEX_PIO_CTRL 0x08c0 -#define PIO_ENABLE_SHIFT 0 +#define PAB_PEX_PIO_CTRL 0x08c0 +#define PIO_ENABLE_SHIFT 0#define PAB_INTP_AMBA_MISC_ENB 0x0b0c -#define PAB_INTP_AMBA_MISC_STAT 0x0b1c +#define PAB_INTP_AMBA_MISC_STAT 0x0b1c#define PAB_INTP_INTX_MASK 0x01e0#define PAB_INTP_MSI_MASK 0x8 -#define PAB_AXI_AMAP_CTRL (win) PAB_REG_ADDR(0x0ba0, win) -#define WIN_ENABLE_SHIFT 0 -#define WIN_TYPE_SHIFT 1 +#define PAB_AXI_AMAP_CTRL (win) PAB_REG_ADDR(0x0ba0, win) +#define WIN_ENABLE_SHIFT 0 +#define WIN_TYPE_SHIFT 1#define PAB_EXT_AXI_AMAP_SIZE (win) PAB_EXT_REG_ADDR(0xbaf0, win)
@@ -70,16 +72,16 @@#define AXI_WINDOW_ALIGN_MASK 3#define PAB_AXI_AMAP_PEX_WIN_L (win) PAB_REG_ADDR(0x0ba8, win) -#define PAB_BUS_SHIFT 24 -#define PAB_DEVICE_SHIFT 19 -#define PAB_FUNCTION_SHIFT 16 +#define PAB_BUS_SHIFT 24 +#define PAB_DEVICE_SHIFT 19 +#define PAB_FUNCTION_SHIFT 16#define PAB_AXI_AMAP_PEX_WIN_H (win) PAB_REG_ADDR(0x0bac, win)#define PAB_INTP_AXI_PIO_CLASS 0x474 -#define PAB_PEX_AMAP_CTRL (win) PAB_REG_ADDR(0x4ba0, win) -#define AMAP_CTRL_EN_SHIFT 0 -#define AMAP_CTRL_TYPE_SHIFT 1 +#define PAB_PEX_AMAP_CTRL (win) PAB_REG_ADDR(0x4ba0, win) +#define AMAP_CTRL_EN_SHIFT 0 +#define AMAP_CTRL_TYPE_SHIFT 1#define PAB_EXT_PEX_AMAP_SIZEN (win) PAB_EXT_REG_ADDR(0xbef0, win)#define PAB_PEX_AMAP_AXI_WIN (win) PAB_REG_ADDR(0x4ba4, win)
@@ -87,39 +89,39 @@#define PAB_PEX_AMAP_PEX_WIN_H (win) PAB_REG_ADDR(0x4bac, win)/* starting offset of INTX bits in status register */ -#define PAB_INTX_START 5 +#define PAB_INTX_START 5/* supported number of MSI interrupts */ -#define PCI_NUM_MSI 16 +#define PCI_NUM_MSI 16/* MSI registers */ -#define MSI_BASE_LO_OFFSET 0x04 -#define MSI_BASE_HI_OFFSET 0x08 -#define MSI_SIZE_OFFSET 0x0c -#define MSI_ENABLE_OFFSET 0x14 -#define MSI_STATUS_OFFSET 0x18 -#define MSI_DATA_OFFSET 0x20 -#define MSI_ADDR_L_OFFSET 0x24 -#define MSI_ADDR_H_OFFSET 0x28 +#define MSI_BASE_LO_OFFSET 0x04 +#define MSI_BASE_HI_OFFSET 0x08 +#define MSI_SIZE_OFFSET 0x0c +#define MSI_ENABLE_OFFSET 0x14 +#define MSI_STATUS_OFFSET 0x18 +#define MSI_DATA_OFFSET 0x20 +#define MSI_ADDR_L_OFFSET 0x24 +#define MSI_ADDR_H_OFFSET 0x28/* outbound and inbound window definitions */ -#define WIN_NUM_0 0 -#define WIN_NUM_1 1 -#define CFG_WINDOW_TYPE 0 -#define IO_WINDOW_TYPE 1 -#define MEM_WINDOW_TYPE 2 -#define IB_WIN_SIZE ((u64)256 * 1024 * 1024 * 1024) -#define MAX_PIO_WINDOWS 8 +#define WIN_NUM_0 0 +#define WIN_NUM_1 1 +#define CFG_WINDOW_TYPE 0 +#define IO_WINDOW_TYPE 1 +#define MEM_WINDOW_TYPE 2 +#define IB_WIN_SIZE ((u64)256 * 1024 * 1024 * 1024) +#define MAX_PIO_WINDOWS 8/* Parameters for the waiting for link up routine */ -#define LINK_WAIT_MAX_RETRIES 10 -#define LINK_WAIT_MIN 90000 -#define LINK_WAIT_MAX 100000 +#define LINK_WAIT_MAX_RETRIES 10 +#define LINK_WAIT_MIN 90000 +#define LINK_WAIT_MAX 100000 -#define PAGED_ADDR_BNDRY 0xc00 -#define OFFSET_TO_PAGE_ADDR (off) \ +#define PAGED_ADDR_BNDRY 0xc00 +#define OFFSET_TO_PAGE_ADDR (off) \ ((off & PAGE_LO_MASK) | PAGED_ADDR_BNDRY) -#define OFFSET_TO_PAGE_IDX (off) \ +#define OFFSET_TO_PAGE_IDX (off) \ ((off >> PAGE_SEL_OFFSET_SHIFT) & PAGE_SEL_MASK)struct mobiveil_msi {/* MSI information */
@@ -297,14 +299,14 @@ static void __iomem *mobiveil_pcie_map_bus(struct pci_bus *bus, unsigned int devfn, int where) {struct mobiveil_pcie *pcie = bus->sysdata; +u32 value;if (!mobiveil_pcie_valid_device (bus, devfn))return NULL ; -if (bus->number == pcie->root_bus_nr) { -/* RC config access */ +/* RC config access */ +if (bus->number == pcie->root_bus_nr)return pcie->csr_axi_slave_base + where; - }/* * EP config access (in Config/APIO space)
@@ -312,10 +314,12 @@ static void __iomem *mobiveil_pcie_map_bus(struct pci_bus *bus,* (BDF) in PAB_AXI_AMAP_PEX_WIN_L0 Register. * Relies on pci_lock serialization */ -csr_writel (pcie, bus->number <<PAB_BUS_SHIFT | -PCI_SLOT (devfn) <<PAB_DEVICE_SHIFT | -PCI_FUNC (devfn) <<PAB_FUNCTION_SHIFT , -PAB_AXI_AMAP_PEX_WIN_L (WIN_NUM_0 )); + value = bus->number <<PAB_BUS_SHIFT | +PCI_SLOT (devfn) <<PAB_DEVICE_SHIFT | +PCI_FUNC (devfn) <<PAB_FUNCTION_SHIFT ; + +csr_writel (pcie, value,PAB_AXI_AMAP_PEX_WIN_L (WIN_NUM_0 )); +return pcie->config_axi_slave_base + where; }
@@ -350,22 +354,22 @@ static void mobiveil_pcie_isr(struct irq_desc *desc)/* Handle INTx */ if (intr_status &PAB_INTP_INTX_MASK ) { - shifted_status =csr_readl (pcie,PAB_INTP_AMBA_MISC_STAT ) >> -PAB_INTX_START ; + shifted_status =csr_readl (pcie,PAB_INTP_AMBA_MISC_STAT ); + shifted_status >>=PAB_INTX_START ;do {for_each_set_bit (bit, &shifted_status,PCI_NUM_INTX ) { virq =irq_find_mapping (pcie->intx_domain, - bit +1 ); + bit +1 );if (virq)generic_handle_irq (virq);else -dev_err_ratelimited (dev, -"unexpected IRQ, INT%d\n" , bit); +dev_err_ratelimited (dev,"unexpected IRQ, INT%d\n" , + bit);/* clear interrupt */ csr_writel (pcie, - shifted_status <<PAB_INTX_START , -PAB_INTP_AMBA_MISC_STAT ); + shifted_status <<PAB_INTX_START , +PAB_INTP_AMBA_MISC_STAT ); } }while ((shifted_status >>PAB_INTX_START ) !=0 ); }
@@ -375,8 +379,7 @@ static void mobiveil_pcie_isr(struct irq_desc *desc)/* handle MSI interrupts */ while (msi_status &1 ) { - msi_data =readl_relaxed (pcie->apb_csr_base - +MSI_DATA_OFFSET ); + msi_data =readl_relaxed (pcie->apb_csr_base +MSI_DATA_OFFSET );/* * MSI_STATUS_OFFSET register gets updated to zero
@@ -385,18 +388,18 @@ static void mobiveil_pcie_isr(struct irq_desc *desc)* two dummy reads. */ msi_addr_lo =readl_relaxed (pcie->apb_csr_base + -MSI_ADDR_L_OFFSET ); +MSI_ADDR_L_OFFSET ); msi_addr_hi =readl_relaxed (pcie->apb_csr_base + -MSI_ADDR_H_OFFSET ); +MSI_ADDR_H_OFFSET );dev_dbg (dev,"MSI registers, data: %08x, addr: %08x:%08x\n" , - msi_data, msi_addr_hi, msi_addr_lo); + msi_data, msi_addr_hi, msi_addr_lo); virq =irq_find_mapping (msi->dev_domain, msi_data);if (virq)generic_handle_irq (virq); msi_status =readl_relaxed (pcie->apb_csr_base + -MSI_STATUS_OFFSET ); +MSI_STATUS_OFFSET ); }/* Clear the interrupt status */
@@ -413,7 +416,7 @@ static int mobiveil_pcie_parse_dt(struct mobiveil_pcie *pcie)/* map config resource */ res =platform_get_resource_byname (pdev,IORESOURCE_MEM , -"config_axi_slave" ); +"config_axi_slave" ); pcie->config_axi_slave_base =devm_pci_remap_cfg_resource (dev, res);if (IS_ERR (pcie->config_axi_slave_base))return PTR_ERR (pcie->config_axi_slave_base);
@@ -421,7 +424,7 @@ static int mobiveil_pcie_parse_dt(struct mobiveil_pcie *pcie)/* map csr resource */ res =platform_get_resource_byname (pdev,IORESOURCE_MEM , -"csr_axi_slave" ); +"csr_axi_slave" ); pcie->csr_axi_slave_base =devm_pci_remap_cfg_resource (dev, res);if (IS_ERR (pcie->csr_axi_slave_base))return PTR_ERR (pcie->csr_axi_slave_base);
@@ -452,7 +455,7 @@ static int mobiveil_pcie_parse_dt(struct mobiveil_pcie *pcie) }static void program_ib_windows (struct mobiveil_pcie *pcie,int win_num, -int pci_addr,u32 type,u64 size) +int pci_addr,u32 type,u64 size) {int pio_ctrl_val;int amap_ctrl_dw;
@@ -465,19 +468,20 @@ static void program_ib_windows(struct mobiveil_pcie *pcie, int win_num, } pio_ctrl_val =csr_readl (pcie,PAB_PEX_PIO_CTRL ); -csr_writel (pcie, - pio_ctrl_val | (1 <<PIO_ENABLE_SHIFT ),PAB_PEX_PIO_CTRL ); - amap_ctrl_dw =csr_readl (pcie,PAB_PEX_AMAP_CTRL (win_num)); - amap_ctrl_dw = (amap_ctrl_dw | (type <<AMAP_CTRL_TYPE_SHIFT )); - amap_ctrl_dw = (amap_ctrl_dw | (1 <<AMAP_CTRL_EN_SHIFT )); + pio_ctrl_val |=1 <<PIO_ENABLE_SHIFT ; +csr_writel (pcie, pio_ctrl_val,PAB_PEX_PIO_CTRL ); -csr_writel (pcie, amap_ctrl_dw |lower_32_bits (size64), -PAB_PEX_AMAP_CTRL (win_num)); + amap_ctrl_dw =csr_readl (pcie,PAB_PEX_AMAP_CTRL (win_num)); + amap_ctrl_dw |= (type <<AMAP_CTRL_TYPE_SHIFT ) | + (1 <<AMAP_CTRL_EN_SHIFT ) | +lower_32_bits (size64); +csr_writel (pcie, amap_ctrl_dw,PAB_PEX_AMAP_CTRL (win_num));csr_writel (pcie,upper_32_bits (size64),PAB_EXT_PEX_AMAP_SIZEN (win_num));csr_writel (pcie, pci_addr,PAB_PEX_AMAP_AXI_WIN (win_num)); +csr_writel (pcie, pci_addr,PAB_PEX_AMAP_PEX_WIN_L (win_num));csr_writel (pcie,0 ,PAB_PEX_AMAP_PEX_WIN_H (win_num)); }
@@ -486,7 +490,8 @@ static void program_ib_windows(struct mobiveil_pcie *pcie, int win_num,* routine to program the outbound windows */ static void program_ob_windows (struct mobiveil_pcie *pcie,int win_num, -u64 cpu_addr,u64 pci_addr,u32 config_io_bit,u64 size) +u64 cpu_addr,u64 pci_addr, +u32 config_io_bit,u64 size) {u32 value, type;
@@ -505,7 +510,7 @@ static void program_ob_windows(struct mobiveil_pcie *pcie, int win_num, type = config_io_bit; value =csr_readl (pcie,PAB_AXI_AMAP_CTRL (win_num));csr_writel (pcie,1 <<WIN_ENABLE_SHIFT | type <<WIN_TYPE_SHIFT | -lower_32_bits (size64),PAB_AXI_AMAP_CTRL (win_num)); +lower_32_bits (size64),PAB_AXI_AMAP_CTRL (win_num));csr_writel (pcie,upper_32_bits (size64),PAB_EXT_AXI_AMAP_SIZE (win_num));
@@ -515,14 +520,14 @@ static void program_ob_windows(struct mobiveil_pcie *pcie, int win_num,*/ value =csr_readl (pcie,PAB_AXI_AMAP_AXI_WIN (win_num));csr_writel (pcie, cpu_addr & (~AXI_WINDOW_ALIGN_MASK ), -PAB_AXI_AMAP_AXI_WIN (win_num)); +PAB_AXI_AMAP_AXI_WIN (win_num)); value =csr_readl (pcie,PAB_AXI_AMAP_PEX_WIN_H (win_num));csr_writel (pcie,lower_32_bits (pci_addr), -PAB_AXI_AMAP_PEX_WIN_L (win_num)); +PAB_AXI_AMAP_PEX_WIN_L (win_num));csr_writel (pcie,upper_32_bits (pci_addr), -PAB_AXI_AMAP_PEX_WIN_H (win_num)); +PAB_AXI_AMAP_PEX_WIN_H (win_num)); pcie->ob_wins_configured++; }
@@ -538,7 +543,9 @@ static int mobiveil_bringup_link(struct mobiveil_pcie *pcie)usleep_range (LINK_WAIT_MIN ,LINK_WAIT_MAX ); } +dev_err (&pcie->pdev->dev,"link never came up\n" ); +return -ETIMEDOUT ; }
@@ -551,16 +558,16 @@ static void mobiveil_pcie_enable_msi(struct mobiveil_pcie *pcie) msi->msi_pages_phys = (phys_addr_t )msg_addr;writel_relaxed (lower_32_bits (msg_addr), - pcie->apb_csr_base +MSI_BASE_LO_OFFSET ); + pcie->apb_csr_base +MSI_BASE_LO_OFFSET );writel_relaxed (upper_32_bits (msg_addr), - pcie->apb_csr_base +MSI_BASE_HI_OFFSET ); + pcie->apb_csr_base +MSI_BASE_HI_OFFSET );writel_relaxed (4096 , pcie->apb_csr_base +MSI_SIZE_OFFSET );writel_relaxed (1 , pcie->apb_csr_base +MSI_ENABLE_OFFSET ); }static int mobiveil_host_init (struct mobiveil_pcie *pcie) { -u32 value, pab_ctrl, type =0 ; +u32 value, pab_ctrl, type;int err;struct resource_entry *win, *tmp;
@@ -575,26 +582,27 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)* Space */ value =csr_readl (pcie,PCI_COMMAND ); -csr_writel (pcie, value |PCI_COMMAND_IO |PCI_COMMAND_MEMORY | -PCI_COMMAND_MASTER ,PCI_COMMAND ); + value |=PCI_COMMAND_IO |PCI_COMMAND_MEMORY |PCI_COMMAND_MASTER ; +csr_writel (pcie, value,PCI_COMMAND );/* * program PIO Enable Bit to 1 (and PEX PIO Enable to 1) in PAB_CTRL * register */ pab_ctrl =csr_readl (pcie,PAB_CTRL ); -csr_writel (pcie, pab_ctrl | (1 <<AMBA_PIO_ENABLE_SHIFT ) | - (1 <<PEX_PIO_ENABLE_SHIFT ),PAB_CTRL ); + pab_ctrl |= (1 <<AMBA_PIO_ENABLE_SHIFT ) | (1 <<PEX_PIO_ENABLE_SHIFT ); +csr_writel (pcie, pab_ctrl,PAB_CTRL );csr_writel (pcie, (PAB_INTP_INTX_MASK |PAB_INTP_MSI_MASK ), -PAB_INTP_AMBA_MISC_ENB ); +PAB_INTP_AMBA_MISC_ENB );/* * program PIO Enable Bit to 1 and Config Window Enable Bit to 1 in * PAB_AXI_PIO_CTRL Register */ value =csr_readl (pcie,PAB_AXI_PIO_CTRL ); -csr_writel (pcie, value |APIO_EN_MASK ,PAB_AXI_PIO_CTRL ); + value |=APIO_EN_MASK ; +csr_writel (pcie, value,PAB_AXI_PIO_CTRL );/* * we'll program one outbound window for config reads and
@@ -605,25 +613,25 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)/* config outbound translation window */ program_ob_windows (pcie, pcie->ob_wins_configured, - pcie->ob_io_res->start,0 ,CFG_WINDOW_TYPE , -resource_size (pcie->ob_io_res)); + pcie->ob_io_res->start,0 ,CFG_WINDOW_TYPE , +resource_size (pcie->ob_io_res));/* memory inbound translation window */ program_ib_windows (pcie,WIN_NUM_1 ,0 ,MEM_WINDOW_TYPE ,IB_WIN_SIZE );/* Get the I/O and memory ranges from DT */ resource_list_for_each_entry_safe (win, tmp, &pcie->resources) { - type =0 ;if (resource_type (win->res) ==IORESOURCE_MEM ) type =MEM_WINDOW_TYPE ; -if (resource_type (win->res) ==IORESOURCE_IO ) +else if (resource_type (win->res) ==IORESOURCE_IO ) type =IO_WINDOW_TYPE ; -if (type) { -/* configure outbound translation window */ -program_ob_windows (pcie, pcie->ob_wins_configured, - win->res->start,0 , type, -resource_size (win->res)); - } +else +continue ; + +/* configure outbound translation window */ +program_ob_windows (pcie, pcie->ob_wins_configured, + win->res->start,0 , type, +resource_size (win->res)); }/* setup MSI hardware registers */
@@ -643,7 +651,8 @@ static void mobiveil_mask_intx_irq(struct irq_data *data) mask =1 << ((data->hwirq +PAB_INTX_START ) -1 );raw_spin_lock_irqsave (&pcie->intx_mask_lock, flags); shifted_val =csr_readl (pcie,PAB_INTP_AMBA_MISC_ENB ); -csr_writel (pcie, (shifted_val & (~mask)),PAB_INTP_AMBA_MISC_ENB ); + shifted_val &= ~mask; +csr_writel (pcie, shifted_val,PAB_INTP_AMBA_MISC_ENB );raw_spin_unlock_irqrestore (&pcie->intx_mask_lock, flags); }
@@ -658,7 +667,8 @@ static void mobiveil_unmask_intx_irq(struct irq_data *data) mask =1 << ((data->hwirq +PAB_INTX_START ) -1 );raw_spin_lock_irqsave (&pcie->intx_mask_lock, flags); shifted_val =csr_readl (pcie,PAB_INTP_AMBA_MISC_ENB ); -csr_writel (pcie, (shifted_val | mask),PAB_INTP_AMBA_MISC_ENB ); + shifted_val |= mask; +csr_writel (pcie, shifted_val,PAB_INTP_AMBA_MISC_ENB );raw_spin_unlock_irqrestore (&pcie->intx_mask_lock, flags); }
@@ -672,10 +682,11 @@ static struct irq_chip intx_irq_chip = {/* routine to setup the INTx related data */ static int mobiveil_pcie_intx_map (struct irq_domain *domain,unsigned int irq, -irq_hw_number_t hwirq) +irq_hw_number_t hwirq) {irq_set_chip_and_handler (irq, &intx_irq_chip, handle_level_irq);irq_set_chip_data (irq, domain->host_data); +return 0 ; }
@@ -692,7 +703,7 @@ static struct irq_chip mobiveil_msi_irq_chip = {static struct msi_domain_info mobiveil_msi_domain_info = { .flags = (MSI_FLAG_USE_DEF_DOM_OPS |MSI_FLAG_USE_DEF_CHIP_OPS | -MSI_FLAG_MULTI_PCI_MSI |MSI_FLAG_PCI_MSIX ), +MSI_FLAG_MULTI_PCI_MSI |MSI_FLAG_PCI_MSIX ), .chip = &mobiveil_msi_irq_chip, };
@@ -710,7 +721,7 @@ static void mobiveil_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) }static int mobiveil_msi_set_affinity (struct irq_data *irq_data, -const struct cpumask *mask,bool force) +const struct cpumask *mask,bool force) {return -EINVAL ; }
@@ -722,7 +733,8 @@ static struct irq_chip mobiveil_msi_bottom_irq_chip = { };static int mobiveil_irq_msi_domain_alloc (struct irq_domain *domain, -unsigned int virq,unsigned int nr_irqs,void *args) +unsigned int virq, +unsigned int nr_irqs,void *args) {struct mobiveil_pcie *pcie = domain->host_data;struct mobiveil_msi *msi = &pcie->msi;
@@ -742,13 +754,13 @@ static int mobiveil_irq_msi_domain_alloc(struct irq_domain *domain,mutex_unlock (&msi->lock);irq_domain_set_info (domain, virq, bit, &mobiveil_msi_bottom_irq_chip, - domain->host_data, handle_level_irq, -NULL ,NULL ); + domain->host_data, handle_level_irq,NULL ,NULL );return 0 ; }static void mobiveil_irq_msi_domain_free (struct irq_domain *domain, -unsigned int virq,unsigned int nr_irqs) +unsigned int virq, +unsigned int nr_irqs) {struct irq_data *d =irq_domain_get_irq_data (domain, virq);struct mobiveil_pcie *pcie =irq_data_get_irq_chip_data (d);
@@ -756,12 +768,11 @@ static void mobiveil_irq_msi_domain_free(struct irq_domain *domain,mutex_lock (&msi->lock); -if (!test_bit (d->hwirq, msi->msi_irq_in_use)) { +if (!test_bit (d->hwirq, msi->msi_irq_in_use))dev_err (&pcie->pdev->dev,"trying to free unused MSI#%lu\n" , d->hwirq); - }else { +else __clear_bit (d->hwirq, msi->msi_irq_in_use); - }mutex_unlock (&msi->lock); }
@@ -785,12 +796,14 @@ static int mobiveil_allocate_msi_domains(struct mobiveil_pcie *pcie) } msi->msi_domain =pci_msi_create_irq_domain (fwnode, - &mobiveil_msi_domain_info, msi->dev_domain); + &mobiveil_msi_domain_info, + msi->dev_domain);if (!msi->msi_domain) {dev_err (dev,"failed to create MSI domain\n" );irq_domain_remove (msi->dev_domain);return -ENOMEM ; } +return 0 ; }
@@ -801,8 +814,8 @@ static int mobiveil_pcie_init_irq_domain(struct mobiveil_pcie *pcie)int ret;/* setup INTx */ - pcie->intx_domain =irq_domain_add_linear (node, -PCI_NUM_INTX , &intx_domain_ops, pcie); + pcie->intx_domain =irq_domain_add_linear (node,PCI_NUM_INTX , + &intx_domain_ops, pcie);if (!pcie->intx_domain) {dev_err (dev,"Failed to get a INTx IRQ domain\n" );
@@ -917,10 +930,10 @@ MODULE_DEVICE_TABLE(of, mobiveil_pcie_of_match);static struct platform_driver mobiveil_pcie_driver = { .probe = mobiveil_pcie_probe, .driver = { - .name ="mobiveil-pcie" , - .of_match_table = mobiveil_pcie_of_match, - .suppress_bind_attrs = true, - }, + .name ="mobiveil-pcie" , + .of_match_table = mobiveil_pcie_of_match, + .suppress_bind_attrs = true, + }, };builtin_platform_driver (mobiveil_pcie_driver);
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 3/23 PCI: mobiveil: correct the returned error number
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
This patch corrected the returned error number by convention, and removed a unnecessary error check.
--- drivers/pci/controller/pcie-mobiveil.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +3 -5
@@ -819,7 +819,7 @@ static int mobiveil_pcie_init_irq_domain(struct mobiveil_pcie *pcie)if (!pcie->intx_domain) {dev_err (dev,"Failed to get a INTx IRQ domain\n" ); -return -ENODEV ; +return -ENOMEM ; }raw_spin_lock_init (&pcie->intx_mask_lock);
@@ -845,11 +845,9 @@ static int mobiveil_pcie_probe(struct platform_device *pdev)/* allocate the PCIe port */ bridge =devm_pci_alloc_host_bridge (dev,sizeof (*pcie));if (!bridge) -return -ENODEV ; +return -ENOMEM ; pcie =pci_host_bridge_priv (bridge); -if (!pcie) -return -ENOMEM ; pcie->pdev = pdev;
@@ -866,7 +864,7 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) &pcie->resources, &iobase);if (ret) {dev_err (dev,"Getting bridge resources failed\n" ); -return -ENOMEM ; +return ret; }/*
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 4/23 PCI: mobiveil: remove flag MSI_FLAG_MULTI_PCI_MSI
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
The current code does not support multiple MSIs, so remove the corresponding flag from the msi_domain_info structure.
--- drivers/pci/controller/pcie-mobiveil.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/controller/pcie-mobiveil.c +1 -1
@@ -703,7 +703,7 @@ static struct irq_chip mobiveil_msi_irq_chip = {static struct msi_domain_info mobiveil_msi_domain_info = { .flags = (MSI_FLAG_USE_DEF_DOM_OPS |MSI_FLAG_USE_DEF_CHIP_OPS | -MSI_FLAG_MULTI_PCI_MSI |MSI_FLAG_PCI_MSIX ), +MSI_FLAG_PCI_MSIX ), .chip = &mobiveil_msi_irq_chip, };
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 5/23 PCI: mobiveil: correct PCI base address in MEM/IO outbound windows
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
It should get PCI base address from the DT node property 'ranges' to setup MEM/IO outbound windows instead of always zero.
--- drivers/pci/controller/pcie-mobiveil.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +3 -2
@@ -630,8 +630,9 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)/* configure outbound translation window */ program_ob_windows (pcie, pcie->ob_wins_configured, - win->res->start,0 , type, -resource_size (win->res)); + win->res->start, + win->res->start - win->offset, + type,resource_size (win->res)); }/* setup MSI hardware registers */
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 6/23 PCI: mobiveil: replace the resource list iteration function
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
As it won't delete any node in this iteration, replaced the function resource_list_for_each_entry_safe() with the resource_list_for_each_entry().
--- drivers/pci/controller/pcie-mobiveil.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +2 -2
@@ -569,7 +569,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) {u32 value, pab_ctrl, type;int err; -struct resource_entry *win, *tmp; +struct resource_entry *win; err =mobiveil_bringup_link (pcie);if (err) {
@@ -620,7 +620,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)program_ib_windows (pcie,WIN_NUM_1 ,0 ,MEM_WINDOW_TYPE ,IB_WIN_SIZE );/* Get the I/O and memory ranges from DT */ -resource_list_for_each_entry_safe (win, tmp, &pcie->resources) { +resource_list_for_each_entry (win, &pcie->resources) {if (resource_type (win->res) ==IORESOURCE_MEM ) type =MEM_WINDOW_TYPE ;else if (resource_type (win->res) ==IORESOURCE_IO )
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 7/23 PCI: mobiveil: use WIN_NUM_0 explicitly for CFG outbound window
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
As the .map_bus() use the WIN_NUM_0 for CFG transactions, it's better passing WIN_NUM_0 explicitly when initialize the CFG outbound window.
--- drivers/pci/controller/pcie-mobiveil.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +2 -3
@@ -612,9 +612,8 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)*/ /* config outbound translation window */ -program_ob_windows (pcie, pcie->ob_wins_configured, - pcie->ob_io_res->start,0 ,CFG_WINDOW_TYPE , -resource_size (pcie->ob_io_res)); +program_ob_windows (pcie,WIN_NUM_0 , pcie->ob_io_res->start,0 , +CFG_WINDOW_TYPE ,resource_size (pcie->ob_io_res));/* memory inbound translation window */ program_ib_windows (pcie,WIN_NUM_1 ,0 ,MEM_WINDOW_TYPE ,IB_WIN_SIZE );
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 8/23 PCI: mobiveil: use the 1st inbound window for MEM inbound transactions
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
The inbound windows have different register set with outbound windows. This patch change the MEM inbound window to the first one.
--- drivers/pci/controller/pcie-mobiveil.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/controller/pcie-mobiveil.c +1 -1
@@ -616,7 +616,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) CFG_WINDOW_TYPE, resource_size(pcie->ob_io_res));/* memory inbound translation window */ -program_ib_windows (pcie,WIN_NUM_1 ,0 ,MEM_WINDOW_TYPE ,IB_WIN_SIZE ); +program_ib_windows (pcie,WIN_NUM_0 ,0 ,MEM_WINDOW_TYPE ,IB_WIN_SIZE );/* Get the I/O and memory ranges from DT */ resource_list_for_each_entry (win, &pcie->resources) {
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 9/23 PCI: mobiveil: correct the inbound/outbound window setup routine
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Outbound window routine:
- Removed unused var definition and register read operations.
- Added the upper 32-bit cpu address setup of the window.
- Instead of blindly write, only change the fields specified.
- Masked the lower bits of window size in case override the control bits.
- Check if the passing window number is available, instead of the total number of the initialized windows.
Inbound window routine:
- Added parameter 'u64 cpu_addr' to specify the cpu address of the window instead of using 'pci_addr'.
- Changed 'int pci_addr' to 'u64 pci_addr', and added setup of the upper 32-bit pci address of the window.
- Moved the PCIe PIO master enablement to mobiveil_host_init().
- Instead of blindly write, only change the fields specified.
- Masked the lower bits of window size in case override the control bits.
- Check if the passing window number is available, instead of the total number of the initialized windows.
- And added the statistic of initialized inbound windows.
--- drivers/pci/controller/pcie-mobiveil.c | 69 +++++++++++++++----------- 1 file changed, 41 insertions(+), 28 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +41 -28
@@ -65,9 +65,13 @@#define PAB_AXI_AMAP_CTRL (win) PAB_REG_ADDR(0x0ba0, win)#define WIN_ENABLE_SHIFT 0#define WIN_TYPE_SHIFT 1 +#define WIN_TYPE_MASK 0x3 +#define WIN_SIZE_SHIFT 10 +#define WIN_SIZE_MASK 0x3fffff#define PAB_EXT_AXI_AMAP_SIZE (win) PAB_EXT_REG_ADDR(0xbaf0, win) +#define PAB_EXT_AXI_AMAP_AXI_WIN (win) PAB_EXT_REG_ADDR(0x80a0, win)#define PAB_AXI_AMAP_AXI_WIN (win) PAB_REG_ADDR(0x0ba4, win)#define AXI_WINDOW_ALIGN_MASK 3
@@ -82,8 +86,10 @@#define PAB_PEX_AMAP_CTRL (win) PAB_REG_ADDR(0x4ba0, win)#define AMAP_CTRL_EN_SHIFT 0#define AMAP_CTRL_TYPE_SHIFT 1 +#define AMAP_CTRL_TYPE_MASK 3#define PAB_EXT_PEX_AMAP_SIZEN (win) PAB_EXT_REG_ADDR(0xbef0, win) +#define PAB_EXT_PEX_AMAP_AXI_WIN (win) PAB_EXT_REG_ADDR(0xb4a0, win)#define PAB_PEX_AMAP_AXI_WIN (win) PAB_REG_ADDR(0x4ba4, win)#define PAB_PEX_AMAP_PEX_WIN_L (win) PAB_REG_ADDR(0x4ba8, win)#define PAB_PEX_AMAP_PEX_WIN_H (win) PAB_REG_ADDR(0x4bac, win)
@@ -455,49 +461,50 @@ static int mobiveil_pcie_parse_dt(struct mobiveil_pcie *pcie) }static void program_ib_windows (struct mobiveil_pcie *pcie,int win_num, -int pci_addr,u32 type,u64 size) +u64 cpu_addr,u64 pci_addr,u32 type,u64 size) { -int pio_ctrl_val; -int amap_ctrl_dw; +u32 value;u64 size64 = ~(size -1 ); -if ((pcie->ib_wins_configured +1 ) > pcie->ppio_wins) { +if (win_num >= pcie->ppio_wins) {dev_err (&pcie->pdev->dev,"ERROR: max inbound windows reached !\n" );return ; } - pio_ctrl_val =csr_readl (pcie,PAB_PEX_PIO_CTRL ); - pio_ctrl_val |=1 <<PIO_ENABLE_SHIFT ; -csr_writel (pcie, pio_ctrl_val,PAB_PEX_PIO_CTRL ); - - amap_ctrl_dw =csr_readl (pcie,PAB_PEX_AMAP_CTRL (win_num)); - amap_ctrl_dw |= (type <<AMAP_CTRL_TYPE_SHIFT ) | - (1 <<AMAP_CTRL_EN_SHIFT ) | -lower_32_bits (size64); -csr_writel (pcie, amap_ctrl_dw,PAB_PEX_AMAP_CTRL (win_num)); + value =csr_readl (pcie,PAB_PEX_AMAP_CTRL (win_num)); + value &= ~(AMAP_CTRL_TYPE_MASK <<AMAP_CTRL_TYPE_SHIFT ); + value |= (type <<AMAP_CTRL_TYPE_SHIFT ) | (1 <<AMAP_CTRL_EN_SHIFT ) | + (lower_32_bits (size64) &WIN_SIZE_MASK <<WIN_SIZE_SHIFT ); +csr_writel (pcie, value,PAB_PEX_AMAP_CTRL (win_num));csr_writel (pcie,upper_32_bits (size64),PAB_EXT_PEX_AMAP_SIZEN (win_num)); -csr_writel (pcie, pci_addr,PAB_PEX_AMAP_AXI_WIN (win_num)); +csr_writel (pcie,lower_32_bits (cpu_addr), +PAB_PEX_AMAP_AXI_WIN (win_num)); +csr_writel (pcie,upper_32_bits (cpu_addr), +PAB_EXT_PEX_AMAP_AXI_WIN (win_num)); + +csr_writel (pcie,lower_32_bits (pci_addr), +PAB_PEX_AMAP_PEX_WIN_L (win_num)); +csr_writel (pcie,upper_32_bits (pci_addr), +PAB_PEX_AMAP_PEX_WIN_H (win_num)); -csr_writel (pcie, pci_addr,PAB_PEX_AMAP_PEX_WIN_L (win_num)); -csr_writel (pcie,0 ,PAB_PEX_AMAP_PEX_WIN_H (win_num)); + pcie->ib_wins_configured++; }/* * routine to program the outbound windows */ static void program_ob_windows (struct mobiveil_pcie *pcie,int win_num, -u64 cpu_addr,u64 pci_addr, -u32 config_io_bit,u64 size) +u64 cpu_addr,u64 pci_addr,u32 type,u64 size) { -u32 value, type; +u32 value;u64 size64 = ~(size -1 ); -if ((pcie->ob_wins_configured +1 ) > pcie->apio_wins) { +if (win_num >= pcie->apio_wins) {dev_err (&pcie->pdev->dev,"ERROR: max outbound windows reached !\n" );return ;
@@ -507,10 +514,12 @@ static void program_ob_windows(struct mobiveil_pcie *pcie, int win_num,* program Enable Bit to 1, Type Bit to (00) base 2, AXI Window Size Bit * to 4 KB in PAB_AXI_AMAP_CTRL register */ - type = config_io_bit; value =csr_readl (pcie,PAB_AXI_AMAP_CTRL (win_num)); -csr_writel (pcie,1 <<WIN_ENABLE_SHIFT | type <<WIN_TYPE_SHIFT | -lower_32_bits (size64),PAB_AXI_AMAP_CTRL (win_num)); + value &= ~(WIN_TYPE_MASK <<WIN_TYPE_SHIFT | +WIN_SIZE_MASK <<WIN_SIZE_SHIFT ); + value |=1 <<WIN_ENABLE_SHIFT | type <<WIN_TYPE_SHIFT | + (lower_32_bits (size64) &WIN_SIZE_MASK <<WIN_SIZE_SHIFT ); +csr_writel (pcie, value,PAB_AXI_AMAP_CTRL (win_num));csr_writel (pcie,upper_32_bits (size64),PAB_EXT_AXI_AMAP_SIZE (win_num));
@@ -518,11 +527,10 @@ static void program_ob_windows(struct mobiveil_pcie *pcie, int win_num,* program AXI window base with appropriate value in * PAB_AXI_AMAP_AXI_WIN0 register */ - value =csr_readl (pcie,PAB_AXI_AMAP_AXI_WIN (win_num)); -csr_writel (pcie, cpu_addr & (~AXI_WINDOW_ALIGN_MASK ), +csr_writel (pcie,lower_32_bits (cpu_addr) & (~AXI_WINDOW_ALIGN_MASK ),PAB_AXI_AMAP_AXI_WIN (win_num)); - - value =csr_readl (pcie,PAB_AXI_AMAP_PEX_WIN_H (win_num)); +csr_writel (pcie,upper_32_bits (cpu_addr), +PAB_EXT_AXI_AMAP_AXI_WIN (win_num));csr_writel (pcie,lower_32_bits (pci_addr),PAB_AXI_AMAP_PEX_WIN_L (win_num));
@@ -604,6 +612,11 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) value |=APIO_EN_MASK ;csr_writel (pcie, value,PAB_AXI_PIO_CTRL ); +/* Enable PCIe PIO master */ + value =csr_readl (pcie,PAB_PEX_PIO_CTRL ); + value |=1 <<PIO_ENABLE_SHIFT ; +csr_writel (pcie, value,PAB_PEX_PIO_CTRL ); +/* * we'll program one outbound window for config reads and * another default inbound window for all the upstream traffic
@@ -616,7 +629,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) CFG_WINDOW_TYPE, resource_size(pcie->ob_io_res));/* memory inbound translation window */ -program_ib_windows (pcie,WIN_NUM_0 ,0 ,MEM_WINDOW_TYPE ,IB_WIN_SIZE ); +program_ib_windows (pcie,WIN_NUM_0 ,0 ,0 ,MEM_WINDOW_TYPE ,IB_WIN_SIZE );/* Get the I/O and memory ranges from DT */ resource_list_for_each_entry (win, &pcie->resources) {
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 10/23 PCI: mobiveil: fix the INTx process error
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
In the loop block, there is not code change the loop key, this patch updated the loop key by re-read the INTx status register.
This patch also change to clear the handled INTx status.
Note: Need MV to test this change.
--- drivers/pci/controller/pcie-mobiveil.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +9 -4
@@ -361,6 +361,7 @@ static void mobiveil_pcie_isr(struct irq_desc *desc)/* Handle INTx */ if (intr_status &PAB_INTP_INTX_MASK ) { shifted_status =csr_readl (pcie,PAB_INTP_AMBA_MISC_STAT ); + shifted_status &=PAB_INTP_INTX_MASK ; shifted_status >>=PAB_INTX_START ; do { for_each_set_bit(bit, &shifted_status, PCI_NUM_INTX) {
@@ -372,12 +373,16 @@ static void mobiveil_pcie_isr(struct irq_desc *desc)dev_err_ratelimited (dev,"unexpected IRQ, INT%d\n" , bit); -/* clear interrupt */ -csr_writel (pcie, - shifted_status <<PAB_INTX_START , +/* clear interrupt handled */ +csr_writel (pcie,1 << (PAB_INTX_START + bit),PAB_INTP_AMBA_MISC_STAT ); } - }while ((shifted_status >>PAB_INTX_START ) !=0 ); + + shifted_status =csr_readl (pcie, +PAB_INTP_AMBA_MISC_STAT ); + shifted_status &=PAB_INTP_INTX_MASK ; + shifted_status >>=PAB_INTX_START ; + }while (shifted_status !=0 ); }/* read extra MSI status register */
Signature · 1 line
2.17.1
Z.q. Hou
maintainerRE: [PATCH 10/23] PCI: mobiveil: fix the INTx process error
Hi Subrahmanya,
As NXP does not integrate Mobiveil's INTx and MSI interrupt controller, I am unable to test this fix. Can you help to test this fix?
Thanks,
Zhiqiang
Quoted 64 lines
-----Original Message-----
From: Z.q. Hou
Sent: 2018?11?6? 21:20
To: linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in; shawnguo at kernel.org; Leo Li <[email protected]>; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>; Z.q. Hou <[email protected]>
Subject: [PATCH 10/23] PCI: mobiveil: fix the INTx process errorFrom: Hou Zhiqiang <[email protected]>
In the loop block, there is not code change the loop key, this patch updated the loop key by re-read the INTx status register.
This patch also change to clear the handled INTx status.
Note: Need MV to test this change.
Signed-off-by Hou Zhiqiang <[email protected]>--- drivers/pci/controller/pcie-mobiveil.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)drivers/pci/controller/pcie-mobiveil.c +1
-1@@ -361,6 +361,7 @@ static void mobiveil_pcie_isr(struct irq_desc *desc) /* Handle INTx */ if (intr_status & PAB_INTP_INTX_MASK) { shifted_status = csr_readl(pcie, PAB_INTP_AMBA_MISC_STAT); + shifted_status &= PAB_INTP_INTX_MASK; shifted_status >>= PAB_INTX_START; do { for_each_set_bit(bit, &shifted_status, PCI_NUM_INTX) { @@ -372,12 +373,16 @@ static void mobiveil_pcie_isr(struct irq_desc *desc) dev_err_ratelimited(dev, "unexpected IRQ,INT%d\n",
drivers/pci/controller/pcie-mobiveil.c +8
-5bit); -/* clear interrupt */ -csr_writel (pcie, - shifted_status <<PAB_INTX_START , +/* clear interrupt handled */ +csr_writel (pcie,1 << (PAB_INTX_START + bit),PAB_INTP_AMBA_MISC_STAT ); } - }while ((shifted_status >>PAB_INTX_START ) !=0 ); + + shifted_status =csr_readl (pcie, +PAB_INTP_AMBA_MISC_STAT ); + shifted_status &=PAB_INTP_INTX_MASK ; + shifted_status >>=PAB_INTX_START ; + }while (shifted_status !=0 ); }/* read extra MSI status register */ --2.17.1
Z.q. Hou
maintainerPATCH 11/23 PCI: mobiveil: only fixup the Class Code field
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Fixup the Class Code to PCI bridge, do not change the Revision ID. And move the fixup to *_host_init function.
--- drivers/pci/controller/pcie-mobiveil.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +6 -3
@@ -652,6 +652,12 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) type, resource_size(win->res)); } +/* fixup for PCIe class register */ + value =csr_readl (pcie,PAB_INTP_AXI_PIO_CLASS ); + value &=0xff ; + value |= (PCI_CLASS_BRIDGE_PCI <<16 ); +csr_writel (pcie, value,PAB_INTP_AXI_PIO_CLASS ); +/* setup MSI hardware registers */ mobiveil_pcie_enable_msi (pcie);
@@ -895,9 +901,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) goto error; } -/* fixup for PCIe class register */ -csr_writel (pcie,0x060402ab ,PAB_INTP_AXI_PIO_CLASS ); -/* initialize the IRQ domains */ ret =mobiveil_pcie_init_irq_domain (pcie);if (ret) {
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 12/23 PCI: mobiveil: move out the link up waiting from mobiveil_host_init
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Host initial sequence does not depend on PCIe link up, so move it to the place just before the enumeration.
--- drivers/pci/controller/pcie-mobiveil.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +7 -8
@@ -581,15 +581,8 @@ static void mobiveil_pcie_enable_msi(struct mobiveil_pcie *pcie)static int mobiveil_host_init (struct mobiveil_pcie *pcie) {u32 value, pab_ctrl, type; -int err;struct resource_entry *win; - err =mobiveil_bringup_link (pcie); -if (err) { -dev_info (&pcie->pdev->dev,"link bring-up failed\n" ); -return err; - } -/* * program Bus Master Enable Bit in Command Register in PAB Config * Space
@@ -661,7 +654,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)/* setup MSI hardware registers */ mobiveil_pcie_enable_msi (pcie); -return err; +return 0 ; }static void mobiveil_mask_intx_irq (struct irq_data *data)
@@ -921,6 +914,12 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) bridge->map_irq = of_irq_parse_and_map_pci; bridge->swizzle_irq = pci_common_swizzle; + ret =mobiveil_bringup_link (pcie); +if (ret) { +dev_info (dev,"link bring-up failed\n" ); + goto error; + } +/* setup the kernel resources for the newly added PCIe root bus */ ret =pci_scan_root_bus_bridge (bridge);if (ret)
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 13/23 PCI: mobiveil: move irq chained handler setup out of DT parse
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Move irq_set_chained_handler_and_data() out of DT parse function.
--- drivers/pci/controller/pcie-mobiveil.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/pci/controller/pcie-mobiveil.c +2 -2
@@ -460,8 +460,6 @@ static int mobiveil_pcie_parse_dt(struct mobiveil_pcie *pcie)return -ENODEV ; } -irq_set_chained_handler_and_data (pcie->irq, mobiveil_pcie_isr, pcie); -return 0 ; }
@@ -901,6 +899,8 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) goto error; } +irq_set_chained_handler_and_data (pcie->irq, mobiveil_pcie_isr, pcie); + ret =devm_request_pci_bus_resources (dev, &pcie->resources);if (ret) goto error;
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 14/23 PCI: mobiveil: initialize Primary/Secondary/Subordinate bus number
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
The reset value is all zero, so set a workable value for Primary, Secondary and Subordinate bus numbers.
--- drivers/pci/controller/pcie-mobiveil.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/pci/controller/pcie-mobiveil.c +6 -0
@@ -581,6 +581,12 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)u32 value, pab_ctrl, type;struct resource_entry *win; +/* setup bus numbers */ + value =csr_readl (pcie,PCI_PRIMARY_BUS ); + value &=0xff000000 ; + value |=0x00ff0100 ; +csr_writel (pcie, value,PCI_PRIMARY_BUS ); +/* * program Bus Master Enable Bit in Command Register in PAB Config * Space
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 15/23 dt-bindings: pci: mobiveil: change gpio_slave and apb_csr to optional
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Change the "gpio_slave" and "apb_csr" to optional, the "gpio_slave" is not used in current code, and "apb_csr" is not used by some platorms.
--- Documentation/devicetree/bindings/pci/mobiveil-pcie.txt | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/pci/mobiveil-pcie.txt +2 -0
@@ -10,8 +10,10 @@ Required properties: interrupt source. The value must be 1. - compatible: Should contain "mbvl,gpex40-pcie" - reg: Should contain PCIe registers location and length + Mandatory: "config_axi_slave": PCIe controller registers "csr_axi_slave" : Bridge config registers + Optional: "gpio_slave" : GPIO registers to control slot power "apb_csr" : MSI registers
Signature · 1 line
2.17.1
Rob Herring
maintainerPATCH 15/23 dt-bindings: pci: mobiveil: change gpio_slave and apb_csr to optional
Quoted 10 lines · Z.q. Hou
From: Hou Zhiqiang <[email protected]>
Change the "
gpio_slave" and "apb_csr" to optional, the "gpio_slave" is not used in current code, and "apb_csr" is not used by some platorms.Signed-off-by Hou Zhiqiang <[email protected]>--- Documentation/devicetree/bindings/pci/mobiveil-pcie.txt | 2 ++ 1 file changed, 2 insertions(+)
Z.q. Hou
maintainerRE: [PATCH 15/23] dt-bindings: pci: mobiveil: change gpio_slave and apb_csr to optional
Hi Rob,
Thanks a lot for your ACK!
Quoted 21 lines
-----Original Message-----
From: Rob Herring <[email protected]>
Sent: 2018?11?13? 2:13
To: Z.q. Hou <[email protected]>
Cc: linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; mark.rutland at arm.com;
l.subrahmanya at mobiveil.co.in; shawnguo at kernel.org; Leo Li <[email protected]>; lorenzo.pieralisi at arm.com; Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>
Subject: Re: [PATCH 15/23] dt-bindings: pci: mobiveil: changegpio_slaveandapb_csrto optionalQuoted 6 lines · Z.q. Hou
From: Hou Zhiqiang <[email protected]>
Change the "
gpio_slave" and "apb_csr" to optional, the "gpio_slave" is not used in current code, and "apb_csr" is not used by some platorms.
Quoted 6 lines
Quoted 4 lines
Signed-off-by Hou Zhiqiang <[email protected]>--- Documentation/devicetree/bindings/pci/mobiveil-pcie.txt | 2 ++ 1 file changed, 2 insertions(+)Acked-by Rob Herring <[email protected]>
Regards,
Zhiqiang
Re: [PATCH 15/23] dt-bindings: pci: mobiveil: change gpio_slave and apb_csr to optional
In reply to Z.q. HouQuoted 30 lines · Z.q. Hou
From: Hou Zhiqiang <[email protected]>
Change the "
gpio_slave" and "apb_csr" to optional, the "gpio_slave" is not used in current code, and "apb_csr" is not used by some platorms.Signed-off-by Hou Zhiqiang <[email protected]>--- Documentation/devicetree/bindings/pci/mobiveil-pcie.txt | 2 ++ 1 file changed, 2 insertions(+)Documentation/devicetree/bindings/pci/mobiveil-pcie.txt +2
-1@@ -10,8 +10,10 @@ Required properties: interrupt source. The value must be 1. - compatible: Should contain "mbvl,gpex40-pcie" - reg: Should contain PCIe registers location and length + Mandatory: "config_axi_slave": PCIe controller registers "csr_axi_slave" : Bridge config registers + Optional: "gpio_slave" : GPIO registers to control slot power "apb_csr" : MSI registers --2.17.1
Z.q. Hou
maintainerRE: [PATCH 15/23] dt-bindings: pci: mobiveil: change gpio_slave and apb_csr to optional
Hi Subrahmanya,
Thanks a lot for your ACK!
Regards,
Zhiqiang
Quoted 47 lines
-----Original Message-----
From: Subrahmanya Lingappa <[email protected]>
Sent: 2018?11?14? 17:33
To: Z.q. Hou <[email protected]>
Cc: linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; Bjorn Helgaas <[email protected]>; robh+dt at kernel.org; mark.rutland at arm.com; shawnguo at kernel.org; Leo Li <[email protected]>; Lorenzo Pieralisi <[email protected]>; Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>
Subject: Re: [PATCH 15/23] dt-bindings: pci: mobiveil: changegpio_slaveandapb_csrto optionalQuoted 31 lines · Z.q. Hou
From: Hou Zhiqiang <[email protected]>
Change the "
gpio_slave" and "apb_csr" to optional, the "gpio_slave" is not used in current code, and "apb_csr" is not used by some platorms.Signed-off-by Hou Zhiqiang <[email protected]>--- Documentation/devicetree/bindings/pci/mobiveil-pcie.txt | 2 ++ 1 file changed, 2 insertions(+)Documentation/devicetree/bindings/pci/mobiveil-pcie.txt +2
-1@@ -10,8 +10,10 @@ Required properties: interrupt source. The value must be 1. - compatible: Should contain "mbvl,gpex40-pcie" - reg: Should contain PCIe registers location and length + Mandatory: "config_axi_slave": PCIe controller registers "csr_axi_slave" : Bridge config registers + Optional: "gpio_slave" : GPIO registers to control slot power "apb_csr" : MSI registers --2.17.1
Z.q. Hou
maintainerPATCH 16/23 PCI: mobiveil: refactor the Mobiveil driver
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
As the Mobiveil PCIe controller support RC&EP DAUL mode, and to make Platforms which integrated the Mobiveil PCIe IP more easy to add their drivers, this patch moved the Mobiveil driver to a new directory 'drivers/pci/controller/mobiveil' and refactored it to different file according to the abstraction of RC&EP(TODO).
---
MAINTAINERS | 2 +-
drivers/pci/controller/Kconfig | 11 +-
drivers/pci/controller/Makefile | 2 +-
drivers/pci/controller/mobiveil/Kconfig | 24 +
drivers/pci/controller/mobiveil/Makefile | 4 +
.../pcie-mobiveil-host.c} | 520 +++---------------
.../controller/mobiveil/pcie-mobiveil-plat.c | 54 ++
.../pci/controller/mobiveil/pcie-mobiveil.c | 227 ++++++++
.../pci/controller/mobiveil/pcie-mobiveil.h | 187 +++++++
9 files changed, 582 insertions(+), 449 deletions(-)
create mode 100644 drivers/pci/controller/mobiveil/Kconfig
create mode 100644 drivers/pci/controller/mobiveil/Makefile
rename drivers/pci/controller/{pcie-mobiveil.c => mobiveil/pcie-mobiveil-host.c} (55%)
create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c
create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.c
create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.hMAINTAINERS +1 -1
@@ -11294,7 +11294,7 @@ M: Subrahmanya Lingappa <[email protected]> L: linux-pci at vger.kernel.org S: Supported F: Documentation/devicetree/bindings/pci/mobiveil-pcie.txt -F: drivers/pci/controller/pcie-mobiveil.c +F: drivers/pci/controller/mobiveil/pcie-mobiveil* PCI DRIVER FOR MVEBU (Marvell Armada 370 and Armada XP SOC support) M: Thomas Petazzoni <[email protected]>
drivers/pci/controller/Kconfig +1 -10
@@ -239,16 +239,6 @@ config PCIE_MEDIATEK Say Y here if you want to enable PCIe controller support on MediaTek SoCs. -config PCIE_MOBIVEIL - bool "Mobiveil AXI PCIe controller" - depends on ARCH_ZYNQMP || COMPILE_TEST - depends on OF - depends on PCI_MSI_IRQ_DOMAIN - help - Say Y here if you want to enable support for the Mobiveil AXI PCIe - Soft IP. It has up to 8 outbound and inbound windows - for address translation and it is a PCIe Gen4 IP. - config PCIE_TANGO_SMP8759 bool "Tango SMP8759 PCIe controller (DANGEROUS)" depends on ARCH_TANGO && PCI_MSI && OF
@@ -279,4 +269,5 @@ config VMD module will be called vmd. source "drivers/pci/controller/dwc/Kconfig" +source "drivers/pci/controller/mobiveil/Kconfig" endmenu
drivers/pci/controller/Makefile +1 -1
@@ -26,11 +26,11 @@ obj-$(CONFIG_PCIE_ROCKCHIP) += pcie-rockchip.o obj-$(CONFIG_PCIE_ROCKCHIP_EP) += pcie-rockchip-ep.o obj-$(CONFIG_PCIE_ROCKCHIP_HOST) += pcie-rockchip-host.o obj-$(CONFIG_PCIE_MEDIATEK) += pcie-mediatek.o -obj-$(CONFIG_PCIE_MOBIVEIL) += pcie-mobiveil.o obj-$(CONFIG_PCIE_TANGO_SMP8759) += pcie-tango.o obj-$(CONFIG_VMD) += vmd.o # pcie-hisi.o quirks are needed even without CONFIG_PCIE_DW obj-y += dwc/ +obj-y += mobiveil/ # The following drivers are for devices that use the generic ACPI
drivers/pci/controller/mobiveil/Kconfig new file +24 -0
@@ -0,0 +1,24 @@ +# SPDX-License-Identifier: GPL-2.0 + +menu "Mobiveil PCIe Core Support" + depends on PCI + +config PCIE_MOBIVEIL + bool + +config PCIE_MOBIVEIL_HOST + bool + depends on PCI_MSI_IRQ_DOMAIN + select PCIE_MOBIVEIL + +config PCIE_MOBIVEIL_PLAT + bool "Mobiveil AXI PCIe controller" + depends on ARCH_ZYNQMP || COMPILE_TEST + depends on OF + select PCIE_MOBIVEIL_HOST + help + Say Y here if you want to enable support for the Mobiveil AXI PCIe + Soft IP. It has up to 8 outbound and inbound windows + for address translation and it is a PCIe Gen4 IP. + +endmenu
drivers/pci/controller/mobiveil/Makefile new file +4 -0
@@ -0,0 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_PCIE_MOBIVEIL) += pcie-mobiveil.o +obj-$(CONFIG_PCIE_MOBIVEIL_HOST) += pcie-mobiveil-host.o +obj-$(CONFIG_PCIE_MOBIVEIL_PLAT) += pcie-mobiveil-plat.o
drivers/pci/controller/mobiveil/pcie-mobiveil-host.c renamed from drivers/pci/controller/pcie-mobiveil.c +83 -437
702 lines not on this page · raw message
drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c new file +54 -0
54 lines not on this page · raw message
drivers/pci/controller/mobiveil/pcie-mobiveil.c new file +227 -0
227 lines not on this page · raw message
drivers/pci/controller/mobiveil/pcie-mobiveil.h new file +187 -0
187 lines not on this page · raw message
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 17/23 PCI: mobiveil: continue to initialize the host upon no PCIe link
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Sometimes there is not a PCIe Endpoint in the PCIe slot, so do not exit when the PCIe link is not up. And degrade the print level of link up info.
--- drivers/pci/controller/mobiveil/pcie-mobiveil-host.c | 1 - drivers/pci/controller/mobiveil/pcie-mobiveil.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-)
drivers/pci/controller/mobiveil/pcie-mobiveil-host.c +0 -1
@@ -591,7 +591,6 @@ int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie) ret =mobiveil_bringup_link (pcie);if (ret) {dev_info (dev,"link bring-up failed\n" ); - goto error; }/* setup the kernel resources for the newly added PCIe root bus */
drivers/pci/controller/mobiveil/pcie-mobiveil.c +1 -1
@@ -221,7 +221,7 @@ int mobiveil_bringup_link(struct mobiveil_pcie *pcie)usleep_range (LINK_WAIT_MIN ,LINK_WAIT_MAX ); } -dev_err (&pcie->pdev->dev,"link never came up\n" ); +dev_info (&pcie->pdev->dev,"link never came up\n" );return -ETIMEDOUT ; }
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 18/23 PCI: mobiveil: disabled IB and OB windows set by bootloader
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Disabled all inbound and outbound windows before set up the windows in kernel, in case transactions match the window set by bootloader.
--- .../controller/mobiveil/pcie-mobiveil-host.c | 7 +++++++ .../pci/controller/mobiveil/pcie-mobiveil.c | 18 ++++++++++++++++++ .../pci/controller/mobiveil/pcie-mobiveil.h | 2 ++ 3 files changed, 27 insertions(+)
drivers/pci/controller/mobiveil/pcie-mobiveil-host.c +7 -0
@@ -217,6 +217,13 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) {u32 value, pab_ctrl, type;struct resource_entry *win; +int i; + +/* Disable all inbound/outbound windows */ +for (i =0 ; i < pcie->apio_wins; i++) +mobiveil_pcie_disable_ob_win (pcie, i); +for (i =0 ; i < pcie->ppio_wins; i++) +mobiveil_pcie_disable_ib_win (pcie, i);/* setup bus numbers */ value =csr_readl (pcie,PCI_PRIMARY_BUS );
drivers/pci/controller/mobiveil/pcie-mobiveil.c +18 -0
@@ -225,3 +225,21 @@ int mobiveil_bringup_link(struct mobiveil_pcie *pcie)return -ETIMEDOUT ; } + +void mobiveil_pcie_disable_ib_win (struct mobiveil_pcie *pci,int win_num) +{ +u32 val; + + val =csr_readl (pci,PAB_PEX_AMAP_CTRL (win_num)); + val &= ~(1 <<AMAP_CTRL_EN_SHIFT ); +csr_writel (pci, val,PAB_PEX_AMAP_CTRL (win_num)); +} + +void mobiveil_pcie_disable_ob_win (struct mobiveil_pcie *pci,int win_num) +{ +u32 val; + + val =csr_readl (pci,PAB_AXI_AMAP_CTRL (win_num)); + val &= ~(1 <<WIN_ENABLE_SHIFT ); +csr_writel (pci, val,PAB_AXI_AMAP_CTRL (win_num)); +}
drivers/pci/controller/mobiveil/pcie-mobiveil.h +2 -0
@@ -171,6 +171,8 @@ void program_ob_windows(struct mobiveil_pcie *pcie, int win_num, u64 cpu_addr, u64 pci_addr, u32 type, u64 size);void program_ib_windows (struct mobiveil_pcie *pcie,int win_num,u64 cpu_addr,u64 pci_addr,u32 type,u64 size); +void mobiveil_pcie_disable_ob_win (struct mobiveil_pcie *pci,int win_num); +void mobiveil_pcie_disable_ib_win (struct mobiveil_pcie *pci,int win_num);u32 csr_read (struct mobiveil_pcie *pcie,u32 off,size_t size);void csr_write (struct mobiveil_pcie *pcie,u32 val,u32 off,size_t size);
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 19/23 PCI: mobiveil: add Byte and Half-Word width register accessors
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
As there are some Byte and Half-Work width registers in PCIe configuration space, add Byte and Half-Word width register accessors.
--- .../pci/controller/mobiveil/pcie-mobiveil.h | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/pci/controller/mobiveil/pcie-mobiveil.h +20 -0
@@ -181,9 +181,29 @@ static inline u32 csr_readl(struct mobiveil_pcie *pcie, u32 off)return csr_read (pcie, off,0x4 ); } +static inline u32 csr_readw (struct mobiveil_pcie *pcie,u32 off) +{ +return csr_read (pcie, off,0x2 ); +} + +static inline u32 csr_readb (struct mobiveil_pcie *pcie,u32 off) +{ +return csr_read (pcie, off,0x1 ); +} +static inline void csr_writel (struct mobiveil_pcie *pcie,u32 val,u32 off) {csr_write (pcie, val, off,0x4 ); } +static inline void csr_writew (struct mobiveil_pcie *pcie,u32 val,u32 off) +{ +csr_write (pcie, val, off,0x2 ); +} + +static inline void csr_writeb (struct mobiveil_pcie *pcie,u32 val,u32 off) +{ +csr_write (pcie, val, off,0x1 ); +} +#endif /* _PCIE_MOBIVEIL_H */
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 20/23 PCI: mobiveil: change prototype of function mobiveil_host_init
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Add a parameter 'bool reinit' to identify re-initializing the host controller, and export it.
--- .../pci/controller/mobiveil/pcie-mobiveil-host.c | 16 +++++++++------- drivers/pci/controller/mobiveil/pcie-mobiveil.h | 1 + 2 files changed, 10 insertions(+), 7 deletions(-)
drivers/pci/controller/mobiveil/pcie-mobiveil-host.c +9 -7
@@ -213,7 +213,7 @@ static void mobiveil_pcie_enable_msi(struct mobiveil_pcie *pcie)writel_relaxed (1 , pcie->apb_csr_base +MSI_ENABLE_OFFSET ); } -static int mobiveil_host_init (struct mobiveil_pcie *pcie) +int mobiveil_host_init (struct mobiveil_pcie *pcie,bool reinit) {u32 value, pab_ctrl, type;struct resource_entry *win;
@@ -225,11 +225,13 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie)for (i =0 ; i < pcie->ppio_wins; i++)mobiveil_pcie_disable_ib_win (pcie, i); -/* setup bus numbers */ - value =csr_readl (pcie,PCI_PRIMARY_BUS ); - value &=0xff000000 ; - value |=0x00ff0100 ; -csr_writel (pcie, value,PCI_PRIMARY_BUS ); +if (!reinit) { +/* setup bus numbers */ + value =csr_readl (pcie,PCI_PRIMARY_BUS ); + value &=0xff000000 ; + value |=0x00ff0100 ; +csr_writel (pcie, value,PCI_PRIMARY_BUS ); + }/* * program Bus Master Enable Bit in Command Register in PAB Config
@@ -570,7 +572,7 @@ int mobiveil_pcie_host_probe(struct mobiveil_pcie *pcie)* configure all inbound and outbound windows and prepare the RC for * config access */ - ret =mobiveil_host_init (pcie); + ret =mobiveil_host_init (pcie, false);if (ret) {dev_err (dev,"Failed to initialize host\n" ); goto error;
drivers/pci/controller/mobiveil/pcie-mobiveil.h +1 -0
@@ -165,6 +165,7 @@ struct mobiveil_pcie { };int mobiveil_pcie_host_probe (struct mobiveil_pcie *pcie); +int mobiveil_host_init (struct mobiveil_pcie *pcie,bool reinit);bool mobiveil_pcie_link_up (struct mobiveil_pcie *pcie);int mobiveil_bringup_link (struct mobiveil_pcie *pcie); void program_ob_windows(struct mobiveil_pcie *pcie, int win_num, u64 cpu_addr,
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 21/23 dt-bindings: pci: Add NXP LX SoCs PCIe controller
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
Add PCIe controller DT bindings of NXP LX series SoCs.
--- .../devicetree/bindings/pci/lx-pci.txt | 52 +++++++++++++++++++ MAINTAINERS | 8 +++ 2 files changed, 60 insertions(+) create mode 100644 Documentation/devicetree/bindings/pci/lx-pci.txt
Documentation/devicetree/bindings/pci/lx-pci.txt new file +52 -0
@@ -0,0 +1,52 @@ +NXP LX PCIe controller + +This PCIe controller is based on the Mobiveil PCIe IP and thus inherits all +the common properties defined in mobiveil-pcie.txt. + +Required properties: +- compatible: should contain the platform identifier such as: + "fsl,lx2160a-pcie" +- reg: base addresses and lengths of the PCIe controller register blocks. + "config_axi_slave": PCIe controller registers + "csr_axi_slave": Bridge config registers +- interrupts: A list of interrupt outputs of the controller. Must contain an + entry for each entry in the interrupt-names property. +- interrupt-names: It could include the following entries: + "intr": The interrupt that is asserted for controller interrupts + "aer": Asserted for aer interrupt when chip support the aer interrupt with + none MSI/MSI-X/INTx mode,but there is interrupt line for aer. + "pme": Asserted for pme interrupt when chip support the pme interrupt with + none MSI/MSI-X/INTx mode,but there is interrupt line for pme. +- dma-coherent: Indicates that the hardware IP block can ensure the coherency + of the data transferred from/to the IP block. This can avoid the software + cache flush/invalid actions, and improve the performance significantly. +- msi-parent : See the generic MSI binding described in + Documentation/devicetree/bindings/interrupt-controller/msi.txt. + +Example: + + pcie at 3400000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03400000 0x0 0x00100000 /* controller registers */ + 0x80 0x00000000 0x0 0x00001000>; /* configuration space */ + reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */ + <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */ + <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>; /* controller interrupt */ + interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + apio-wins = <8>; + ppio-wins = <8>; + dma-coherent; + bus-range = <0x0 0xff>; + msi-parent = <&its>; + ranges = <0x82000000 0x0 0x40000000 0x80 0x40000000 0x0 0x40000000>; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 2 &gic GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 3 &gic GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 4 &gic GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>; + };
MAINTAINERS +8 -0
@@ -11252,6 +11252,14 @@ L: linux-arm-kernel at lists.infradead.org S: Maintained F: drivers/pci/controller/dwc/*layerscape* +PCI DRIVER FOR NXP LX +M: Hou Zhiqiang <[email protected]> +L: linux-pci at vger.kernel.org +L: linux-arm-kernel at lists.infradead.org +S: Maintained +F: Documentation/devicetree/bindings/pci/lx-pci.txt +F: drivers/pci/controller/mobibeil/pci-lx.c + PCI DRIVER FOR GENERIC OF HOSTS M: Will Deacon <[email protected]> L: linux-pci at vger.kernel.org
Signature · 1 line
2.17.1
RE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controller
Quoted 15 lines
-----Original Message-----
From: Z.q. Hou
Sent: Tuesday, November 6, 2018 7:21 AM
To: linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in; shawnguo at kernel.org; Leo Li <[email protected]>; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>; Z.q. Hou <[email protected]>
Subject: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controller
Quoted 3 lines
From: Hou Zhiqiang <[email protected]>
Add PCIe controller DT bindings of NXP LX series SoCs.
I'm not sure if this is a good idea to name this controller LX PCIe controller. Right now, it could be true that it is only used on LX series SoCs. But I'm not sure if the LS series will not use this controller or LX series will only use this controller in the future.
Since the LX series is still using the layerscape branding, so probably we should keep using the layerscape-pci.txt and define the PCIe Gen4 variant?
Same comment for other places using the LX naming in this driver.
Quoted 104 lines
Signed-off-by Hou Zhiqiang <[email protected]>--- .../devicetree/bindings/pci/lx-pci.txt | 52 +++++++++++++++++++ MAINTAINERS | 8 +++ 2 files changed, 60 insertions(+) create mode 100644 Documentation/devicetree/bindings/pci/lx-pci.txtDocumentation/devicetree/bindings/pci/lx-pci.txt new file +18
-0@@ -0,0 +1,52 @@ +NXP LX PCIe controller + +This PCIe controller is based on the Mobiveil PCIe IP and thus inherits +all the common properties defined in mobiveil-pcie.txt. + +Required properties: +- compatible: should contain the platform identifier such as: + "fsl,lx2160a-pcie" +- reg: base addresses and lengths of the PCIe controller register blocks. + "config_axi_slave": PCIe controller registers + "csr_axi_slave": Bridge config registers +- interrupts: A list of interrupt outputs of the controller. Must +contain an + entry for each entry in the interrupt-names property. +- interrupt-names: It could include the following entries: + "intr": The interrupt that is asserted for controller interrupts + "aer": Asserted for aer interrupt when chip support the aer interrupt with + none MSI/MSI-X/INTx mode,but there is interrupt line foraer.
+ "pme": Asserted for pme interrupt when chip support the pme interrupt withDocumentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ none MSI/MSI-X/INTx mode,but there is interrupt line forpme.
+- dma-coherent: Indicates that the hardware IP block can ensure theDocumentation/devicetree/bindings/pci/lx-pci.txt new file +12
-0+coherency + of the data transferred from/to the IP block. This can avoid the +software + cache flush/invalid actions, and improve the performance significantly. +- msi-parent : See the generic MSI binding described in + Documentation/devicetree/bindings/interrupt-controller/msi.txt. + +Example: + + pcie at 3400000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03400000 0x0 0x00100000 /* controllerregisters */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ 0x80 0x00000000 0x0 0x00001000>; /* configurationspace */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +2
-0+ reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* AERinterrupt */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* PMEinterrupt */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>; /*controller interrupt */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +10
-0+ interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + apio-wins = <8>; + ppio-wins = <8>; + dma-coherent; + bus-range = <0x0 0xff>; + msi-parent = <&its>; + ranges = <0x82000000 0x0 0x40000000 0x80 0x40000000 0x0
0x40000000>;Documentation/devicetree/bindings/pci/lx-pci.txt new file +3
-0+ #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic GIC_SPI 109
IRQ_TYPE_LEVEL_HIGH>,Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <0000 0 0 2 &gic GIC_SPI 110
IRQ_TYPE_LEVEL_HIGH>,Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <0000 0 0 3 &gic GIC_SPI 111
IRQ_TYPE_LEVEL_HIGH>,Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <0000 0 0 4 &gic GIC_SPI 112
IRQ_TYPE_LEVEL_HIGH>;Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ };MAINTAINERS +8
-1@@ -11252,6 +11252,14 @@ L: linux-arm-kernel at lists.infradead.org S: Maintained F: drivers/pci/controller/dwc/*layerscape* +PCI DRIVER FOR NXP LX +M: Hou Zhiqiang <[email protected]> +L: linux-pci at vger.kernel.org +L: linux-arm-kernel at lists.infradead.org +S: Maintained +F: Documentation/devicetree/bindings/pci/lx-pci.txt +F: drivers/pci/controller/mobibeil/pci-lx.c + PCI DRIVER FOR GENERIC OF HOSTS M: Will Deacon <[email protected]> L: linux-pci at vger.kernel.org --2.17.1
Z.q. Hou
maintainerRE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controller
Hi Leo,
Thanks a lot for your comments!
Quoted 33 lines
-----Original Message-----
From: Leo Li
Sent: 2018?11?9? 5:29
To: Z.q. Hou <[email protected]>; linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in;
shawnguo at kernel.org; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>
Subject: RE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controllerQuoted 10 lines
-----Original Message-----
From: Z.q. Hou
Sent: Tuesday, November 6, 2018 7:21 AM
To: linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in; shawnguo at kernel.org; Leo Li <[email protected]>; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>; Z.q.Hou
Quoted 7 lines
<[email protected]>
Subject: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controllerFrom: Hou Zhiqiang <[email protected]>
Add PCIe controller DT bindings of NXP LX series SoCs.
Quoted 7 lines
I'm not sure if this is a good idea to name this controller LX PCIe controller. Right now, it could be true that it is only used on LX series SoCs. But I'm not sure if the LS series will not use this controller or LX series will only use this controller in the future.
Since the LX series is still using the layerscape branding, so probably we should keep using the layerscape-pci.txt and define the PCIe Gen4 variant?
Yes, will add the new PCIe IP bindings to Layerscape-pci.txt.
Quoted 2 lines
Same comment for other places using the LX naming in this driver.
Do you have any suggestion about how to name the driver and prefix of structures in the driver?
Quoted 95 lines
Quoted 5 lines
Signed-off-by Hou Zhiqiang <[email protected]>--- .../devicetree/bindings/pci/lx-pci.txt | 52+++++++++++++++++++
Quoted 18 lines
MAINTAINERS | 8 +++ 2 files changed, 60 insertions(+) create mode 100644 Documentation/devicetree/bindings/pci/lx-pci.txtDocumentation/devicetree/bindings/pci/lx-pci.txt new file +7
-0@@ -0,0 +1,52 @@ +NXP LX PCIe controller + +This PCIe controller is based on the Mobiveil PCIe IP and thus +inherits all the common properties defined in mobiveil-pcie.txt. + +Required properties: +- compatible: should contain the platform identifier such as:Documentation/devicetree/bindings/pci/lx-pci.txt line 17
Quoted 10 lines
Documentation/devicetree/bindings/pci/lx-pci.txt new file +10
-0+ "fsl,lx2160a-pcie" +- reg: base addresses and lengths of the PCIe controller register blocks. + "config_axi_slave": PCIe controller registers + "csr_axi_slave": Bridge config registers +- interrupts: A list of interrupt outputs of the controller. Must +contain an + entry for each entry in the interrupt-names property. +- interrupt-names: It could include the following entries: + "intr": The interrupt that is asserted for controller interrupts + "aer": Asserted for aer interrupt when chip support the aer interruptwith
Quoted 60 lines
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ none MSI/MSI-X/INTx mode,but there is interrupt line foraer.
+ "pme": Asserted for pme interrupt when chip support the pme
+ interrupt
withDocumentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ none MSI/MSI-X/INTx mode,but there is interrupt line forpme.
+- dma-coherent: Indicates that the hardware IP block can ensure theDocumentation/devicetree/bindings/pci/lx-pci.txt new file +12
-0+coherency + of the data transferred from/to the IP block. This can avoid the +software + cache flush/invalid actions, and improve the performance significantly. +- msi-parent : See the generic MSI binding described in + Documentation/devicetree/bindings/interrupt-controller/msi.txt. + +Example: + + pcie at 3400000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03400000 0x0 0x00100000 /* controllerregisters */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ 0x80 0x00000000 0x0 0x00001000>; /* configurationspace */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +2
-0+ reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* AERinterrupt */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* PMEinterrupt */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>; /*controller interrupt */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +10
-0+ interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + apio-wins = <8>; + ppio-wins = <8>; + dma-coherent; + bus-range = <0x0 0xff>; + msi-parent = <&its>; + ranges = <0x82000000 0x0 0x40000000 0x80 0x40000000 0x0
0x40000000>;Documentation/devicetree/bindings/pci/lx-pci.txt new file +3
-0+ #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic GIC_SPI 109
IRQ_TYPE_LEVEL_HIGH>,Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <0000 0 0 2 &gic GIC_SPI 110
IRQ_TYPE_LEVEL_HIGH>,Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <0000 0 0 3 &gic GIC_SPI 111
IRQ_TYPE_LEVEL_HIGH>,Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <0000 0 0 4 &gic GIC_SPI 112
IRQ_TYPE_LEVEL_HIGH>;Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ };MAINTAINERS index renamed from MAINTAINERS +0
-0
0c57ccff3188..7da555c8e2f5100644MAINTAINERS +0
-0@@ -11252,6 +11252,14 @@ L: linux-arm-kernel at lists.infradead.org S: Maintained F: drivers/pci/controller/dwc/*layerscape*
Quoted 13 lines
Quoted 12 lines
MAINTAINERS +8
-1+PCI DRIVER FOR NXP LX +M: Hou Zhiqiang <[email protected]> +L: linux-pci at vger.kernel.org +L: linux-arm-kernel at lists.infradead.org +S: Maintained +F: Documentation/devicetree/bindings/pci/lx-pci.txt +F: drivers/pci/controller/mobibeil/pci-lx.c + PCI DRIVER FOR GENERIC OF HOSTS M: Will Deacon <[email protected]> L: linux-pci at vger.kernel.org --Quoted 1 line
2.17.1
Thanks,
Zhiqiang
RE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controller
Quoted 61 lines
-----Original Message-----
From: Z.q. Hou
Sent: Sunday, November 11, 2018 5:48 PM
To: Leo Li <[email protected]>; linux-pci at vger.kernel.org; linux-arm- kernel at lists.infradead.org; devicetree at vger.kernel.org; linux- kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in; shawnguo at kernel.org; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>
Subject: RE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controllerHi Leo,
Thanks a lot for your comments!
Quoted 34 lines
-----Original Message-----
From: Leo Li
Sent: 2018?11?9? 5:29
To: Z.q. Hou <[email protected]>; linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in;
shawnguo at kernel.org; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>
Subject: RE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controllerQuoted 10 lines
-----Original Message-----
From: Z.q. Hou
Sent: Tuesday, November 6, 2018 7:21 AM
To: linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in; shawnguo at kernel.org; Leo Li <[email protected]>; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>; Z.q.Hou
Quoted 7 lines
<[email protected]>
Subject: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controllerFrom: Hou Zhiqiang <[email protected]>
Add PCIe controller DT bindings of NXP LX series SoCs.
Quoted 7 lines
I'm not sure if this is a good idea to name this controller LX PCIe controller. Right now, it could be true that it is only used on LX series SoCs. But I'm not sure if the LS series will not use this controller or LX series will only use this controller in the future.
Since the LX series is still using the layerscape branding, so probably we should keep using the layerscape-pci.txt and define the PCIe
Gen4 variant?
Quoted 7 lines
Yes, will add the new PCIe IP bindings to Layerscape-pci.txt.
Quoted 2 lines
Same comment for other places using the LX naming in this driver.
Do you have any suggestion about how to name the driver and prefix of structures in the driver?
Probably something like pcie-layerscape-gen4?
Quoted 112 lines
Quoted 97 lines
Quoted 6 lines
Signed-off-by Hou Zhiqiang <[email protected]>--- .../devicetree/bindings/pci/lx-pci.txt | 52+++++++++++++++++++
Quoted 19 lines
MAINTAINERS | 8 +++ 2 files changed, 60 insertions(+) create mode 100644 Documentation/devicetree/bindings/pci/lx-pci.txtDocumentation/devicetree/bindings/pci/lx-pci.txt new file +8
-0@@ -0,0 +1,52 @@ +NXP LX PCIe controller + +This PCIe controller is based on the Mobiveil PCIe IP and thus +inherits all the common properties defined in mobiveil-pcie.txt. + +Required properties: +- compatible: should contain the platform identifier such as: + "fsl,lx2160a-pcie"Documentation/devicetree/bindings/pci/lx-pci.txt line 18
Quoted 10 lines
Documentation/devicetree/bindings/pci/lx-pci.txt new file +10
-0+- reg: base addresses and lengths of the PCIe controller register blocks. + "config_axi_slave": PCIe controller registers + "csr_axi_slave": Bridge config registers +- interrupts: A list of interrupt outputs of the controller. Must +contain an + entry for each entry in the interrupt-names property. +- interrupt-names: It could include the following entries: + "intr": The interrupt that is asserted for controller interrupts + "aer": Asserted for aer interrupt when chip support the aer +interruptwith
Quoted 60 lines
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ none MSI/MSI-X/INTx mode,but there is interrupt line foraer.
+ "pme": Asserted for pme interrupt when chip support the pme
+ interrupt
withDocumentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ none MSI/MSI-X/INTx mode,but there is interrupt line forpme.
+- dma-coherent: Indicates that the hardware IP block can ensure theDocumentation/devicetree/bindings/pci/lx-pci.txt new file +12
-0+coherency + of the data transferred from/to the IP block. This can avoid the +software + cache flush/invalid actions, and improve the performance significantly. +- msi-parent : See the generic MSI binding described in + Documentation/devicetree/bindings/interrupt-controller/msi.txt. + +Example: + + pcie at 3400000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03400000 0x0 0x00100000 /* controllerregisters */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ 0x80 0x00000000 0x0 0x00001000>; /* configurationspace */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +2
-0+ reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* AERinterrupt */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* PMEinterrupt */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>; /*controller interrupt */
Documentation/devicetree/bindings/pci/lx-pci.txt new file +10
-0+ interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + apio-wins = <8>; + ppio-wins = <8>; + dma-coherent; + bus-range = <0x0 0xff>; + msi-parent = <&its>; + ranges = <0x82000000 0x0 0x40000000 0x80 0x40000000 0x0
0x40000000>;Documentation/devicetree/bindings/pci/lx-pci.txt new file +3
-0+ #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic GIC_SPI 109
IRQ_TYPE_LEVEL_HIGH>,Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <0000 0 0 2 &gic GIC_SPI 110
IRQ_TYPE_LEVEL_HIGH>,Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <0000 0 0 3 &gic GIC_SPI 111
IRQ_TYPE_LEVEL_HIGH>,Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ <0000 0 0 4 &gic GIC_SPI 112
IRQ_TYPE_LEVEL_HIGH>;Documentation/devicetree/bindings/pci/lx-pci.txt new file +1
-0+ };MAINTAINERS index renamed from MAINTAINERS +0
-0
0c57ccff3188..7da555c8e2f5100644MAINTAINERS +0
-0@@ -11252,6 +11252,14 @@ L: linux-arm-kernel at lists.infradead.org S: Maintained F: drivers/pci/controller/dwc/*layerscape*Quoted 13 lines
Quoted 12 lines
MAINTAINERS +8
-1+PCI DRIVER FOR NXP LX +M: Hou Zhiqiang <[email protected]> +L: linux-pci at vger.kernel.org +L: linux-arm-kernel at lists.infradead.org +S: Maintained +F: Documentation/devicetree/bindings/pci/lx-pci.txt +F: drivers/pci/controller/mobibeil/pci-lx.c + PCI DRIVER FOR GENERIC OF HOSTS M: Will Deacon <[email protected]> L: linux-pci at vger.kernel.org --Quoted 1 line
2.17.1
Thanks,
Zhiqiang
Z.q. Hou
maintainerRE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controller
Hi Leo,
Quoted 80 lines
-----Original Message-----
From: Leo Li
Sent: 2018?11?15? 2:52
To: Z.q. Hou <[email protected]>; linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in;
shawnguo at kernel.org; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>
Subject: RE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controllerQuoted 66 lines
-----Original Message-----
From: Z.q. Hou
Sent: Sunday, November 11, 2018 5:48 PM
To: Leo Li <[email protected]>; linux-pci at vger.kernel.org; linux-arm- kernel at lists.infradead.org; devicetree at vger.kernel.org; linux- kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in; shawnguo at kernel.org; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>
Subject: RE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controllerHi Leo,
Thanks a lot for your comments!
Quoted 36 lines
-----Original Message-----
From: Leo Li
Sent: 2018?11?9? 5:29
To: Z.q. Hou <[email protected]>; linux-pci at vger.kernel.org; linux-arm-kernel at lists.infradead.org; devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in; shawnguo at kernel.org; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>
Subject: RE: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controllerQuoted 11 lines
-----Original Message-----
From: Z.q. Hou
Sent: Tuesday, November 6, 2018 7:21 AM
To: linux-pci at vger.kernel.org;
linux-arm-kernel at lists.infradead.org;
devicetree at vger.kernel.org; linux-kernel at vger.kernel.org; bhelgaas at google.com; robh+dt at kernel.org; mark.rutland at arm.com; l.subrahmanya at mobiveil.co.in; shawnguo at kernel.org; Leo Li <[email protected]>; lorenzo.pieralisi at arm.com
Cc: Mingkai Hu <[email protected]>;M.h. Lian <[email protected]>; Xiaowei Bao <[email protected]>; Z.q.Hou
Quoted 7 lines
<[email protected]>
Subject: [PATCH 21/23] dt-bindings: pci: Add NXP LX SoCs PCIe controllerFrom: Hou Zhiqiang <[email protected]>
Add PCIe controller DT bindings of NXP LX series SoCs.
Quoted 8 lines
I'm not sure if this is a good idea to name this controller LX PCIe controller. Right now, it could be true that it is only used on LX series SoCs. But I'm not sure if the LS series will not use this controller or LX series will only use this controller in the future.
Since the LX series is still using the layerscape branding, so probably we should keep using the layerscape-pci.txt and define the PCIe
Gen4 variant?
Yes, will add the new PCIe IP bindings to Layerscape-pci.txt.
Quoted 1 line
Quoted 6 lines
Quoted 4 lines
Quoted 1 line
Same comment for other places using the LX naming in this driver.
Do you have any suggestion about how to name the driver and prefix of structures in the driver?
Probably something like pcie-layerscape-gen4?
Thanks for your suggestion!
Thanks,
Zhiqiang
Z.q. Hou
maintainerPATCH 22/23 PCI: mobiveil: add PCIe RC driver for NXP LX series SoCs
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
This PCIe controller is based on the Mobiveil GPEX IP, which is compatible with the PCI Express? Base Specification, Revision 4.0.
--- drivers/pci/controller/mobiveil/Kconfig | 10 + drivers/pci/controller/mobiveil/Makefile | 1 + drivers/pci/controller/mobiveil/pci-lx.c | 222 ++++++++++++++++++ .../controller/mobiveil/pcie-mobiveil-host.c | 5 +- .../pci/controller/mobiveil/pcie-mobiveil.h | 15 +- 5 files changed, 249 insertions(+), 4 deletions(-) create mode 100644 drivers/pci/controller/mobiveil/pci-lx.c
drivers/pci/controller/mobiveil/Kconfig +10 -0
@@ -21,4 +21,14 @@ config PCIE_MOBIVEIL_PLAT Soft IP. It has up to 8 outbound and inbound windows for address translation and it is a PCIe Gen4 IP. +config PCI_LX + bool "Freescale LX PCIe controller" + depends on PCI + depends on OF && (ARM64 || ARCH_LAYERSCAPE) + depends on PCI_MSI_IRQ_DOMAIN + select PCIE_MOBIVEIL_HOST + help + Say Y here if you want PCIe controller support on LX SoCs. + The PCIe controller can work in RC or EP mode according to + RCW[HOST_AGT_PEX] setting. endmenu
drivers/pci/controller/mobiveil/Makefile +1 -0
@@ -2,3 +2,4 @@ obj-$(CONFIG_PCIE_MOBIVEIL) += pcie-mobiveil.o obj-$(CONFIG_PCIE_MOBIVEIL_HOST) += pcie-mobiveil-host.o obj-$(CONFIG_PCIE_MOBIVEIL_PLAT) += pcie-mobiveil-plat.o +obj-$(CONFIG_PCI_LX) += pci-lx.o
drivers/pci/controller/mobiveil/pci-lx.c new file +222 -0
222 lines not on this page · raw message
drivers/pci/controller/mobiveil/pcie-mobiveil-host.c +3 -2
@@ -249,8 +249,9 @@ int mobiveil_host_init(struct mobiveil_pcie *pcie, bool reinit) pab_ctrl |= (1 <<AMBA_PIO_ENABLE_SHIFT ) | (1 <<PEX_PIO_ENABLE_SHIFT );csr_writel (pcie, pab_ctrl,PAB_CTRL ); -csr_writel (pcie, (PAB_INTP_INTX_MASK |PAB_INTP_MSI_MASK ), -PAB_INTP_AMBA_MISC_ENB ); + value =PAB_INTP_INTX_MASK |PAB_INTP_MSI |PAB_INTP_RESET | +PAB_INTP_PCIE_UE |PAB_INTP_IE_PMREDI |PAB_INTP_IE_EC ; +csr_writel (pcie, value,PAB_INTP_AMBA_MISC_ENB );/* * program PIO Enable Bit to 1 and Config Window Enable Bit to 1 in
drivers/pci/controller/mobiveil/pcie-mobiveil.h +13 -2
@@ -41,6 +41,8 @@#define PAGE_LO_MASK 0x3ff#define PAGE_SEL_OFFSET_SHIFT 10 +#define PAB_ACTIVITY_STAT 0x81c +#define PAB_AXI_PIO_CTRL 0x0840#define APIO_EN_MASK 0xf
@@ -49,8 +51,17 @@#define PAB_INTP_AMBA_MISC_ENB 0x0b0c#define PAB_INTP_AMBA_MISC_STAT 0x0b1c -#define PAB_INTP_INTX_MASK 0x01e0 -#define PAB_INTP_MSI_MASK 0x8 +#define PAB_INTP_RESET (0x1 << 1) +#define PAB_INTP_MSI (0x1 << 3) +#define PAB_INTP_INTA (0x1 << 5) +#define PAB_INTP_INTB (0x1 << 6) +#define PAB_INTP_INTC (0x1 << 7) +#define PAB_INTP_INTD (0x1 << 8) +#define PAB_INTP_PCIE_UE (0x1 << 9) +#define PAB_INTP_IE_PMREDI (0x1 << 29) +#define PAB_INTP_IE_EC (0x1 << 30) +#define PAB_INTP_INTX_MASK (PAB_INTP_INTA | PAB_INTP_INTB |\ + PAB_INTP_INTC | PAB_INTP_INTD)#define PAB_AXI_AMAP_CTRL (win) PAB_REG_ADDR(0x0ba0, win)#define WIN_ENABLE_SHIFT 0
Signature · 1 line
2.17.1
Z.q. Hou
maintainerPATCH 23/23 arm64: dts: freescale: lx2160a: add pcie DT nodes
In reply to Z.q. HouFrom: Hou Zhiqiang <[email protected]>
--- .../arm64/boot/dts/freescale/fsl-lx2160a.dtsi | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+)
arch/arm64/boot/dts/freescale/fsl-lx2160a.dtsi +157 -0
@@ -953,5 +953,162 @@ clock-names = "fspi_en", "fspi"; status = "disabled"; }; + + pcie at 3400000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03400000 0x0 0x00100000 /* controller registers */ + 0x80 0x00000000 0x0 0x00001000>; /* configuration space */ + reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */ + <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */ + <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>; /* controller interrupt */ + interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + dma-coherent; + apio-wins = <8>; + ppio-wins = <8>; + bus-range = <0x0 0xff>; + ranges = <0x82000000 0x0 0x40000000 0x80 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */ + msi-parent = <&its>; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic 0 0 0 109 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 2 &gic 0 0 0 110 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 3 &gic 0 0 0 111 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 4 &gic 0 0 0 112 IRQ_TYPE_LEVEL_HIGH>; + }; + + pcie at 3500000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03500000 0x0 0x00100000 /* controller registers */ + 0x88 0x00000000 0x0 0x00001000>; /* configuration space */ + reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */ + <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */ + <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>; /* controller interrupt */ + interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + dma-coherent; + apio-wins = <8>; + ppio-wins = <8>; + bus-range = <0x0 0xff>; + ranges = <0x82000000 0x0 0x40000000 0x88 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */ + msi-parent = <&its>; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic 0 0 0 114 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 2 &gic 0 0 0 115 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 3 &gic 0 0 0 116 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 4 &gic 0 0 0 117 IRQ_TYPE_LEVEL_HIGH>; + }; + + pcie at 3600000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03600000 0x0 0x00100000 /* controller registers */ + 0x90 0x00000000 0x0 0x00001000>; /* configuration space */ + reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */ + <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */ + <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>; /* controller interrupt */ + interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + dma-coherent; + apio-wins = <8>; + ppio-wins = <8>; + bus-range = <0x0 0xff>; + ranges = <0x82000000 0x0 0x40000000 0x90 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */ + msi-parent = <&its>; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic 0 0 0 119 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 2 &gic 0 0 0 120 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 3 &gic 0 0 0 121 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 4 &gic 0 0 0 122 IRQ_TYPE_LEVEL_HIGH>; + }; + + pcie at 3700000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03700000 0x0 0x00100000 /* controller registers */ + 0x98 0x00000000 0x0 0x00001000>; /* configuration space */ + reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */ + <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */ + <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>; /* controller interrupt */ + interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + dma-coherent; + apio-wins = <8>; + ppio-wins = <8>; + bus-range = <0x0 0xff>; + ranges = <0x82000000 0x0 0x40000000 0x98 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */ + msi-parent = <&its>; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic 0 0 0 124 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 2 &gic 0 0 0 125 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 3 &gic 0 0 0 126 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 4 &gic 0 0 0 127 IRQ_TYPE_LEVEL_HIGH>; + }; + + pcie at 3800000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03800000 0x0 0x00100000 /* controller registers */ + 0xa0 0x00000000 0x0 0x00001000>; /* configuration space */ + reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */ + <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */ + <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>; /* controller interrupt */ + interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + dma-coherent; + apio-wins = <8>; + ppio-wins = <8>; + bus-range = <0x0 0xff>; + ranges = <0x82000000 0x0 0x40000000 0xa0 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */ + msi-parent = <&its>; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic 0 0 0 129 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 2 &gic 0 0 0 130 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 3 &gic 0 0 0 131 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 4 &gic 0 0 0 132 IRQ_TYPE_LEVEL_HIGH>; + }; + + pcie at 3900000 { + compatible = "fsl,lx2160a-pcie"; + reg = <0x00 0x03900000 0x0 0x00100000 /* controller registers */ + 0xa8 0x00000000 0x0 0x00001000>; /* configuration space */ + reg-names = "csr_axi_slave", "config_axi_slave"; + interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>, /* AER interrupt */ + <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>, /* PME interrupt */ + <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>; /* controller interrupt */ + interrupt-names = "aer", "pme", "intr"; + #address-cells = <3>; + #size-cells = <2>; + device_type = "pci"; + dma-coherent; + apio-wins = <8>; + ppio-wins = <8>; + bus-range = <0x0 0xff>; + ranges = <0x82000000 0x0 0x40000000 0xa8 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */ + msi-parent = <&its>; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0000 0 0 1 &gic 0 0 0 104 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 2 &gic 0 0 0 105 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 3 &gic 0 0 0 106 IRQ_TYPE_LEVEL_HIGH>, + <0000 0 0 4 &gic 0 0 0 107 IRQ_TYPE_LEVEL_HIGH>; + }; + }; };
Signature · 1 line
2.17.1
Quoted 46 lines · Z.q. Hou
From: Hou Zhiqiang <[email protected]>
This patch set is aim to refactor the Mobiveil driver and add PCIe support for NXP LX series SoCs.
Hou Zhiqiang (23):
PCI: mobiveil: uniform the register accessors
PCI: mobiveil: format the code without function change
PCI: mobiveil: correct the returned error number
PCI: mobiveil: remove flagMSI_FLAG_MULTI_PCI_MSI
PCI: mobiveil: correct PCI base address in MEM/IO outbound windows
PCI: mobiveil: replace the resource list iteration function
PCI: mobiveil: useWIN_NUM_0explicitly for CFG outbound window
PCI: mobiveil: use the 1st inbound window for MEM inbound transactions
PCI: mobiveil: correct the inbound/outbound window setup routine
PCI: mobiveil: fix the INTx process error
PCI: mobiveil: only fixup the Class Code field
PCI: mobiveil: move out the link up waiting frommobiveil_host_init
PCI: mobiveil: move irq chained handler setup out of DT parse
PCI: mobiveil: initialize Primary/Secondary/Subordinate bus number
dt-bindings: pci: mobiveil: changegpio_slaveandapb_csrto optional
PCI: mobiveil: refactor the Mobiveil driver
PCI: mobiveil: continue to initialize the host upon no PCIe link
PCI: mobiveil: disabled IB and OB windows set by bootloader
PCI: mobiveil: add Byte and Half-Word width register accessors
PCI: mobiveil: change prototype of functionmobiveil_host_init
dt-bindings: pci: Add NXP LX SoCs PCIe controller
PCI: mobiveil: add PCIe RC driver for NXP LX series SoCs
arm64: dts: freescale: lx2160a: add pcie DT nodes.../devicetree/bindings/pci/lx-pci.txt | 52 ++ .../devicetree/bindings/pci/mobiveil-pcie.txt | 2 + MAINTAINERS | 10 +- .../arm64/boot/dts/freescale/fsl-lx2160a.dtsi | 157 ++++ drivers/pci/controller/Kconfig | 11 +- drivers/pci/controller/Makefile | 2 +- drivers/pci/controller/mobiveil/Kconfig | 34 + drivers/pci/controller/mobiveil/Makefile | 5 + drivers/pci/controller/mobiveil/pci-lx.c | 222 +++++ .../controller/mobiveil/pcie-mobiveil-host.c | 622 +++++++++++++ .../controller/mobiveil/pcie-mobiveil-plat.c | 54 ++ .../pci/controller/mobiveil/pcie-mobiveil.c | 245 +++++ .../pci/controller/mobiveil/pcie-mobiveil.h | 221 +++++ drivers/pci/controller/pcie-mobiveil.c | 861 ------------------ 14 files changed, 1625 insertions(+), 873 deletions(-) create mode 100644 Documentation/devicetree/bindings/pci/lx-pci.txt
Quoted 8 lines
create mode 100644 drivers/pci/controller/mobiveil/Kconfig create mode 100644 drivers/pci/controller/mobiveil/Makefile create mode 100644 drivers/pci/controller/mobiveil/pci-lx.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil-host.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.h delete mode 100644 drivers/pci/controller/pcie-mobiveil.c
Subrahmanya,
for the records, this is the driver *you* are maintaining, aren't you ?
We ask developers to be added to the MAINTAINERS list in order to hold them accountable, merging a driver upstream means that you need to actively maintain it, which in turn means reviewing series affecting its code, like this one.
I will have a look too but it is your responsibility to review these patches and ACK them accordingly.
So I strongly suggest you start doing it please.
Thanks,
Lorenzo
Lorenzo,
You are right, I reviewed few DT files, will need some time to review this train.
I will start doing it in a while.
Thanks for pitching in.
Thanks.
Quoted 73 lines · Lorenzo Pieralisi
Quoted 46 lines · Z.q. Hou
From: Hou Zhiqiang <[email protected]>
This patch set is aim to refactor the Mobiveil driver and add PCIe support for NXP LX series SoCs.
Hou Zhiqiang (23):
PCI: mobiveil: uniform the register accessors
PCI: mobiveil: format the code without function change
PCI: mobiveil: correct the returned error number
PCI: mobiveil: remove flagMSI_FLAG_MULTI_PCI_MSI
PCI: mobiveil: correct PCI base address in MEM/IO outbound windows
PCI: mobiveil: replace the resource list iteration function
PCI: mobiveil: useWIN_NUM_0explicitly for CFG outbound window
PCI: mobiveil: use the 1st inbound window for MEM inbound transactions
PCI: mobiveil: correct the inbound/outbound window setup routine
PCI: mobiveil: fix the INTx process error
PCI: mobiveil: only fixup the Class Code field
PCI: mobiveil: move out the link up waiting frommobiveil_host_init
PCI: mobiveil: move irq chained handler setup out of DT parse
PCI: mobiveil: initialize Primary/Secondary/Subordinate bus number
dt-bindings: pci: mobiveil: changegpio_slaveandapb_csrto optional
PCI: mobiveil: refactor the Mobiveil driver
PCI: mobiveil: continue to initialize the host upon no PCIe link
PCI: mobiveil: disabled IB and OB windows set by bootloader
PCI: mobiveil: add Byte and Half-Word width register accessors
PCI: mobiveil: change prototype of functionmobiveil_host_init
dt-bindings: pci: Add NXP LX SoCs PCIe controller
PCI: mobiveil: add PCIe RC driver for NXP LX series SoCs
arm64: dts: freescale: lx2160a: add pcie DT nodes.../devicetree/bindings/pci/lx-pci.txt | 52 ++ .../devicetree/bindings/pci/mobiveil-pcie.txt | 2 + MAINTAINERS | 10 +- .../arm64/boot/dts/freescale/fsl-lx2160a.dtsi | 157 ++++ drivers/pci/controller/Kconfig | 11 +- drivers/pci/controller/Makefile | 2 +- drivers/pci/controller/mobiveil/Kconfig | 34 + drivers/pci/controller/mobiveil/Makefile | 5 + drivers/pci/controller/mobiveil/pci-lx.c | 222 +++++ .../controller/mobiveil/pcie-mobiveil-host.c | 622 +++++++++++++ .../controller/mobiveil/pcie-mobiveil-plat.c | 54 ++ .../pci/controller/mobiveil/pcie-mobiveil.c | 245 +++++ .../pci/controller/mobiveil/pcie-mobiveil.h | 221 +++++ drivers/pci/controller/pcie-mobiveil.c | 861 ------------------ 14 files changed, 1625 insertions(+), 873 deletions(-) create mode 100644 Documentation/devicetree/bindings/pci/lx-pci.txtQuoted 8 lines
create mode 100644 drivers/pci/controller/mobiveil/Kconfig create mode 100644 drivers/pci/controller/mobiveil/Makefile create mode 100644 drivers/pci/controller/mobiveil/pci-lx.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil-host.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.h delete mode 100644 drivers/pci/controller/pcie-mobiveil.cSubrahmanya,
for the records, this is the driver *you* are maintaining, aren't you ?
We ask developers to be added to the
MAINTAINERSlist in order to hold them accountable, merging a driver upstream means that you need to actively maintain it, which in turn means reviewing series affecting its code, like this one.I will have a look too but it is your responsibility to review these patches and ACK them accordingly.
So I strongly suggest you start doing it please.
Thanks,
Lorenzo
Lorenzo,
You are right, I reviewed few DT files, will need some time to review this train.
I will start doing it in a while.
Thanks for pitching in.
Thanks.
Quoted 73 lines · Lorenzo Pieralisi
Quoted 46 lines · Z.q. Hou
From: Hou Zhiqiang <[email protected]>
This patch set is aim to refactor the Mobiveil driver and add PCIe support for NXP LX series SoCs.
Hou Zhiqiang (23):
PCI: mobiveil: uniform the register accessors
PCI: mobiveil: format the code without function change
PCI: mobiveil: correct the returned error number
PCI: mobiveil: remove flagMSI_FLAG_MULTI_PCI_MSI
PCI: mobiveil: correct PCI base address in MEM/IO outbound windows
PCI: mobiveil: replace the resource list iteration function
PCI: mobiveil: useWIN_NUM_0explicitly for CFG outbound window
PCI: mobiveil: use the 1st inbound window for MEM inbound transactions
PCI: mobiveil: correct the inbound/outbound window setup routine
PCI: mobiveil: fix the INTx process error
PCI: mobiveil: only fixup the Class Code field
PCI: mobiveil: move out the link up waiting frommobiveil_host_init
PCI: mobiveil: move irq chained handler setup out of DT parse
PCI: mobiveil: initialize Primary/Secondary/Subordinate bus number
dt-bindings: pci: mobiveil: changegpio_slaveandapb_csrto optional
PCI: mobiveil: refactor the Mobiveil driver
PCI: mobiveil: continue to initialize the host upon no PCIe link
PCI: mobiveil: disabled IB and OB windows set by bootloader
PCI: mobiveil: add Byte and Half-Word width register accessors
PCI: mobiveil: change prototype of functionmobiveil_host_init
dt-bindings: pci: Add NXP LX SoCs PCIe controller
PCI: mobiveil: add PCIe RC driver for NXP LX series SoCs
arm64: dts: freescale: lx2160a: add pcie DT nodes.../devicetree/bindings/pci/lx-pci.txt | 52 ++ .../devicetree/bindings/pci/mobiveil-pcie.txt | 2 + MAINTAINERS | 10 +- .../arm64/boot/dts/freescale/fsl-lx2160a.dtsi | 157 ++++ drivers/pci/controller/Kconfig | 11 +- drivers/pci/controller/Makefile | 2 +- drivers/pci/controller/mobiveil/Kconfig | 34 + drivers/pci/controller/mobiveil/Makefile | 5 + drivers/pci/controller/mobiveil/pci-lx.c | 222 +++++ .../controller/mobiveil/pcie-mobiveil-host.c | 622 +++++++++++++ .../controller/mobiveil/pcie-mobiveil-plat.c | 54 ++ .../pci/controller/mobiveil/pcie-mobiveil.c | 245 +++++ .../pci/controller/mobiveil/pcie-mobiveil.h | 221 +++++ drivers/pci/controller/pcie-mobiveil.c | 861 ------------------ 14 files changed, 1625 insertions(+), 873 deletions(-) create mode 100644 Documentation/devicetree/bindings/pci/lx-pci.txtQuoted 8 lines
create mode 100644 drivers/pci/controller/mobiveil/Kconfig create mode 100644 drivers/pci/controller/mobiveil/Makefile create mode 100644 drivers/pci/controller/mobiveil/pci-lx.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil-host.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil-plat.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.c create mode 100644 drivers/pci/controller/mobiveil/pcie-mobiveil.h delete mode 100644 drivers/pci/controller/pcie-mobiveil.cSubrahmanya,
for the records, this is the driver *you* are maintaining, aren't you ?
We ask developers to be added to the
MAINTAINERSlist in order to hold them accountable, merging a driver upstream means that you need to actively maintain it, which in turn means reviewing series affecting its code, like this one.I will have a look too but it is your responsibility to review these patches and ACK them accordingly.
So I strongly suggest you start doing it please.
Thanks,
Lorenzo