forked from luck/tmp_suning_uos_patched
powerpc: Change BAT code to use phys_addr_t
Currently, the physical address is an unsigned long, but it should be phys_addr_t in set_bat, [v/p]_mapped_by_bat. Also, create a macro that can convert a large physical address into the correct format for programming the BAT registers. Signed-off-by: Becky Bruce <becky.bruce@freescale.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
bf2737f74f
commit
7c5c4325d2
|
@ -29,7 +29,7 @@ extern void hash_preload(struct mm_struct *mm, unsigned long ea,
|
|||
#ifdef CONFIG_PPC32
|
||||
extern void mapin_ram(void);
|
||||
extern int map_page(unsigned long va, phys_addr_t pa, int flags);
|
||||
extern void setbat(int index, unsigned long virt, unsigned long phys,
|
||||
extern void setbat(int index, unsigned long virt, phys_addr_t phys,
|
||||
unsigned int size, int flags);
|
||||
extern void settlbcam(int index, unsigned long virt, phys_addr_t phys,
|
||||
unsigned int size, int flags, unsigned int pid);
|
||||
|
|
|
@ -53,9 +53,9 @@ extern void hash_page_sync(void);
|
|||
#endif
|
||||
|
||||
#ifdef HAVE_BATS
|
||||
extern unsigned long v_mapped_by_bats(unsigned long va);
|
||||
extern unsigned long p_mapped_by_bats(unsigned long pa);
|
||||
void setbat(int index, unsigned long virt, unsigned long phys,
|
||||
extern phys_addr_t v_mapped_by_bats(unsigned long va);
|
||||
extern unsigned long p_mapped_by_bats(phys_addr_t pa);
|
||||
void setbat(int index, unsigned long virt, phys_addr_t phys,
|
||||
unsigned int size, int flags);
|
||||
|
||||
#else /* !HAVE_BATS */
|
||||
|
|
|
@ -46,13 +46,13 @@ union ubat { /* BAT register values to be loaded */
|
|||
struct batrange { /* stores address ranges mapped by BATs */
|
||||
unsigned long start;
|
||||
unsigned long limit;
|
||||
unsigned long phys;
|
||||
phys_addr_t phys;
|
||||
} bat_addrs[8];
|
||||
|
||||
/*
|
||||
* Return PA for this VA if it is mapped by a BAT, or 0
|
||||
*/
|
||||
unsigned long v_mapped_by_bats(unsigned long va)
|
||||
phys_addr_t v_mapped_by_bats(unsigned long va)
|
||||
{
|
||||
int b;
|
||||
for (b = 0; b < 4; ++b)
|
||||
|
@ -64,7 +64,7 @@ unsigned long v_mapped_by_bats(unsigned long va)
|
|||
/*
|
||||
* Return VA for a given PA or 0 if not mapped
|
||||
*/
|
||||
unsigned long p_mapped_by_bats(unsigned long pa)
|
||||
unsigned long p_mapped_by_bats(phys_addr_t pa)
|
||||
{
|
||||
int b;
|
||||
for (b = 0; b < 4; ++b)
|
||||
|
@ -119,7 +119,7 @@ unsigned long __init mmu_mapin_ram(void)
|
|||
* The parameters are not checked; in particular size must be a power
|
||||
* of 2 between 128k and 256M.
|
||||
*/
|
||||
void __init setbat(int index, unsigned long virt, unsigned long phys,
|
||||
void __init setbat(int index, unsigned long virt, phys_addr_t phys,
|
||||
unsigned int size, int flags)
|
||||
{
|
||||
unsigned int bl;
|
||||
|
@ -138,7 +138,7 @@ void __init setbat(int index, unsigned long virt, unsigned long phys,
|
|||
| _PAGE_COHERENT | _PAGE_GUARDED);
|
||||
wimgxpp |= (flags & _PAGE_RW)? BPP_RW: BPP_RX;
|
||||
bat[1].word[0] = virt | (bl << 2) | 2; /* Vs=1, Vp=0 */
|
||||
bat[1].word[1] = phys | wimgxpp;
|
||||
bat[1].word[1] = BAT_PHYS_ADDR(phys) | wimgxpp;
|
||||
#ifndef CONFIG_KGDB /* want user access for breakpoints */
|
||||
if (flags & _PAGE_USER)
|
||||
#endif
|
||||
|
|
|
@ -28,6 +28,15 @@
|
|||
#define BPP_RW 0x02 /* Read/write */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/* Contort a phys_addr_t into the right format/bits for a BAT */
|
||||
#ifdef CONFIG_PHYS_64BIT
|
||||
#define BAT_PHYS_ADDR(x) ((u32)((x & 0x00000000fffe0000ULL) | \
|
||||
((x & 0x0000000e00000000ULL) >> 24) | \
|
||||
((x & 0x0000000100000000ULL) >> 30)))
|
||||
#else
|
||||
#define BAT_PHYS_ADDR(x) (x)
|
||||
#endif
|
||||
|
||||
struct ppc_bat {
|
||||
struct {
|
||||
unsigned long bepi:15; /* Effective page index (virtual address) */
|
||||
|
|
Loading…
Reference in New Issue
Block a user