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  
34  struct wmfw_header {
35  	char magic[4];
36  	__le32 len;
37  	__le16 rev;
38  	u8 core;
39  	u8 ver;
40  } __packed;
41  
42  struct wmfw_footer {
43  	__le64 timestamp;
44  	__le32 checksum;
45  } __packed;
46  
47  struct wmfw_adsp1_sizes {
48  	__le32 dm;
49  	__le32 pm;
50  	__le32 zm;
51  } __packed;
52  
53  struct wmfw_adsp2_sizes {
54  	__le32 xm;
55  	__le32 ym;
56  	__le32 pm;
57  	__le32 zm;
58  } __packed;
59  
60  struct wmfw_region {
61  	union {
62  		__be32 type;
63  		__le32 offset;
64  	};
65  	__le32 len;
66  	u8 data[];
67  } __packed;
68  
69  struct wmfw_id_hdr {
70  	__be32 core_id;
71  	__be32 core_rev;
72  	__be32 id;
73  	__be32 ver;
74  } __packed;
75  
76  struct 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  
84  struct wmfw_adsp1_id_hdr {
85  	struct wmfw_id_hdr fw;
86  	__be32 zm;
87  	__be32 dm;
88  	__be32 n_algs;
89  } __packed;
90  
91  struct 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  
99  struct 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  
108  struct wmfw_alg_hdr {
109  	__be32 id;
110  	__be32 ver;
111  } __packed;
112  
113  struct wmfw_adsp1_alg_hdr {
114  	struct wmfw_alg_hdr alg;
115  	__be32 zm;
116  	__be32 dm;
117  } __packed;
118  
119  struct wmfw_adsp2_alg_hdr {
120  	struct wmfw_alg_hdr alg;
121  	__be32 zm;
122  	__be32 xm;
123  	__be32 ym;
124  } __packed;
125  
126  struct 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  
134  struct 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  
142  struct 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  
156  struct 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  
170  struct 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