浏览代码

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>
Nicholas Piggin 5 月之前
父节点
当前提交
80f9321308
共有 6 个文件被更改,包括 37 次插入1 次删除
  1. 1 0
      MAINTAINERS
  2. 7 0
      docs/system/ppc/powernv.rst
  3. 15 1
      hw/ppc/pnv.c
  4. 13 0
      pc-bios/README
  5. 1 0
      pc-bios/meson.build
  6. 二进制
      pc-bios/pnv-pnor.bin

+ 1 - 0
MAINTAINERS

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

+ 7 - 0
docs/system/ppc/powernv.rst

@@ -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
   -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
 Maintainer contact information
 ------------------------------
 ------------------------------
 
 

+ 15 - 1
hw/ppc/pnv.c

@@ -64,6 +64,8 @@
 #define FW_LOAD_ADDR            0x0
 #define FW_LOAD_ADDR            0x0
 #define FW_MAX_SIZE             (16 * MiB)
 #define FW_MAX_SIZE             (16 * MiB)
 
 
+#define PNOR_FILE_NAME          "pnv-pnor.bin"
+
 #define KERNEL_LOAD_ADDR        0x20000000
 #define KERNEL_LOAD_ADDR        0x20000000
 #define KERNEL_MAX_SIZE         (128 * MiB)
 #define KERNEL_MAX_SIZE         (128 * MiB)
 #define INITRD_LOAD_ADDR        0x28000000
 #define INITRD_LOAD_ADDR        0x28000000
@@ -941,7 +943,7 @@ static void pnv_init(MachineState *machine)
     uint64_t chip_ram_start = 0;
     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;
     DeviceState *dev;
     DeviceState *dev;
 
 
     if (kvm_enabled()) {
     if (kvm_enabled()) {
@@ -971,6 +973,18 @@ static void pnv_init(MachineState *machine)
      * Create our simple PNOR device
      * Create our simple PNOR device
      */
      */
     dev = qdev_new(TYPE_PNV_PNOR);
     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) {
     if (pnor) {
         qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(pnor));
         qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(pnor));
     }
     }

+ 13 - 0
pc-bios/README

@@ -43,6 +43,19 @@
   run an hypervisor OS or simply a host OS on the "baremetal"
   run an hypervisor OS or simply a host OS on the "baremetal"
   platform, also known as the PowerNV (Non-Virtualized) platform.
   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
 - QemuMacDrivers (https://github.com/ozbenh/QemuMacDrivers) is a project to
   provide virtualised drivers for PPC MacOS guests.
   provide virtualised drivers for PPC MacOS guests.
 
 

+ 1 - 0
pc-bios/meson.build

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

二进制
pc-bios/pnv-pnor.bin