1f25b9f28SKalle Valo /* 2f25b9f28SKalle Valo * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. 3f25b9f28SKalle Valo * 4f25b9f28SKalle Valo * Permission to use, copy, modify, and/or distribute this software for any 5f25b9f28SKalle Valo * purpose with or without fee is hereby granted, provided that the above 6f25b9f28SKalle Valo * copyright notice and this permission notice appear in all copies. 7f25b9f28SKalle Valo * 8f25b9f28SKalle Valo * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9f25b9f28SKalle Valo * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10f25b9f28SKalle Valo * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11f25b9f28SKalle Valo * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12f25b9f28SKalle Valo * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13f25b9f28SKalle Valo * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14f25b9f28SKalle Valo * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15f25b9f28SKalle Valo */ 16f25b9f28SKalle Valo 17f25b9f28SKalle Valo #ifndef _COREDUMP_H_ 18f25b9f28SKalle Valo #define _COREDUMP_H_ 19f25b9f28SKalle Valo 20f25b9f28SKalle Valo #include "core.h" 21f25b9f28SKalle Valo 22f25b9f28SKalle Valo #define ATH10K_FW_CRASH_DUMP_VERSION 1 23f25b9f28SKalle Valo 24f25b9f28SKalle Valo /** 25f25b9f28SKalle Valo * enum ath10k_fw_crash_dump_type - types of data in the dump file 26f25b9f28SKalle Valo * @ATH10K_FW_CRASH_DUMP_REGDUMP: Register crash dump in binary format 27f25b9f28SKalle Valo */ 28f25b9f28SKalle Valo enum ath10k_fw_crash_dump_type { 29f25b9f28SKalle Valo ATH10K_FW_CRASH_DUMP_REGISTERS = 0, 30f25b9f28SKalle Valo ATH10K_FW_CRASH_DUMP_CE_DATA = 1, 31f25b9f28SKalle Valo 32703f261dSAlan Liu /* contains multiple struct ath10k_dump_ram_data_hdr */ 33703f261dSAlan Liu ATH10K_FW_CRASH_DUMP_RAM_DATA = 2, 34703f261dSAlan Liu 35f25b9f28SKalle Valo ATH10K_FW_CRASH_DUMP_MAX, 36f25b9f28SKalle Valo }; 37f25b9f28SKalle Valo 38f25b9f28SKalle Valo struct ath10k_tlv_dump_data { 39f25b9f28SKalle Valo /* see ath10k_fw_crash_dump_type above */ 40f25b9f28SKalle Valo __le32 type; 41f25b9f28SKalle Valo 42f25b9f28SKalle Valo /* in bytes */ 43f25b9f28SKalle Valo __le32 tlv_len; 44f25b9f28SKalle Valo 45f25b9f28SKalle Valo /* pad to 32-bit boundaries as needed */ 46f25b9f28SKalle Valo u8 tlv_data[]; 47f25b9f28SKalle Valo } __packed; 48f25b9f28SKalle Valo 49f25b9f28SKalle Valo struct ath10k_dump_file_data { 50f25b9f28SKalle Valo /* dump file information */ 51f25b9f28SKalle Valo 52f25b9f28SKalle Valo /* "ATH10K-FW-DUMP" */ 53f25b9f28SKalle Valo char df_magic[16]; 54f25b9f28SKalle Valo 55f25b9f28SKalle Valo __le32 len; 56f25b9f28SKalle Valo 57f25b9f28SKalle Valo /* file dump version */ 58f25b9f28SKalle Valo __le32 version; 59f25b9f28SKalle Valo 60f25b9f28SKalle Valo /* some info we can get from ath10k struct that might help */ 61f25b9f28SKalle Valo 62f25b9f28SKalle Valo guid_t guid; 63f25b9f28SKalle Valo 64f25b9f28SKalle Valo __le32 chip_id; 65f25b9f28SKalle Valo 66f25b9f28SKalle Valo /* 0 for now, in place for later hardware */ 67f25b9f28SKalle Valo __le32 bus_type; 68f25b9f28SKalle Valo 69f25b9f28SKalle Valo __le32 target_version; 70f25b9f28SKalle Valo __le32 fw_version_major; 71f25b9f28SKalle Valo __le32 fw_version_minor; 72f25b9f28SKalle Valo __le32 fw_version_release; 73f25b9f28SKalle Valo __le32 fw_version_build; 74f25b9f28SKalle Valo __le32 phy_capability; 75f25b9f28SKalle Valo __le32 hw_min_tx_power; 76f25b9f28SKalle Valo __le32 hw_max_tx_power; 77f25b9f28SKalle Valo __le32 ht_cap_info; 78f25b9f28SKalle Valo __le32 vht_cap_info; 79f25b9f28SKalle Valo __le32 num_rf_chains; 80f25b9f28SKalle Valo 81f25b9f28SKalle Valo /* firmware version string */ 82f25b9f28SKalle Valo char fw_ver[ETHTOOL_FWVERS_LEN]; 83f25b9f28SKalle Valo 84f25b9f28SKalle Valo /* Kernel related information */ 85f25b9f28SKalle Valo 86f25b9f28SKalle Valo /* time-of-day stamp */ 87f25b9f28SKalle Valo __le64 tv_sec; 88f25b9f28SKalle Valo 89f25b9f28SKalle Valo /* time-of-day stamp, nano-seconds */ 90f25b9f28SKalle Valo __le64 tv_nsec; 91f25b9f28SKalle Valo 92f25b9f28SKalle Valo /* LINUX_VERSION_CODE */ 93f25b9f28SKalle Valo __le32 kernel_ver_code; 94f25b9f28SKalle Valo 95f25b9f28SKalle Valo /* VERMAGIC_STRING */ 96f25b9f28SKalle Valo char kernel_ver[64]; 97f25b9f28SKalle Valo 98f25b9f28SKalle Valo /* room for growth w/out changing binary format */ 99f25b9f28SKalle Valo u8 unused[128]; 100f25b9f28SKalle Valo 101f25b9f28SKalle Valo /* struct ath10k_tlv_dump_data + more */ 102f25b9f28SKalle Valo u8 data[0]; 103f25b9f28SKalle Valo } __packed; 104f25b9f28SKalle Valo 105703f261dSAlan Liu struct ath10k_dump_ram_data_hdr { 106703f261dSAlan Liu /* enum ath10k_mem_region_type */ 107703f261dSAlan Liu __le32 region_type; 108703f261dSAlan Liu 109703f261dSAlan Liu __le32 start; 110703f261dSAlan Liu 111703f261dSAlan Liu /* length of payload data, not including this header */ 112703f261dSAlan Liu __le32 length; 113703f261dSAlan Liu 114703f261dSAlan Liu u8 data[0]; 115703f261dSAlan Liu }; 116703f261dSAlan Liu 117703f261dSAlan Liu /* magic number to fill the holes not copied due to sections in regions */ 118703f261dSAlan Liu #define ATH10K_MAGIC_NOT_COPIED 0xAA 119703f261dSAlan Liu 120703f261dSAlan Liu /* part of user space ABI */ 121703f261dSAlan Liu enum ath10k_mem_region_type { 122703f261dSAlan Liu ATH10K_MEM_REGION_TYPE_REG = 1, 123703f261dSAlan Liu ATH10K_MEM_REGION_TYPE_DRAM = 2, 124703f261dSAlan Liu ATH10K_MEM_REGION_TYPE_AXI = 3, 125703f261dSAlan Liu ATH10K_MEM_REGION_TYPE_IRAM1 = 4, 126703f261dSAlan Liu ATH10K_MEM_REGION_TYPE_IRAM2 = 5, 127219cc084SAnilkumar Kolli ATH10K_MEM_REGION_TYPE_IOSRAM = 6, 128219cc084SAnilkumar Kolli ATH10K_MEM_REGION_TYPE_IOREG = 7, 129703f261dSAlan Liu }; 130703f261dSAlan Liu 131703f261dSAlan Liu /* Define a section of the region which should be copied. As not all parts 132703f261dSAlan Liu * of the memory is possible to copy, for example some of the registers can 133703f261dSAlan Liu * be like that, sections can be used to define what is safe to copy. 134703f261dSAlan Liu * 135703f261dSAlan Liu * To minimize the size of the array, the list must obey the format: 136703f261dSAlan Liu * '{start0,stop0},{start1,stop1},{start2,stop2}....' The values below must 137703f261dSAlan Liu * also obey to 'start0 < stop0 < start1 < stop1 < start2 < ...', otherwise 138703f261dSAlan Liu * we may encouter error in the dump processing. 139703f261dSAlan Liu */ 140703f261dSAlan Liu struct ath10k_mem_section { 141703f261dSAlan Liu u32 start; 142703f261dSAlan Liu u32 end; 143703f261dSAlan Liu }; 144703f261dSAlan Liu 145703f261dSAlan Liu /* One region of a memory layout. If the sections field is null entire 146703f261dSAlan Liu * region is copied. If sections is non-null only the areas specified in 147703f261dSAlan Liu * sections are copied and rest of the areas are filled with 148703f261dSAlan Liu * ATH10K_MAGIC_NOT_COPIED. 149703f261dSAlan Liu */ 150703f261dSAlan Liu struct ath10k_mem_region { 151703f261dSAlan Liu enum ath10k_mem_region_type type; 152703f261dSAlan Liu u32 start; 153703f261dSAlan Liu u32 len; 154703f261dSAlan Liu 155703f261dSAlan Liu const char *name; 156703f261dSAlan Liu 157703f261dSAlan Liu struct { 158703f261dSAlan Liu const struct ath10k_mem_section *sections; 159703f261dSAlan Liu u32 size; 160703f261dSAlan Liu } section_table; 161703f261dSAlan Liu }; 162703f261dSAlan Liu 163703f261dSAlan Liu /* Contains the memory layout of a hardware version identified with the 164703f261dSAlan Liu * hardware id, split into regions. 165703f261dSAlan Liu */ 166703f261dSAlan Liu struct ath10k_hw_mem_layout { 167703f261dSAlan Liu u32 hw_id; 1685f09037aSAnilkumar Kolli u32 hw_rev; 169703f261dSAlan Liu 170703f261dSAlan Liu struct { 171703f261dSAlan Liu const struct ath10k_mem_region *regions; 172703f261dSAlan Liu int size; 173703f261dSAlan Liu } region_table; 174703f261dSAlan Liu }; 175703f261dSAlan Liu 176703f261dSAlan Liu /* FIXME: where to put this? */ 177703f261dSAlan Liu extern unsigned long ath10k_coredump_mask; 178703f261dSAlan Liu 179f25b9f28SKalle Valo #ifdef CONFIG_DEV_COREDUMP 180f25b9f28SKalle Valo 181f25b9f28SKalle Valo int ath10k_coredump_submit(struct ath10k *ar); 182f25b9f28SKalle Valo struct ath10k_fw_crash_data *ath10k_coredump_new(struct ath10k *ar); 183e2fcf60cSKalle Valo int ath10k_coredump_create(struct ath10k *ar); 184703f261dSAlan Liu int ath10k_coredump_register(struct ath10k *ar); 185703f261dSAlan Liu void ath10k_coredump_unregister(struct ath10k *ar); 186e2fcf60cSKalle Valo void ath10k_coredump_destroy(struct ath10k *ar); 187f25b9f28SKalle Valo 188703f261dSAlan Liu const struct ath10k_hw_mem_layout *ath10k_coredump_get_mem_layout(struct ath10k *ar); 189703f261dSAlan Liu 190f25b9f28SKalle Valo #else /* CONFIG_DEV_COREDUMP */ 191f25b9f28SKalle Valo 192f25b9f28SKalle Valo static inline int ath10k_coredump_submit(struct ath10k *ar) 193f25b9f28SKalle Valo { 194f25b9f28SKalle Valo return 0; 195f25b9f28SKalle Valo } 196f25b9f28SKalle Valo 197f25b9f28SKalle Valo static inline struct ath10k_fw_crash_data *ath10k_coredump_new(struct ath10k *ar) 198f25b9f28SKalle Valo { 199f25b9f28SKalle Valo return NULL; 200f25b9f28SKalle Valo } 201f25b9f28SKalle Valo 202e2fcf60cSKalle Valo static inline int ath10k_coredump_create(struct ath10k *ar) 203e2fcf60cSKalle Valo { 204e2fcf60cSKalle Valo return 0; 205e2fcf60cSKalle Valo } 206e2fcf60cSKalle Valo 207703f261dSAlan Liu static inline int ath10k_coredump_register(struct ath10k *ar) 208703f261dSAlan Liu { 209703f261dSAlan Liu return 0; 210703f261dSAlan Liu } 211703f261dSAlan Liu 212703f261dSAlan Liu static inline void ath10k_coredump_unregister(struct ath10k *ar) 213703f261dSAlan Liu { 214703f261dSAlan Liu } 215703f261dSAlan Liu 216e2fcf60cSKalle Valo static inline void ath10k_coredump_destroy(struct ath10k *ar) 217e2fcf60cSKalle Valo { 218e2fcf60cSKalle Valo } 219e2fcf60cSKalle Valo 220703f261dSAlan Liu static inline const struct ath10k_hw_mem_layout * 221703f261dSAlan Liu ath10k_coredump_get_mem_layout(struct ath10k *ar) 222703f261dSAlan Liu { 223703f261dSAlan Liu return NULL; 224703f261dSAlan Liu } 225703f261dSAlan Liu 226f25b9f28SKalle Valo #endif /* CONFIG_DEV_COREDUMP */ 227f25b9f28SKalle Valo 228f25b9f28SKalle Valo #endif /* _COREDUMP_H_ */ 229