127 lines
2.6 KiB
ReStructuredText
127 lines
2.6 KiB
ReStructuredText
Code Update on FSP based machine
|
|
================================
|
|
|
|
There are three OPAL calls for code update. These are currently only
|
|
implemented on FSP based machines.
|
|
|
|
.. code-block::c
|
|
|
|
#define OPAL_FLASH_VALIDATE 76
|
|
#define OPAL_FLASH_MANAGE 77
|
|
#define OPAL_FLASH_UPDATE 78
|
|
|
|
.. _OPAL_FLASH_VALIDATE:
|
|
|
|
OPAL_FLASH_VALIDATE
|
|
-------------------
|
|
|
|
.. code-block:: c
|
|
|
|
#define OPAL_FLASH_VALIDATE 76
|
|
|
|
int64_t fsp_opal_validate_flash(uint64_t buffer, uint32_t *size, uint32_t *result);
|
|
|
|
|
|
Validate new image is valid for this platform or not. We do below
|
|
validation in OPAL:
|
|
|
|
- We do below sys parameters validation to confirm inband
|
|
update is allowed.
|
|
- Platform is managed by HMC or not?.
|
|
- Code update policy (inband code update allowed?).
|
|
|
|
- We parse candidate image header (first 4k bytes) to perform
|
|
below validations.
|
|
- Image magic number.
|
|
- Image version to confirm image is valid for this platform.
|
|
|
|
Input
|
|
^^^^^
|
|
buffer
|
|
First 4k bytes of new image
|
|
|
|
size
|
|
Input buffer size
|
|
|
|
Output
|
|
^^^^^^
|
|
|
|
buffer
|
|
Output result (current and new image version details)
|
|
|
|
size
|
|
Output buffer size
|
|
|
|
result
|
|
Token to identify what will happen if update is attempted
|
|
See hw/fsp/fsp-codeupdate.h for token values.
|
|
|
|
Return value
|
|
^^^^^^^^^^^^
|
|
Validation status
|
|
|
|
.. _OPAL_FLASH_MANAGE:
|
|
|
|
OPAL_FLASH_MANAGE
|
|
-----------------
|
|
|
|
.. code-block:: c
|
|
|
|
#define OPAL_FLASH_MANAGE 77
|
|
|
|
int64_t fsp_opal_manage_flash(uint8_t op);
|
|
|
|
Commit/Reject image.
|
|
|
|
- We can commit new image (T -> P), if system is running with T side image.
|
|
- We can reject T side image, if system is running with P side image.
|
|
|
|
**Note:** If a platform is running from a T side image when an update is to be
|
|
applied, then the platform may automatically commit the current T side
|
|
image to the P side to allow the new image to be updated to the
|
|
temporary image area.
|
|
|
|
Input
|
|
^^^^^
|
|
op
|
|
Operation (1 : Commit /0 : Reject)
|
|
|
|
Return value
|
|
Commit operation status (0 : Success)
|
|
|
|
.. _OPAL_FLASH_UPDATE:
|
|
|
|
OPAL_FLASH_UPDATE
|
|
-----------------
|
|
|
|
.. code-block:: c
|
|
|
|
#define OPAL_FLASH_UPDATE 78
|
|
|
|
int64_t fsp_opal_update_flash(struct opal_sg_list *list);
|
|
|
|
Update new image. It only sets the flag, actual update happens
|
|
during system reboot/shutdown.
|
|
|
|
Host splits FW image to scatter/gather list and sends it to OPAL.
|
|
OPAL parse the image to get indivisual LID and passes it to FSP
|
|
via MBOX command.
|
|
|
|
FW update flow :
|
|
|
|
- if (running side == T)
|
|
Swap P & T side
|
|
- Start code update
|
|
- Delete T side LIDs
|
|
- Write LIDs
|
|
- Code update complete
|
|
- Deep IPL
|
|
|
|
Input
|
|
^^^^^
|
|
list
|
|
Real address of image scatter/gather list of the FW image
|
|
|
|
Return value:
|
|
Update operation status (0: update requested)
|