Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
72106f82
Unverified
Commit
72106f82
authored
6 years ago
by
Antonio Niño Díaz
Committed by
GitHub
6 years ago
Browse files
Options
Download
Plain Diff
Merge pull request #1766 from Anson-Huang/master
Add more SIP runtime service for i.MX8
parents
6eee5864
760f7941
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
plat/imx/common/imx_sip_handler.c
+105
-0
plat/imx/common/imx_sip_handler.c
plat/imx/common/imx_sip_svc.c
+9
-0
plat/imx/common/imx_sip_svc.c
plat/imx/common/include/imx_sip_svc.h
+22
-0
plat/imx/common/include/imx_sip_svc.h
plat/imx/common/include/plat_imx8.h
+1
-0
plat/imx/common/include/plat_imx8.h
plat/imx/common/include/sci/sci.h
+1
-0
plat/imx/common/include/sci/sci.h
plat/imx/common/include/sci/svc/misc/sci_misc_api.h
+539
-0
plat/imx/common/include/sci/svc/misc/sci_misc_api.h
plat/imx/common/sci/sci_api.mk
+2
-1
plat/imx/common/sci/sci_api.mk
plat/imx/common/sci/svc/misc/misc_rpc_clnt.c
+506
-0
plat/imx/common/sci/svc/misc/misc_rpc_clnt.c
plat/imx/common/sci/svc/misc/sci_misc_rpc.h
+76
-0
plat/imx/common/sci/svc/misc/sci_misc_rpc.h
with
1261 additions
and
1 deletion
+1261
-1
plat/imx/common/imx_sip_handler.c
View file @
72106f82
...
...
@@ -7,6 +7,7 @@
#include <stdlib.h>
#include <stdint.h>
#include <std_svc.h>
#include <string.h>
#include <platform_def.h>
#include <common/debug.h>
#include <common/runtime_svc.h>
...
...
@@ -76,3 +77,107 @@ int imx_cpufreq_handler(uint32_t smc_fid,
return
0
;
}
static
bool
wakeup_src_irqsteer
;
bool
imx_is_wakeup_src_irqsteer
(
void
)
{
return
wakeup_src_irqsteer
;
}
int
imx_wakeup_src_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
)
{
switch
(
x1
)
{
case
IMX_SIP_WAKEUP_SRC_IRQSTEER
:
wakeup_src_irqsteer
=
true
;
break
;
case
IMX_SIP_WAKEUP_SRC_SCU
:
wakeup_src_irqsteer
=
false
;
break
;
default:
return
SMC_UNK
;
}
return
SMC_OK
;
}
int
imx_otp_handler
(
uint32_t
smc_fid
,
void
*
handle
,
u_register_t
x1
,
u_register_t
x2
)
{
int
ret
;
uint32_t
fuse
;
switch
(
smc_fid
)
{
case
IMX_SIP_OTP_READ
:
ret
=
sc_misc_otp_fuse_read
(
ipc_handle
,
x1
,
&
fuse
);
SMC_RET2
(
handle
,
ret
,
fuse
);
break
;
case
IMX_SIP_OTP_WRITE
:
ret
=
sc_misc_otp_fuse_write
(
ipc_handle
,
x1
,
x2
);
SMC_RET1
(
handle
,
ret
);
break
;
default:
ret
=
SMC_UNK
;
SMC_RET1
(
handle
,
ret
);
break
;
}
return
ret
;
}
int
imx_misc_set_temp_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
)
{
return
sc_misc_set_temp
(
ipc_handle
,
x1
,
x2
,
x3
,
x4
);
}
static
uint64_t
imx_get_commit_hash
(
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
)
{
/* Parse the version_string */
char
*
parse
=
(
char
*
)
version_string
;
uint64_t
hash
=
0
;
do
{
parse
=
strchr
(
parse
,
'-'
);
if
(
parse
)
{
parse
+=
1
;
if
(
*
(
parse
)
==
'g'
)
{
/* Default is 7 hexadecimal digits */
memcpy
((
void
*
)
&
hash
,
(
void
*
)(
parse
+
1
),
7
);
break
;
}
}
}
while
(
parse
!=
NULL
);
return
hash
;
}
uint64_t
imx_buildinfo_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
)
{
uint64_t
ret
;
switch
(
x1
)
{
case
IMX_SIP_BUILDINFO_GET_COMMITHASH
:
ret
=
imx_get_commit_hash
(
x2
,
x3
,
x4
);
break
;
default:
return
SMC_UNK
;
}
return
ret
;
}
This diff is collapsed.
Click to expand it.
plat/imx/common/imx_sip_svc.c
View file @
72106f82
...
...
@@ -32,7 +32,16 @@ static uintptr_t imx_sip_handler(unsigned int smc_fid,
case
IMX_SIP_CPUFREQ
:
SMC_RET1
(
handle
,
imx_cpufreq_handler
(
smc_fid
,
x1
,
x2
,
x3
));
break
;
case
IMX_SIP_WAKEUP_SRC
:
SMC_RET1
(
handle
,
imx_wakeup_src_handler
(
smc_fid
,
x1
,
x2
,
x3
));
case
IMX_SIP_OTP_READ
:
case
IMX_SIP_OTP_WRITE
:
return
imx_otp_handler
(
smc_fid
,
handle
,
x1
,
x2
);
case
IMX_SIP_MISC_SET_TEMP
:
SMC_RET1
(
handle
,
imx_misc_set_temp_handler
(
smc_fid
,
x1
,
x2
,
x3
,
x4
));
#endif
case
IMX_SIP_BUILDINFO
:
SMC_RET1
(
handle
,
imx_buildinfo_handler
(
smc_fid
,
x1
,
x2
,
x3
,
x4
));
default:
WARN
(
"Unimplemented i.MX SiP Service Call: 0x%x
\n
"
,
smc_fid
);
SMC_RET1
(
handle
,
SMC_UNK
);
...
...
This diff is collapsed.
Click to expand it.
plat/imx/common/include/imx_sip_svc.h
View file @
72106f82
...
...
@@ -14,11 +14,33 @@
#define IMX_SIP_SRTC 0xC2000002
#define IMX_SIP_SRTC_SET_TIME 0x00
#define IMX_SIP_BUILDINFO 0xC2000003
#define IMX_SIP_BUILDINFO_GET_COMMITHASH 0x00
#define IMX_SIP_WAKEUP_SRC 0xC2000009
#define IMX_SIP_WAKEUP_SRC_SCU 0x1
#define IMX_SIP_WAKEUP_SRC_IRQSTEER 0x2
#define IMX_SIP_OTP_READ 0xC200000A
#define IMX_SIP_OTP_WRITE 0xC200000B
#define IMX_SIP_MISC_SET_TEMP 0xC200000C
#if (defined(PLAT_IMX8QM) || defined(PLAT_IMX8QX))
int
imx_cpufreq_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
);
int
imx_srtc_handler
(
uint32_t
smc_fid
,
void
*
handle
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
);
int
imx_wakeup_src_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
);
int
imx_otp_handler
(
uint32_t
smc_fid
,
void
*
handle
,
u_register_t
x1
,
u_register_t
x2
);
int
imx_misc_set_temp_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
);
uint64_t
imx_buildinfo_handler
(
uint32_t
smc_fid
,
u_register_t
x1
,
u_register_t
x2
,
u_register_t
x3
,
u_register_t
x4
);
#endif
#endif
/* __IMX_SIP_SVC_H__ */
This diff is collapsed.
Click to expand it.
plat/imx/common/include/plat_imx8.h
View file @
72106f82
...
...
@@ -23,5 +23,6 @@ void __dead2 imx_system_reset(void);
int
imx_validate_power_state
(
unsigned
int
power_state
,
psci_power_state_t
*
req_state
);
void
imx_get_sys_suspend_power_state
(
psci_power_state_t
*
req_state
);
bool
imx_is_wakeup_src_irqsteer
(
void
);
#endif
/* PLAT_IMX8_H */
This diff is collapsed.
Click to expand it.
plat/imx/common/include/sci/sci.h
View file @
72106f82
...
...
@@ -16,5 +16,6 @@
#include <sci/svc/pm/sci_pm_api.h>
#include <sci/svc/rm/sci_rm_api.h>
#include <sci/svc/timer/sci_timer_api.h>
#include <sci/svc/misc/sci_misc_api.h>
#endif
/* SCI_H */
This diff is collapsed.
Click to expand it.
plat/imx/common/include/sci/svc/misc/sci_misc_api.h
0 → 100644
View file @
72106f82
/*
* Copyright (C) 2016 Freescale Semiconductor, Inc.
* Copyright 2017-2019 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*!
* Header file containing the public API for the System Controller (SC)
* Miscellaneous (MISC) function.
*
* @addtogroup MISC_SVC (SVC) Miscellaneous Service
*
* Module for the Miscellaneous (MISC) service.
*
* @{
*/
#ifndef SC_MISC_API_H
#define SC_MISC_API_H
/* Includes */
#include <sci/svc/rm/sci_rm_api.h>
#include <sci/sci_types.h>
/* Defines */
/*!
* @name Defines for type widths
*/
/*@{*/
#define SC_MISC_DMA_GRP_W 5U
/* Width of sc_misc_dma_group_t */
/*@}*/
/*! Max DMA channel priority group */
#define SC_MISC_DMA_GRP_MAX 31U
/*!
* @name Defines for sc_misc_boot_status_t
*/
/*@{*/
#define SC_MISC_BOOT_STATUS_SUCCESS 0U
/* Success */
#define SC_MISC_BOOT_STATUS_SECURITY 1U
/* Security violation */
/*@}*/
/*!
* @name Defines for sc_misc_seco_auth_cmd_t
*/
/*@{*/
#define SC_MISC_SECO_AUTH_SECO_FW 0U
/* SECO Firmware */
#define SC_MISC_SECO_AUTH_HDMI_TX_FW 1U
/* HDMI TX Firmware */
#define SC_MISC_SECO_AUTH_HDMI_RX_FW 2U
/* HDMI RX Firmware */
/*@}*/
/*!
* @name Defines for sc_misc_temp_t
*/
/*@{*/
#define SC_MISC_TEMP 0U
/* Temp sensor */
#define SC_MISC_TEMP_HIGH 1U
/* Temp high alarm */
#define SC_MISC_TEMP_LOW 2U
/* Temp low alarm */
/*@}*/
/*!
* @name Defines for sc_misc_seco_auth_cmd_t
*/
/*@{*/
#define SC_MISC_AUTH_CONTAINER 0U
/* Authenticate container */
#define SC_MISC_VERIFY_IMAGE 1U
/* Verify image */
#define SC_MISC_REL_CONTAINER 2U
/* Release container */
/*@}*/
/* Types */
/*!
* This type is used to store a DMA channel priority group.
*/
typedef
uint8_t
sc_misc_dma_group_t
;
/*!
* This type is used report boot status.
*/
typedef
uint8_t
sc_misc_boot_status_t
;
/*!
* This type is used to issue SECO authenticate commands.
*/
typedef
uint8_t
sc_misc_seco_auth_cmd_t
;
/*!
* This type is used report boot status.
*/
typedef
uint8_t
sc_misc_temp_t
;
/* Functions */
/*!
* @name Control Functions
* @{
*/
/*!
* This function sets a miscellaneous control value.
*
* @param[in] ipc IPC handle
* @param[in] resource resource the control is associated with
* @param[in] ctrl control to change
* @param[in] val value to apply to the control
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_PARM if arguments out of range or invalid,
* - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent
* of the owner
*
* Refer to the [Control List](@ref CONTROLS) for valid control values.
*/
sc_err_t
sc_misc_set_control
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_ctrl_t
ctrl
,
uint32_t
val
);
/*!
* This function gets a miscellaneous control value.
*
* @param[in] ipc IPC handle
* @param[in] resource resource the control is associated with
* @param[in] ctrl control to get
* @param[out] val pointer to return the control value
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_PARM if arguments out of range or invalid,
* - SC_ERR_NOACCESS if caller's partition is not the resource owner or parent
* of the owner
*
* Refer to the [Control List](@ref CONTROLS) for valid control values.
*/
sc_err_t
sc_misc_get_control
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_ctrl_t
ctrl
,
uint32_t
*
val
);
/* @} */
/*!
* @name DMA Functions
* @{
*/
/*!
* This function configures the max DMA channel priority group for a
* partition.
*
* @param[in] ipc IPC handle
* @param[in] pt handle of partition to assign \a max
* @param[in] max max priority group (0-31)
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_PARM if arguments out of range or invalid,
* - SC_ERR_NOACCESS if caller's partition is not the parent
* of the affected partition
*
* Valid \a max range is 0-31 with 0 being the lowest and 31 the highest.
* Default is the max priority group for the parent partition of \a pt.
*/
sc_err_t
sc_misc_set_max_dma_group
(
sc_ipc_t
ipc
,
sc_rm_pt_t
pt
,
sc_misc_dma_group_t
max
);
/*!
* This function configures the priority group for a DMA channel.
*
* @param[in] ipc IPC handle
* @param[in] resource DMA channel resource
* @param[in] group priority group (0-31)
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_PARM if arguments out of range or invalid,
* - SC_ERR_NOACCESS if caller's partition is not the owner or parent
* of the owner of the DMA channel
*
* Valid \a group range is 0-31 with 0 being the lowest and 31 the highest.
* The max value of \a group is limited by the partition max set using
* sc_misc_set_max_dma_group().
*/
sc_err_t
sc_misc_set_dma_group
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_misc_dma_group_t
group
);
/* @} */
/*!
* @name Security Functions
* @{
*/
/*!
* This function loads a SECO image.
*
* @param[in] ipc IPC handle
* @param[in] addr_src address of image source
* @param[in] addr_dst address of image destination
* @param[in] len length of image to load
* @param[in] fw SC_TRUE = firmware load
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors codes:
* - SC_ERR_PARM if word fuse index param out of range or invalid
* - SC_ERR_UNAVAILABLE if SECO not available
*
* This is used to load images via the SECO. Examples include SECO
* Firmware and IVT/CSF data used for authentication. These are usually
* loaded into SECO TCM. \a addr_src is in secure memory.
*
* See the Security Reference Manual (SRM) for more info.
*/
sc_err_t
sc_misc_seco_image_load
(
sc_ipc_t
ipc
,
sc_faddr_t
addr_src
,
sc_faddr_t
addr_dst
,
uint32_t
len
,
sc_bool_t
fw
);
/*!
* This function is used to authenticate a SECO image or command.
*
* @param[in] ipc IPC handle
* @param[in] cmd authenticate command
* @param[in] addr address of/or metadata
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors codes:
* - SC_ERR_PARM if word fuse index param out of range or invalid
* - SC_ERR_UNAVAILABLE if SECO not available
*
* This is used to authenticate a SECO image or issue a security
* command. \a addr often points to an container. It is also
* just data (or even unused) for some commands.
*
* See the Security Reference Manual (SRM) for more info.
*/
sc_err_t
sc_misc_seco_authenticate
(
sc_ipc_t
ipc
,
sc_misc_seco_auth_cmd_t
cmd
,
sc_faddr_t
addr
);
/*!
* This function securely writes a group of fuse words.
*
* @param[in] ipc IPC handle
* @param[in] addr address of message block
*
* @return Returns and error code (SC_ERR_NONE = success).
*
* Return errors codes:
* - SC_ERR_UNAVAILABLE if SECO not available
*
* Note \a addr must be a pointer to a signed message block.
*
* See the Security Reference Manual (SRM) for more info.
*/
sc_err_t
sc_misc_seco_fuse_write
(
sc_ipc_t
ipc
,
sc_faddr_t
addr
);
/*!
* This function securely enables debug.
*
* @param[in] ipc IPC handle
* @param[in] addr address of message block
*
* @return Returns and error code (SC_ERR_NONE = success).
*
* Return errors codes:
* - SC_ERR_UNAVAILABLE if SECO not available
*
* Note \a addr must be a pointer to a signed message block.
*
* See the Security Reference Manual (SRM) for more info.
*/
sc_err_t
sc_misc_seco_enable_debug
(
sc_ipc_t
ipc
,
sc_faddr_t
addr
);
/*!
* This function updates the lifecycle of the device.
*
* @param[in] ipc IPC handle
* @param[in] lifecycle new lifecycle
*
* @return Returns and error code (SC_ERR_NONE = success).
*
* Return errors codes:
* - SC_ERR_UNAVAILABLE if SECO not available
*
* This message is used for going from Open to NXP Closed to OEM Closed.
*
* See the Security Reference Manual (SRM) for more info.
*/
sc_err_t
sc_misc_seco_forward_lifecycle
(
sc_ipc_t
ipc
,
uint32_t
lifecycle
);
/*!
* This function updates the lifecycle to one of the return lifecycles.
*
* @param[in] ipc IPC handle
* @param[in] addr address of message block
*
* @return Returns and error code (SC_ERR_NONE = success).
*
* Return errors codes:
* - SC_ERR_UNAVAILABLE if SECO not available
*
* Note \a addr must be a pointer to a signed message block.
*
* To switch back to NXP states (Full Field Return), message must be signed
* by NXP SRK. For OEM States (Partial Field Return), must be signed by OEM
* SRK.
*
* See the Security Reference Manual (SRM) for more info.
*/
sc_err_t
sc_misc_seco_return_lifecycle
(
sc_ipc_t
ipc
,
sc_faddr_t
addr
);
/*!
* This function is used to return the SECO FW build info.
*
* @param[in] ipc IPC handle
* @param[out] version pointer to return build number
* @param[out] commit pointer to return commit ID (git SHA-1)
*/
void
sc_misc_seco_build_info
(
sc_ipc_t
ipc
,
uint32_t
*
version
,
uint32_t
*
commit
);
/*!
* This function is used to return SECO chip info.
*
* @param[in] ipc IPC handle
* @param[out] lc pointer to return lifecycle
* @param[out] monotonic pointer to return monotonic counter
* @param[out] uid_l pointer to return UID (lower 32 bits)
* @param[out] uid_h pointer to return UID (upper 32 bits)
*/
sc_err_t
sc_misc_seco_chip_info
(
sc_ipc_t
ipc
,
uint16_t
*
lc
,
uint16_t
*
monotonic
,
uint32_t
*
uid_l
,
uint32_t
*
uid_h
);
/* @} */
/*!
* @name Debug Functions
* @{
*/
/*!
* This function is used output a debug character from the SCU UART.
*
* @param[in] ipc IPC handle
* @param[in] ch character to output
*/
void
sc_misc_debug_out
(
sc_ipc_t
ipc
,
uint8_t
ch
);
/*!
* This function starts/stops emulation waveform capture.
*
* @param[in] ipc IPC handle
* @param[in] enable flag to enable/disable capture
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_ERR_UNAVAILABLE if not running on emulation
*/
sc_err_t
sc_misc_waveform_capture
(
sc_ipc_t
ipc
,
sc_bool_t
enable
);
/*!
* This function is used to return the SCFW build info.
*
* @param[in] ipc IPC handle
* @param[out] build pointer to return build number
* @param[out] commit pointer to return commit ID (git SHA-1)
*/
void
sc_misc_build_info
(
sc_ipc_t
ipc
,
uint32_t
*
build
,
uint32_t
*
commit
);
/*!
* This function is used to return the device's unique ID.
*
* @param[in] ipc IPC handle
* @param[out] id_l pointer to return lower 32-bit of ID [31:0]
* @param[out] id_h pointer to return upper 32-bits of ID [63:32]
*/
void
sc_misc_unique_id
(
sc_ipc_t
ipc
,
uint32_t
*
id_l
,
uint32_t
*
id_h
);
/* @} */
/*!
* @name Other Functions
* @{
*/
/*!
* This function configures the ARI match value for PCIe/SATA resources.
*
* @param[in] ipc IPC handle
* @param[in] resource match resource
* @param[in] resource_mst PCIe/SATA master to match
* @param[in] ari ARI to match
* @param[in] enable enable match or not
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_PARM if arguments out of range or invalid,
* - SC_ERR_NOACCESS if caller's partition is not the owner or parent
* of the owner of the resource and translation
*
* For PCIe, the ARI is the 16-bit value that includes the bus number,
* device number, and function number. For SATA, this value includes the
* FISType and PM_Port.
*/
sc_err_t
sc_misc_set_ari
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_rsrc_t
resource_mst
,
uint16_t
ari
,
sc_bool_t
enable
);
/*!
* This function reports boot status.
*
* @param[in] ipc IPC handle
* @param[in] status boot status
*
* This is used by SW partitions to report status of boot. This is
* normally used to report a boot failure.
*/
void
sc_misc_boot_status
(
sc_ipc_t
ipc
,
sc_misc_boot_status_t
status
);
/*!
* This function tells the SCFW that a CPU is done booting.
*
* @param[in] ipc IPC handle
* @param[in] cpu CPU that is done booting
*
* This is called by early booting CPUs to report they are done with
* initialization. After starting early CPUs, the SCFW halts the
* booting process until they are done. During this time, early
* CPUs can call the SCFW with lower latency as the SCFW is idle.
*
* @return Returns an error code (SC_ERR_NONE = success).
*
* Return errors:
* - SC_PARM if arguments out of range or invalid,
* - SC_ERR_NOACCESS if caller's partition is not the CPU owner
*/
sc_err_t
sc_misc_boot_done
(
sc_ipc_t
ipc
,
sc_rsrc_t
cpu
);
/*!
* This function reads a given fuse word index.
*
* @param[in] ipc IPC handle
* @param[in] word fuse word index
* @param[out] val fuse read value
*
* @return Returns and error code (SC_ERR_NONE = success).
*
* Return errors codes:
* - SC_ERR_PARM if word fuse index param out of range or invalid
* - SC_ERR_NOACCESS if read operation failed
* - SC_ERR_LOCKED if read operation is locked
*/
sc_err_t
sc_misc_otp_fuse_read
(
sc_ipc_t
ipc
,
uint32_t
word
,
uint32_t
*
val
);
/*!
* This function writes a given fuse word index.
*
* @param[in] ipc IPC handle
* @param[in] word fuse word index
* @param[in] val fuse write value
*
* @return Returns and error code (SC_ERR_NONE = success).
*
* Return errors codes:
* - SC_ERR_PARM if word fuse index param out of range or invalid
* - SC_ERR_NOACCESS if write operation failed
* - SC_ERR_LOCKED if write operation is locked
*/
sc_err_t
sc_misc_otp_fuse_write
(
sc_ipc_t
ipc
,
uint32_t
word
,
uint32_t
val
);
/*!
* This function sets a temp sensor alarm.
*
* @param[in] ipc IPC handle
* @param[in] resource resource with sensor
* @param[in] temp alarm to set
* @param[in] celsius whole part of temp to set
* @param[in] tenths fractional part of temp to set
*
* @return Returns and error code (SC_ERR_NONE = success).
*
* This function will enable the alarm interrupt if the temp requested is
* not the min/max temp. This enable automatically clears when the alarm
* occurs and this function has to be called again to re-enable.
*
* Return errors codes:
* - SC_ERR_PARM if parameters invalid
*/
sc_err_t
sc_misc_set_temp
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_misc_temp_t
temp
,
int16_t
celsius
,
int8_t
tenths
);
/*!
* This function gets a temp sensor value.
*
* @param[in] ipc IPC handle
* @param[in] resource resource with sensor
* @param[in] temp value to get (sensor or alarm)
* @param[out] celsius whole part of temp to get
* @param[out] tenths fractional part of temp to get
*
* @return Returns and error code (SC_ERR_NONE = success).
*
* Return errors codes:
* - SC_ERR_PARM if parameters invalid
*/
sc_err_t
sc_misc_get_temp
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_misc_temp_t
temp
,
int16_t
*
celsius
,
int8_t
*
tenths
);
/*!
* This function returns the boot device.
*
* @param[in] ipc IPC handle
* @param[out] dev pointer to return boot device
*/
void
sc_misc_get_boot_dev
(
sc_ipc_t
ipc
,
sc_rsrc_t
*
dev
);
/*!
* This function returns the current status of the ON/OFF button.
*
* @param[in] ipc IPC handle
* @param[out] status pointer to return button status
*/
void
sc_misc_get_button_status
(
sc_ipc_t
ipc
,
sc_bool_t
*
status
);
/* @} */
#endif
/* SC_MISC_API_H */
/**@}*/
This diff is collapsed.
Click to expand it.
plat/imx/common/sci/sci_api.mk
View file @
72106f82
...
...
@@ -9,4 +9,5 @@ BL31_SOURCES += plat/imx/common/sci/ipc.c \
plat/imx/common/sci/svc/pad/pad_rpc_clnt.c
\
plat/imx/common/sci/svc/pm/pm_rpc_clnt.c
\
plat/imx/common/sci/svc/rm/rm_rpc_clnt.c
\
plat/imx/common/sci/svc/timer/timer_rpc_clnt.c
plat/imx/common/sci/svc/timer/timer_rpc_clnt.c
\
plat/imx/common/sci/svc/misc/misc_rpc_clnt.c
This diff is collapsed.
Click to expand it.
plat/imx/common/sci/svc/misc/misc_rpc_clnt.c
0 → 100644
View file @
72106f82
/*
* Copyright (C) 2016 Freescale Semiconductor, Inc.
* Copyright 2017-2018 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*!
* File containing client-side RPC functions for the MISC service. These
* functions are ported to clients that communicate to the SC.
*
* @addtogroup MISC_SVC
* @{
*/
/* Includes */
#include <sci/sci_types.h>
#include <sci/svc/rm/sci_rm_api.h>
#include <sci/svc/misc/sci_misc_api.h>
#include <sci/sci_rpc.h>
#include <stdlib.h>
#include "sci_misc_rpc.h"
/* Local Defines */
/* Local Types */
/* Local Functions */
sc_err_t
sc_misc_set_control
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_ctrl_t
ctrl
,
uint32_t
val
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SET_CONTROL
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)
ctrl
;
RPC_U32
(
&
msg
,
4U
)
=
(
uint32_t
)
val
;
RPC_U16
(
&
msg
,
8U
)
=
(
uint16_t
)
resource
;
RPC_SIZE
(
&
msg
)
=
4U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_get_control
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_ctrl_t
ctrl
,
uint32_t
*
val
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_GET_CONTROL
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)
ctrl
;
RPC_U16
(
&
msg
,
4U
)
=
(
uint16_t
)
resource
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
val
!=
NULL
)
*
val
=
RPC_U32
(
&
msg
,
0U
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_set_max_dma_group
(
sc_ipc_t
ipc
,
sc_rm_pt_t
pt
,
sc_misc_dma_group_t
max
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SET_MAX_DMA_GROUP
;
RPC_U8
(
&
msg
,
0U
)
=
(
uint8_t
)
pt
;
RPC_U8
(
&
msg
,
1U
)
=
(
uint8_t
)
max
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_set_dma_group
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_misc_dma_group_t
group
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SET_DMA_GROUP
;
RPC_U16
(
&
msg
,
0U
)
=
(
uint16_t
)
resource
;
RPC_U8
(
&
msg
,
2U
)
=
(
uint8_t
)
group
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_seco_image_load
(
sc_ipc_t
ipc
,
sc_faddr_t
addr_src
,
sc_faddr_t
addr_dst
,
uint32_t
len
,
sc_bool_t
fw
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SECO_IMAGE_LOAD
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)(
addr_src
>>
32U
);
RPC_U32
(
&
msg
,
4U
)
=
(
uint32_t
)
addr_src
;
RPC_U32
(
&
msg
,
8U
)
=
(
uint32_t
)(
addr_dst
>>
32U
);
RPC_U32
(
&
msg
,
12U
)
=
(
uint32_t
)
addr_dst
;
RPC_U32
(
&
msg
,
16U
)
=
(
uint32_t
)
len
;
RPC_U8
(
&
msg
,
20U
)
=
(
uint8_t
)
fw
;
RPC_SIZE
(
&
msg
)
=
7U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_seco_authenticate
(
sc_ipc_t
ipc
,
sc_misc_seco_auth_cmd_t
cmd
,
sc_faddr_t
addr
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SECO_AUTHENTICATE
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)(
addr
>>
32U
);
RPC_U32
(
&
msg
,
4U
)
=
(
uint32_t
)
addr
;
RPC_U8
(
&
msg
,
8U
)
=
(
uint8_t
)
cmd
;
RPC_SIZE
(
&
msg
)
=
4U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_seco_fuse_write
(
sc_ipc_t
ipc
,
sc_faddr_t
addr
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SECO_FUSE_WRITE
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)(
addr
>>
32U
);
RPC_U32
(
&
msg
,
4U
)
=
(
uint32_t
)
addr
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_seco_enable_debug
(
sc_ipc_t
ipc
,
sc_faddr_t
addr
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SECO_ENABLE_DEBUG
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)(
addr
>>
32U
);
RPC_U32
(
&
msg
,
4U
)
=
(
uint32_t
)
addr
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_seco_forward_lifecycle
(
sc_ipc_t
ipc
,
uint32_t
lifecycle
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SECO_FORWARD_LIFECYCLE
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)
lifecycle
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_seco_return_lifecycle
(
sc_ipc_t
ipc
,
sc_faddr_t
addr
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SECO_RETURN_LIFECYCLE
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)(
addr
>>
32U
);
RPC_U32
(
&
msg
,
4U
)
=
(
uint32_t
)
addr
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
void
sc_misc_seco_build_info
(
sc_ipc_t
ipc
,
uint32_t
*
version
,
uint32_t
*
commit
)
{
sc_rpc_msg_t
msg
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SECO_BUILD_INFO
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
version
!=
NULL
)
*
version
=
RPC_U32
(
&
msg
,
0U
);
if
(
commit
!=
NULL
)
*
commit
=
RPC_U32
(
&
msg
,
4U
);
}
sc_err_t
sc_misc_seco_chip_info
(
sc_ipc_t
ipc
,
uint16_t
*
lc
,
uint16_t
*
monotonic
,
uint32_t
*
uid_l
,
uint32_t
*
uid_h
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SECO_CHIP_INFO
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
uid_l
!=
NULL
)
*
uid_l
=
RPC_U32
(
&
msg
,
0U
);
if
(
uid_h
!=
NULL
)
*
uid_h
=
RPC_U32
(
&
msg
,
4U
);
if
(
lc
!=
NULL
)
*
lc
=
RPC_U16
(
&
msg
,
8U
);
if
(
monotonic
!=
NULL
)
*
monotonic
=
RPC_U16
(
&
msg
,
10U
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
void
sc_misc_debug_out
(
sc_ipc_t
ipc
,
uint8_t
ch
)
{
sc_rpc_msg_t
msg
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_DEBUG_OUT
;
RPC_U8
(
&
msg
,
0U
)
=
(
uint8_t
)
ch
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
}
sc_err_t
sc_misc_waveform_capture
(
sc_ipc_t
ipc
,
sc_bool_t
enable
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_WAVEFORM_CAPTURE
;
RPC_U8
(
&
msg
,
0U
)
=
(
uint8_t
)
enable
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
void
sc_misc_build_info
(
sc_ipc_t
ipc
,
uint32_t
*
build
,
uint32_t
*
commit
)
{
sc_rpc_msg_t
msg
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_BUILD_INFO
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
build
!=
NULL
)
*
build
=
RPC_U32
(
&
msg
,
0U
);
if
(
commit
!=
NULL
)
*
commit
=
RPC_U32
(
&
msg
,
4U
);
}
void
sc_misc_unique_id
(
sc_ipc_t
ipc
,
uint32_t
*
id_l
,
uint32_t
*
id_h
)
{
sc_rpc_msg_t
msg
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_UNIQUE_ID
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
id_l
!=
NULL
)
*
id_l
=
RPC_U32
(
&
msg
,
0U
);
if
(
id_h
!=
NULL
)
*
id_h
=
RPC_U32
(
&
msg
,
4U
);
}
sc_err_t
sc_misc_set_ari
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_rsrc_t
resource_mst
,
uint16_t
ari
,
sc_bool_t
enable
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SET_ARI
;
RPC_U16
(
&
msg
,
0U
)
=
(
uint16_t
)
resource
;
RPC_U16
(
&
msg
,
2U
)
=
(
uint16_t
)
resource_mst
;
RPC_U16
(
&
msg
,
4U
)
=
(
uint16_t
)
ari
;
RPC_U8
(
&
msg
,
6U
)
=
(
uint8_t
)
enable
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
void
sc_misc_boot_status
(
sc_ipc_t
ipc
,
sc_misc_boot_status_t
status
)
{
sc_rpc_msg_t
msg
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_BOOT_STATUS
;
RPC_U8
(
&
msg
,
0U
)
=
(
uint8_t
)
status
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_TRUE
);
}
sc_err_t
sc_misc_boot_done
(
sc_ipc_t
ipc
,
sc_rsrc_t
cpu
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_BOOT_DONE
;
RPC_U16
(
&
msg
,
0U
)
=
(
uint16_t
)
cpu
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_otp_fuse_read
(
sc_ipc_t
ipc
,
uint32_t
word
,
uint32_t
*
val
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_OTP_FUSE_READ
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)
word
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
val
!=
NULL
)
*
val
=
RPC_U32
(
&
msg
,
0U
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_otp_fuse_write
(
sc_ipc_t
ipc
,
uint32_t
word
,
uint32_t
val
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_OTP_FUSE_WRITE
;
RPC_U32
(
&
msg
,
0U
)
=
(
uint32_t
)
word
;
RPC_U32
(
&
msg
,
4U
)
=
(
uint32_t
)
val
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_set_temp
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_misc_temp_t
temp
,
int16_t
celsius
,
int8_t
tenths
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_SET_TEMP
;
RPC_U16
(
&
msg
,
0U
)
=
(
uint16_t
)
resource
;
RPC_I16
(
&
msg
,
2U
)
=
(
int16_t
)
celsius
;
RPC_U8
(
&
msg
,
4U
)
=
(
uint8_t
)
temp
;
RPC_I8
(
&
msg
,
5U
)
=
(
int8_t
)
tenths
;
RPC_SIZE
(
&
msg
)
=
3U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
result
=
RPC_R8
(
&
msg
);
return
(
sc_err_t
)
result
;
}
sc_err_t
sc_misc_get_temp
(
sc_ipc_t
ipc
,
sc_rsrc_t
resource
,
sc_misc_temp_t
temp
,
int16_t
*
celsius
,
int8_t
*
tenths
)
{
sc_rpc_msg_t
msg
;
uint8_t
result
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_GET_TEMP
;
RPC_U16
(
&
msg
,
0U
)
=
(
uint16_t
)
resource
;
RPC_U8
(
&
msg
,
2U
)
=
(
uint8_t
)
temp
;
RPC_SIZE
(
&
msg
)
=
2U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
celsius
!=
NULL
)
*
celsius
=
RPC_I16
(
&
msg
,
0U
);
result
=
RPC_R8
(
&
msg
);
if
(
tenths
!=
NULL
)
*
tenths
=
RPC_I8
(
&
msg
,
2U
);
return
(
sc_err_t
)
result
;
}
void
sc_misc_get_boot_dev
(
sc_ipc_t
ipc
,
sc_rsrc_t
*
dev
)
{
sc_rpc_msg_t
msg
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_GET_BOOT_DEV
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
dev
!=
NULL
)
*
dev
=
RPC_U16
(
&
msg
,
0U
);
}
void
sc_misc_get_button_status
(
sc_ipc_t
ipc
,
sc_bool_t
*
status
)
{
sc_rpc_msg_t
msg
;
RPC_VER
(
&
msg
)
=
SC_RPC_VERSION
;
RPC_SVC
(
&
msg
)
=
(
uint8_t
)
SC_RPC_SVC_MISC
;
RPC_FUNC
(
&
msg
)
=
(
uint8_t
)
MISC_FUNC_GET_BUTTON_STATUS
;
RPC_SIZE
(
&
msg
)
=
1U
;
sc_call_rpc
(
ipc
,
&
msg
,
SC_FALSE
);
if
(
status
!=
NULL
)
*
status
=
RPC_U8
(
&
msg
,
0U
);
}
/**@}*/
This diff is collapsed.
Click to expand it.
plat/imx/common/sci/svc/misc/sci_misc_rpc.h
0 → 100644
View file @
72106f82
/*
* Copyright (C) 2016 Freescale Semiconductor, Inc.
* Copyright 2017-2019 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*!
* Header file for the MISC RPC implementation.
*
* @addtogroup MISC_SVC
* @{
*/
#ifndef SC_MISC_RPC_H
#define SC_MISC_RPC_H
/* Includes */
/* Defines */
/*!
* @name Defines for RPC MISC function calls
*/
/*@{*/
#define MISC_FUNC_UNKNOWN 0
/* Unknown function */
#define MISC_FUNC_SET_CONTROL 1U
/* Index for misc_set_control() RPC call */
#define MISC_FUNC_GET_CONTROL 2U
/* Index for misc_get_control() RPC call */
#define MISC_FUNC_SET_MAX_DMA_GROUP 4U
/* Index for misc_set_max_dma_group() RPC call */
#define MISC_FUNC_SET_DMA_GROUP 5U
/* Index for misc_set_dma_group() RPC call */
#define MISC_FUNC_SECO_IMAGE_LOAD 8U
/* Index for misc_seco_image_load() RPC call */
#define MISC_FUNC_SECO_AUTHENTICATE 9U
/* Index for misc_seco_authenticate() RPC call */
#define MISC_FUNC_SECO_FUSE_WRITE 20U
/* Index for misc_seco_fuse_write() RPC call */
#define MISC_FUNC_SECO_ENABLE_DEBUG 21U
/* Index for misc_seco_enable_debug() RPC call */
#define MISC_FUNC_SECO_FORWARD_LIFECYCLE 22U
/* Index for misc_seco_forward_lifecycle() RPC call */
#define MISC_FUNC_SECO_RETURN_LIFECYCLE 23U
/* Index for misc_seco_return_lifecycle() RPC call */
#define MISC_FUNC_SECO_BUILD_INFO 24U
/* Index for misc_seco_build_info() RPC call */
#define MISC_FUNC_SECO_CHIP_INFO 25U
/* Index for misc_seco_chip_info() RPC call */
#define MISC_FUNC_DEBUG_OUT 10U
/* Index for misc_debug_out() RPC call */
#define MISC_FUNC_WAVEFORM_CAPTURE 6U
/* Index for misc_waveform_capture() RPC call */
#define MISC_FUNC_BUILD_INFO 15U
/* Index for misc_build_info() RPC call */
#define MISC_FUNC_UNIQUE_ID 19U
/* Index for misc_unique_id() RPC call */
#define MISC_FUNC_SET_ARI 3U
/* Index for misc_set_ari() RPC call */
#define MISC_FUNC_BOOT_STATUS 7U
/* Index for misc_boot_status() RPC call */
#define MISC_FUNC_BOOT_DONE 14U
/* Index for misc_boot_done() RPC call */
#define MISC_FUNC_OTP_FUSE_READ 11U
/* Index for misc_otp_fuse_read() RPC call */
#define MISC_FUNC_OTP_FUSE_WRITE 17U
/* Index for misc_otp_fuse_write() RPC call */
#define MISC_FUNC_SET_TEMP 12U
/* Index for misc_set_temp() RPC call */
#define MISC_FUNC_GET_TEMP 13U
/* Index for misc_get_temp() RPC call */
#define MISC_FUNC_GET_BOOT_DEV 16U
/* Index for misc_get_boot_dev() RPC call */
#define MISC_FUNC_GET_BUTTON_STATUS 18U
/* Index for misc_get_button_status() RPC call */
/*@}*/
/* Types */
/* Functions */
/*!
* This function dispatches an incoming MISC RPC request.
*
* @param[in] caller_pt caller partition
* @param[in] msg pointer to RPC message
*/
void
misc_dispatch
(
sc_rm_pt_t
caller_pt
,
sc_rpc_msg_t
*
msg
);
/*!
* This function translates and dispatches an MISC RPC request.
*
* @param[in] ipc IPC handle
* @param[in] msg pointer to RPC message
*/
void
misc_xlate
(
sc_ipc_t
ipc
,
sc_rpc_msg_t
*
msg
);
#endif
/* SC_MISC_RPC_H */
/**@}*/
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help