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