1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
Host Code Update
================
Reference:
https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software
Following are the steps to update the host firmware (or "BIOS"). This assumes
the host is not accessing its firmware.
1. Get a squashfs image:
* Build op-build: https://github.com/open-power/op-build
* After building, the image should be a tarball in the output/images
directory called <system type>.pnor.squashfs.tar
2. Transfer the generated squashfs image to the BMC via one of the following
methods:
* Method 1: Via scp: Copy the generated squashfs image to the `/tmp/images/`
directory on the BMC.
* Method 2: Via REST Upload:
https://github.com/openbmc/docs/blob/master/rest-api.md#uploading-images
* Method 3: Via TFTP: Perform a POST request to call the `DownloadViaTFTP`
method of `/xyz/openbmc_project/software`.
```
curl -b cjar -k -H "Content-Type: application/json" -X POST \
-d '{"data": ["<filename>", "<TFTP server IP address"]}' \
https://${bmc}/xyz/openbmc_project/software/action/DownloadViaTFTP
```
3. Note the version id generated for that image file. The version id is a hash
value of 8 hexadecimal numbers, generated by SHA-512 hashing the version
string contained in the image and taking the first 8 characters. Get the
version id via one of the following methods:
* Method 1: From the BMC command line, note the most recent directory name
created under `/tmp/images/`, in this example it'd be `2a1022fe`:
```
# ls -l /tmp/images/
total 0
drwx------ 2 root root 80 Aug 22 07:54 2a1022fe
drwx------ 2 root root 80 Aug 22 07:53 488449a2
```
* Method 2: This method *only* works if there are no `Ready` images at the
start of transferring the image. Using the REST API, note the object that
has its Activation property set to Ready, in this example it'd be `2a1022fe`:
```
$ curl -b cjar -k https://${bmc}/xyz/openbmc_project/software/enumerate
{
"data": {
"/xyz/openbmc_project/software/2a1022fe": {
"Activation": "xyz.openbmc_project.Software.Activation.Activations.Ready",
```
* Method 3: Calculate the version id beforehand from the image with:
```
tar xfO <squashfs image tar> MANIFEST | sed -ne '/version=/ {s/version=//;p}' | head -n1 | tr -d '\n' | sha512sum | cut -b 1-8
```
4. To initiate the update, set the `RequestedActivation` property of the desired
image to `Active`, substitute ``<id>`` with the hash value noted on the previous
step, this will write the contents of the image to a UBI volume in the PNOR chip
via one of the following methods:
* Method 1: From the BMC command line:
```
busctl set-property org.open_power.Software.Host.Updater \
/xyz/openbmc_project/software/<id> \
xyz.openbmc_project.Software.Activation RequestedActivation s \
xyz.openbmc_project.Software.Activation.RequestedActivations.Active
```
* Method 2: Using the REST API:
```
curl -b cjar -k -H "Content-Type: application/json" -X PUT \
-d '{"data":
"xyz.openbmc_project.Software.Activation.RequestedActivations.Active"}' \
https://${bmc}/xyz/openbmc_project/software/<id>/attr/RequestedActivation
```
5. (Optional) Check the flash progress. This interface is only available during
the activation progress and is not present once the activation is completed
via one of the following:
* Method 1: From the BMC command line:
```
busctl get-property org.open_power.Software.Host.Updater \
/xyz/openbmc_project/software/<id> \
xyz.openbmc_project.Software.Activation Progress
```
* Method 2: Using the REST API:
```
curl -b cjar -k https://${bmc}/xyz/openbmc_project/software/<id>/attr/Progress
```
6. Check the activation is complete by verifying the Activation property is set
to Active via one of the following methods:
* Method 1: From the BMC command line:
```
busctl get-property org.open_power.Software.Host.Updater \
/xyz/openbmc_project/software/<id> \
xyz.openbmc_project.Software.Activation Activation
```
* Method 2: Using the REST API:
```
curl -b cjar -k https://${bmc}/xyz/openbmc_project/software/<id>
```
### Patching the host firmware
Copy the partition binary file to `/usr/local/share/pnor/` on the BMC.
The partition binary file must be named the same as the partition name that
intends to patch, ex: `ATTR_TMP`.
### Associations, MANIFEST File, Deleting an Image, Software Field Mode, and Software Factory Reset
Information about associations, the MANIFEST file, deleting an image, software
field mode, and software factory reset can be found at
[ubi-code-update.md#associations](ubi-code-update.md#associations)
### Implementation
https://github.com/openbmc/openpower-pnor-code-mgmt
|