Code Update on FSP based machine

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

OPAL_FLASH_VALIDATE

#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

#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

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