ppc/pnv: Add a default formatted PNOR image

The default PNOR image is erased and not recognised by skiboot, so NVRAM
gets disabled. This change adds a tiny pnor file that is a proper FFS
image with a formatted NVRAM partition. This is recognised by skiboot and
will persist across machine reboots.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
Nicholas Piggin 2025-03-01 01:07:57 +10:00
parent 4c84a0a4a6
commit 80f9321308
6 changed files with 37 additions and 1 deletions

View file

@ -1537,6 +1537,7 @@ F: include/hw/ppc/pnv*
F: include/hw/pci-host/pnv*
F: include/hw/ssi/pnv_spi*
F: pc-bios/skiboot.lid
F: pc-bios/pnv-pnor.bin
F: tests/qtest/pnv*
F: tests/functional/test_ppc64_powernv.py

View file

@ -195,6 +195,13 @@ Use a MTD drive to add a PNOR to the machine, and get a NVRAM :
-drive file=./witherspoon.pnor,format=raw,if=mtd
If no mtd drive is provided, the powernv platform will create a default
PNOR device using a tiny formatted PNOR in pc-bios/pnv-pnor.bin opened
read-only (PNOR changes will be persistent across reboots but not across
invocations of QEMU). If no defaults are used, an erased 128MB PNOR is
provided (which skiboot will probably not recognize since it is not
formatted).
Maintainer contact information
------------------------------

View file

@ -64,6 +64,8 @@
#define FW_LOAD_ADDR 0x0
#define FW_MAX_SIZE (16 * MiB)
#define PNOR_FILE_NAME "pnv-pnor.bin"
#define KERNEL_LOAD_ADDR 0x20000000
#define KERNEL_MAX_SIZE (128 * MiB)
#define INITRD_LOAD_ADDR 0x28000000
@ -941,7 +943,7 @@ static void pnv_init(MachineState *machine)
uint64_t chip_ram_start = 0;
int i;
char *chip_typename;
DriveInfo *pnor = drive_get(IF_MTD, 0, 0);
DriveInfo *pnor;
DeviceState *dev;
if (kvm_enabled()) {
@ -971,6 +973,18 @@ static void pnv_init(MachineState *machine)
* Create our simple PNOR device
*/
dev = qdev_new(TYPE_PNV_PNOR);
pnor = drive_get(IF_MTD, 0, 0);
if (!pnor && defaults_enabled()) {
fw_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, PNOR_FILE_NAME);
if (!fw_filename) {
warn_report("Could not find PNOR '%s'", PNOR_FILE_NAME);
} else {
QemuOpts *opts;
opts = drive_add(IF_MTD, -1, fw_filename, "format=raw,readonly=on");
pnor = drive_new(opts, IF_MTD, &error_fatal);
g_free(fw_filename);
}
}
if (pnor) {
qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(pnor));
}

View file

@ -43,6 +43,19 @@
run an hypervisor OS or simply a host OS on the "baremetal"
platform, also known as the PowerNV (Non-Virtualized) platform.
- pnv-pnor.bin is a non-volatile RAM image used by PowerNV, which stores
NVRAM BIOS settings among other things. This image was created with the
following command (the ffspart tool can be found in the skiboot source tree):
ffspart -s 0x1000 -c 34 -i pnv-pnor.in -p pnv-pnor.bin
Where pnv-pnor.in contains the two lines (no leading whitespace):
NVRAM,0x01000,0x00020000,,,/dev/zero
VERSION,0x21000,0x00001000,,,/dev/zero
skiboot is then booted once to format the NVRAM partition.
- QemuMacDrivers (https://github.com/ozbenh/QemuMacDrivers) is a project to
provide virtualised drivers for PPC MacOS guests.

View file

@ -70,6 +70,7 @@ blobs = [
's390-ccw.img',
'slof.bin',
'skiboot.lid',
'pnv-pnor.bin',
'palcode-clipper',
'u-boot.e500',
'u-boot-sam460-20100605.bin',

BIN
pc-bios/pnv-pnor.bin Normal file

Binary file not shown.