Skip to content

Commit

Permalink
ARM: 6672/1: LPAE: use phys_addr_t instead of unsigned long in mappin…
Browse files Browse the repository at this point in the history
…g functions

The unsigned long datatype is not sufficient for mapping physical addresses
>= 4GB.

This patch ensures that the phys_addr_t datatype is used to represent physical
addresses when converting from a PFN.

Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Will Deacon authored and Russell King committed Feb 15, 2011
1 parent ad6b9c9 commit cae6292
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 7 deletions.
2 changes: 1 addition & 1 deletion arch/arm/include/asm/pgtable.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ static inline pte_t *pmd_page_vaddr(pmd_t pmd)
#define pte_unmap(pte) __pte_unmap(pte)

#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
#define pfn_pte(pfn,prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
#define pfn_pte(pfn,prot) __pte(__pfn_to_phys(pfn) | pgprot_val(prot))

#define pte_page(pte) pfn_to_page(pte_pfn(pte))
#define mk_pte(page,prot) pfn_pte(page_to_pfn(page), prot)
Expand Down
6 changes: 3 additions & 3 deletions arch/arm/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ void __init bootmem_init(void)
*/
arm_bootmem_free(min, max_low, max_high);

high_memory = __va((max_low << PAGE_SHIFT) - 1) + 1;
high_memory = __va(((phys_addr_t)max_low << PAGE_SHIFT) - 1) + 1;

/*
* This doesn't seem to be used by the Linux memory manager any
Expand Down Expand Up @@ -392,8 +392,8 @@ free_memmap(unsigned long start_pfn, unsigned long end_pfn)
* Convert to physical addresses, and
* round start upwards and end downwards.
*/
pg = PAGE_ALIGN(__pa(start_pg));
pgend = __pa(end_pg) & PAGE_MASK;
pg = (unsigned long)PAGE_ALIGN(__pa(start_pg));
pgend = (unsigned long)__pa(end_pg) & PAGE_MASK;

/*
* If there are free pages between these,
Expand Down
7 changes: 4 additions & 3 deletions arch/arm/mm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,7 @@ static void __init create_36bit_mapping(struct map_desc *md,
pgd_t *pgd;

addr = md->virtual;
phys = (unsigned long)__pfn_to_phys(md->pfn);
phys = __pfn_to_phys(md->pfn);
length = PAGE_ALIGN(md->length);

if (!(cpu_architecture() >= CPU_ARCH_ARMv6 || cpu_is_xsc3())) {
Expand Down Expand Up @@ -651,7 +651,8 @@ static void __init create_36bit_mapping(struct map_desc *md,
*/
static void __init create_mapping(struct map_desc *md)
{
unsigned long phys, addr, length, end;
unsigned long addr, length, end;
phys_addr_t phys;
const struct mem_type *type;
pgd_t *pgd;

Expand Down Expand Up @@ -680,7 +681,7 @@ static void __init create_mapping(struct map_desc *md)
}

addr = md->virtual & PAGE_MASK;
phys = (unsigned long)__pfn_to_phys(md->pfn);
phys = __pfn_to_phys(md->pfn);
length = PAGE_ALIGN(md->length + (md->virtual & ~PAGE_MASK));

if (type->prot_l1 == 0 && ((addr | phys | length) & ~SECTION_MASK)) {
Expand Down

0 comments on commit cae6292

Please sign in to comment.