diff --git a/hif/inc/hif.h b/hif/inc/hif.h index 42e748bd89..3c6f5091a0 100644 --- a/hif/inc/hif.h +++ b/hif/inc/hif.h @@ -81,6 +81,7 @@ typedef void *hif_handle_t; #define HIF_TYPE_QCN9224 27 #define HIF_TYPE_QCA9574 28 #define HIF_TYPE_MANGO 29 +#define HIF_TYPE_QCA5332 30 #define DMA_COHERENT_MASK_DEFAULT 37 diff --git a/hif/inc/hostdef.h b/hif/inc/hostdef.h index cb01dee935..456fe38e0d 100644 --- a/hif/inc/hostdef.h +++ b/hif/inc/hostdef.h @@ -49,4 +49,5 @@ extern struct hostdef_s *QCN6122_HOSTDEF; extern struct hostdef_s *QCN9224v1_HOSTDEF; extern struct hostdef_s *QCN9224_HOSTDEF; extern struct hostdef_s *QCA9574_HOSTDEF; +extern struct hostdef_s *QCA5332_HOSTDEF; #endif diff --git a/hif/inc/targetdef.h b/hif/inc/targetdef.h index 2cd7889d2d..75339ebc49 100644 --- a/hif/inc/targetdef.h +++ b/hif/inc/targetdef.h @@ -49,6 +49,7 @@ extern struct targetdef_s *KIWI_TARGETdef; extern struct targetdef_s *QCN9224v1_TARGETDEF; extern struct targetdef_s *QCN9224_TARGETDEF; extern struct targetdef_s *QCA9574_TARGETDEF; +extern struct targetdef_s *QCA5332_TARGETDEF; extern struct ce_reg_def *AR6002_CE_TARGETdef; extern struct ce_reg_def *AR6003_CE_TARGETdef; @@ -73,5 +74,6 @@ extern struct ce_reg_def *KIWI_CE_TARGETdef; extern struct ce_reg_def *QCN9224v1_CE_TARGETDEF; extern struct ce_reg_def *QCN9224_CE_TARGETDEF; extern struct ce_reg_def *QCA9574_CE_TARGETDEF; +extern struct ce_reg_def *QCA5332_CE_TARGETDEF; #endif diff --git a/hif/src/ath_procfs.c b/hif/src/ath_procfs.c index 50e1f0c0f3..a926f11fb1 100644 --- a/hif/src/ath_procfs.c +++ b/hif/src/ath_procfs.c @@ -110,6 +110,7 @@ static ssize_t ath_procfs_diag_read_legacy(struct file *file, (tgt_info->target_type == TARGET_TYPE_QCN9224) || (tgt_info->target_type == TARGET_TYPE_QCN6122) || (tgt_info->target_type == TARGET_TYPE_QCA5018) || + (tgt_info->target_type == TARGET_TYPE_QCA5332) || (tgt_info->target_type == TARGET_TYPE_QCA6018) || (tgt_info->target_type == TARGET_TYPE_QCN7605) || (tgt_info->target_type == TARGET_TYPE_KIWI) || @@ -193,6 +194,7 @@ static ssize_t ath_procfs_diag_write_legacy(struct file *file, (tgt_info->target_type == TARGET_TYPE_QCN9224) || (tgt_info->target_type == TARGET_TYPE_QCN6122) || (tgt_info->target_type == TARGET_TYPE_QCA5018) || + (tgt_info->target_type == TARGET_TYPE_QCA5332) || (tgt_info->target_type == TARGET_TYPE_QCA6018) || (tgt_info->target_type == TARGET_TYPE_QCN7605) || (tgt_info->target_type == TARGET_TYPE_KIWI) || diff --git a/hif/src/ce/ce_assignment.h b/hif/src/ce/ce_assignment.h index 2cbdd0654f..a2a55c42e7 100644 --- a/hif/src/ce/ce_assignment.h +++ b/hif/src/ce/ce_assignment.h @@ -1068,6 +1068,66 @@ static struct CE_pipe_config target_ce_config_wlan_qcn6122[] = { #define PKTLOG_DST_ENTRIES 512 #endif +#define QCA_5332_CE_COUNT 12 +static struct CE_attr host_ce_config_wlan_qca5332[] = { + /* host->target HTC control and raw streams */ + {/*CE0*/ (CE_ATTR_FLAGS), 0, 16, 2048, 0, NULL,}, + /* target->host HTT + HTC control */ + {/*CE1*/ (CE_ATTR_FLAGS), 0, 0, 2048, 512, NULL,}, + /* target->host WMI */ + {/*CE2*/ (CE_ATTR_FLAGS), 0, 0, 2048, 128, NULL,}, + /* host->target WMI */ + {/*CE3*/ (CE_ATTR_FLAGS), 0, 32, 2048, 0, NULL,}, + /* host->target HTT */ + {/*CE4*/ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0, + CE_HTT_H2T_MSG_SRC_NENTRIES, 256, 0, NULL,}, + /* target -> host PKTLOG */ + #ifdef REMOVE_PKT_LOG + { /* CE5 */ 0, 0, 0, 0, 0, NULL,}, + #else + {/*CE5*/ (CE_ATTR_FLAGS), 0, 0, 2048, PKTLOG_DST_ENTRIES, NULL,}, + #endif + /* Target autonomous HIF_memcpy */ + {/*CE6*/ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0, 0, 0, 0, NULL,}, + /* CV Prefetch */ + {/*CE7*/ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0, 0, 0, 0, NULL,}, + /* Target HIF memcpy (Generic HIF memcypy) */ + {/*CE8*/ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0, 0, 0, 0, NULL,}, + /* WMI logging/CFR/Spectral/Radar/ */ + {/*CE9*/ (CE_ATTR_FLAGS), 0, 0, 2048, 128, NULL,}, + /* Customer reserve */ + {/*CE10*/ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0, 0, 0, 0, NULL,}, + /* Un-assigned */ + {/*CE11*/ (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0, 0, 0, 0, NULL,}, +}; + +static struct CE_pipe_config target_ce_config_wlan_qca5332[] = { + /* host->target HTC control and raw streams */ + { /* CE0 */ 0, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0,}, + /* target->host HTT */ + { /* CE1 */ 1, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,}, + /* target->host WMI + HTC control */ + { /* CE2 */ 2, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,}, + /* host->target WMI */ + { /* CE3 */ 3, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0,}, + /* host->target HTT */ + { /* CE4 */ 4, PIPEDIR_OUT, 256, 256, + (CE_ATTR_FLAGS | CE_ATTR_DISABLE_INTR), 0,}, + /* Target -> host PKTLOG */ + { /* CE5 */ 5, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,}, + /* Reserved for target autonomous HIF_memcpy */ + { /* CE6 */ 6, PIPEDIR_INOUT, 32, 16384, CE_ATTR_FLAGS, 0,}, + /* CE7 Reserved for CV Prefetch */ + { /* CE7 */ 7, PIPEDIR_OUT, 32, 2048, CE_ATTR_FLAGS, 0,}, + /* CE8 Reserved for target generic HIF memcpy */ + { /* CE8 */ 8, PIPEDIR_INOUT, 32, 16384, CE_ATTR_FLAGS, 0,}, + /* WMI logging/CFR/Spectral/Radar/ */ + { /* CE9 */ 9, PIPEDIR_IN, 32, 2048, CE_ATTR_FLAGS, 0,}, + /* CE 10,11 to be defined */ + {/* CE11 unused */10, PIPEDIR_NONE, 0, 0, 0, 0,}, + {/* CE11 unused */11, PIPEDIR_NONE, 0, 0, 0, 0,}, +}; + #define QCA_5018_CE_COUNT 6 static struct CE_attr host_ce_config_wlan_qca5018[] = { /* host->target HTC control and raw streams */ diff --git a/hif/src/ce/ce_main.c b/hif/src/ce/ce_main.c index 698f7c1029..5c6087cb81 100644 --- a/hif/src/ce/ce_main.c +++ b/hif/src/ce/ce_main.c @@ -55,8 +55,8 @@ #if (defined(QCA_WIFI_QCA8074) || defined(QCA_WIFI_QCA6290) || \ defined(QCA_WIFI_QCA6018) || defined(QCA_WIFI_QCA5018) || \ - defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_QCA9574)) && \ - !defined(QCA_WIFI_SUPPORT_SRNG) + defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_QCA5332) || \ + defined(QCA_WIFI_QCA9574)) && !defined(QCA_WIFI_SUPPORT_SRNG) #define QCA_WIFI_SUPPORT_SRNG #endif @@ -885,6 +885,34 @@ static struct service_to_pipe target_service_to_ce_map_qcn9000[] = { }; #endif +#if (defined(QCA_WIFI_QCA5332)) +static struct service_to_pipe target_service_to_ce_map_qca5332[] = { + { WMI_DATA_VO_SVC, PIPEDIR_OUT, 3, }, + { WMI_DATA_VO_SVC, PIPEDIR_IN, 2, }, + { WMI_DATA_BK_SVC, PIPEDIR_OUT, 3, }, + { WMI_DATA_BK_SVC, PIPEDIR_IN, 2, }, + { WMI_DATA_BE_SVC, PIPEDIR_OUT, 3, }, + { WMI_DATA_BE_SVC, PIPEDIR_IN, 2, }, + { WMI_DATA_VI_SVC, PIPEDIR_OUT, 3, }, + { WMI_DATA_VI_SVC, PIPEDIR_IN, 2, }, + { WMI_CONTROL_SVC, PIPEDIR_OUT, 3, }, + { WMI_CONTROL_SVC, PIPEDIR_IN, 2, }, + { HTC_CTRL_RSVD_SVC, PIPEDIR_OUT, 0, }, + { HTC_CTRL_RSVD_SVC, PIPEDIR_IN, 1, }, + { HTC_RAW_STREAMS_SVC, PIPEDIR_OUT, 0}, + { HTC_RAW_STREAMS_SVC, PIPEDIR_IN, 1 }, + { HTT_DATA_MSG_SVC, PIPEDIR_OUT, 4, }, + { HTT_DATA_MSG_SVC, PIPEDIR_IN, 1, }, + { PACKET_LOG_SVC, PIPEDIR_IN, 5, }, + { WMI_CONTROL_DIAG_SVC, PIPEDIR_IN, 9, }, + /* (Additions here) */ + { 0, 0, 0, }, +}; +#else +static struct service_to_pipe target_service_to_ce_map_qca5332[] = { +}; +#endif + #if (defined(QCA_WIFI_QCN9224)) static struct service_to_pipe target_service_to_ce_map_qcn9224[] = { { WMI_DATA_VO_SVC, PIPEDIR_OUT, 3, }, @@ -1404,6 +1432,11 @@ static void hif_select_service_to_pipe_map(struct hif_softc *scn, hif_select_ce_map_qcn9224(tgt_svc_map_to_use, sz_tgt_svc_map_to_use); break; + case TARGET_TYPE_QCA5332: + *tgt_svc_map_to_use = target_service_to_ce_map_qca5332; + *sz_tgt_svc_map_to_use = + sizeof(target_service_to_ce_map_qca5332); + break; case TARGET_TYPE_QCA5018: case TARGET_TYPE_QCN6122: *tgt_svc_map_to_use = @@ -1679,6 +1712,7 @@ bool ce_srng_based(struct hif_softc *scn) case TARGET_TYPE_MANGO: case TARGET_TYPE_QCN9224: case TARGET_TYPE_QCA9574: + case TARGET_TYPE_QCA5332: return true; default: return false; @@ -4049,6 +4083,13 @@ void hif_ce_prepare_config(struct hif_softc *scn) case TARGET_TYPE_QCN9224: hif_set_ce_config_qcn9224(scn, hif_state); break; + case TARGET_TYPE_QCA5332: + hif_state->host_ce_config = host_ce_config_wlan_qca5332; + hif_state->target_ce_config = target_ce_config_wlan_qca5332; + hif_state->target_ce_config_sz = + sizeof(target_ce_config_wlan_qca5332); + scn->ce_count = QCA_5332_CE_COUNT; + break; case TARGET_TYPE_QCN6122: hif_state->host_ce_config = host_ce_config_wlan_qcn6122; hif_state->target_ce_config = target_ce_config_wlan_qcn6122; diff --git a/hif/src/hif_main.c b/hif/src/hif_main.c index 07a1ae3155..903447b779 100644 --- a/hif/src/hif_main.c +++ b/hif/src/hif_main.c @@ -41,7 +41,8 @@ #include "hif_debug.h" #include "mp_dev.h" #if defined(QCA_WIFI_QCA8074) || defined(QCA_WIFI_QCA6018) || \ - defined(QCA_WIFI_QCA5018) || defined(QCA_WIFI_QCA9574) + defined(QCA_WIFI_QCA5018) || defined(QCA_WIFI_QCA9574) || \ + defined(QCA_WIFI_QCA5332) #include "hal_api.h" #endif #include "hif_napi.h" @@ -1077,7 +1078,7 @@ static inline int hif_get_num_active_grp_tasklets(struct hif_softc *scn) defined(QCA_WIFI_QCN9000) || defined(QCA_WIFI_QCA6490) || \ defined(QCA_WIFI_QCA6750) || defined(QCA_WIFI_QCA5018) || \ defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_QCN9224) || \ - defined(QCA_WIFI_QCA9574)) + defined(QCA_WIFI_QCA9574)) || defined(QCA_WIFI_QCA5332) /** * hif_get_num_pending_work() - get the number of entries in * the workqueue pending to be completed. @@ -1213,7 +1214,7 @@ uint8_t hif_get_ep_vote_access(struct hif_opaque_softc *hif_ctx, defined(QCA_WIFI_QCN9000) || defined(QCA_WIFI_QCA6490) || \ defined(QCA_WIFI_QCA6750) || defined(QCA_WIFI_QCA5018) || \ defined(QCA_WIFI_KIWI) || defined(QCA_WIFI_QCN9224) || \ - defined(QCA_WIFI_QCA9574)) + defined(QCA_WIFI_QCA9574)) || defined(QCA_WIFI_QCA5332) static QDF_STATUS hif_hal_attach(struct hif_softc *scn) { if (ce_srng_based(scn)) { @@ -1658,6 +1659,12 @@ int hif_get_device_type(uint32_t device_id, hif_info(" *********** qca5018 *************"); break; + case QCA5332_DEVICE_ID: + *hif_type = HIF_TYPE_QCA5332; + *target_type = TARGET_TYPE_QCA5332; + hif_info(" *********** QCA5332 *************"); + break; + case QCA9574_DEVICE_ID: *hif_type = HIF_TYPE_QCA9574; *target_type = TARGET_TYPE_QCA9574; diff --git a/hif/src/pcie/if_pci.c b/hif/src/pcie/if_pci.c index 541cd8e01c..f51d084355 100644 --- a/hif/src/pcie/if_pci.c +++ b/hif/src/pcie/if_pci.c @@ -1730,6 +1730,7 @@ int hif_pci_bus_configure(struct hif_softc *hif_sc) if (((hif_sc->target_info.target_type == TARGET_TYPE_QCA8074) || (hif_sc->target_info.target_type == TARGET_TYPE_QCA8074V2) || (hif_sc->target_info.target_type == TARGET_TYPE_QCA9574) || + (hif_sc->target_info.target_type == TARGET_TYPE_QCA5332) || (hif_sc->target_info.target_type == TARGET_TYPE_QCA5018) || (hif_sc->target_info.target_type == TARGET_TYPE_QCN6122) || (hif_sc->target_info.target_type == TARGET_TYPE_QCA6018)) && @@ -1753,6 +1754,7 @@ int hif_pci_bus_configure(struct hif_softc *hif_sc) if (((hif_sc->target_info.target_type == TARGET_TYPE_QCA8074) || (hif_sc->target_info.target_type == TARGET_TYPE_QCA8074V2) || (hif_sc->target_info.target_type == TARGET_TYPE_QCA9574) || + (hif_sc->target_info.target_type == TARGET_TYPE_QCA5332) || (hif_sc->target_info.target_type == TARGET_TYPE_QCA5018) || (hif_sc->target_info.target_type == TARGET_TYPE_QCN6122) || (hif_sc->target_info.target_type == TARGET_TYPE_QCA6018)) && @@ -3522,6 +3524,7 @@ int hif_configure_irq(struct hif_softc *scn) case TARGET_TYPE_QCA8074V2: case TARGET_TYPE_QCA6018: case TARGET_TYPE_QCA5018: + case TARGET_TYPE_QCA5332: case TARGET_TYPE_QCA9574: ret = hif_ahb_configure_irq(sc); break; diff --git a/hif/src/regtable.c b/hif/src/regtable.c index ff1828ce97..6451988499 100644 --- a/hif/src/regtable.c +++ b/hif/src/regtable.c @@ -164,6 +164,14 @@ void hif_target_register_tbl_attach(struct hif_softc *scn, u32 target_type) break; #endif +#if defined(QCA5332_HEADERS_DEF) + case TARGET_TYPE_QCA5332: + scn->targetdef = QCA5332_TARGETDEF; + scn->target_ce_def = QCA5332_CE_TARGETDEF; + hif_info("TARGET_TYPE_QCA5332"); + break; +#endif + #if defined(QCA6390_HEADERS_DEF) case TARGET_TYPE_QCA6390: scn->targetdef = QCA6390_TARGETdef; @@ -306,6 +314,11 @@ void hif_register_tbl_attach(struct hif_softc *scn, u32 hif_type) scn->hostdef = QCA5018_HOSTDEF; break; #endif +#if defined(QCA5332_HEADERS_DEF) + case HIF_TYPE_QCA5332: + scn->hostdef = QCA5332_HOSTDEF; + break; +#endif #if defined(QCA9574_HEADERS_DEF) case HIF_TYPE_QCA9574: scn->hostdef = QCA9574_HOSTDEF; diff --git a/hif/src/snoc/if_ahb.c b/hif/src/snoc/if_ahb.c index b24bc05cb2..37188df6c6 100644 --- a/hif/src/snoc/if_ahb.c +++ b/hif/src/snoc/if_ahb.c @@ -406,7 +406,8 @@ void hif_ahb_disable_bus(struct hif_softc *scn) if (memres) mem_pa_size = memres->end - memres->start + 1; - if (tgt_info->target_type == TARGET_TYPE_QCA5018) { + if (tgt_info->target_type == TARGET_TYPE_QCA5018 || + tgt_info->target_type == TARGET_TYPE_QCA5332) { iounmap(sc->mem_ce); sc->mem_ce = NULL; scn->mem_ce = NULL; @@ -533,7 +534,8 @@ QDF_STATUS hif_ahb_enable_bus(struct hif_softc *ol_sc, * In QCA5018 CE region moved to SOC outside WCSS block. * Allocate separate I/O remap to access CE registers. */ - if (tgt_info->target_type == TARGET_TYPE_QCA5018) { + if (tgt_info->target_type == TARGET_TYPE_QCA5018 || + tgt_info->target_type == TARGET_TYPE_QCA5332) { struct hif_softc *scn = HIF_GET_SOFTC(sc); sc->mem_ce = ioremap_nocache(HOST_CE_ADDRESS, HOST_CE_SIZE); @@ -638,6 +640,7 @@ void hif_ahb_irq_enable(struct hif_softc *scn, int ce_id) if (tgt_info->target_type == TARGET_TYPE_QCA8074 || tgt_info->target_type == TARGET_TYPE_QCA8074V2 || tgt_info->target_type == TARGET_TYPE_QCA9574 || + tgt_info->target_type == TARGET_TYPE_QCA5332 || tgt_info->target_type == TARGET_TYPE_QCA5018 || tgt_info->target_type == TARGET_TYPE_QCA6018) { /* Enable destination ring interrupts for @@ -691,6 +694,7 @@ void hif_ahb_irq_disable(struct hif_softc *scn, int ce_id) if (tgt_info->target_type == TARGET_TYPE_QCA8074 || tgt_info->target_type == TARGET_TYPE_QCA8074V2 || tgt_info->target_type == TARGET_TYPE_QCA9574 || + tgt_info->target_type == TARGET_TYPE_QCA5332 || tgt_info->target_type == TARGET_TYPE_QCA5018 || tgt_info->target_type == TARGET_TYPE_QCA6018) { /* Disable destination ring interrupts for @@ -773,6 +777,7 @@ void hif_display_ahb_irq_regs(struct hif_softc *scn) if (tgt_info->target_type == TARGET_TYPE_QCA8074 || tgt_info->target_type == TARGET_TYPE_QCA8074V2 || tgt_info->target_type == TARGET_TYPE_QCA9574 || + tgt_info->target_type == TARGET_TYPE_QCA5332 || tgt_info->target_type == TARGET_TYPE_QCA5018 || tgt_info->target_type == TARGET_TYPE_QCA6018) { regval = hif_read32_mb(scn, mem +