]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PCI: rockchip: Use u32 variable to access 32-bit registers
authorRick Wertenbroek <rick.wertenbroek@gmail.com>
Tue, 18 Apr 2023 07:46:56 +0000 (09:46 +0200)
committerLorenzo Pieralisi <lpieralisi@kernel.org>
Thu, 22 Jun 2023 07:36:51 +0000 (09:36 +0200)
Previously u16 variables were used to access 32-bit registers, this
resulted in not all of the data being read from the registers. Also
the left shift of more than 16-bits would result in moving data out
of the variable. Use u32 variables to access 32-bit registers

Link: https://lore.kernel.org/r/20230418074700.1083505-10-rick.wertenbroek@gmail.com
Fixes: cf590b078391 ("PCI: rockchip: Add EP driver for Rockchip PCIe controller")
Tested-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Rick Wertenbroek <rick.wertenbroek@gmail.com>
Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Cc: stable@vger.kernel.org
drivers/pci/controller/pcie-rockchip-ep.c
drivers/pci/controller/pcie-rockchip.h

index 771f1bb932519c071a4aca74987c23a1dc093f7f..63fbb379638bcacaefa4e658f34bddfdf866c751 100644 (file)
@@ -271,15 +271,15 @@ static int rockchip_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn,
 {
        struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
        struct rockchip_pcie *rockchip = &ep->rockchip;
-       u16 flags;
+       u32 flags;
 
        flags = rockchip_pcie_read(rockchip,
                                   ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
                                   ROCKCHIP_PCIE_EP_MSI_CTRL_REG);
        flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK;
        flags |=
-          ((multi_msg_cap << 1) <<  ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET) |
-          PCI_MSI_FLAGS_64BIT;
+          (multi_msg_cap << ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET) |
+          (PCI_MSI_FLAGS_64BIT << ROCKCHIP_PCIE_EP_MSI_FLAGS_OFFSET);
        flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP;
        rockchip_pcie_write(rockchip, flags,
                            ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
@@ -291,7 +291,7 @@ static int rockchip_pcie_ep_get_msi(struct pci_epc *epc, u8 fn, u8 vfn)
 {
        struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
        struct rockchip_pcie *rockchip = &ep->rockchip;
-       u16 flags;
+       u32 flags;
 
        flags = rockchip_pcie_read(rockchip,
                                   ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
@@ -352,7 +352,7 @@ static int rockchip_pcie_ep_send_msi_irq(struct rockchip_pcie_ep *ep, u8 fn,
                                         u8 interrupt_num)
 {
        struct rockchip_pcie *rockchip = &ep->rockchip;
-       u16 flags, mme, data, data_mask;
+       u32 flags, mme, data, data_mask;
        u8 msi_count;
        u64 pci_addr;
        u32 r;
index bef6d7098a2f8b885f9e1054bd921ac2fa254388..501d859420b4c46d9fbc0226de920ea646dc63b1 100644 (file)
 #define ROCKCHIP_PCIE_EP_CMD_STATUS                    0x4
 #define   ROCKCHIP_PCIE_EP_CMD_STATUS_IS               BIT(19)
 #define ROCKCHIP_PCIE_EP_MSI_CTRL_REG                  0x90
+#define   ROCKCHIP_PCIE_EP_MSI_FLAGS_OFFSET            16
 #define   ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET         17
 #define   ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK           GENMASK(19, 17)
 #define   ROCKCHIP_PCIE_EP_MSI_CTRL_MME_OFFSET         20