ppc/pnv: Distribute RAM among the chips
But always give the first 1GB to chip 0 as skiboot requires it. Signed-off-by: Cédric Le Goater <clg@kaod.org> Message-Id: <20210809134547.689560-6-clg@kaod.org> Reviewed-by: Greg Kurz <groug@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
ab17a3fe74
commit
458c6f0180
33
hw/ppc/pnv.c
33
hw/ppc/pnv.c
|
@ -710,6 +710,23 @@ static void pnv_chip_power10_pic_print_info(PnvChip *chip, Monitor *mon)
|
||||||
pnv_psi_pic_print_info(&chip10->psi, mon);
|
pnv_psi_pic_print_info(&chip10->psi, mon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Always give the first 1GB to chip 0 else we won't boot */
|
||||||
|
static uint64_t pnv_chip_get_ram_size(PnvMachineState *pnv, int chip_id)
|
||||||
|
{
|
||||||
|
MachineState *machine = MACHINE(pnv);
|
||||||
|
uint64_t ram_per_chip;
|
||||||
|
|
||||||
|
assert(machine->ram_size >= 1 * GiB);
|
||||||
|
|
||||||
|
ram_per_chip = machine->ram_size / pnv->num_chips;
|
||||||
|
if (ram_per_chip >= 1 * GiB) {
|
||||||
|
return QEMU_ALIGN_DOWN(ram_per_chip, 1 * MiB);
|
||||||
|
}
|
||||||
|
|
||||||
|
ram_per_chip = (machine->ram_size - 1 * GiB) / (pnv->num_chips - 1);
|
||||||
|
return chip_id == 0 ? 1 * GiB : QEMU_ALIGN_DOWN(ram_per_chip, 1 * MiB);
|
||||||
|
}
|
||||||
|
|
||||||
static void pnv_init(MachineState *machine)
|
static void pnv_init(MachineState *machine)
|
||||||
{
|
{
|
||||||
const char *bios_name = machine->firmware ?: FW_FILE_NAME;
|
const char *bios_name = machine->firmware ?: FW_FILE_NAME;
|
||||||
|
@ -717,6 +734,7 @@ static void pnv_init(MachineState *machine)
|
||||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||||
char *fw_filename;
|
char *fw_filename;
|
||||||
long fw_size;
|
long fw_size;
|
||||||
|
uint64_t chip_ram_start = 0;
|
||||||
int i;
|
int i;
|
||||||
char *chip_typename;
|
char *chip_typename;
|
||||||
DriveInfo *pnor = drive_get(IF_MTD, 0, 0);
|
DriveInfo *pnor = drive_get(IF_MTD, 0, 0);
|
||||||
|
@ -821,17 +839,16 @@ static void pnv_init(MachineState *machine)
|
||||||
char chip_name[32];
|
char chip_name[32];
|
||||||
Object *chip = OBJECT(qdev_new(chip_typename));
|
Object *chip = OBJECT(qdev_new(chip_typename));
|
||||||
int chip_id = i;
|
int chip_id = i;
|
||||||
|
uint64_t chip_ram_size = pnv_chip_get_ram_size(pnv, chip_id);
|
||||||
|
|
||||||
pnv->chips[i] = PNV_CHIP(chip);
|
pnv->chips[i] = PNV_CHIP(chip);
|
||||||
|
|
||||||
/*
|
/* Distribute RAM among the chips */
|
||||||
* TODO: put all the memory in one node on chip 0 until we find a
|
object_property_set_int(chip, "ram-start", chip_ram_start,
|
||||||
* way to specify different ranges for each chip
|
&error_fatal);
|
||||||
*/
|
object_property_set_int(chip, "ram-size", chip_ram_size,
|
||||||
if (i == 0) {
|
&error_fatal);
|
||||||
object_property_set_int(chip, "ram-size", machine->ram_size,
|
chip_ram_start += chip_ram_size;
|
||||||
&error_fatal);
|
|
||||||
}
|
|
||||||
|
|
||||||
snprintf(chip_name, sizeof(chip_name), "chip[%d]", chip_id);
|
snprintf(chip_name, sizeof(chip_name), "chip[%d]", chip_id);
|
||||||
object_property_add_child(OBJECT(pnv), chip_name, chip);
|
object_property_add_child(OBJECT(pnv), chip_name, chip);
|
||||||
|
|
Loading…
Reference in New Issue