]> git.itanic.dy.fi Git - linux-stable/commitdiff
ata: libahci: Discard redundant force_port_map parameter
authorSerge Semin <Sergey.Semin@baikalelectronics.ru>
Fri, 9 Sep 2022 19:36:11 +0000 (22:36 +0300)
committerDamien Le Moal <damien.lemoal@opensource.wdc.com>
Fri, 16 Sep 2022 16:39:46 +0000 (01:39 +0900)
Currently there are four port-map-related fields declared in the
ahci_host_priv structure and used to setup the HBA ports mapping. First
the ports-mapping is read from the PI register and immediately stored in
the saved_port_map field. If forced_port_map is initialized with non-zero
value then its value will have greater priority over the value read from
PI, thus it will override the saved_port_map field. That value will be
then masked by a non-zero mask_port_map field and after some sanity checks
it will be stored in the ahci_host_priv.port_map field as a final port
mapping.

As you can see the logic is a bit too complicated for such a simple task.
We can freely get rid from at least one of the fields with no change to
the implemented semantic. The force_port_map field can be replaced with
taking non-zero saved_port_map value into account. So if saved_port_map is
pre-initialized by the low level drivers (platform drivers) then it will
have greater priority over the value read from PI register and will be
used as actual HBA ports mapping later on. Thus the ports map forcing task
will be just transferred from force_port_map to the saved_port_map field.

This modification will perfectly fit into the feature of having OF-based
initialization of the HW-init HBA CSR fields we are about to introduce in
the next commit.

Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
drivers/ata/ahci.c
drivers/ata/ahci.h
drivers/ata/libahci.c
drivers/ata/libahci_platform.c

index 2371ab5fe8f2bb3fa05558f15f043d4080aad301..35f6d12889ff0df5b33232a3063bc3b40ff144a2 100644 (file)
@@ -657,7 +657,7 @@ static void ahci_pci_save_initial_config(struct pci_dev *pdev,
 {
        if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361) {
                dev_info(&pdev->dev, "JMB361 has only one port\n");
-               hpriv->force_port_map = 1;
+               hpriv->saved_port_map = 1;
        }
 
        /*
index 27cab4e909a562e5dacbe771443044e1f845cb3f..cc4f40e6c9246ec2bc0733dc307051dd0ef68ce3 100644 (file)
@@ -328,7 +328,6 @@ struct ahci_port_priv {
 struct ahci_host_priv {
        /* Input fields */
        unsigned int            flags;          /* AHCI_HFLAG_* */
-       u32                     force_port_map; /* force port map */
        u32                     mask_port_map;  /* mask out particular bits */
 
        void __iomem *          mmio;           /* bus-independent mem map */
index cf8c7fd59ada5be255cc871a6339b65992e87de2..000a7072614f53555f6850a0807b5bf5fcc1b2dc 100644 (file)
@@ -453,7 +453,6 @@ void ahci_save_initial_config(struct device *dev, struct ahci_host_priv *hpriv)
         * reset.  Values without are used for driver operation.
         */
        hpriv->saved_cap = cap = readl(mmio + HOST_CAP);
-       hpriv->saved_port_map = port_map = readl(mmio + HOST_PORTS_IMPL);
 
        /* CAP2 register is only defined for AHCI 1.2 and later */
        vers = readl(mmio + HOST_VERSION);
@@ -517,10 +516,13 @@ void ahci_save_initial_config(struct device *dev, struct ahci_host_priv *hpriv)
                cap &= ~HOST_CAP_SXS;
        }
 
-       if (hpriv->force_port_map && port_map != hpriv->force_port_map) {
+       /* Override the HBA ports mapping if the platform needs it */
+       port_map = readl(mmio + HOST_PORTS_IMPL);
+       if (hpriv->saved_port_map && port_map != hpriv->saved_port_map) {
                dev_info(dev, "forcing port_map 0x%x -> 0x%x\n",
-                        port_map, hpriv->force_port_map);
-               port_map = hpriv->force_port_map;
+                        port_map, hpriv->saved_port_map);
+               port_map = hpriv->saved_port_map;
+       } else {
                hpriv->saved_port_map = port_map;
        }
 
index 31be8a10facdfe7fccca51627b0580fb12557722..01c195b6d9e655c8c28f32b466142525a2ee3b3f 100644 (file)
@@ -526,7 +526,7 @@ struct ahci_host_priv *ahci_platform_get_resources(struct platform_device *pdev,
        }
 
        of_property_read_u32(dev->of_node,
-                            "ports-implemented", &hpriv->force_port_map);
+                            "ports-implemented", &hpriv->saved_port_map);
 
        if (child_nodes) {
                for_each_child_of_node(dev->of_node, child) {