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