/**************************************************************************** * * Copyright (c) 2014 - 2016 Samsung Electronics Co., Ltd. All rights reserved * ****************************************************************************/ /** * Maxwell mxlogger (Interface) * * Provides bi-directional communication between the firmware and the * host. * */ #ifndef __MX_LOGGER_H__ #define __MX_LOGGER_H__ #include #include #include #include #include #include #include #include "scsc_mif_abs.h" #include "mxmgmt_transport_format.h" #include /** * ___________________________________________________________________ * | Cmd | Arg | ... payload (opt) ... | * ------------------------------------------------------------------- * <-- uint8_t --><-- uint8_t --><----- uint8_t[] buffer -----------> * */ #define MXLOGGER_RINGS_TMO_US 200000 /* CMD/EVENTS */ #define MM_MXLOGGER_LOGGER_CMD (0) #define MM_MXLOGGER_DIRECTION_CMD (1) #define MM_MXLOGGER_CONFIG_CMD (2) #define MM_MXLOGGER_INITIALIZED_EVT (3) #define MM_MXLOGGER_SYNC_RECORD (4) #define MM_MXLOGGER_STARTED_EVT (5) #define MM_MXLOGGER_STOPPED_EVT (6) #define MM_MXLOGGER_COLLECTION_FW_REQ_EVT (7) /* ARG - LOGGER */ #define MM_MXLOGGER_LOGGER_ENABLE (0) #define MM_MXLOGGER_LOGGER_DISABLE (1) #define MM_MXLOGGER_DISABLE_REASON_STOP (0) #define MM_MXLOGGER_DISABLE_REASON_COLLECTION (1) /* ARG - DIRECTION */ #define MM_MXLOGGER_DIRECTION_DRAM (0) #define MM_MXLOGGER_DIRECTION_HOST (1) /* ARG - CONFIG TABLE */ #define MM_MXLOGGER_CONFIG_BASE_ADDR (0) /* ARG - CONFIG TABLE */ #define MM_MXLOGGER_SYNC_INDEX (0) #define MM_MXLOGGER_PAYLOAD_SZ (MXMGR_MESSAGE_PAYLOAD_SIZE - 2) #if defined(CONFIG_SOC_EXYNOS3830) || defined(CONFIG_SOC_EXYNOS7885) #define MXL_INTERNAL_RSV (24 * 1024) #define MXL_POOL_SZ ((4 * 1024 * 1024) - MXL_INTERNAL_RSV) #define MXLOGGER_RSV_COMMON_SZ (2 * 1024) #define MXLOGGER_RSV_WLAN_SZ (4 * 1024) #define MXLOGGER_RSV_RADIO_SZ (2 * 1024) #define MXLOGGER_RSV_BT_SZ (4 * 1024) #elif defined(CONFIG_SCSC_INDEPENDENT_SUBSYSTEM) #define MXL_INTERNAL_RSV (24 * 1024) #define MX_DRAM_SIZE_SECTION_LOG (8 * 1024 * 1024) #define MX_DRAM_SIZE_SECTION_WLAN (6 * 1024 * 1024) #define MX_DRAM_SIZE_SECTION_WPAN (2 * 1024 * 1024) #define MXL_POOL_SZ (MX_DRAM_SIZE_SECTION_LOG - MXL_INTERNAL_RSV) #define MXL_POOL_SZ_WLAN (MX_DRAM_SIZE_SECTION_WLAN - MXL_INTERNAL_RSV) #define MXL_POOL_SZ_WPAN (MX_DRAM_SIZE_SECTION_WPAN - MXL_INTERNAL_RSV) #define MXLOGGER_RSV_COMMON_SZ (0 * 1024) #define MXLOGGER_RSV_WLAN_SZ (2 * 1024 * 1024) #define MXLOGGER_RSV_RADIO_SZ (0 * 1024) #define MXLOGGER_RSV_BT_SZ (0 * 1024) #define MXLOGGER_RSV_COMMON_SZ_WPAN (0 * 1024) #define MXLOGGER_RSV_WLAN_SZ_WPAN (0 * 1024) #define MXLOGGER_RSV_RADIO_SZ_WPAN (0 * 1024) #define MXLOGGER_RSV_BT_SZ_WPAN (4 * 1024) #else #define MXL_POOL_SZ (6 * 1024 * 1024) #define MXLOGGER_RSV_COMMON_SZ (4 * 1024) #define MXLOGGER_RSV_WLAN_SZ (2 * 1024 * 1024) #define MXLOGGER_RSV_RADIO_SZ (4 * 1024) #define MXLOGGER_RSV_BT_SZ (4 * 1024) #endif #define MXLOGGER_SYNC_SIZE (10 * 1024) #define MXLOGGER_IMP_SIZE (102 * 1024) #define MXLOGGER_TOTAL_FIX_BUF (MXLOGGER_SYNC_SIZE + MXLOGGER_IMP_SIZE + \ MXLOGGER_RSV_COMMON_SZ + MXLOGGER_RSV_BT_SZ + \ MXLOGGER_RSV_WLAN_SZ + MXLOGGER_RSV_RADIO_SZ) #if defined(CONFIG_SCSC_INDEPENDENT_SUBSYSTEM) #define MXLOGGER_TOTAL_FIX_BUF_WPAN (MXLOGGER_SYNC_SIZE + MXLOGGER_IMP_SIZE + \ MXLOGGER_RSV_COMMON_SZ_WPAN + MXLOGGER_RSV_BT_SZ_WPAN + \ MXLOGGER_RSV_WLAN_SZ_WPAN + MXLOGGER_RSV_RADIO_SZ_WPAN) #endif #define MXLOGGER_NON_FIX_BUF_ALIGN 32 #define MXLOGGER_MAGIG_NUMBER 0xcaba0401 #define MXLOGGER_MAJOR 0 #define MXLOGGER_MINOR 0 #define NUM_SYNC_RECORDS 256 #define SYNC_MASK (NUM_SYNC_RECORDS - 1) /* Shared memory Layout * * |-------------------------| CONFIG * | CONFIG AREA | * | ... | * | *bufs |------| * | .... | | * | .... | | * | -------------------- |<-----| * | | * | loc | sz | state |info |---------------------| * | loc | sz | state |info |---------------------| * | loc | sz | state |info |---------------------| * | ... | | * |-------------------------| Fixed size buffers | * | SYNC BUFFER |<--------------------| * |-------------------------| | * | IMPORTANT EVENTS |<--------------------| * |-------------------------| | * | Reserved COMMON |<--------------------| * |-------------------------| * | Reserved BT | * |-------------------------| * | Reserved WL | * |-------------------------| * | Reserved RADIO | * |-------------------------| Not fixed size buffers * | MXLOG | * |-------------------------| * | UDI | * |-------------------------| * | Future buffers (TBD) | * |-------------------------| * | Future buffers (TBD) | * |-------------------------| */ enum mxlogger_buffers { MXLOGGER_FIRST_FIXED_SZ, MXLOGGER_SYNC = MXLOGGER_FIRST_FIXED_SZ, MXLOGGER_IMP, MXLOGGER_RESERVED_COMMON, MXLOGGER_RESERVED_BT, MXLOGGER_RESERVED_WLAN, MXLOGGER_RESERVED_RADIO, MXLOGGER_LAST_FIXED_SZ = MXLOGGER_RESERVED_RADIO, MXLOGGER_MXLOG, MXLOGGER_UDI, MXLOGGER_NUM_BUFFERS }; enum mxlogger_sync_event { MXLOGGER_SYN_SUSPEND, MXLOGGER_SYN_RESUME, MXLOGGER_SYN_TOHOST, MXLOGGER_SYN_TORAM, MXLOGGER_SYN_LOGCOLLECTION, }; struct mxlogger_sync_record { u64 tv_sec; /* struct timeval.tv_sec */ u64 tv_usec; /* struct timeval.tv_usec */ u64 kernel_time; /* ktime_t */ u32 sync_event; /* type of sync event*/ u32 fw_time; u32 fw_wrap; u8 reserved[4]; } __packed; struct buffer_desc { u32 location; /* Buffer location */ u32 size; /* Buffer sz (in bytes) */ u32 status; /* buffer status */ u32 info; /* buffer info */ } __packed; struct mxlogger_config { u32 magic_number; /* 0xcaba0401 */ u32 config_major; /* Version Major */ u32 config_minor; /* Version Minor */ u32 num_buffers; /* configured buffers */ scsc_mifram_ref bfds_ref; } __packed; struct mxlogger_config_area { struct mxlogger_config config; struct buffer_desc bfds[MXLOGGER_NUM_BUFFERS]; uint8_t *buffers_start; } __packed; struct log_msg_packet { uint8_t msg; /* cmd or event id */ uint8_t arg; uint8_t payload[MM_MXLOGGER_PAYLOAD_SZ]; } __packed; #if defined(CONFIG_SCSC_INDEPENDENT_SUBSYSTEM) #define MXLOGGER_CHANNELS 2 #define MXLOGGER_CHANNEL_WLAN 0 #define MXLOGGER_CHANNEL_WPAN 1 struct mxlogger_channel { void *mem; void *mem_sync_buf; uint32_t msz; scsc_mifram_ref mifram_ref; struct mxlogger_config_area *cfg; u8 sync_buffer_index; enum scsc_mif_abs_target target; struct completion rings_serialized_ops; bool enabled; bool configured; struct mxlogger *mxlogger; bool re_enable; }; struct mxlogger { bool initialized; bool configured; bool enabled; struct scsc_mx *mx; struct mxlogger_channel chan[MXLOGGER_CHANNELS]; struct mutex lock; struct mutex chan_lock; u8 observers; }; #else struct mxlogger { bool initialized; bool configured; bool enabled; struct scsc_mx *mx; void *mem; void *mem_sync_buf; uint32_t msz; scsc_mifram_ref mifram_ref; struct mutex lock; struct mxlogger_config_area *cfg; u8 observers; u8 sync_buffer_index; /* collection variables */ bool re_enable; struct completion rings_serialized_ops; }; #endif int mxlogger_generate_sync_record(struct mxlogger *mxlogger, enum mxlogger_sync_event event); int mxlogger_dump_shared_memory_to_file(struct mxlogger *mxlogger); int mxlogger_init(struct scsc_mx *mx, struct mxlogger *mxlogger, uint32_t mem_sz); void mxlogger_deinit(struct scsc_mx *mx, struct mxlogger *mxlogger); #if defined(CONFIG_SCSC_INDEPENDENT_SUBSYSTEM) int mxlogger_init_channel(struct mxlogger *mxlogger, enum scsc_mif_abs_target target); int mxlogger_init_transport_channel(struct mxlogger *mxlogger, enum scsc_mif_abs_target target); unsigned int mxlogger_get_channel_ref(struct mxlogger *mxlogger, enum scsc_mif_abs_target target); unsigned int mxlogger_get_channel_len(struct mxlogger *mxlogger, enum scsc_mif_abs_target target); int mxlogger_start_channel(struct mxlogger *mxlogger, enum scsc_mif_abs_target target); int mxlogger_stop_channel(struct mxlogger *mxlogger, enum scsc_mif_abs_target target); void mxlogger_deinit_channel(struct mxlogger *mxlogger, enum scsc_mif_abs_target target); #else int mxlogger_start(struct mxlogger *mxlogger); #endif int mxlogger_register_observer(struct mxlogger *mxlogger, char *name); int mxlogger_unregister_observer(struct mxlogger *mxlogger, char *name); int mxlogger_register_global_observer(char *name); int mxlogger_unregister_global_observer(char *name); bool mxlogger_set_enabled_status(bool enable); #if defined(SCSC_SEP_VERSION) && SCSC_SEP_VERSION >= 12 size_t mxlogger_dump_fw_buf(struct mxlogger *mxlogger, enum scsc_log_chunk_type fw_buffer, void *buf, size_t size, enum scsc_mif_abs_target target); size_t mxlogger_get_fw_buf_size(struct mxlogger *mxlogger, enum scsc_log_chunk_type fw_buffer, enum scsc_mif_abs_target target); #endif #if defined(CONFIG_SCSC_INDEPENDENT_SUBSYSTEM) #define MEM_LAYOUT_CHECK() \ ({ \ BUILD_BUG_ON((sizeof(struct mxlogger_sync_record) * NUM_SYNC_RECORDS) > MXLOGGER_SYNC_SIZE); \ BUILD_BUG_ON((MXLOGGER_TOTAL_FIX_BUF + sizeof(struct mxlogger_config_area)) > MXL_POOL_SZ_WLAN); \ BUILD_BUG_ON((MXLOGGER_TOTAL_FIX_BUF_WPAN + sizeof(struct mxlogger_config_area)) > MXL_POOL_SZ_WPAN ); \ BUILD_BUG_ON((MXL_POOL_SZ_WPAN + MXL_POOL_SZ_WLAN) > MXL_POOL_SZ); \ }) #else #define MEM_LAYOUT_CHECK() \ ({ \ BUILD_BUG_ON((sizeof(struct mxlogger_sync_record) * NUM_SYNC_RECORDS) > MXLOGGER_SYNC_SIZE); \ BUILD_BUG_ON((MXLOGGER_TOTAL_FIX_BUF + sizeof(struct mxlogger_config_area)) > MXL_POOL_SZ); \ }) #endif #endif /* __MX_LOGGER_H__ */