1 /* SPDX-License-Identifier: ISC */ 2 /* 3 * Copyright (c) 2015-2016 Qualcomm Atheros, Inc. 4 */ 5 6 #ifndef _SWAP_H_ 7 #define _SWAP_H_ 8 9 #define ATH10K_SWAP_CODE_SEG_BIN_LEN_MAX (512 * 1024) 10 #define ATH10K_SWAP_CODE_SEG_MAGIC_BYTES_SZ 12 11 #define ATH10K_SWAP_CODE_SEG_NUM_MAX 16 12 /* Currently only one swap segment is supported */ 13 #define ATH10K_SWAP_CODE_SEG_NUM_SUPPORTED 1 14 15 struct ath10k_fw_file; 16 17 struct ath10k_swap_code_seg_tlv { 18 __le32 address; 19 __le32 length; 20 u8 data[]; 21 } __packed; 22 23 struct ath10k_swap_code_seg_tail { 24 u8 magic_signature[ATH10K_SWAP_CODE_SEG_MAGIC_BYTES_SZ]; 25 __le32 bmi_write_addr; 26 } __packed; 27 28 union ath10k_swap_code_seg_item { 29 struct ath10k_swap_code_seg_tlv tlv; 30 struct ath10k_swap_code_seg_tail tail; 31 } __packed; 32 33 struct ath10k_swap_code_seg_hw_info { 34 /* Swap binary image size */ 35 __le32 swap_size; 36 __le32 num_segs; 37 38 /* Swap data size */ 39 __le32 size; 40 __le32 size_log2; 41 __le32 bus_addr[ATH10K_SWAP_CODE_SEG_NUM_MAX]; 42 __le64 reserved[ATH10K_SWAP_CODE_SEG_NUM_MAX]; 43 } __packed; 44 45 struct ath10k_swap_code_seg_info { 46 struct ath10k_swap_code_seg_hw_info seg_hw_info; 47 void *virt_address[ATH10K_SWAP_CODE_SEG_NUM_SUPPORTED]; 48 u32 target_addr; 49 dma_addr_t paddr[ATH10K_SWAP_CODE_SEG_NUM_SUPPORTED]; 50 }; 51 52 int ath10k_swap_code_seg_configure(struct ath10k *ar, 53 const struct ath10k_fw_file *fw_file); 54 void ath10k_swap_code_seg_release(struct ath10k *ar, 55 struct ath10k_fw_file *fw_file); 56 int ath10k_swap_code_seg_init(struct ath10k *ar, 57 struct ath10k_fw_file *fw_file); 58 59 #endif 60