mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
Merge branch 'pci/controller/dwc'
- Convert fu740 CONFIG_PCIE_FU740 dependency from SOC_SIFIVE to ARCH_SIFIVE (Conor Dooley) - Align iATU mapping for endpoint MSI-X (Niklas Cassel) - Drop "host_" prefix from struct dw_pcie_host_ops members (Yoshihiro Shimoda) - Drop "ep_" prefix from struct dw_pcie_ep_ops members (Yoshihiro Shimoda) - Rename struct dw_pcie_ep_ops.func_conf_select() to .get_dbi_offset() to be more descriptive (Yoshihiro Shimoda) - Add Endpoint DBI accessors to encapsulate offset lookups (Yoshihiro Shimoda) - Cast iproc and rcar-gen4 of_device_get_match_data() results to uintptr_t to avoid clang "cast to smaller integer type" warnings (Justin Stitt, Yoshihiro Shimoda) * pci/controller/dwc: PCI: rcar-gen4: Fix -Wvoid-pointer-to-enum-cast error PCI: iproc: Fix -Wvoid-pointer-to-enum-cast warning PCI: dwc: Add dw_pcie_ep_{read,write}_dbi[2] helpers PCI: dwc: Rename .func_conf_select to .get_dbi_offset in struct dw_pcie_ep_ops PCI: dwc: Rename .ep_init to .init in struct dw_pcie_ep_ops PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members PCI: dwc: endpoint: Fix dw_pcie_ep_raise_msix_irq() alignment support PCI: dwc: Convert SOC_SIFIVE to ARCH_SIFIVE
This commit is contained in:
commit
787c72b1d4
@ -336,7 +336,7 @@ config PCI_EXYNOS
|
||||
config PCIE_FU740
|
||||
bool "SiFive FU740 PCIe controller"
|
||||
depends on PCI_MSI
|
||||
depends on SOC_SIFIVE || COMPILE_TEST
|
||||
depends on ARCH_SIFIVE || COMPILE_TEST
|
||||
select PCIE_DW_HOST
|
||||
help
|
||||
Say Y here if you want PCIe controller support for the SiFive
|
||||
|
@ -371,7 +371,7 @@ static int dra7xx_pcie_init_irq_domain(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops dra7xx_pcie_host_ops = {
|
||||
.host_init = dra7xx_pcie_host_init,
|
||||
.init = dra7xx_pcie_host_init,
|
||||
};
|
||||
|
||||
static void dra7xx_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||
@ -436,7 +436,7 @@ dra7xx_pcie_get_features(struct dw_pcie_ep *ep)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ep_ops pcie_ep_ops = {
|
||||
.ep_init = dra7xx_pcie_ep_init,
|
||||
.init = dra7xx_pcie_ep_init,
|
||||
.raise_irq = dra7xx_pcie_raise_irq,
|
||||
.get_features = dra7xx_pcie_get_features,
|
||||
};
|
||||
|
@ -268,7 +268,7 @@ static int exynos_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops exynos_pcie_host_ops = {
|
||||
.host_init = exynos_pcie_host_init,
|
||||
.init = exynos_pcie_host_init,
|
||||
};
|
||||
|
||||
static int exynos_add_pcie_port(struct exynos_pcie *ep,
|
||||
|
@ -1039,8 +1039,8 @@ static void imx6_pcie_host_exit(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops imx6_pcie_host_ops = {
|
||||
.host_init = imx6_pcie_host_init,
|
||||
.host_deinit = imx6_pcie_host_exit,
|
||||
.init = imx6_pcie_host_init,
|
||||
.deinit = imx6_pcie_host_exit,
|
||||
};
|
||||
|
||||
static const struct dw_pcie_ops dw_pcie_ops = {
|
||||
@ -1093,7 +1093,7 @@ imx6_pcie_ep_get_features(struct dw_pcie_ep *ep)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ep_ops pcie_ep_ops = {
|
||||
.ep_init = imx6_pcie_ep_init,
|
||||
.init = imx6_pcie_ep_init,
|
||||
.raise_irq = imx6_pcie_ep_raise_irq,
|
||||
.get_features = imx6_pcie_ep_get_features,
|
||||
};
|
||||
|
@ -838,12 +838,12 @@ static int __init ks_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops ks_pcie_host_ops = {
|
||||
.host_init = ks_pcie_host_init,
|
||||
.msi_host_init = ks_pcie_msi_host_init,
|
||||
.init = ks_pcie_host_init,
|
||||
.msi_init = ks_pcie_msi_host_init,
|
||||
};
|
||||
|
||||
static const struct dw_pcie_host_ops ks_pcie_am654_host_ops = {
|
||||
.host_init = ks_pcie_host_init,
|
||||
.init = ks_pcie_host_init,
|
||||
};
|
||||
|
||||
static irqreturn_t ks_pcie_err_irq_handler(int irq, void *priv)
|
||||
@ -944,7 +944,7 @@ ks_pcie_am654_get_features(struct dw_pcie_ep *ep)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ep_ops ks_pcie_am654_ep_ops = {
|
||||
.ep_init = ks_pcie_am654_ep_init,
|
||||
.init = ks_pcie_am654_ep_init,
|
||||
.raise_irq = ks_pcie_am654_raise_irq,
|
||||
.get_features = &ks_pcie_am654_get_features,
|
||||
};
|
||||
|
@ -184,8 +184,7 @@ static int ls_pcie_ep_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int ls_pcie_ep_func_conf_select(struct dw_pcie_ep *ep,
|
||||
u8 func_no)
|
||||
static unsigned int ls_pcie_ep_get_dbi_offset(struct dw_pcie_ep *ep, u8 func_no)
|
||||
{
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
struct ls_pcie_ep *pcie = to_ls_pcie_ep(pci);
|
||||
@ -195,10 +194,10 @@ static unsigned int ls_pcie_ep_func_conf_select(struct dw_pcie_ep *ep,
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ep_ops ls_pcie_ep_ops = {
|
||||
.ep_init = ls_pcie_ep_init,
|
||||
.init = ls_pcie_ep_init,
|
||||
.raise_irq = ls_pcie_ep_raise_irq,
|
||||
.get_features = ls_pcie_ep_get_features,
|
||||
.func_conf_select = ls_pcie_ep_func_conf_select,
|
||||
.get_dbi_offset = ls_pcie_ep_get_dbi_offset,
|
||||
};
|
||||
|
||||
static const struct ls_pcie_ep_drvdata ls1_ep_drvdata = {
|
||||
|
@ -169,7 +169,7 @@ static int ls_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops ls_pcie_host_ops = {
|
||||
.host_init = ls_pcie_host_init,
|
||||
.init = ls_pcie_host_init,
|
||||
.pme_turn_off = ls_pcie_send_turnoff_msg,
|
||||
};
|
||||
|
||||
|
@ -389,7 +389,7 @@ static int meson_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops meson_pcie_host_ops = {
|
||||
.host_init = meson_pcie_host_init,
|
||||
.init = meson_pcie_host_init,
|
||||
};
|
||||
|
||||
static const struct dw_pcie_ops dw_pcie_ops = {
|
||||
|
@ -311,7 +311,7 @@ static int al_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops al_pcie_host_ops = {
|
||||
.host_init = al_pcie_host_init,
|
||||
.init = al_pcie_host_init,
|
||||
};
|
||||
|
||||
static int al_pcie_probe(struct platform_device *pdev)
|
||||
|
@ -225,7 +225,7 @@ static irqreturn_t armada8k_pcie_irq_handler(int irq, void *arg)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops armada8k_pcie_host_ops = {
|
||||
.host_init = armada8k_pcie_host_init,
|
||||
.init = armada8k_pcie_host_init,
|
||||
};
|
||||
|
||||
static int armada8k_add_pcie_port(struct armada8k_pcie *pcie,
|
||||
|
@ -333,7 +333,7 @@ static int artpec6_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops artpec6_pcie_host_ops = {
|
||||
.host_init = artpec6_pcie_host_init,
|
||||
.init = artpec6_pcie_host_init,
|
||||
};
|
||||
|
||||
static void artpec6_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||
@ -370,7 +370,7 @@ static int artpec6_pcie_raise_irq(struct dw_pcie_ep *ep, u8 func_no,
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ep_ops pcie_ep_ops = {
|
||||
.ep_init = artpec6_pcie_ep_init,
|
||||
.init = artpec6_pcie_ep_init,
|
||||
.raise_irq = artpec6_pcie_raise_irq,
|
||||
};
|
||||
|
||||
|
@ -559,8 +559,8 @@ static void bt1_pcie_host_deinit(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops bt1_pcie_host_ops = {
|
||||
.host_init = bt1_pcie_host_init,
|
||||
.host_deinit = bt1_pcie_host_deinit,
|
||||
.init = bt1_pcie_host_init,
|
||||
.deinit = bt1_pcie_host_deinit,
|
||||
};
|
||||
|
||||
static struct bt1_pcie *bt1_pcie_create_data(struct platform_device *pdev)
|
||||
|
@ -43,46 +43,19 @@ dw_pcie_ep_get_func_from_ep(struct dw_pcie_ep *ep, u8 func_no)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static unsigned int dw_pcie_ep_func_select(struct dw_pcie_ep *ep, u8 func_no)
|
||||
{
|
||||
unsigned int func_offset = 0;
|
||||
|
||||
if (ep->ops->func_conf_select)
|
||||
func_offset = ep->ops->func_conf_select(ep, func_no);
|
||||
|
||||
return func_offset;
|
||||
}
|
||||
|
||||
static unsigned int dw_pcie_ep_get_dbi2_offset(struct dw_pcie_ep *ep, u8 func_no)
|
||||
{
|
||||
unsigned int dbi2_offset = 0;
|
||||
|
||||
if (ep->ops->get_dbi2_offset)
|
||||
dbi2_offset = ep->ops->get_dbi2_offset(ep, func_no);
|
||||
else if (ep->ops->func_conf_select) /* for backward compatibility */
|
||||
dbi2_offset = ep->ops->func_conf_select(ep, func_no);
|
||||
|
||||
return dbi2_offset;
|
||||
}
|
||||
|
||||
static void __dw_pcie_ep_reset_bar(struct dw_pcie *pci, u8 func_no,
|
||||
enum pci_barno bar, int flags)
|
||||
{
|
||||
unsigned int func_offset, dbi2_offset;
|
||||
struct dw_pcie_ep *ep = &pci->ep;
|
||||
u32 reg, reg_dbi2;
|
||||
u32 reg;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
dbi2_offset = dw_pcie_ep_get_dbi2_offset(ep, func_no);
|
||||
|
||||
reg = func_offset + PCI_BASE_ADDRESS_0 + (4 * bar);
|
||||
reg_dbi2 = dbi2_offset + PCI_BASE_ADDRESS_0 + (4 * bar);
|
||||
reg = PCI_BASE_ADDRESS_0 + (4 * bar);
|
||||
dw_pcie_dbi_ro_wr_en(pci);
|
||||
dw_pcie_writel_dbi2(pci, reg_dbi2, 0x0);
|
||||
dw_pcie_writel_dbi(pci, reg, 0x0);
|
||||
dw_pcie_ep_writel_dbi2(ep, func_no, reg, 0x0);
|
||||
dw_pcie_ep_writel_dbi(ep, func_no, reg, 0x0);
|
||||
if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) {
|
||||
dw_pcie_writel_dbi2(pci, reg_dbi2 + 4, 0x0);
|
||||
dw_pcie_writel_dbi(pci, reg + 4, 0x0);
|
||||
dw_pcie_ep_writel_dbi2(ep, func_no, reg + 4, 0x0);
|
||||
dw_pcie_ep_writel_dbi(ep, func_no, reg + 4, 0x0);
|
||||
}
|
||||
dw_pcie_dbi_ro_wr_dis(pci);
|
||||
}
|
||||
@ -101,17 +74,13 @@ EXPORT_SYMBOL_GPL(dw_pcie_ep_reset_bar);
|
||||
static u8 __dw_pcie_ep_find_next_cap(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u8 cap_ptr, u8 cap)
|
||||
{
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
unsigned int func_offset = 0;
|
||||
u8 cap_id, next_cap_ptr;
|
||||
u16 reg;
|
||||
|
||||
if (!cap_ptr)
|
||||
return 0;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
|
||||
reg = dw_pcie_readw_dbi(pci, func_offset + cap_ptr);
|
||||
reg = dw_pcie_ep_readw_dbi(ep, func_no, cap_ptr);
|
||||
cap_id = (reg & 0x00ff);
|
||||
|
||||
if (cap_id > PCI_CAP_ID_MAX)
|
||||
@ -126,14 +95,10 @@ static u8 __dw_pcie_ep_find_next_cap(struct dw_pcie_ep *ep, u8 func_no,
|
||||
|
||||
static u8 dw_pcie_ep_find_capability(struct dw_pcie_ep *ep, u8 func_no, u8 cap)
|
||||
{
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
unsigned int func_offset = 0;
|
||||
u8 next_cap_ptr;
|
||||
u16 reg;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
|
||||
reg = dw_pcie_readw_dbi(pci, func_offset + PCI_CAPABILITY_LIST);
|
||||
reg = dw_pcie_ep_readw_dbi(ep, func_no, PCI_CAPABILITY_LIST);
|
||||
next_cap_ptr = (reg & 0x00ff);
|
||||
|
||||
return __dw_pcie_ep_find_next_cap(ep, func_no, next_cap_ptr, cap);
|
||||
@ -144,23 +109,20 @@ static int dw_pcie_ep_write_header(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
{
|
||||
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
unsigned int func_offset = 0;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
|
||||
dw_pcie_dbi_ro_wr_en(pci);
|
||||
dw_pcie_writew_dbi(pci, func_offset + PCI_VENDOR_ID, hdr->vendorid);
|
||||
dw_pcie_writew_dbi(pci, func_offset + PCI_DEVICE_ID, hdr->deviceid);
|
||||
dw_pcie_writeb_dbi(pci, func_offset + PCI_REVISION_ID, hdr->revid);
|
||||
dw_pcie_writeb_dbi(pci, func_offset + PCI_CLASS_PROG, hdr->progif_code);
|
||||
dw_pcie_writew_dbi(pci, func_offset + PCI_CLASS_DEVICE,
|
||||
dw_pcie_ep_writew_dbi(ep, func_no, PCI_VENDOR_ID, hdr->vendorid);
|
||||
dw_pcie_ep_writew_dbi(ep, func_no, PCI_DEVICE_ID, hdr->deviceid);
|
||||
dw_pcie_ep_writeb_dbi(ep, func_no, PCI_REVISION_ID, hdr->revid);
|
||||
dw_pcie_ep_writeb_dbi(ep, func_no, PCI_CLASS_PROG, hdr->progif_code);
|
||||
dw_pcie_ep_writew_dbi(ep, func_no, PCI_CLASS_DEVICE,
|
||||
hdr->subclass_code | hdr->baseclass_code << 8);
|
||||
dw_pcie_writeb_dbi(pci, func_offset + PCI_CACHE_LINE_SIZE,
|
||||
dw_pcie_ep_writeb_dbi(ep, func_no, PCI_CACHE_LINE_SIZE,
|
||||
hdr->cache_line_size);
|
||||
dw_pcie_writew_dbi(pci, func_offset + PCI_SUBSYSTEM_VENDOR_ID,
|
||||
dw_pcie_ep_writew_dbi(ep, func_no, PCI_SUBSYSTEM_VENDOR_ID,
|
||||
hdr->subsys_vendor_id);
|
||||
dw_pcie_writew_dbi(pci, func_offset + PCI_SUBSYSTEM_ID, hdr->subsys_id);
|
||||
dw_pcie_writeb_dbi(pci, func_offset + PCI_INTERRUPT_PIN,
|
||||
dw_pcie_ep_writew_dbi(ep, func_no, PCI_SUBSYSTEM_ID, hdr->subsys_id);
|
||||
dw_pcie_ep_writeb_dbi(ep, func_no, PCI_INTERRUPT_PIN,
|
||||
hdr->interrupt_pin);
|
||||
dw_pcie_dbi_ro_wr_dis(pci);
|
||||
|
||||
@ -243,18 +205,13 @@ static int dw_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
{
|
||||
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
unsigned int func_offset, dbi2_offset;
|
||||
enum pci_barno bar = epf_bar->barno;
|
||||
size_t size = epf_bar->size;
|
||||
int flags = epf_bar->flags;
|
||||
u32 reg, reg_dbi2;
|
||||
int ret, type;
|
||||
u32 reg;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
dbi2_offset = dw_pcie_ep_get_dbi2_offset(ep, func_no);
|
||||
|
||||
reg = PCI_BASE_ADDRESS_0 + (4 * bar) + func_offset;
|
||||
reg_dbi2 = PCI_BASE_ADDRESS_0 + (4 * bar) + dbi2_offset;
|
||||
reg = PCI_BASE_ADDRESS_0 + (4 * bar);
|
||||
|
||||
if (!(flags & PCI_BASE_ADDRESS_SPACE))
|
||||
type = PCIE_ATU_TYPE_MEM;
|
||||
@ -270,12 +227,12 @@ static int dw_pcie_ep_set_bar(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
|
||||
dw_pcie_dbi_ro_wr_en(pci);
|
||||
|
||||
dw_pcie_writel_dbi2(pci, reg_dbi2, lower_32_bits(size - 1));
|
||||
dw_pcie_writel_dbi(pci, reg, flags);
|
||||
dw_pcie_ep_writel_dbi2(ep, func_no, reg, lower_32_bits(size - 1));
|
||||
dw_pcie_ep_writel_dbi(ep, func_no, reg, flags);
|
||||
|
||||
if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) {
|
||||
dw_pcie_writel_dbi2(pci, reg_dbi2 + 4, upper_32_bits(size - 1));
|
||||
dw_pcie_writel_dbi(pci, reg + 4, 0);
|
||||
dw_pcie_ep_writel_dbi2(ep, func_no, reg + 4, upper_32_bits(size - 1));
|
||||
dw_pcie_ep_writel_dbi(ep, func_no, reg + 4, 0);
|
||||
}
|
||||
|
||||
ep->epf_bar[bar] = epf_bar;
|
||||
@ -335,19 +292,15 @@ static int dw_pcie_ep_map_addr(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
static int dw_pcie_ep_get_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
|
||||
{
|
||||
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
u32 val, reg;
|
||||
unsigned int func_offset = 0;
|
||||
struct dw_pcie_ep_func *ep_func;
|
||||
u32 val, reg;
|
||||
|
||||
ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
|
||||
if (!ep_func || !ep_func->msi_cap)
|
||||
return -EINVAL;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
|
||||
reg = ep_func->msi_cap + func_offset + PCI_MSI_FLAGS;
|
||||
val = dw_pcie_readw_dbi(pci, reg);
|
||||
reg = ep_func->msi_cap + PCI_MSI_FLAGS;
|
||||
val = dw_pcie_ep_readw_dbi(ep, func_no, reg);
|
||||
if (!(val & PCI_MSI_FLAGS_ENABLE))
|
||||
return -EINVAL;
|
||||
|
||||
@ -361,22 +314,19 @@ static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
{
|
||||
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
u32 val, reg;
|
||||
unsigned int func_offset = 0;
|
||||
struct dw_pcie_ep_func *ep_func;
|
||||
u32 val, reg;
|
||||
|
||||
ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
|
||||
if (!ep_func || !ep_func->msi_cap)
|
||||
return -EINVAL;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
|
||||
reg = ep_func->msi_cap + func_offset + PCI_MSI_FLAGS;
|
||||
val = dw_pcie_readw_dbi(pci, reg);
|
||||
reg = ep_func->msi_cap + PCI_MSI_FLAGS;
|
||||
val = dw_pcie_ep_readw_dbi(ep, func_no, reg);
|
||||
val &= ~PCI_MSI_FLAGS_QMASK;
|
||||
val |= FIELD_PREP(PCI_MSI_FLAGS_QMASK, interrupts);
|
||||
dw_pcie_dbi_ro_wr_en(pci);
|
||||
dw_pcie_writew_dbi(pci, reg, val);
|
||||
dw_pcie_ep_writew_dbi(ep, func_no, reg, val);
|
||||
dw_pcie_dbi_ro_wr_dis(pci);
|
||||
|
||||
return 0;
|
||||
@ -385,19 +335,15 @@ static int dw_pcie_ep_set_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
static int dw_pcie_ep_get_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
|
||||
{
|
||||
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
u32 val, reg;
|
||||
unsigned int func_offset = 0;
|
||||
struct dw_pcie_ep_func *ep_func;
|
||||
u32 val, reg;
|
||||
|
||||
ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
|
||||
if (!ep_func || !ep_func->msix_cap)
|
||||
return -EINVAL;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
|
||||
reg = ep_func->msix_cap + func_offset + PCI_MSIX_FLAGS;
|
||||
val = dw_pcie_readw_dbi(pci, reg);
|
||||
reg = ep_func->msix_cap + PCI_MSIX_FLAGS;
|
||||
val = dw_pcie_ep_readw_dbi(ep, func_no, reg);
|
||||
if (!(val & PCI_MSIX_FLAGS_ENABLE))
|
||||
return -EINVAL;
|
||||
|
||||
@ -411,9 +357,8 @@ static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
{
|
||||
struct dw_pcie_ep *ep = epc_get_drvdata(epc);
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
u32 val, reg;
|
||||
unsigned int func_offset = 0;
|
||||
struct dw_pcie_ep_func *ep_func;
|
||||
u32 val, reg;
|
||||
|
||||
ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
|
||||
if (!ep_func || !ep_func->msix_cap)
|
||||
@ -421,21 +366,19 @@ static int dw_pcie_ep_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no,
|
||||
|
||||
dw_pcie_dbi_ro_wr_en(pci);
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
|
||||
reg = ep_func->msix_cap + func_offset + PCI_MSIX_FLAGS;
|
||||
val = dw_pcie_readw_dbi(pci, reg);
|
||||
reg = ep_func->msix_cap + PCI_MSIX_FLAGS;
|
||||
val = dw_pcie_ep_readw_dbi(ep, func_no, reg);
|
||||
val &= ~PCI_MSIX_FLAGS_QSIZE;
|
||||
val |= interrupts;
|
||||
dw_pcie_writew_dbi(pci, reg, val);
|
||||
|
||||
reg = ep_func->msix_cap + func_offset + PCI_MSIX_TABLE;
|
||||
reg = ep_func->msix_cap + PCI_MSIX_TABLE;
|
||||
val = offset | bir;
|
||||
dw_pcie_writel_dbi(pci, reg, val);
|
||||
dw_pcie_ep_writel_dbi(ep, func_no, reg, val);
|
||||
|
||||
reg = ep_func->msix_cap + func_offset + PCI_MSIX_PBA;
|
||||
reg = ep_func->msix_cap + PCI_MSIX_PBA;
|
||||
val = (offset + (interrupts * PCI_MSIX_ENTRY_SIZE)) | bir;
|
||||
dw_pcie_writel_dbi(pci, reg, val);
|
||||
dw_pcie_ep_writel_dbi(ep, func_no, reg, val);
|
||||
|
||||
dw_pcie_dbi_ro_wr_dis(pci);
|
||||
|
||||
@ -510,38 +453,34 @@ EXPORT_SYMBOL_GPL(dw_pcie_ep_raise_legacy_irq);
|
||||
int dw_pcie_ep_raise_msi_irq(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u8 interrupt_num)
|
||||
{
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
u32 msg_addr_lower, msg_addr_upper, reg;
|
||||
struct dw_pcie_ep_func *ep_func;
|
||||
struct pci_epc *epc = ep->epc;
|
||||
unsigned int aligned_offset;
|
||||
unsigned int func_offset = 0;
|
||||
u16 msg_ctrl, msg_data;
|
||||
u32 msg_addr_lower, msg_addr_upper, reg;
|
||||
u64 msg_addr;
|
||||
bool has_upper;
|
||||
u64 msg_addr;
|
||||
int ret;
|
||||
|
||||
ep_func = dw_pcie_ep_get_func_from_ep(ep, func_no);
|
||||
if (!ep_func || !ep_func->msi_cap)
|
||||
return -EINVAL;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
|
||||
/* Raise MSI per the PCI Local Bus Specification Revision 3.0, 6.8.1. */
|
||||
reg = ep_func->msi_cap + func_offset + PCI_MSI_FLAGS;
|
||||
msg_ctrl = dw_pcie_readw_dbi(pci, reg);
|
||||
reg = ep_func->msi_cap + PCI_MSI_FLAGS;
|
||||
msg_ctrl = dw_pcie_ep_readw_dbi(ep, func_no, reg);
|
||||
has_upper = !!(msg_ctrl & PCI_MSI_FLAGS_64BIT);
|
||||
reg = ep_func->msi_cap + func_offset + PCI_MSI_ADDRESS_LO;
|
||||
msg_addr_lower = dw_pcie_readl_dbi(pci, reg);
|
||||
reg = ep_func->msi_cap + PCI_MSI_ADDRESS_LO;
|
||||
msg_addr_lower = dw_pcie_ep_readl_dbi(ep, func_no, reg);
|
||||
if (has_upper) {
|
||||
reg = ep_func->msi_cap + func_offset + PCI_MSI_ADDRESS_HI;
|
||||
msg_addr_upper = dw_pcie_readl_dbi(pci, reg);
|
||||
reg = ep_func->msi_cap + func_offset + PCI_MSI_DATA_64;
|
||||
msg_data = dw_pcie_readw_dbi(pci, reg);
|
||||
reg = ep_func->msi_cap + PCI_MSI_ADDRESS_HI;
|
||||
msg_addr_upper = dw_pcie_ep_readl_dbi(ep, func_no, reg);
|
||||
reg = ep_func->msi_cap + PCI_MSI_DATA_64;
|
||||
msg_data = dw_pcie_ep_readw_dbi(ep, func_no, reg);
|
||||
} else {
|
||||
msg_addr_upper = 0;
|
||||
reg = ep_func->msi_cap + func_offset + PCI_MSI_DATA_32;
|
||||
msg_data = dw_pcie_readw_dbi(pci, reg);
|
||||
reg = ep_func->msi_cap + PCI_MSI_DATA_32;
|
||||
msg_data = dw_pcie_ep_readw_dbi(ep, func_no, reg);
|
||||
}
|
||||
aligned_offset = msg_addr_lower & (epc->mem->window.page_size - 1);
|
||||
msg_addr = ((u64)msg_addr_upper) << 32 |
|
||||
@ -582,10 +521,9 @@ int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u16 interrupt_num)
|
||||
{
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
struct dw_pcie_ep_func *ep_func;
|
||||
struct pci_epf_msix_tbl *msix_tbl;
|
||||
struct dw_pcie_ep_func *ep_func;
|
||||
struct pci_epc *epc = ep->epc;
|
||||
unsigned int func_offset = 0;
|
||||
u32 reg, msg_data, vec_ctrl;
|
||||
unsigned int aligned_offset;
|
||||
u32 tbl_offset;
|
||||
@ -597,10 +535,8 @@ int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
|
||||
if (!ep_func || !ep_func->msix_cap)
|
||||
return -EINVAL;
|
||||
|
||||
func_offset = dw_pcie_ep_func_select(ep, func_no);
|
||||
|
||||
reg = ep_func->msix_cap + func_offset + PCI_MSIX_TABLE;
|
||||
tbl_offset = dw_pcie_readl_dbi(pci, reg);
|
||||
reg = ep_func->msix_cap + PCI_MSIX_TABLE;
|
||||
tbl_offset = dw_pcie_ep_readl_dbi(ep, func_no, reg);
|
||||
bir = FIELD_GET(PCI_MSIX_TABLE_BIR, tbl_offset);
|
||||
tbl_offset &= PCI_MSIX_TABLE_OFFSET;
|
||||
|
||||
@ -615,6 +551,7 @@ int dw_pcie_ep_raise_msix_irq(struct dw_pcie_ep *ep, u8 func_no,
|
||||
}
|
||||
|
||||
aligned_offset = msg_addr & (epc->mem->window.page_size - 1);
|
||||
msg_addr &= ~aligned_offset;
|
||||
ret = dw_pcie_ep_map_addr(epc, func_no, 0, ep->msi_mem_phys, msg_addr,
|
||||
epc->mem->window.page_size);
|
||||
if (ret)
|
||||
@ -794,8 +731,8 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||
list_add_tail(&ep_func->list, &ep->func_list);
|
||||
}
|
||||
|
||||
if (ep->ops->ep_init)
|
||||
ep->ops->ep_init(ep);
|
||||
if (ep->ops->init)
|
||||
ep->ops->init(ep);
|
||||
|
||||
ret = pci_epc_mem_init(epc, ep->phys_base, ep->addr_size,
|
||||
ep->page_size);
|
||||
|
@ -441,14 +441,14 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
bridge->ops = &dw_pcie_ops;
|
||||
bridge->child_ops = &dw_child_pcie_ops;
|
||||
|
||||
if (pp->ops->host_init) {
|
||||
ret = pp->ops->host_init(pp);
|
||||
if (pp->ops->init) {
|
||||
ret = pp->ops->init(pp);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (pci_msi_enabled()) {
|
||||
pp->has_msi_ctrl = !(pp->ops->msi_host_init ||
|
||||
pp->has_msi_ctrl = !(pp->ops->msi_init ||
|
||||
of_property_read_bool(np, "msi-parent") ||
|
||||
of_property_read_bool(np, "msi-map"));
|
||||
|
||||
@ -464,8 +464,8 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
goto err_deinit_host;
|
||||
}
|
||||
|
||||
if (pp->ops->msi_host_init) {
|
||||
ret = pp->ops->msi_host_init(pp);
|
||||
if (pp->ops->msi_init) {
|
||||
ret = pp->ops->msi_init(pp);
|
||||
if (ret < 0)
|
||||
goto err_deinit_host;
|
||||
} else if (pp->has_msi_ctrl) {
|
||||
@ -502,8 +502,8 @@ int dw_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
if (ret)
|
||||
goto err_stop_link;
|
||||
|
||||
if (pp->ops->host_post_init)
|
||||
pp->ops->host_post_init(pp);
|
||||
if (pp->ops->post_init)
|
||||
pp->ops->post_init(pp);
|
||||
|
||||
return 0;
|
||||
|
||||
@ -518,8 +518,8 @@ err_free_msi:
|
||||
dw_pcie_free_msi(pp);
|
||||
|
||||
err_deinit_host:
|
||||
if (pp->ops->host_deinit)
|
||||
pp->ops->host_deinit(pp);
|
||||
if (pp->ops->deinit)
|
||||
pp->ops->deinit(pp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -539,8 +539,8 @@ void dw_pcie_host_deinit(struct dw_pcie_rp *pp)
|
||||
if (pp->has_msi_ctrl)
|
||||
dw_pcie_free_msi(pp);
|
||||
|
||||
if (pp->ops->host_deinit)
|
||||
pp->ops->host_deinit(pp);
|
||||
if (pp->ops->deinit)
|
||||
pp->ops->deinit(pp);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dw_pcie_host_deinit);
|
||||
|
||||
@ -842,8 +842,8 @@ int dw_pcie_suspend_noirq(struct dw_pcie *pci)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (pci->pp.ops->host_deinit)
|
||||
pci->pp.ops->host_deinit(&pci->pp);
|
||||
if (pci->pp.ops->deinit)
|
||||
pci->pp.ops->deinit(&pci->pp);
|
||||
|
||||
pci->suspended = true;
|
||||
|
||||
@ -860,8 +860,8 @@ int dw_pcie_resume_noirq(struct dw_pcie *pci)
|
||||
|
||||
pci->suspended = false;
|
||||
|
||||
if (pci->pp.ops->host_init) {
|
||||
ret = pci->pp.ops->host_init(&pci->pp);
|
||||
if (pci->pp.ops->init) {
|
||||
ret = pci->pp.ops->init(&pci->pp);
|
||||
if (ret) {
|
||||
dev_err(pci->dev, "Host init failed: %d\n", ret);
|
||||
return ret;
|
||||
|
@ -74,7 +74,7 @@ dw_plat_pcie_get_features(struct dw_pcie_ep *ep)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ep_ops pcie_ep_ops = {
|
||||
.ep_init = dw_plat_pcie_ep_init,
|
||||
.init = dw_plat_pcie_ep_init,
|
||||
.raise_irq = dw_plat_pcie_ep_raise_irq,
|
||||
.get_features = dw_plat_pcie_get_features,
|
||||
};
|
||||
|
@ -300,10 +300,10 @@ enum dw_pcie_ltssm {
|
||||
};
|
||||
|
||||
struct dw_pcie_host_ops {
|
||||
int (*host_init)(struct dw_pcie_rp *pp);
|
||||
void (*host_deinit)(struct dw_pcie_rp *pp);
|
||||
void (*host_post_init)(struct dw_pcie_rp *pp);
|
||||
int (*msi_host_init)(struct dw_pcie_rp *pp);
|
||||
int (*init)(struct dw_pcie_rp *pp);
|
||||
void (*deinit)(struct dw_pcie_rp *pp);
|
||||
void (*post_init)(struct dw_pcie_rp *pp);
|
||||
int (*msi_init)(struct dw_pcie_rp *pp);
|
||||
void (*pme_turn_off)(struct dw_pcie_rp *pp);
|
||||
};
|
||||
|
||||
@ -332,7 +332,7 @@ struct dw_pcie_rp {
|
||||
|
||||
struct dw_pcie_ep_ops {
|
||||
void (*pre_init)(struct dw_pcie_ep *ep);
|
||||
void (*ep_init)(struct dw_pcie_ep *ep);
|
||||
void (*init)(struct dw_pcie_ep *ep);
|
||||
void (*deinit)(struct dw_pcie_ep *ep);
|
||||
int (*raise_irq)(struct dw_pcie_ep *ep, u8 func_no,
|
||||
enum pci_epc_irq_type type, u16 interrupt_num);
|
||||
@ -344,7 +344,7 @@ struct dw_pcie_ep_ops {
|
||||
* return a 0, and implement code in callback function of platform
|
||||
* driver.
|
||||
*/
|
||||
unsigned int (*func_conf_select)(struct dw_pcie_ep *ep, u8 func_no);
|
||||
unsigned int (*get_dbi_offset)(struct dw_pcie_ep *ep, u8 func_no);
|
||||
unsigned int (*get_dbi2_offset)(struct dw_pcie_ep *ep, u8 func_no);
|
||||
};
|
||||
|
||||
@ -486,6 +486,99 @@ static inline void dw_pcie_writel_dbi2(struct dw_pcie *pci, u32 reg, u32 val)
|
||||
dw_pcie_write_dbi2(pci, reg, 0x4, val);
|
||||
}
|
||||
|
||||
static inline unsigned int dw_pcie_ep_get_dbi_offset(struct dw_pcie_ep *ep,
|
||||
u8 func_no)
|
||||
{
|
||||
unsigned int dbi_offset = 0;
|
||||
|
||||
if (ep->ops->get_dbi_offset)
|
||||
dbi_offset = ep->ops->get_dbi_offset(ep, func_no);
|
||||
|
||||
return dbi_offset;
|
||||
}
|
||||
|
||||
static inline u32 dw_pcie_ep_read_dbi(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg, size_t size)
|
||||
{
|
||||
unsigned int offset = dw_pcie_ep_get_dbi_offset(ep, func_no);
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
|
||||
return dw_pcie_read_dbi(pci, offset + reg, size);
|
||||
}
|
||||
|
||||
static inline void dw_pcie_ep_write_dbi(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg, size_t size, u32 val)
|
||||
{
|
||||
unsigned int offset = dw_pcie_ep_get_dbi_offset(ep, func_no);
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
|
||||
dw_pcie_write_dbi(pci, offset + reg, size, val);
|
||||
}
|
||||
|
||||
static inline void dw_pcie_ep_writel_dbi(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg, u32 val)
|
||||
{
|
||||
dw_pcie_ep_write_dbi(ep, func_no, reg, 0x4, val);
|
||||
}
|
||||
|
||||
static inline u32 dw_pcie_ep_readl_dbi(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg)
|
||||
{
|
||||
return dw_pcie_ep_read_dbi(ep, func_no, reg, 0x4);
|
||||
}
|
||||
|
||||
static inline void dw_pcie_ep_writew_dbi(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg, u16 val)
|
||||
{
|
||||
dw_pcie_ep_write_dbi(ep, func_no, reg, 0x2, val);
|
||||
}
|
||||
|
||||
static inline u16 dw_pcie_ep_readw_dbi(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg)
|
||||
{
|
||||
return dw_pcie_ep_read_dbi(ep, func_no, reg, 0x2);
|
||||
}
|
||||
|
||||
static inline void dw_pcie_ep_writeb_dbi(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg, u8 val)
|
||||
{
|
||||
dw_pcie_ep_write_dbi(ep, func_no, reg, 0x1, val);
|
||||
}
|
||||
|
||||
static inline u8 dw_pcie_ep_readb_dbi(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg)
|
||||
{
|
||||
return dw_pcie_ep_read_dbi(ep, func_no, reg, 0x1);
|
||||
}
|
||||
|
||||
static inline unsigned int dw_pcie_ep_get_dbi2_offset(struct dw_pcie_ep *ep,
|
||||
u8 func_no)
|
||||
{
|
||||
unsigned int dbi2_offset = 0;
|
||||
|
||||
if (ep->ops->get_dbi2_offset)
|
||||
dbi2_offset = ep->ops->get_dbi2_offset(ep, func_no);
|
||||
else if (ep->ops->get_dbi_offset) /* for backward compatibility */
|
||||
dbi2_offset = ep->ops->get_dbi_offset(ep, func_no);
|
||||
|
||||
return dbi2_offset;
|
||||
}
|
||||
|
||||
static inline void dw_pcie_ep_write_dbi2(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg, size_t size, u32 val)
|
||||
{
|
||||
unsigned int offset = dw_pcie_ep_get_dbi2_offset(ep, func_no);
|
||||
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);
|
||||
|
||||
dw_pcie_write_dbi2(pci, offset + reg, size, val);
|
||||
}
|
||||
|
||||
static inline void dw_pcie_ep_writel_dbi2(struct dw_pcie_ep *ep, u8 func_no,
|
||||
u32 reg, u32 val)
|
||||
{
|
||||
dw_pcie_ep_write_dbi2(ep, func_no, reg, 0x4, val);
|
||||
}
|
||||
|
||||
static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci)
|
||||
{
|
||||
u32 reg;
|
||||
|
@ -215,7 +215,7 @@ static int rockchip_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops rockchip_pcie_host_ops = {
|
||||
.host_init = rockchip_pcie_host_init,
|
||||
.init = rockchip_pcie_host_init,
|
||||
};
|
||||
|
||||
static int rockchip_pcie_clk_init(struct rockchip_pcie *rockchip)
|
||||
|
@ -279,7 +279,7 @@ static int fu740_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops fu740_pcie_host_ops = {
|
||||
.host_init = fu740_pcie_host_init,
|
||||
.init = fu740_pcie_host_init,
|
||||
};
|
||||
|
||||
static const struct dw_pcie_ops dw_pcie_ops = {
|
||||
|
@ -198,7 +198,7 @@ static int histb_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops histb_pcie_host_ops = {
|
||||
.host_init = histb_pcie_host_init,
|
||||
.init = histb_pcie_host_init,
|
||||
};
|
||||
|
||||
static void histb_pcie_host_disable(struct histb_pcie *hipcie)
|
||||
|
@ -391,7 +391,7 @@ static const struct dw_pcie_ops intel_pcie_ops = {
|
||||
};
|
||||
|
||||
static const struct dw_pcie_host_ops intel_pcie_dw_ops = {
|
||||
.host_init = intel_pcie_rc_init,
|
||||
.init = intel_pcie_rc_init,
|
||||
};
|
||||
|
||||
static int intel_pcie_probe(struct platform_device *pdev)
|
||||
|
@ -325,7 +325,7 @@ keembay_pcie_get_features(struct dw_pcie_ep *ep)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ep_ops keembay_pcie_ep_ops = {
|
||||
.ep_init = keembay_pcie_ep_init,
|
||||
.init = keembay_pcie_ep_init,
|
||||
.raise_irq = keembay_pcie_ep_raise_irq,
|
||||
.get_features = keembay_pcie_get_features,
|
||||
};
|
||||
|
@ -672,7 +672,7 @@ static const struct dw_pcie_ops kirin_dw_pcie_ops = {
|
||||
};
|
||||
|
||||
static const struct dw_pcie_host_ops kirin_pcie_host_ops = {
|
||||
.host_init = kirin_pcie_host_init,
|
||||
.init = kirin_pcie_host_init,
|
||||
};
|
||||
|
||||
static int kirin_pcie_power_off(struct kirin_pcie *kirin_pcie)
|
||||
|
@ -796,7 +796,7 @@ static void qcom_pcie_ep_init(struct dw_pcie_ep *ep)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ep_ops pci_ep_ops = {
|
||||
.ep_init = qcom_pcie_ep_init,
|
||||
.init = qcom_pcie_ep_init,
|
||||
.raise_irq = qcom_pcie_ep_raise_irq,
|
||||
.get_features = qcom_pcie_epc_get_features,
|
||||
};
|
||||
|
@ -1244,9 +1244,9 @@ static void qcom_pcie_host_post_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops qcom_pcie_dw_ops = {
|
||||
.host_init = qcom_pcie_host_init,
|
||||
.host_deinit = qcom_pcie_host_deinit,
|
||||
.host_post_init = qcom_pcie_host_post_init,
|
||||
.init = qcom_pcie_host_init,
|
||||
.deinit = qcom_pcie_host_deinit,
|
||||
.post_init = qcom_pcie_host_post_init,
|
||||
};
|
||||
|
||||
/* Qcom IP rev.: 2.1.0 Synopsys IP rev.: 4.01a */
|
||||
|
@ -307,8 +307,8 @@ static void rcar_gen4_pcie_host_deinit(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops rcar_gen4_pcie_host_ops = {
|
||||
.host_init = rcar_gen4_pcie_host_init,
|
||||
.host_deinit = rcar_gen4_pcie_host_deinit,
|
||||
.init = rcar_gen4_pcie_host_init,
|
||||
.deinit = rcar_gen4_pcie_host_deinit,
|
||||
};
|
||||
|
||||
static int rcar_gen4_add_dw_pcie_rp(struct rcar_gen4_pcie *rcar)
|
||||
@ -394,7 +394,7 @@ rcar_gen4_pcie_ep_get_features(struct dw_pcie_ep *ep)
|
||||
return &rcar_gen4_pcie_epc_features;
|
||||
}
|
||||
|
||||
static unsigned int rcar_gen4_pcie_ep_func_conf_select(struct dw_pcie_ep *ep,
|
||||
static unsigned int rcar_gen4_pcie_ep_get_dbi_offset(struct dw_pcie_ep *ep,
|
||||
u8 func_no)
|
||||
{
|
||||
return func_no * RCAR_GEN4_PCIE_EP_FUNC_DBI_OFFSET;
|
||||
@ -408,11 +408,11 @@ static unsigned int rcar_gen4_pcie_ep_get_dbi2_offset(struct dw_pcie_ep *ep,
|
||||
|
||||
static const struct dw_pcie_ep_ops pcie_ep_ops = {
|
||||
.pre_init = rcar_gen4_pcie_ep_pre_init,
|
||||
.ep_init = rcar_gen4_pcie_ep_init,
|
||||
.init = rcar_gen4_pcie_ep_init,
|
||||
.deinit = rcar_gen4_pcie_ep_deinit,
|
||||
.raise_irq = rcar_gen4_pcie_ep_raise_irq,
|
||||
.get_features = rcar_gen4_pcie_ep_get_features,
|
||||
.func_conf_select = rcar_gen4_pcie_ep_func_conf_select,
|
||||
.get_dbi_offset = rcar_gen4_pcie_ep_get_dbi_offset,
|
||||
.get_dbi2_offset = rcar_gen4_pcie_ep_get_dbi2_offset,
|
||||
};
|
||||
|
||||
@ -436,7 +436,7 @@ static void rcar_gen4_remove_dw_pcie_ep(struct rcar_gen4_pcie *rcar)
|
||||
/* Common */
|
||||
static int rcar_gen4_add_dw_pcie(struct rcar_gen4_pcie *rcar)
|
||||
{
|
||||
rcar->mode = (enum dw_pcie_device_mode)of_device_get_match_data(&rcar->pdev->dev);
|
||||
rcar->mode = (uintptr_t)of_device_get_match_data(&rcar->pdev->dev);
|
||||
|
||||
switch (rcar->mode) {
|
||||
case DW_PCIE_RC_TYPE:
|
||||
|
@ -148,7 +148,7 @@ static int spear13xx_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops spear13xx_pcie_host_ops = {
|
||||
.host_init = spear13xx_pcie_host_init,
|
||||
.init = spear13xx_pcie_host_init,
|
||||
};
|
||||
|
||||
static int spear13xx_add_pcie_port(struct spear13xx_pcie *spear13xx_pcie,
|
||||
|
@ -1060,7 +1060,7 @@ static const struct dw_pcie_ops tegra_dw_pcie_ops = {
|
||||
};
|
||||
|
||||
static const struct dw_pcie_host_ops tegra_pcie_dw_host_ops = {
|
||||
.host_init = tegra_pcie_dw_host_init,
|
||||
.init = tegra_pcie_dw_host_init,
|
||||
};
|
||||
|
||||
static void tegra_pcie_disable_phy(struct tegra_pcie_dw *pcie)
|
||||
|
@ -284,7 +284,7 @@ uniphier_pcie_get_features(struct dw_pcie_ep *ep)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_ep_ops uniphier_pcie_ep_ops = {
|
||||
.ep_init = uniphier_pcie_ep_init,
|
||||
.init = uniphier_pcie_ep_init,
|
||||
.raise_irq = uniphier_pcie_ep_raise_irq,
|
||||
.get_features = uniphier_pcie_get_features,
|
||||
};
|
||||
|
@ -311,7 +311,7 @@ static int uniphier_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops uniphier_pcie_host_ops = {
|
||||
.host_init = uniphier_pcie_host_init,
|
||||
.init = uniphier_pcie_host_init,
|
||||
};
|
||||
|
||||
static int uniphier_pcie_host_enable(struct uniphier_pcie *pcie)
|
||||
|
@ -236,7 +236,7 @@ static int visconti_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
}
|
||||
|
||||
static const struct dw_pcie_host_ops visconti_pcie_host_ops = {
|
||||
.host_init = visconti_pcie_host_init,
|
||||
.init = visconti_pcie_host_init,
|
||||
};
|
||||
|
||||
static int visconti_get_resources(struct platform_device *pdev,
|
||||
|
@ -52,7 +52,7 @@ static int iproc_pltfm_pcie_probe(struct platform_device *pdev)
|
||||
pcie = pci_host_bridge_priv(bridge);
|
||||
|
||||
pcie->dev = dev;
|
||||
pcie->type = (enum iproc_pcie_type) of_device_get_match_data(dev);
|
||||
pcie->type = (uintptr_t)of_device_get_match_data(dev);
|
||||
|
||||
ret = of_address_to_resource(np, 0, ®);
|
||||
if (ret < 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user