1 /*
2  * Copyright 2019-2024 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 #ifndef __ELEMU_DRIVER_H__
8 #define __ELEMU_DRIVER_H__
9 
10 #include "fsl_common.h"
11 #include "fsl_device_registers.h"
12 
13 #define MU_MSG_HEADER_SIZE (1U)
14 
15 #define MESSAGING_TAG_COMMAND (0x17u)
16 #define MESSAGING_TAG_REPLY   (0x0Cu)
17 #define STATIC_CHECK_BITS     (0xD7u)
18 
19 enum
20 {
21     kStatus_ELEMU_AgumentOutOfRange =
22         MAKE_STATUS(kStatusGroup_ELEMU, 0x1u), /*!< ELEMU status for out of range access. */
23     kStatus_ELEMU_InvalidArgument =
24         MAKE_STATUS(kStatusGroup_ELEMU, 0x2u), /*!< ELEMU status for invalid argument check. */
25     kStatus_ELEMU_RequestTimeout = MAKE_STATUS(kStatusGroup_ELEMU, 0x3u), /*!< ELEMU status for timeout. */
26     kStatus_ELEMU_Busy = MAKE_STATUS(kStatusGroup_ELEMU, 0x4u), /*!< ELEMU status for reservation by other core. */
27 };
28 
29 typedef enum
30 {
31     kStatus_ELEMU_Unknown       = 0x0u, /*!< Unexpected ELEMU ownership. */
32     kStatus_ELEMU_LockedByMe    = 0x1u, /*!< ELEMU reserved for current core. */
33     kStatus_ELEMU_LockedByOther = 0x2u, /*!< ELEMU reserved for other core. */
34     kStatus_ELEMU_Free          = 0x3u, /*!< ELEMU not reserved. */
35 } elemu_ownership_status_t;
36 
37 typedef struct mu_hdr
38 {
39     uint8_t tag_sts;
40     uint8_t check_bits;
41     uint8_t size;
42     uint8_t command;
43 } mu_hdr_t;
44 
45 void ELEMU_mu_hal_send_data(ELEMU_Type *mu, uint8_t regid, uint32_t *data);
46 void ELEMU_mu_hal_receive_data(ELEMU_Type *mu, uint8_t regid, uint32_t *data);
47 status_t ELEMU_mu_hal_receive_data_wait(ELEMU_Type *mu, uint8_t regid, uint32_t *data, uint32_t wait);
48 status_t ELEMU_mu_read_message(ELEMU_Type *mu, uint32_t *buf, uint8_t *size, uint8_t read_header);
49 status_t ELEMU_mu_read_data_wait(ELEMU_Type *mu, uint32_t buf[], uint8_t *size, uint32_t wait);
50 
51 status_t ELEMU_mu_send_message(ELEMU_Type *mu, uint32_t buf[], size_t wordCount);
52 status_t ELEMU_mu_get_response(ELEMU_Type *mu, uint32_t *buf, size_t wordCount);
53 status_t ELEMU_mu_wait_for_data(ELEMU_Type *mu, uint32_t *buf, size_t wordCount, uint32_t wait);
54 
55 status_t ELEMU_mu_wait_for_ready(ELEMU_Type *mu, uint32_t wait);
56 
57 #if (defined(FSL_FEATURE_ELEMU_HAS_SEMA4_STATUS_REGISTER) && FSL_FEATURE_ELEMU_HAS_SEMA4_STATUS_REGISTER)
58 elemu_ownership_status_t ELEMU_mu_get_ownership_status(ELEMU_Type *mu);
59 status_t ELEMU_mu_get_ownership(ELEMU_Type *mu);
60 status_t ELEMU_mu_release_ownership(ELEMU_Type *mu);
61 status_t ELEMU_mu_release_ownership_force(ELEMU_Type *mu);
62 #endif /* FSL_FEATURE_ELEMU_HAS_SEMA4_STATUS_REGISTER */
63 
64 void ELEMU_mu_init(ELEMU_Type *mu);
65 status_t ELEMU_LP_WakeupPathInit(ELEMU_Type *mu);
66 
67 #if (defined(ELEMU_HAS_LOADABLE_FW) && ELEMU_HAS_LOADABLE_FW)
68 status_t ELEMU_loadFw(ELEMU_Type *mu, uint32_t image[]);
69 #endif /* ELEMU_HAS_LOADABLE_FW */
70 
71 #endif /* __ELEMU_DRIVER_H__ */
72