am65xx: Pass valid request pointer for Sciclient version check
[ipc/ipcdev.git] / packages / ti / sdo / ipc / family / am65xx / NotifySciClient.c
1 /*
2  * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the
14  * 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
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  */
34 /* The following are required to avoid issues with types used in CSL */
35 #undef xdc__strict
36 /* Define SOC_AM65XX for header files below */
37 #define SOC_AM65XX
39 #include <ti/csl/csl_types.h>
40 #include <ti/drv/sciclient/sciclient.h>
42 #include "package/internal/NotifySciClient.xdc.h"
44 #define NOTIFY_SCICLIENT_RESP_TIMEOUT 1000000
46 /*********************************************************************
47  * @fn      NotifySciClient_Init
48  *
49  * @brief   Initialises NotifySciclient
50  *          Currently only checking communication with system core.
51  *
52  *
53  * @return  0 : Success; -1 for failures
54  */
55 Int32 NotifySciClient_Init(void)
56 {
57     int32_t status = 0;
58     Sciclient_ConfigPrms_t        config;
60     struct tisci_msg_version_req request;
61     /* Setup Request for Version check */
62     const Sciclient_ReqPrm_t      reqPrm =
63     {
64         .messageType = TISCI_MSG_VERSION,
65         .flags = TISCI_MSG_FLAG_AOP,
66         .pReqPayload = (uint8_t *) &request,
67         .reqPayloadSize = sizeof(request),
68         .timeout = NOTIFY_SCICLIENT_RESP_TIMEOUT
69     };
71     struct tisci_msg_version_resp response;
72     /* Setup Response parameters */
73     Sciclient_RespPrm_t           respPrm =
74     {
75         .flags = 0,
76         .pRespPayload = (uint8_t *) &response,
77         .respPayloadSize = sizeof (response)
78     };
80     /* Now reinitialize it as default parameter */
81     Sciclient_configPrmsInit(&config);
82 #if defined(xdc_target__isaCompatible_v8A)
83     config.opModeFlag  = SCICLIENT_SERVICE_OPERATION_MODE_POLLED;
84 #endif
86     status = Sciclient_init(&config);
87     if (status < 0) {
88         return -1;
89     }
91     /* Check version check to TISCI connection */
92     status = Sciclient_service(&reqPrm, &respPrm);
93     if (CSL_PASS == status)
94     {
95         if (respPrm.flags != TISCI_MSG_FLAG_ACK)
96         {
97             return -1;
98         }
99     } else {
100         return -1;
101     }
102     return status;
105 /*********************************************************************
106  * @fn      NotifySciClient_IrqSet
107  *
108  * @brief   Configures interrupt routes by requesting the system core
109  *
110  * @param1  coreIndex: core index
111  * @param2  mailboxClusterIndex: Mailbox Cluster index
112  * @param3  mailboxUserIndex: Mailbox User index
113  * @param4  intNumber: Local cpu interrupt number
114  *
115  * @return  0 : Success; -1 for failures
116  */
117 Int32 NotifySciClient_IrqSet(NotifySciClient_CoreIndex coreIndex,
118                NotifySciClient_SourceIdIndex mailboxClusterIndex,
119                NotifySciClient_MailboxIndex mailboxUserIndex,
120                UInt32 intNumber)
122     int32_t status = 0;
123     struct tisci_msg_rm_irq_set_resp resp;
125     /* Indexed list of dst ids */
126     const int32_t map_dst_id[] =
127     {
128         /* NOTE: This list should match the Core index */
129         TISCI_DEV_GIC0,
130         TISCI_DEV_MCU_ARMSS0_CPU0,
131         TISCI_DEV_MCU_ARMSS0_CPU1
132     };
133     /* Indexed list of src ids */
134     const uint16_t map_src_id[] =
135     {
136         TISCI_DEV_NAVSS0_MAILBOX0_CLUSTER0,
137         TISCI_DEV_NAVSS0_MAILBOX0_CLUSTER1,
138         TISCI_DEV_NAVSS0_MAILBOX0_CLUSTER2
139     };
141     /* Indexed list of host ids */
142     const uint16_t map_host_id[] =
143     {
144         TISCI_HOST_ID_A53_0,
145         TISCI_HOST_ID_R5_0,  /* This corresponds to R5F core 0 non-secure */
146         TISCI_HOST_ID_R5_2   /* This corresponds to R5F core 1 non-secure */
147     };
149     /* Initialize unused parameters */
150     struct tisci_msg_rm_irq_set_req irq_set_req =
151     {
152         .ia_id          = 0,
153         .vint           = 0,
154         .global_event   = 0,
155         .vint_status_bit_index = 0,
156     };
158     /* Request irq set for specified interrupt source */
159     irq_set_req.valid_params = 0x80000003 ; /* Sets bits for secondary host, dst_id, dst_host_irq */
160     irq_set_req.src_id = map_src_id[mailboxClusterIndex];
161     irq_set_req.src_index = mailboxUserIndex;
162     irq_set_req.dst_id = map_dst_id[coreIndex];
163     irq_set_req.dst_host_irq = intNumber;
164     irq_set_req.secondary_host = map_host_id[coreIndex];
166     /* Call irq Set */
167     if (CSL_PASS != Sciclient_rmIrqSet(&irq_set_req, &resp, NOTIFY_SCICLIENT_RESP_TIMEOUT ))
168     {
169         return -1;
170     }
172     return status;
175 /*********************************************************************
176  * @fn      NotifySciClient_IrqRelease
177  *
178  * @brief   Releases interrupt routes by requesting the system core
179  *
180  * @param1  coreIndex: core index
181  * @param2  mailboxClusterIndex: Mailbox Cluster index
182  * @param3  mailboxUserIndex: Mailbox User index
183  * @param4  intNumber: Local cpu interrupt number
184  *
185  * @return  0 : Success; -1 for failures
186  */
187 Int32 NotifySciClient_IrqRelease(NotifySciClient_CoreIndex coreIndex,
188                NotifySciClient_SourceIdIndex mailboxClusterIndex,
189                NotifySciClient_MailboxIndex mailboxUserIndex,
190                UInt32 intNumber)
192     int32_t status = 0;
194     /* Indexed list of dst ids */
195     const int32_t map_dst_id[] =
196     {
197         /* NOTE: This list should match the Core index */
198         TISCI_DEV_GIC0,
199         TISCI_DEV_MCU_ARMSS0_CPU0,
200         TISCI_DEV_MCU_ARMSS0_CPU1
201     };
202     /* Indexed list of src ids */
203     const uint16_t map_src_id[] =
204     {
205         TISCI_DEV_NAVSS0_MAILBOX0_CLUSTER0,
206         TISCI_DEV_NAVSS0_MAILBOX0_CLUSTER1,
207         TISCI_DEV_NAVSS0_MAILBOX0_CLUSTER2
208     };
210     /* Indexed list of host ids */
211     const uint16_t map_host_id[] =
212     {
213         TISCI_HOST_ID_A53_0,
214         TISCI_HOST_ID_R5_0,  /* This corresponds to R5F core 0 non-secure */
215         TISCI_HOST_ID_R5_2   /* This corresponds to R5F core 1 non-secure */
216     };
218     /* Initialize unused parameters */
219     struct tisci_msg_rm_irq_release_req irq_release_req =
220     {
221         .ia_id          = 0,
222         .vint           = 0,
223         .global_event   = 0,
224         .vint_status_bit_index = 0,
225     };
227     /* Request irq release for specified interrupt source */
228     irq_release_req.valid_params = 0x80000003 ; /* Sets bits for secondary host, dst_id, dst_host_irq */
229     irq_release_req.src_id = map_src_id[mailboxClusterIndex];
230     irq_release_req.src_index = mailboxUserIndex;
231     irq_release_req.dst_id = map_dst_id[coreIndex];
232     irq_release_req.dst_host_irq = intNumber;
233     irq_release_req.secondary_host = map_host_id[coreIndex];
235     /* Call irq Release */
236     if (CSL_PASS != Sciclient_rmIrqRelease(&irq_release_req, NOTIFY_SCICLIENT_RESP_TIMEOUT ))
237     {
238         return -1;
239     }
241     return status;
244 /*********************************************************************
245  * @fn      NotifySciClient_getIntNumRange
246  *
247  * @brief   Get range of interrupt Numbers available
248  *
249  * @param1  coreIndex: core index
250  * @param2  coreIndex: secondary_host
251  * @param1  rangeStartP: Pointer to range start
252  * @param2  rangeNumP: Pointer to number of interrupts
253  *
254  * @return  0 : Success; -1 for failures
255  */
256 Int32 NotifySciClient_getIntNumRange(NotifySciClient_CoreIndex coreIndex,
257                                      NotifySciClient_SecondaryHost secondaryHost,
258                                      UInt16 *rangeStartP,
259                                      UInt16 *rangeNumP)
261     int32_t status = 0;
262     struct tisci_msg_rm_get_resource_range_resp resp;
263     struct tisci_msg_rm_get_resource_range_req get_resource_range_req;
264    /* Indexed list of req type */
265     const uint16_t req_type[] =
266     {
267         /* NOTE: This list should match the Core index */
268         TISCI_RESASG_TYPE_GIC_IRQ,
269         TISCI_RESASG_TYPE_PULSAR_C0_IRQ,
270         TISCI_RESASG_TYPE_PULSAR_C1_IRQ
271     };
272    /* Indexed list of req subtype */
273     const uint16_t req_subtype[] =
274     {
275         /* NOTE: This list should match the Core index */
276         TISCI_RESASG_SUBTYPE_GIC_IRQ_MAIN_NAV_SET1,
277         TISCI_RESASG_SUBTYPE_PULSAR_C0_IRQ_MAIN2MCU_LVL,
278         TISCI_RESASG_SUBTYPE_PULSAR_C1_IRQ_MAIN2MCU_LVL
279     };
281     /* Indexed list of host ids */
282     const uint16_t map_host_id[] =
283     {
284         TISCI_HOST_ID_A53_0,
285         TISCI_HOST_ID_R5_0,  /* This corresponds to R5F core 0 non-secure */
286         TISCI_HOST_ID_R5_2   /* This corresponds to R5F core 1 non-secure */
287     };
289     get_resource_range_req.type = req_type[coreIndex];
290     get_resource_range_req.subtype = req_subtype[coreIndex];
291     if (secondaryHost == NotifySciClient_SECONDARYHOST_UNUSED) {
292         get_resource_range_req.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
293     } else if (secondaryHost == NotifySciClient_SECONDARYHOST_SPECIFIC_HOST) {
294         get_resource_range_req.secondary_host = map_host_id[coreIndex];
295     } else {
296         get_resource_range_req.secondary_host = TISCI_HOST_ID_ALL;
297     }
298     /* Get interrupt number range */
299     status =  Sciclient_rmGetResourceRange(
300                 &get_resource_range_req,
301                 &resp,
302                 NOTIFY_SCICLIENT_RESP_TIMEOUT);
303     if (CSL_PASS == status)
304     {
305         *rangeStartP = resp.range_start;
306         *rangeNumP = resp.range_num;
307     } else {
308         return -1;
309     }
310     return status;