blob: 252044d421b3c118997a3487934f0c5ede78644a [file] [log] [blame]
Steve Muckle0a9c0872022-02-16 05:58:07 +00001/*******************************************************************************
2* Copyright (C) 2018 Cadence Design Systems, Inc.
3*
4* Permission is hereby granted, free of charge, to any person obtaining
5* a copy of this software and associated documentation files (the
6* "Software"), to use this Software with Cadence processor cores only and
7* not with any other processors and platforms, subject to
8* the following conditions:
9*
10* The above copyright notice and this permission notice shall be included
11* in all copies or substantial portions of the Software.
12*
13* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
17* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21******************************************************************************/
22
23/*******************************************************************************
24 * xa-class-base.h
25 *
26 * Generic Xtensa Audio codecs interfaces
27 *
28 ******************************************************************************/
29
30#ifndef __XA_CLASS_BASE_H
31#define __XA_CLASS_BASE_H
32
33/*******************************************************************************
34 * Includes
35 ******************************************************************************/
36
37/* ...audio-specific API */
38#include "audio/xa_type_def.h"
39#include "audio/xa_error_standards.h"
40#include "audio/xa_apicmd_standards.h"
41#include "audio/xa_memory_standards.h"
42
43/*******************************************************************************
44 * Generic codec structure
45 ******************************************************************************/
46
47typedef struct XACodecBase XACodecBase;
48
49/* ...memory buffer initialization */
50typedef XA_ERRORCODE (*xa_codec_memtab_f)(XACodecBase *codec, WORD32 i, WORD32 type, WORD32 size, WORD32 align, u32 core);
51
52/* ...preprocessing operation */
53typedef XA_ERRORCODE (*xa_codec_preprocess_f)(XACodecBase *);
54
55/* ...postprocessing operation */
56typedef XA_ERRORCODE (*xa_codec_postprocess_f)(XACodecBase *, int);
57
58/* ...parameter setting function */
59typedef XA_ERRORCODE (*xa_codec_setparam_f)(XACodecBase *, WORD32, pVOID p);
60
61/* ...parameter retrival function */
62typedef XA_ERRORCODE (*xa_codec_getparam_f)(XACodecBase *, WORD32, pVOID p);
63
64/*******************************************************************************
65 * Codec instance structure
66 ******************************************************************************/
67
68struct XACodecBase
69{
70 /***************************************************************************
71 * Control data
72 **************************************************************************/
73
74 /* ...generic component handle */
75 xf_component_t component;
76
77 /* ...codec API entry point (function) */
78 xa_codec_func_t *process;
79
80 /* ...codec API handle, passed to *process */
81 xf_mm_buffer_t api;
82
83 /* ...memory table buffer */
84 xf_mm_buffer_t mem_tabs;
85
86 /* ...persistent memory buffer */
87 xf_mm_buffer_t persist;
88
89 /* ...scratch memory pointer */
90 void *scratch;
91
92 /* ...codec control state */
93 u32 state;
94
95 /***************************************************************************
96 * Codec-specific methods
97 **************************************************************************/
98
99 /* ...memory buffer initialization */
100 xa_codec_memtab_f memtab;
101
102 /* ...preprocessing function */
103 xa_codec_preprocess_f preprocess;
104
105 /* ...postprocessing function */
106 xa_codec_postprocess_f postprocess;
107
108 /* ...configuration parameter setting function */
109 xa_codec_setparam_f setparam;
110
111 /* ...configuration parameter retrieval function */
112 xa_codec_getparam_f getparam;
113
114 /* ...command-processing table */
115 XA_ERRORCODE (* const * command)(XACodecBase *, xf_message_t *);
116
117 /* ...command-processing table size */
118 u32 command_num;
119};
120
121/*******************************************************************************
122 * Base codec execution flags
123 ******************************************************************************/
124
125/* ...codec static initialization completed */
126#define XA_BASE_FLAG_POSTINIT (1 << 0)
127
128/* ...codec runtime initialization sequence */
129#define XA_BASE_FLAG_RUNTIME_INIT (1 << 1)
130
131/* ...codec steady execution state */
132#define XA_BASE_FLAG_EXECUTION (1 << 2)
133
134/* ...execution stage completed */
135#define XA_BASE_FLAG_COMPLETED (1 << 3)
136
137/* ...data processing scheduling flag */
138#define XA_BASE_FLAG_SCHEDULE (1 << 4)
139
140/* ...base codec flags accessor */
141#define __XA_BASE_FLAGS(flags) ((flags) & ((1 << 5) - 1))
142
143/* ...custom execution flag */
144#define __XA_BASE_FLAG(f) ((f) << 5)
145
146/*******************************************************************************
147 * Local macros definitions
148 ******************************************************************************/
149
150/* ...audio-framework API function execution */
151#define XA_CHK(cond) \
152({ \
153 XA_ERRORCODE __e = (cond); \
154 if (__e != XA_NO_ERROR) \
155 { \
156 if (XA_ERROR_SEVERITY(__e)) \
157 { \
158 TRACE(ERROR, _x("error: %X"), __e); \
159 return __e; \
160 } \
161 TRACE(WARNING, _x("warning: %X"), __e); \
162 } \
163 __e; \
164})
165
166/* ...low-level codec API function execution */
167#define XA_API(codec, cmd, idx, pv) \
168({ \
169 XA_ERRORCODE __e; \
170 __e = (codec)->process((xa_codec_handle_t)(codec)->api.addr, (cmd), (idx), (pv)); \
171 if (__e != XA_NO_ERROR) \
172 { \
173 if (XA_ERROR_SEVERITY(__e)) \
174 { \
175 TRACE(ERROR, _x("[%p]:(%d, %d, %p): %X"), (codec), (cmd), (idx), (pv), __e); \
176 return __e; \
177 } \
178 TRACE(WARNING, _x("%X"), __e); \
179 } \
180 __e; \
181})
182
183#define XA_API_NORET(codec, cmd, idx, pv) \
184({ \
185 XA_ERRORCODE __e; \
186 __e = (codec)->process((xa_codec_handle_t)(codec)->api.addr, (cmd), (idx), (pv)); \
187 if (__e != XA_NO_ERROR) \
188 { \
189 if (XA_ERROR_SEVERITY(__e)) \
190 { \
191 TRACE(ERROR, _x("[%p]:(%d, %d, %p): %X"), (codec), (cmd), (idx), (pv), __e); \
192 } \
193 TRACE(WARNING, _x("%X"), __e); \
194 } \
195 __e; \
196})
197
198/* ...codec hook invocation */
199#define CODEC_API(codec, func, ...) \
200({ \
201 XA_ERRORCODE __e = (codec)->func((codec), ##__VA_ARGS__); \
202 \
203 if (__e != XA_NO_ERROR) \
204 { \
205 if (XA_ERROR_SEVERITY(__e)) \
206 { \
207 /* ...actual error is reported by the codec */ \
208 TRACE(ERROR, _x("[%p]: " #func ": %X"), (codec), __e); \
209 return __e; \
210 } \
211 \
212 TRACE(WARNING, _x("warning: %X"), __e); \
213 } \
214 __e; \
215})
216
217/* ...allocate local memory on specific core */
218#define XMALLOC(p, size, align, core) \
219do \
220{ \
221 if (xf_mm_alloc_buffer((size), (align), (core), (p)) != 0) \
222 { \
223 TRACE(ERROR, _x("Failed to allocate %d bytes of memory"), (size)); \
224 return XA_API_FATAL_MEM_ALLOC; \
225 } \
226 \
227 if (((u32)((p)->addr) & ((align) - 1)) != 0) \
228 { \
229 TRACE(ERROR, _x("Invalid %d-algnment: %p"), (align), (p)->addr); \
230 return XA_API_FATAL_MEM_ALIGN; \
231 } \
232} \
233while (0)
234
235/*******************************************************************************
236 * Public API
237 ******************************************************************************/
238
239/* ...SET-PARAM processing */
240extern XA_ERRORCODE xa_base_set_param(XACodecBase *base, xf_message_t *m);
241
242/* ...GET-PARAM-EXT message processing */
243extern XA_ERRORCODE xa_base_set_param_ext(XACodecBase *base, xf_message_t *m);
244
245/* ...GET-PARAM message processing */
246extern XA_ERRORCODE xa_base_get_param(XACodecBase *base, xf_message_t *m);
247
248/* ...GET-PARAM-EXT message processing */
249extern XA_ERRORCODE xa_base_get_param_ext(XACodecBase *base, xf_message_t *m);
250
251/* ...data processing scheduling */
252extern void xa_base_schedule(XACodecBase *base, u32 dts);
253
254/* ...cancel internal scheduling message */
255extern void xa_base_cancel(XACodecBase *base);
256
257/* ...base codec factory */
258extern XACodecBase * xa_base_factory(u32 core, u32 size, xa_codec_func_t process);
259
260/* ...base codec destructor */
261extern void xa_base_destroy(XACodecBase *base, u32 size, u32 core);
262
263#endif /* __XA_CLASS_BASE_H */