xtensa: Implement phys virt conversion for PTP_MMU
For PTP_MMU our physical address is not directly mapped into virtual address space, we need to access physical memory from those fixed map segments. Implement phys_to_virt and virt_to_phys hook to reflect this setting. Tested-by: Max Filippov <jcmvbkbc@gmail.com> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
This commit is contained in:
@@ -7,6 +7,8 @@
|
||||
#ifndef _XTENSA_ADDRSPACE_H
|
||||
#define _XTENSA_ADDRSPACE_H
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <asm/arch/core.h>
|
||||
|
||||
/*
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
|
||||
/*
|
||||
* swap functions to change byte order from little-endian to big-endian and
|
||||
* vice versa.
|
||||
@@ -127,6 +129,36 @@ static inline void sync(void)
|
||||
{
|
||||
}
|
||||
|
||||
#if XCHAL_HAVE_PTP_MMU
|
||||
static inline void *phys_to_virt(phys_addr_t paddr)
|
||||
{
|
||||
if (paddr >= CFG_SYS_IO_BASE)
|
||||
return (void *)(unsigned long)paddr;
|
||||
|
||||
if (paddr < CFG_MAX_MEM_MAPPED)
|
||||
return (void *)(unsigned long)MEMADDR(paddr);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define phys_to_virt phys_to_virt
|
||||
|
||||
static inline phys_addr_t virt_to_phys(void *vaddr)
|
||||
{
|
||||
unsigned long addr = (unsigned long)vaddr;
|
||||
|
||||
if (addr >= CFG_SYS_IO_BASE)
|
||||
return addr;
|
||||
|
||||
if (addr >= CFG_SYS_SDRAM_BASE && addr < MEMADDR(CFG_MAX_MEM_MAPPED))
|
||||
return PHYSADDR(addr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define virt_to_phys virt_to_phys
|
||||
#endif /* XCHAL_HAVE_PTP_MMU */
|
||||
|
||||
#include <asm-generic/io.h>
|
||||
|
||||
#endif /* _XTENSA_IO_H */
|
||||
|
||||
Reference in New Issue
Block a user