Name Date Size #Lines LOC

..--

include/H--329161

service_files/H--1310

src/H--871681

subprojects/H--7955

.clang-formatH A D01-Feb-20253.7 KiB137135

.gitignoreH A D18-Oct-202442 43

LICENSEH A D16-Dec-2023558 1410

OWNERSH A D02-Oct-20241.7 KiB4944

README.mdH A D18-Dec-20246.2 KiB182141

meson.buildH A D18-Oct-20242.4 KiB9384

README.md

1# Remote BIOS Configuration
2
3[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
4
5## Overview
6
7The **biosconfig_manager** service enables users to view and modify the BIOS
8setup configuration parameters remotely through the Baseboard Management
9Controller (BMC) at any host state. Changes to these parameters will take effect
10upon the next system reboot or immediately, depending on the host firmware.
11
12For more details, please refer to [design document][rbmc-design-document].
13
14## Features
15
16- **Remote management** of BIOS settings.
17- **Immediate updates** or scheduled changes upon reboot.
18- **Reset BIOS Settings** support through the dbus.
19- **ChangePassword** support to change the BIOS setup password.
20
21## RBC Manager Interface
22
23The Manager interface exposes methods and properties to Get & Set BIOS
24attributes via dbus and its documented [here][pdi-manager-bios]
25
26### Object Path
27
28```txt
29/xyz/openbmc_project/BIOSConfig/Manager
30```
31
32### Methods
33
34- **SetAttribute** Sets a specific BIOS attribute to a new value.
35- **GetAttribute** Retrieves the current and pending values of a BIOS attribute.
36
37### Properties
38
39- **ResetBIOSSettings** To reset the BIOS settings based on the Reset Flag.
40- **BaseBIOSTable** Captures the entire BIOS table (collective information of
41  all the BIOS attributes and their properties)
42
43## Signature of `BaseBIOSTable`
44
45The `BaseBIOSTable` property in the RBC Manager Interface is a complex
46dictionary that defines the structure of BIOS attributes. Its type signature is
47as follows:
48
49```plaintext
50dict[string, struct[
51    enum[self.AttributeType],
52    boolean,
53    string,
54    string,
55    string,
56    variant[int64, string],
57    variant[int64, string],
58    array[struct[enum[self.BoundType], variant[int64, string], string]]
59]]
60```
61
62This structure consists of:
63
64- **Attribute Name (string)**: The name of the BIOS attribute.
65- **Attribute Type (enum)**: The type of the BIOS attribute (e.g., String,
66  Integer).
67- **Read-only Status (boolean)**: Whether the attribute is read-only.
68- **Display Name (string)**: The human-readable name of the attribute.
69- **Description (string)**: A description of what the attribute does.
70- **Menu Path (string)**: The BIOS menu path where this attribute can be found.
71- **Current Value (variant[int64, string])**: The current value of the
72  attribute.
73- **Default Value (variant[int64, string])**: The default value of the
74  attribute.
75- **Options (array of structs)**: The available options or bounds for this
76  attribute.
77
78### Examples
79
80Here is an example json structure of a `String` attribute with `attributeName`
81`DrdFreqLimit` & its various properties in BaseBIOSTable signature.
82
83```json
84{
85  "DdrFreqLimit": {
86    "attributeType": "xyz.openbmc_project.BIOSConfig.Manager.AttributeType.String",
87    "readonlyStatus": false,
88    "displayname": "Memory Operating Speed Selection",
89    "description": "Force specific Memory Operating Speed or use Auto setting.",
90    "menuPath": "Advanced/Memory Configuration/Memory Operating Speed Selection",
91    "current": "0x00",
92    "default": "0x0B",
93    "options": [
94      { "optionstring": "auto", "optionvalue": "enum0" },
95      { "optionstring": "2133", "optionvalue": "enum1" },
96      { "optionstring": "2400", "optionvalue": "enum2" },
97      { "optionstring": "2664", "optionvalue": "enum3" },
98      { "optionstring": "2933", "optionvalue": "enum4" }
99    ]
100  }
101}
102```
103
104Here is another example json structure of a `Integer` attribute with attribute
105with name `BIOSSerialDebugLevel` & its various properties in BaseBIOSTable
106signature.
107
108```json
109{
110  "BIOSSerialDebugLevel": {
111    "attributeType": "xyz.openbmc_project.BIOSConfig.Manager.AttributeType.Integer",
112    "readonlyStatus": false,
113    "displayname": "BIOS Serial Debug level",
114    "description": "BIOS Serial Debug level during system boot.",
115    "menuPath": "Advanced/Debug Feature Selection",
116    "current": "0x00",
117    "default": "0x01",
118    "options": [
119      { "optionstring": "MinBound", "optionvalue": 0 },
120      { "optionstring": "MaxBound", "optionvalue": 4 },
121      { "optionstring": "ScalarIncrement", "optionvalue": 1 }
122    ]
123  }
124}
125```
126
127## Initialization of `BaseBIOSTable`
128
129When the `bios-settings-mgr` daemon starts, it initializes with an empty
130`BaseBIOSTable`. It is the responsibility of provider daemons, such as **PLDM**
131or **IPMI**, to populate this table by fetching or defining the BIOS settings.
132These provider daemons are expected to gather the necessary BIOS attributes and
133values from their respective sources (ex: bmc, system firmware) and then
134initialize the `BaseBIOSTable` property with those settings.
135
136### BIOS with PLDM as Communication Protocol
137
138For systems that use the **PLDM (Platform Level Data Model)** protocol between
139BMC & Host, OEM vendors can define their own BIOS attributes in the form of
140[JSON files][pldm-bios-json]. The PLDM daemon parses these files and initializes
141the `BaseBIOSTable` property accordingly. This allows for flexible and custom
142BIOS configuration options based on the vendor's specifications.
143
144For more details , refer to the [BIOS Support in PLDM][pldm-bios].
145
146### BIOS with IPMI as Communication Protocol
147
148For systems that use the **Intelligent Platform Management Interface** protocol
149between BMC & Host, BIOS attributes are gathered from BIOS as an `xml file` &
150`BaseBIOSTable` would then be initialized with the attributes data from the
151parsed xml file.
152
153For more details, refer to the code [BIOS Support in IPMI][ipmi-intel-bios].
154
155## RBC Password Interface
156
157### Object Path
158
159```txt
160xyz.openbmc_project.BIOSConfig.Password
161```
162
163### Methods
164
165- **ChangePassword**
166  Used to change the BIOS setup password.
167
168### Properties
169
170- **PasswordInitialized** Used to indicate whether the BIOS password-related
171  details have been received.
172
173[rbmc-design-document]:
174  https://github.com/openbmc/docs/blob/master/designs/remote-bios-configuration.md
175[pldm-bios-json]:
176  https://github.com/openbmc/pldm/blob/master/oem/ibm/configurations/bios/com.ibm.Hardware.Chassis.Model.Rainier2U/bios_attrs.json
177[pldm-bios]: https://github.com/openbmc/pldm?tab=readme-ov-file#bios-support
178[ipmi-intel-bios]:
179  https://github.com/openbmc/intel-ipmi-oem/blob/master/src/biosconfigcommands.cpp
180[pdi-manager-bios]:
181  https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/BIOSConfig/Manager.interface.yaml
182