1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (C) 2016 Freescale Semiconductor, Inc. 3*91f16700Schasinglulu * Copyright 2017-2019 NXP 4*91f16700Schasinglulu * 5*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu /*! 9*91f16700Schasinglulu * Header file containing the public API for the System Controller (SC) 10*91f16700Schasinglulu * Miscellaneous (MISC) function. 11*91f16700Schasinglulu * 12*91f16700Schasinglulu * @addtogroup MISC_SVC (SVC) Miscellaneous Service 13*91f16700Schasinglulu * 14*91f16700Schasinglulu * Module for the Miscellaneous (MISC) service. 15*91f16700Schasinglulu * 16*91f16700Schasinglulu * @{ 17*91f16700Schasinglulu */ 18*91f16700Schasinglulu 19*91f16700Schasinglulu #ifndef SC_MISC_API_H 20*91f16700Schasinglulu #define SC_MISC_API_H 21*91f16700Schasinglulu 22*91f16700Schasinglulu /* Includes */ 23*91f16700Schasinglulu 24*91f16700Schasinglulu #include <sci/svc/rm/sci_rm_api.h> 25*91f16700Schasinglulu #include <sci/sci_types.h> 26*91f16700Schasinglulu 27*91f16700Schasinglulu /* Defines */ 28*91f16700Schasinglulu 29*91f16700Schasinglulu /*! 30*91f16700Schasinglulu * @name Defines for type widths 31*91f16700Schasinglulu */ 32*91f16700Schasinglulu /*@{*/ 33*91f16700Schasinglulu #define SC_MISC_DMA_GRP_W 5U /* Width of sc_misc_dma_group_t */ 34*91f16700Schasinglulu /*@}*/ 35*91f16700Schasinglulu 36*91f16700Schasinglulu /*! Max DMA channel priority group */ 37*91f16700Schasinglulu #define SC_MISC_DMA_GRP_MAX 31U 38*91f16700Schasinglulu 39*91f16700Schasinglulu /*! 40*91f16700Schasinglulu * @name Defines for sc_misc_boot_status_t 41*91f16700Schasinglulu */ 42*91f16700Schasinglulu /*@{*/ 43*91f16700Schasinglulu #define SC_MISC_BOOT_STATUS_SUCCESS 0U /* Success */ 44*91f16700Schasinglulu #define SC_MISC_BOOT_STATUS_SECURITY 1U /* Security violation */ 45*91f16700Schasinglulu /*@}*/ 46*91f16700Schasinglulu 47*91f16700Schasinglulu /*! 48*91f16700Schasinglulu * @name Defines for sc_misc_seco_auth_cmd_t 49*91f16700Schasinglulu */ 50*91f16700Schasinglulu /*@{*/ 51*91f16700Schasinglulu #define SC_MISC_SECO_AUTH_SECO_FW 0U /* SECO Firmware */ 52*91f16700Schasinglulu #define SC_MISC_SECO_AUTH_HDMI_TX_FW 1U /* HDMI TX Firmware */ 53*91f16700Schasinglulu #define SC_MISC_SECO_AUTH_HDMI_RX_FW 2U /* HDMI RX Firmware */ 54*91f16700Schasinglulu /*@}*/ 55*91f16700Schasinglulu 56*91f16700Schasinglulu /*! 57*91f16700Schasinglulu * @name Defines for sc_misc_temp_t 58*91f16700Schasinglulu */ 59*91f16700Schasinglulu /*@{*/ 60*91f16700Schasinglulu #define SC_MISC_TEMP 0U /* Temp sensor */ 61*91f16700Schasinglulu #define SC_MISC_TEMP_HIGH 1U /* Temp high alarm */ 62*91f16700Schasinglulu #define SC_MISC_TEMP_LOW 2U /* Temp low alarm */ 63*91f16700Schasinglulu /*@}*/ 64*91f16700Schasinglulu 65*91f16700Schasinglulu /*! 66*91f16700Schasinglulu * @name Defines for sc_misc_seco_auth_cmd_t 67*91f16700Schasinglulu */ 68*91f16700Schasinglulu /*@{*/ 69*91f16700Schasinglulu #define SC_MISC_AUTH_CONTAINER 0U /* Authenticate container */ 70*91f16700Schasinglulu #define SC_MISC_VERIFY_IMAGE 1U /* Verify image */ 71*91f16700Schasinglulu #define SC_MISC_REL_CONTAINER 2U /* Release container */ 72*91f16700Schasinglulu /*@}*/ 73*91f16700Schasinglulu 74*91f16700Schasinglulu /* Types */ 75*91f16700Schasinglulu 76*91f16700Schasinglulu /*! 77*91f16700Schasinglulu * This type is used to store a DMA channel priority group. 78*91f16700Schasinglulu */ 79*91f16700Schasinglulu typedef uint8_t sc_misc_dma_group_t; 80*91f16700Schasinglulu 81*91f16700Schasinglulu /*! 82*91f16700Schasinglulu * This type is used report boot status. 83*91f16700Schasinglulu */ 84*91f16700Schasinglulu typedef uint8_t sc_misc_boot_status_t; 85*91f16700Schasinglulu 86*91f16700Schasinglulu /*! 87*91f16700Schasinglulu * This type is used to issue SECO authenticate commands. 88*91f16700Schasinglulu */ 89*91f16700Schasinglulu typedef uint8_t sc_misc_seco_auth_cmd_t; 90*91f16700Schasinglulu 91*91f16700Schasinglulu /*! 92*91f16700Schasinglulu * This type is used report boot status. 93*91f16700Schasinglulu */ 94*91f16700Schasinglulu typedef uint8_t sc_misc_temp_t; 95*91f16700Schasinglulu 96*91f16700Schasinglulu /* Functions */ 97*91f16700Schasinglulu 98*91f16700Schasinglulu /*! 99*91f16700Schasinglulu * @name Control Functions 100*91f16700Schasinglulu * @{ 101*91f16700Schasinglulu */ 102*91f16700Schasinglulu 103*91f16700Schasinglulu /*! 104*91f16700Schasinglulu * This function sets a miscellaneous control value. 105*91f16700Schasinglulu * 106*91f16700Schasinglulu * @param[in] ipc IPC handle 107*91f16700Schasinglulu * @param[in] resource resource the control is associated with 108*91f16700Schasinglulu * @param[in] ctrl control to change 109*91f16700Schasinglulu * @param[in] val value to apply to the control 110*91f16700Schasinglulu * 111*91f16700Schasinglulu * @return Returns an error code (SC_ERR_NONE = success). 112*91f16700Schasinglulu * 113*91f16700Schasinglulu * Return errors: 114*91f16700Schasinglulu * - SC_PARM if arguments out of range or invalid, 115*91f16700Schasinglulu * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent 116*91f16700Schasinglulu * of the owner 117*91f16700Schasinglulu * 118*91f16700Schasinglulu * Refer to the [Control List](@ref CONTROLS) for valid control values. 119*91f16700Schasinglulu */ 120*91f16700Schasinglulu sc_err_t sc_misc_set_control(sc_ipc_t ipc, sc_rsrc_t resource, 121*91f16700Schasinglulu sc_ctrl_t ctrl, uint32_t val); 122*91f16700Schasinglulu 123*91f16700Schasinglulu /*! 124*91f16700Schasinglulu * This function gets a miscellaneous control value. 125*91f16700Schasinglulu * 126*91f16700Schasinglulu * @param[in] ipc IPC handle 127*91f16700Schasinglulu * @param[in] resource resource the control is associated with 128*91f16700Schasinglulu * @param[in] ctrl control to get 129*91f16700Schasinglulu * @param[out] val pointer to return the control value 130*91f16700Schasinglulu * 131*91f16700Schasinglulu * @return Returns an error code (SC_ERR_NONE = success). 132*91f16700Schasinglulu * 133*91f16700Schasinglulu * Return errors: 134*91f16700Schasinglulu * - SC_PARM if arguments out of range or invalid, 135*91f16700Schasinglulu * - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent 136*91f16700Schasinglulu * of the owner 137*91f16700Schasinglulu * 138*91f16700Schasinglulu * Refer to the [Control List](@ref CONTROLS) for valid control values. 139*91f16700Schasinglulu */ 140*91f16700Schasinglulu sc_err_t sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource, 141*91f16700Schasinglulu sc_ctrl_t ctrl, uint32_t *val); 142*91f16700Schasinglulu 143*91f16700Schasinglulu /* @} */ 144*91f16700Schasinglulu 145*91f16700Schasinglulu /*! 146*91f16700Schasinglulu * @name DMA Functions 147*91f16700Schasinglulu * @{ 148*91f16700Schasinglulu */ 149*91f16700Schasinglulu 150*91f16700Schasinglulu /*! 151*91f16700Schasinglulu * This function configures the max DMA channel priority group for a 152*91f16700Schasinglulu * partition. 153*91f16700Schasinglulu * 154*91f16700Schasinglulu * @param[in] ipc IPC handle 155*91f16700Schasinglulu * @param[in] pt handle of partition to assign \a max 156*91f16700Schasinglulu * @param[in] max max priority group (0-31) 157*91f16700Schasinglulu * 158*91f16700Schasinglulu * @return Returns an error code (SC_ERR_NONE = success). 159*91f16700Schasinglulu * 160*91f16700Schasinglulu * Return errors: 161*91f16700Schasinglulu * - SC_PARM if arguments out of range or invalid, 162*91f16700Schasinglulu * - SC_ERR_NOACCESS if caller's partition is not the parent 163*91f16700Schasinglulu * of the affected partition 164*91f16700Schasinglulu * 165*91f16700Schasinglulu * Valid \a max range is 0-31 with 0 being the lowest and 31 the highest. 166*91f16700Schasinglulu * Default is the max priority group for the parent partition of \a pt. 167*91f16700Schasinglulu */ 168*91f16700Schasinglulu sc_err_t sc_misc_set_max_dma_group(sc_ipc_t ipc, sc_rm_pt_t pt, 169*91f16700Schasinglulu sc_misc_dma_group_t max); 170*91f16700Schasinglulu 171*91f16700Schasinglulu /*! 172*91f16700Schasinglulu * This function configures the priority group for a DMA channel. 173*91f16700Schasinglulu * 174*91f16700Schasinglulu * @param[in] ipc IPC handle 175*91f16700Schasinglulu * @param[in] resource DMA channel resource 176*91f16700Schasinglulu * @param[in] group priority group (0-31) 177*91f16700Schasinglulu * 178*91f16700Schasinglulu * @return Returns an error code (SC_ERR_NONE = success). 179*91f16700Schasinglulu * 180*91f16700Schasinglulu * Return errors: 181*91f16700Schasinglulu * - SC_PARM if arguments out of range or invalid, 182*91f16700Schasinglulu * - SC_ERR_NOACCESS if caller's partition is not the owner or parent 183*91f16700Schasinglulu * of the owner of the DMA channel 184*91f16700Schasinglulu * 185*91f16700Schasinglulu * Valid \a group range is 0-31 with 0 being the lowest and 31 the highest. 186*91f16700Schasinglulu * The max value of \a group is limited by the partition max set using 187*91f16700Schasinglulu * sc_misc_set_max_dma_group(). 188*91f16700Schasinglulu */ 189*91f16700Schasinglulu sc_err_t sc_misc_set_dma_group(sc_ipc_t ipc, sc_rsrc_t resource, 190*91f16700Schasinglulu sc_misc_dma_group_t group); 191*91f16700Schasinglulu 192*91f16700Schasinglulu /* @} */ 193*91f16700Schasinglulu 194*91f16700Schasinglulu /*! 195*91f16700Schasinglulu * @name Security Functions 196*91f16700Schasinglulu * @{ 197*91f16700Schasinglulu */ 198*91f16700Schasinglulu 199*91f16700Schasinglulu /*! 200*91f16700Schasinglulu * This function loads a SECO image. 201*91f16700Schasinglulu * 202*91f16700Schasinglulu * @param[in] ipc IPC handle 203*91f16700Schasinglulu * @param[in] addr_src address of image source 204*91f16700Schasinglulu * @param[in] addr_dst address of image destination 205*91f16700Schasinglulu * @param[in] len length of image to load 206*91f16700Schasinglulu * @param[in] fw SC_TRUE = firmware load 207*91f16700Schasinglulu * 208*91f16700Schasinglulu * @return Returns an error code (SC_ERR_NONE = success). 209*91f16700Schasinglulu * 210*91f16700Schasinglulu * Return errors codes: 211*91f16700Schasinglulu * - SC_ERR_PARM if word fuse index param out of range or invalid 212*91f16700Schasinglulu * - SC_ERR_UNAVAILABLE if SECO not available 213*91f16700Schasinglulu * 214*91f16700Schasinglulu * This is used to load images via the SECO. Examples include SECO 215*91f16700Schasinglulu * Firmware and IVT/CSF data used for authentication. These are usually 216*91f16700Schasinglulu * loaded into SECO TCM. \a addr_src is in secure memory. 217*91f16700Schasinglulu * 218*91f16700Schasinglulu * See the Security Reference Manual (SRM) for more info. 219*91f16700Schasinglulu */ 220*91f16700Schasinglulu sc_err_t sc_misc_seco_image_load(sc_ipc_t ipc, sc_faddr_t addr_src, 221*91f16700Schasinglulu sc_faddr_t addr_dst, uint32_t len, 222*91f16700Schasinglulu sc_bool_t fw); 223*91f16700Schasinglulu 224*91f16700Schasinglulu /*! 225*91f16700Schasinglulu * This function is used to authenticate a SECO image or command. 226*91f16700Schasinglulu * 227*91f16700Schasinglulu * @param[in] ipc IPC handle 228*91f16700Schasinglulu * @param[in] cmd authenticate command 229*91f16700Schasinglulu * @param[in] addr address of/or metadata 230*91f16700Schasinglulu * 231*91f16700Schasinglulu * @return Returns an error code (SC_ERR_NONE = success). 232*91f16700Schasinglulu * 233*91f16700Schasinglulu * Return errors codes: 234*91f16700Schasinglulu * - SC_ERR_PARM if word fuse index param out of range or invalid 235*91f16700Schasinglulu * - SC_ERR_UNAVAILABLE if SECO not available 236*91f16700Schasinglulu * 237*91f16700Schasinglulu * This is used to authenticate a SECO image or issue a security 238*91f16700Schasinglulu * command. \a addr often points to an container. It is also 239*91f16700Schasinglulu * just data (or even unused) for some commands. 240*91f16700Schasinglulu * 241*91f16700Schasinglulu * See the Security Reference Manual (SRM) for more info. 242*91f16700Schasinglulu */ 243*91f16700Schasinglulu sc_err_t sc_misc_seco_authenticate(sc_ipc_t ipc, 244*91f16700Schasinglulu sc_misc_seco_auth_cmd_t cmd, 245*91f16700Schasinglulu sc_faddr_t addr); 246*91f16700Schasinglulu 247*91f16700Schasinglulu /*! 248*91f16700Schasinglulu * This function securely writes a group of fuse words. 249*91f16700Schasinglulu * 250*91f16700Schasinglulu * @param[in] ipc IPC handle 251*91f16700Schasinglulu * @param[in] addr address of message block 252*91f16700Schasinglulu * 253*91f16700Schasinglulu * @return Returns and error code (SC_ERR_NONE = success). 254*91f16700Schasinglulu * 255*91f16700Schasinglulu * Return errors codes: 256*91f16700Schasinglulu * - SC_ERR_UNAVAILABLE if SECO not available 257*91f16700Schasinglulu * 258*91f16700Schasinglulu * Note \a addr must be a pointer to a signed message block. 259*91f16700Schasinglulu * 260*91f16700Schasinglulu * See the Security Reference Manual (SRM) for more info. 261*91f16700Schasinglulu */ 262*91f16700Schasinglulu sc_err_t sc_misc_seco_fuse_write(sc_ipc_t ipc, sc_faddr_t addr); 263*91f16700Schasinglulu 264*91f16700Schasinglulu /*! 265*91f16700Schasinglulu * This function securely enables debug. 266*91f16700Schasinglulu * 267*91f16700Schasinglulu * @param[in] ipc IPC handle 268*91f16700Schasinglulu * @param[in] addr address of message block 269*91f16700Schasinglulu * 270*91f16700Schasinglulu * @return Returns and error code (SC_ERR_NONE = success). 271*91f16700Schasinglulu * 272*91f16700Schasinglulu * Return errors codes: 273*91f16700Schasinglulu * - SC_ERR_UNAVAILABLE if SECO not available 274*91f16700Schasinglulu * 275*91f16700Schasinglulu * Note \a addr must be a pointer to a signed message block. 276*91f16700Schasinglulu * 277*91f16700Schasinglulu * See the Security Reference Manual (SRM) for more info. 278*91f16700Schasinglulu */ 279*91f16700Schasinglulu sc_err_t sc_misc_seco_enable_debug(sc_ipc_t ipc, sc_faddr_t addr); 280*91f16700Schasinglulu 281*91f16700Schasinglulu /*! 282*91f16700Schasinglulu * This function updates the lifecycle of the device. 283*91f16700Schasinglulu * 284*91f16700Schasinglulu * @param[in] ipc IPC handle 285*91f16700Schasinglulu * @param[in] lifecycle new lifecycle 286*91f16700Schasinglulu * 287*91f16700Schasinglulu * @return Returns and error code (SC_ERR_NONE = success). 288*91f16700Schasinglulu * 289*91f16700Schasinglulu * Return errors codes: 290*91f16700Schasinglulu * - SC_ERR_UNAVAILABLE if SECO not available 291*91f16700Schasinglulu * 292*91f16700Schasinglulu * This message is used for going from Open to NXP Closed to OEM Closed. 293*91f16700Schasinglulu * 294*91f16700Schasinglulu * See the Security Reference Manual (SRM) for more info. 295*91f16700Schasinglulu */ 296*91f16700Schasinglulu sc_err_t sc_misc_seco_forward_lifecycle(sc_ipc_t ipc, uint32_t lifecycle); 297*91f16700Schasinglulu 298*91f16700Schasinglulu /*! 299*91f16700Schasinglulu * This function updates the lifecycle to one of the return lifecycles. 300*91f16700Schasinglulu * 301*91f16700Schasinglulu * @param[in] ipc IPC handle 302*91f16700Schasinglulu * @param[in] addr address of message block 303*91f16700Schasinglulu * 304*91f16700Schasinglulu * @return Returns and error code (SC_ERR_NONE = success). 305*91f16700Schasinglulu * 306*91f16700Schasinglulu * Return errors codes: 307*91f16700Schasinglulu * - SC_ERR_UNAVAILABLE if SECO not available 308*91f16700Schasinglulu * 309*91f16700Schasinglulu * Note \a addr must be a pointer to a signed message block. 310*91f16700Schasinglulu * 311*91f16700Schasinglulu * To switch back to NXP states (Full Field Return), message must be signed 312*91f16700Schasinglulu * by NXP SRK. For OEM States (Partial Field Return), must be signed by OEM 313*91f16700Schasinglulu * SRK. 314*91f16700Schasinglulu * 315*91f16700Schasinglulu * See the Security Reference Manual (SRM) for more info. 316*91f16700Schasinglulu */ 317*91f16700Schasinglulu sc_err_t sc_misc_seco_return_lifecycle(sc_ipc_t ipc, sc_faddr_t addr); 318*91f16700Schasinglulu 319*91f16700Schasinglulu /*! 320*91f16700Schasinglulu * This function is used to return the SECO FW build info. 321*91f16700Schasinglulu * 322*91f16700Schasinglulu * @param[in] ipc IPC handle 323*91f16700Schasinglulu * @param[out] version pointer to return build number 324*91f16700Schasinglulu * @param[out] commit pointer to return commit ID (git SHA-1) 325*91f16700Schasinglulu */ 326*91f16700Schasinglulu void sc_misc_seco_build_info(sc_ipc_t ipc, uint32_t *version, uint32_t *commit); 327*91f16700Schasinglulu 328*91f16700Schasinglulu /*! 329*91f16700Schasinglulu * This function is used to return SECO chip info. 330*91f16700Schasinglulu * 331*91f16700Schasinglulu * @param[in] ipc IPC handle 332*91f16700Schasinglulu * @param[out] lc pointer to return lifecycle 333*91f16700Schasinglulu * @param[out] monotonic pointer to return monotonic counter 334*91f16700Schasinglulu * @param[out] uid_l pointer to return UID (lower 32 bits) 335*91f16700Schasinglulu * @param[out] uid_h pointer to return UID (upper 32 bits) 336*91f16700Schasinglulu */ 337*91f16700Schasinglulu sc_err_t sc_misc_seco_chip_info(sc_ipc_t ipc, uint16_t *lc, 338*91f16700Schasinglulu uint16_t *monotonic, uint32_t *uid_l, 339*91f16700Schasinglulu uint32_t *uid_h); 340*91f16700Schasinglulu 341*91f16700Schasinglulu /* @} */ 342*91f16700Schasinglulu 343*91f16700Schasinglulu /*! 344*91f16700Schasinglulu * @name Debug Functions 345*91f16700Schasinglulu * @{ 346*91f16700Schasinglulu */ 347*91f16700Schasinglulu 348*91f16700Schasinglulu /*! 349*91f16700Schasinglulu * This function is used output a debug character from the SCU UART. 350*91f16700Schasinglulu * 351*91f16700Schasinglulu * @param[in] ipc IPC handle 352*91f16700Schasinglulu * @param[in] ch character to output 353*91f16700Schasinglulu */ 354*91f16700Schasinglulu void sc_misc_debug_out(sc_ipc_t ipc, uint8_t ch); 355*91f16700Schasinglulu 356*91f16700Schasinglulu /*! 357*91f16700Schasinglulu * This function starts/stops emulation waveform capture. 358*91f16700Schasinglulu * 359*91f16700Schasinglulu * @param[in] ipc IPC handle 360*91f16700Schasinglulu * @param[in] enable flag to enable/disable capture 361*91f16700Schasinglulu * 362*91f16700Schasinglulu * @return Returns an error code (SC_ERR_NONE = success). 363*91f16700Schasinglulu * 364*91f16700Schasinglulu * Return errors: 365*91f16700Schasinglulu * - SC_ERR_UNAVAILABLE if not running on emulation 366*91f16700Schasinglulu */ 367*91f16700Schasinglulu sc_err_t sc_misc_waveform_capture(sc_ipc_t ipc, sc_bool_t enable); 368*91f16700Schasinglulu 369*91f16700Schasinglulu /*! 370*91f16700Schasinglulu * This function is used to return the SCFW build info. 371*91f16700Schasinglulu * 372*91f16700Schasinglulu * @param[in] ipc IPC handle 373*91f16700Schasinglulu * @param[out] build pointer to return build number 374*91f16700Schasinglulu * @param[out] commit pointer to return commit ID (git SHA-1) 375*91f16700Schasinglulu */ 376*91f16700Schasinglulu void sc_misc_build_info(sc_ipc_t ipc, uint32_t *build, uint32_t *commit); 377*91f16700Schasinglulu 378*91f16700Schasinglulu /*! 379*91f16700Schasinglulu * This function is used to return the device's unique ID. 380*91f16700Schasinglulu * 381*91f16700Schasinglulu * @param[in] ipc IPC handle 382*91f16700Schasinglulu * @param[out] id_l pointer to return lower 32-bit of ID [31:0] 383*91f16700Schasinglulu * @param[out] id_h pointer to return upper 32-bits of ID [63:32] 384*91f16700Schasinglulu */ 385*91f16700Schasinglulu void sc_misc_unique_id(sc_ipc_t ipc, uint32_t *id_l, uint32_t *id_h); 386*91f16700Schasinglulu 387*91f16700Schasinglulu /* @} */ 388*91f16700Schasinglulu 389*91f16700Schasinglulu /*! 390*91f16700Schasinglulu * @name Other Functions 391*91f16700Schasinglulu * @{ 392*91f16700Schasinglulu */ 393*91f16700Schasinglulu 394*91f16700Schasinglulu /*! 395*91f16700Schasinglulu * This function configures the ARI match value for PCIe/SATA resources. 396*91f16700Schasinglulu * 397*91f16700Schasinglulu * @param[in] ipc IPC handle 398*91f16700Schasinglulu * @param[in] resource match resource 399*91f16700Schasinglulu * @param[in] resource_mst PCIe/SATA master to match 400*91f16700Schasinglulu * @param[in] ari ARI to match 401*91f16700Schasinglulu * @param[in] enable enable match or not 402*91f16700Schasinglulu * 403*91f16700Schasinglulu * @return Returns an error code (SC_ERR_NONE = success). 404*91f16700Schasinglulu * 405*91f16700Schasinglulu * Return errors: 406*91f16700Schasinglulu * - SC_PARM if arguments out of range or invalid, 407*91f16700Schasinglulu * - SC_ERR_NOACCESS if caller's partition is not the owner or parent 408*91f16700Schasinglulu * of the owner of the resource and translation 409*91f16700Schasinglulu * 410*91f16700Schasinglulu * For PCIe, the ARI is the 16-bit value that includes the bus number, 411*91f16700Schasinglulu * device number, and function number. For SATA, this value includes the 412*91f16700Schasinglulu * FISType and PM_Port. 413*91f16700Schasinglulu */ 414*91f16700Schasinglulu sc_err_t sc_misc_set_ari(sc_ipc_t ipc, sc_rsrc_t resource, 415*91f16700Schasinglulu sc_rsrc_t resource_mst, uint16_t ari, 416*91f16700Schasinglulu sc_bool_t enable); 417*91f16700Schasinglulu 418*91f16700Schasinglulu /*! 419*91f16700Schasinglulu * This function reports boot status. 420*91f16700Schasinglulu * 421*91f16700Schasinglulu * @param[in] ipc IPC handle 422*91f16700Schasinglulu * @param[in] status boot status 423*91f16700Schasinglulu * 424*91f16700Schasinglulu * This is used by SW partitions to report status of boot. This is 425*91f16700Schasinglulu * normally used to report a boot failure. 426*91f16700Schasinglulu */ 427*91f16700Schasinglulu void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status); 428*91f16700Schasinglulu 429*91f16700Schasinglulu /*! 430*91f16700Schasinglulu * This function tells the SCFW that a CPU is done booting. 431*91f16700Schasinglulu * 432*91f16700Schasinglulu * @param[in] ipc IPC handle 433*91f16700Schasinglulu * @param[in] cpu CPU that is done booting 434*91f16700Schasinglulu * 435*91f16700Schasinglulu * This is called by early booting CPUs to report they are done with 436*91f16700Schasinglulu * initialization. After starting early CPUs, the SCFW halts the 437*91f16700Schasinglulu * booting process until they are done. During this time, early 438*91f16700Schasinglulu * CPUs can call the SCFW with lower latency as the SCFW is idle. 439*91f16700Schasinglulu * 440*91f16700Schasinglulu * @return Returns an error code (SC_ERR_NONE = success). 441*91f16700Schasinglulu * 442*91f16700Schasinglulu * Return errors: 443*91f16700Schasinglulu * - SC_PARM if arguments out of range or invalid, 444*91f16700Schasinglulu * - SC_ERR_NOACCESS if caller's partition is not the CPU owner 445*91f16700Schasinglulu */ 446*91f16700Schasinglulu sc_err_t sc_misc_boot_done(sc_ipc_t ipc, sc_rsrc_t cpu); 447*91f16700Schasinglulu 448*91f16700Schasinglulu /*! 449*91f16700Schasinglulu * This function reads a given fuse word index. 450*91f16700Schasinglulu * 451*91f16700Schasinglulu * @param[in] ipc IPC handle 452*91f16700Schasinglulu * @param[in] word fuse word index 453*91f16700Schasinglulu * @param[out] val fuse read value 454*91f16700Schasinglulu * 455*91f16700Schasinglulu * @return Returns and error code (SC_ERR_NONE = success). 456*91f16700Schasinglulu * 457*91f16700Schasinglulu * Return errors codes: 458*91f16700Schasinglulu * - SC_ERR_PARM if word fuse index param out of range or invalid 459*91f16700Schasinglulu * - SC_ERR_NOACCESS if read operation failed 460*91f16700Schasinglulu * - SC_ERR_LOCKED if read operation is locked 461*91f16700Schasinglulu */ 462*91f16700Schasinglulu sc_err_t sc_misc_otp_fuse_read(sc_ipc_t ipc, uint32_t word, uint32_t *val); 463*91f16700Schasinglulu 464*91f16700Schasinglulu /*! 465*91f16700Schasinglulu * This function writes a given fuse word index. 466*91f16700Schasinglulu * 467*91f16700Schasinglulu * @param[in] ipc IPC handle 468*91f16700Schasinglulu * @param[in] word fuse word index 469*91f16700Schasinglulu * @param[in] val fuse write value 470*91f16700Schasinglulu * 471*91f16700Schasinglulu * @return Returns and error code (SC_ERR_NONE = success). 472*91f16700Schasinglulu * 473*91f16700Schasinglulu * Return errors codes: 474*91f16700Schasinglulu * - SC_ERR_PARM if word fuse index param out of range or invalid 475*91f16700Schasinglulu * - SC_ERR_NOACCESS if write operation failed 476*91f16700Schasinglulu * - SC_ERR_LOCKED if write operation is locked 477*91f16700Schasinglulu */ 478*91f16700Schasinglulu sc_err_t sc_misc_otp_fuse_write(sc_ipc_t ipc, uint32_t word, uint32_t val); 479*91f16700Schasinglulu 480*91f16700Schasinglulu /*! 481*91f16700Schasinglulu * This function sets a temp sensor alarm. 482*91f16700Schasinglulu * 483*91f16700Schasinglulu * @param[in] ipc IPC handle 484*91f16700Schasinglulu * @param[in] resource resource with sensor 485*91f16700Schasinglulu * @param[in] temp alarm to set 486*91f16700Schasinglulu * @param[in] celsius whole part of temp to set 487*91f16700Schasinglulu * @param[in] tenths fractional part of temp to set 488*91f16700Schasinglulu * 489*91f16700Schasinglulu * @return Returns and error code (SC_ERR_NONE = success). 490*91f16700Schasinglulu * 491*91f16700Schasinglulu * This function will enable the alarm interrupt if the temp requested is 492*91f16700Schasinglulu * not the min/max temp. This enable automatically clears when the alarm 493*91f16700Schasinglulu * occurs and this function has to be called again to re-enable. 494*91f16700Schasinglulu * 495*91f16700Schasinglulu * Return errors codes: 496*91f16700Schasinglulu * - SC_ERR_PARM if parameters invalid 497*91f16700Schasinglulu */ 498*91f16700Schasinglulu sc_err_t sc_misc_set_temp(sc_ipc_t ipc, sc_rsrc_t resource, 499*91f16700Schasinglulu sc_misc_temp_t temp, int16_t celsius, int8_t tenths); 500*91f16700Schasinglulu 501*91f16700Schasinglulu /*! 502*91f16700Schasinglulu * This function gets a temp sensor value. 503*91f16700Schasinglulu * 504*91f16700Schasinglulu * @param[in] ipc IPC handle 505*91f16700Schasinglulu * @param[in] resource resource with sensor 506*91f16700Schasinglulu * @param[in] temp value to get (sensor or alarm) 507*91f16700Schasinglulu * @param[out] celsius whole part of temp to get 508*91f16700Schasinglulu * @param[out] tenths fractional part of temp to get 509*91f16700Schasinglulu * 510*91f16700Schasinglulu * @return Returns and error code (SC_ERR_NONE = success). 511*91f16700Schasinglulu * 512*91f16700Schasinglulu * Return errors codes: 513*91f16700Schasinglulu * - SC_ERR_PARM if parameters invalid 514*91f16700Schasinglulu */ 515*91f16700Schasinglulu sc_err_t sc_misc_get_temp(sc_ipc_t ipc, sc_rsrc_t resource, 516*91f16700Schasinglulu sc_misc_temp_t temp, int16_t *celsius, 517*91f16700Schasinglulu int8_t *tenths); 518*91f16700Schasinglulu 519*91f16700Schasinglulu /*! 520*91f16700Schasinglulu * This function returns the boot device. 521*91f16700Schasinglulu * 522*91f16700Schasinglulu * @param[in] ipc IPC handle 523*91f16700Schasinglulu * @param[out] dev pointer to return boot device 524*91f16700Schasinglulu */ 525*91f16700Schasinglulu void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *dev); 526*91f16700Schasinglulu 527*91f16700Schasinglulu /*! 528*91f16700Schasinglulu * This function returns the current status of the ON/OFF button. 529*91f16700Schasinglulu * 530*91f16700Schasinglulu * @param[in] ipc IPC handle 531*91f16700Schasinglulu * @param[out] status pointer to return button status 532*91f16700Schasinglulu */ 533*91f16700Schasinglulu void sc_misc_get_button_status(sc_ipc_t ipc, sc_bool_t *status); 534*91f16700Schasinglulu 535*91f16700Schasinglulu /* @} */ 536*91f16700Schasinglulu 537*91f16700Schasinglulu #endif /* SC_MISC_API_H */ 538*91f16700Schasinglulu 539*91f16700Schasinglulu /**@}*/ 540