configurations: minerva: add cpld firmware update config
Add CPLD firmware's configurations use in the Minerva CMM.
```
phosphor-dbus-interfaces lore link:
82512: com.meta: add compatible device strings for Minerva https://gerrit.openbmc.org/c/openbmc/phosphor-dbus-interfaces/+/82512
```
Tested on Minerva:
````
1. Check inventory
root@bmc:~# curl -u root:0penBmc -k -X GET https://localhost/redfish/v1/UpdateService/FirmwareInventory
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory",
"@odata.type": "#SoftwareInventoryCollection.SoftwareInventoryCollection",
"Members": [
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Minerva_CMM_CPLD_5976"
},
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Minerva_SCM_CPLD_6700"
}
],
"Members@odata.count": 14,
"Name": "Software Inventory Collection"
}
2. Check firmware information
root@bmc:~# curl -u root:0penBmc -k -X GET https://localhost/redfish/v1/UpdateService/FirmwareInventory/Minerva_CMM_CPLD_5976
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Minerva_CMM_CPLD_5976",
"@odata.type": "#SoftwareInventory.v1_1_0.SoftwareInventory",
"Description": "Unknown image",
"Id": "Minerva_CMM_CPLD_5976",
"Name": "Software Inventory",
"Status": {
"Health": "OK",
"HealthRollup": "OK",
"State": "Enabled"
},
"Updateable": true,
"Version": "00000047"
}
root@bmc:~# curl -u root:0penBmc -k -X GET https://localhost/redfish/v1/UpdateService/FirmwareInventory/Minerva_SCM_CPLD_6700
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Minerva_SCM_CPLD_6700",
"@odata.type": "#SoftwareInventory.v1_1_0.SoftwareInventory",
"Description": "Unknown image",
"Id": "Minerva_SCM_CPLD_6700",
"Name": "Software Inventory",
"Status": {
"Health": "OK",
"HealthRollup": "OK",
"State": "Enabled"
},
"Updateable": true,
"Version": "00010006"
}
3. Trigger update
curl -k -u root:0penBmc \
-H "Content-Type:multipart/form-data" \
-X POST \
-F UpdateParameters="{\"Targets\":[\"${targetpath}\"],\"@Redfish.OperationApplyTime\":\"Immediate\"};type=application/json" \
-F "UpdateFile=@${fwpath};type=application/octet-stream" \
https://${bmc}/redfish/v1/UpdateService/update-multipart
{
"@odata.id": "/redfish/v1/TaskService/Tasks/0",
"@odata.type": "#Task.v1_4_3.Task",
"HidePayload": false,
"Id": "0",
"Messages": [
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has started.",
"MessageArgs": [
"0"
],
"MessageId": "TaskEvent.1.0.TaskStarted",
"MessageSeverity": "OK",
"Resolution": "None."
}
],
"Name": "Task 0",
"Payload": {
"HttpHeaders": [],
"HttpOperation": "POST",
"TargetUri": "/redfish/v1/UpdateService/update-multipart"
},
"PercentComplete": 0,
"StartTime": "2025-08-11T07:09:53+00:00",
"TaskMonitor": "/redfish/v1/TaskService/TaskMonitors/0",
"TaskState": "Running",
"TaskStatus": "OK"
}
curl -k -u root:0penBmc \
-H "Content-Type:multipart/form-data" \
-X POST \
-F UpdateParameters="{\"Targets\":[\"${targetpath}\"],\"@Redfish.OperationApplyTime\":\"Immediate\"};type=application/json" \
-F "UpdateFile=@${fwpath};type=application/octet-stream" \
https://${bmc}/redfish/v1/UpdateService/update-multipart
{
"@odata.id": "/redfish/v1/TaskService/Tasks/1",
"@odata.type": "#Task.v1_4_3.Task",
"HidePayload": false,
"Id": "1",
"Messages": [
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has started.",
"MessageArgs": [
"1"
],
"MessageId": "TaskEvent.1.0.TaskStarted",
"MessageSeverity": "OK",
"Resolution": "None."
}
],
"Name": "Task 1",
"Payload": {
"HttpHeaders": [],
"HttpOperation": "POST",
"TargetUri": "/redfish/v1/UpdateService/update-multipart"
},
"PercentComplete": 0,
"StartTime": "2025-08-11T07:12:59+00:00",
"TaskMonitor": "/redfish/v1/TaskService/TaskMonitors/1",
"TaskState": "Running",
"TaskStatus": "OK"
}
4. Check task status
curl -u root:0penBmc -k -X GET https://${bmc}/redfish/v1/TaskService/Tasks/0
{
"@odata.id": "/redfish/v1/TaskService/Tasks/0",
"@odata.type": "#Task.v1_4_3.Task",
"EndTime": "2025-08-11T07:09:58+00:00",
"HidePayload": false,
"Id": "0",
"Messages": [
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has started.",
"MessageArgs": [
"0"
],
"MessageId": "TaskEvent.1.0.TaskStarted",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 1 percent complete.",
"MessageArgs": [
"0",
"1"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 10 percent complete.",
"MessageArgs": [
"0",
"10"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 15 percent complete.",
"MessageArgs": [
"0",
"15"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 20 percent complete.",
"MessageArgs": [
"0",
"20"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 25 percent complete.",
"MessageArgs": [
"0",
"25"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 30 percent complete.",
"MessageArgs": [
"0",
"30"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 40 percent complete.",
"MessageArgs": [
"0",
"40"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 50 percent complete.",
"MessageArgs": [
"0",
"50"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 60 percent complete.",
"MessageArgs": [
"0",
"60"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 70 percent complete.",
"MessageArgs": [
"0",
"70"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 80 percent complete.",
"MessageArgs": [
"0",
"80"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 90 percent complete.",
"MessageArgs": [
"0",
"90"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has changed to progress 100 percent complete.",
"MessageArgs": [
"0",
"100"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '0' has completed.",
"MessageArgs": [
"0"
],
"MessageId": "TaskEvent.1.0.TaskCompletedOK",
"MessageSeverity": "OK",
"Resolution": "None."
}
],
"Name": "Task 0",
"Payload": {
"HttpHeaders": [],
"HttpOperation": "POST",
"JsonBody": "null",
"TargetUri": "/redfish/v1/UpdateService/update-multipart"
},
"PercentComplete": 100,
"StartTime": "2025-08-11T07:09:53+00:00",
"TaskMonitor": "/redfish/v1/TaskService/TaskMonitors/0",
"TaskState": "Completed",
"TaskStatus": "OK"
}
curl -u root:0penBmc -k -X GET https://${bmc}/redfish/v1/TaskService/Tasks1
{
"@odata.id": "/redfish/v1/TaskService/Tasks/1",
"@odata.type": "#Task.v1_4_3.Task",
"EndTime": "2025-08-11T07:13:33+00:00",
"HidePayload": false,
"Id": "1",
"Messages": [
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has started.",
"MessageArgs": [
"1"
],
"MessageId": "TaskEvent.1.0.TaskStarted",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 10 percent complete.",
"MessageArgs": [
"1",
"10"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 15 percent complete.",
"MessageArgs": [
"1",
"15"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 20 percent complete.",
"MessageArgs": [
"1",
"20"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 25 percent complete.",
"MessageArgs": [
"1",
"25"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 30 percent complete.",
"MessageArgs": [
"1",
"30"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 40 percent complete.",
"MessageArgs": [
"1",
"40"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 50 percent complete.",
"MessageArgs": [
"1",
"50"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 60 percent complete.",
"MessageArgs": [
"1",
"60"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 70 percent complete.",
"MessageArgs": [
"1",
"70"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 80 percent complete.",
"MessageArgs": [
"1",
"80"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 90 percent complete.",
"MessageArgs": [
"1",
"90"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has changed to progress 100 percent complete.",
"MessageArgs": [
"1",
"100"
],
"MessageId": "TaskEvent.1.0.TaskProgressChanged",
"MessageSeverity": "OK",
"Resolution": "None."
},
{
"@odata.type": "#Message.v1_1_1.Message",
"Message": "The task with Id '1' has completed.",
"MessageArgs": [
"1"
],
"MessageId": "TaskEvent.1.0.TaskCompletedOK",
"MessageSeverity": "OK",
"Resolution": "None."
}
],
"Name": "Task 1",
"Payload": {
"HttpHeaders": [],
"HttpOperation": "POST",
"JsonBody": "null",
"TargetUri": "/redfish/v1/UpdateService/update-multipart"
},
"PercentComplete": 100,
"StartTime": "2025-08-11T07:12:59+00:00",
"TaskMonitor": "/redfish/v1/TaskService/TaskMonitors/1",
"TaskState": "Completed",
"TaskStatus": "OK"
}
5. Check inventory again
root@bmc:~# curl -u root:0penBmc -k -X GET https://localhost/redfish/v1/UpdateService/FirmwareInventory
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory",
"@odata.type": "#SoftwareInventoryCollection.SoftwareInventoryCollection",
"Members": [
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Minerva_CMM_CPLD_6127"
},
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Minerva_SCM_CPLD_9541"
}
],
"Members@odata.count": 14,
"Name": "Software Inventory Collection"
}
6. Check firmware information again after ac cycle
root@bmc:~# curl -u root:0penBmc -k -X GET https://localhost/redfish/v1/UpdateService/FirmwareInventory/Minerva_SCM_CPLD_6429
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Minerva_SCM_CPLD_6429",
"@odata.type": "#SoftwareInventory.v1_1_0.SoftwareInventory",
"Description": "Unknown image",
"Id": "Minerva_SCM_CPLD_6429",
"Name": "Software Inventory",
"Status": {
"Health": "OK",
"HealthRollup": "OK",
"State": "Enabled"
},
"Updateable": true,
"Version": "00010005"
}
root@bmc:~# curl -u root:0penBmc -k -X GET https://localhost/redfish/v1/UpdateService/FirmwareInventory/Minerva_CMM_CPLD_9177
{
"@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Minerva_CMM_CPLD_9177",
"@odata.type": "#SoftwareInventory.v1_1_0.SoftwareInventory",
"Description": "Unknown image",
"Id": "Minerva_CMM_CPLD_9177",
"Name": "Software Inventory",
"Status": {
"Health": "OK",
"HealthRollup": "OK",
"State": "Enabled"
},
"Updateable": true,
"Version": "00000046"
```
Change-Id: Ic9b8bb4713625af2bf4a22f867b3e7b1573d1cfe
Signed-off-by: Yang Chen <yang.chen@quantatw.com>
diff --git a/configurations/meta/minerva_cmm.json b/configurations/meta/minerva_cmm.json
index 828c738..71617de 100644
--- a/configurations/meta/minerva_cmm.json
+++ b/configurations/meta/minerva_cmm.json
@@ -215,6 +215,16 @@
"vout1_Name": "CMM_HSC_VOUT_VOLT_V"
},
{
+ "Address": "0x44",
+ "Bus": 8,
+ "FirmwareInfo": {
+ "CompatibleHardware": "com.meta.Hardware.Minerva.CPLD.LCMXO3D_9400HC_cmm",
+ "VendorIANA": 40981
+ },
+ "Name": "Minerva_CMM_CPLD",
+ "Type": "LatticeLCMXO3D_9400Firmware"
+ },
+ {
"Address": "0x4f",
"Bus": 1,
"Name": "CMM_OUTLET_TEMP_C",
diff --git a/configurations/meta/minerva_cmm_hsc_infineon.json b/configurations/meta/minerva_cmm_hsc_infineon.json
index 2c398e9..cb6ef0b 100644
--- a/configurations/meta/minerva_cmm_hsc_infineon.json
+++ b/configurations/meta/minerva_cmm_hsc_infineon.json
@@ -160,6 +160,16 @@
"power1_Name": "CMM_PMON_P12V_PWR_W"
},
{
+ "Address": "0x44",
+ "Bus": 8,
+ "FirmwareInfo": {
+ "CompatibleHardware": "com.meta.Hardware.Minerva.CPLD.LCMXO3D_9400HC_cmm",
+ "VendorIANA": 40981
+ },
+ "Name": "Minerva_CMM_CPLD",
+ "Type": "LatticeLCMXO3D_9400Firmware"
+ },
+ {
"Address": "0x4f",
"Bus": 1,
"Name": "CMM_OUTLET_TEMP_C",
diff --git a/configurations/meta/minerva_cmm_scm.json b/configurations/meta/minerva_cmm_scm.json
index a46fd50..a89f4de 100644
--- a/configurations/meta/minerva_cmm_scm.json
+++ b/configurations/meta/minerva_cmm_scm.json
@@ -727,6 +727,16 @@
"Type": "GPIOLeakDetector"
},
{
+ "Address": "0x40",
+ "Bus": 15,
+ "FirmwareInfo": {
+ "CompatibleHardware": "com.meta.Hardware.Minerva.CPLD.LCMXO3LF_2100C_scm",
+ "VendorIANA": 40981
+ },
+ "Name": "Minerva_SCM_CPLD",
+ "Type": "LatticeLCMXO3LF_2100CFirmware"
+ },
+ {
"Address": "0x4B",
"Bus": 1,
"Name": "SCM_INLET_TEMP_C",