Code Update on FSP based machine

There are three OPAL calls for code update. These are currently only implemented on FSP based machines.



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.

Return value

Validation status


#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.



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

  • Write LIDs

  • Code update complete

  • Deep IPL



Real address of image scatter/gather list of the FW image

Return value:

Update operation status (0: update requested)