Loading drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c +28 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,9 @@ #include <linux/ipa_qmi_service_v01.h> #include <linux/ipa_mhi.h> #include "../ipa_common_i.h" #ifdef CONFIG_IPA3 #include "../ipa_v3/ipa_pm.h" #endif #define IPA_MHI_DRV_NAME "ipa_mhi_client" #define IPA_MHI_DBG(fmt, args...) \ Loading Loading @@ -842,6 +844,7 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params) IPA_MHI_DBG("event_context_array_addr 0x%llx\n", ipa_mhi_client_ctx->event_context_array_addr); #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { res = ipa_pm_activate_sync(ipa_mhi_client_ctx->pm_hdl); if (res) { Loading @@ -854,6 +857,7 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params) goto fail_pm_activate_modem; } } else { #endif /* Add MHI <-> Q6 dependencies to IPA RM */ res = ipa_rm_add_dependency(IPA_RM_RESOURCE_MHI_PROD, IPA_RM_RESOURCE_Q6_CONS); Loading @@ -874,7 +878,9 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params) IPA_MHI_ERR("failed request prod %d\n", res); goto fail_request_prod; } #ifdef CONFIG_IPA3 } #endif /* gsi params */ init_params.gsi.first_ch_idx = Loading Loading @@ -912,12 +918,14 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params) ipa_rm_delete_dependency(IPA_RM_RESOURCE_MHI_PROD, IPA_RM_RESOURCE_Q6_CONS); fail_add_mhi_q6_dep: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->modem_pm_hdl); fail_pm_activate_modem: if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); fail_pm_activate: #endif ipa_mhi_set_state(IPA_MHI_STATE_INITIALIZED); return res; } Loading Loading @@ -2124,6 +2132,7 @@ int ipa_mhi_suspend(bool force) */ IPA_ACTIVE_CLIENTS_INC_SIMPLE(); #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { res = ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); if (res) { Loading @@ -2136,6 +2145,7 @@ int ipa_mhi_suspend(bool force) goto fail_deactivate_modem_pm; } } else { #endif IPA_MHI_DBG("release prod\n"); res = ipa_mhi_release_prod(); if (res) { Loading @@ -2149,7 +2159,9 @@ int ipa_mhi_suspend(bool force) IPA_MHI_ERR("ipa_mhi_wait_for_cons_release failed\n"); goto fail_release_cons; } #ifdef CONFIG_IPA3 } #endif usleep_range(IPA_MHI_SUSPEND_SLEEP_MIN, IPA_MHI_SUSPEND_SLEEP_MAX); res = ipa_mhi_suspend_dl(force); Loading @@ -2176,12 +2188,14 @@ int ipa_mhi_suspend(bool force) if (!ipa_pm_is_used()) ipa_mhi_request_prod(); fail_release_prod: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->modem_pm_hdl); fail_deactivate_modem_pm: if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); fail_deactivate_pm: #endif IPA_ACTIVE_CLIENTS_DEC_SIMPLE(); fail_suspend_ul_channel: ipa_mhi_resume_channels(true, ipa_mhi_client_ctx->ul_channels); Loading Loading @@ -2241,6 +2255,7 @@ int ipa_mhi_resume(void) ipa_mhi_client_ctx->rm_cons_state = IPA_MHI_RM_STATE_GRANTED; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { res = ipa_pm_activate_sync(ipa_mhi_client_ctx->pm_hdl); if (res) { Loading @@ -2253,12 +2268,15 @@ int ipa_mhi_resume(void) goto fail_pm_activate_modem; } } else { #endif res = ipa_mhi_request_prod(); if (res) { IPA_MHI_ERR("ipa_mhi_request_prod failed %d\n", res); goto fail_request_prod; } #ifdef CONFIG_IPA3 } #endif /* resume all UL channels */ res = ipa_mhi_resume_channels(false, Loading Loading @@ -2298,12 +2316,14 @@ int ipa_mhi_resume(void) if (!ipa_pm_is_used()) ipa_mhi_release_prod(); fail_request_prod: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->modem_pm_hdl); fail_pm_activate_modem: if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); fail_pm_activate: #endif ipa_mhi_suspend_channels(ipa_mhi_client_ctx->dl_channels); fail_resume_dl_channels: ipa_mhi_set_state(IPA_MHI_STATE_SUSPENDED); Loading Loading @@ -2455,6 +2475,7 @@ static void ipa_mhi_delete_rm_resources(void) ipa_assert(); } #ifdef CONFIG_IPA3 static void ipa_mhi_deregister_pm(void) { ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); Loading @@ -2465,7 +2486,7 @@ static void ipa_mhi_deregister_pm(void) ipa_pm_deregister(ipa_mhi_client_ctx->modem_pm_hdl); ipa_mhi_client_ctx->modem_pm_hdl = ~0; } #endif /** * ipa_mhi_destroy() - Destroy MHI IPA * Loading Loading @@ -2498,9 +2519,11 @@ void ipa_mhi_destroy(void) ipa_uc_mhi_cleanup(); } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_mhi_deregister_pm(); else #endif ipa_mhi_delete_rm_resources(); ipa_dma_destroy(); Loading @@ -2516,6 +2539,7 @@ void ipa_mhi_destroy(void) ipa_assert(); } #ifdef CONFIG_IPA3 static void ipa_mhi_pm_cb(void *p, enum ipa_pm_cb_event event) { unsigned long flags; Loading Loading @@ -2587,7 +2611,7 @@ static int ipa_mhi_register_pm(void) ipa_mhi_client_ctx->pm_hdl = ~0; return res; } #endif static int ipa_mhi_create_rm_resources(void) { int res; Loading Loading @@ -2725,9 +2749,11 @@ int ipa_mhi_init(struct ipa_mhi_init_params *params) goto fail_dma_init; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) res = ipa_mhi_register_pm(); else #endif res = ipa_mhi_create_rm_resources(); if (res) { IPA_MHI_ERR("failed to create RM resources\n"); Loading drivers/platform/msm/ipa/ipa_clients/ipa_uc_offload.c +24 −2 Original line number Diff line number Diff line Loading @@ -13,7 +13,9 @@ #include <linux/ipa_uc_offload.h> #include <linux/msm_ipa.h> #include "../ipa_common_i.h" #ifdef CONFIG_IPA3 #include "../ipa_v3/ipa_pm.h" #endif #define IPA_NTN_DMA_POOL_ALIGNMENT 8 #define OFFLOAD_DRV_NAME "ipa_uc_offload" Loading Loading @@ -115,6 +117,7 @@ static int ipa_commit_partial_hdr( return 0; } #ifdef CONFIG_IPA3 static void ipa_uc_offload_ntn_pm_cb(void *p, enum ipa_pm_cb_event event) { /* suspend/resume is not supported */ Loading Loading @@ -156,6 +159,7 @@ static void ipa_uc_offload_ntn_deregister_pm_client( ipa_pm_deactivate_sync(ntn_ctx->pm_hdl); ipa_pm_deregister(ntn_ctx->pm_hdl); } #endif static int ipa_uc_offload_ntn_create_rm_resources( struct ipa_uc_offload_ctx *ntn_ctx) { Loading Loading @@ -203,9 +207,11 @@ static int ipa_uc_offload_ntn_reg_intf( IPA_UC_OFFLOAD_DBG("register interface for netdev %s\n", inp->netdev_name); #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ret = ipa_uc_offload_ntn_register_pm_client(ntn_ctx); else #endif ret = ipa_uc_offload_ntn_create_rm_resources(ntn_ctx); if (ret) { IPA_UC_OFFLOAD_ERR("fail to create rm resource\n"); Loading Loading @@ -289,12 +295,16 @@ static int ipa_uc_offload_ntn_reg_intf( fail: kfree(hdr); fail_alloc: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { ipa_uc_offload_ntn_deregister_pm_client(ntn_ctx); } else { #endif ipa_rm_delete_resource(IPA_RM_RESOURCE_ETHERNET_CONS); ipa_rm_delete_resource(IPA_RM_RESOURCE_ETHERNET_PROD); #ifdef CONFIG_IPA3 } #endif return ret; } Loading Loading @@ -412,6 +422,7 @@ int ipa_uc_ntn_conn_pipes(struct ipa_ntn_conn_in_params *inp, return -EINVAL; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { result = ipa_pm_activate_sync(ntn_ctx->pm_hdl); if (result) { Loading @@ -419,6 +430,7 @@ int ipa_uc_ntn_conn_pipes(struct ipa_ntn_conn_in_params *inp, return result; } } else { #endif result = ipa_rm_add_dependency(IPA_RM_RESOURCE_ETHERNET_PROD, IPA_RM_RESOURCE_APPS_CONS); if (result) { Loading @@ -440,7 +452,9 @@ int ipa_uc_ntn_conn_pipes(struct ipa_ntn_conn_in_params *inp, result = -EFAULT; goto fail; } #ifdef CONFIG_IPA3 } #endif ntn_ctx->state = IPA_UC_OFFLOAD_STATE_UP; result = ipa_setup_uc_ntn_pipes(inp, ntn_ctx->notify, Loading Loading @@ -529,11 +543,12 @@ int ipa_set_perf_profile(struct ipa_perf_profile *profile) return -EINVAL; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) return ipa_pm_set_perf_profile( ipa_uc_offload_ctx[IPA_UC_NTN]->pm_hdl, profile->max_supported_bw_mbps); #endif if (ipa_rm_set_perf_profile(resource_name, &rm_profile)) { IPA_UC_OFFLOAD_ERR("fail to setup rm perf profile\n"); return -EFAULT; Loading @@ -550,6 +565,7 @@ static int ipa_uc_ntn_disconn_pipes(struct ipa_uc_offload_ctx *ntn_ctx) ntn_ctx->state = IPA_UC_OFFLOAD_STATE_INITIALIZED; #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { ret = ipa_pm_deactivate_sync(ntn_ctx->pm_hdl); if (ret) { Loading @@ -558,6 +574,7 @@ static int ipa_uc_ntn_disconn_pipes(struct ipa_uc_offload_ctx *ntn_ctx) return -EFAULT; } } else { #endif ret = ipa_rm_release_resource(IPA_RM_RESOURCE_ETHERNET_PROD); if (ret) { IPA_UC_OFFLOAD_ERR("fail release ETHERNET_PROD: %d\n", Loading @@ -571,7 +588,9 @@ static int ipa_uc_ntn_disconn_pipes(struct ipa_uc_offload_ctx *ntn_ctx) IPA_UC_OFFLOAD_ERR("fail del dep ETH->APPS, %d\n", ret); return -EFAULT; } #ifdef CONFIG_IPA3 } #endif ipa_ep_idx_ul = ipa_get_ep_mapping(IPA_CLIENT_ETHERNET_PROD); ipa_ep_idx_dl = ipa_get_ep_mapping(IPA_CLIENT_ETHERNET_CONS); Loading Loading @@ -627,9 +646,11 @@ static int ipa_uc_ntn_cleanup(struct ipa_uc_offload_ctx *ntn_ctx) int len, result = 0; struct ipa_ioc_del_hdr *hdr; #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { ipa_uc_offload_ntn_deregister_pm_client(ntn_ctx); } else { #endif if (ipa_rm_delete_resource(IPA_RM_RESOURCE_ETHERNET_PROD)) { IPA_UC_OFFLOAD_ERR("fail to delete ETHERNET_PROD\n"); return -EFAULT; Loading @@ -639,8 +660,9 @@ static int ipa_uc_ntn_cleanup(struct ipa_uc_offload_ctx *ntn_ctx) IPA_UC_OFFLOAD_ERR("fail to delete ETHERNET_CONS\n"); return -EFAULT; } #ifdef CONFIG_IPA3 } #endif len = sizeof(struct ipa_ioc_del_hdr) + 2 * sizeof(struct ipa_hdr_del); hdr = kzalloc(len, GFP_KERNEL); if (hdr == NULL) { Loading drivers/platform/msm/ipa/ipa_clients/odu_bridge.c +2 −0 Original line number Diff line number Diff line Loading @@ -27,7 +27,9 @@ #include <linux/cdev.h> #include <linux/ipa_odu_bridge.h> #include "../ipa_common_i.h" #ifdef CONFIG_IPA3 #include "../ipa_v3/ipa_pm.h" #endif #define ODU_BRIDGE_DRV_NAME "odu_ipa_bridge" Loading drivers/platform/msm/ipa/ipa_clients/rndis_ipa.c +18 −3 Original line number Diff line number Diff line Loading @@ -28,7 +28,9 @@ #include <linux/rndis_ipa.h> #include <linux/workqueue.h> #include "../ipa_common_i.h" #ifdef CONFIG_IPA3 #include "../ipa_v3/ipa_pm.h" #endif #define CREATE_TRACE_POINTS #include "rndis_ipa_trace.h" Loading Loading @@ -240,8 +242,10 @@ static void rndis_ipa_rm_notify unsigned long data); static int rndis_ipa_create_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx); static int rndis_ipa_destroy_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx); #ifdef CONFIG_IPA3 static int rndis_ipa_register_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx); static int rndis_ipa_deregister_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx); #endif static bool rx_filter(struct sk_buff *skb); static bool tx_filter(struct sk_buff *skb); static bool rm_enabled(struct rndis_ipa_dev *rndis_ipa_ctx); Loading Loading @@ -721,9 +725,11 @@ int rndis_ipa_pipe_connect_notify( return -EINVAL; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) result = rndis_ipa_register_pm_client(rndis_ipa_ctx); else #endif result = rndis_ipa_create_rm_resource(rndis_ipa_ctx); if (result) { RNDIS_IPA_ERROR("fail on RM create\n"); Loading Loading @@ -787,9 +793,11 @@ int rndis_ipa_pipe_connect_notify( return 0; fail: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) rndis_ipa_deregister_pm_client(rndis_ipa_ctx); else #endif rndis_ipa_destroy_rm_resource(rndis_ipa_ctx); fail_create_rm: return result; Loading Loading @@ -1262,9 +1270,11 @@ int rndis_ipa_pipe_disconnect_notify(void *private) rndis_ipa_ctx->net->stats.tx_dropped += outstanding_dropped_pkts; atomic_set(&rndis_ipa_ctx->outstanding_pkts, 0); #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) retval = rndis_ipa_deregister_pm_client(rndis_ipa_ctx); else #endif retval = rndis_ipa_destroy_rm_resource(rndis_ipa_ctx); if (retval) { RNDIS_IPA_ERROR("Fail to clean RM\n"); Loading Loading @@ -1822,6 +1832,7 @@ static int rndis_ipa_create_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx) return result; } #ifdef CONFIG_IPA3 static void rndis_ipa_pm_cb(void *p, enum ipa_pm_cb_event event) { struct rndis_ipa_dev *rndis_ipa_ctx = p; Loading @@ -1844,7 +1855,7 @@ static void rndis_ipa_pm_cb(void *p, enum ipa_pm_cb_event event) RNDIS_IPA_LOG_EXIT(); } #endif /** * rndis_ipa_destroy_rm_resource() - delete the dependency and destroy * the resource done on rndis_ipa_create_rm_resource() Loading Loading @@ -1904,6 +1915,7 @@ static int rndis_ipa_destroy_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx) return result; } #ifdef CONFIG_IPA3 static int rndis_ipa_register_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx) { int result; Loading @@ -1930,7 +1942,7 @@ static int rndis_ipa_deregister_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx) rndis_ipa_ctx->pm_hdl = ~0; return 0; } #endif /** * resource_request() - request for the Netdev resource * @rndis_ipa_ctx: main driver context Loading @@ -1951,9 +1963,10 @@ static int resource_request(struct rndis_ipa_dev *rndis_ipa_ctx) if (!rm_enabled(rndis_ipa_ctx)) return result; #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) return ipa_pm_activate(rndis_ipa_ctx->pm_hdl); #endif return ipa_rm_inactivity_timer_request_resource( DRV_RESOURCE_ID); Loading @@ -1972,9 +1985,11 @@ static void resource_release(struct rndis_ipa_dev *rndis_ipa_ctx) { if (!rm_enabled(rndis_ipa_ctx)) return; #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_pm_deferred_deactivate(rndis_ipa_ctx->pm_hdl); else #endif ipa_rm_inactivity_timer_release_resource(DRV_RESOURCE_ID); return; Loading drivers/platform/msm/ipa/ipa_v2/ipa.c +17 −6 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ #include <linux/delay.h> #include <linux/time.h> #include <linux/hashtable.h> #include <linux/hash.h> #include <linux/jhash.h> #include "ipa_i.h" #include "../ipa_rm_i.h" Loading Loading @@ -3281,7 +3281,7 @@ void ipa2_active_clients_log_mod(struct ipa_active_client_logging_info *id, hfound = NULL; memset(str_to_hash, 0, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN); strlcpy(str_to_hash, id->id_string, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN); hkey = arch_fast_hash(str_to_hash, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN, hkey = jhash(str_to_hash, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN, 0); hash_for_each_possible(ipa_ctx->ipa2_active_clients_logging.htable, hentry, list, hkey) { Loading Loading @@ -3730,7 +3730,8 @@ void ipa_suspend_handler(enum ipa_irq_type interrupt, * acquire wake lock as long as suspend * vote is held */ ipa_inc_acquire_wakelock(); ipa_inc_acquire_wakelock( IPA_WAKELOCK_REF_CLIENT_SPS); ipa_sps_process_irq_schedule_rel(); } mutex_unlock(&ipa_ctx->sps_pm.sps_pm_lock); Loading Loading @@ -3803,7 +3804,7 @@ static void ipa_sps_release_resource(struct work_struct *work) ipa_sps_process_irq_schedule_rel(); } else { atomic_set(&ipa_ctx->sps_pm.dec_clients, 0); ipa_dec_release_wakelock(); ipa_dec_release_wakelock(IPA_WAKELOCK_REF_CLIENT_SPS); IPA_ACTIVE_CLIENTS_DEC_SPECIAL("SPS_RESOURCE"); } } Loading Loading @@ -3922,6 +3923,7 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, ipa_ctx->skip_uc_pipe_reset = resource_p->skip_uc_pipe_reset; ipa_ctx->use_dma_zone = resource_p->use_dma_zone; ipa_ctx->tethered_flow_control = resource_p->tethered_flow_control; ipa_ctx->use_ipa_pm = resource_p->use_ipa_pm; /* Setting up IPA RX Polling Timeout Seconds */ ipa_rx_timeout_min_max_calc(&ipa_ctx->ipa_rx_min_timeout_usec, Loading Loading @@ -3973,7 +3975,8 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, ipa_ctx->ctrl->msm_bus_data_ptr); if (!ipa_ctx->ipa_bus_hdl) { IPAERR("fail to register with bus mgr!\n"); result = -ENODEV; result = -EPROBE_DEFER; bus_scale_table = NULL; goto fail_bus_reg; } } else { Loading Loading @@ -4429,11 +4432,11 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, ipa2_active_clients_log_destroy(); fail_init_active_client: msm_bus_scale_unregister_client(ipa_ctx->ipa_bus_hdl); fail_bus_reg: if (bus_scale_table) { msm_bus_cl_clear_pdata(bus_scale_table); bus_scale_table = NULL; } fail_bus_reg: fail_bind: kfree(ipa_ctx->ctrl); fail_mem_ctrl: Loading @@ -4445,12 +4448,20 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, return result; } bool ipa_pm_is_used(void) { return (ipa_ctx) ? ipa_ctx->use_ipa_pm : false; } static int get_ipa_dts_configuration(struct platform_device *pdev, struct ipa_plat_drv_res *ipa_drv_res) { int result; struct resource *resource; ipa_drv_res->use_ipa_pm = of_property_read_bool(pdev->dev.of_node, "qcom,use-ipa-pm"); IPADBG("use_ipa_pm=%d\n", ipa_drv_res->use_ipa_pm); /* initialize ipa_res */ ipa_drv_res->ipa_pipe_mem_start_ofst = IPA_PIPE_MEM_START_OFST; ipa_drv_res->ipa_pipe_mem_size = IPA_PIPE_MEM_SIZE; Loading Loading
drivers/platform/msm/ipa/ipa_clients/ipa_mhi_client.c +28 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,9 @@ #include <linux/ipa_qmi_service_v01.h> #include <linux/ipa_mhi.h> #include "../ipa_common_i.h" #ifdef CONFIG_IPA3 #include "../ipa_v3/ipa_pm.h" #endif #define IPA_MHI_DRV_NAME "ipa_mhi_client" #define IPA_MHI_DBG(fmt, args...) \ Loading Loading @@ -842,6 +844,7 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params) IPA_MHI_DBG("event_context_array_addr 0x%llx\n", ipa_mhi_client_ctx->event_context_array_addr); #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { res = ipa_pm_activate_sync(ipa_mhi_client_ctx->pm_hdl); if (res) { Loading @@ -854,6 +857,7 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params) goto fail_pm_activate_modem; } } else { #endif /* Add MHI <-> Q6 dependencies to IPA RM */ res = ipa_rm_add_dependency(IPA_RM_RESOURCE_MHI_PROD, IPA_RM_RESOURCE_Q6_CONS); Loading @@ -874,7 +878,9 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params) IPA_MHI_ERR("failed request prod %d\n", res); goto fail_request_prod; } #ifdef CONFIG_IPA3 } #endif /* gsi params */ init_params.gsi.first_ch_idx = Loading Loading @@ -912,12 +918,14 @@ int ipa_mhi_start(struct ipa_mhi_start_params *params) ipa_rm_delete_dependency(IPA_RM_RESOURCE_MHI_PROD, IPA_RM_RESOURCE_Q6_CONS); fail_add_mhi_q6_dep: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->modem_pm_hdl); fail_pm_activate_modem: if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); fail_pm_activate: #endif ipa_mhi_set_state(IPA_MHI_STATE_INITIALIZED); return res; } Loading Loading @@ -2124,6 +2132,7 @@ int ipa_mhi_suspend(bool force) */ IPA_ACTIVE_CLIENTS_INC_SIMPLE(); #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { res = ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); if (res) { Loading @@ -2136,6 +2145,7 @@ int ipa_mhi_suspend(bool force) goto fail_deactivate_modem_pm; } } else { #endif IPA_MHI_DBG("release prod\n"); res = ipa_mhi_release_prod(); if (res) { Loading @@ -2149,7 +2159,9 @@ int ipa_mhi_suspend(bool force) IPA_MHI_ERR("ipa_mhi_wait_for_cons_release failed\n"); goto fail_release_cons; } #ifdef CONFIG_IPA3 } #endif usleep_range(IPA_MHI_SUSPEND_SLEEP_MIN, IPA_MHI_SUSPEND_SLEEP_MAX); res = ipa_mhi_suspend_dl(force); Loading @@ -2176,12 +2188,14 @@ int ipa_mhi_suspend(bool force) if (!ipa_pm_is_used()) ipa_mhi_request_prod(); fail_release_prod: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->modem_pm_hdl); fail_deactivate_modem_pm: if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); fail_deactivate_pm: #endif IPA_ACTIVE_CLIENTS_DEC_SIMPLE(); fail_suspend_ul_channel: ipa_mhi_resume_channels(true, ipa_mhi_client_ctx->ul_channels); Loading Loading @@ -2241,6 +2255,7 @@ int ipa_mhi_resume(void) ipa_mhi_client_ctx->rm_cons_state = IPA_MHI_RM_STATE_GRANTED; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { res = ipa_pm_activate_sync(ipa_mhi_client_ctx->pm_hdl); if (res) { Loading @@ -2253,12 +2268,15 @@ int ipa_mhi_resume(void) goto fail_pm_activate_modem; } } else { #endif res = ipa_mhi_request_prod(); if (res) { IPA_MHI_ERR("ipa_mhi_request_prod failed %d\n", res); goto fail_request_prod; } #ifdef CONFIG_IPA3 } #endif /* resume all UL channels */ res = ipa_mhi_resume_channels(false, Loading Loading @@ -2298,12 +2316,14 @@ int ipa_mhi_resume(void) if (!ipa_pm_is_used()) ipa_mhi_release_prod(); fail_request_prod: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->modem_pm_hdl); fail_pm_activate_modem: if (ipa_pm_is_used()) ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); fail_pm_activate: #endif ipa_mhi_suspend_channels(ipa_mhi_client_ctx->dl_channels); fail_resume_dl_channels: ipa_mhi_set_state(IPA_MHI_STATE_SUSPENDED); Loading Loading @@ -2455,6 +2475,7 @@ static void ipa_mhi_delete_rm_resources(void) ipa_assert(); } #ifdef CONFIG_IPA3 static void ipa_mhi_deregister_pm(void) { ipa_pm_deactivate_sync(ipa_mhi_client_ctx->pm_hdl); Loading @@ -2465,7 +2486,7 @@ static void ipa_mhi_deregister_pm(void) ipa_pm_deregister(ipa_mhi_client_ctx->modem_pm_hdl); ipa_mhi_client_ctx->modem_pm_hdl = ~0; } #endif /** * ipa_mhi_destroy() - Destroy MHI IPA * Loading Loading @@ -2498,9 +2519,11 @@ void ipa_mhi_destroy(void) ipa_uc_mhi_cleanup(); } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_mhi_deregister_pm(); else #endif ipa_mhi_delete_rm_resources(); ipa_dma_destroy(); Loading @@ -2516,6 +2539,7 @@ void ipa_mhi_destroy(void) ipa_assert(); } #ifdef CONFIG_IPA3 static void ipa_mhi_pm_cb(void *p, enum ipa_pm_cb_event event) { unsigned long flags; Loading Loading @@ -2587,7 +2611,7 @@ static int ipa_mhi_register_pm(void) ipa_mhi_client_ctx->pm_hdl = ~0; return res; } #endif static int ipa_mhi_create_rm_resources(void) { int res; Loading Loading @@ -2725,9 +2749,11 @@ int ipa_mhi_init(struct ipa_mhi_init_params *params) goto fail_dma_init; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) res = ipa_mhi_register_pm(); else #endif res = ipa_mhi_create_rm_resources(); if (res) { IPA_MHI_ERR("failed to create RM resources\n"); Loading
drivers/platform/msm/ipa/ipa_clients/ipa_uc_offload.c +24 −2 Original line number Diff line number Diff line Loading @@ -13,7 +13,9 @@ #include <linux/ipa_uc_offload.h> #include <linux/msm_ipa.h> #include "../ipa_common_i.h" #ifdef CONFIG_IPA3 #include "../ipa_v3/ipa_pm.h" #endif #define IPA_NTN_DMA_POOL_ALIGNMENT 8 #define OFFLOAD_DRV_NAME "ipa_uc_offload" Loading Loading @@ -115,6 +117,7 @@ static int ipa_commit_partial_hdr( return 0; } #ifdef CONFIG_IPA3 static void ipa_uc_offload_ntn_pm_cb(void *p, enum ipa_pm_cb_event event) { /* suspend/resume is not supported */ Loading Loading @@ -156,6 +159,7 @@ static void ipa_uc_offload_ntn_deregister_pm_client( ipa_pm_deactivate_sync(ntn_ctx->pm_hdl); ipa_pm_deregister(ntn_ctx->pm_hdl); } #endif static int ipa_uc_offload_ntn_create_rm_resources( struct ipa_uc_offload_ctx *ntn_ctx) { Loading Loading @@ -203,9 +207,11 @@ static int ipa_uc_offload_ntn_reg_intf( IPA_UC_OFFLOAD_DBG("register interface for netdev %s\n", inp->netdev_name); #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ret = ipa_uc_offload_ntn_register_pm_client(ntn_ctx); else #endif ret = ipa_uc_offload_ntn_create_rm_resources(ntn_ctx); if (ret) { IPA_UC_OFFLOAD_ERR("fail to create rm resource\n"); Loading Loading @@ -289,12 +295,16 @@ static int ipa_uc_offload_ntn_reg_intf( fail: kfree(hdr); fail_alloc: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { ipa_uc_offload_ntn_deregister_pm_client(ntn_ctx); } else { #endif ipa_rm_delete_resource(IPA_RM_RESOURCE_ETHERNET_CONS); ipa_rm_delete_resource(IPA_RM_RESOURCE_ETHERNET_PROD); #ifdef CONFIG_IPA3 } #endif return ret; } Loading Loading @@ -412,6 +422,7 @@ int ipa_uc_ntn_conn_pipes(struct ipa_ntn_conn_in_params *inp, return -EINVAL; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { result = ipa_pm_activate_sync(ntn_ctx->pm_hdl); if (result) { Loading @@ -419,6 +430,7 @@ int ipa_uc_ntn_conn_pipes(struct ipa_ntn_conn_in_params *inp, return result; } } else { #endif result = ipa_rm_add_dependency(IPA_RM_RESOURCE_ETHERNET_PROD, IPA_RM_RESOURCE_APPS_CONS); if (result) { Loading @@ -440,7 +452,9 @@ int ipa_uc_ntn_conn_pipes(struct ipa_ntn_conn_in_params *inp, result = -EFAULT; goto fail; } #ifdef CONFIG_IPA3 } #endif ntn_ctx->state = IPA_UC_OFFLOAD_STATE_UP; result = ipa_setup_uc_ntn_pipes(inp, ntn_ctx->notify, Loading Loading @@ -529,11 +543,12 @@ int ipa_set_perf_profile(struct ipa_perf_profile *profile) return -EINVAL; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) return ipa_pm_set_perf_profile( ipa_uc_offload_ctx[IPA_UC_NTN]->pm_hdl, profile->max_supported_bw_mbps); #endif if (ipa_rm_set_perf_profile(resource_name, &rm_profile)) { IPA_UC_OFFLOAD_ERR("fail to setup rm perf profile\n"); return -EFAULT; Loading @@ -550,6 +565,7 @@ static int ipa_uc_ntn_disconn_pipes(struct ipa_uc_offload_ctx *ntn_ctx) ntn_ctx->state = IPA_UC_OFFLOAD_STATE_INITIALIZED; #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { ret = ipa_pm_deactivate_sync(ntn_ctx->pm_hdl); if (ret) { Loading @@ -558,6 +574,7 @@ static int ipa_uc_ntn_disconn_pipes(struct ipa_uc_offload_ctx *ntn_ctx) return -EFAULT; } } else { #endif ret = ipa_rm_release_resource(IPA_RM_RESOURCE_ETHERNET_PROD); if (ret) { IPA_UC_OFFLOAD_ERR("fail release ETHERNET_PROD: %d\n", Loading @@ -571,7 +588,9 @@ static int ipa_uc_ntn_disconn_pipes(struct ipa_uc_offload_ctx *ntn_ctx) IPA_UC_OFFLOAD_ERR("fail del dep ETH->APPS, %d\n", ret); return -EFAULT; } #ifdef CONFIG_IPA3 } #endif ipa_ep_idx_ul = ipa_get_ep_mapping(IPA_CLIENT_ETHERNET_PROD); ipa_ep_idx_dl = ipa_get_ep_mapping(IPA_CLIENT_ETHERNET_CONS); Loading Loading @@ -627,9 +646,11 @@ static int ipa_uc_ntn_cleanup(struct ipa_uc_offload_ctx *ntn_ctx) int len, result = 0; struct ipa_ioc_del_hdr *hdr; #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) { ipa_uc_offload_ntn_deregister_pm_client(ntn_ctx); } else { #endif if (ipa_rm_delete_resource(IPA_RM_RESOURCE_ETHERNET_PROD)) { IPA_UC_OFFLOAD_ERR("fail to delete ETHERNET_PROD\n"); return -EFAULT; Loading @@ -639,8 +660,9 @@ static int ipa_uc_ntn_cleanup(struct ipa_uc_offload_ctx *ntn_ctx) IPA_UC_OFFLOAD_ERR("fail to delete ETHERNET_CONS\n"); return -EFAULT; } #ifdef CONFIG_IPA3 } #endif len = sizeof(struct ipa_ioc_del_hdr) + 2 * sizeof(struct ipa_hdr_del); hdr = kzalloc(len, GFP_KERNEL); if (hdr == NULL) { Loading
drivers/platform/msm/ipa/ipa_clients/odu_bridge.c +2 −0 Original line number Diff line number Diff line Loading @@ -27,7 +27,9 @@ #include <linux/cdev.h> #include <linux/ipa_odu_bridge.h> #include "../ipa_common_i.h" #ifdef CONFIG_IPA3 #include "../ipa_v3/ipa_pm.h" #endif #define ODU_BRIDGE_DRV_NAME "odu_ipa_bridge" Loading
drivers/platform/msm/ipa/ipa_clients/rndis_ipa.c +18 −3 Original line number Diff line number Diff line Loading @@ -28,7 +28,9 @@ #include <linux/rndis_ipa.h> #include <linux/workqueue.h> #include "../ipa_common_i.h" #ifdef CONFIG_IPA3 #include "../ipa_v3/ipa_pm.h" #endif #define CREATE_TRACE_POINTS #include "rndis_ipa_trace.h" Loading Loading @@ -240,8 +242,10 @@ static void rndis_ipa_rm_notify unsigned long data); static int rndis_ipa_create_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx); static int rndis_ipa_destroy_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx); #ifdef CONFIG_IPA3 static int rndis_ipa_register_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx); static int rndis_ipa_deregister_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx); #endif static bool rx_filter(struct sk_buff *skb); static bool tx_filter(struct sk_buff *skb); static bool rm_enabled(struct rndis_ipa_dev *rndis_ipa_ctx); Loading Loading @@ -721,9 +725,11 @@ int rndis_ipa_pipe_connect_notify( return -EINVAL; } #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) result = rndis_ipa_register_pm_client(rndis_ipa_ctx); else #endif result = rndis_ipa_create_rm_resource(rndis_ipa_ctx); if (result) { RNDIS_IPA_ERROR("fail on RM create\n"); Loading Loading @@ -787,9 +793,11 @@ int rndis_ipa_pipe_connect_notify( return 0; fail: #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) rndis_ipa_deregister_pm_client(rndis_ipa_ctx); else #endif rndis_ipa_destroy_rm_resource(rndis_ipa_ctx); fail_create_rm: return result; Loading Loading @@ -1262,9 +1270,11 @@ int rndis_ipa_pipe_disconnect_notify(void *private) rndis_ipa_ctx->net->stats.tx_dropped += outstanding_dropped_pkts; atomic_set(&rndis_ipa_ctx->outstanding_pkts, 0); #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) retval = rndis_ipa_deregister_pm_client(rndis_ipa_ctx); else #endif retval = rndis_ipa_destroy_rm_resource(rndis_ipa_ctx); if (retval) { RNDIS_IPA_ERROR("Fail to clean RM\n"); Loading Loading @@ -1822,6 +1832,7 @@ static int rndis_ipa_create_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx) return result; } #ifdef CONFIG_IPA3 static void rndis_ipa_pm_cb(void *p, enum ipa_pm_cb_event event) { struct rndis_ipa_dev *rndis_ipa_ctx = p; Loading @@ -1844,7 +1855,7 @@ static void rndis_ipa_pm_cb(void *p, enum ipa_pm_cb_event event) RNDIS_IPA_LOG_EXIT(); } #endif /** * rndis_ipa_destroy_rm_resource() - delete the dependency and destroy * the resource done on rndis_ipa_create_rm_resource() Loading Loading @@ -1904,6 +1915,7 @@ static int rndis_ipa_destroy_rm_resource(struct rndis_ipa_dev *rndis_ipa_ctx) return result; } #ifdef CONFIG_IPA3 static int rndis_ipa_register_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx) { int result; Loading @@ -1930,7 +1942,7 @@ static int rndis_ipa_deregister_pm_client(struct rndis_ipa_dev *rndis_ipa_ctx) rndis_ipa_ctx->pm_hdl = ~0; return 0; } #endif /** * resource_request() - request for the Netdev resource * @rndis_ipa_ctx: main driver context Loading @@ -1951,9 +1963,10 @@ static int resource_request(struct rndis_ipa_dev *rndis_ipa_ctx) if (!rm_enabled(rndis_ipa_ctx)) return result; #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) return ipa_pm_activate(rndis_ipa_ctx->pm_hdl); #endif return ipa_rm_inactivity_timer_request_resource( DRV_RESOURCE_ID); Loading @@ -1972,9 +1985,11 @@ static void resource_release(struct rndis_ipa_dev *rndis_ipa_ctx) { if (!rm_enabled(rndis_ipa_ctx)) return; #ifdef CONFIG_IPA3 if (ipa_pm_is_used()) ipa_pm_deferred_deactivate(rndis_ipa_ctx->pm_hdl); else #endif ipa_rm_inactivity_timer_release_resource(DRV_RESOURCE_ID); return; Loading
drivers/platform/msm/ipa/ipa_v2/ipa.c +17 −6 Original line number Diff line number Diff line Loading @@ -32,7 +32,7 @@ #include <linux/delay.h> #include <linux/time.h> #include <linux/hashtable.h> #include <linux/hash.h> #include <linux/jhash.h> #include "ipa_i.h" #include "../ipa_rm_i.h" Loading Loading @@ -3281,7 +3281,7 @@ void ipa2_active_clients_log_mod(struct ipa_active_client_logging_info *id, hfound = NULL; memset(str_to_hash, 0, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN); strlcpy(str_to_hash, id->id_string, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN); hkey = arch_fast_hash(str_to_hash, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN, hkey = jhash(str_to_hash, IPA2_ACTIVE_CLIENTS_LOG_NAME_LEN, 0); hash_for_each_possible(ipa_ctx->ipa2_active_clients_logging.htable, hentry, list, hkey) { Loading Loading @@ -3730,7 +3730,8 @@ void ipa_suspend_handler(enum ipa_irq_type interrupt, * acquire wake lock as long as suspend * vote is held */ ipa_inc_acquire_wakelock(); ipa_inc_acquire_wakelock( IPA_WAKELOCK_REF_CLIENT_SPS); ipa_sps_process_irq_schedule_rel(); } mutex_unlock(&ipa_ctx->sps_pm.sps_pm_lock); Loading Loading @@ -3803,7 +3804,7 @@ static void ipa_sps_release_resource(struct work_struct *work) ipa_sps_process_irq_schedule_rel(); } else { atomic_set(&ipa_ctx->sps_pm.dec_clients, 0); ipa_dec_release_wakelock(); ipa_dec_release_wakelock(IPA_WAKELOCK_REF_CLIENT_SPS); IPA_ACTIVE_CLIENTS_DEC_SPECIAL("SPS_RESOURCE"); } } Loading Loading @@ -3922,6 +3923,7 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, ipa_ctx->skip_uc_pipe_reset = resource_p->skip_uc_pipe_reset; ipa_ctx->use_dma_zone = resource_p->use_dma_zone; ipa_ctx->tethered_flow_control = resource_p->tethered_flow_control; ipa_ctx->use_ipa_pm = resource_p->use_ipa_pm; /* Setting up IPA RX Polling Timeout Seconds */ ipa_rx_timeout_min_max_calc(&ipa_ctx->ipa_rx_min_timeout_usec, Loading Loading @@ -3973,7 +3975,8 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, ipa_ctx->ctrl->msm_bus_data_ptr); if (!ipa_ctx->ipa_bus_hdl) { IPAERR("fail to register with bus mgr!\n"); result = -ENODEV; result = -EPROBE_DEFER; bus_scale_table = NULL; goto fail_bus_reg; } } else { Loading Loading @@ -4429,11 +4432,11 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, ipa2_active_clients_log_destroy(); fail_init_active_client: msm_bus_scale_unregister_client(ipa_ctx->ipa_bus_hdl); fail_bus_reg: if (bus_scale_table) { msm_bus_cl_clear_pdata(bus_scale_table); bus_scale_table = NULL; } fail_bus_reg: fail_bind: kfree(ipa_ctx->ctrl); fail_mem_ctrl: Loading @@ -4445,12 +4448,20 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, return result; } bool ipa_pm_is_used(void) { return (ipa_ctx) ? ipa_ctx->use_ipa_pm : false; } static int get_ipa_dts_configuration(struct platform_device *pdev, struct ipa_plat_drv_res *ipa_drv_res) { int result; struct resource *resource; ipa_drv_res->use_ipa_pm = of_property_read_bool(pdev->dev.of_node, "qcom,use-ipa-pm"); IPADBG("use_ipa_pm=%d\n", ipa_drv_res->use_ipa_pm); /* initialize ipa_res */ ipa_drv_res->ipa_pipe_mem_start_ofst = IPA_PIPE_MEM_START_OFST; ipa_drv_res->ipa_pipe_mem_size = IPA_PIPE_MEM_SIZE; Loading