PCI: dwc: Enable write permission for Class Code, Interrupt Pin updates
authorHou Zhiqiang <Zhiqiang.Hou@nxp.com>
Mon, 28 Aug 2017 10:53:00 +0000 (18:53 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 29 Aug 2017 21:22:40 +0000 (16:22 -0500)
dw_pcie_setup_rc() contains fixes to update the Class Code and Interrupt
Pin registers, but the fixes don't actually work because these registers
are read-only.

Enable write permission before updating the Class Code and Interrupt
Pin.

Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Joao Pinto <jpinto@synopsys.com>
Acked-by: Roy Zang <tie-fei.zang@freescale.com>
drivers/pci/dwc/pcie-designware-host.c

index 99cb70b5de7959cb11ba7fc1f33d0a10503d5754..0985aeee917cab785039cdedbd8386464c976a7c 100644 (file)
@@ -597,10 +597,12 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
        dw_pcie_writel_dbi(pci, PCI_BASE_ADDRESS_1, 0x00000000);
 
        /* setup interrupt pins */
+       dw_pcie_dbi_ro_wr_en(pci);
        val = dw_pcie_readl_dbi(pci, PCI_INTERRUPT_LINE);
        val &= 0xffff00ff;
        val |= 0x00000100;
        dw_pcie_writel_dbi(pci, PCI_INTERRUPT_LINE, val);
+       dw_pcie_dbi_ro_wr_dis(pci);
 
        /* setup bus numbers */
        val = dw_pcie_readl_dbi(pci, PCI_PRIMARY_BUS);
@@ -637,8 +639,12 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
 
        dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0);
 
+       /* Enable write permission for the DBI read-only register */
+       dw_pcie_dbi_ro_wr_en(pci);
        /* program correct class for RC */
        dw_pcie_wr_own_conf(pp, PCI_CLASS_DEVICE, 2, PCI_CLASS_BRIDGE_PCI);
+       /* Better disable write permission right after the update */
+       dw_pcie_dbi_ro_wr_dis(pci);
 
        dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val);
        val |= PORT_LOGIC_SPEED_CHANGE;