Code Update on FSP based machine¶
There are three OPAL calls for code update. These are currently only implemented on FSP based machines.
#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.
First 4k bytes of new image
Input buffer size
Output result (current and new image version details)
Output buffer size
Token to identify what will happen if update is attempted See hw/fsp/fsp-codeupdate.h for token values.
#define OPAL_FLASH_MANAGE 77 int64_t fsp_opal_manage_flash(uint8_t op);
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.
Operation (1 : Commit /0 : Reject)
- Return value
Commit operation status (0 : Success)
#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
Code update complete
Real address of image scatter/gather list of the FW image
- Return value:
Update operation status (0: update requested)