From 68f96a8c79bc7829d9a2801f3cfac1ec43731d30 Mon Sep 17 00:00:00 2001 From: Rakesh Pillai Date: Wed, 2 Feb 2022 07:38:44 -0800 Subject: [PATCH] qcacmn: Add support to send Shadow config v3 Shadow config v2 can support max of 36 shadow registers only. For KIWI target, there are 40 shadow registers supported. Hence add support to send shadow config v3 for KIWI. Change-Id: If57e6597397da3e239f25a6c0cc24f8fd37dcdf1 CRs-Fixed: 3167758 --- hal/wifi3.0/hal_api.h | 22 ++++++++++++--- hal/wifi3.0/hal_internal.h | 16 ++++++++++- hal/wifi3.0/hal_srng.c | 19 ++++++++++--- hif/src/ce/ce_api.h | 6 +++++ hif/src/ce/ce_main.c | 52 +++++++++++++++++++++++++++++++++--- hif/src/ce/ce_service_srng.c | 35 +++++++++++++++++++++++- 6 files changed, 137 insertions(+), 13 deletions(-) diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h index 6ccd324538..0015bb8b3d 100644 --- a/hal/wifi3.0/hal_api.h +++ b/hal/wifi3.0/hal_api.h @@ -1029,14 +1029,28 @@ QDF_STATUS hal_construct_srng_shadow_regs(void *hal_soc); QDF_STATUS hal_set_one_shadow_config(void *hal_soc, int ring_type, int ring_num); /** - * hal_get_shadow_config() - retrieve the config table + * hal_get_shadow_config() - retrieve the config table for shadow cfg v2 * @hal_soc: hal handle * @shadow_config: will point to the table after * @num_shadow_registers_configured: will contain the number of valid entries */ -extern void hal_get_shadow_config(void *hal_soc, - struct pld_shadow_reg_v2_cfg **shadow_config, - int *num_shadow_registers_configured); +extern void +hal_get_shadow_config(void *hal_soc, + struct pld_shadow_reg_v2_cfg **shadow_config, + int *num_shadow_registers_configured); + +#ifdef CONFIG_SHADOW_V3 +/** + * hal_get_shadow_v3_config() - retrieve the config table for shadow cfg v3 + * @hal_soc: hal handle + * @shadow_config: will point to the table after + * @num_shadow_registers_configured: will contain the number of valid entries + */ +extern void +hal_get_shadow_v3_config(void *hal_soc, + struct pld_shadow_reg_v3_cfg **shadow_config, + int *num_shadow_registers_configured); +#endif #ifdef WLAN_FEATURE_NEAR_FULL_IRQ /** diff --git a/hal/wifi3.0/hal_internal.h b/hal/wifi3.0/hal_internal.h index bd4b33845c..f4788c8c3b 100644 --- a/hal/wifi3.0/hal_internal.h +++ b/hal/wifi3.0/hal_internal.h @@ -1147,6 +1147,20 @@ struct reo_queue_ref_table { uint8_t reo_qref_table_en; }; +/** + * union hal_shadow_reg_cfg - Shadow register config + * @addr: Place holder where shadow address is saved + * @v2: shadow config v2 format + * @v3: shadow config v3 format + */ +union hal_shadow_reg_cfg { + uint32_t addr; + struct pld_shadow_reg_v2_cfg v2; +#ifdef CONFIG_SHADOW_V3 + struct pld_shadow_reg_v3_cfg v3; +#endif +}; + /** * struct hal_soc - HAL context to be used to access SRNG APIs * (currently used by data path and @@ -1187,7 +1201,7 @@ struct hal_soc { uint32_t target_type; /* shadow register configuration */ - struct pld_shadow_reg_v2_cfg shadow_config[MAX_SHADOW_REGISTERS]; + union hal_shadow_reg_cfg shadow_config[MAX_SHADOW_REGISTERS]; int num_shadow_registers_configured; bool use_register_windowing; uint32_t register_window; diff --git a/hal/wifi3.0/hal_srng.c b/hal/wifi3.0/hal_srng.c index 47a3596e1c..6df9717147 100644 --- a/hal/wifi3.0/hal_srng.c +++ b/hal/wifi3.0/hal_srng.c @@ -351,13 +351,26 @@ void hal_get_shadow_config(void *hal_soc, { struct hal_soc *hal = (struct hal_soc *)hal_soc; - *shadow_config = hal->shadow_config; + *shadow_config = &hal->shadow_config[0].v2; *num_shadow_registers_configured = hal->num_shadow_registers_configured; } - qdf_export_symbol(hal_get_shadow_config); +#ifdef CONFIG_SHADOW_V3 +void hal_get_shadow_v3_config(void *hal_soc, + struct pld_shadow_reg_v3_cfg **shadow_config, + int *num_shadow_registers_configured) +{ + struct hal_soc *hal = (struct hal_soc *)hal_soc; + + *shadow_config = &hal->shadow_config[0].v3; + *num_shadow_registers_configured = + hal->num_shadow_registers_configured; +} +qdf_export_symbol(hal_get_shadow_v3_config); +#endif + static bool hal_validate_shadow_register(struct hal_soc *hal, uint32_t *destination, uint32_t *shadow_address) @@ -1351,7 +1364,7 @@ static inline void hal_srng_hw_init(struct hal_soc *hal, hal_srng_dst_hw_init(hal, srng); } -#ifdef CONFIG_SHADOW_V2 +#if defined(CONFIG_SHADOW_V2) || defined(CONFIG_SHADOW_V3) #define ignore_shadow false #define CHECK_SHADOW_REGISTERS true #else diff --git a/hif/src/ce/ce_api.h b/hif/src/ce/ce_api.h index 2f45700483..c7f24ac83c 100644 --- a/hif/src/ce/ce_api.h +++ b/hif/src/ce/ce_api.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -591,6 +592,11 @@ struct ce_ops { int *num_shadow_registers_configured); int (*ce_get_index_info)(struct hif_softc *scn, void *ce_state, struct ce_index *info); +#ifdef CONFIG_SHADOW_V3 + void (*ce_prepare_shadow_register_v3_cfg)(struct hif_softc *scn, + struct pld_shadow_reg_v3_cfg **shadow_config, + int *num_shadow_registers_configured); +#endif }; int hif_ce_bus_early_suspend(struct hif_softc *scn); diff --git a/hif/src/ce/ce_main.c b/hif/src/ce/ce_main.c index 41d23045af..d3a3db1d97 100644 --- a/hif/src/ce/ce_main.c +++ b/hif/src/ce/ce_main.c @@ -1721,6 +1721,28 @@ static void hif_prepare_hal_shadow_register_cfg(struct hif_softc *scn, return; } +#ifdef CONFIG_SHADOW_V3 +static inline void +hif_prepare_hal_shadow_reg_cfg_v3(struct hif_softc *scn, + struct pld_wlan_enable_cfg *cfg) +{ + struct HIF_CE_state *hif_state = HIF_GET_CE_STATE(scn); + + if (!hif_state->ce_services->ce_prepare_shadow_register_v3_cfg) + return; + + hif_state->ce_services->ce_prepare_shadow_register_v3_cfg( + scn, &cfg->shadow_reg_v3_cfg, + &cfg->num_shadow_reg_v3_cfg); +} +#else +static inline void +hif_prepare_hal_shadow_reg_cfg_v3(struct hif_softc *scn, + struct pld_wlan_enable_cfg *cfg) +{ +} +#endif + static inline uint32_t ce_get_desc_size(struct hif_softc *scn, uint8_t ring_type) { @@ -3552,7 +3574,19 @@ void hif_get_target_ce_config(struct hif_softc *scn, shadow_cfg_sz_ret); } -#ifdef CONFIG_SHADOW_V2 +#ifdef CONFIG_SHADOW_V3 +static void hif_print_hal_shadow_register_cfg(struct pld_wlan_enable_cfg *cfg) +{ + int i; + + hif_err("num_config %d", cfg->num_shadow_reg_v2_cfg); + + for (i = 0; i < cfg->num_shadow_reg_v2_cfg; i++) { + hif_err("i %d, val %x", i, cfg->shadow_reg_v2_cfg[i].addr); + } +} + +#elif defined(CONFIG_SHADOW_V2) static void hif_print_hal_shadow_register_cfg(struct pld_wlan_enable_cfg *cfg) { int i; @@ -3570,7 +3604,7 @@ static void hif_print_hal_shadow_register_cfg(struct pld_wlan_enable_cfg *cfg) static void hif_print_hal_shadow_register_cfg(struct pld_wlan_enable_cfg *cfg) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "%s: CONFIG_SHADOW_V2 not defined", __func__); + "%s: CONFIG_SHADOW V2/V3 not defined", __func__); } #endif @@ -3751,6 +3785,8 @@ static void hif_update_rri_over_ddr_config(struct hif_softc *scn, */ int hif_wlan_enable(struct hif_softc *scn) { + struct hif_opaque_softc *hif_hdl = GET_HIF_OPAQUE_HDL(scn); + struct hif_target_info *tgt_info = hif_get_target_info_handle(hif_hdl); struct pld_wlan_enable_cfg cfg = { 0 }; enum pld_driver_mode mode; uint32_t con_mode = hif_get_conparam(scn); @@ -3768,8 +3804,16 @@ int hif_wlan_enable(struct hif_softc *scn) cfg.num_ce_svc_pipe_cfg /= sizeof(struct service_to_pipe); cfg.num_shadow_reg_cfg /= sizeof(struct shadow_reg_cfg); - hif_prepare_hal_shadow_register_cfg(scn, &cfg.shadow_reg_v2_cfg, - &cfg.num_shadow_reg_v2_cfg); + switch (tgt_info->target_type) { + case TARGET_TYPE_KIWI: + hif_prepare_hal_shadow_reg_cfg_v3(scn, &cfg); + break; + default: + hif_prepare_hal_shadow_register_cfg(scn, + &cfg.shadow_reg_v2_cfg, + &cfg.num_shadow_reg_v2_cfg); + break; + } hif_print_hal_shadow_register_cfg(&cfg); diff --git a/hif/src/ce/ce_service_srng.c b/hif/src/ce/ce_service_srng.c index 318f50f932..6bc3abe959 100644 --- a/hif/src/ce/ce_service_srng.c +++ b/hif/src/ce/ce_service_srng.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1008,6 +1008,35 @@ static void ce_prepare_shadow_register_v2_cfg_srng(struct hif_softc *scn, num_shadow_registers_configured); } +#ifdef CONFIG_SHADOW_V3 +static void ce_prepare_shadow_register_v3_cfg_srng(struct hif_softc *scn, + struct pld_shadow_reg_v3_cfg **shadow_config, + int *num_shadow_registers_configured) +{ + if (!scn->hal_soc) { + hif_err("hal not initialized: not initializing shadow config"); + return; + } + + hal_get_shadow_v3_config(scn->hal_soc, shadow_config, + num_shadow_registers_configured); + + if (*num_shadow_registers_configured != 0) { + hif_err("hal shadow register configuration allready constructed"); + + /* return with original configuration*/ + return; + } + hal_construct_srng_shadow_regs(scn->hal_soc); + ce_construct_shadow_config_srng(scn); + hal_set_shadow_regs(scn->hal_soc); + hal_construct_shadow_regs(scn->hal_soc); + /* get updated configuration */ + hal_get_shadow_v3_config(scn->hal_soc, shadow_config, + num_shadow_registers_configured); +} +#endif + #ifdef HIF_CE_LOG_INFO /** * ce_get_index_info_srng(): Get CE index info @@ -1062,6 +1091,10 @@ static struct ce_ops ce_service_srng = { .ce_send_entries_done_nolock = ce_send_entries_done_nolock_srng, .ce_prepare_shadow_register_v2_cfg = ce_prepare_shadow_register_v2_cfg_srng, +#ifdef CONFIG_SHADOW_V3 + .ce_prepare_shadow_register_v3_cfg = + ce_prepare_shadow_register_v3_cfg_srng, +#endif #ifdef HIF_CE_LOG_INFO .ce_get_index_info = ce_get_index_info_srng,