Skip to content

Commit 903585d

Browse files
committed
PPC: e500: Expose kernel load address in dt
We want to move to a model where firmware loads our kernel. To achieve this we need to be able to tell firmware where the kernel lies. Let's copy the mechanism we already use for -M pseries and expose the kernel load address and size through the device tree. Signed-off-by: Alexander Graf <[email protected]>
1 parent 4d09d52 commit 903585d

File tree

1 file changed

+23
-5
lines changed

1 file changed

+23
-5
lines changed

hw/ppc/e500.c

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ static int ppce500_load_device_tree(MachineState *machine,
128128
hwaddr addr,
129129
hwaddr initrd_base,
130130
hwaddr initrd_size,
131+
hwaddr kernel_base,
132+
hwaddr kernel_size,
131133
bool dry_run)
132134
{
133135
CPUPPCState *env = first_cpu->env_ptr;
@@ -204,6 +206,13 @@ static int ppce500_load_device_tree(MachineState *machine,
204206
if (ret < 0) {
205207
fprintf(stderr, "couldn't set /chosen/linux,initrd-end\n");
206208
}
209+
210+
}
211+
212+
if (kernel_base != -1ULL) {
213+
qemu_fdt_setprop_cells(fdt, "/chosen", "qemu,boot-kernel",
214+
kernel_base >> 32, kernel_base,
215+
kernel_size >> 32, kernel_size);
207216
}
208217

209218
ret = qemu_fdt_setprop_string(fdt, "/chosen", "bootargs",
@@ -392,33 +401,41 @@ typedef struct DeviceTreeParams {
392401
hwaddr addr;
393402
hwaddr initrd_base;
394403
hwaddr initrd_size;
404+
hwaddr kernel_base;
405+
hwaddr kernel_size;
395406
} DeviceTreeParams;
396407

397408
static void ppce500_reset_device_tree(void *opaque)
398409
{
399410
DeviceTreeParams *p = opaque;
400-
ppce500_load_device_tree(p->machine, &p->params, p->addr, p->initrd_base,
401-
p->initrd_size, false);
411+
ppce500_load_device_tree(&p->machine, &p->params, p->addr, p->initrd_base,
412+
p->initrd_size, p->kernel_base, p->kernel_size,
413+
false);
402414
}
403415

404416
static int ppce500_prep_device_tree(MachineState *machine,
405417
PPCE500Params *params,
406418
hwaddr addr,
407419
hwaddr initrd_base,
408-
hwaddr initrd_size)
420+
hwaddr initrd_size,
421+
hwaddr kernel_base,
422+
hwaddr kernel_size)
409423
{
410424
DeviceTreeParams *p = g_new(DeviceTreeParams, 1);
411425
p->machine = machine;
412426
p->params = *params;
413427
p->addr = addr;
414428
p->initrd_base = initrd_base;
415429
p->initrd_size = initrd_size;
430+
p->kernel_base = kernel_base;
431+
p->kernel_size = kernel_size;
416432

417433
qemu_register_reset(ppce500_reset_device_tree, p);
418434

419435
/* Issue the device tree loader once, so that we get the size of the blob */
420436
return ppce500_load_device_tree(machine, params, addr, initrd_base,
421-
initrd_size, true);
437+
initrd_size, kernel_base, kernel_size,
438+
true);
422439
}
423440

424441
/* Create -kernel TLB entries for BookE. */
@@ -787,7 +804,8 @@ void ppce500_init(MachineState *machine, PPCE500Params *params)
787804
int dt_size;
788805

789806
dt_size = ppce500_prep_device_tree(machine, params, dt_base,
790-
initrd_base, initrd_size);
807+
initrd_base, initrd_size,
808+
loadaddr, kernel_size);
791809
if (dt_size < 0) {
792810
fprintf(stderr, "couldn't load device tree\n");
793811
exit(1);

0 commit comments

Comments
 (0)