1 /*
2  * wmfw.h - Wolfson firmware format information
3  *
4  * Copyright 2012 Wolfson Microelectronics plc
5  *
6  * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 
13 #ifndef __WMFW_H
14 #define __WMFW_H
15 
16 #include <linux/types.h>
17 
18 #define WMFW_MAX_ALG_NAME         256
19 #define WMFW_MAX_ALG_DESCR_NAME   256
20 
21 #define WMFW_MAX_COEFF_NAME       256
22 #define WMFW_MAX_COEFF_DESCR_NAME 256
23 
24 #define WMFW_CTL_FLAG_SYS         0x8000
25 #define WMFW_CTL_FLAG_VOLATILE    0x0004
26 #define WMFW_CTL_FLAG_WRITEABLE   0x0002
27 #define WMFW_CTL_FLAG_READABLE    0x0001
28 
29 /* Non-ALSA coefficient types start at 0x1000 */
30 #define WMFW_CTL_TYPE_ACKED       0x1000 /* acked control */
31 #define WMFW_CTL_TYPE_HOSTEVENT   0x1001 /* event control */
32 #define WMFW_CTL_TYPE_HOST_BUFFER 0x1002 /* host buffer pointer */
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_adsp1_id_hdr {
77 	struct wmfw_id_hdr fw;
78 	__be32 zm;
79 	__be32 dm;
80 	__be32 n_algs;
81 } __packed;
82 
83 struct wmfw_adsp2_id_hdr {
84 	struct wmfw_id_hdr fw;
85 	__be32 zm;
86 	__be32 xm;
87 	__be32 ym;
88 	__be32 n_algs;
89 } __packed;
90 
91 struct wmfw_alg_hdr {
92 	__be32 id;
93 	__be32 ver;
94 } __packed;
95 
96 struct wmfw_adsp1_alg_hdr {
97 	struct wmfw_alg_hdr alg;
98 	__be32 zm;
99 	__be32 dm;
100 } __packed;
101 
102 struct wmfw_adsp2_alg_hdr {
103 	struct wmfw_alg_hdr alg;
104 	__be32 zm;
105 	__be32 xm;
106 	__be32 ym;
107 } __packed;
108 
109 struct wmfw_adsp_alg_data {
110 	__le32 id;
111 	u8 name[WMFW_MAX_ALG_NAME];
112 	u8 descr[WMFW_MAX_ALG_DESCR_NAME];
113 	__le32 ncoeff;
114 	u8 data[];
115 } __packed;
116 
117 struct wmfw_adsp_coeff_data {
118 	struct {
119 		__le16 offset;
120 		__le16 type;
121 		__le32 size;
122 	} hdr;
123 	u8 name[WMFW_MAX_COEFF_NAME];
124 	u8 descr[WMFW_MAX_COEFF_DESCR_NAME];
125 	__le16 ctl_type;
126 	__le16 flags;
127 	__le32 len;
128 	u8 data[];
129 } __packed;
130 
131 struct wmfw_coeff_hdr {
132 	u8 magic[4];
133 	__le32 len;
134 	union {
135 		__be32 rev;
136 		__le32 ver;
137 	};
138 	union {
139 		__be32 core;
140 		__le32 core_ver;
141 	};
142 	u8 data[];
143 } __packed;
144 
145 struct wmfw_coeff_item {
146 	__le16 offset;
147 	__le16 type;
148 	__le32 id;
149 	__le32 ver;
150 	__le32 sr;
151 	__le32 len;
152 	u8 data[];
153 } __packed;
154 
155 #define WMFW_ADSP1 1
156 #define WMFW_ADSP2 2
157 
158 #define WMFW_ABSOLUTE         0xf0
159 #define WMFW_ALGORITHM_DATA   0xf2
160 #define WMFW_NAME_TEXT        0xfe
161 #define WMFW_INFO_TEXT        0xff
162 
163 #define WMFW_ADSP1_PM 2
164 #define WMFW_ADSP1_DM 3
165 #define WMFW_ADSP1_ZM 4
166 
167 #define WMFW_ADSP2_PM 2
168 #define WMFW_ADSP2_ZM 4
169 #define WMFW_ADSP2_XM 5
170 #define WMFW_ADSP2_YM 6
171 
172 #endif
173