1 /*
2 * edma3resmgr.h
3 *
4 * EDMA3 Resource Manager Internal header file.
5 *
6 * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
7 *
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the
19 * distribution.
20 *
21 * Neither the name of Texas Instruments Incorporated nor the names of
22 * its contributors may be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 */
39 #ifndef _EDMA3_RES_MGR_H_
40 #define _EDMA3_RES_MGR_H_
42 /** Include Resource Manager header file */
43 #include <ti/sdo/edma3/rm/edma3_rm.h>
45 /* For the EDMA3 Register Layer functionality. */
46 #include <ti/sdo/edma3/rm/src/edma3_rl_cc.h>
47 #include <ti/sdo/edma3/rm/src/edma3_rl_tc.h>
49 #ifdef __cplusplus
50 extern "C" {
51 #endif
53 /**
54 * Number of PaRAM Sets actually present on the SoC. This will be updated
55 * while creating the Resource Manager Object.
56 */
57 extern unsigned int edma3NumPaRAMSets;
60 /** Define for setting all bits of the EDMA3 Controller Registers */
61 #define EDMA3_RM_SET_ALL_BITS (0xFFFFFFFFu)
63 /* Other Mask defines */
64 /** DCHMAP-PaRAMEntry bitfield Clear */
65 #define EDMA3_RM_DCH_PARAM_CLR_MASK (~EDMA3_CCRL_DCHMAP_PAENTRY_MASK)
66 /** DCHMAP-PaRAMEntry bitfield Set */
67 #define EDMA3_RM_DCH_PARAM_SET_MASK(paRAMId) (((EDMA3_CCRL_DCHMAP_PAENTRY_MASK >> EDMA3_CCRL_DCHMAP_PAENTRY_SHIFT) & (paRAMId)) << EDMA3_CCRL_DCHMAP_PAENTRY_SHIFT)
68 /** QCHMAP-PaRAMEntry bitfield Clear */
69 #define EDMA3_RM_QCH_PARAM_CLR_MASK (~EDMA3_CCRL_QCHMAP_PAENTRY_MASK)
70 /** QCHMAP-PaRAMEntry bitfield Set */
71 #define EDMA3_RM_QCH_PARAM_SET_MASK(trWord) (((EDMA3_CCRL_QCHMAP_PAENTRY_MASK >> EDMA3_CCRL_QCHMAP_PAENTRY_SHIFT) & (trWord)) << EDMA3_CCRL_QCHMAP_PAENTRY_SHIFT)
72 /** QCHMAP-TrigWord bitfield Clear */
73 #define EDMA3_RM_QCH_TRWORD_CLR_MASK (~EDMA3_CCRL_QCHMAP_TRWORD_MASK)
74 /** QCHMAP-TrigWord bitfield Set */
75 #define EDMA3_RM_QCH_TRWORD_SET_MASK(paRAMId) (((EDMA3_CCRL_QCHMAP_TRWORD_MASK >> EDMA3_CCRL_QCHMAP_TRWORD_SHIFT) & (paRAMId)) << EDMA3_CCRL_QCHMAP_TRWORD_SHIFT)
76 /** QUEPRI bits Clear */
77 #define EDMA3_RM_QUEPRI_CLR_MASK(queNum) (~(EDMA3_CCRL_QUEPRI_PRIQ0_MASK << ((queNum) * EDMA3_CCRL_QUEPRI_PRIQ1_SHIFT)))
78 /** QUEPRI bits Set */
79 #define EDMA3_RM_QUEPRI_SET_MASK(queNum,quePri) ((EDMA3_CCRL_QUEPRI_PRIQ0_MASK & (quePri)) << ((queNum) * EDMA3_CCRL_QUEPRI_PRIQ1_SHIFT))
80 /** QUEWMTHR bits Clear */
81 #define EDMA3_RM_QUEWMTHR_CLR_MASK(queNum) (~(EDMA3_CCRL_QWMTHRA_Q0_MASK << ((queNum) * EDMA3_CCRL_QWMTHRA_Q1_SHIFT)))
82 /** QUEWMTHR bits Set */
83 #define EDMA3_RM_QUEWMTHR_SET_MASK(queNum,queThr) ((EDMA3_CCRL_QWMTHRA_Q0_MASK & (queThr)) << ((queNum) * EDMA3_CCRL_QWMTHRA_Q1_SHIFT))
85 /** OPT-TCC bitfield Clear */
86 #define EDMA3_RM_OPT_TCC_CLR_MASK (~EDMA3_CCRL_OPT_TCC_MASK)
87 /** OPT-TCC bitfield Set */
88 #define EDMA3_RM_OPT_TCC_SET_MASK(tcc) (((EDMA3_CCRL_OPT_TCC_MASK >> EDMA3_CCRL_OPT_TCC_SHIFT) & (tcc)) << EDMA3_CCRL_OPT_TCC_SHIFT)
90 /** PaRAM Set Entry for Link and B count Reload field */
91 #define EDMA3_RM_PARAM_ENTRY_LINK_BCNTRLD (5u)
93 /** To maintain the state of the EDMA3 Resource Manager Object */
94 typedef enum {
95 /** Object deleted */
96 EDMA3_RM_DELETED = 0,
97 /** Obect Created */
98 EDMA3_RM_CREATED = 1,
99 /** Object Opened */
100 EDMA3_RM_OPENED = 2,
101 /** Object Closed */
102 EDMA3_RM_CLOSED = 3
103 } EDMA3_RM_ObjState;
105 /**
106 * \brief EDMA3 Hardware Instance Configuration Structure.
107 *
108 * Used to maintain information of the EDMA3 HW configuration.
109 * One such storage exists for each instance of the EDMA 3 HW.
110 */
111 typedef struct
112 {
113 /** HW Instance Id of the EDMA3 Controller */
114 unsigned int phyCtrllerInstId;
116 /** State information of the Resource Manager object */
117 EDMA3_RM_ObjState state;
119 /** Number of active opens of RM Instances */
120 unsigned int numOpens;
122 /**
123 * \brief Init-time Configuration structure for EDMA3
124 * controller, to provide Global SoC specific Information.
125 *
126 * This configuration will can be provided by the user at run-time,
127 * while calling EDMA3_RM_create().
128 */
129 EDMA3_RM_GblConfigParams gblCfgParams;
130 } EDMA3_RM_Obj;
133 /**
134 * \brief EDMA3 RM Instance Specific Configuration Structure.
135 *
136 * Used to maintain information of the EDMA3 Res Mgr instances.
137 * One such storage exists for each instance of the EDMA3 Res Mgr.
138 *
139 * Maximum EDMA3_MAX_RM_INSTANCES instances are allowed for
140 * each EDMA3 hardware instance, for same or different shadow regions.
141 */
142 typedef struct
143 {
144 /**
145 * Configuration such as region id, IsMaster, Callback function
146 * This configuration is passed to the "Open" API.
147 * For a single EDMA3 HW controller, there can be EDMA3_MAX_REGIONS
148 * different instances tied to different regions.
149 */
150 EDMA3_RM_Param initParam;
152 /** Pointer to appropriate Shadow Register region of CC Registers */
153 EDMA3_CCRL_ShadowRegs *shadowRegs;
155 /**
156 * Pointer to the EDMA3 RM Object (HW specific)
157 * opened by RM instance.
158 */
159 EDMA3_RM_Obj *pResMgrObjHandle;
161 /** Available DMA Channels to the RM Instance */
162 unsigned int avlblDmaChannels[EDMA3_MAX_DMA_CHAN_DWRDS];
164 /** Available QDMA Channels to the RM Instance */
165 unsigned int avlblQdmaChannels[EDMA3_MAX_QDMA_CHAN_DWRDS];
167 /** Available PaRAM Sets to the RM Instance */
168 unsigned int avlblPaRAMSets[EDMA3_MAX_PARAM_DWRDS];
170 /** Available TCCs to the RM Instance */
171 unsigned int avlblTccs[EDMA3_MAX_TCC_DWRDS];
173 /**
174 * Sometimes, PaRAM clearing is not required for some particular RM
175 * Instances. In that case, PaRAM Sets allocated will NOT be cleared before
176 * allocating to any particular user. It is the responsibility of user
177 * to program it accordingly, without assuming anything for a specific
178 * field because the PaRAM Set might contain junk values. Not programming
179 * it fully might result in erroneous behavior.
180 * On the other hand, RM instances can also use this variable to get the
181 * PaRAM Sets cleared before allocating them to the specific user.
182 * User can program only the selected fields in this case.
183 *
184 * Value '0' : PaRAM Sets will NOT be cleared during their allocation.
185 * Value '1' : PaRAM Sets will be cleared during their allocation.
186 *
187 * This value can be modified using the IOCTL commands.
188 */
189 unsigned int paramInitRequired;
191 /**
192 * Sometimes, global EDMA3 registers (DCHMAP/QCHMAP) and PaRAM Sets should
193 * not be modified during EDMA3_RM_allocLogicalChannel (), for some particular RM
194 * Instances. In that case, it is the responsibility of user
195 * to program them accordingly, when needed, without assuming anything because
196 * they might contain junk values. Not programming
197 * the registers/PaRAMs fully might result in erroneous behavior.
198 * On the other hand, RM instances can also use this variable to get the
199 * global registers and PaRAM Sets minimally programmed before allocating them to
200 * the specific user.
201 * User can program only the remaining fields in this case.
202 *
203 * Value '0' : EDMA3 registers (DCHMAP/QCHMAP) and PaRAM Sets will NOT be
204 * programmed during their allocation.
205 * Value '1' : EDMA3 registers (DCHMAP/QCHMAP) and PaRAM Sets will be
206 * programmed during their allocation.
207 *
208 * This value can be modified using the IOCTL commands.
209 */
210 unsigned int regModificationRequired;
211 /**
212 * Pointer to the user defined function for mapping cross bar events to
213 * channel.
214 */
215 EDMA3_RM_mapXbarEvtToChan mapXbarToChan;
217 /**
218 * Pointer to the user defined function for configuring the cross bar
219 * events to appropriate channel in the Control Config TPCC Event Config
220 * registers.
221 */
222 EDMA3_RM_xbarConfigScr configScrMapXbarToEvt;
224 /**
225 * Pointer to the configuration data structure for
226 * mapping cross bar events to channel.
227 */
228 EDMA3_RM_GblXbarToChanConfigParams rmXbarToEvtMapConfig;
229 }EDMA3_RM_Instance;
231 /**
232 * \brief EDMA3 Channel-Bound resources.
233 *
234 * Used to maintain information of the EDMA3 resources
235 * (specifically Parameter RAM set and TCC), bound to the
236 * particular channel within EDMA3_RM_allocLogicalChannel ().
237 */
238 typedef struct {
239 /** PaRAM Set number associated with the particular channel */
240 int paRAMId;
242 /** TCC associated with the particular channel */
243 unsigned int tcc;
244 } EDMA3_RM_ChBoundResources;
246 /**
247 * \brief TCC Callback - Caters to channel specific status reporting.
248 */
249 typedef struct {
250 /** Callback function */
251 EDMA3_RM_TccCallback tccCb;
253 /** Callback data, passed to the Callback function */
254 void *cbData;
255 } EDMA3_RM_TccCallbackParams;
258 #ifdef __cplusplus
259 }
260 #endif /* extern "C" */
262 #endif /* _EDMA3_RES_MGR_H_ */