PCI: cadence: Remove private bus number and range storage
authorRob Herring <robh@kernel.org>
Wed, 22 Jul 2020 02:25:08 +0000 (20:25 -0600)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Thu, 23 Jul 2020 16:13:13 +0000 (17:13 +0100)
There's no need to store the bus number or range resource as the driver
only needs the bus number which is already in the pci_host_bridge.

For endpoint mode, the bus number is always 0.

Link: https://lore.kernel.org/r/20200722022514.1283916-14-robh@kernel.org
Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: Tom Joseph <tjoseph@cadence.com>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/controller/cadence/pcie-cadence-ep.c
drivers/pci/controller/cadence/pcie-cadence-host.c
drivers/pci/controller/cadence/pcie-cadence.c
drivers/pci/controller/cadence/pcie-cadence.h

index 74ffa03..e208fa5 100644 (file)
@@ -156,7 +156,7 @@ static int cdns_pcie_ep_map_addr(struct pci_epc *epc, u8 fn, phys_addr_t addr,
                return -EINVAL;
        }
 
-       cdns_pcie_set_outbound_region(pcie, fn, r, false, addr, pci_addr, size);
+       cdns_pcie_set_outbound_region(pcie, 0, fn, r, false, addr, pci_addr, size);
 
        set_bit(r, &ep->ob_region_map);
        ep->ob_addr[r] = addr;
@@ -239,7 +239,7 @@ static void cdns_pcie_ep_assert_intx(struct cdns_pcie_ep *ep, u8 fn,
        if (unlikely(ep->irq_pci_addr != CDNS_PCIE_EP_IRQ_PCI_ADDR_LEGACY ||
                     ep->irq_pci_fn != fn)) {
                /* First region was reserved for IRQ writes. */
-               cdns_pcie_set_outbound_region_for_normal_msg(pcie, fn, 0,
+               cdns_pcie_set_outbound_region_for_normal_msg(pcie, 0, fn, 0,
                                                             ep->irq_phys_addr);
                ep->irq_pci_addr = CDNS_PCIE_EP_IRQ_PCI_ADDR_LEGACY;
                ep->irq_pci_fn = fn;
@@ -318,7 +318,7 @@ static int cdns_pcie_ep_send_msi_irq(struct cdns_pcie_ep *ep, u8 fn,
        if (unlikely(ep->irq_pci_addr != (pci_addr & ~pci_addr_mask) ||
                     ep->irq_pci_fn != fn)) {
                /* First region was reserved for IRQ writes. */
-               cdns_pcie_set_outbound_region(pcie, fn, 0,
+               cdns_pcie_set_outbound_region(pcie, 0, fn, 0,
                                              false,
                                              ep->irq_phys_addr,
                                              pci_addr & ~pci_addr_mask,
index d178887..39a8a7a 100644 (file)
@@ -20,7 +20,7 @@ static void __iomem *cdns_pci_map_bus(struct pci_bus *bus, unsigned int devfn,
        unsigned int busn = bus->number;
        u32 addr0, desc0;
 
-       if (busn == rc->bus_range->start) {
+       if (pci_is_root_bus(bus)) {
                /*
                 * Only the root port (devfn == 0) is connected to this bus.
                 * All other PCI devices are behind some bridge hence on another
@@ -50,7 +50,7 @@ static void __iomem *cdns_pci_map_bus(struct pci_bus *bus, unsigned int devfn,
         * The bus number was already set once for all in desc1 by
         * cdns_pcie_host_init_address_translation().
         */
-       if (busn == rc->bus_range->start + 1)
+       if (busn == bridge->busnr + 1)
                desc0 |= CDNS_PCIE_AT_OB_REGION_DESC0_TYPE_CONF_TYPE0;
        else
                desc0 |= CDNS_PCIE_AT_OB_REGION_DESC0_TYPE_CONF_TYPE1;
@@ -106,12 +106,15 @@ static int cdns_pcie_host_init_address_translation(struct cdns_pcie_rc *rc)
        struct cdns_pcie *pcie = &rc->pcie;
        struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rc);
        struct resource *mem_res = pcie->mem_res;
-       struct resource *bus_range = rc->bus_range;
        struct resource *cfg_res = rc->cfg_res;
        struct resource_entry *entry;
        u32 addr0, addr1, desc1;
        u64 cpu_addr;
-       int r;
+       int r, busnr = 0;
+
+       entry = resource_list_first_type(&bridge->windows, IORESOURCE_BUS);
+       if (entry)
+               busnr = entry->res->start;
 
        /*
         * Reserve region 0 for PCI configure space accesses:
@@ -119,7 +122,7 @@ static int cdns_pcie_host_init_address_translation(struct cdns_pcie_rc *rc)
         * cdns_pci_map_bus(), other region registers are set here once for all.
         */
        addr1 = 0; /* Should be programmed to zero. */
-       desc1 = CDNS_PCIE_AT_OB_REGION_DESC1_BUS(bus_range->start);
+       desc1 = CDNS_PCIE_AT_OB_REGION_DESC1_BUS(busnr);
        cdns_pcie_writel(pcie, CDNS_PCIE_AT_OB_REGION_PCI_ADDR1(0), addr1);
        cdns_pcie_writel(pcie, CDNS_PCIE_AT_OB_REGION_DESC1(0), desc1);
 
@@ -136,12 +139,14 @@ static int cdns_pcie_host_init_address_translation(struct cdns_pcie_rc *rc)
                u64 pci_addr = res->start - entry->offset;
 
                if (resource_type(res) == IORESOURCE_IO)
-                       cdns_pcie_set_outbound_region(pcie, 0, r, true,
+                       cdns_pcie_set_outbound_region(pcie, busnr, 0, r,
+                                                     true,
                                                      pci_pio_to_address(res->start),
                                                      pci_addr,
                                                      resource_size(res));
                else
-                       cdns_pcie_set_outbound_region(pcie, 0, r, false,
+                       cdns_pcie_set_outbound_region(pcie, busnr, 0, r,
+                                                     false,
                                                      res->start,
                                                      pci_addr,
                                                      resource_size(res));
@@ -167,18 +172,13 @@ static int cdns_pcie_host_init(struct device *dev,
                               struct cdns_pcie_rc *rc)
 {
        struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rc);
-       struct resource *bus_range = NULL;
        int err;
 
        /* Parse our PCI ranges and request their resources */
-       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL,
-                                             &bus_range);
+       err = pci_parse_request_of_pci_ranges(dev, &bridge->windows, NULL, NULL);
        if (err)
                return err;
 
-       rc->bus_range = bus_range;
-       rc->pcie.bus = bus_range->start;
-
        err = cdns_pcie_host_init_root_port(rc);
        if (err)
                return err;
@@ -236,7 +236,6 @@ int cdns_pcie_host_setup(struct cdns_pcie_rc *rc)
        if (ret)
                goto err_init;
 
-       bridge->busnr = pcie->bus;
        bridge->ops = &cdns_pcie_host_ops;
        bridge->map_irq = of_irq_parse_and_map_pci;
        bridge->swizzle_irq = pci_common_swizzle;
index cd795f6..fdd1376 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "pcie-cadence.h"
 
-void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 fn,
+void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 busnr, u8 fn,
                                   u32 r, bool is_io,
                                   u64 cpu_addr, u64 pci_addr, size_t size)
 {
@@ -60,7 +60,7 @@ void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 fn,
                /* The device and function numbers are always 0. */
                desc0 |= CDNS_PCIE_AT_OB_REGION_DESC0_HARDCODED_RID |
                         CDNS_PCIE_AT_OB_REGION_DESC0_DEVFN(0);
-               desc1 |= CDNS_PCIE_AT_OB_REGION_DESC1_BUS(pcie->bus);
+               desc1 |= CDNS_PCIE_AT_OB_REGION_DESC1_BUS(busnr);
        } else {
                /*
                 * Use captured values for bus and device numbers but still
@@ -82,7 +82,8 @@ void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 fn,
        cdns_pcie_writel(pcie, CDNS_PCIE_AT_OB_REGION_CPU_ADDR1(r), addr1);
 }
 
-void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie, u8 fn,
+void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie,
+                                                 u8 busnr, u8 fn,
                                                  u32 r, u64 cpu_addr)
 {
        u32 addr0, addr1, desc0, desc1;
@@ -94,7 +95,7 @@ void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie, u8 fn,
        if (pcie->is_rc) {
                desc0 |= CDNS_PCIE_AT_OB_REGION_DESC0_HARDCODED_RID |
                         CDNS_PCIE_AT_OB_REGION_DESC0_DEVFN(0);
-               desc1 |= CDNS_PCIE_AT_OB_REGION_DESC1_BUS(pcie->bus);
+               desc1 |= CDNS_PCIE_AT_OB_REGION_DESC1_BUS(busnr);
        } else {
                desc0 |= CDNS_PCIE_AT_OB_REGION_DESC0_DEVFN(fn);
        }
index df14ad0..02803f2 100644 (file)
@@ -235,7 +235,6 @@ struct cdns_pcie {
        struct resource         *mem_res;
        struct device           *dev;
        bool                    is_rc;
-       u8                      bus;
        int                     phy_count;
        struct phy              **phy;
        struct device_link      **link;
@@ -248,7 +247,6 @@ struct cdns_pcie {
  * @dev: pointer to PCIe device
  * @cfg_res: start/end offsets in the physical system memory to map PCI
  *           configuration space accesses
- * @bus_range: first/last buses behind the PCIe host controller
  * @cfg_base: IO mapped window to access the PCI configuration space of a
  *            single function at a time
  * @no_bar_nbits: Number of bits to keep for inbound (PCIe -> CPU) address
@@ -259,7 +257,6 @@ struct cdns_pcie {
 struct cdns_pcie_rc {
        struct cdns_pcie        pcie;
        struct resource         *cfg_res;
-       struct resource         *bus_range;
        void __iomem            *cfg_base;
        u32                     no_bar_nbits;
        u32                     vendor_id;
@@ -381,11 +378,12 @@ static inline int cdns_pcie_ep_setup(struct cdns_pcie_ep *ep)
        return 0;
 }
 #endif
-void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 fn,
+void cdns_pcie_set_outbound_region(struct cdns_pcie *pcie, u8 busnr, u8 fn,
                                   u32 r, bool is_io,
                                   u64 cpu_addr, u64 pci_addr, size_t size);
 
-void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie, u8 fn,
+void cdns_pcie_set_outbound_region_for_normal_msg(struct cdns_pcie *pcie,
+                                                 u8 busnr, u8 fn,
                                                  u32 r, u64 cpu_addr);
 
 void cdns_pcie_reset_outbound_region(struct cdns_pcie *pcie, u32 r);