Logging BIOS POST Codes Through Redfish

Author: Terry Duncan

Primary assignee: Zhikui Ren

Other contributors: Jason Bills, Zhikui Ren

Created: December 23, 2019

Problem Description

BIOS Power-On Self-Test (POST) codes are exposed on DBUS but not currently over Redfish. This describes a method to expose the BIOS POST codes over the Redfish interface using the logging service.

Background and References

The standard Redfish LogService and LogEntry schemas will be used to expose BIOS POST codes. An additional log service (PostCodes) will be added to the LogServiceCollection.

Sample LogService entry:

https://obmc/redfish/v1/Systems/system/LogServices/PostCodes
{
    "@odata.context": "/redfish/v1/$metadata#LogService.LogService",
    "@odata.id": "/redfish/v1/Systems/system/LogServices/PostCodes",
    "@odata.type": "#LogService.v1_1_0.LogService",
    "Actions": {
        "#LogService.ClearLog": {
            "target": "/redfish/v1/Systems/system/LogServices/PostCodes/Actions/LogService.ClearLog"
        }
    },
    "Description": "POST Code Log Service",
    "Entries": {
        "@odata.id": "/redfish/v1/Systems/system/LogServices/PostCodes/Entries"
    },
    "Id": "BIOS POST Code Log",
    "Name": "POST Code Log Service",
    "OverWritePolicy": "WrapsWhenFull"
}

Events will be exposed using the LogEntry schema.

https://obmc/redfish/v1/Systems/system/LogServices/PostCodes/Entries
{
    "@odata.context": "/redfish/v1/$metadata#LogEntryCollection.LogEntryCollection",
    "@odata.id": "/redfish/v1/Systems/system/LogServices/PostCodes/Entries",
    "@odata.type": "#LogEntryCollection.LogEntryCollection",
    "Description": "Collection of POST Code Log Entries",
    "Members": [
        {
            "@odata.context": "/redfish/v1/$metadata#LogEntry.LogEntry",
            "@odata.id": "/redfish/v1/Systems/system/LogServices/PostCodes/Entries/B1-03",
            "@odata.type": "#LogEntry.v1_4_0.LogEntry",
            "Created": "2019-12-06T14:10:30+00:00",
            "EntryType": "Event",
            "Id": "B1-03",
            "Message": "Boot Count: 4: TS Offset: 0.0033; POST Code: 0x43",
            "MessageArgs": [
                4,
                0.0033,
                "0x43"
            ],
            "MessageId": "OpenBMC.0.1.BiosPostCode",
            "Name": "POST Code Log Entry",
            "Severity": "OK"
        },
        ...
    ],
    "Members@odata.count": 10000,
    "Name": "BIOS POST Code Log Entries"
}

A new MessageRegistry schema entry defines the format for the message.

https://obmc/redfish/v1/Registries/OpenBMC/OpenBMC
{
    "@Redfish.Copyright": "Copyright 2018 OpenBMC. All rights reserved.",
    "@odata.type": "#MessageRegistry.v1_0_0.MessageRegistry",
    "Description": "This registry defines the base messages for OpenBMC.",
    "Id": "OpenBMC.0.1.0",
    "Language": "en",
    "Messages": {
        "BiosPostCode": {
            "Description": "BIOS Power-On Self-Test Code received.",
            "Message": "Boot Count: %1: TS Offset: %2; POST Code: %3",
            "NumberOfArgs": 3,
            "ParamTypes": [
                "number",
                "number",
                "string"
            ],
            "Resolution": "None.",
            "Severity": "OK"
        },
        ...
    }
    "Name": "OpenBMC Message Registry",
    "OwningEntity": "OpenBMC",
    "RegistryPrefix": "OpenBMC",
    "RegistryVersion": "0.1.0"
}

Requirements

The Redfish Interface shall be Redfish compliant and pass the Redfish compliancy tests.

The Redfish interface shall expose POST codes tracked on DBUS since the last BMC reset.

Proposed Design

Currently, OpenBMC exposes BIOS POST codes on DBus using the xyz.openbmc_project.State.Boot.PostCode service. The existing interface tracks POST codes for the past 100 host boot events and the current boot cycle index.

xyz.openbmc_project.State.Boot.PostCode
    GetPostCodes(q undefined) → [uint64] undefined
    CurrentBootCycleIndex = 1
    MaxBootCycleIndex = 100

The GetPostCodes method is called using the boot cycle index to retrieve the codes for the boot cycle.

{
  "call": "GetPostCodes",
  "interface": "xyz.openbmc_project.State.Boot.PostCode",
  "obj": "/xyz/openbmc_project/State/Boot/PostCode",
  "result": [
    1,
    2,
    3,
    4,
    5,
    6,
    17,
    50,
    4,
    173
  ],
  "status": "ok"
}

The existing DBus GetPostCodes method will remain for backward compatibility. A new method GetPostCodesTS will be added to include an ISO formatted time stamp with micro-second resolution along with each POST code.

{
  "call": "GetPostCodesTS",
  "interface": "xyz.openbmc_project.State.Boot.PostCode",
  "obj": "/xyz/openbmc_project/State/Boot/PostCode",
  "result": [
    {"20191223T143052.632591", 1},
    {"20191223T143052.634083", 2},
    {"20191223T143053.928719", 3},
    {"20191223T143053.930168", 4},
    {"20191223T143054.512488", 5},
    {"20191223T143054.513945", 6},
    {"20191223T143054.960246", 17},
    {"20191223T143054.961723", 50},
    {"20191223T143055.368219", 4},
    {"20191223T143055.369680", 173}
  ],
  "status": "ok"
}

The DBus DeleteAll interface will be implemented to remove entries. The Redfish ClearLog action will call the DBus DeleteAll interface.

{
  "call": "DeleteAll",
  "interface": "xyz.openbmc_project.Collection.DeleteAll",
  "obj": "/xyz/openbmc_project/State/Boot/PostCode",
  "result": "POST Codes Cleared"
  "status": "ok"
}

Alternatives Considered

Consideration was given to using the existing DBus method and not exposing associated time stamps. In this case, a single log entry could be used per boot cycle exposing a string with all POST codes associated with that boot cycle. Time stamp data was considered valuable even if the data may be skewed by DBUS.

Consideration was also given to expose the POST codes through a OEM extension rather than using the LogEntry schema. Use of OEM extensions to Redfish are discouraged. It can be revisited if DMTF adds a schema for POST codes.

Impacts

Backward compatibility remains with the existing DBUS interface method. Minimal performance impact is expected to track timestamps.

Testing

Compliance with Redfish will be tested using the Redfish Service Validator.