blob: 892fc7490f3bd7a035e13e7a63cd1e3bd8ca71d1 [file] [log] [blame]
Mark Browne10f8712012-10-04 16:31:52 +01001/*
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
Charles Keepax23237362015-04-13 13:28:02 +010018#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
Charles Keepax26c22a12015-04-20 13:52:45 +010024#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
Richard Fitzgeraldf4f0c4c2016-11-09 17:14:17 +000029/* Non-ALSA coefficient types start at 0x1000 */
30#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */
31
Mark Browne10f8712012-10-04 16:31:52 +010032struct wmfw_header {
33 char magic[4];
34 __le32 len;
35 __le16 rev;
36 u8 core;
37 u8 ver;
38} __packed;
39
40struct wmfw_footer {
41 __le64 timestamp;
42 __le32 checksum;
43} __packed;
44
45struct wmfw_adsp1_sizes {
46 __le32 dm;
47 __le32 pm;
48 __le32 zm;
49} __packed;
50
Mark Brown2159ad932012-10-11 11:54:02 +090051struct wmfw_adsp2_sizes {
52 __le32 xm;
53 __le32 ym;
54 __le32 pm;
55 __le32 zm;
56} __packed;
57
Mark Browne10f8712012-10-04 16:31:52 +010058struct wmfw_region {
59 union {
60 __be32 type;
61 __le32 offset;
62 };
63 __le32 len;
64 u8 data[];
65} __packed;
66
Mark Brown6e87bad2012-10-05 19:43:18 +010067struct wmfw_id_hdr {
68 __be32 core_id;
69 __be32 core_rev;
70 __be32 id;
71 __be32 ver;
72} __packed;
73
74struct wmfw_adsp1_id_hdr {
75 struct wmfw_id_hdr fw;
76 __be32 zm;
77 __be32 dm;
Charles Keepax3809f002015-04-13 13:27:54 +010078 __be32 n_algs;
Mark Brown6e87bad2012-10-05 19:43:18 +010079} __packed;
80
Mark Brown2159ad932012-10-11 11:54:02 +090081struct wmfw_adsp2_id_hdr {
82 struct wmfw_id_hdr fw;
83 __be32 zm;
84 __be32 xm;
85 __be32 ym;
Charles Keepax3809f002015-04-13 13:27:54 +010086 __be32 n_algs;
Mark Brown2159ad932012-10-11 11:54:02 +090087} __packed;
88
Mark Brown6e87bad2012-10-05 19:43:18 +010089struct wmfw_alg_hdr {
90 __be32 id;
91 __be32 ver;
92} __packed;
93
94struct wmfw_adsp1_alg_hdr {
95 struct wmfw_alg_hdr alg;
96 __be32 zm;
97 __be32 dm;
98} __packed;
99
Mark Brown2159ad932012-10-11 11:54:02 +0900100struct wmfw_adsp2_alg_hdr {
101 struct wmfw_alg_hdr alg;
102 __be32 zm;
103 __be32 xm;
104 __be32 ym;
105} __packed;
106
Charles Keepax23237362015-04-13 13:28:02 +0100107struct wmfw_adsp_alg_data {
108 __le32 id;
109 u8 name[WMFW_MAX_ALG_NAME];
110 u8 descr[WMFW_MAX_ALG_DESCR_NAME];
111 __le32 ncoeff;
112 u8 data[];
113} __packed;
114
115struct wmfw_adsp_coeff_data {
116 struct {
117 __le16 offset;
118 __le16 type;
119 __le32 size;
120 } hdr;
121 u8 name[WMFW_MAX_COEFF_NAME];
122 u8 descr[WMFW_MAX_COEFF_DESCR_NAME];
123 __le16 ctl_type;
124 __le16 flags;
125 __le32 len;
126 u8 data[];
127} __packed;
128
Mark Brown6e87bad2012-10-05 19:43:18 +0100129struct wmfw_coeff_hdr {
130 u8 magic[4];
131 __le32 len;
Mark Brownc7123262013-01-16 16:59:04 +0900132 union {
133 __be32 rev;
134 __le32 ver;
135 };
136 union {
137 __be32 core;
138 __le32 core_ver;
139 };
Mark Brown6e87bad2012-10-05 19:43:18 +0100140 u8 data[];
141} __packed;
142
143struct wmfw_coeff_item {
Mark Brownc7123262013-01-16 16:59:04 +0900144 __le16 offset;
145 __le16 type;
Mark Brown6e87bad2012-10-05 19:43:18 +0100146 __le32 id;
147 __le32 ver;
148 __le32 sr;
149 __le32 len;
150 u8 data[];
151} __packed;
Mark Brown2159ad932012-10-11 11:54:02 +0900152
Mark Browne10f8712012-10-04 16:31:52 +0100153#define WMFW_ADSP1 1
Mark Brown2159ad932012-10-11 11:54:02 +0900154#define WMFW_ADSP2 2
Mark Browne10f8712012-10-04 16:31:52 +0100155
Charles Keepax23237362015-04-13 13:28:02 +0100156#define WMFW_ABSOLUTE 0xf0
157#define WMFW_ALGORITHM_DATA 0xf2
158#define WMFW_NAME_TEXT 0xfe
159#define WMFW_INFO_TEXT 0xff
Mark Browne10f8712012-10-04 16:31:52 +0100160
161#define WMFW_ADSP1_PM 2
162#define WMFW_ADSP1_DM 3
163#define WMFW_ADSP1_ZM 4
164
Mark Brown2159ad932012-10-11 11:54:02 +0900165#define WMFW_ADSP2_PM 2
166#define WMFW_ADSP2_ZM 4
167#define WMFW_ADSP2_XM 5
168#define WMFW_ADSP2_YM 6
169
Mark Browne10f8712012-10-04 16:31:52 +0100170#endif