blob: ec78b9da020fb169be6e8f7d84285efd39a0df58 [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 */
Richard Fitzgeralda23ebba2016-11-09 17:14:18 +000030#define WMFW_CTL_TYPE_ACKED 0x1000 /* acked control */
Richard Fitzgeraldf4f0c4c2016-11-09 17:14:17 +000031#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */
32
Mark Browne10f8712012-10-04 16:31:52 +010033struct wmfw_header {
34 char magic[4];
35 __le32 len;
36 __le16 rev;
37 u8 core;
38 u8 ver;
39} __packed;
40
41struct wmfw_footer {
42 __le64 timestamp;
43 __le32 checksum;
44} __packed;
45
46struct wmfw_adsp1_sizes {
47 __le32 dm;
48 __le32 pm;
49 __le32 zm;
50} __packed;
51
Mark Brown2159ad932012-10-11 11:54:02 +090052struct wmfw_adsp2_sizes {
53 __le32 xm;
54 __le32 ym;
55 __le32 pm;
56 __le32 zm;
57} __packed;
58
Mark Browne10f8712012-10-04 16:31:52 +010059struct wmfw_region {
60 union {
61 __be32 type;
62 __le32 offset;
63 };
64 __le32 len;
65 u8 data[];
66} __packed;
67
Mark Brown6e87bad2012-10-05 19:43:18 +010068struct wmfw_id_hdr {
69 __be32 core_id;
70 __be32 core_rev;
71 __be32 id;
72 __be32 ver;
73} __packed;
74
75struct wmfw_adsp1_id_hdr {
76 struct wmfw_id_hdr fw;
77 __be32 zm;
78 __be32 dm;
Charles Keepax3809f002015-04-13 13:27:54 +010079 __be32 n_algs;
Mark Brown6e87bad2012-10-05 19:43:18 +010080} __packed;
81
Mark Brown2159ad932012-10-11 11:54:02 +090082struct wmfw_adsp2_id_hdr {
83 struct wmfw_id_hdr fw;
84 __be32 zm;
85 __be32 xm;
86 __be32 ym;
Charles Keepax3809f002015-04-13 13:27:54 +010087 __be32 n_algs;
Mark Brown2159ad932012-10-11 11:54:02 +090088} __packed;
89
Mark Brown6e87bad2012-10-05 19:43:18 +010090struct wmfw_alg_hdr {
91 __be32 id;
92 __be32 ver;
93} __packed;
94
95struct wmfw_adsp1_alg_hdr {
96 struct wmfw_alg_hdr alg;
97 __be32 zm;
98 __be32 dm;
99} __packed;
100
Mark Brown2159ad932012-10-11 11:54:02 +0900101struct wmfw_adsp2_alg_hdr {
102 struct wmfw_alg_hdr alg;
103 __be32 zm;
104 __be32 xm;
105 __be32 ym;
106} __packed;
107
Charles Keepax23237362015-04-13 13:28:02 +0100108struct wmfw_adsp_alg_data {
109 __le32 id;
110 u8 name[WMFW_MAX_ALG_NAME];
111 u8 descr[WMFW_MAX_ALG_DESCR_NAME];
112 __le32 ncoeff;
113 u8 data[];
114} __packed;
115
116struct wmfw_adsp_coeff_data {
117 struct {
118 __le16 offset;
119 __le16 type;
120 __le32 size;
121 } hdr;
122 u8 name[WMFW_MAX_COEFF_NAME];
123 u8 descr[WMFW_MAX_COEFF_DESCR_NAME];
124 __le16 ctl_type;
125 __le16 flags;
126 __le32 len;
127 u8 data[];
128} __packed;
129
Mark Brown6e87bad2012-10-05 19:43:18 +0100130struct wmfw_coeff_hdr {
131 u8 magic[4];
132 __le32 len;
Mark Brownc7123262013-01-16 16:59:04 +0900133 union {
134 __be32 rev;
135 __le32 ver;
136 };
137 union {
138 __be32 core;
139 __le32 core_ver;
140 };
Mark Brown6e87bad2012-10-05 19:43:18 +0100141 u8 data[];
142} __packed;
143
144struct wmfw_coeff_item {
Mark Brownc7123262013-01-16 16:59:04 +0900145 __le16 offset;
146 __le16 type;
Mark Brown6e87bad2012-10-05 19:43:18 +0100147 __le32 id;
148 __le32 ver;
149 __le32 sr;
150 __le32 len;
151 u8 data[];
152} __packed;
Mark Brown2159ad932012-10-11 11:54:02 +0900153
Mark Browne10f8712012-10-04 16:31:52 +0100154#define WMFW_ADSP1 1
Mark Brown2159ad932012-10-11 11:54:02 +0900155#define WMFW_ADSP2 2
Mark Browne10f8712012-10-04 16:31:52 +0100156
Charles Keepax23237362015-04-13 13:28:02 +0100157#define WMFW_ABSOLUTE 0xf0
158#define WMFW_ALGORITHM_DATA 0xf2
159#define WMFW_NAME_TEXT 0xfe
160#define WMFW_INFO_TEXT 0xff
Mark Browne10f8712012-10-04 16:31:52 +0100161
162#define WMFW_ADSP1_PM 2
163#define WMFW_ADSP1_DM 3
164#define WMFW_ADSP1_ZM 4
165
Mark Brown2159ad932012-10-11 11:54:02 +0900166#define WMFW_ADSP2_PM 2
167#define WMFW_ADSP2_ZM 4
168#define WMFW_ADSP2_XM 5
169#define WMFW_ADSP2_YM 6
170
Mark Browne10f8712012-10-04 16:31:52 +0100171#endif