| 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) |