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;
|
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)
|
static void main_cpu_reset(void *opaque)
|
||||||
{
|
{
|
||||||
PowerPCCPU *cpu = opaque;
|
PowerPCCPU *cpu = opaque;
|
||||||
@ -143,8 +120,9 @@ static void main_cpu_reset(void *opaque)
|
|||||||
env->gpr[3] = FDT_ADDR;
|
env->gpr[3] = FDT_ADDR;
|
||||||
env->nip = entry;
|
env->nip = entry;
|
||||||
|
|
||||||
/* Create a mapping for the kernel. */
|
/* Create a mapping spanning the 32bit addr space. */
|
||||||
mmubooke_create_initial_mapping(env, 0, 0);
|
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)
|
static void bamboo_init(MachineState *machine)
|
||||||
|
@ -31,6 +31,16 @@
|
|||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
#include "kvm_ppc.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 */
|
/* Timer Control Register */
|
||||||
|
|
||||||
|
@ -213,38 +213,6 @@ static int sam460ex_load_device_tree(MachineState *machine,
|
|||||||
return fdt_size;
|
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)
|
static void main_cpu_reset(void *opaque)
|
||||||
{
|
{
|
||||||
PowerPCCPU *cpu = opaque;
|
PowerPCCPU *cpu = opaque;
|
||||||
@ -253,20 +221,27 @@ static void main_cpu_reset(void *opaque)
|
|||||||
|
|
||||||
cpu_reset(CPU(cpu));
|
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) {
|
if (bi->entry != UBOOT_ENTRY) {
|
||||||
env->gpr[1] = (16 * MiB) - 8;
|
env->gpr[1] = (16 * MiB) - 8;
|
||||||
env->gpr[3] = FDT_ADDR;
|
env->gpr[3] = FDT_ADDR;
|
||||||
env->nip = bi->entry;
|
env->nip = bi->entry;
|
||||||
|
|
||||||
/* Create a mapping for the kernel. */
|
/* 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[6] = tswap32(EPAPR_MAGIC);
|
||||||
env->gpr[7] = (16 * MiB) - 8; /* bi->ima_size; */
|
env->gpr[7] = (16 * MiB) - 8; /* bi->ima_size; */
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
env->nip = UBOOT_ENTRY;
|
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;
|
void *vfdt;
|
||||||
} boot_info;
|
} 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)
|
static PowerPCCPU *ppc440_init_xilinx(const char *cpu_type, uint32_t sysclk)
|
||||||
{
|
{
|
||||||
PowerPCCPU *cpu;
|
PowerPCCPU *cpu;
|
||||||
@ -139,8 +116,9 @@ static void main_cpu_reset(void *opaque)
|
|||||||
env->gpr[3] = bi->fdt;
|
env->gpr[3] = bi->fdt;
|
||||||
env->nip = bi->bootstrap_pc;
|
env->nip = bi->bootstrap_pc;
|
||||||
|
|
||||||
/* Create a mapping for the kernel. */
|
/* Create a mapping spanning the 32bit addr space. */
|
||||||
mmubooke_create_initial_mapping(env, 0, 0);
|
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[6] = tswap32(EPAPR_MAGIC);
|
||||||
env->gpr[7] = bi->ima_size;
|
env->gpr[7] = bi->ima_size;
|
||||||
}
|
}
|
||||||
|
@ -119,6 +119,8 @@ enum {
|
|||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
void booke206_set_tlb(ppcmas_tlb_t *tlb, target_ulong va, hwaddr pa,
|
void booke206_set_tlb(ppcmas_tlb_t *tlb, target_ulong va, hwaddr pa,
|
||||||
hwaddr len);
|
hwaddr len);
|
||||||
|
void booke_set_tlb(ppcemb_tlb_t *tlb, target_ulong va, hwaddr pa,
|
||||||
|
target_ulong size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ppc_booke.c */
|
/* ppc_booke.c */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user