1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2018-2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: MIT
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 #include "flcn/haldefs_flcnable_nvswitch.h"
25 #include "flcn/flcnable_nvswitch.h"
26 
27 #include "flcnifcmn.h"
28 
29 #include "export_nvswitch.h"
30 #include "common_nvswitch.h"
31 
32 typedef struct FALCON_EXTERNAL_CONFIG FALCON_EXTERNAL_CONFIG, *PFALCON_EXTERNAL_CONFIG;
33 typedef struct FLCN_QMGR_SEQ_INFO FLCN_QMGR_SEQ_INFO, *PFLCN_QMGR_SEQ_INFO;
34 typedef union  RM_FLCN_CMD RM_FLCN_CMD, *PRM_FLCN_CMD;
35 typedef union  RM_FLCN_MSG RM_FLCN_MSG, *PRM_FLCN_MSG;
36 typedef struct ENGINE_DESCRIPTOR_TYPE ENGINE_DESCRIPTOR_TYPE, *PENGINE_DESCRIPTOR_TYPE;
37 
38 
39 // OBJECT Interfaces
40 NvU8
flcnableReadCoreRev(nvswitch_device * device,PFLCNABLE pFlcnable)41 flcnableReadCoreRev
42 (
43     nvswitch_device *device,
44     PFLCNABLE        pFlcnable
45 )
46 {
47     NVSWITCH_ASSERT(pFlcnable->pHal->readCoreRev != (void *)0);
48     return pFlcnable->pHal->readCoreRev(device, pFlcnable);
49 }
50 
51 void
flcnableGetExternalConfig(nvswitch_device * device,PFLCNABLE pFlcnable,PFALCON_EXTERNAL_CONFIG pConfig)52 flcnableGetExternalConfig
53 (
54     nvswitch_device *device,
55     PFLCNABLE        pFlcnable,
56     PFALCON_EXTERNAL_CONFIG pConfig
57 )
58 {
59     NVSWITCH_ASSERT(pFlcnable->pHal->getExternalConfig != (void *)0);
60     pFlcnable->pHal->getExternalConfig(device, pFlcnable, pConfig);
61 }
62 
63 void
flcnableEmemCopyFrom(nvswitch_device * device,PFLCNABLE pFlcnable,NvU32 src,NvU8 * pDst,NvU32 sizeBytes,NvU8 port)64 flcnableEmemCopyFrom
65 (
66     nvswitch_device *device,
67     PFLCNABLE        pFlcnable,
68     NvU32            src,
69     NvU8            *pDst,
70     NvU32            sizeBytes,
71     NvU8             port
72 )
73 {
74     NVSWITCH_ASSERT(pFlcnable->pHal->ememCopyFrom != (void *)0);
75     pFlcnable->pHal->ememCopyFrom(device, pFlcnable, src, pDst, sizeBytes, port);
76 }
77 
78 void
flcnableEmemCopyTo(nvswitch_device * device,PFLCNABLE pFlcnable,NvU32 dst,NvU8 * pSrc,NvU32 sizeBytes,NvU8 port)79 flcnableEmemCopyTo
80 (
81     nvswitch_device *device,
82     PFLCNABLE        pFlcnable,
83     NvU32            dst,
84     NvU8            *pSrc,
85     NvU32            sizeBytes,
86     NvU8             port
87 )
88 {
89     NVSWITCH_ASSERT(pFlcnable->pHal->ememCopyTo != (void *)0);
90     pFlcnable->pHal->ememCopyTo(device, pFlcnable, dst, pSrc, sizeBytes, port);
91 }
92 
93 NV_STATUS
flcnableHandleInitEvent(nvswitch_device * device,PFLCNABLE pFlcnable,RM_FLCN_MSG * pGenMsg)94 flcnableHandleInitEvent
95 (
96     nvswitch_device *device,
97     PFLCNABLE        pFlcnable,
98     RM_FLCN_MSG     *pGenMsg
99 )
100 {
101     NVSWITCH_ASSERT(pFlcnable->pHal->handleInitEvent != (void *)0);
102     return pFlcnable->pHal->handleInitEvent(device, pFlcnable, pGenMsg);
103 }
104 
105 PFLCN_QMGR_SEQ_INFO
flcnableQueueSeqInfoGet(nvswitch_device * device,PFLCNABLE pFlcnable,NvU32 seqIndex)106 flcnableQueueSeqInfoGet
107 (
108     nvswitch_device *device,
109     PFLCNABLE        pFlcnable,
110     NvU32            seqIndex
111 )
112 {
113     NVSWITCH_ASSERT(pFlcnable->pHal->queueSeqInfoGet != (void *)0);
114     return pFlcnable->pHal->queueSeqInfoGet(device, pFlcnable, seqIndex);
115 }
116 
117 void
flcnableQueueSeqInfoClear(nvswitch_device * device,PFLCNABLE pFlcnable,PFLCN_QMGR_SEQ_INFO pSeqInfo)118 flcnableQueueSeqInfoClear
119 (
120     nvswitch_device    *device,
121     PFLCNABLE           pFlcnable,
122     PFLCN_QMGR_SEQ_INFO pSeqInfo
123 )
124 {
125     NVSWITCH_ASSERT(pFlcnable->pHal->queueSeqInfoClear != (void *)0);
126     pFlcnable->pHal->queueSeqInfoClear(device, pFlcnable, pSeqInfo);
127 }
128 
129 void
flcnableQueueSeqInfoFree(nvswitch_device * device,PFLCNABLE pFlcnable,PFLCN_QMGR_SEQ_INFO pSeqInfo)130 flcnableQueueSeqInfoFree
131 (
132     nvswitch_device    *device,
133     PFLCNABLE           pFlcnable,
134     PFLCN_QMGR_SEQ_INFO pSeqInfo
135 )
136 {
137     NVSWITCH_ASSERT(pFlcnable->pHal->queueSeqInfoFree != (void *)0);
138     pFlcnable->pHal->queueSeqInfoFree(device, pFlcnable, pSeqInfo);
139 }
140 
141 NvBool
flcnableQueueCmdValidate(nvswitch_device * device,PFLCNABLE pFlcnable,RM_FLCN_CMD * pCmd,RM_FLCN_MSG * pMsg,void * pPayload,NvU32 queueIdLogical)142 flcnableQueueCmdValidate
143 (
144     nvswitch_device *device,
145     PFLCNABLE        pFlcnable,
146     RM_FLCN_CMD     *pCmd,
147     RM_FLCN_MSG     *pMsg,
148     void            *pPayload,
149     NvU32            queueIdLogical
150 )
151 {
152     NVSWITCH_ASSERT(pFlcnable->pHal->queueCmdValidate != (void *)0);
153     return pFlcnable->pHal->queueCmdValidate(device, pFlcnable, pCmd, pMsg, pPayload, queueIdLogical);
154 }
155 
156 NV_STATUS
flcnableQueueCmdPostExtension(nvswitch_device * device,PFLCNABLE pFlcnable,RM_FLCN_CMD * pCmd,RM_FLCN_MSG * pMsg,void * pPayload,NVSWITCH_TIMEOUT * pTimeout,PFLCN_QMGR_SEQ_INFO pSeqInfo)157 flcnableQueueCmdPostExtension
158 (
159     nvswitch_device    *device,
160     PFLCNABLE           pFlcnable,
161     RM_FLCN_CMD        *pCmd,
162     RM_FLCN_MSG        *pMsg,
163     void               *pPayload,
164     NVSWITCH_TIMEOUT   *pTimeout,
165     PFLCN_QMGR_SEQ_INFO pSeqInfo
166 )
167 {
168     NVSWITCH_ASSERT(pFlcnable->pHal->queueCmdPostExtension != (void *)0);
169     return pFlcnable->pHal->queueCmdPostExtension(device, pFlcnable, pCmd, pMsg, pPayload, pTimeout, pSeqInfo);
170 }
171 
172 void
flcnablePostDiscoveryInit(nvswitch_device * device,FLCNABLE * pFlcnable)173 flcnablePostDiscoveryInit
174 (
175     nvswitch_device *device,
176     FLCNABLE        *pFlcnable
177 )
178 {
179     NVSWITCH_ASSERT(pFlcnable->pHal->postDiscoveryInit != (void *)0);
180     pFlcnable->pHal->postDiscoveryInit(device, pFlcnable);
181 }
182 
183 
184 
185 // HAL Interfaces
186 NV_STATUS
flcnableConstruct_HAL(nvswitch_device * device,FLCNABLE * pFlcnable)187 flcnableConstruct_HAL
188 (
189     nvswitch_device *device,
190     FLCNABLE        *pFlcnable
191 )
192 {
193     NVSWITCH_ASSERT(pFlcnable->pHal->construct != (void *)0);
194     return pFlcnable->pHal->construct(device, pFlcnable);
195 }
196 
197 void
flcnableDestruct_HAL(nvswitch_device * device,FLCNABLE * pFlcnable)198 flcnableDestruct_HAL
199 (
200     nvswitch_device *device,
201     FLCNABLE        *pFlcnable
202 )
203 {
204     NVSWITCH_ASSERT(pFlcnable->pHal->destruct != (void *)0);
205     pFlcnable->pHal->destruct(device, pFlcnable);
206 }
207 
208 void
flcnableFetchEngines_HAL(nvswitch_device * device,FLCNABLE * pFlcnable,ENGINE_DESCRIPTOR_TYPE * pEngDescUc,ENGINE_DESCRIPTOR_TYPE * pEngDescBc)209 flcnableFetchEngines_HAL
210 (
211     nvswitch_device *device,
212     FLCNABLE        *pFlcnable,
213     ENGINE_DESCRIPTOR_TYPE  *pEngDescUc,
214     ENGINE_DESCRIPTOR_TYPE  *pEngDescBc
215 )
216 {
217     NVSWITCH_ASSERT(pFlcnable->pHal->fetchEngines != (void *)0);
218     pFlcnable->pHal->fetchEngines(device, pFlcnable, pEngDescUc, pEngDescBc);
219 }
220