Loading drivers/platform/msm/ipa/ipa_api.c +39 −0 Original line number Diff line number Diff line Loading @@ -3648,6 +3648,45 @@ void ipa_deregister_client_callback(enum ipa_client_type client) client); } int ipa_uc_debug_stats_alloc( struct IpaHwOffloadStatsAllocCmdData_t cmdinfo) { int ret; IPA_API_DISPATCH_RETURN(ipa_uc_debug_stats_alloc, cmdinfo); return ret; } EXPORT_SYMBOL(ipa_uc_debug_stats_alloc); int ipa_uc_debug_stats_dealloc(uint32_t prot_id) { int ret; IPA_API_DISPATCH_RETURN(ipa_uc_debug_stats_dealloc, prot_id); return ret; } EXPORT_SYMBOL(ipa_uc_debug_stats_dealloc); void ipa_get_gsi_stats(int prot_id, struct ipa_uc_dbg_ring_stats *stats) { IPA_API_DISPATCH(ipa_get_gsi_stats, prot_id, stats); } EXPORT_SYMBOL(ipa_get_gsi_stats); int ipa_get_prot_id(enum ipa_client_type client) { int ret; IPA_API_DISPATCH_RETURN(ipa_get_prot_id, client); return ret; } EXPORT_SYMBOL(ipa_get_prot_id); /** * ipa_pm_is_used() - Returns if IPA PM framework is used Loading drivers/platform/msm/ipa/ipa_api.h +10 −0 Original line number Diff line number Diff line Loading @@ -474,6 +474,16 @@ struct ipa_api_controller { bool (*teth_port_state)(void), enum ipa_client_type client); void (*ipa_deregister_client_callback)(enum ipa_client_type client); int (*ipa_uc_debug_stats_alloc)( struct IpaHwOffloadStatsAllocCmdData_t cmdinfo); int (*ipa_uc_debug_stats_dealloc)(uint32_t prot_id); void (*ipa_get_gsi_stats)(int prot_id, struct ipa_uc_dbg_ring_stats *stats); int (*ipa_get_prot_id)(enum ipa_client_type client); }; #ifdef CONFIG_IPA3 Loading drivers/platform/msm/ipa/ipa_clients/ipa_usb.c +1 −1 Original line number Diff line number Diff line Loading @@ -3184,7 +3184,7 @@ static void ipa3_usb_exit(void) * @note Cannot be called from atomic context * */ int ipa3_get_usb_gsi_stats(struct ipa3_uc_dbg_ring_stats *stats) int ipa3_get_usb_gsi_stats(struct ipa_uc_dbg_ring_stats *stats) { int i; Loading drivers/platform/msm/ipa/ipa_v3/ipa.c +1 −1 Original line number Diff line number Diff line Loading @@ -6384,7 +6384,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, for (i = 0; i < IPA_HW_PROTOCOL_MAX; i++) { ipa3_ctx->gsi_info[i].protocol = i; /* initialize all to be not started */ for (j = 0; j < MAX_CH_STATS_SUPPORTED; j++) for (j = 0; j < IPA_MAX_CH_STATS_SUPPORTED; j++) ipa3_ctx->gsi_info[i].ch_id_info[j].ch_id = 0xFF; } Loading drivers/platform/msm/ipa/ipa_v3/ipa_client.c +46 −0 Original line number Diff line number Diff line Loading @@ -1748,5 +1748,51 @@ int ipa3_clear_endpoint_delay(u32 clnt_hdl) IPADBG("client (ep: %d) removed ep delay\n", clnt_hdl); return 0; } /** * ipa3_get_aqc_gsi_stats() - Query AQC gsi stats from uc * @stats: [inout] stats blob from client populated by driver * * Returns: 0 on success, negative on failure * * @note Cannot be called from atomic context * */ int ipa3_get_aqc_gsi_stats(struct ipa_uc_dbg_ring_stats *stats) { int i; if (!ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio) { IPAERR("bad parms NULL aqc_gsi_stats_mmio\n"); return -EINVAL; } IPA_ACTIVE_CLIENTS_INC_SIMPLE(); for (i = 0; i < MAX_AQC_CHANNELS; i++) { stats->ring[i].ringFull = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGFULL_OFF); stats->ring[i].ringEmpty = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGEMPTY_OFF); stats->ring[i].ringUsageHigh = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGUSAGEHIGH_OFF); stats->ring[i].ringUsageLow = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGUSAGELOW_OFF); stats->ring[i].RingUtilCount = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGUTILCOUNT_OFF); } IPA_ACTIVE_CLIENTS_DEC_SIMPLE(); return 0; } Loading
drivers/platform/msm/ipa/ipa_api.c +39 −0 Original line number Diff line number Diff line Loading @@ -3648,6 +3648,45 @@ void ipa_deregister_client_callback(enum ipa_client_type client) client); } int ipa_uc_debug_stats_alloc( struct IpaHwOffloadStatsAllocCmdData_t cmdinfo) { int ret; IPA_API_DISPATCH_RETURN(ipa_uc_debug_stats_alloc, cmdinfo); return ret; } EXPORT_SYMBOL(ipa_uc_debug_stats_alloc); int ipa_uc_debug_stats_dealloc(uint32_t prot_id) { int ret; IPA_API_DISPATCH_RETURN(ipa_uc_debug_stats_dealloc, prot_id); return ret; } EXPORT_SYMBOL(ipa_uc_debug_stats_dealloc); void ipa_get_gsi_stats(int prot_id, struct ipa_uc_dbg_ring_stats *stats) { IPA_API_DISPATCH(ipa_get_gsi_stats, prot_id, stats); } EXPORT_SYMBOL(ipa_get_gsi_stats); int ipa_get_prot_id(enum ipa_client_type client) { int ret; IPA_API_DISPATCH_RETURN(ipa_get_prot_id, client); return ret; } EXPORT_SYMBOL(ipa_get_prot_id); /** * ipa_pm_is_used() - Returns if IPA PM framework is used Loading
drivers/platform/msm/ipa/ipa_api.h +10 −0 Original line number Diff line number Diff line Loading @@ -474,6 +474,16 @@ struct ipa_api_controller { bool (*teth_port_state)(void), enum ipa_client_type client); void (*ipa_deregister_client_callback)(enum ipa_client_type client); int (*ipa_uc_debug_stats_alloc)( struct IpaHwOffloadStatsAllocCmdData_t cmdinfo); int (*ipa_uc_debug_stats_dealloc)(uint32_t prot_id); void (*ipa_get_gsi_stats)(int prot_id, struct ipa_uc_dbg_ring_stats *stats); int (*ipa_get_prot_id)(enum ipa_client_type client); }; #ifdef CONFIG_IPA3 Loading
drivers/platform/msm/ipa/ipa_clients/ipa_usb.c +1 −1 Original line number Diff line number Diff line Loading @@ -3184,7 +3184,7 @@ static void ipa3_usb_exit(void) * @note Cannot be called from atomic context * */ int ipa3_get_usb_gsi_stats(struct ipa3_uc_dbg_ring_stats *stats) int ipa3_get_usb_gsi_stats(struct ipa_uc_dbg_ring_stats *stats) { int i; Loading
drivers/platform/msm/ipa/ipa_v3/ipa.c +1 −1 Original line number Diff line number Diff line Loading @@ -6384,7 +6384,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, for (i = 0; i < IPA_HW_PROTOCOL_MAX; i++) { ipa3_ctx->gsi_info[i].protocol = i; /* initialize all to be not started */ for (j = 0; j < MAX_CH_STATS_SUPPORTED; j++) for (j = 0; j < IPA_MAX_CH_STATS_SUPPORTED; j++) ipa3_ctx->gsi_info[i].ch_id_info[j].ch_id = 0xFF; } Loading
drivers/platform/msm/ipa/ipa_v3/ipa_client.c +46 −0 Original line number Diff line number Diff line Loading @@ -1748,5 +1748,51 @@ int ipa3_clear_endpoint_delay(u32 clnt_hdl) IPADBG("client (ep: %d) removed ep delay\n", clnt_hdl); return 0; } /** * ipa3_get_aqc_gsi_stats() - Query AQC gsi stats from uc * @stats: [inout] stats blob from client populated by driver * * Returns: 0 on success, negative on failure * * @note Cannot be called from atomic context * */ int ipa3_get_aqc_gsi_stats(struct ipa_uc_dbg_ring_stats *stats) { int i; if (!ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio) { IPAERR("bad parms NULL aqc_gsi_stats_mmio\n"); return -EINVAL; } IPA_ACTIVE_CLIENTS_INC_SIMPLE(); for (i = 0; i < MAX_AQC_CHANNELS; i++) { stats->ring[i].ringFull = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGFULL_OFF); stats->ring[i].ringEmpty = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGEMPTY_OFF); stats->ring[i].ringUsageHigh = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGUSAGEHIGH_OFF); stats->ring[i].ringUsageLow = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGUSAGELOW_OFF); stats->ring[i].RingUtilCount = ioread32( ipa3_ctx->aqc_ctx.dbg_stats.uc_dbg_stats_mmio + i * IPA3_UC_DEBUG_STATS_OFF + IPA3_UC_DEBUG_STATS_RINGUTILCOUNT_OFF); } IPA_ACTIVE_CLIENTS_DEC_SIMPLE(); return 0; }