1 /*
2 * Copyright (c) 2018-2020, Texas Instruments Incorporated
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * * Neither the name of Texas Instruments Incorporated nor the names of
17 * its contributors may be used to endorse or promote products derived
18 * from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32 /**
33 * \file sciclient_boardcfg.c
34 *
35 * \brief File containing the APIs to send board configuration
36 * messages.
37 *
38 */
40 /* ========================================================================== */
41 /* Include Files */
42 /* ========================================================================== */
44 #include <ti/drv/sciclient/src/sciclient/sciclient_priv.h>
45 #include <ti/csl/arch/csl_arch.h>
47 /* ========================================================================== */
48 /* Function Definitions */
49 /* ========================================================================== */
51 #if defined (BUILD_MCU1_0)
52 const uint32_t gSciclient_boardCfgLow[(SCICLIENT_BOARDCFG_SIZE_IN_BYTES+3U)/4U]
53 __attribute__(( aligned(128), section(".boardcfg_data") ))
54 = SCICLIENT_BOARDCFG;
55 const uint32_t gSciclient_boardCfgLow_rm[(SCICLIENT_BOARDCFG_RM_SIZE_IN_BYTES+3U)/4U]
56 __attribute__(( aligned(128), section(".boardcfg_data") ))
57 = SCICLIENT_BOARDCFG_RM;
58 const uint32_t gSciclient_boardCfgLow_sec[(SCICLIENT_BOARDCFG_SECURITY_SIZE_IN_BYTES+3U)/4U]
59 __attribute__(( aligned(128), section(".boardcfg_data") ))
60 = SCICLIENT_BOARDCFG_SECURITY;
61 const uint32_t gSciclient_boardCfgLow_pm[(SCICLIENT_BOARDCFG_PM_SIZE_IN_BYTES+3U)/4U]
62 __attribute__(( aligned(128), section(".boardcfg_data") ))
63 = SCICLIENT_BOARDCFG_PM;
65 int32_t Sciclient_boardCfg(const Sciclient_BoardCfgPrms_t * pInPrms)
66 {
67 int32_t retVal = CSL_PASS;
68 struct tisci_msg_board_config_req request = {
69 .tisci_boardcfgp_low = (uint32_t) gSciclient_boardCfgLow,
70 .tisci_boardcfgp_high = (uint32_t) 0x0U,
71 .tisci_boardcfg_size = (uint16_t) SCICLIENT_BOARDCFG_SIZE_IN_BYTES,
72 .tisci_boardcfg_devgrp = (uint8_t) DEVGRP_ALL
73 };
75 /* NULL pInPrms will retain default values */
76 if (pInPrms != NULL)
77 {
78 request.tisci_boardcfgp_low = pInPrms->boardConfigLow;
79 request.tisci_boardcfgp_high = pInPrms->boardConfigHigh;
80 request.tisci_boardcfg_size = pInPrms->boardConfigSize;
81 request.tisci_boardcfg_devgrp = pInPrms->devGrp;
82 }
84 Sciclient_ReqPrm_t reqParam = {
85 .messageType = (uint16_t) TISCI_MSG_BOARD_CONFIG,
86 .flags = (uint32_t) TISCI_MSG_FLAG_AOP,
87 .pReqPayload = (const uint8_t *) &request,
88 .reqPayloadSize = (uint32_t) sizeof (request),
89 .timeout = (uint32_t) SCICLIENT_SERVICE_WAIT_FOREVER
90 };
91 Sciclient_RespPrm_t respParam = {
92 .flags = (uint32_t) 0, /* Populated by the API */
93 .pRespPayload = (uint8_t *) 0,
94 .respPayloadSize = (uint32_t) 0
95 };
96 CSL_armR5CacheWbInv((const void*) request.tisci_boardcfgp_low,
97 request.tisci_boardcfg_size);
98 if((CSL_PASS != Sciclient_service(&reqParam, &respParam))
99 || ((respParam.flags & TISCI_MSG_FLAG_ACK) != TISCI_MSG_FLAG_ACK))
100 {
101 retVal = CSL_EFAIL;
102 }
104 return retVal;
105 }
107 int32_t Sciclient_boardCfgPm(const Sciclient_BoardCfgPrms_t * pInPrms)
108 {
109 int32_t retVal = CSL_PASS;
110 struct tisci_msg_board_config_pm_req request = {
111 .tisci_boardcfg_pmp_low = (uint32_t) gSciclient_boardCfgLow_pm, /* PM Board Config structure
112 definition removed from TISCI */
113 .tisci_boardcfg_pmp_high = (uint32_t) 0x0U,
114 .tisci_boardcfg_pm_size = (uint16_t) SCICLIENT_BOARDCFG_PM_SIZE_IN_BYTES,
115 .tisci_boardcfg_pm_devgrp = (uint8_t) DEVGRP_ALL
117 };
119 /* NULL pInPrms will retain default values */
120 if (pInPrms != NULL)
121 {
122 request.tisci_boardcfg_pmp_low = pInPrms->boardConfigLow;
123 request.tisci_boardcfg_pmp_high = pInPrms->boardConfigHigh;
124 request.tisci_boardcfg_pm_size = pInPrms->boardConfigSize;
125 request.tisci_boardcfg_pm_devgrp = pInPrms->devGrp;
126 }
128 Sciclient_ReqPrm_t reqParam = {
129 .messageType = (uint16_t) TISCI_MSG_BOARD_CONFIG_PM,
130 .flags = (uint32_t) TISCI_MSG_FLAG_AOP,
131 .pReqPayload = (const uint8_t *) &request,
132 .reqPayloadSize = (uint32_t) sizeof (request),
133 .timeout = (uint32_t) SCICLIENT_SERVICE_WAIT_FOREVER
134 };
135 Sciclient_RespPrm_t respParam = {
136 .flags = (uint32_t) 0, /* Populated by the API */
137 .pRespPayload = (uint8_t *) 0,
138 .respPayloadSize = (uint32_t) 0
139 };
140 CSL_armR5CacheWbInv((const void*) request.tisci_boardcfg_pmp_low,
141 request.tisci_boardcfg_pm_size);
142 if((CSL_PASS != Sciclient_service(&reqParam, &respParam))
143 || ((respParam.flags & TISCI_MSG_FLAG_ACK) != TISCI_MSG_FLAG_ACK))
144 {
145 retVal = CSL_EFAIL;
146 }
147 return retVal;
148 }
150 int32_t Sciclient_boardCfgRm(const Sciclient_BoardCfgPrms_t * pInPrms)
151 {
152 int32_t retVal = CSL_PASS;
154 struct tisci_msg_board_config_rm_req request = {
155 .tisci_boardcfg_rmp_low = (uint32_t) gSciclient_boardCfgLow_rm,
156 .tisci_boardcfg_rmp_high = (uint32_t) 0x0U,
157 .tisci_boardcfg_rm_size = (uint16_t) SCICLIENT_BOARDCFG_RM_SIZE_IN_BYTES,
158 .tisci_boardcfg_rm_devgrp = (uint8_t) DEVGRP_ALL
159 };
161 /* NULL pInPrms will retain default values */
162 if (pInPrms != NULL)
163 {
164 request.tisci_boardcfg_rmp_low = pInPrms->boardConfigLow;
165 request.tisci_boardcfg_rmp_high = pInPrms->boardConfigHigh;
166 request.tisci_boardcfg_rm_size = pInPrms->boardConfigSize;
167 request.tisci_boardcfg_rm_devgrp = pInPrms->devGrp;
168 }
170 Sciclient_ReqPrm_t reqParam = {
171 .messageType = (uint16_t) TISCI_MSG_BOARD_CONFIG_RM,
172 .flags = (uint32_t) TISCI_MSG_FLAG_AOP,
173 .pReqPayload = (const uint8_t *) &request,
174 .reqPayloadSize = (uint32_t) sizeof (request),
175 .timeout = (uint32_t) SCICLIENT_SERVICE_WAIT_FOREVER
176 };
177 Sciclient_RespPrm_t respParam = {
178 .flags = (uint32_t) 0, /* Populated by the API */
179 .pRespPayload = (uint8_t *) 0,
180 .respPayloadSize = (uint32_t) 0
181 };
182 CSL_armR5CacheWbInv((const void*) request.tisci_boardcfg_rmp_low,
183 request.tisci_boardcfg_rm_size);
184 if((CSL_PASS != Sciclient_service(&reqParam, &respParam))
185 || ((respParam.flags & TISCI_MSG_FLAG_ACK) != TISCI_MSG_FLAG_ACK))
186 {
187 retVal = CSL_EFAIL;
188 }
189 return retVal;
190 }
192 int32_t Sciclient_boardCfgSec(const Sciclient_BoardCfgPrms_t * pInPrms)
193 {
194 int32_t retVal = CSL_PASS;
195 struct tisci_msg_board_config_security_req request = {
196 .tisci_boardcfg_securityp_low = (uint32_t) gSciclient_boardCfgLow_sec,
197 .tisci_boardcfg_securityp_high = (uint32_t) 0x0U,
198 .tisci_boardcfg_security_size = (uint16_t) SCICLIENT_BOARDCFG_SECURITY_SIZE_IN_BYTES,
199 .tisci_boardcfg_security_devgrp = (uint8_t) DEVGRP_ALL
200 };
202 /* NULL pInPrms will retain default values */
203 if (pInPrms != NULL)
204 {
205 request.tisci_boardcfg_securityp_low = pInPrms->boardConfigLow;
206 request.tisci_boardcfg_securityp_high = pInPrms->boardConfigHigh;
207 request.tisci_boardcfg_security_size = pInPrms->boardConfigSize;
208 request.tisci_boardcfg_security_devgrp = pInPrms->devGrp;
209 }
211 Sciclient_ReqPrm_t reqParam = {
212 .messageType = (uint16_t) TISCI_MSG_BOARD_CONFIG_SECURITY,
213 .flags = (uint32_t) TISCI_MSG_FLAG_AOP,
214 .pReqPayload = (const uint8_t *) &request,
215 .reqPayloadSize = (uint32_t) sizeof (request),
216 .timeout = (uint32_t) SCICLIENT_SERVICE_WAIT_FOREVER
217 };
218 Sciclient_RespPrm_t respParam = {
219 .flags = (uint32_t) 0, /* Populated by the API */
220 .pRespPayload = (uint8_t *) 0,
221 .respPayloadSize = (uint32_t) 0
222 };
223 CSL_armR5CacheWbInv((const void*) request.tisci_boardcfg_securityp_low,
224 request.tisci_boardcfg_security_size);
225 if((CSL_PASS != Sciclient_service(&reqParam, &respParam))
226 || ((respParam.flags & TISCI_MSG_FLAG_ACK) != TISCI_MSG_FLAG_ACK))
227 {
228 retVal = CSL_EFAIL;
229 }
230 return retVal;
231 }
233 int32_t Sciclient_getDefaultBoardCfgInfo(Sciclient_DefaultBoardCfgInfo_t *pBoardCfgInfo)
234 {
235 int32_t retVal = CSL_PASS;
237 if(NULL == pBoardCfgInfo)
238 {
239 retVal = CSL_EFAIL;
240 }
242 if(CSL_PASS == retVal)
243 {
244 pBoardCfgInfo->boardCfgLow = &gSciclient_boardCfgLow[0U];
245 pBoardCfgInfo->boardCfgLowRm = &gSciclient_boardCfgLow_rm[0U];
246 pBoardCfgInfo->boardCfgLowSec = &gSciclient_boardCfgLow_sec[0U];
247 pBoardCfgInfo->boardCfgLowPm = &gSciclient_boardCfgLow_pm[0U];
248 pBoardCfgInfo->boardCfgLowSize = SCICLIENT_BOARDCFG_SIZE_IN_BYTES;
249 pBoardCfgInfo->boardCfgLowRmSize = SCICLIENT_BOARDCFG_RM_SIZE_IN_BYTES;
250 pBoardCfgInfo->boardCfgLowSecSize = SCICLIENT_BOARDCFG_SECURITY_SIZE_IN_BYTES;
251 pBoardCfgInfo->boardCfgLowPmSize = SCICLIENT_BOARDCFG_PM_SIZE_IN_BYTES;
252 }
254 return retVal;
255 }
256 #endif