Merge tag 'pci-v4.5-fixes-4' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
Pull PCI fixes from Bjorn Helgaas: "Freescale Layerscape host bridge driver: Fix MSG TLP drop setting (Minghuan Lian) TI Keystone host bridge driver: Fix MSI code that retrieves struct pcie_port pointer (Murali Karicheri)" * tag 'pci-v4.5-fixes-4' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: PCI: layerscape: Fix MSG TLP drop setting PCI: keystone: Fix MSI code that retrieves struct pcie_port pointer
This commit is contained in:
@ -58,11 +58,6 @@
|
|||||||
|
|
||||||
#define to_keystone_pcie(x) container_of(x, struct keystone_pcie, pp)
|
#define to_keystone_pcie(x) container_of(x, struct keystone_pcie, pp)
|
||||||
|
|
||||||
static inline struct pcie_port *sys_to_pcie(struct pci_sys_data *sys)
|
|
||||||
{
|
|
||||||
return sys->private_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void update_reg_offset_bit_pos(u32 offset, u32 *reg_offset,
|
static inline void update_reg_offset_bit_pos(u32 offset, u32 *reg_offset,
|
||||||
u32 *bit_pos)
|
u32 *bit_pos)
|
||||||
{
|
{
|
||||||
@ -108,7 +103,7 @@ static void ks_dw_pcie_msi_irq_ack(struct irq_data *d)
|
|||||||
struct pcie_port *pp;
|
struct pcie_port *pp;
|
||||||
|
|
||||||
msi = irq_data_get_msi_desc(d);
|
msi = irq_data_get_msi_desc(d);
|
||||||
pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
|
pp = (struct pcie_port *) msi_desc_to_pci_sysdata(msi);
|
||||||
ks_pcie = to_keystone_pcie(pp);
|
ks_pcie = to_keystone_pcie(pp);
|
||||||
offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
|
offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
|
||||||
update_reg_offset_bit_pos(offset, ®_offset, &bit_pos);
|
update_reg_offset_bit_pos(offset, ®_offset, &bit_pos);
|
||||||
@ -146,7 +141,7 @@ static void ks_dw_pcie_msi_irq_mask(struct irq_data *d)
|
|||||||
u32 offset;
|
u32 offset;
|
||||||
|
|
||||||
msi = irq_data_get_msi_desc(d);
|
msi = irq_data_get_msi_desc(d);
|
||||||
pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
|
pp = (struct pcie_port *) msi_desc_to_pci_sysdata(msi);
|
||||||
ks_pcie = to_keystone_pcie(pp);
|
ks_pcie = to_keystone_pcie(pp);
|
||||||
offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
|
offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
|
||||||
|
|
||||||
@ -167,7 +162,7 @@ static void ks_dw_pcie_msi_irq_unmask(struct irq_data *d)
|
|||||||
u32 offset;
|
u32 offset;
|
||||||
|
|
||||||
msi = irq_data_get_msi_desc(d);
|
msi = irq_data_get_msi_desc(d);
|
||||||
pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
|
pp = (struct pcie_port *) msi_desc_to_pci_sysdata(msi);
|
||||||
ks_pcie = to_keystone_pcie(pp);
|
ks_pcie = to_keystone_pcie(pp);
|
||||||
offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
|
offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
|
||||||
|
|
||||||
|
@ -77,6 +77,16 @@ static void ls_pcie_fix_class(struct ls_pcie *pcie)
|
|||||||
iowrite16(PCI_CLASS_BRIDGE_PCI, pcie->dbi + PCI_CLASS_DEVICE);
|
iowrite16(PCI_CLASS_BRIDGE_PCI, pcie->dbi + PCI_CLASS_DEVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Drop MSG TLP except for Vendor MSG */
|
||||||
|
static void ls_pcie_drop_msg_tlp(struct ls_pcie *pcie)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
val = ioread32(pcie->dbi + PCIE_STRFMR1);
|
||||||
|
val &= 0xDFFFFFFF;
|
||||||
|
iowrite32(val, pcie->dbi + PCIE_STRFMR1);
|
||||||
|
}
|
||||||
|
|
||||||
static int ls1021_pcie_link_up(struct pcie_port *pp)
|
static int ls1021_pcie_link_up(struct pcie_port *pp)
|
||||||
{
|
{
|
||||||
u32 state;
|
u32 state;
|
||||||
@ -97,7 +107,7 @@ static int ls1021_pcie_link_up(struct pcie_port *pp)
|
|||||||
static void ls1021_pcie_host_init(struct pcie_port *pp)
|
static void ls1021_pcie_host_init(struct pcie_port *pp)
|
||||||
{
|
{
|
||||||
struct ls_pcie *pcie = to_ls_pcie(pp);
|
struct ls_pcie *pcie = to_ls_pcie(pp);
|
||||||
u32 val, index[2];
|
u32 index[2];
|
||||||
|
|
||||||
pcie->scfg = syscon_regmap_lookup_by_phandle(pp->dev->of_node,
|
pcie->scfg = syscon_regmap_lookup_by_phandle(pp->dev->of_node,
|
||||||
"fsl,pcie-scfg");
|
"fsl,pcie-scfg");
|
||||||
@ -116,13 +126,7 @@ static void ls1021_pcie_host_init(struct pcie_port *pp)
|
|||||||
|
|
||||||
dw_pcie_setup_rc(pp);
|
dw_pcie_setup_rc(pp);
|
||||||
|
|
||||||
/*
|
ls_pcie_drop_msg_tlp(pcie);
|
||||||
* LS1021A Workaround for internal TKT228622
|
|
||||||
* to fix the INTx hang issue
|
|
||||||
*/
|
|
||||||
val = ioread32(pcie->dbi + PCIE_STRFMR1);
|
|
||||||
val &= 0xffff;
|
|
||||||
iowrite32(val, pcie->dbi + PCIE_STRFMR1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ls_pcie_link_up(struct pcie_port *pp)
|
static int ls_pcie_link_up(struct pcie_port *pp)
|
||||||
@ -147,6 +151,7 @@ static void ls_pcie_host_init(struct pcie_port *pp)
|
|||||||
iowrite32(1, pcie->dbi + PCIE_DBI_RO_WR_EN);
|
iowrite32(1, pcie->dbi + PCIE_DBI_RO_WR_EN);
|
||||||
ls_pcie_fix_class(pcie);
|
ls_pcie_fix_class(pcie);
|
||||||
ls_pcie_clear_multifunction(pcie);
|
ls_pcie_clear_multifunction(pcie);
|
||||||
|
ls_pcie_drop_msg_tlp(pcie);
|
||||||
iowrite32(0, pcie->dbi + PCIE_DBI_RO_WR_EN);
|
iowrite32(0, pcie->dbi + PCIE_DBI_RO_WR_EN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user