tools/pci: refactor did variable for NuvotonPciBridge

Symptom:
Host tool "burn_my_bmc" for in-band firmware update didn't work
and exception is about PCI device cannot find in NPCM8xx platform.

root@localhost:~#
burn_my_bmc --command update --interface ipmipci --image test.sig
--sig test.sig --type dummy

Sending over the firmware image.
Opening the cleanup blob
Committing to the cleanup blob
Closing cleanup blob
Exception received: Couldn't find supported PCI device

Root cause:
There are new Nuvoton PCI device-id in NPCM8xx platform.
The previous device-id 0x0750 is hardcode for NPCM7xx platform.
However, NPCM8xx PCI device is using new device-id 0x0850.
Thus, host tool will throw the exception from NotFoundException().

Solution:
We need to refactor this "did" variable to make host tool
"burn_my_bmc" can work well for these two kinds of PCI devices.

Tested:
In-band firmware update can work well in NPCM8xx with did change to 0x0850.
Here is the result of "lspci" from host side for refer it.
root@localhost:~# lspci -v | grep d7:
d7:01.0 Unassigned class [ff00]: Winbond Electronics Corp Device 0850 (rev 08)
d7:02.0 Unassigned class [ff00]: Winbond Electronics Corp Device 0850 (rev 08)

Change-Id: I2917298f13b0bcd7de3b2ff71173c546ea3cb02b
Signed-off-by: Tim Lee <timlee660101@gmail.com>
5 files changed
tree: ecb7e3abfe058625ff2a35183884f3c7261b0990
  1. bmc/
  2. cleanup/
  3. internal/
  4. subprojects/
  5. tools/
  6. .clang-format
  7. .gitignore
  8. bmc_json_config.md
  9. data.hpp
  10. flags.hpp
  11. ipmi_flash.md
  12. LICENSE
  13. meson.build
  14. meson.options
  15. OWNERS
  16. README.md
  17. status.hpp
  18. util.hpp
README.md

Secure Flash Update Mechanism

This document describes the OpenBmc software implementing the secure flash update mechanism.

The primary details are here.

Building and using the host-tool

This repo contains a host-tool implementation for talking to the corresponding BMC blob handler.

Building the host-tool

The host-tool depends on ipmi-blob-tool and pciutils.

Building libpciaccess

Check out the xorg-macros source.

Then run these commands in the source directory.

./autogen.sh --prefix=/usr
make install

Check out the libpciaccess source.

Then run these commands in the source directory.

./autogen.sh
make
make install

Building ipmi-blob-tool

Check out the ipmi-blob-tool source.

Then run these commands in the source directory.

./bootstrap.sh
./configure
make
make install

Building stdplus

Check out the stdplus source.

Then run these commands in the source directory.

meson setup -Dexamples=false -Dtests=disabled builddir
ninja -C builddir
ninja -C builddir install

Building burn_my_bmc (the host-tool)

Check out the phosphor-ipmi-flash source.

Then run these commands in the source directory.

./bootstrap.sh
./configure --disable-build-bmc-blob-handler
make
make install

NOTE: When building from the OpenBMC SDK your configuration call will be:

./configure --enable-oe-sdk --host "$(uname -m)" --disable-build-bmc-blob-handler AR=x86_64-openbmc-linux-gcc-ar RANLIB=x86_64-openbmc-linux-gcc-ranlib

Parameters

The host-tool has parameters that let the caller specify every required detail.

The required parameters are:

ParameterOptionsMeaning
commandupdateThe tool should try to update the BMC firmware.
interfaceipmibt, ipmilpc, ipmipci, ipminet, ipmipci-skip-bridge-disableThe data transport mechanism, typically ipmilpc. The ipmipci-skip-bridge-disable is ipmipci but does not disable the bridge after.
imagepathThe BMC firmware image file (or tarball)
sigpathThe path to a signature file to send to the BMC along with the image file.
typeblob endingThe ending of the blob id. For instance /flash/image becomes a type of image.

If you're using an LPC data transfer mechanism, you'll need two additional parameters: address and length. These values indicate where on the host you've reserved memory to be used for the transfer window.

If you're using a net data transfer mechanism, you'll also need two additional parameters: hostname and port. These specify which address and port the tool should attempt to connect to the BMC using. If unspecified, the port option defaults to 623, the same port as IPMI LAN+.

Introduction

This supports three methods of providing the image to stage. You can send the file over IPMI packets, which is a very slow process. A 32-MiB image can take ~3 hours to send via this method. This can be done in <1 minutes via the PCI or net bridge, or just a few minutes via LPC depending on the size of the mapped area.

This is implemented as a phosphor blob handler.

The image must be signed via the production or development keys, the former being required for production builds. The image itself and the image signature are separately sent to the BMC for verification. The verification package source is beyond the scope of this design.

Basically the IPMI OEM handler receives the image in one fashion or another and then triggers the verify_image service. Then, the user polls until the result is reported. This is because the image verification process can exceed 10 seconds.

Using Legacy Images

The image flashing mechanism itself is the initramfs stage during reboot. It will check for files named "image-*" and flash them appropriately for each name to section. The IPMI command creates a file /run/initramfs/bmc-image and writes the contents there. It was found that writing it in /tmp could cause OOM errors moving it on low memory systems, whereas renaming a file within the same folder seems to only update the directory inode's contents.

Using UBI

The staging file path can be controlled via software configuration. The image is assumed to be the tarball contents and is written into /tmp/{tarball_name}.gz

TODO: Flesh out the UBI approach.

Configuration

To use phosphor-ipmi-flash a platform must provide a configuration. A platform can configure multiple interfaces, such as both lpc and pci. However, a platform should only configure either static layout updates, or ubi. If enabling lpc, the platform must specify either aspeed or nuvoton. The system also supports receiving BIOS updates.

The following are the two primary configuration options, which control how the update is treated.

OptionMeaning
--enable-static-layoutEnable treating the update as a static layout update.
--enable-tarball-ubiEnable treating the update as a tarball for UBI update.
--enable-host-biosEnable receiving the update for a host bios update.

The following are configuration options for how the host and BMC are meant to transfer the data. By default, the data-in-IPMI mechanism is enabled.

There are three configurable data transport mechanisms, either staging the bytes via the LPC memory region, the PCI-to-AHB memory region, or sending over a network connection. Because there is only one MAPPED_ADDRESS variable at present, a platform should not configure LPC and P2A at the same time. The platform's device-tree may have the region locked to a specific driver (lpc-aspeed-ctrl), preventing the region from other use.

NOTE: It will likely be possible to configure both LPC and P2A in the near future.

VariableDefaultMeaning
MAPPED_ADDRESS0The address used for mapping P2A or LPC into the BMC's memory-space.

There are two kinds of PCI device-id for NPCM7xx and NPCM8xx respectively. For NPCM7xx the device-id is using 0x0750 and NPCM8xx is using 0x0850. Use this variable that can help to build host tool burn_my_bmc compatible with different platforms and make in-band firmware update work well.

VariableDefaultMeaning
NUVOTON_PCI_DID0x0750The device-id for Nuvoton PCI bridge.

If a platform enables p2a as the transport mechanism, a specific vendor must be selected via the following configuration option. Currently, only one is supported.

OptionMeaning
--enable-aspeed-p2aUse with ASPEED parts.

If a platform enables lpc as the transport mechanism, a specific vendor must be selected via the following configuration option. Currently, only two are supported.

OptionMeaning
--enable-aspeed-lpcUse with ASPEED parts.
--enable-nuvoton-lpcUse with Nuvoton parts.

A platform may also enable the network transport mechanism.

NOTE: This mechanism is only intended to be used in-band and not exposed externally, as it doesn't implement any encryption or integrity verification.

OptionMeaning
--enable-net-bridgeEnable net transport bridge

There are also options to control an optional clean up mechanism.

OptionMeaning
--enable-cleanup-deleteProvide a simple blob id that deletes artifacts.

If the update mechanism desired is simply a BMC reboot, a platform can just enable that directly.

OptionMeaning
--enable-reboot-updateEnable use of reboot update mechanism.

If you would like the update status to be tracked with a status file, this option can be enabled. Note that --enable-update-status option and the above --enable-reboot-update option cannot be enabled at the same time.

OptionMeaning
--enable-update-statusEnable use of update status file.

If you would like to use host memory access to update on a PPC platform, this configuration option needs to be enabled.

OptionMeaning
--enable-ppcEnable PPC host memory access.

Internal Configuration Details

The following variables can be set to whatever you wish, however they have usable default values.

VariableDefaultMeaning
STATIC_HANDLER_STAGED_NAME/run/initramfs/bmc-imageThe filename where to write the staged firmware image for static updates.
TARBALL_STAGED_NAME/tmp/image-update.tarThe filename where to write the UBI update tarball.
HASH_FILENAME/tmp/bmc.sigThe file to use for the hash provided.
PREPARATION_DBUS_SERVICEphosphor-ipmi-flash-bmc-prepare.targetThe systemd target started when the host starts to send an update.
VERIFY_STATUS_FILENAME/tmp/bmc.verifyThe file checked for the verification status.
VERIFY_DBUS_SERVICEphosphor-ipmi-flash-bmc-verify.targetThe systemd target started for verification.
UPDATE_DBUS_SERVICEphosphor-ipmi-flash-bmc-update.targetThe systemd target started for updating the BMC.
UPDATE_STATUS_FILENAME/tmp/bmc.updateThe file checked for the update status.
BIOS_STAGED_NAME/tmp/bios-imageThe file to use for staging the bios firmware update.
BIOS_VERIFY_STATUS_FILENAME/tmp/bios.verifyThe file checked for the verification status.
PREPARATION_BIOS_TARGETphosphor-ipmi-flash-bios-prepare.targetThe systemd target when the host starts to send an update.
VERIFY_BIOS_TARGETphosphor-ipmi-flash-bios-verify.targetThe systemd target started for verification.
UPDATE_BIOS_TARGETphosphor-ipmi-flash-bios-update.targetThe systemd target started for updating the BIOS.

JSON Configuration

Read the details of the json configuration. The json configurations are used to configure the BMC's flash handler behaviors.

Flash State Machine Details

This document describes the details of the state machine implemented and how different interactions with it will respond. This also describes how a host-side tool is expected to talk to it (triggering different states and actions).