hw/ppc: Consolidate ppc440 initial mapping creation functions
Add a utility function and use it to replace very similar create_initial_mapping functions in 440 based machines. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Tested-by: Edgar E. Iglesias <edgar.iglesias@amd.com> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
parent
779a30df98
commit
afff880071
@ -110,29 +110,6 @@ static int bamboo_load_device_tree(MachineState *machine,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Create reset TLB entries for BookE, spanning the 32bit addr space. */
|
||||
static void mmubooke_create_initial_mapping(CPUPPCState *env,
|
||||
target_ulong va,
|
||||
hwaddr pa)
|
||||
{
|
||||
ppcemb_tlb_t *tlb = &env->tlb.tlbe[0];
|
||||
|
||||
tlb->attr = 0;
|
||||
tlb->prot = PAGE_VALID | ((PAGE_READ | PAGE_WRITE | PAGE_EXEC) << 4);
|
||||
tlb->size = 1U << 31; /* up to 0x80000000 */
|
||||
tlb->EPN = va & TARGET_PAGE_MASK;
|
||||
tlb->RPN = pa & TARGET_PAGE_MASK;
|
||||
tlb->PID = 0;
|
||||
|
||||
tlb = &env->tlb.tlbe[1];
|
||||
tlb->attr = 0;
|
||||
tlb->prot = PAGE_VALID | ((PAGE_READ | PAGE_WRITE | PAGE_EXEC) << 4);
|
||||
tlb->size = 1U << 31; /* up to 0xffffffff */
|
||||
tlb->EPN = 0x80000000 & TARGET_PAGE_MASK;
|
||||
tlb->RPN = 0x80000000 & TARGET_PAGE_MASK;
|
||||
tlb->PID = 0;
|
||||
}
|
||||
|
||||
static void main_cpu_reset(void *opaque)
|
||||
{
|
||||
PowerPCCPU *cpu = opaque;
|
||||
@ -143,8 +120,9 @@ static void main_cpu_reset(void *opaque)
|
||||
env->gpr[3] = FDT_ADDR;
|
||||
env->nip = entry;
|
||||
|
||||
/* Create a mapping for the kernel. */
|
||||
mmubooke_create_initial_mapping(env, 0, 0);
|
||||
/* Create a mapping spanning the 32bit addr space. */
|
||||
booke_set_tlb(&env->tlb.tlbe[0], 0, 0, 1U << 31);
|
||||
booke_set_tlb(&env->tlb.tlbe[1], 0x80000000, 0x80000000, 1U << 31);
|
||||
}
|
||||
|
||||
static void bamboo_init(MachineState *machine)
|
||||
|
@ -31,6 +31,16 @@
|
||||
#include "hw/loader.h"
|
||||
#include "kvm_ppc.h"
|
||||
|
||||
void booke_set_tlb(ppcemb_tlb_t *tlb, target_ulong va, hwaddr pa,
|
||||
target_ulong size)
|
||||
{
|
||||
tlb->attr = 0;
|
||||
tlb->prot = PAGE_RWX << 4 | PAGE_VALID;
|
||||
tlb->size = size;
|
||||
tlb->EPN = va & TARGET_PAGE_MASK;
|
||||
tlb->RPN = pa & TARGET_PAGE_MASK;
|
||||
tlb->PID = 0;
|
||||
}
|
||||
|
||||
/* Timer Control Register */
|
||||
|
||||
|
@ -213,38 +213,6 @@ static int sam460ex_load_device_tree(MachineState *machine,
|
||||
return fdt_size;
|
||||
}
|
||||
|
||||
/* Create reset TLB entries for BookE, mapping only the flash memory. */
|
||||
static void mmubooke_create_initial_mapping_uboot(CPUPPCState *env)
|
||||
{
|
||||
ppcemb_tlb_t *tlb = &env->tlb.tlbe[0];
|
||||
|
||||
/* on reset the flash is mapped by a shadow TLB,
|
||||
* but since we don't implement them we need to use
|
||||
* the same values U-Boot will use to avoid a fault.
|
||||
*/
|
||||
tlb->attr = 0;
|
||||
tlb->prot = PAGE_VALID | ((PAGE_READ | PAGE_WRITE | PAGE_EXEC) << 4);
|
||||
tlb->size = 0x10000000; /* up to 0xffffffff */
|
||||
tlb->EPN = 0xf0000000 & TARGET_PAGE_MASK;
|
||||
tlb->RPN = (0xf0000000 & TARGET_PAGE_MASK) | 0x4;
|
||||
tlb->PID = 0;
|
||||
}
|
||||
|
||||
/* Create reset TLB entries for BookE, spanning the 32bit addr space. */
|
||||
static void mmubooke_create_initial_mapping(CPUPPCState *env,
|
||||
target_ulong va,
|
||||
hwaddr pa)
|
||||
{
|
||||
ppcemb_tlb_t *tlb = &env->tlb.tlbe[0];
|
||||
|
||||
tlb->attr = 0;
|
||||
tlb->prot = PAGE_VALID | ((PAGE_READ | PAGE_WRITE | PAGE_EXEC) << 4);
|
||||
tlb->size = 1 << 31; /* up to 0x80000000 */
|
||||
tlb->EPN = va & TARGET_PAGE_MASK;
|
||||
tlb->RPN = pa & TARGET_PAGE_MASK;
|
||||
tlb->PID = 0;
|
||||
}
|
||||
|
||||
static void main_cpu_reset(void *opaque)
|
||||
{
|
||||
PowerPCCPU *cpu = opaque;
|
||||
@ -253,20 +221,27 @@ static void main_cpu_reset(void *opaque)
|
||||
|
||||
cpu_reset(CPU(cpu));
|
||||
|
||||
/* either we have a kernel to boot or we jump to U-Boot */
|
||||
/*
|
||||
* On reset the flash is mapped by a shadow TLB, but since we
|
||||
* don't implement them we need to use the same values U-Boot
|
||||
* will use to avoid a fault.
|
||||
* either we have a kernel to boot or we jump to U-Boot
|
||||
*/
|
||||
if (bi->entry != UBOOT_ENTRY) {
|
||||
env->gpr[1] = (16 * MiB) - 8;
|
||||
env->gpr[3] = FDT_ADDR;
|
||||
env->nip = bi->entry;
|
||||
|
||||
/* Create a mapping for the kernel. */
|
||||
mmubooke_create_initial_mapping(env, 0, 0);
|
||||
booke_set_tlb(&env->tlb.tlbe[0], 0, 0, 1 << 31);
|
||||
env->gpr[6] = tswap32(EPAPR_MAGIC);
|
||||
env->gpr[7] = (16 * MiB) - 8; /* bi->ima_size; */
|
||||
|
||||
} else {
|
||||
env->nip = UBOOT_ENTRY;
|
||||
mmubooke_create_initial_mapping_uboot(env);
|
||||
/* Create a mapping for U-Boot. */
|
||||
booke_set_tlb(&env->tlb.tlbe[0], 0xf0000000, 0xf0000000, 0x10000000);
|
||||
env->tlb.tlbe[0].RPN |= 4;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -67,29 +67,6 @@ static struct boot_info
|
||||
void *vfdt;
|
||||
} boot_info;
|
||||
|
||||
/* Create reset TLB entries for BookE, spanning the 32bit addr space. */
|
||||
static void mmubooke_create_initial_mapping(CPUPPCState *env,
|
||||
target_ulong va,
|
||||
hwaddr pa)
|
||||
{
|
||||
ppcemb_tlb_t *tlb = &env->tlb.tlbe[0];
|
||||
|
||||
tlb->attr = 0;
|
||||
tlb->prot = PAGE_VALID | ((PAGE_READ | PAGE_WRITE | PAGE_EXEC) << 4);
|
||||
tlb->size = 1U << 31; /* up to 0x80000000 */
|
||||
tlb->EPN = va & TARGET_PAGE_MASK;
|
||||
tlb->RPN = pa & TARGET_PAGE_MASK;
|
||||
tlb->PID = 0;
|
||||
|
||||
tlb = &env->tlb.tlbe[1];
|
||||
tlb->attr = 0;
|
||||
tlb->prot = PAGE_VALID | ((PAGE_READ | PAGE_WRITE | PAGE_EXEC) << 4);
|
||||
tlb->size = 1U << 31; /* up to 0xffffffff */
|
||||
tlb->EPN = 0x80000000 & TARGET_PAGE_MASK;
|
||||
tlb->RPN = 0x80000000 & TARGET_PAGE_MASK;
|
||||
tlb->PID = 0;
|
||||
}
|
||||
|
||||
static PowerPCCPU *ppc440_init_xilinx(const char *cpu_type, uint32_t sysclk)
|
||||
{
|
||||
PowerPCCPU *cpu;
|
||||
@ -139,8 +116,9 @@ static void main_cpu_reset(void *opaque)
|
||||
env->gpr[3] = bi->fdt;
|
||||
env->nip = bi->bootstrap_pc;
|
||||
|
||||
/* Create a mapping for the kernel. */
|
||||
mmubooke_create_initial_mapping(env, 0, 0);
|
||||
/* Create a mapping spanning the 32bit addr space. */
|
||||
booke_set_tlb(&env->tlb.tlbe[0], 0, 0, 1U << 31);
|
||||
booke_set_tlb(&env->tlb.tlbe[1], 0x80000000, 0x80000000, 1U << 31);
|
||||
env->gpr[6] = tswap32(EPAPR_MAGIC);
|
||||
env->gpr[7] = bi->ima_size;
|
||||
}
|
||||
|
@ -119,6 +119,8 @@ enum {
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
void booke206_set_tlb(ppcmas_tlb_t *tlb, target_ulong va, hwaddr pa,
|
||||
hwaddr len);
|
||||
void booke_set_tlb(ppcemb_tlb_t *tlb, target_ulong va, hwaddr pa,
|
||||
target_ulong size);
|
||||
#endif
|
||||
|
||||
/* ppc_booke.c */
|
||||
|
Loading…
Reference in New Issue
Block a user