PCI: endpoint: Cast the page number to phys_addr_t
authorAlan Mikhak <alan.mikhak@sifive.com>
Wed, 9 Oct 2019 17:06:56 +0000 (10:06 -0700)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tue, 15 Oct 2019 14:47:54 +0000 (15:47 +0100)
Modify pci_epc_mem_alloc_addr() to cast the variable 'pageno'
from type 'int' to 'phys_addr_t' before shifting left. This
cast is needed to avoid treating bit 31 of 'pageno' as the
sign bit which would otherwise get sign-extended to produce
a negative value. When added to the base address of PCI memory
space, the negative value would produce an invalid physical
address which falls before the start of the PCI memory space.

Signed-off-by: Alan Mikhak <alan.mikhak@sifive.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Kishon Vijay Abraham I <kishon@ti.com>
drivers/pci/endpoint/pci-epc-mem.c

index 2bf8bd1f0563eaf4740874ec1e3f0c836adc5687..d2b174ce15decd8e9a58c3cd7fc9752fd7052853 100644 (file)
@@ -134,7 +134,7 @@ void __iomem *pci_epc_mem_alloc_addr(struct pci_epc *epc,
        if (pageno < 0)
                return NULL;
 
-       *phys_addr = mem->phys_base + (pageno << page_shift);
+       *phys_addr = mem->phys_base + ((phys_addr_t)pageno << page_shift);
        virt_addr = ioremap(*phys_addr, size);
        if (!virt_addr)
                bitmap_release_region(mem->bitmap, pageno, order);