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,