Loading Documentation/devicetree/bindings/platform/msm/ipa.txt +2 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,8 @@ memory allocation over a PCIe bridge hashing not supported. - qcom,wlan-ce-db-over-pcie: Boolean context flag to represent WLAN CE DB over pcie bus or not. - qcom,ipa-wdi2_over_gsi: Boolean context flag to indicate WDI2 offload over GSI supported or not. IPA pipe sub nodes (A2 static pipes configurations): Loading drivers/platform/msm/gsi/gsi.c +23 −1 Original line number Diff line number Diff line Loading @@ -1367,12 +1367,27 @@ static void gsi_prime_evt_ring(struct gsi_evt_ctx *ctx) spin_unlock_irqrestore(&ctx->ring.slock, flags); } static void gsi_prime_evt_ring_wdi(struct gsi_evt_ctx *ctx) { unsigned long flags; spin_lock_irqsave(&ctx->ring.slock, flags); if (ctx->ring.base_va) memset((void *)ctx->ring.base_va, 0, ctx->ring.len); ctx->ring.wp_local = ctx->ring.base + ((ctx->ring.max_num_elem + 2) * ctx->ring.elem_sz); gsi_ring_evt_doorbell(ctx); spin_unlock_irqrestore(&ctx->ring.slock, flags); } static int gsi_validate_evt_ring_props(struct gsi_evt_ring_props *props) { uint64_t ra; if ((props->re_size == GSI_EVT_RING_RE_SIZE_4B && props->ring_len % 4) || (props->re_size == GSI_EVT_RING_RE_SIZE_8B && props->ring_len % 8) || (props->re_size == GSI_EVT_RING_RE_SIZE_16B && props->ring_len % 16)) { GSIERR("bad params ring_len %u not a multiple of RE size %u\n", Loading Loading @@ -1505,6 +1520,8 @@ int gsi_alloc_evt_ring(struct gsi_evt_ring_props *props, unsigned long dev_hdl, atomic_inc(&gsi_ctx->num_evt_ring); if (props->intf == GSI_EVT_CHTYPE_GPI_EV) gsi_prime_evt_ring(ctx); else if (props->intf == GSI_EVT_CHTYPE_WDI_EV) gsi_prime_evt_ring_wdi(ctx); mutex_unlock(&gsi_ctx->mlock); spin_lock_irqsave(&gsi_ctx->slock, flags); Loading Loading @@ -1578,7 +1595,8 @@ int gsi_dealloc_evt_ring(unsigned long evt_ring_hdl) return -GSI_STATUS_NODEV; } if (evt_ring_hdl >= gsi_ctx->max_ev) { if (evt_ring_hdl >= gsi_ctx->max_ev || evt_ring_hdl >= GSI_EVT_RING_MAX) { GSIERR("bad params evt_ring_hdl=%lu\n", evt_ring_hdl); return -GSI_STATUS_INVALID_PARAMS; } Loading Loading @@ -1757,6 +1775,8 @@ int gsi_reset_evt_ring(unsigned long evt_ring_hdl) if (ctx->props.intf == GSI_EVT_CHTYPE_GPI_EV) gsi_prime_evt_ring(ctx); if (ctx->props.intf == GSI_EVT_CHTYPE_WDI_EV) gsi_prime_evt_ring_wdi(ctx); mutex_unlock(&gsi_ctx->mlock); return GSI_STATUS_SUCCESS; Loading Loading @@ -1980,6 +2000,8 @@ static int gsi_validate_channel_props(struct gsi_chan_props *props) if ((props->re_size == GSI_CHAN_RE_SIZE_4B && props->ring_len % 4) || (props->re_size == GSI_CHAN_RE_SIZE_8B && props->ring_len % 8) || (props->re_size == GSI_CHAN_RE_SIZE_16B && props->ring_len % 16) || (props->re_size == GSI_CHAN_RE_SIZE_32B && Loading drivers/platform/msm/ipa/ipa_v3/ipa.c +8 −0 Original line number Diff line number Diff line Loading @@ -5104,6 +5104,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, ipa3_ctx->use_ipa_teth_bridge = resource_p->use_ipa_teth_bridge; ipa3_ctx->modem_cfg_emb_pipe_flt = resource_p->modem_cfg_emb_pipe_flt; ipa3_ctx->ipa_wdi2 = resource_p->ipa_wdi2; ipa3_ctx->ipa_wdi2_over_gsi = resource_p->ipa_wdi2_over_gsi; ipa3_ctx->ipa_fltrt_not_hashable = resource_p->ipa_fltrt_not_hashable; ipa3_ctx->use_64_bit_dma_mask = resource_p->use_64_bit_dma_mask; ipa3_ctx->wan_rx_ring_size = resource_p->wan_rx_ring_size; Loading Loading @@ -5699,6 +5700,7 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, ipa_drv_res->ipa3_hw_mode = 0; ipa_drv_res->modem_cfg_emb_pipe_flt = false; ipa_drv_res->ipa_wdi2 = false; ipa_drv_res->ipa_wdi2_over_gsi = false; ipa_drv_res->ipa_mhi_dynamic_config = false; ipa_drv_res->use_64_bit_dma_mask = false; ipa_drv_res->use_bw_vote = false; Loading Loading @@ -5781,6 +5783,12 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, IPADBG(": modem configure embedded pipe filtering = %s\n", ipa_drv_res->modem_cfg_emb_pipe_flt ? "True" : "False"); ipa_drv_res->ipa_wdi2_over_gsi = of_property_read_bool(pdev->dev.of_node, "qcom,ipa-wdi2_over_gsi"); IPADBG(": WDI-2.0 over gsi= %s\n", ipa_drv_res->ipa_wdi2_over_gsi ? "True" : "False"); ipa_drv_res->ipa_wdi2 = of_property_read_bool(pdev->dev.of_node, Loading drivers/platform/msm/ipa/ipa_v3/ipa_i.h +26 −0 Original line number Diff line number Diff line Loading @@ -788,6 +788,7 @@ struct ipa3_ep_context { bool keep_ipa_awake; struct ipa3_wlan_stats wstats; u32 uc_offload_state; u32 gsi_offload_state; bool disconnect_in_progress; u32 qmi_request_sent; bool napi_enabled; Loading Loading @@ -1278,6 +1279,19 @@ struct ipa3_uc_wdi_ctx { #endif }; /** * struct ipa3_wdi2_ctx - IPA wdi2 context */ struct ipa3_wdi2_ctx { phys_addr_t rdy_ring_base_pa; phys_addr_t rdy_ring_rp_pa; u32 rdy_ring_size; phys_addr_t rdy_comp_ring_base_pa; phys_addr_t rdy_comp_ring_wp_pa; u32 rdy_comp_ring_size; u32 *rdy_ring_rp_va; u32 *rdy_comp_ring_wp_va; }; /** * struct ipa3_transport_pm - transport power management related members * @transport_pm_mutex: Mutex to protect the transport_pm functionality. Loading Loading @@ -1569,6 +1583,7 @@ struct ipa3_context { bool use_ipa_teth_bridge; bool modem_cfg_emb_pipe_flt; bool ipa_wdi2; bool ipa_wdi2_over_gsi; bool ipa_fltrt_not_hashable; bool use_64_bit_dma_mask; /* featurize if memory footprint becomes a concern */ Loading Loading @@ -1631,6 +1646,7 @@ struct ipa3_context { bool use_ipa_pm; bool vlan_mode_iface[IPA_VLAN_IF_MAX]; bool wdi_over_pcie; struct ipa3_wdi2_ctx wdi2_ctx; }; struct ipa3_plat_drv_res { Loading @@ -1651,6 +1667,7 @@ struct ipa3_plat_drv_res { u32 ee; bool modem_cfg_emb_pipe_flt; bool ipa_wdi2; bool ipa_wdi2_over_gsi; bool ipa_fltrt_not_hashable; bool use_64_bit_dma_mask; bool use_bw_vote; Loading Loading @@ -2162,10 +2179,17 @@ int ipa3_sys_update_gsi_hdls(u32 clnt_hdl, unsigned long gsi_ch_hdl, int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, struct ipa_wdi_out_params *out); int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, struct ipa_wdi_out_params *out); int ipa3_disconnect_wdi_pipe(u32 clnt_hdl); int ipa3_enable_wdi_pipe(u32 clnt_hdl); int ipa3_enable_gsi_wdi_pipe(u32 clnt_hdl); int ipa3_disable_wdi_pipe(u32 clnt_hdl); int ipa3_disable_gsi_wdi_pipe(u32 clnt_hdl); int ipa3_disconnect_gsi_wdi_pipe(u32 clnt_hdl); int ipa3_resume_wdi_pipe(u32 clnt_hdl); int ipa3_resume_gsi_wdi_pipe(u32 clnt_hdl); int ipa3_suspend_wdi_pipe(u32 clnt_hdl); int ipa3_get_wdi_stats(struct IpaHwStatsWDIInfoData_t *stats); u16 ipa3_get_smem_restr_bytes(void); Loading Loading @@ -2415,6 +2439,7 @@ void ipa3_delete_dflt_flt_rules(u32 ipa_ep_idx); int ipa3_enable_data_path(u32 clnt_hdl); int ipa3_disable_data_path(u32 clnt_hdl); int ipa3_disable_gsi_data_path(u32 clnt_hdl); int ipa3_alloc_rule_id(struct idr *rule_ids); int ipa3_id_alloc(void *ptr); void *ipa3_id_find(u32 id); Loading @@ -2437,6 +2462,7 @@ int ipa3_tag_aggr_force_close(int pipe_num); void ipa3_active_clients_unlock(void); int ipa3_wdi_init(void); int ipa3_write_qmapid_gsi_wdi_pipe(u32 clnt_hdl, u8 qmap_id); int ipa3_write_qmapid_wdi_pipe(u32 clnt_hdl, u8 qmap_id); int ipa3_tag_process(struct ipa3_desc *desc, int num_descs, unsigned long timeout); Loading drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c +878 −0 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
Documentation/devicetree/bindings/platform/msm/ipa.txt +2 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,8 @@ memory allocation over a PCIe bridge hashing not supported. - qcom,wlan-ce-db-over-pcie: Boolean context flag to represent WLAN CE DB over pcie bus or not. - qcom,ipa-wdi2_over_gsi: Boolean context flag to indicate WDI2 offload over GSI supported or not. IPA pipe sub nodes (A2 static pipes configurations): Loading
drivers/platform/msm/gsi/gsi.c +23 −1 Original line number Diff line number Diff line Loading @@ -1367,12 +1367,27 @@ static void gsi_prime_evt_ring(struct gsi_evt_ctx *ctx) spin_unlock_irqrestore(&ctx->ring.slock, flags); } static void gsi_prime_evt_ring_wdi(struct gsi_evt_ctx *ctx) { unsigned long flags; spin_lock_irqsave(&ctx->ring.slock, flags); if (ctx->ring.base_va) memset((void *)ctx->ring.base_va, 0, ctx->ring.len); ctx->ring.wp_local = ctx->ring.base + ((ctx->ring.max_num_elem + 2) * ctx->ring.elem_sz); gsi_ring_evt_doorbell(ctx); spin_unlock_irqrestore(&ctx->ring.slock, flags); } static int gsi_validate_evt_ring_props(struct gsi_evt_ring_props *props) { uint64_t ra; if ((props->re_size == GSI_EVT_RING_RE_SIZE_4B && props->ring_len % 4) || (props->re_size == GSI_EVT_RING_RE_SIZE_8B && props->ring_len % 8) || (props->re_size == GSI_EVT_RING_RE_SIZE_16B && props->ring_len % 16)) { GSIERR("bad params ring_len %u not a multiple of RE size %u\n", Loading Loading @@ -1505,6 +1520,8 @@ int gsi_alloc_evt_ring(struct gsi_evt_ring_props *props, unsigned long dev_hdl, atomic_inc(&gsi_ctx->num_evt_ring); if (props->intf == GSI_EVT_CHTYPE_GPI_EV) gsi_prime_evt_ring(ctx); else if (props->intf == GSI_EVT_CHTYPE_WDI_EV) gsi_prime_evt_ring_wdi(ctx); mutex_unlock(&gsi_ctx->mlock); spin_lock_irqsave(&gsi_ctx->slock, flags); Loading Loading @@ -1578,7 +1595,8 @@ int gsi_dealloc_evt_ring(unsigned long evt_ring_hdl) return -GSI_STATUS_NODEV; } if (evt_ring_hdl >= gsi_ctx->max_ev) { if (evt_ring_hdl >= gsi_ctx->max_ev || evt_ring_hdl >= GSI_EVT_RING_MAX) { GSIERR("bad params evt_ring_hdl=%lu\n", evt_ring_hdl); return -GSI_STATUS_INVALID_PARAMS; } Loading Loading @@ -1757,6 +1775,8 @@ int gsi_reset_evt_ring(unsigned long evt_ring_hdl) if (ctx->props.intf == GSI_EVT_CHTYPE_GPI_EV) gsi_prime_evt_ring(ctx); if (ctx->props.intf == GSI_EVT_CHTYPE_WDI_EV) gsi_prime_evt_ring_wdi(ctx); mutex_unlock(&gsi_ctx->mlock); return GSI_STATUS_SUCCESS; Loading Loading @@ -1980,6 +2000,8 @@ static int gsi_validate_channel_props(struct gsi_chan_props *props) if ((props->re_size == GSI_CHAN_RE_SIZE_4B && props->ring_len % 4) || (props->re_size == GSI_CHAN_RE_SIZE_8B && props->ring_len % 8) || (props->re_size == GSI_CHAN_RE_SIZE_16B && props->ring_len % 16) || (props->re_size == GSI_CHAN_RE_SIZE_32B && Loading
drivers/platform/msm/ipa/ipa_v3/ipa.c +8 −0 Original line number Diff line number Diff line Loading @@ -5104,6 +5104,7 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p, ipa3_ctx->use_ipa_teth_bridge = resource_p->use_ipa_teth_bridge; ipa3_ctx->modem_cfg_emb_pipe_flt = resource_p->modem_cfg_emb_pipe_flt; ipa3_ctx->ipa_wdi2 = resource_p->ipa_wdi2; ipa3_ctx->ipa_wdi2_over_gsi = resource_p->ipa_wdi2_over_gsi; ipa3_ctx->ipa_fltrt_not_hashable = resource_p->ipa_fltrt_not_hashable; ipa3_ctx->use_64_bit_dma_mask = resource_p->use_64_bit_dma_mask; ipa3_ctx->wan_rx_ring_size = resource_p->wan_rx_ring_size; Loading Loading @@ -5699,6 +5700,7 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, ipa_drv_res->ipa3_hw_mode = 0; ipa_drv_res->modem_cfg_emb_pipe_flt = false; ipa_drv_res->ipa_wdi2 = false; ipa_drv_res->ipa_wdi2_over_gsi = false; ipa_drv_res->ipa_mhi_dynamic_config = false; ipa_drv_res->use_64_bit_dma_mask = false; ipa_drv_res->use_bw_vote = false; Loading Loading @@ -5781,6 +5783,12 @@ static int get_ipa_dts_configuration(struct platform_device *pdev, IPADBG(": modem configure embedded pipe filtering = %s\n", ipa_drv_res->modem_cfg_emb_pipe_flt ? "True" : "False"); ipa_drv_res->ipa_wdi2_over_gsi = of_property_read_bool(pdev->dev.of_node, "qcom,ipa-wdi2_over_gsi"); IPADBG(": WDI-2.0 over gsi= %s\n", ipa_drv_res->ipa_wdi2_over_gsi ? "True" : "False"); ipa_drv_res->ipa_wdi2 = of_property_read_bool(pdev->dev.of_node, Loading
drivers/platform/msm/ipa/ipa_v3/ipa_i.h +26 −0 Original line number Diff line number Diff line Loading @@ -788,6 +788,7 @@ struct ipa3_ep_context { bool keep_ipa_awake; struct ipa3_wlan_stats wstats; u32 uc_offload_state; u32 gsi_offload_state; bool disconnect_in_progress; u32 qmi_request_sent; bool napi_enabled; Loading Loading @@ -1278,6 +1279,19 @@ struct ipa3_uc_wdi_ctx { #endif }; /** * struct ipa3_wdi2_ctx - IPA wdi2 context */ struct ipa3_wdi2_ctx { phys_addr_t rdy_ring_base_pa; phys_addr_t rdy_ring_rp_pa; u32 rdy_ring_size; phys_addr_t rdy_comp_ring_base_pa; phys_addr_t rdy_comp_ring_wp_pa; u32 rdy_comp_ring_size; u32 *rdy_ring_rp_va; u32 *rdy_comp_ring_wp_va; }; /** * struct ipa3_transport_pm - transport power management related members * @transport_pm_mutex: Mutex to protect the transport_pm functionality. Loading Loading @@ -1569,6 +1583,7 @@ struct ipa3_context { bool use_ipa_teth_bridge; bool modem_cfg_emb_pipe_flt; bool ipa_wdi2; bool ipa_wdi2_over_gsi; bool ipa_fltrt_not_hashable; bool use_64_bit_dma_mask; /* featurize if memory footprint becomes a concern */ Loading Loading @@ -1631,6 +1646,7 @@ struct ipa3_context { bool use_ipa_pm; bool vlan_mode_iface[IPA_VLAN_IF_MAX]; bool wdi_over_pcie; struct ipa3_wdi2_ctx wdi2_ctx; }; struct ipa3_plat_drv_res { Loading @@ -1651,6 +1667,7 @@ struct ipa3_plat_drv_res { u32 ee; bool modem_cfg_emb_pipe_flt; bool ipa_wdi2; bool ipa_wdi2_over_gsi; bool ipa_fltrt_not_hashable; bool use_64_bit_dma_mask; bool use_bw_vote; Loading Loading @@ -2162,10 +2179,17 @@ int ipa3_sys_update_gsi_hdls(u32 clnt_hdl, unsigned long gsi_ch_hdl, int ipa3_connect_wdi_pipe(struct ipa_wdi_in_params *in, struct ipa_wdi_out_params *out); int ipa3_connect_gsi_wdi_pipe(struct ipa_wdi_in_params *in, struct ipa_wdi_out_params *out); int ipa3_disconnect_wdi_pipe(u32 clnt_hdl); int ipa3_enable_wdi_pipe(u32 clnt_hdl); int ipa3_enable_gsi_wdi_pipe(u32 clnt_hdl); int ipa3_disable_wdi_pipe(u32 clnt_hdl); int ipa3_disable_gsi_wdi_pipe(u32 clnt_hdl); int ipa3_disconnect_gsi_wdi_pipe(u32 clnt_hdl); int ipa3_resume_wdi_pipe(u32 clnt_hdl); int ipa3_resume_gsi_wdi_pipe(u32 clnt_hdl); int ipa3_suspend_wdi_pipe(u32 clnt_hdl); int ipa3_get_wdi_stats(struct IpaHwStatsWDIInfoData_t *stats); u16 ipa3_get_smem_restr_bytes(void); Loading Loading @@ -2415,6 +2439,7 @@ void ipa3_delete_dflt_flt_rules(u32 ipa_ep_idx); int ipa3_enable_data_path(u32 clnt_hdl); int ipa3_disable_data_path(u32 clnt_hdl); int ipa3_disable_gsi_data_path(u32 clnt_hdl); int ipa3_alloc_rule_id(struct idr *rule_ids); int ipa3_id_alloc(void *ptr); void *ipa3_id_find(u32 id); Loading @@ -2437,6 +2462,7 @@ int ipa3_tag_aggr_force_close(int pipe_num); void ipa3_active_clients_unlock(void); int ipa3_wdi_init(void); int ipa3_write_qmapid_gsi_wdi_pipe(u32 clnt_hdl, u8 qmap_id); int ipa3_write_qmapid_wdi_pipe(u32 clnt_hdl, u8 qmap_id); int ipa3_tag_process(struct ipa3_desc *desc, int num_descs, unsigned long timeout); Loading
drivers/platform/msm/ipa/ipa_v3/ipa_uc_wdi.c +878 −0 File changed.Preview size limit exceeded, changes collapsed. Show changes