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