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