From 0778dd94de984eacdab30de6c2db7875671cc28f Mon Sep 17 00:00:00 2001 From: Dan Crowell Date: Fri, 12 May 2017 15:40:46 -0500 Subject: Updates to HBRT runtime interfaces Reconciling P9 function table with P8 table to make opal-prd work. Added new entries for: - firmware_request - get_ipoll_events - firmware_notify Added in entries for P8 functions: - get_interface_capabilities Added deprecated placeholders for P8 functions: - occ_load - occ_start - occ_stop Moved entries for: - load_pm_complex - start_pm_complex - reset_pm_complex Change-Id: I1892b4465a6e5901aa9eaa6a49e139a4bc4c5b56 CMVC-Prereq: 1026011 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/40467 Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Reviewed-by: Daniel M. Crowell --- src/include/runtime/interface.h | 230 +++++++++++++++++++++++++++------------- 1 file changed, 157 insertions(+), 73 deletions(-) (limited to 'src/include/runtime') diff --git a/src/include/runtime/interface.h b/src/include/runtime/interface.h index 188abaf11..3a94146be 100644 --- a/src/include/runtime/interface.h +++ b/src/include/runtime/interface.h @@ -37,9 +37,9 @@ */ /** Current interface version. - * 0x9001: 9=P9, 001=Version 1 + * 0x9001: 9=P9, 002=Version 2 */ -#define HOSTBOOT_RUNTIME_INTERFACE_VERSION 0x9001 +#define HOSTBOOT_RUNTIME_INTERFACE_VERSION 0x9002 #ifndef __HOSTBOOT_RUNTIME_INTERFACE_VERSION_ONLY @@ -53,7 +53,7 @@ enum MemoryError_t * continues to report errors on subsequent reads. A second CE on that * cache line will result in memory UE. Therefore, it is advised to * migrate off of the address range as soon as possible. */ - MEMORY_ERROR_CE, + MEMORY_ERROR_CE = 0, /** Hardware has reported an uncorrectable error in memory (memory UE, * channel failure, etc). The hypervisor should migrate any partitions @@ -63,13 +63,13 @@ enum MemoryError_t * partition failures to handle the hardware attentions so that the * hypervisor will know all areas of memory that are impacted by the * failure. */ - MEMORY_ERROR_UE, + MEMORY_ERROR_UE = 1, /** Firmware has predictively requested service on a part in the memory * subsystem. The partitions may not have been affected, but it is * advised to migrate off of the address range as soon as possible to * avoid potential partition outages. */ - MEMORY_ERROR_PREDICTIVE, + MEMORY_ERROR_PREDICTIVE = 2, }; /** @@ -131,6 +131,21 @@ enum MemoryError_t #define HBRT_RSVD_MEM__SECUREBOOT "ibm,secure-crypt-algo-code" +/** + * Specifiers for get_interface_capabilities + */ + +/* Common Features */ +#define HBRT_CAPS_SET0_COMMON 0 + +/* OPAL fixes */ +#define HBRT_CAPS_SET1_OPAL 1 +#define HBRT_CAPS_OPAL_HAS_XSCOM_RC (1ul << 0) + +/* PHYP fixes */ +#define HBRT_CAPS_SET2_PHYP 2 + + /** @typedef hostInterfaces_t * @brief Interfaces provided by the underlying environment (ex. Sapphire). * @@ -412,6 +427,40 @@ typedef struct hostInterfaces int (*memory_error)( uint64_t i_startAddr, uint64_t i_endAddr, enum MemoryError_t i_errorType ); + /** + * @brief Query the HBRT host for a list of fixes/features + * + * There are times when workarounds need to be put into place to handle + * issues with the hosting layer (e.g. opal-prd) while fixes are not yet + * released. This is especially true because of the disconnected release + * streams for the firmware and the hosting environment. + * + * @param i_set Indicates which set of fixes/features we're checking + * see HBRT_CAPS_SET... + * + * @return a bitmask containing the relevant flags for the current + * implementation, see HBRT_CAPS_FLAGS_... + */ + uint64_t (*get_interface_capabilities)( uint64_t i_set ); + + /** + * @brief Map a physical address space into usable memory + * @note Repeated calls to map the same memory should not return an error + * @param[in] i_physMem Physical address + * @param[in] i_bytes Number of bytes to map in + * @return NULL on error, else pointer to usable memory + * @platform FSP, OpenPOWER + */ + void* (*map_phys_mem)(uint64_t i_physMem, size_t i_bytes); + + /** + * @brief Unmap a physical address space from usable memory + * @param[in] i_ptr Previously mapped pointer + * @return 0 on success, else RC + * @platform FSP, OpenPOWER + */ + int (*unmap_phys_mem)(void* i_ptr); + /** * @brief Modify the SCOM restore section of the HCODE image with the * given register data @@ -442,22 +491,27 @@ typedef struct hostInterfaces uint64_t i_scomData ); /** - * @brief Map a physical address space into usable memory - * @note Repeated calls to map the same memory should not return an error - * @param[in] i_physMem Physical address - * @param[in] i_bytes Number of bytes to map in - * @return NULL on error, else pointer to usable memory - * @platform FSP, OpenPOWER - */ - void* (*map_phys_mem)(uint64_t i_physMem, size_t i_bytes); - - /** - * @brief Unmap a physical address space from usable memory - * @param[in] i_ptr Previously mapped pointer - * @return 0 on success, else RC - * @platform FSP, OpenPOWER + * @brief Send a request to firmware, and receive a response + * @details + * req_len bytes are sent to runtime firmware, and resp_len + * bytes received in response. + * + * Both req and resp are allocated by the caller. If resp_len + * is not large enough to contain the full response, an error + * is returned. + * + * @param[in] i_reqLen length of request data + * @param[in] i_req request data + * @param[inout] o_respLen in: size of request data buffer + * out: length of request data + * @param[in] o_resp response data + * @return 0 on success, else RC + * @platform FSP, OpenPOWER */ - int (*unmap_phys_mem)(void* i_ptr); + int (*firmware_request)( uint64_t i_reqLen, + void *i_req, + uint64_t* o_respLen, + void *o_resp ); // Reserve some space for future growth. // do NOT ever change this number, even if you add functions. @@ -476,7 +530,7 @@ typedef struct hostInterfaces // allocated with sufficient space and populated with NULL function // pointers. 32 is big enough that we should not likely add that many // functions from either direction in between any two levels of support. - void (*reserved[32])(void); + void (*reserved[27])(void); } hostInterfaces_t; @@ -503,44 +557,11 @@ typedef struct runtimeInterfaces const uint32_t * (*get_lid_list)(size_t * o_num); /** - * @brief Load OCC/HCODE images into mainstore - * - * @param[in] i_chip the HW chip id (XSCOM chip ID) - * @param[in] i_homer_addr the physical mainstore address of the - * start of the HOMER image, - * @param[in] i_occ_common_addr the physical mainstore address of the - * OCC common area, 8MB, used for - * OCC-OCC communication (1 per node) - * @param[in] i_mode selects initial load vs concurrent reloads - * HBRT_PM_LOAD: - * load all lids/sections from scratch, - * preserve nothing - * HBRT_PM_RELOAD: - * reload all lids/sections, - * but preserve runtime updates - * @return 0 on success else return code - * @platform FSP, OpenPOWER - */ - int (*load_pm_complex)( uint64_t i_chip, - uint64_t i_homer_addr, - uint64_t i_occ_common_addr, - uint32_t i_mode ); - - /** - * @brief Start OCC/HCODE on the specified chip - * @param[in] i_chip the HW chip id - * @return 0 on success else return code - * @platform FSP, OpenPOWER - */ - int (*start_pm_complex)( uint64_t i_chip ); - - /** - * @brief Reset OCC/HCODE on the specified chip - * @param[in] i_chip the HW chip id - * @return 0 on success else return code - * @platform FSP, OpenPOWER + * Space allocated for deprecated P8 interfaces */ - int (*reset_pm_complex)( uint64_t i_chip ); + const uint32_t * (*occ_load__deprecated)(size_t * o_num); + const uint32_t * (*occ_start__deprecated)(size_t * o_num); + const uint32_t * (*occ_stop__deprecated)(size_t * o_num); /** * @brief Notify HTMGT that an OCC has an error to report @@ -630,20 +651,20 @@ typedef struct runtimeInterfaces /** * @brief Send a pass-through command to HTMGT * - * @details  This is a blocking call that will send a command - *           to HTMGT. - * @note     If o_rspLength is returned with a non-zero value, - *           the data at the o_rspData should be dumped to - *           stdout in a hex dump format. - * @note The maximum response data returned will be 4096 bytes + * @details This is a blocking call that will send a command + * to HTMGT. + * @note If o_rspLength is returned with a non-zero value, + * the data at the o_rspData should be dumped to + * stdout in a hex dump format. + * @note The maximum response data returned will be 4096 bytes * * @param[in] i_cmdLength number of bytes in pass-thru command data - * @param[in]     *i_cmdData   pointer to pass-thru command data + * @param[in] *i_cmdData pointer to pass-thru command data * @param[out] *o_rspLength pointer to number of bytes returned * in o_rspData - * @param[out] *o_rspData   pointer to a 4096 byte buffer that will + * @param[out] *o_rspData pointer to a 4096 byte buffer that will * contain the response data from the command - * @returns  0 on success, or return code if the command failed + * @returns 0 on success, or return code if the command failed * @platform OpenPOWER */ int (*mfg_htmgt_pass_thru)( uint16_t i_cmdLength, @@ -692,20 +713,83 @@ typedef struct runtimeInterfaces size_t i_hwKeyHashSize); /** - * @brief SBE message passing + * @brief SBE message passing notification * - * @details  This is a blocking call that will pass an SBE message - *           with a pass-through command through HBRT to code that - * will process the command and provide a response. + * @details + * This is a blocking call that is used to notify HBRT there is + * a SBE message available. This should be called when the Host + * detects the appropriate PSU interrupt from the SBE. * * @param[in] i_procChipId Chip ID of the processor whose SBE is passing * the message and sent the interrupt * - * @returns  0 on success, or return code if the command failed + * @return 0 on success, or return code if the command failed * @platform FSP, OpenPOWER */ int (*sbe_message_passing)(uint32_t i_procChipId); + /** + * @brief Load OCC/HCODE images into mainstore + * + * @param[in] i_chip the HW chip id (XSCOM chip ID) + * @param[in] i_homer_addr the physical mainstore address of the + * start of the HOMER image, + * @param[in] i_occ_common_addr the physical mainstore address of the + * OCC common area, 8MB, used for + * OCC-OCC communication (1 per node) + * @param[in] i_mode selects initial load vs concurrent reloads + * HBRT_PM_LOAD: + * load all lids/sections from scratch, + * preserve nothing + * HBRT_PM_RELOAD: + * reload all lids/sections, + * but preserve runtime updates + * @return 0 on success else return code + * @platform FSP, OpenPOWER + */ + int (*load_pm_complex)( uint64_t i_chip, + uint64_t i_homer_addr, + uint64_t i_occ_common_addr, + uint32_t i_mode ); + + /** + * @brief Start OCC/HCODE on the specified chip + * @param[in] i_chip the HW chip id + * @return 0 on success else return code + * @platform FSP, OpenPOWER + */ + int (*start_pm_complex)( uint64_t i_chip ); + + /** + * @brief Reset OCC/HCODE on the specified chip + * @param[in] i_chip the HW chip id + * @return 0 on success else return code + * @platform FSP, OpenPOWER + */ + int (*reset_pm_complex)( uint64_t i_chip ); + + /** + * @brief Query the IPOLL event mask supported by HBRT + * + * @details This call allows the wrapper application to query + * the ipoll event mask to set when the HBRT instance is running. Bits + * that are *set* in this bitmask represent events that will be + * forwarded to the handle_attn() callback. + * + * @return The IPOLL event bits to enable during HBRT execution + * @platform FSP, OpenPOWER + */ + uint64_t (*get_ipoll_events)( void ); + + /** + * @brief Receive an async notification from firmware + * @param[in] i_len length of notification data + * @param[in] i_data notification data + * @platform FSP, OpenPOWER + */ + void (*firmware_notify)( uint64_t len, + void *data ); + // Reserve some space for future growth. // do NOT ever change this number, even if you add functions. // @@ -723,7 +807,7 @@ typedef struct runtimeInterfaces // allocated with sufficient space and populated with NULL function // pointers. 32 is big enough that we should not likely add that many // functions from either direction in between any two levels of support. - void (*reserved[32])(void); + void (*reserved[22])(void); } runtimeInterfaces_t; -- cgit v1.2.1