aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabriele Paoloni <gabriele.paoloni@huawei.com>2015-10-08 15:27:53 -0400
committerBjorn Helgaas <bhelgaas@google.com>2015-11-02 15:48:45 -0500
commitb6b18f589e1ddbfbc31f72ea7fb8a723a2d10058 (patch)
treeb3eed584ffa7dfc38ccb617ef5fc795741630bf1
parent4c45852f494dab827291c656ee9e12f3f4ee64d6 (diff)
PCI: designware: Require config accesses to be naturally aligned
Add sanity checks on "addr" input parameter in dw_pcie_cfg_read() and dw_pcie_cfg_write(). These checks make sure that accesses are aligned on their size, e.g., a 4-byte config access is aligned on a 4-byte boundary. [bhelgaas: changelog, set *val = 0 in failure case] Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Pratyush Anand <pratyush.anand@gmail.com>
-rw-r--r--drivers/pci/host/pcie-designware.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index 759cd0a50910..b77535f3967b 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -82,6 +82,11 @@ static inline struct pcie_port *sys_to_pcie(struct pci_sys_data *sys)
82 82
83int dw_pcie_cfg_read(void __iomem *addr, int size, u32 *val) 83int dw_pcie_cfg_read(void __iomem *addr, int size, u32 *val)
84{ 84{
85 if ((uintptr_t)addr & (size - 1)) {
86 *val = 0;
87 return PCIBIOS_BAD_REGISTER_NUMBER;
88 }
89
85 if (size == 4) 90 if (size == 4)
86 *val = readl(addr); 91 *val = readl(addr);
87 else if (size == 2) 92 else if (size == 2)
@@ -98,6 +103,9 @@ int dw_pcie_cfg_read(void __iomem *addr, int size, u32 *val)
98 103
99int dw_pcie_cfg_write(void __iomem *addr, int size, u32 val) 104int dw_pcie_cfg_write(void __iomem *addr, int size, u32 val)
100{ 105{
106 if ((uintptr_t)addr & (size - 1))
107 return PCIBIOS_BAD_REGISTER_NUMBER;
108
101 if (size == 4) 109 if (size == 4)
102 writel(val, addr); 110 writel(val, addr);
103 else if (size == 2) 111 else if (size == 2)