]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: rzg3s-host: Explicitly set class code for RZ/G3E compatibility
authorJohn Madieu <john.madieu.xa@bp.renesas.com>
Fri, 6 Mar 2026 14:34:17 +0000 (15:34 +0100)
committerManivannan Sadhasivam <mani@kernel.org>
Sun, 15 Mar 2026 15:40:50 +0000 (21:10 +0530)
Program the class code register explicitly during PCIe configuration
initialization. RZ/G3E requires this register to be set, while RZ/G3S
has these values as hardware defaults.

This configuration is harmless for RZ/G3S where these match the hardware
defaults, and necessary for RZ/G3E to properly identify the device as a
PCI bridge.

Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> # RZ/V2N EVK
Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Link: https://patch.msgid.link/20260306143423.19562-11-john.madieu.xa@bp.renesas.com
drivers/pci/controller/pcie-rzg3s-host.c

index be6b7fa1a053f38526c75d4b2774ac34885832b2..d8a92ad124376d98842f1cedb6199b9385a977d6 100644 (file)
@@ -1081,6 +1081,7 @@ static int rzg3s_pcie_set_max_link_speed(struct rzg3s_pcie_host *host)
 static int rzg3s_pcie_config_init(struct rzg3s_pcie_host *host)
 {
        struct pci_host_bridge *bridge = pci_host_bridge_from_priv(host);
+       u32 mask = GENMASK(31, 8);
        struct resource_entry *ft;
        struct resource *bus;
        u8 subordinate_bus;
@@ -1104,6 +1105,13 @@ static int rzg3s_pcie_config_init(struct rzg3s_pcie_host *host)
        writel_relaxed(0xffffffff, host->pcie + RZG3S_PCI_CFG_BARMSK00L);
        writel_relaxed(0xffffffff, host->pcie + RZG3S_PCI_CFG_BARMSK00U);
 
+       /*
+        * Explicitly program class code. RZ/G3E requires this configuration.
+        * Harmless for RZ/G3S where this matches the hardware default.
+        */
+       rzg3s_pcie_update_bits(host->pcie, PCI_CLASS_REVISION, mask,
+                              field_prep(mask, PCI_CLASS_BRIDGE_PCI_NORMAL));
+
        /* Disable access control to the CFGU */
        writel_relaxed(0, host->axi + RZG3S_PCI_PERM);