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 29struct wmfw_header { 30 char magic[4]; 31 __le32 len; 32 __le16 rev; 33 u8 core; 34 u8 ver; 35} __packed; 36 37struct wmfw_footer { 38 __le64 timestamp; 39 __le32 checksum; 40} __packed; 41 42struct wmfw_adsp1_sizes { 43 __le32 dm; 44 __le32 pm; 45 __le32 zm; 46} __packed; 47 48struct wmfw_adsp2_sizes { 49 __le32 xm; 50 __le32 ym; 51 __le32 pm; 52 __le32 zm; 53} __packed; 54 55struct wmfw_region { 56 union { 57 __be32 type; 58 __le32 offset; 59 }; 60 __le32 len; 61 u8 data[]; 62} __packed; 63 64struct wmfw_id_hdr { 65 __be32 core_id; 66 __be32 core_rev; 67 __be32 id; 68 __be32 ver; 69} __packed; 70 71struct wmfw_adsp1_id_hdr { 72 struct wmfw_id_hdr fw; 73 __be32 zm; 74 __be32 dm; 75 __be32 n_algs; 76} __packed; 77 78struct wmfw_adsp2_id_hdr { 79 struct wmfw_id_hdr fw; 80 __be32 zm; 81 __be32 xm; 82 __be32 ym; 83 __be32 n_algs; 84} __packed; 85 86struct wmfw_alg_hdr { 87 __be32 id; 88 __be32 ver; 89} __packed; 90 91struct wmfw_adsp1_alg_hdr { 92 struct wmfw_alg_hdr alg; 93 __be32 zm; 94 __be32 dm; 95} __packed; 96 97struct wmfw_adsp2_alg_hdr { 98 struct wmfw_alg_hdr alg; 99 __be32 zm; 100 __be32 xm; 101 __be32 ym; 102} __packed; 103 104struct wmfw_adsp_alg_data { 105 __le32 id; 106 u8 name[WMFW_MAX_ALG_NAME]; 107 u8 descr[WMFW_MAX_ALG_DESCR_NAME]; 108 __le32 ncoeff; 109 u8 data[]; 110} __packed; 111 112struct wmfw_adsp_coeff_data { 113 struct { 114 __le16 offset; 115 __le16 type; 116 __le32 size; 117 } hdr; 118 u8 name[WMFW_MAX_COEFF_NAME]; 119 u8 descr[WMFW_MAX_COEFF_DESCR_NAME]; 120 __le16 ctl_type; 121 __le16 flags; 122 __le32 len; 123 u8 data[]; 124} __packed; 125 126struct wmfw_coeff_hdr { 127 u8 magic[4]; 128 __le32 len; 129 union { 130 __be32 rev; 131 __le32 ver; 132 }; 133 union { 134 __be32 core; 135 __le32 core_ver; 136 }; 137 u8 data[]; 138} __packed; 139 140struct wmfw_coeff_item { 141 __le16 offset; 142 __le16 type; 143 __le32 id; 144 __le32 ver; 145 __le32 sr; 146 __le32 len; 147 u8 data[]; 148} __packed; 149 150#define WMFW_ADSP1 1 151#define WMFW_ADSP2 2 152 153#define WMFW_ABSOLUTE 0xf0 154#define WMFW_ALGORITHM_DATA 0xf2 155#define WMFW_NAME_TEXT 0xfe 156#define WMFW_INFO_TEXT 0xff 157 158#define WMFW_ADSP1_PM 2 159#define WMFW_ADSP1_DM 3 160#define WMFW_ADSP1_ZM 4 161 162#define WMFW_ADSP2_PM 2 163#define WMFW_ADSP2_ZM 4 164#define WMFW_ADSP2_XM 5 165#define WMFW_ADSP2_YM 6 166 167#endif 168