mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 11:03:43 +02:00
Merge branch 'pci/controller/dw-rockchip'
- Check only PCIE_LINKUP, not LTSSM status, to determine whether the link is up (Shawn Lin) - Increase N_FTS (used in L0s->L0 transitions) and enable ASPM L0s for Root Complex and Endpoint modes (Shawn Lin) - Hide the broken ATS Capability in rockchip_pcie_ep_init() instead of rockchip_pcie_ep_pre_init() so it stays hidden after PERST# resets non-sticky registers (Shawn Lin) - Remove unused PCIE_CLIENT_GENERAL_DEBUG definition (Hans Zhang) - Organize register and bitfield definitions logically (Hans Zhang) - Use rockchip_pcie_link_up() to check link up instead of open coding, and use GENMASK() and FIELD_GET() when possible (Hans Zhang) - Call phy_power_off() before phy_exit() in rockchip_pcie_phy_deinit() (Diederik de Haas) - Return bool (not int) for link-up check in dw_pcie_ops.link_up() and armada8k, dra7xx, dw-rockchip, exynos, histb, keembay, keystone, kirin, meson, qcom, qcom-ep, rcar_gen4, spear13xx, tegra194, uniphier, visconti (Hans Zhang) - Return bool (not int) for link-up check in mobiveil_pab_ops.link_up() and layerscape-gen4, mobiveil (Hans Zhang) - Simplify j721e link-up check (Hans Zhang) - Convert pci-host-common to a library so platforms that don't need native host controller drivers don't need to include these helper functions (Manivannan Sadhasivam) * pci/controller/dw-rockchip: PCI: qcom: Replace PERST# sleep time with proper macro PCI: dw-rockchip: Replace PERST# sleep time with proper macro PCI: host-common: Convert to library for host controller drivers PCI: cadence: Simplify J721e link status check PCI: mobiveil: Return bool from link up check PCI: dwc: Return bool from link up check PCI: dw-rockchip: Fix PHY function call sequence in rockchip_pcie_phy_deinit() PCI: dw-rockchip: Use rockchip_pcie_link_up() to check link up instead of open coding PCI: dw-rockchip: Reorganize register and bitfield definitions PCI: dw-rockchip: Remove unused PCIE_CLIENT_GENERAL_DEBUG definition PCI: dw-rockchip: Move rockchip_pcie_ep_hide_broken_ats_cap_rk3588() to dw_pcie_ep_ops::init() PCI: dw-rockchip: Enable ASPM L0s capability for both RC and EP modes PCI: dw-rockchip: Remove PCIE_L0S_ENTRY check from rockchip_pcie_link_up() # Conflicts: # drivers/pci/controller/pcie-apple.c # include/linux/pci-ecam.h
This commit is contained in:
commit
20279628bb
|
|
@ -3,6 +3,10 @@
|
|||
menu "PCI controller drivers"
|
||||
depends on PCI
|
||||
|
||||
config PCI_HOST_COMMON
|
||||
tristate
|
||||
select PCI_ECAM
|
||||
|
||||
config PCI_AARDVARK
|
||||
tristate "Aardvark PCIe controller"
|
||||
depends on (ARCH_MVEBU && ARM64) || COMPILE_TEST
|
||||
|
|
@ -119,10 +123,6 @@ config PCI_FTPCI100
|
|||
depends on OF
|
||||
default ARCH_GEMINI
|
||||
|
||||
config PCI_HOST_COMMON
|
||||
tristate
|
||||
select PCI_ECAM
|
||||
|
||||
config PCI_HOST_GENERIC
|
||||
tristate "Generic PCI host controller"
|
||||
depends on OF
|
||||
|
|
|
|||
|
|
@ -164,11 +164,7 @@ static bool j721e_pcie_link_up(struct cdns_pcie *cdns_pcie)
|
|||
u32 reg;
|
||||
|
||||
reg = j721e_pcie_user_readl(pcie, J721E_PCIE_USER_LINKSTATUS);
|
||||
reg &= LINK_STATUS;
|
||||
if (reg == LINK_UP_DL_COMPLETED)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return (reg & LINK_STATUS) == LINK_UP_DL_COMPLETED;
|
||||
}
|
||||
|
||||
static const struct cdns_pcie_ops j721e_pcie_ops = {
|
||||
|
|
|
|||
|
|
@ -118,12 +118,12 @@ static u64 dra7xx_pcie_cpu_addr_fixup(struct dw_pcie *pci, u64 cpu_addr)
|
|||
return cpu_addr & DRA7XX_CPU_TO_BUS_ADDR;
|
||||
}
|
||||
|
||||
static int dra7xx_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool dra7xx_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci);
|
||||
u32 reg = dra7xx_pcie_readl(dra7xx, PCIECTRL_DRA7XX_CONF_PHY_CS);
|
||||
|
||||
return !!(reg & LINK_UP);
|
||||
return reg & LINK_UP;
|
||||
}
|
||||
|
||||
static void dra7xx_pcie_stop_link(struct dw_pcie *pci)
|
||||
|
|
|
|||
|
|
@ -209,12 +209,12 @@ static struct pci_ops exynos_pci_ops = {
|
|||
.write = exynos_pcie_wr_own_conf,
|
||||
};
|
||||
|
||||
static int exynos_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool exynos_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct exynos_pcie *ep = to_exynos_pcie(pci);
|
||||
u32 val = exynos_pcie_readl(ep->elbi_base, PCIE_ELBI_RDLH_LINKUP);
|
||||
|
||||
return (val & PCIE_ELBI_XMLH_LINKUP);
|
||||
return val & PCIE_ELBI_XMLH_LINKUP;
|
||||
}
|
||||
|
||||
static int exynos_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
|
|
|
|||
|
|
@ -492,13 +492,12 @@ static struct pci_ops ks_pcie_ops = {
|
|||
* @pci: A pointer to the dw_pcie structure which holds the DesignWare PCIe host
|
||||
* controller driver information.
|
||||
*/
|
||||
static int ks_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool ks_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = dw_pcie_readl_dbi(pci, PCIE_PORT_DEBUG0);
|
||||
val &= PORT_LOGIC_LTSSM_STATE_MASK;
|
||||
return (val == PORT_LOGIC_LTSSM_STATE_L0);
|
||||
return (val & PORT_LOGIC_LTSSM_STATE_MASK) == PORT_LOGIC_LTSSM_STATE_L0;
|
||||
}
|
||||
|
||||
static void ks_pcie_stop_link(struct dw_pcie *pci)
|
||||
|
|
|
|||
|
|
@ -335,7 +335,7 @@ static struct pci_ops meson_pci_ops = {
|
|||
.write = pci_generic_config_write,
|
||||
};
|
||||
|
||||
static int meson_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool meson_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct meson_pcie *mp = to_meson_pcie(pci);
|
||||
struct device *dev = pci->dev;
|
||||
|
|
@ -363,7 +363,7 @@ static int meson_pcie_link_up(struct dw_pcie *pci)
|
|||
dev_dbg(dev, "speed_okay\n");
|
||||
|
||||
if (smlh_up && rdlh_up && ltssm_up && speed_okay)
|
||||
return 1;
|
||||
return true;
|
||||
|
||||
cnt++;
|
||||
|
||||
|
|
@ -371,7 +371,7 @@ static int meson_pcie_link_up(struct dw_pcie *pci)
|
|||
} while (cnt < WAIT_LINKUP_TIMEOUT);
|
||||
|
||||
dev_err(dev, "error: wait linkup timeout\n");
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
static int meson_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
|
|
|
|||
|
|
@ -139,7 +139,7 @@ static int armada8k_pcie_setup_phys(struct armada8k_pcie *pcie)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int armada8k_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool armada8k_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
u32 reg;
|
||||
u32 mask = PCIE_GLB_STS_RDLH_LINK_UP | PCIE_GLB_STS_PHY_LINK_UP;
|
||||
|
|
@ -147,10 +147,10 @@ static int armada8k_pcie_link_up(struct dw_pcie *pci)
|
|||
reg = dw_pcie_readl_dbi(pci, PCIE_GLOBAL_STATUS_REG);
|
||||
|
||||
if ((reg & mask) == mask)
|
||||
return 1;
|
||||
return true;
|
||||
|
||||
dev_dbg(pci->dev, "No link detected (Global-Status: 0x%08x).\n", reg);
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
static int armada8k_pcie_start_link(struct dw_pcie *pci)
|
||||
|
|
|
|||
|
|
@ -711,7 +711,7 @@ int dw_pcie_wait_for_link(struct dw_pcie *pci)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(dw_pcie_wait_for_link);
|
||||
|
||||
int dw_pcie_link_up(struct dw_pcie *pci)
|
||||
bool dw_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
|
|
|
|||
|
|
@ -462,7 +462,7 @@ struct dw_pcie_ops {
|
|||
size_t size, u32 val);
|
||||
void (*write_dbi2)(struct dw_pcie *pcie, void __iomem *base, u32 reg,
|
||||
size_t size, u32 val);
|
||||
int (*link_up)(struct dw_pcie *pcie);
|
||||
bool (*link_up)(struct dw_pcie *pcie);
|
||||
enum dw_pcie_ltssm (*get_ltssm)(struct dw_pcie *pcie);
|
||||
int (*start_link)(struct dw_pcie *pcie);
|
||||
void (*stop_link)(struct dw_pcie *pcie);
|
||||
|
|
@ -537,7 +537,7 @@ int dw_pcie_write(void __iomem *addr, int size, u32 val);
|
|||
u32 dw_pcie_read_dbi(struct dw_pcie *pci, u32 reg, size_t size);
|
||||
void dw_pcie_write_dbi(struct dw_pcie *pci, u32 reg, size_t size, u32 val);
|
||||
void dw_pcie_write_dbi2(struct dw_pcie *pci, u32 reg, size_t size, u32 val);
|
||||
int dw_pcie_link_up(struct dw_pcie *pci);
|
||||
bool dw_pcie_link_up(struct dw_pcie *pci);
|
||||
void dw_pcie_upconfig_setup(struct dw_pcie *pci);
|
||||
int dw_pcie_wait_for_link(struct dw_pcie *pci);
|
||||
int dw_pcie_prog_outbound_atu(struct dw_pcie *pci,
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
* Author: Simon Xue <xxm@rock-chips.com>
|
||||
*/
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/irqchip/chained_irq.h>
|
||||
|
|
@ -21,6 +22,7 @@
|
|||
#include <linux/regmap.h>
|
||||
#include <linux/reset.h>
|
||||
|
||||
#include "../../pci.h"
|
||||
#include "pcie-designware.h"
|
||||
|
||||
/*
|
||||
|
|
@ -33,26 +35,36 @@
|
|||
|
||||
#define to_rockchip_pcie(x) dev_get_drvdata((x)->dev)
|
||||
|
||||
#define PCIE_CLIENT_RC_MODE HIWORD_UPDATE_BIT(0x40)
|
||||
#define PCIE_CLIENT_EP_MODE HIWORD_UPDATE(0xf0, 0x0)
|
||||
#define PCIE_CLIENT_ENABLE_LTSSM HIWORD_UPDATE_BIT(0xc)
|
||||
#define PCIE_CLIENT_DISABLE_LTSSM HIWORD_UPDATE(0x0c, 0x8)
|
||||
#define PCIE_CLIENT_INTR_STATUS_MISC 0x10
|
||||
#define PCIE_CLIENT_INTR_MASK_MISC 0x24
|
||||
#define PCIE_SMLH_LINKUP BIT(16)
|
||||
#define PCIE_RDLH_LINKUP BIT(17)
|
||||
#define PCIE_LINKUP (PCIE_SMLH_LINKUP | PCIE_RDLH_LINKUP)
|
||||
#define PCIE_RDLH_LINK_UP_CHGED BIT(1)
|
||||
#define PCIE_LINK_REQ_RST_NOT_INT BIT(2)
|
||||
#define PCIE_L0S_ENTRY 0x11
|
||||
#define PCIE_CLIENT_GENERAL_CONTROL 0x0
|
||||
/* General Control Register */
|
||||
#define PCIE_CLIENT_GENERAL_CON 0x0
|
||||
#define PCIE_CLIENT_RC_MODE HIWORD_UPDATE_BIT(0x40)
|
||||
#define PCIE_CLIENT_EP_MODE HIWORD_UPDATE(0xf0, 0x0)
|
||||
#define PCIE_CLIENT_ENABLE_LTSSM HIWORD_UPDATE_BIT(0xc)
|
||||
#define PCIE_CLIENT_DISABLE_LTSSM HIWORD_UPDATE(0x0c, 0x8)
|
||||
|
||||
/* Interrupt Status Register Related to Legacy Interrupt */
|
||||
#define PCIE_CLIENT_INTR_STATUS_LEGACY 0x8
|
||||
|
||||
/* Interrupt Status Register Related to Miscellaneous Operation */
|
||||
#define PCIE_CLIENT_INTR_STATUS_MISC 0x10
|
||||
#define PCIE_RDLH_LINK_UP_CHGED BIT(1)
|
||||
#define PCIE_LINK_REQ_RST_NOT_INT BIT(2)
|
||||
|
||||
/* Interrupt Mask Register Related to Legacy Interrupt */
|
||||
#define PCIE_CLIENT_INTR_MASK_LEGACY 0x1c
|
||||
#define PCIE_CLIENT_GENERAL_DEBUG 0x104
|
||||
|
||||
/* Interrupt Mask Register Related to Miscellaneous Operation */
|
||||
#define PCIE_CLIENT_INTR_MASK_MISC 0x24
|
||||
|
||||
/* Hot Reset Control Register */
|
||||
#define PCIE_CLIENT_HOT_RESET_CTRL 0x180
|
||||
#define PCIE_LTSSM_ENABLE_ENHANCE BIT(4)
|
||||
|
||||
/* LTSSM Status Register */
|
||||
#define PCIE_CLIENT_LTSSM_STATUS 0x300
|
||||
#define PCIE_LTSSM_ENABLE_ENHANCE BIT(4)
|
||||
#define PCIE_LTSSM_STATUS_MASK GENMASK(5, 0)
|
||||
#define PCIE_LINKUP 0x3
|
||||
#define PCIE_LINKUP_MASK GENMASK(17, 16)
|
||||
#define PCIE_LTSSM_STATUS_MASK GENMASK(5, 0)
|
||||
|
||||
struct rockchip_pcie {
|
||||
struct dw_pcie pci;
|
||||
|
|
@ -163,25 +175,36 @@ static u32 rockchip_pcie_get_ltssm(struct rockchip_pcie *rockchip)
|
|||
static void rockchip_pcie_enable_ltssm(struct rockchip_pcie *rockchip)
|
||||
{
|
||||
rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_ENABLE_LTSSM,
|
||||
PCIE_CLIENT_GENERAL_CONTROL);
|
||||
PCIE_CLIENT_GENERAL_CON);
|
||||
}
|
||||
|
||||
static void rockchip_pcie_disable_ltssm(struct rockchip_pcie *rockchip)
|
||||
{
|
||||
rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_DISABLE_LTSSM,
|
||||
PCIE_CLIENT_GENERAL_CONTROL);
|
||||
PCIE_CLIENT_GENERAL_CON);
|
||||
}
|
||||
|
||||
static int rockchip_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool rockchip_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct rockchip_pcie *rockchip = to_rockchip_pcie(pci);
|
||||
u32 val = rockchip_pcie_get_ltssm(rockchip);
|
||||
|
||||
if ((val & PCIE_LINKUP) == PCIE_LINKUP &&
|
||||
(val & PCIE_LTSSM_STATUS_MASK) == PCIE_L0S_ENTRY)
|
||||
return 1;
|
||||
return FIELD_GET(PCIE_LINKUP_MASK, val) == PCIE_LINKUP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
static void rockchip_pcie_enable_l0s(struct dw_pcie *pci)
|
||||
{
|
||||
u32 cap, lnkcap;
|
||||
|
||||
/* Enable L0S capability for all SoCs */
|
||||
cap = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
|
||||
if (cap) {
|
||||
lnkcap = dw_pcie_readl_dbi(pci, cap + PCI_EXP_LNKCAP);
|
||||
lnkcap |= PCI_EXP_LNKCAP_ASPM_L0S;
|
||||
dw_pcie_dbi_ro_wr_en(pci);
|
||||
dw_pcie_writel_dbi(pci, cap + PCI_EXP_LNKCAP, lnkcap);
|
||||
dw_pcie_dbi_ro_wr_dis(pci);
|
||||
}
|
||||
}
|
||||
|
||||
static int rockchip_pcie_start_link(struct dw_pcie *pci)
|
||||
|
|
@ -202,7 +225,7 @@ static int rockchip_pcie_start_link(struct dw_pcie *pci)
|
|||
* We need more extra time as before, rather than setting just
|
||||
* 100us as we don't know how long should the device need to reset.
|
||||
*/
|
||||
msleep(100);
|
||||
msleep(PCIE_T_PVPERL_MS);
|
||||
gpiod_set_value_cansleep(rockchip->rst_gpio, 1);
|
||||
|
||||
return 0;
|
||||
|
|
@ -233,6 +256,8 @@ static int rockchip_pcie_host_init(struct dw_pcie_rp *pp)
|
|||
irq_set_chained_handler_and_data(irq, rockchip_pcie_intx_handler,
|
||||
rockchip);
|
||||
|
||||
rockchip_pcie_enable_l0s(pci);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -263,16 +288,14 @@ static void rockchip_pcie_ep_hide_broken_ats_cap_rk3588(struct dw_pcie_ep *ep)
|
|||
dev_err(dev, "failed to hide ATS capability\n");
|
||||
}
|
||||
|
||||
static void rockchip_pcie_ep_pre_init(struct dw_pcie_ep *ep)
|
||||
{
|
||||
rockchip_pcie_ep_hide_broken_ats_cap_rk3588(ep);
|
||||
}
|
||||
|
||||
static void rockchip_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||
{
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
enum pci_barno bar;
|
||||
|
||||
rockchip_pcie_enable_l0s(pci);
|
||||
rockchip_pcie_ep_hide_broken_ats_cap_rk3588(ep);
|
||||
|
||||
for (bar = 0; bar < PCI_STD_NUM_BARS; bar++)
|
||||
dw_pcie_ep_reset_bar(pci, bar);
|
||||
};
|
||||
|
|
@ -342,7 +365,6 @@ rockchip_pcie_get_features(struct dw_pcie_ep *ep)
|
|||
|
||||
static const struct dw_pcie_ep_ops rockchip_pcie_ep_ops = {
|
||||
.init = rockchip_pcie_ep_init,
|
||||
.pre_init = rockchip_pcie_ep_pre_init,
|
||||
.raise_irq = rockchip_pcie_raise_irq,
|
||||
.get_features = rockchip_pcie_get_features,
|
||||
};
|
||||
|
|
@ -410,8 +432,8 @@ static int rockchip_pcie_phy_init(struct rockchip_pcie *rockchip)
|
|||
|
||||
static void rockchip_pcie_phy_deinit(struct rockchip_pcie *rockchip)
|
||||
{
|
||||
phy_exit(rockchip->phy);
|
||||
phy_power_off(rockchip->phy);
|
||||
phy_exit(rockchip->phy);
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ops dw_pcie_ops = {
|
||||
|
|
@ -426,7 +448,7 @@ static irqreturn_t rockchip_pcie_rc_sys_irq_thread(int irq, void *arg)
|
|||
struct dw_pcie *pci = &rockchip->pci;
|
||||
struct dw_pcie_rp *pp = &pci->pp;
|
||||
struct device *dev = pci->dev;
|
||||
u32 reg, val;
|
||||
u32 reg;
|
||||
|
||||
reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC);
|
||||
rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC);
|
||||
|
|
@ -435,8 +457,7 @@ static irqreturn_t rockchip_pcie_rc_sys_irq_thread(int irq, void *arg)
|
|||
dev_dbg(dev, "LTSSM_STATUS: %#x\n", rockchip_pcie_get_ltssm(rockchip));
|
||||
|
||||
if (reg & PCIE_RDLH_LINK_UP_CHGED) {
|
||||
val = rockchip_pcie_get_ltssm(rockchip);
|
||||
if ((val & PCIE_LINKUP) == PCIE_LINKUP) {
|
||||
if (rockchip_pcie_link_up(pci)) {
|
||||
dev_dbg(dev, "Received Link up event. Starting enumeration!\n");
|
||||
/* Rescan the bus to enumerate endpoint devices */
|
||||
pci_lock_rescan_remove();
|
||||
|
|
@ -453,7 +474,7 @@ static irqreturn_t rockchip_pcie_ep_sys_irq_thread(int irq, void *arg)
|
|||
struct rockchip_pcie *rockchip = arg;
|
||||
struct dw_pcie *pci = &rockchip->pci;
|
||||
struct device *dev = pci->dev;
|
||||
u32 reg, val;
|
||||
u32 reg;
|
||||
|
||||
reg = rockchip_pcie_readl_apb(rockchip, PCIE_CLIENT_INTR_STATUS_MISC);
|
||||
rockchip_pcie_writel_apb(rockchip, reg, PCIE_CLIENT_INTR_STATUS_MISC);
|
||||
|
|
@ -467,8 +488,7 @@ static irqreturn_t rockchip_pcie_ep_sys_irq_thread(int irq, void *arg)
|
|||
}
|
||||
|
||||
if (reg & PCIE_RDLH_LINK_UP_CHGED) {
|
||||
val = rockchip_pcie_get_ltssm(rockchip);
|
||||
if ((val & PCIE_LINKUP) == PCIE_LINKUP) {
|
||||
if (rockchip_pcie_link_up(pci)) {
|
||||
dev_dbg(dev, "link up\n");
|
||||
dw_pcie_ep_linkup(&pci->ep);
|
||||
}
|
||||
|
|
@ -505,7 +525,7 @@ static int rockchip_pcie_configure_rc(struct platform_device *pdev,
|
|||
rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL);
|
||||
|
||||
rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_RC_MODE,
|
||||
PCIE_CLIENT_GENERAL_CONTROL);
|
||||
PCIE_CLIENT_GENERAL_CON);
|
||||
|
||||
pp = &rockchip->pci.pp;
|
||||
pp->ops = &rockchip_pcie_host_ops;
|
||||
|
|
@ -551,7 +571,7 @@ static int rockchip_pcie_configure_ep(struct platform_device *pdev,
|
|||
rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL);
|
||||
|
||||
rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_EP_MODE,
|
||||
PCIE_CLIENT_GENERAL_CONTROL);
|
||||
PCIE_CLIENT_GENERAL_CON);
|
||||
|
||||
rockchip->pci.ep.ops = &rockchip_pcie_ep_ops;
|
||||
rockchip->pci.ep.page_size = SZ_64K;
|
||||
|
|
@ -601,6 +621,10 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
|
|||
rockchip->pci.ops = &dw_pcie_ops;
|
||||
rockchip->data = data;
|
||||
|
||||
/* Default N_FTS value (210) is broken, override it to 255 */
|
||||
rockchip->pci.n_fts[0] = 255; /* Gen1 */
|
||||
rockchip->pci.n_fts[1] = 255; /* Gen2+ */
|
||||
|
||||
ret = rockchip_pcie_resource_get(pdev, rockchip);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/pci-acpi.h>
|
||||
#include <linux/pci-ecam.h>
|
||||
#include "../../pci.h"
|
||||
#include "../pci-host-common.h"
|
||||
|
||||
#if defined(CONFIG_PCI_HISI) || (defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS))
|
||||
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ static struct pci_ops histb_pci_ops = {
|
|||
.write = histb_pcie_wr_own_conf,
|
||||
};
|
||||
|
||||
static int histb_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool histb_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct histb_pcie *hipcie = to_histb_pcie(pci);
|
||||
u32 regval;
|
||||
|
|
@ -160,11 +160,8 @@ static int histb_pcie_link_up(struct dw_pcie *pci)
|
|||
regval = histb_pcie_readl(hipcie, PCIE_SYS_STAT0);
|
||||
status = histb_pcie_readl(hipcie, PCIE_SYS_STAT4);
|
||||
status &= PCIE_LTSSM_STATE_MASK;
|
||||
if ((regval & PCIE_XMLH_LINK_UP) && (regval & PCIE_RDLH_LINK_UP) &&
|
||||
(status == PCIE_LTSSM_STATE_ACTIVE))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
return ((regval & PCIE_XMLH_LINK_UP) && (regval & PCIE_RDLH_LINK_UP) &&
|
||||
(status == PCIE_LTSSM_STATE_ACTIVE));
|
||||
}
|
||||
|
||||
static int histb_pcie_start_link(struct dw_pcie *pci)
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ static void keembay_pcie_ltssm_set(struct keembay_pcie *pcie, bool enable)
|
|||
writel(val, pcie->apb_base + PCIE_REGS_PCIE_APP_CNTRL);
|
||||
}
|
||||
|
||||
static int keembay_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool keembay_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct keembay_pcie *pcie = dev_get_drvdata(pci->dev);
|
||||
u32 val;
|
||||
|
|
|
|||
|
|
@ -586,16 +586,13 @@ static void kirin_pcie_write_dbi(struct dw_pcie *pci, void __iomem *base,
|
|||
kirin_pcie_sideband_dbi_w_mode(kirin_pcie, false);
|
||||
}
|
||||
|
||||
static int kirin_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool kirin_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct kirin_pcie *kirin_pcie = to_kirin_pcie(pci);
|
||||
u32 val;
|
||||
|
||||
regmap_read(kirin_pcie->apb, PCIE_APB_PHY_STATUS0, &val);
|
||||
if ((val & PCIE_LINKUP_ENABLE) == PCIE_LINKUP_ENABLE)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
return (val & PCIE_LINKUP_ENABLE) == PCIE_LINKUP_ENABLE;
|
||||
}
|
||||
|
||||
static int kirin_pcie_start_link(struct dw_pcie *pci)
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ static void qcom_pcie_ep_configure_tcsr(struct qcom_pcie_ep *pcie_ep)
|
|||
}
|
||||
}
|
||||
|
||||
static int qcom_pcie_dw_link_up(struct dw_pcie *pci)
|
||||
static bool qcom_pcie_dw_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct qcom_pcie_ep *pcie_ep = to_pcie_ep(pci);
|
||||
u32 reg;
|
||||
|
|
|
|||
|
|
@ -289,7 +289,7 @@ static void qcom_ep_reset_assert(struct qcom_pcie *pcie)
|
|||
static void qcom_ep_reset_deassert(struct qcom_pcie *pcie)
|
||||
{
|
||||
/* Ensure that PERST has been asserted for at least 100 ms */
|
||||
msleep(100);
|
||||
msleep(PCIE_T_PVPERL_MS);
|
||||
gpiod_set_value_cansleep(pcie->reset, 0);
|
||||
usleep_range(PERST_DELAY_US, PERST_DELAY_US + 500);
|
||||
}
|
||||
|
|
@ -1221,12 +1221,12 @@ static int qcom_pcie_post_init_2_9_0(struct qcom_pcie *pcie)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int qcom_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool qcom_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
u16 offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
|
||||
u16 val = readw(pci->dbi_base + offset + PCI_EXP_LNKSTA);
|
||||
|
||||
return !!(val & PCI_EXP_LNKSTA_DLLLA);
|
||||
return val & PCI_EXP_LNKSTA_DLLLA;
|
||||
}
|
||||
|
||||
static int qcom_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ struct rcar_gen4_pcie {
|
|||
#define to_rcar_gen4_pcie(_dw) container_of(_dw, struct rcar_gen4_pcie, dw)
|
||||
|
||||
/* Common */
|
||||
static int rcar_gen4_pcie_link_up(struct dw_pcie *dw)
|
||||
static bool rcar_gen4_pcie_link_up(struct dw_pcie *dw)
|
||||
{
|
||||
struct rcar_gen4_pcie *rcar = to_rcar_gen4_pcie(dw);
|
||||
u32 val, mask;
|
||||
|
|
|
|||
|
|
@ -110,15 +110,12 @@ static void spear13xx_pcie_enable_interrupts(struct spear13xx_pcie *spear13xx_pc
|
|||
MSI_CTRL_INT, &app_reg->int_mask);
|
||||
}
|
||||
|
||||
static int spear13xx_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool spear13xx_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct spear13xx_pcie *spear13xx_pcie = to_spear13xx_pcie(pci);
|
||||
struct pcie_app_reg __iomem *app_reg = spear13xx_pcie->app_base;
|
||||
|
||||
if (readl(&app_reg->app_status_1) & XMLH_LINK_UP)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
return readl(&app_reg->app_status_1) & XMLH_LINK_UP;
|
||||
}
|
||||
|
||||
static int spear13xx_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
|
|
|
|||
|
|
@ -1027,12 +1027,12 @@ static int tegra_pcie_dw_start_link(struct dw_pcie *pci)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_pcie_dw_link_up(struct dw_pcie *pci)
|
||||
static bool tegra_pcie_dw_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct tegra_pcie_dw *pcie = to_tegra_pcie(pci);
|
||||
u32 val = dw_pcie_readw_dbi(pci, pcie->pcie_cap_base + PCI_EXP_LNKSTA);
|
||||
|
||||
return !!(val & PCI_EXP_LNKSTA_DLLLA);
|
||||
return val & PCI_EXP_LNKSTA_DLLLA;
|
||||
}
|
||||
|
||||
static void tegra_pcie_dw_stop_link(struct dw_pcie *pci)
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ static int uniphier_pcie_wait_rc(struct uniphier_pcie *pcie)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int uniphier_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool uniphier_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct uniphier_pcie *pcie = to_uniphier_pcie(pci);
|
||||
u32 val, mask;
|
||||
|
|
|
|||
|
|
@ -121,13 +121,13 @@ static u32 visconti_mpu_readl(struct visconti_pcie *pcie, u32 reg)
|
|||
return readl_relaxed(pcie->mpu_base + reg);
|
||||
}
|
||||
|
||||
static int visconti_pcie_link_up(struct dw_pcie *pci)
|
||||
static bool visconti_pcie_link_up(struct dw_pcie *pci)
|
||||
{
|
||||
struct visconti_pcie *pcie = dev_get_drvdata(pci->dev);
|
||||
void __iomem *addr = pcie->ulreg_base;
|
||||
u32 val = readl_relaxed(addr + PCIE_UL_REG_V_PHY_ST_02);
|
||||
|
||||
return !!(val & PCIE_UL_S_L0);
|
||||
return val & PCIE_UL_S_L0;
|
||||
}
|
||||
|
||||
static int visconti_pcie_start_link(struct dw_pcie *pci)
|
||||
|
|
|
|||
|
|
@ -53,18 +53,13 @@ static inline void ls_g4_pcie_pf_writel(struct ls_g4_pcie *pcie,
|
|||
iowrite32(val, pcie->pci.csr_axi_slave_base + PCIE_PF_OFF + off);
|
||||
}
|
||||
|
||||
static int ls_g4_pcie_link_up(struct mobiveil_pcie *pci)
|
||||
static bool ls_g4_pcie_link_up(struct mobiveil_pcie *pci)
|
||||
{
|
||||
struct ls_g4_pcie *pcie = to_ls_g4_pcie(pci);
|
||||
u32 state;
|
||||
|
||||
state = ls_g4_pcie_pf_readl(pcie, PCIE_PF_DBG);
|
||||
state = state & PF_DBG_LTSSM_MASK;
|
||||
|
||||
if (state == PF_DBG_LTSSM_L0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
return (state & PF_DBG_LTSSM_MASK) == PF_DBG_LTSSM_L0;
|
||||
}
|
||||
|
||||
static void ls_g4_pcie_disable_interrupt(struct ls_g4_pcie *pcie)
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ struct mobiveil_root_port {
|
|||
};
|
||||
|
||||
struct mobiveil_pab_ops {
|
||||
int (*link_up)(struct mobiveil_pcie *pcie);
|
||||
bool (*link_up)(struct mobiveil_pcie *pcie);
|
||||
};
|
||||
|
||||
struct mobiveil_pcie {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Generic PCI host driver common code
|
||||
* Common library for PCI host controller drivers
|
||||
*
|
||||
* Copyright (C) 2014 ARM Limited
|
||||
*
|
||||
|
|
@ -15,6 +15,8 @@
|
|||
#include <linux/pci-ecam.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "pci-host-common.h"
|
||||
|
||||
static void gen_pci_unmap_cfg(void *ptr)
|
||||
{
|
||||
pci_ecam_free((struct pci_config_window *)ptr);
|
||||
|
|
@ -102,5 +104,5 @@ void pci_host_common_remove(struct platform_device *pdev)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(pci_host_common_remove);
|
||||
|
||||
MODULE_DESCRIPTION("Generic PCI host common driver");
|
||||
MODULE_DESCRIPTION("Common library for PCI host controller drivers");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
|||
20
drivers/pci/controller/pci-host-common.h
Normal file
20
drivers/pci/controller/pci-host-common.h
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Common library for PCI host controller drivers
|
||||
*
|
||||
* Copyright (C) 2014 ARM Limited
|
||||
*
|
||||
* Author: Will Deacon <will.deacon@arm.com>
|
||||
*/
|
||||
|
||||
#ifndef _PCI_HOST_COMMON_H
|
||||
#define _PCI_HOST_COMMON_H
|
||||
|
||||
struct pci_ecam_ops;
|
||||
|
||||
int pci_host_common_probe(struct platform_device *pdev);
|
||||
int pci_host_common_init(struct platform_device *pdev,
|
||||
const struct pci_ecam_ops *ops);
|
||||
void pci_host_common_remove(struct platform_device *pdev);
|
||||
|
||||
#endif
|
||||
|
|
@ -14,6 +14,8 @@
|
|||
#include <linux/pci-ecam.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "pci-host-common.h"
|
||||
|
||||
static const struct pci_ecam_ops gen_pci_cfg_cam_bus_ops = {
|
||||
.bus_shift = 16,
|
||||
.pci_ops = {
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@
|
|||
#include <linux/pci-ecam.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include "pci-host-common.h"
|
||||
|
||||
#if defined(CONFIG_PCI_HOST_THUNDER_ECAM) || (defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS))
|
||||
|
||||
static void set_val(u32 v, int where, int size, u32 *val)
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/io-64-nonatomic-lo-hi.h>
|
||||
#include "../pci.h"
|
||||
#include "pci-host-common.h"
|
||||
|
||||
#if defined(CONFIG_PCI_HOST_THUNDER_PEM) || (defined(CONFIG_ACPI) && defined(CONFIG_PCI_QUIRKS))
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@
|
|||
#include <linux/of_irq.h>
|
||||
#include <linux/pci-ecam.h>
|
||||
|
||||
#include "pci-host-common.h"
|
||||
|
||||
/* T8103 (original M1) and related SoCs */
|
||||
#define CORE_RC_PHYIF_CTL 0x00024
|
||||
#define CORE_RC_PHYIF_CTL_RUN BIT(0)
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/wordpart.h>
|
||||
|
||||
#include "../../pci.h"
|
||||
#include "../pci-host-common.h"
|
||||
#include "pcie-plda.h"
|
||||
|
||||
#define MC_MAX_NUM_INBOUND_WINDOWS 8
|
||||
|
|
|
|||
|
|
@ -93,12 +93,4 @@ extern const struct pci_ecam_ops al_pcie_ops; /* Amazon Annapurna Labs PCIe */
|
|||
extern const struct pci_ecam_ops tegra194_pcie_ops; /* Tegra194 PCIe */
|
||||
extern const struct pci_ecam_ops loongson_pci_ecam_ops; /* Loongson PCIe */
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_PCI_HOST_COMMON)
|
||||
/* for DT-based PCI controllers that support ECAM */
|
||||
int pci_host_common_probe(struct platform_device *pdev);
|
||||
int pci_host_common_init(struct platform_device *pdev,
|
||||
const struct pci_ecam_ops *ops);
|
||||
void pci_host_common_remove(struct platform_device *pdev);
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user