1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * wmfw.h - Wolfson firmware format information
4 *
5 * Copyright 2012 Wolfson Microelectronics plc
6 *
7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
8 */
9
10#ifndef __WMFW_H
11#define __WMFW_H
12
13#include <linux/types.h>
14
15#define WMFW_MAX_ALG_NAME 256
16#define WMFW_MAX_ALG_DESCR_NAME 256
17
18#define WMFW_MAX_COEFF_NAME 256
19#define WMFW_MAX_COEFF_DESCR_NAME 256
20
21#define WMFW_CTL_FLAG_SYS 0x8000
22#define WMFW_CTL_FLAG_VOLATILE 0x0004
23#define WMFW_CTL_FLAG_WRITEABLE 0x0002
24#define WMFW_CTL_FLAG_READABLE 0x0001
25
26#define WMFW_CTL_TYPE_BYTES 0x0004 /* byte control */
27
28/* Non-ALSA coefficient types start at 0x1000 */
29#define WMFW_CTL_TYPE_ACKED 0x1000 /* acked control */
30#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */
31#define WMFW_CTL_TYPE_HOST_BUFFER 0x1002 /* host buffer pointer */
32#define WMFW_CTL_TYPE_FWEVENT 0x1004 /* firmware event control */
33
34struct wmfw_header {
35 char magic[4];
36 __le32 len;
37 __le16 rev;
38 u8 core;
39 u8 ver;
40} __packed;
41
42struct wmfw_footer {
43 __le64 timestamp;
44 __le32 checksum;
45} __packed;
46
47struct wmfw_adsp1_sizes {
48 __le32 dm;
49 __le32 pm;
50 __le32 zm;
51} __packed;
52
53struct wmfw_adsp2_sizes {
54 __le32 xm;
55 __le32 ym;
56 __le32 pm;
57 __le32 zm;
58} __packed;
59
60struct wmfw_region {
61 union {
62 __be32 type;
63 __le32 offset;
64 };
65 __le32 len;
66 u8 data[];
67} __packed;
68
69struct wmfw_id_hdr {
70 __be32 core_id;
71 __be32 core_rev;
72 __be32 id;
73 __be32 ver;
74} __packed;
75
76struct wmfw_v3_id_hdr {
77 __be32 core_id;
78 __be32 block_rev;
79 __be32 vendor_id;
80 __be32 id;
81 __be32 ver;
82} __packed;
83
84struct wmfw_adsp1_id_hdr {
85 struct wmfw_id_hdr fw;
86 __be32 zm;
87 __be32 dm;
88 __be32 n_algs;
89} __packed;
90
91struct wmfw_adsp2_id_hdr {
92 struct wmfw_id_hdr fw;
93 __be32 zm;
94 __be32 xm;
95 __be32 ym;
96 __be32 n_algs;
97} __packed;
98
99struct wmfw_halo_id_hdr {
100 struct wmfw_v3_id_hdr fw;
101 __be32 xm_base;
102 __be32 xm_size;
103 __be32 ym_base;
104 __be32 ym_size;
105 __be32 n_algs;
106} __packed;
107
108struct wmfw_alg_hdr {
109 __be32 id;
110 __be32 ver;
111} __packed;
112
113struct wmfw_adsp1_alg_hdr {
114 struct wmfw_alg_hdr alg;
115 __be32 zm;
116 __be32 dm;
117} __packed;
118
119struct wmfw_adsp2_alg_hdr {
120 struct wmfw_alg_hdr alg;
121 __be32 zm;
122 __be32 xm;
123 __be32 ym;
124} __packed;
125
126struct wmfw_halo_alg_hdr {
127 struct wmfw_alg_hdr alg;
128 __be32 xm_base;
129 __be32 xm_size;
130 __be32 ym_base;
131 __be32 ym_size;
132} __packed;
133
134struct wmfw_adsp_alg_data {
135 __le32 id;
136 u8 name[WMFW_MAX_ALG_NAME];
137 u8 descr[WMFW_MAX_ALG_DESCR_NAME];
138 __le32 ncoeff;
139 u8 data[];
140} __packed;
141
142struct wmfw_adsp_coeff_data {
143 struct {
144 __le16 offset;
145 __le16 type;
146 __le32 size;
147 } hdr;
148 u8 name[WMFW_MAX_COEFF_NAME];
149 u8 descr[WMFW_MAX_COEFF_DESCR_NAME];
150 __le16 ctl_type;
151 __le16 flags;
152 __le32 len;
153 u8 data[];
154} __packed;
155
156struct wmfw_coeff_hdr {
157 u8 magic[4];
158 __le32 len;
159 union {
160 __be32 rev;
161 __le32 ver;
162 };
163 union {
164 __be32 core;
165 __le32 core_ver;
166 };
167 u8 data[];
168} __packed;
169
170struct wmfw_coeff_item {
171 __le16 offset;
172 __le16 type;
173 __le32 id;
174 __le32 ver;
175 __le32 sr;
176 __le32 len;
177 u8 data[];
178} __packed;
179
180#define WMFW_ADSP1 1
181#define WMFW_ADSP2 2
182#define WMFW_HALO 4
183
184#define WMFW_ABSOLUTE 0xf0
185#define WMFW_ALGORITHM_DATA 0xf2
186#define WMFW_METADATA 0xfc
187#define WMFW_NAME_TEXT 0xfe
188#define WMFW_INFO_TEXT 0xff
189
190#define WMFW_ADSP1_PM 2
191#define WMFW_ADSP1_DM 3
192#define WMFW_ADSP1_ZM 4
193
194#define WMFW_ADSP2_PM 2
195#define WMFW_ADSP2_ZM 4
196#define WMFW_ADSP2_XM 5
197#define WMFW_ADSP2_YM 6
198
199#define WMFW_HALO_PM_PACKED 0x10
200#define WMFW_HALO_XM_PACKED 0x11
201#define WMFW_HALO_YM_PACKED 0x12
202
203#endif
204

source code of linux/include/linux/firmware/cirrus/wmfw.h