Loading drivers/platform/msm/ipa_fmwk/ipa_fmwk.c +196 −2 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/ipa_fmwk.h> Loading Loading @@ -318,6 +319,35 @@ struct ipa_fmwk_contex { bool (*ipa_wdi_is_tx1_used)(void); int (*ipa_wdi_get_capabilities)(struct ipa_wdi_capabilities_out_params *out); int (*ipa_wdi_init_per_inst)(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out); int (*ipa_wdi_cleanup_per_inst)(u32 hdl); int (*ipa_wdi_reg_intf_per_inst)( struct ipa_wdi_reg_intf_in_params *in); int (*ipa_wdi_dereg_intf_per_inst)(const char *netdev_name, u32 hdl); int (*ipa_wdi_conn_pipes_per_inst)(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out); int (*ipa_wdi_disconn_pipes_per_inst)(u32 hdl); int (*ipa_wdi_enable_pipes_per_inst)(u32 hdl); int (*ipa_wdi_disable_pipes_per_inst)(u32 hdl); int (*ipa_wdi_set_perf_profile_per_inst)(u32 hdl, struct ipa_wdi_perf_profile *profile); int (*ipa_wdi_create_smmu_mapping_per_inst)(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); int (*ipa_wdi_release_smmu_mapping_per_inst)(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); /* ipa_gsb APIs*/ int (*ipa_bridge_init)(struct ipa_bridge_init_params *params, u32 *hdl); Loading Loading @@ -1248,7 +1278,19 @@ int ipa_fmwk_register_ipa_wdi3(const struct ipa_wdi3_data *in) || ipa_fmwk_ctx->ipa_wdi_get_stats || ipa_fmwk_ctx->ipa_get_wdi_version || ipa_fmwk_ctx->ipa_wdi_sw_stats || ipa_fmwk_ctx->ipa_wdi_is_tx1_used) { || ipa_fmwk_ctx->ipa_wdi_is_tx1_used || ipa_fmwk_ctx->ipa_wdi_get_capabilities || ipa_fmwk_ctx->ipa_wdi_init_per_inst || ipa_fmwk_ctx->ipa_wdi_cleanup_per_inst || ipa_fmwk_ctx->ipa_wdi_reg_intf_per_inst || ipa_fmwk_ctx->ipa_wdi_dereg_intf_per_inst || ipa_fmwk_ctx->ipa_wdi_conn_pipes_per_inst || ipa_fmwk_ctx->ipa_wdi_disconn_pipes_per_inst || ipa_fmwk_ctx->ipa_wdi_enable_pipes_per_inst || ipa_fmwk_ctx->ipa_wdi_disable_pipes_per_inst || ipa_fmwk_ctx->ipa_wdi_set_perf_profile_per_inst || ipa_fmwk_ctx->ipa_wdi_create_smmu_mapping_per_inst || ipa_fmwk_ctx->ipa_wdi_release_smmu_mapping_per_inst) { pr_err("ipa_wdi3 APIs were already initialized\n"); return -EPERM; } Loading @@ -1271,7 +1313,26 @@ int ipa_fmwk_register_ipa_wdi3(const struct ipa_wdi3_data *in) ipa_fmwk_ctx->ipa_wdi_sw_stats = in->ipa_wdi_sw_stats; ipa_fmwk_ctx->ipa_get_wdi_version = in->ipa_get_wdi_version; ipa_fmwk_ctx->ipa_wdi_is_tx1_used = in->ipa_wdi_is_tx1_used; ipa_fmwk_ctx->ipa_wdi_get_capabilities = in->ipa_wdi_get_capabilities; ipa_fmwk_ctx->ipa_wdi_init_per_inst = in->ipa_wdi_init_per_inst; ipa_fmwk_ctx->ipa_wdi_cleanup_per_inst = in->ipa_wdi_cleanup_per_inst; ipa_fmwk_ctx->ipa_wdi_reg_intf_per_inst = in->ipa_wdi_reg_intf_per_inst; ipa_fmwk_ctx->ipa_wdi_dereg_intf_per_inst = in->ipa_wdi_dereg_intf_per_inst; ipa_fmwk_ctx->ipa_wdi_conn_pipes_per_inst = in->ipa_wdi_conn_pipes_per_inst; ipa_fmwk_ctx->ipa_wdi_disconn_pipes_per_inst = in->ipa_wdi_disconn_pipes_per_inst; ipa_fmwk_ctx->ipa_wdi_enable_pipes_per_inst = in->ipa_wdi_enable_pipes_per_inst; ipa_fmwk_ctx->ipa_wdi_disable_pipes_per_inst = in->ipa_wdi_disable_pipes_per_inst; ipa_fmwk_ctx->ipa_wdi_set_perf_profile_per_inst = in->ipa_wdi_set_perf_profile_per_inst; ipa_fmwk_ctx->ipa_wdi_create_smmu_mapping_per_inst = in->ipa_wdi_create_smmu_mapping_per_inst; ipa_fmwk_ctx->ipa_wdi_release_smmu_mapping_per_inst = in->ipa_wdi_release_smmu_mapping_per_inst; pr_info("ipa_wdi3 registered successfully\n"); return 0; Loading Loading @@ -1411,6 +1472,139 @@ int ipa_wdi_release_smmu_mapping(u32 num_buffers, } EXPORT_SYMBOL(ipa_wdi_release_smmu_mapping); int ipa_wdi_get_capabilities(struct ipa_wdi_capabilities_out_params *out) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_get_capabilities, out); return ret; } EXPORT_SYMBOL(ipa_wdi_get_capabilities); int ipa_wdi_init_per_inst(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_init_per_inst, in, out); return ret; } EXPORT_SYMBOL(ipa_wdi_init_per_inst); int ipa_wdi_cleanup_per_inst(u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_cleanup_per_inst, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_cleanup_per_inst); int ipa_wdi_reg_intf_per_inst( struct ipa_wdi_reg_intf_in_params *in) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_reg_intf_per_inst, in); return ret; } EXPORT_SYMBOL(ipa_wdi_reg_intf_per_inst); int ipa_wdi_dereg_intf_per_inst(const char *netdev_name, u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_dereg_intf_per_inst, netdev_name, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_dereg_intf_per_inst); int ipa_wdi_conn_pipes_per_inst(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_conn_pipes_per_inst, in, out); return ret; } EXPORT_SYMBOL(ipa_wdi_conn_pipes_per_inst); int ipa_wdi_disconn_pipes_per_inst(u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_disconn_pipes_per_inst, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_disconn_pipes_per_inst); int ipa_wdi_enable_pipes_per_inst(u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_enable_pipes_per_inst, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_enable_pipes_per_inst); int ipa_wdi_disable_pipes_per_inst(u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_disable_pipes_per_inst, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_disable_pipes_per_inst); int ipa_wdi_set_perf_profile_per_inst(u32 hdl, struct ipa_wdi_perf_profile *profile) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_set_perf_profile_per_inst, hdl, profile); return ret; } EXPORT_SYMBOL(ipa_wdi_set_perf_profile_per_inst); int ipa_wdi_create_smmu_mapping_per_inst(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info) { int ret; IPA_FMWK_DISPATCH_RETURN_DP(ipa_wdi_create_smmu_mapping_per_inst, hdl, num_buffers, info); return ret; } EXPORT_SYMBOL(ipa_wdi_create_smmu_mapping_per_inst); int ipa_wdi_release_smmu_mapping_per_inst(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info) { int ret; IPA_FMWK_DISPATCH_RETURN_DP(ipa_wdi_release_smmu_mapping_per_inst, hdl, num_buffers, info); return ret; } EXPORT_SYMBOL(ipa_wdi_release_smmu_mapping_per_inst); int ipa_wdi_get_stats(struct IpaHwStatsWDIInfoData_t *stats) { int ret; Loading include/linux/ipa_fmwk.h +30 −0 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2018 - 2021, The Linux Foundation. All rights reserved. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _IPA_FMWK_H_ Loading Loading @@ -207,6 +208,35 @@ struct ipa_wdi3_data { int (*ipa_get_wdi_version)(void); bool (*ipa_wdi_is_tx1_used)(void); int (*ipa_wdi_get_capabilities)(struct ipa_wdi_capabilities_out_params *out); int (*ipa_wdi_init_per_inst)(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out); int (*ipa_wdi_cleanup_per_inst)(u32 hdl); int (*ipa_wdi_reg_intf_per_inst)( struct ipa_wdi_reg_intf_in_params *in); int (*ipa_wdi_dereg_intf_per_inst)(const char *netdev_name, u32 hdl); int (*ipa_wdi_conn_pipes_per_inst)(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out); int (*ipa_wdi_disconn_pipes_per_inst)(u32 hdl); int (*ipa_wdi_enable_pipes_per_inst)(u32 hdl); int (*ipa_wdi_disable_pipes_per_inst)(u32 hdl); int (*ipa_wdi_set_perf_profile_per_inst)(u32 hdl, struct ipa_wdi_perf_profile *profile); int (*ipa_wdi_create_smmu_mapping_per_inst)(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); int (*ipa_wdi_release_smmu_mapping_per_inst)(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); }; struct ipa_qdss_data { Loading include/linux/ipa_wdi3.h +241 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2018 - 2021, The Linux Foundation. All rights reserved. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _IPA_WDI3_H_ Loading @@ -19,15 +20,19 @@ #define IPA_WDI_MAX_SUPPORTED_SYS_PIPE 3 typedef u32 ipa_wdi_hdl_t; enum ipa_wdi_version { IPA_WDI_1, IPA_WDI_2, IPA_WDI_3 IPA_WDI_3, IPA_WDI_VER_MAX }; #define IPA_WDI3_TX_DIR 1 #define IPA_WDI3_TX1_DIR 2 #define IPA_WDI3_RX_DIR 3 #define IPA_WDI_INST_MAX (2) /** * struct ipa_wdi_init_in_params - wdi init input parameters Loading @@ -43,6 +48,7 @@ struct ipa_wdi_init_in_params { #ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN ipa_wdi_meter_notifier_cb wdi_notify; #endif int inst_id; }; /** Loading @@ -57,6 +63,7 @@ struct ipa_wdi_init_out_params { bool is_uC_ready; bool is_smmu_enabled; bool is_over_gsi; ipa_wdi_hdl_t hdl; }; /** Loading Loading @@ -93,6 +100,7 @@ struct ipa_wdi_reg_intf_in_params { u32 meta_data; u32 meta_data_mask; u8 is_tx1_used; ipa_wdi_hdl_t hdl; }; /** Loading Loading @@ -208,6 +216,7 @@ struct ipa_wdi_conn_in_params { struct ipa_wdi_pipe_setup_info tx; struct ipa_wdi_pipe_setup_info_smmu tx_smmu; } u_tx1; ipa_wdi_hdl_t hdl; }; /** Loading Loading @@ -236,8 +245,30 @@ struct ipa_wdi_perf_profile { u32 max_supported_bw_mbps; }; /** * struct ipa_wdi_capabilities - wdi capability parameters * * @num_of_instances: Number of WLAN instances supported. */ struct ipa_wdi_capabilities_out_params { u8 num_of_instances; }; #if IS_ENABLED(CONFIG_IPA3) /** * ipa_wdi_get_capabilities - Client should call this function to * know the WDI capabilities * * Note: Should not be called from atomic context and only * after checking IPA readiness using ipa_register_ipa_ready_cb() * * @Return 0 on success, negative on failure */ int ipa_wdi_get_capabilities( struct ipa_wdi_capabilities_out_params *out); /** * ipa_wdi_init - Client should call this function to * init WDI IPA offload data path Loading @@ -256,6 +287,18 @@ int ipa_wdi_init(struct ipa_wdi_init_in_params *in, */ bool ipa_wdi_is_tx1_used(void); /** * ipa_wdi_init_per_inst - Client should call this function to * init WDI IPA offload data path * * Note: Should not be called from atomic context and only * after checking IPA readiness using ipa_register_ipa_ready_cb() * * @Return 0 on success, negative on failure */ int ipa_wdi_init_per_inst(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out); /** * ipa_wdi_cleanup - Client should call this function to * clean up WDI IPA offload data path Loading @@ -264,6 +307,17 @@ bool ipa_wdi_is_tx1_used(void); */ int ipa_wdi_cleanup(void); /** * ipa_wdi_cleanup_per_inst - Client should call this function to * clean up WDI IPA offload data path * * @hdl: hdl to wdi client * * @Return 0 on success, negative on failure */ int ipa_wdi_cleanup_per_inst(ipa_wdi_hdl_t hdl); /** * ipa_wdi_reg_intf - Client should call this function to * register interface Loading @@ -275,6 +329,17 @@ int ipa_wdi_cleanup(void); int ipa_wdi_reg_intf( struct ipa_wdi_reg_intf_in_params *in); /** * ipa_wdi_reg_intf_per_inst - Client should call this function to * register interface * * Note: Should not be called from atomic context * * @Return 0 on success, negative on failure */ int ipa_wdi_reg_intf_per_inst( struct ipa_wdi_reg_intf_in_params *in); /** * ipa_wdi_dereg_intf - Client Driver should call this * function to deregister before unload and after disconnect Loading @@ -283,6 +348,14 @@ int ipa_wdi_reg_intf( */ int ipa_wdi_dereg_intf(const char *netdev_name); /** * ipa_wdi_dereg_intf_per_inst - Client Driver should call this * function to deregister before unload and after disconnect * * @Return 0 on success, negative on failure */ int ipa_wdi_dereg_intf_per_inst(const char *netdev_name, ipa_wdi_hdl_t hdl); /** * ipa_wdi_conn_pipes - Client should call this * function to connect pipes Loading @@ -297,6 +370,20 @@ int ipa_wdi_dereg_intf(const char *netdev_name); int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out); /** * ipa_wdi_conn_pipes_per_inst - Client should call this * function to connect pipes * * @in: [in] input parameters from client * @out: [out] output params to client * * Note: Should not be called from atomic context * * @Return 0 on success, negative on failure */ int ipa_wdi_conn_pipes_per_inst(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out); /** * ipa_wdi_disconn_pipes() - Client should call this * function to disconnect pipes Loading @@ -307,6 +394,17 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, */ int ipa_wdi_disconn_pipes(void); /** * ipa_wdi_disconn_pipes_per_inst() - Client should call this * function to disconnect pipes * * @hdl: hdl to wdi client * Note: Should not be called from atomic context * * Returns: 0 on success, negative on failure */ int ipa_wdi_disconn_pipes_per_inst(ipa_wdi_hdl_t hdl); /** * ipa_wdi_enable_pipes() - Client should call this * function to enable IPA offload data path Loading @@ -317,6 +415,17 @@ int ipa_wdi_disconn_pipes(void); */ int ipa_wdi_enable_pipes(void); /** * ipa_wdi_enable_pipes_per_inst() - Client should call this * function to enable IPA offload data path * * @hdl: hdl to wdi client * Note: Should not be called from atomic context * * Returns: 0 on success, negative on failure */ int ipa_wdi_enable_pipes_per_inst(ipa_wdi_hdl_t hdl); /** * ipa_wdi_disable_pipes() - Client should call this * function to disable IPA offload data path Loading @@ -327,6 +436,17 @@ int ipa_wdi_enable_pipes(void); */ int ipa_wdi_disable_pipes(void); /** * ipa_wdi_disable_pipes_per_inst() - Client should call this * function to disable IPA offload data path * * @hdl: hdl to wdi client * Note: Should not be called from atomic context * * Returns: 0 on success, negative on failure */ int ipa_wdi_disable_pipes_per_inst(ipa_wdi_hdl_t hdl); /** * ipa_wdi_set_perf_profile() - Client should call this function to * set IPA clock bandwidth based on data rates Loading @@ -337,6 +457,18 @@ int ipa_wdi_disable_pipes(void); */ int ipa_wdi_set_perf_profile(struct ipa_wdi_perf_profile *profile); /** * ipa_wdi_set_perf_profile_per_inst() - Client should call this function to * set IPA clock bandwidth based on data rates * * @hdl: hdl to wdi client * @profile: [in] BandWidth profile to use * * Returns: 0 on success, negative on failure */ int ipa_wdi_set_perf_profile_per_inst(ipa_wdi_hdl_t hdl, struct ipa_wdi_perf_profile *profile); /** * ipa_wdi_create_smmu_mapping() - Create smmu mapping * Loading @@ -347,6 +479,17 @@ int ipa_wdi_set_perf_profile(struct ipa_wdi_perf_profile *profile); int ipa_wdi_create_smmu_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info); /** * ipa_wdi_create_smmu_mapping_per_inst() - Create smmu mapping * * @hdl: hdl to wdi client * @num_buffers: number of buffers * @info: wdi buffer info */ int ipa_wdi_create_smmu_mapping_per_inst(ipa_wdi_hdl_t hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); /** * ipa_wdi_release_smmu_mapping() - Release smmu mapping * Loading @@ -357,6 +500,18 @@ int ipa_wdi_create_smmu_mapping(u32 num_buffers, int ipa_wdi_release_smmu_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info); /** * ipa_wdi_release_smmu_mapping_per_inst() - Release smmu mapping * * @hdl: hdl to wdi client * @num_buffers: number of buffers * * @info: wdi buffer info */ int ipa_wdi_release_smmu_mapping_per_inst(ipa_wdi_hdl_t hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); /** * ipa_wdi_get_stats() - Query WDI statistics * @stats: [inout] stats blob from client populated by driver Loading Loading @@ -394,12 +549,34 @@ int ipa_get_wdi_version(void); #else /* IS_ENABLED(CONFIG_IPA3) */ /** * ipa_wdi_get_capabilities - Client should call this function to * know the WDI capabilities * * Note: Should not be called from atomic context and only * after checking IPA readiness using ipa_register_ipa_ready_cb() * * @Return 0 on success, negative on failure */ int ipa_wdi_get_capabilities( struct ipa_wdi_capabilities_out_params *out) { return -EPERM; } static inline int ipa_wdi_init(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out) { return -EPERM; } static inline int ipa_wdi_init_per_inst( struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out) { return -EPERM; } static inline int ipa_get_wdi_version(void) { return -EPERM; Loading @@ -415,56 +592,119 @@ static inline int ipa_wdi_cleanup(void) return -EPERM; } static inline int ipa_wdi_cleanup_per_inst(ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_reg_intf( struct ipa_wdi_reg_intf_in_params *in) { return -EPERM; } static inline int ipa_wdi_reg_intf_per_inst( struct ipa_wdi_reg_intf_in_params *in) { return -EPERM; } static inline int ipa_wdi_dereg_intf(const char *netdev_name) { return -EPERM; } static inline int ipa_wdi_dereg_intf_per_inst(const char *netdev_name, ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out) { return -EPERM; } static inline int ipa_wdi_conn_pipes_per_inst( struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out) { return -EPERM; } static inline int ipa_wdi_disconn_pipes(void) { return -EPERM; } static inline int ipa_wdi_disconn_pipes_per_inst(ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_enable_pipes(void) { return -EPERM; } static inline int ipa_wdi_enable_pipes_per_inst(ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_disable_pipes(void) { return -EPERM; } static inline int ipa_wdi_disable_pipes_per_inst(ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_set_perf_profile( struct ipa_wdi_perf_profile *profile) { return -EPERM; } static inline int ipa_wdi_set_perf_profile_per_inst( ipa_wdi_hdl_t hdl, struct ipa_wdi_perf_profile *profile) { return -EPERM; } static inline int ipa_wdi_create_smmu_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info) { return -EPERM; } static inline int ipa_wdi_create_smmu_mapping_per_inst( ipa_wdi_hdl_t hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info) { return -EPERM; } static inline int ipa_wdi_release_smmu_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info) { return -EPERM; } static inline int ipa_wdi_release_smmu_mapping_per_inst( ipa_wdi_hdl_t hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info) { return -EPERM; } static inline int ipa_wdi_get_stats(struct IpaHwStatsWDIInfoData_t *stats) { return -EPERM; Loading Loading
drivers/platform/msm/ipa_fmwk/ipa_fmwk.c +196 −2 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #include <linux/ipa_fmwk.h> Loading Loading @@ -318,6 +319,35 @@ struct ipa_fmwk_contex { bool (*ipa_wdi_is_tx1_used)(void); int (*ipa_wdi_get_capabilities)(struct ipa_wdi_capabilities_out_params *out); int (*ipa_wdi_init_per_inst)(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out); int (*ipa_wdi_cleanup_per_inst)(u32 hdl); int (*ipa_wdi_reg_intf_per_inst)( struct ipa_wdi_reg_intf_in_params *in); int (*ipa_wdi_dereg_intf_per_inst)(const char *netdev_name, u32 hdl); int (*ipa_wdi_conn_pipes_per_inst)(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out); int (*ipa_wdi_disconn_pipes_per_inst)(u32 hdl); int (*ipa_wdi_enable_pipes_per_inst)(u32 hdl); int (*ipa_wdi_disable_pipes_per_inst)(u32 hdl); int (*ipa_wdi_set_perf_profile_per_inst)(u32 hdl, struct ipa_wdi_perf_profile *profile); int (*ipa_wdi_create_smmu_mapping_per_inst)(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); int (*ipa_wdi_release_smmu_mapping_per_inst)(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); /* ipa_gsb APIs*/ int (*ipa_bridge_init)(struct ipa_bridge_init_params *params, u32 *hdl); Loading Loading @@ -1248,7 +1278,19 @@ int ipa_fmwk_register_ipa_wdi3(const struct ipa_wdi3_data *in) || ipa_fmwk_ctx->ipa_wdi_get_stats || ipa_fmwk_ctx->ipa_get_wdi_version || ipa_fmwk_ctx->ipa_wdi_sw_stats || ipa_fmwk_ctx->ipa_wdi_is_tx1_used) { || ipa_fmwk_ctx->ipa_wdi_is_tx1_used || ipa_fmwk_ctx->ipa_wdi_get_capabilities || ipa_fmwk_ctx->ipa_wdi_init_per_inst || ipa_fmwk_ctx->ipa_wdi_cleanup_per_inst || ipa_fmwk_ctx->ipa_wdi_reg_intf_per_inst || ipa_fmwk_ctx->ipa_wdi_dereg_intf_per_inst || ipa_fmwk_ctx->ipa_wdi_conn_pipes_per_inst || ipa_fmwk_ctx->ipa_wdi_disconn_pipes_per_inst || ipa_fmwk_ctx->ipa_wdi_enable_pipes_per_inst || ipa_fmwk_ctx->ipa_wdi_disable_pipes_per_inst || ipa_fmwk_ctx->ipa_wdi_set_perf_profile_per_inst || ipa_fmwk_ctx->ipa_wdi_create_smmu_mapping_per_inst || ipa_fmwk_ctx->ipa_wdi_release_smmu_mapping_per_inst) { pr_err("ipa_wdi3 APIs were already initialized\n"); return -EPERM; } Loading @@ -1271,7 +1313,26 @@ int ipa_fmwk_register_ipa_wdi3(const struct ipa_wdi3_data *in) ipa_fmwk_ctx->ipa_wdi_sw_stats = in->ipa_wdi_sw_stats; ipa_fmwk_ctx->ipa_get_wdi_version = in->ipa_get_wdi_version; ipa_fmwk_ctx->ipa_wdi_is_tx1_used = in->ipa_wdi_is_tx1_used; ipa_fmwk_ctx->ipa_wdi_get_capabilities = in->ipa_wdi_get_capabilities; ipa_fmwk_ctx->ipa_wdi_init_per_inst = in->ipa_wdi_init_per_inst; ipa_fmwk_ctx->ipa_wdi_cleanup_per_inst = in->ipa_wdi_cleanup_per_inst; ipa_fmwk_ctx->ipa_wdi_reg_intf_per_inst = in->ipa_wdi_reg_intf_per_inst; ipa_fmwk_ctx->ipa_wdi_dereg_intf_per_inst = in->ipa_wdi_dereg_intf_per_inst; ipa_fmwk_ctx->ipa_wdi_conn_pipes_per_inst = in->ipa_wdi_conn_pipes_per_inst; ipa_fmwk_ctx->ipa_wdi_disconn_pipes_per_inst = in->ipa_wdi_disconn_pipes_per_inst; ipa_fmwk_ctx->ipa_wdi_enable_pipes_per_inst = in->ipa_wdi_enable_pipes_per_inst; ipa_fmwk_ctx->ipa_wdi_disable_pipes_per_inst = in->ipa_wdi_disable_pipes_per_inst; ipa_fmwk_ctx->ipa_wdi_set_perf_profile_per_inst = in->ipa_wdi_set_perf_profile_per_inst; ipa_fmwk_ctx->ipa_wdi_create_smmu_mapping_per_inst = in->ipa_wdi_create_smmu_mapping_per_inst; ipa_fmwk_ctx->ipa_wdi_release_smmu_mapping_per_inst = in->ipa_wdi_release_smmu_mapping_per_inst; pr_info("ipa_wdi3 registered successfully\n"); return 0; Loading Loading @@ -1411,6 +1472,139 @@ int ipa_wdi_release_smmu_mapping(u32 num_buffers, } EXPORT_SYMBOL(ipa_wdi_release_smmu_mapping); int ipa_wdi_get_capabilities(struct ipa_wdi_capabilities_out_params *out) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_get_capabilities, out); return ret; } EXPORT_SYMBOL(ipa_wdi_get_capabilities); int ipa_wdi_init_per_inst(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_init_per_inst, in, out); return ret; } EXPORT_SYMBOL(ipa_wdi_init_per_inst); int ipa_wdi_cleanup_per_inst(u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_cleanup_per_inst, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_cleanup_per_inst); int ipa_wdi_reg_intf_per_inst( struct ipa_wdi_reg_intf_in_params *in) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_reg_intf_per_inst, in); return ret; } EXPORT_SYMBOL(ipa_wdi_reg_intf_per_inst); int ipa_wdi_dereg_intf_per_inst(const char *netdev_name, u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_dereg_intf_per_inst, netdev_name, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_dereg_intf_per_inst); int ipa_wdi_conn_pipes_per_inst(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_conn_pipes_per_inst, in, out); return ret; } EXPORT_SYMBOL(ipa_wdi_conn_pipes_per_inst); int ipa_wdi_disconn_pipes_per_inst(u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_disconn_pipes_per_inst, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_disconn_pipes_per_inst); int ipa_wdi_enable_pipes_per_inst(u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_enable_pipes_per_inst, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_enable_pipes_per_inst); int ipa_wdi_disable_pipes_per_inst(u32 hdl) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_disable_pipes_per_inst, hdl); return ret; } EXPORT_SYMBOL(ipa_wdi_disable_pipes_per_inst); int ipa_wdi_set_perf_profile_per_inst(u32 hdl, struct ipa_wdi_perf_profile *profile) { int ret; IPA_FMWK_DISPATCH_RETURN(ipa_wdi_set_perf_profile_per_inst, hdl, profile); return ret; } EXPORT_SYMBOL(ipa_wdi_set_perf_profile_per_inst); int ipa_wdi_create_smmu_mapping_per_inst(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info) { int ret; IPA_FMWK_DISPATCH_RETURN_DP(ipa_wdi_create_smmu_mapping_per_inst, hdl, num_buffers, info); return ret; } EXPORT_SYMBOL(ipa_wdi_create_smmu_mapping_per_inst); int ipa_wdi_release_smmu_mapping_per_inst(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info) { int ret; IPA_FMWK_DISPATCH_RETURN_DP(ipa_wdi_release_smmu_mapping_per_inst, hdl, num_buffers, info); return ret; } EXPORT_SYMBOL(ipa_wdi_release_smmu_mapping_per_inst); int ipa_wdi_get_stats(struct IpaHwStatsWDIInfoData_t *stats) { int ret; Loading
include/linux/ipa_fmwk.h +30 −0 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2018 - 2021, The Linux Foundation. All rights reserved. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _IPA_FMWK_H_ Loading Loading @@ -207,6 +208,35 @@ struct ipa_wdi3_data { int (*ipa_get_wdi_version)(void); bool (*ipa_wdi_is_tx1_used)(void); int (*ipa_wdi_get_capabilities)(struct ipa_wdi_capabilities_out_params *out); int (*ipa_wdi_init_per_inst)(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out); int (*ipa_wdi_cleanup_per_inst)(u32 hdl); int (*ipa_wdi_reg_intf_per_inst)( struct ipa_wdi_reg_intf_in_params *in); int (*ipa_wdi_dereg_intf_per_inst)(const char *netdev_name, u32 hdl); int (*ipa_wdi_conn_pipes_per_inst)(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out); int (*ipa_wdi_disconn_pipes_per_inst)(u32 hdl); int (*ipa_wdi_enable_pipes_per_inst)(u32 hdl); int (*ipa_wdi_disable_pipes_per_inst)(u32 hdl); int (*ipa_wdi_set_perf_profile_per_inst)(u32 hdl, struct ipa_wdi_perf_profile *profile); int (*ipa_wdi_create_smmu_mapping_per_inst)(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); int (*ipa_wdi_release_smmu_mapping_per_inst)(u32 hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); }; struct ipa_qdss_data { Loading
include/linux/ipa_wdi3.h +241 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2018 - 2021, The Linux Foundation. All rights reserved. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef _IPA_WDI3_H_ Loading @@ -19,15 +20,19 @@ #define IPA_WDI_MAX_SUPPORTED_SYS_PIPE 3 typedef u32 ipa_wdi_hdl_t; enum ipa_wdi_version { IPA_WDI_1, IPA_WDI_2, IPA_WDI_3 IPA_WDI_3, IPA_WDI_VER_MAX }; #define IPA_WDI3_TX_DIR 1 #define IPA_WDI3_TX1_DIR 2 #define IPA_WDI3_RX_DIR 3 #define IPA_WDI_INST_MAX (2) /** * struct ipa_wdi_init_in_params - wdi init input parameters Loading @@ -43,6 +48,7 @@ struct ipa_wdi_init_in_params { #ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN ipa_wdi_meter_notifier_cb wdi_notify; #endif int inst_id; }; /** Loading @@ -57,6 +63,7 @@ struct ipa_wdi_init_out_params { bool is_uC_ready; bool is_smmu_enabled; bool is_over_gsi; ipa_wdi_hdl_t hdl; }; /** Loading Loading @@ -93,6 +100,7 @@ struct ipa_wdi_reg_intf_in_params { u32 meta_data; u32 meta_data_mask; u8 is_tx1_used; ipa_wdi_hdl_t hdl; }; /** Loading Loading @@ -208,6 +216,7 @@ struct ipa_wdi_conn_in_params { struct ipa_wdi_pipe_setup_info tx; struct ipa_wdi_pipe_setup_info_smmu tx_smmu; } u_tx1; ipa_wdi_hdl_t hdl; }; /** Loading Loading @@ -236,8 +245,30 @@ struct ipa_wdi_perf_profile { u32 max_supported_bw_mbps; }; /** * struct ipa_wdi_capabilities - wdi capability parameters * * @num_of_instances: Number of WLAN instances supported. */ struct ipa_wdi_capabilities_out_params { u8 num_of_instances; }; #if IS_ENABLED(CONFIG_IPA3) /** * ipa_wdi_get_capabilities - Client should call this function to * know the WDI capabilities * * Note: Should not be called from atomic context and only * after checking IPA readiness using ipa_register_ipa_ready_cb() * * @Return 0 on success, negative on failure */ int ipa_wdi_get_capabilities( struct ipa_wdi_capabilities_out_params *out); /** * ipa_wdi_init - Client should call this function to * init WDI IPA offload data path Loading @@ -256,6 +287,18 @@ int ipa_wdi_init(struct ipa_wdi_init_in_params *in, */ bool ipa_wdi_is_tx1_used(void); /** * ipa_wdi_init_per_inst - Client should call this function to * init WDI IPA offload data path * * Note: Should not be called from atomic context and only * after checking IPA readiness using ipa_register_ipa_ready_cb() * * @Return 0 on success, negative on failure */ int ipa_wdi_init_per_inst(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out); /** * ipa_wdi_cleanup - Client should call this function to * clean up WDI IPA offload data path Loading @@ -264,6 +307,17 @@ bool ipa_wdi_is_tx1_used(void); */ int ipa_wdi_cleanup(void); /** * ipa_wdi_cleanup_per_inst - Client should call this function to * clean up WDI IPA offload data path * * @hdl: hdl to wdi client * * @Return 0 on success, negative on failure */ int ipa_wdi_cleanup_per_inst(ipa_wdi_hdl_t hdl); /** * ipa_wdi_reg_intf - Client should call this function to * register interface Loading @@ -275,6 +329,17 @@ int ipa_wdi_cleanup(void); int ipa_wdi_reg_intf( struct ipa_wdi_reg_intf_in_params *in); /** * ipa_wdi_reg_intf_per_inst - Client should call this function to * register interface * * Note: Should not be called from atomic context * * @Return 0 on success, negative on failure */ int ipa_wdi_reg_intf_per_inst( struct ipa_wdi_reg_intf_in_params *in); /** * ipa_wdi_dereg_intf - Client Driver should call this * function to deregister before unload and after disconnect Loading @@ -283,6 +348,14 @@ int ipa_wdi_reg_intf( */ int ipa_wdi_dereg_intf(const char *netdev_name); /** * ipa_wdi_dereg_intf_per_inst - Client Driver should call this * function to deregister before unload and after disconnect * * @Return 0 on success, negative on failure */ int ipa_wdi_dereg_intf_per_inst(const char *netdev_name, ipa_wdi_hdl_t hdl); /** * ipa_wdi_conn_pipes - Client should call this * function to connect pipes Loading @@ -297,6 +370,20 @@ int ipa_wdi_dereg_intf(const char *netdev_name); int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out); /** * ipa_wdi_conn_pipes_per_inst - Client should call this * function to connect pipes * * @in: [in] input parameters from client * @out: [out] output params to client * * Note: Should not be called from atomic context * * @Return 0 on success, negative on failure */ int ipa_wdi_conn_pipes_per_inst(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out); /** * ipa_wdi_disconn_pipes() - Client should call this * function to disconnect pipes Loading @@ -307,6 +394,17 @@ int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, */ int ipa_wdi_disconn_pipes(void); /** * ipa_wdi_disconn_pipes_per_inst() - Client should call this * function to disconnect pipes * * @hdl: hdl to wdi client * Note: Should not be called from atomic context * * Returns: 0 on success, negative on failure */ int ipa_wdi_disconn_pipes_per_inst(ipa_wdi_hdl_t hdl); /** * ipa_wdi_enable_pipes() - Client should call this * function to enable IPA offload data path Loading @@ -317,6 +415,17 @@ int ipa_wdi_disconn_pipes(void); */ int ipa_wdi_enable_pipes(void); /** * ipa_wdi_enable_pipes_per_inst() - Client should call this * function to enable IPA offload data path * * @hdl: hdl to wdi client * Note: Should not be called from atomic context * * Returns: 0 on success, negative on failure */ int ipa_wdi_enable_pipes_per_inst(ipa_wdi_hdl_t hdl); /** * ipa_wdi_disable_pipes() - Client should call this * function to disable IPA offload data path Loading @@ -327,6 +436,17 @@ int ipa_wdi_enable_pipes(void); */ int ipa_wdi_disable_pipes(void); /** * ipa_wdi_disable_pipes_per_inst() - Client should call this * function to disable IPA offload data path * * @hdl: hdl to wdi client * Note: Should not be called from atomic context * * Returns: 0 on success, negative on failure */ int ipa_wdi_disable_pipes_per_inst(ipa_wdi_hdl_t hdl); /** * ipa_wdi_set_perf_profile() - Client should call this function to * set IPA clock bandwidth based on data rates Loading @@ -337,6 +457,18 @@ int ipa_wdi_disable_pipes(void); */ int ipa_wdi_set_perf_profile(struct ipa_wdi_perf_profile *profile); /** * ipa_wdi_set_perf_profile_per_inst() - Client should call this function to * set IPA clock bandwidth based on data rates * * @hdl: hdl to wdi client * @profile: [in] BandWidth profile to use * * Returns: 0 on success, negative on failure */ int ipa_wdi_set_perf_profile_per_inst(ipa_wdi_hdl_t hdl, struct ipa_wdi_perf_profile *profile); /** * ipa_wdi_create_smmu_mapping() - Create smmu mapping * Loading @@ -347,6 +479,17 @@ int ipa_wdi_set_perf_profile(struct ipa_wdi_perf_profile *profile); int ipa_wdi_create_smmu_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info); /** * ipa_wdi_create_smmu_mapping_per_inst() - Create smmu mapping * * @hdl: hdl to wdi client * @num_buffers: number of buffers * @info: wdi buffer info */ int ipa_wdi_create_smmu_mapping_per_inst(ipa_wdi_hdl_t hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); /** * ipa_wdi_release_smmu_mapping() - Release smmu mapping * Loading @@ -357,6 +500,18 @@ int ipa_wdi_create_smmu_mapping(u32 num_buffers, int ipa_wdi_release_smmu_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info); /** * ipa_wdi_release_smmu_mapping_per_inst() - Release smmu mapping * * @hdl: hdl to wdi client * @num_buffers: number of buffers * * @info: wdi buffer info */ int ipa_wdi_release_smmu_mapping_per_inst(ipa_wdi_hdl_t hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info); /** * ipa_wdi_get_stats() - Query WDI statistics * @stats: [inout] stats blob from client populated by driver Loading Loading @@ -394,12 +549,34 @@ int ipa_get_wdi_version(void); #else /* IS_ENABLED(CONFIG_IPA3) */ /** * ipa_wdi_get_capabilities - Client should call this function to * know the WDI capabilities * * Note: Should not be called from atomic context and only * after checking IPA readiness using ipa_register_ipa_ready_cb() * * @Return 0 on success, negative on failure */ int ipa_wdi_get_capabilities( struct ipa_wdi_capabilities_out_params *out) { return -EPERM; } static inline int ipa_wdi_init(struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out) { return -EPERM; } static inline int ipa_wdi_init_per_inst( struct ipa_wdi_init_in_params *in, struct ipa_wdi_init_out_params *out) { return -EPERM; } static inline int ipa_get_wdi_version(void) { return -EPERM; Loading @@ -415,56 +592,119 @@ static inline int ipa_wdi_cleanup(void) return -EPERM; } static inline int ipa_wdi_cleanup_per_inst(ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_reg_intf( struct ipa_wdi_reg_intf_in_params *in) { return -EPERM; } static inline int ipa_wdi_reg_intf_per_inst( struct ipa_wdi_reg_intf_in_params *in) { return -EPERM; } static inline int ipa_wdi_dereg_intf(const char *netdev_name) { return -EPERM; } static inline int ipa_wdi_dereg_intf_per_inst(const char *netdev_name, ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_conn_pipes(struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out) { return -EPERM; } static inline int ipa_wdi_conn_pipes_per_inst( struct ipa_wdi_conn_in_params *in, struct ipa_wdi_conn_out_params *out) { return -EPERM; } static inline int ipa_wdi_disconn_pipes(void) { return -EPERM; } static inline int ipa_wdi_disconn_pipes_per_inst(ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_enable_pipes(void) { return -EPERM; } static inline int ipa_wdi_enable_pipes_per_inst(ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_disable_pipes(void) { return -EPERM; } static inline int ipa_wdi_disable_pipes_per_inst(ipa_wdi_hdl_t hdl) { return -EPERM; } static inline int ipa_wdi_set_perf_profile( struct ipa_wdi_perf_profile *profile) { return -EPERM; } static inline int ipa_wdi_set_perf_profile_per_inst( ipa_wdi_hdl_t hdl, struct ipa_wdi_perf_profile *profile) { return -EPERM; } static inline int ipa_wdi_create_smmu_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info) { return -EPERM; } static inline int ipa_wdi_create_smmu_mapping_per_inst( ipa_wdi_hdl_t hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info) { return -EPERM; } static inline int ipa_wdi_release_smmu_mapping(u32 num_buffers, struct ipa_wdi_buffer_info *info) { return -EPERM; } static inline int ipa_wdi_release_smmu_mapping_per_inst( ipa_wdi_hdl_t hdl, u32 num_buffers, struct ipa_wdi_buffer_info *info) { return -EPERM; } static inline int ipa_wdi_get_stats(struct IpaHwStatsWDIInfoData_t *stats) { return -EPERM; Loading