xref: /openbmc/linux/drivers/net/wireless/ath/ath6kl/bmi.h (revision 31024d99)
1bdcd8170SKalle Valo /*
2bdcd8170SKalle Valo  * Copyright (c) 2004-2011 Atheros Communications Inc.
3bdcd8170SKalle Valo  *
4bdcd8170SKalle Valo  * Permission to use, copy, modify, and/or distribute this software for any
5bdcd8170SKalle Valo  * purpose with or without fee is hereby granted, provided that the above
6bdcd8170SKalle Valo  * copyright notice and this permission notice appear in all copies.
7bdcd8170SKalle Valo  *
8bdcd8170SKalle Valo  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9bdcd8170SKalle Valo  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10bdcd8170SKalle Valo  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11bdcd8170SKalle Valo  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12bdcd8170SKalle Valo  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13bdcd8170SKalle Valo  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14bdcd8170SKalle Valo  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15bdcd8170SKalle Valo  */
16bdcd8170SKalle Valo 
17bdcd8170SKalle Valo #ifndef BMI_H
18bdcd8170SKalle Valo #define BMI_H
19bdcd8170SKalle Valo 
20bdcd8170SKalle Valo /*
21bdcd8170SKalle Valo  * Bootloader Messaging Interface (BMI)
22bdcd8170SKalle Valo  *
23bdcd8170SKalle Valo  * BMI is a very simple messaging interface used during initialization
24bdcd8170SKalle Valo  * to read memory, write memory, execute code, and to define an
25bdcd8170SKalle Valo  * application entry PC.
26bdcd8170SKalle Valo  *
27bdcd8170SKalle Valo  * It is used to download an application to ATH6KL, to provide
28bdcd8170SKalle Valo  * patches to code that is already resident on ATH6KL, and generally
29bdcd8170SKalle Valo  * to examine and modify state.  The Host has an opportunity to use
30bdcd8170SKalle Valo  * BMI only once during bootup.  Once the Host issues a BMI_DONE
31bdcd8170SKalle Valo  * command, this opportunity ends.
32bdcd8170SKalle Valo  *
33bdcd8170SKalle Valo  * The Host writes BMI requests to mailbox0, and reads BMI responses
34bdcd8170SKalle Valo  * from mailbox0.   BMI requests all begin with a command
35bdcd8170SKalle Valo  * (see below for specific commands), and are followed by
36bdcd8170SKalle Valo  * command-specific data.
37bdcd8170SKalle Valo  *
38bdcd8170SKalle Valo  * Flow control:
39bdcd8170SKalle Valo  * The Host can only issue a command once the Target gives it a
40bdcd8170SKalle Valo  * "BMI Command Credit", using ATH6KL Counter #4.  As soon as the
41bdcd8170SKalle Valo  * Target has completed a command, it issues another BMI Command
42bdcd8170SKalle Valo  * Credit (so the Host can issue the next command).
43bdcd8170SKalle Valo  *
44bdcd8170SKalle Valo  * BMI handles all required Target-side cache flushing.
45bdcd8170SKalle Valo  */
46bdcd8170SKalle Valo 
47bdcd8170SKalle Valo #define MAX_BMI_CMDBUF_SZ (BMI_DATASZ_MAX + \
48bdcd8170SKalle Valo 			   (sizeof(u32) * 3 /* cmd + addr + len */))
49bdcd8170SKalle Valo 
50bdcd8170SKalle Valo /* Maximum data size used for BMI transfers */
51bdcd8170SKalle Valo #define BMI_DATASZ_MAX                      256
52bdcd8170SKalle Valo 
53bdcd8170SKalle Valo /* BMI Commands */
54bdcd8170SKalle Valo 
55bdcd8170SKalle Valo #define BMI_NO_COMMAND                      0
56bdcd8170SKalle Valo 
57bdcd8170SKalle Valo #define BMI_DONE                            1
58bdcd8170SKalle Valo /*
59bdcd8170SKalle Valo  * Semantics: Host is done using BMI
60bdcd8170SKalle Valo  * Request format:
61bdcd8170SKalle Valo  *    u32 command (BMI_DONE)
62bdcd8170SKalle Valo  * Response format: none
63bdcd8170SKalle Valo  */
64bdcd8170SKalle Valo 
65bdcd8170SKalle Valo #define BMI_READ_MEMORY                     2
66bdcd8170SKalle Valo /*
67bdcd8170SKalle Valo  * Semantics: Host reads ATH6KL memory
68bdcd8170SKalle Valo  * Request format:
69bdcd8170SKalle Valo  *    u32 command (BMI_READ_MEMORY)
70bdcd8170SKalle Valo  *    u32 address
71bdcd8170SKalle Valo  *    u32 length, at most BMI_DATASZ_MAX
72bdcd8170SKalle Valo  * Response format:
73bdcd8170SKalle Valo  *    u8 data[length]
74bdcd8170SKalle Valo  */
75bdcd8170SKalle Valo 
76bdcd8170SKalle Valo #define BMI_WRITE_MEMORY                    3
77bdcd8170SKalle Valo /*
78bdcd8170SKalle Valo  * Semantics: Host writes ATH6KL memory
79bdcd8170SKalle Valo  * Request format:
80bdcd8170SKalle Valo  *    u32 command (BMI_WRITE_MEMORY)
81bdcd8170SKalle Valo  *    u32 address
82bdcd8170SKalle Valo  *    u32 length, at most BMI_DATASZ_MAX
83bdcd8170SKalle Valo  *    u8 data[length]
84bdcd8170SKalle Valo  * Response format: none
85bdcd8170SKalle Valo  */
86bdcd8170SKalle Valo 
87bdcd8170SKalle Valo #define BMI_EXECUTE                         4
88bdcd8170SKalle Valo /*
89bdcd8170SKalle Valo  * Semantics: Causes ATH6KL to execute code
90bdcd8170SKalle Valo  * Request format:
91bdcd8170SKalle Valo  *    u32 command (BMI_EXECUTE)
92bdcd8170SKalle Valo  *    u32 address
93bdcd8170SKalle Valo  *    u32 parameter
94bdcd8170SKalle Valo  * Response format:
95bdcd8170SKalle Valo  *    u32 return value
96bdcd8170SKalle Valo  */
97bdcd8170SKalle Valo 
98bdcd8170SKalle Valo #define BMI_SET_APP_START                   5
99bdcd8170SKalle Valo /*
100bdcd8170SKalle Valo  * Semantics: Set Target application starting address
101bdcd8170SKalle Valo  * Request format:
102bdcd8170SKalle Valo  *    u32 command (BMI_SET_APP_START)
103bdcd8170SKalle Valo  *    u32 address
104bdcd8170SKalle Valo  * Response format: none
105bdcd8170SKalle Valo  */
106bdcd8170SKalle Valo 
107bdcd8170SKalle Valo #define BMI_READ_SOC_REGISTER               6
108bdcd8170SKalle Valo /*
109bdcd8170SKalle Valo  * Semantics: Read a 32-bit Target SOC register.
110bdcd8170SKalle Valo  * Request format:
111bdcd8170SKalle Valo  *    u32 command (BMI_READ_REGISTER)
112bdcd8170SKalle Valo  *    u32 address
113bdcd8170SKalle Valo  * Response format:
114bdcd8170SKalle Valo  *    u32 value
115bdcd8170SKalle Valo  */
116bdcd8170SKalle Valo 
117bdcd8170SKalle Valo #define BMI_WRITE_SOC_REGISTER              7
118bdcd8170SKalle Valo /*
119bdcd8170SKalle Valo  * Semantics: Write a 32-bit Target SOC register.
120bdcd8170SKalle Valo  * Request format:
121bdcd8170SKalle Valo  *    u32 command (BMI_WRITE_REGISTER)
122bdcd8170SKalle Valo  *    u32 address
123bdcd8170SKalle Valo  *    u32 value
124bdcd8170SKalle Valo  *
125bdcd8170SKalle Valo  * Response format: none
126bdcd8170SKalle Valo  */
127bdcd8170SKalle Valo 
128bdcd8170SKalle Valo #define BMI_GET_TARGET_ID                  8
129bdcd8170SKalle Valo #define BMI_GET_TARGET_INFO                8
130bdcd8170SKalle Valo /*
131bdcd8170SKalle Valo  * Semantics: Fetch the 4-byte Target information
132bdcd8170SKalle Valo  * Request format:
133bdcd8170SKalle Valo  *    u32 command (BMI_GET_TARGET_ID/INFO)
134bdcd8170SKalle Valo  * Response format1 (old firmware):
135bdcd8170SKalle Valo  *    u32 TargetVersionID
136bdcd8170SKalle Valo  * Response format2 (newer firmware):
137bdcd8170SKalle Valo  *    u32 TARGET_VERSION_SENTINAL
138bdcd8170SKalle Valo  *    struct bmi_target_info;
139bdcd8170SKalle Valo  */
140bdcd8170SKalle Valo 
141bdcd8170SKalle Valo #define TARGET_VERSION_SENTINAL 0xffffffff
142bdcd8170SKalle Valo #define TARGET_TYPE_AR6003      3
14331024d99SKevin Fang #define TARGET_TYPE_AR6004      5
144bdcd8170SKalle Valo #define BMI_ROMPATCH_INSTALL               9
145bdcd8170SKalle Valo /*
146bdcd8170SKalle Valo  * Semantics: Install a ROM Patch.
147bdcd8170SKalle Valo  * Request format:
148bdcd8170SKalle Valo  *    u32 command (BMI_ROMPATCH_INSTALL)
149bdcd8170SKalle Valo  *    u32 Target ROM Address
150bdcd8170SKalle Valo  *    u32 Target RAM Address or Value (depending on Target Type)
151bdcd8170SKalle Valo  *    u32 Size, in bytes
152bdcd8170SKalle Valo  *    u32 Activate? 1-->activate;
153bdcd8170SKalle Valo  *                            0-->install but do not activate
154bdcd8170SKalle Valo  * Response format:
155bdcd8170SKalle Valo  *    u32 PatchID
156bdcd8170SKalle Valo  */
157bdcd8170SKalle Valo 
158bdcd8170SKalle Valo #define BMI_ROMPATCH_UNINSTALL             10
159bdcd8170SKalle Valo /*
160bdcd8170SKalle Valo  * Semantics: Uninstall a previously-installed ROM Patch,
161bdcd8170SKalle Valo  * automatically deactivating, if necessary.
162bdcd8170SKalle Valo  * Request format:
163bdcd8170SKalle Valo  *    u32 command (BMI_ROMPATCH_UNINSTALL)
164bdcd8170SKalle Valo  *    u32 PatchID
165bdcd8170SKalle Valo  *
166bdcd8170SKalle Valo  * Response format: none
167bdcd8170SKalle Valo  */
168bdcd8170SKalle Valo 
169bdcd8170SKalle Valo #define BMI_ROMPATCH_ACTIVATE              11
170bdcd8170SKalle Valo /*
171bdcd8170SKalle Valo  * Semantics: Activate a list of previously-installed ROM Patches.
172bdcd8170SKalle Valo  * Request format:
173bdcd8170SKalle Valo  *    u32 command (BMI_ROMPATCH_ACTIVATE)
174bdcd8170SKalle Valo  *    u32 rompatch_count
175bdcd8170SKalle Valo  *    u32 PatchID[rompatch_count]
176bdcd8170SKalle Valo  *
177bdcd8170SKalle Valo  * Response format: none
178bdcd8170SKalle Valo  */
179bdcd8170SKalle Valo 
180bdcd8170SKalle Valo #define BMI_ROMPATCH_DEACTIVATE            12
181bdcd8170SKalle Valo /*
182bdcd8170SKalle Valo  * Semantics: Deactivate a list of active ROM Patches.
183bdcd8170SKalle Valo  * Request format:
184bdcd8170SKalle Valo  *    u32 command (BMI_ROMPATCH_DEACTIVATE)
185bdcd8170SKalle Valo  *    u32 rompatch_count
186bdcd8170SKalle Valo  *    u32 PatchID[rompatch_count]
187bdcd8170SKalle Valo  *
188bdcd8170SKalle Valo  * Response format: none
189bdcd8170SKalle Valo  */
190bdcd8170SKalle Valo 
191bdcd8170SKalle Valo 
192bdcd8170SKalle Valo #define BMI_LZ_STREAM_START                13
193bdcd8170SKalle Valo /*
194bdcd8170SKalle Valo  * Semantics: Begin an LZ-compressed stream of input
195bdcd8170SKalle Valo  * which is to be uncompressed by the Target to an
196bdcd8170SKalle Valo  * output buffer at address.  The output buffer must
197bdcd8170SKalle Valo  * be sufficiently large to hold the uncompressed
198bdcd8170SKalle Valo  * output from the compressed input stream.  This BMI
199bdcd8170SKalle Valo  * command should be followed by a series of 1 or more
200bdcd8170SKalle Valo  * BMI_LZ_DATA commands.
201bdcd8170SKalle Valo  *    u32 command (BMI_LZ_STREAM_START)
202bdcd8170SKalle Valo  *    u32 address
203bdcd8170SKalle Valo  * Note: Not supported on all versions of ROM firmware.
204bdcd8170SKalle Valo  */
205bdcd8170SKalle Valo 
206bdcd8170SKalle Valo #define BMI_LZ_DATA                        14
207bdcd8170SKalle Valo /*
208bdcd8170SKalle Valo  * Semantics: Host writes ATH6KL memory with LZ-compressed
209bdcd8170SKalle Valo  * data which is uncompressed by the Target.  This command
210bdcd8170SKalle Valo  * must be preceded by a BMI_LZ_STREAM_START command. A series
211bdcd8170SKalle Valo  * of BMI_LZ_DATA commands are considered part of a single
212bdcd8170SKalle Valo  * input stream until another BMI_LZ_STREAM_START is issued.
213bdcd8170SKalle Valo  * Request format:
214bdcd8170SKalle Valo  *    u32 command (BMI_LZ_DATA)
215bdcd8170SKalle Valo  *    u32 length (of compressed data),
216bdcd8170SKalle Valo  *                  at most BMI_DATASZ_MAX
217bdcd8170SKalle Valo  *    u8 CompressedData[length]
218bdcd8170SKalle Valo  * Response format: none
219bdcd8170SKalle Valo  * Note: Not supported on all versions of ROM firmware.
220bdcd8170SKalle Valo  */
221bdcd8170SKalle Valo 
222bdcd8170SKalle Valo #define BMI_COMMUNICATION_TIMEOUT       1000 /* in msec */
223bdcd8170SKalle Valo 
224bdcd8170SKalle Valo struct ath6kl;
225bdcd8170SKalle Valo struct ath6kl_bmi_target_info {
226bdcd8170SKalle Valo 	__le32 byte_count;   /* size of this structure */
227bdcd8170SKalle Valo 	__le32 version;      /* target version id */
228bdcd8170SKalle Valo 	__le32 type;         /* target type */
229bdcd8170SKalle Valo } __packed;
230bdcd8170SKalle Valo 
231bdcd8170SKalle Valo int ath6kl_bmi_init(struct ath6kl *ar);
232bdcd8170SKalle Valo void ath6kl_bmi_cleanup(struct ath6kl *ar);
233bdcd8170SKalle Valo int ath6kl_bmi_done(struct ath6kl *ar);
234bdcd8170SKalle Valo int ath6kl_bmi_get_target_info(struct ath6kl *ar,
235bdcd8170SKalle Valo 			       struct ath6kl_bmi_target_info *targ_info);
236bdcd8170SKalle Valo int ath6kl_bmi_read(struct ath6kl *ar, u32 addr, u8 *buf, u32 len);
237bdcd8170SKalle Valo int ath6kl_bmi_write(struct ath6kl *ar, u32 addr, u8 *buf, u32 len);
238bdcd8170SKalle Valo int ath6kl_bmi_execute(struct ath6kl *ar,
239bdcd8170SKalle Valo 		       u32 addr, u32 *param);
240bdcd8170SKalle Valo int ath6kl_bmi_set_app_start(struct ath6kl *ar,
241bdcd8170SKalle Valo 			     u32 addr);
242bdcd8170SKalle Valo int ath6kl_bmi_reg_read(struct ath6kl *ar, u32 addr, u32 *param);
243bdcd8170SKalle Valo int ath6kl_bmi_reg_write(struct ath6kl *ar, u32 addr, u32 param);
244bdcd8170SKalle Valo int ath6kl_bmi_lz_data(struct ath6kl *ar,
245bdcd8170SKalle Valo 		       u8 *buf, u32 len);
246bdcd8170SKalle Valo int ath6kl_bmi_lz_stream_start(struct ath6kl *ar,
247bdcd8170SKalle Valo 			       u32 addr);
248bdcd8170SKalle Valo int ath6kl_bmi_fast_download(struct ath6kl *ar,
249bdcd8170SKalle Valo 			     u32 addr, u8 *buf, u32 len);
250bdcd8170SKalle Valo #endif
251