浏览代码

qcacmn: Waikiki CFR changes

Waikiki CFR changes

CRs-Fixed: 3057989
Change-Id: Ib2028ecede35cc2e531a394f5229a71b84757b9f
Shwetha G K 3 年之前
父节点
当前提交
0d831d42c4
共有 3 个文件被更改,包括 307 次插入35 次删除
  1. 103 3
      target_if/cfr/inc/target_if_cfr_enh.h
  2. 4 1
      target_if/cfr/src/target_if_cfr.c
  3. 200 31
      target_if/cfr/src/target_if_cfr_enh.c

+ 103 - 3
target_if/cfr/inc/target_if_cfr_enh.h

@@ -93,6 +93,26 @@
 
 #define STREAMFS_NUM_SUBBUF_PINE 255
 
+/* Max 37 users in MU case for Waikiki */
+#define WAIKIKI_CFR_MU_USERS 37
+
+#define WAIKIKI_MAX_HEADER_LENGTH_WORDS 87
+
+#define WAIKIKI_MAX_DATA_LENGTH_BYTES 64128
+
+/* Max size :
+ * sizeof(csi_cfr_header) + 348 bytes(cfr header) + 64128 bytes(cfr payload)
+ * where cfr_header size = rtt upload header len + freeze_tlv len +
+ *                         uplink user setup info + alignment bytes
+ *                       = 16bytes + 32bytes + (8bytes * 37users) + 4bytes
+ */
+#define STREAMFS_MAX_SUBBUF_WAIKIKI \
+	(sizeof(struct csi_cfr_header) + \
+	 (WAIKIKI_MAX_HEADER_LENGTH_WORDS * 4) + \
+	 WAIKIKI_MAX_DATA_LENGTH_BYTES)
+
+#define STREAMFS_NUM_SUBBUF_WAIKIKI  127
+
 /* Max 4 users in MU case for Spruce */
 #define SPRUCE_CFR_MU_USERS 4
 
@@ -111,14 +131,30 @@
 #define STREAMFS_NUM_SUBBUF_SPRUCE 255
 
 /* enum macrx_freeze_tlv_version: Reported by uCode in enh_dma_header
- * MACRX_FREEZE_TLV_VERSION_1: Single MU UL user info reported by MAC
- * MACRX_FREEZE_TLV_VERSION_2: Upto 4 MU UL user info reported by MAC
- * MACRX_FREEZE_TLV_VERSION_3: Upto 37 MU UL user info reported by MAC
+ * MACRX_FREEZE_TLV_VERSION_1: Single MU UL user info reported by MAC.
+ * This is used in Cypress/HastingsPrime chips. Corresponding structures are
+ * macrx_freeze_capture_channel and 1 uplink_user_setup_info.
+ *
+ * MACRX_FREEZE_TLV_VERSION_2: Upto 4 MU UL user info reported by MAC.
+ * This is used in Maple/Spruce/Moselle chips. Corresponding structures are
+ * macrx_freeze_capture_channel and 2 uplink_user_setup_info.
+ *
+ * MACRX_FREEZE_TLV_VERSION_3: Upto 37 MU UL user info reported by MAC.
+ * This is used in Pine chip. The corresponding structures are
+ * macrx_freeze_capture_channel_v3 and 37 uplink_user_setup_info.
+ *
+ * MACRX_FREEZE_TLV_VERSION_4: Upto 37 MU UL user info reported by MAC.
+ * This is used in Hamilton 1/2.
+ *
+ * MACRX_FREEZE_TLV_VERSION_5: Upto 37 MU UL user info reported by MAC.
+ * This is used in Waikiki chipsets.
  */
 enum macrx_freeze_tlv_version {
 	MACRX_FREEZE_TLV_VERSION_1 = 1,
 	MACRX_FREEZE_TLV_VERSION_2 = 2,
 	MACRX_FREEZE_TLV_VERSION_3 = 3,
+	MACRX_FREEZE_TLV_VERSION_4 = 4,
+	MACRX_FREEZE_TLV_VERSION_5 = 5,
 	MACRX_FREEZE_TLV_VERSION_MAX
 };
 
@@ -152,6 +188,16 @@ enum macrx_freeze_tlv_version {
  */
 #define STREAMFS_NUM_SUBBUF_MAPLE 255
 
+enum UCODE_UPLOAD_HEADER_VERSION {
+	UPLOAD_HEADER_VERSION_1 = 1,
+	UPLOAD_HEADER_VERSION_2 = 2,
+	UPLOAD_HEADER_VERSION_3 = 3,
+	UPLOAD_HEADER_VERSION_4 = 4,
+	UPLOAD_HEADER_VERSION_8 = 8,
+	UPLOAD_HEADER_VERSION_9 = 9,
+	UPLOAD_HEADER_VERSION_MAX
+};
+
 /*
  * @tag: ucode fills this with 0xBA
  *
@@ -210,6 +256,10 @@ enum macrx_freeze_tlv_version {
  *
  *			1 - HKV2/Hastings
  *			2 - Cypress
+ *			3 - Hasting Prime
+ *			4 - Pine
+ *			8 - Hamilton
+ *			9 - Waikiki
  *
  * @target_id:
  *
@@ -483,6 +533,56 @@ struct uplink_user_setup_info {
 		 reserved_0c                     :  1; //[31]
 };
 
+struct macrx_freeze_capture_channel_v5 {
+	uint16_t freeze                          :  1, //[0]
+		 capture_reason                  :  3, //[3:1]
+		 packet_type                     :  2, //[5:4]
+		 packet_sub_type                 :  4, //[9:6]
+		 reserved                        :  5, //[14:10]
+		 sw_peer_id_valid                :  1; //[15]
+	uint16_t sw_peer_id                      : 16; //[15:0]
+	uint16_t phy_ppdu_id                     : 16; //[15:0]
+	uint16_t packet_ta_lower_16              : 16; //[15:0]
+	uint16_t packet_ta_mid_16                : 16; //[15:0]
+	uint16_t packet_ta_upper_16              : 16; //[15:0]
+	uint16_t packet_ra_lower_16              : 16; //[15:0]
+	uint16_t packet_ra_mid_16                : 16; //[15:0]
+	uint16_t packet_ra_upper_16              : 16; //[15:0]
+	uint16_t tsf_timestamp_15_0              : 16; //[15:0]
+	uint16_t tsf_timestamp_31_16             : 16; //[15:0]
+	uint16_t tsf_timestamp_47_32             : 16; //[15:0]
+	uint16_t tsf_timestamp_63_48             : 16; //[15:0]
+	uint16_t user_index_or_user_mask_5_0     :  6, //[5:0]
+		 directed                        :  1, //[6]
+		 reserved_13                     :  9; //[15:7]
+	uint16_t user_mask_21_6                  : 16; //[15:0]
+	uint16_t user_mask_36_22                 : 15, //[14:0]
+		 reserved_15a                    :  1; //[15]
+};
+
+struct uplink_user_setup_info_v2 {
+	uint32_t bw_info_valid                   :  1, //[0]
+		 uplink_receive_type             :  2, //[2:1]
+		 reserved_0a                     :  1, //[3]
+		 uplink_11ax_mcs                 :  4, //[7:4]
+		 nss                             :  3, //[10:8]
+		 stream_offset                   :  3, //[13:11]
+		 sta_dcm                         :  1, //[14]
+		 sta_coding                      :  1, //[15]
+		 ru_type_80_0                    :  4, //[19:16]
+		 ru_type_80_1                    :  4, //[23:20]
+		 ru_type_80_2                    :  4, //[27:24]
+		 ru_type_80_3                    :  4; //[31:28]
+	uint32_t ru_start_index_80_0             :  6, //[5:0]
+		 reserved_1a                     :  2, //[7:6]
+		 ru_start_index_80_1             :  6, //[13:8]
+		 reserved_1b                     :  2, //[15:14]
+		 ru_start_index_80_2             :  6, //[21:16]
+		 reserved_1c                     :  2, //[23:22]
+		 ru_start_index_80_3             :  6, //[29:24]
+		 reserved_1d                     :  2; //[31-30]
+};
+
 /**
  * cfr_enh_init_pdev() - Inits cfr pdev and registers necessary handlers.
  * @psoc: pointer to psoc object

+ 4 - 1
target_if/cfr/src/target_if_cfr.c

@@ -254,7 +254,8 @@ void target_if_cfr_fill_header(struct csi_cfr_header *hdr,
 		hdr->cmn.cfr_metadata_version = CFR_META_VERSION_6;
 		hdr->cmn.chip_type = CFR_CAPTURE_RADIO_ALDER;
 	} else {
-		if (target_type == TARGET_TYPE_QCN9000)
+		if (target_type == TARGET_TYPE_QCN9000 ||
+		    target_type == TARGET_TYPE_QCN9224)
 			hdr->cmn.cfr_metadata_version = CFR_META_VERSION_7;
 		else if ((target_type == TARGET_TYPE_QCA6018) ||
 			 ((target_type == TARGET_TYPE_QCA5018) && (!is_rcc)))
@@ -268,6 +269,8 @@ void target_if_cfr_fill_header(struct csi_cfr_header *hdr,
 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_MAPLE;
 		else if (target_type == TARGET_TYPE_QCN6122)
 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_SPRUCE;
+		else if (target_type == TARGET_TYPE_QCN9224)
+			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_WAIKIKI;
 		else
 			hdr->cmn.chip_type = CFR_CAPTURE_RADIO_CYP;
 	}

+ 200 - 31
target_if/cfr/src/target_if_cfr_enh.c

@@ -289,6 +289,57 @@ static void dump_freeze_tlv_v3(void *freeze_tlv, uint32_t cookie)
 		  freeze->directed);
 }
 
+/**
+ * dump_freeze_tlv_v5() - Dump freeze TLV sent in enhanced DMA header
+ * @freeze_tlv: Freeze TLV sent from MAC to PHY
+ * @cookie: Index into lookup table
+ *
+ * Return: none
+ */
+static void dump_freeze_tlv_v5(void *freeze_tlv, uint32_t cookie)
+{
+	struct macrx_freeze_capture_channel_v5 *freeze =
+		(struct macrx_freeze_capture_channel_v5 *)freeze_tlv;
+
+	cfr_debug("<DBRCOMP><FREEZE><%u>\n"
+		  "freeze: %d capture_reason: %d packet_type: 0x%x\n"
+		  "packet_subtype: 0x%x sw_peer_id_valid: %d sw_peer_id: %d\n"
+		  "phy_ppdu_id: 0x%04x packet_ta_lower_16: 0x%04x\n"
+		  "packet_ta_mid_16: 0x%04x packet_ta_upper_16: 0x%04x\n"
+		  "packet_ra_lower_16: 0x%04x packet_ra_mid_16: 0x%04x\n"
+		  "packet_ra_upper_16: 0x%04x\n"
+		  "tsf_timestamp_15_0: 0x%04x\n"
+		  "tsf_timestamp_31_16: 0x%04x\n"
+		  "tsf_timestamp_47_32: 0x%04x\n"
+		  "tsf_timestamp_63_48: 0x%04x\n"
+		  "user_index_or_user_mask_5_0: 0x%04x\n"
+		  "directed: %d\n"
+		  "user_mask_21_6: 0x%04x\n"
+		  "user_mask_36_22: 0x%04x\n",
+		  cookie,
+		  freeze->freeze,
+		  freeze->capture_reason,
+		  freeze->packet_type,
+		  freeze->packet_sub_type,
+		  freeze->sw_peer_id_valid,
+		  freeze->sw_peer_id,
+		  freeze->phy_ppdu_id,
+		  freeze->packet_ta_lower_16,
+		  freeze->packet_ta_mid_16,
+		  freeze->packet_ta_upper_16,
+		  freeze->packet_ra_lower_16,
+		  freeze->packet_ra_mid_16,
+		  freeze->packet_ra_upper_16,
+		  freeze->tsf_timestamp_15_0,
+		  freeze->tsf_timestamp_31_16,
+		  freeze->tsf_timestamp_47_32,
+		  freeze->tsf_timestamp_63_48,
+		  freeze->user_index_or_user_mask_5_0,
+		  freeze->directed,
+		  freeze->user_mask_21_6,
+		  freeze->user_mask_36_22);
+}
+
 /**
  * dump_mu_rx_info() - Dump MU info in enhanced DMA header
  * @mu_rx_user_info: MU info sent by ucode
@@ -332,6 +383,61 @@ static void dump_mu_rx_info(void *mu_rx_user_info,
 	}
 }
 
+/**
+ * dump_mu_rx_info_v2() - Dump MU info in enhanced DMA header
+ * @mu_rx_user_info: MU info sent by ucode
+ * @mu_rx_num_users: Number of MU users in UL-MU-PPDU
+ * @cookie: Index into lookup table
+ *
+ * Return: none
+ */
+static void dump_mu_rx_info_v2(void *mu_rx_user_info,
+			       uint8_t mu_rx_num_users,
+			       uint32_t cookie)
+{
+	uint8_t i;
+	struct uplink_user_setup_info_v2 *ul_mu_user_info =
+		(struct uplink_user_setup_info_v2 *)mu_rx_user_info;
+
+	for (i = 0 ; i < mu_rx_num_users; i++) {
+		cfr_debug("<DBRCOMP><MU><%u>\n"
+			  "<user_id:%d>\n"
+			  "bw_info_valid = %d\n"
+			  "uplink_receive_type = %d\n"
+			  "uplink_11ax_mcs = %d\n"
+			  "nss = %d\n"
+			  "stream_offset = %d\n"
+			  "sta_dcm = %d\n"
+			  "sta_coding = %d\n"
+			  "ru_type_80_0 = %d\n"
+			  "ru_type_80_1 = %d\n"
+			  "ru_type_80_2 = %d\n"
+			  "ru_type_80_3 = %d\n"
+			  "ru_start_index_80_0 = %d\n"
+			  "ru_start_index_80_1 = %d\n"
+			  "ru_start_index_80_2 = %d\n"
+			  "ru_start_index_80_3 = %d\n",
+			  cookie,
+			  i,
+			  ul_mu_user_info->bw_info_valid,
+			  ul_mu_user_info->uplink_receive_type,
+			  ul_mu_user_info->uplink_11ax_mcs,
+			  ul_mu_user_info->nss,
+			  ul_mu_user_info->stream_offset,
+			  ul_mu_user_info->sta_dcm,
+			  ul_mu_user_info->sta_coding,
+			  ul_mu_user_info->ru_type_80_0,
+			  ul_mu_user_info->ru_type_80_1,
+			  ul_mu_user_info->ru_type_80_2,
+			  ul_mu_user_info->ru_type_80_3,
+			  ul_mu_user_info->ru_start_index_80_0,
+			  ul_mu_user_info->ru_start_index_80_1,
+			  ul_mu_user_info->ru_start_index_80_2,
+			  ul_mu_user_info->ru_start_index_80_3);
+		ul_mu_user_info += sizeof(struct uplink_user_setup_info_v2);
+	}
+}
+
 static void dump_metadata(struct csi_cfr_header *header, uint32_t cookie)
 {
 	uint8_t user_id, chain_id;
@@ -444,49 +550,98 @@ static void dump_enh_dma_hdr(struct whal_cfir_enhanced_hdr *dma_hdr,
 			     uint32_t cookie)
 {
 	if (!error) {
-		cfr_debug("<DBRCOMP><%u>\n"
-			  "Tag: 0x%02x Length: %d udone: %d\n"
-			  "ctype: %d preamble: %d Nss: %d\n"
-			  "num_chains: %d bw: %d peervalid: %d\n"
-			  "peer_id: %d ppdu_id: 0x%04x total_bytes: %d\n"
-			  "header_version: %d target_id: %d cfr_fmt: %d\n"
-			  "mu_rx_data_incl: %d freeze_data_incl: %d\n"
-			  "mu_rx_num_users: %d decimation_factor: %d\n"
-			  "freeze_tlv_version: %d\n",
-			  cookie,
-			  dma_hdr->tag,
-			  dma_hdr->length,
-			  dma_hdr->upload_done,
-			  dma_hdr->capture_type,
-			  dma_hdr->preamble_type,
-			  dma_hdr->nss,
-			  dma_hdr->num_chains,
-			  dma_hdr->upload_pkt_bw,
-			  dma_hdr->sw_peer_id_valid,
-			  dma_hdr->sw_peer_id,
-			  dma_hdr->phy_ppdu_id,
-			  dma_hdr->total_bytes,
-			  dma_hdr->header_version,
-			  dma_hdr->target_id,
-			  dma_hdr->cfr_fmt,
-			  dma_hdr->mu_rx_data_incl,
-			  dma_hdr->freeze_data_incl,
-			  dma_hdr->mu_rx_num_users,
-			  dma_hdr->decimation_factor,
-			  dma_hdr->freeze_tlv_version);
+		if (dma_hdr->header_version == UPLOAD_HEADER_VERSION_9) {
+			cfr_debug("<DBRCOMP><%u>\n"
+				  "Tag: 0x%02x Length: %d udone: %d\n"
+				  "ctype: %d preamble: %d Nss: %d\n"
+				  "num_chains: %d bw: %d peervalid: %d\n"
+				  "peer_id: %d ppdu_id: 0x%04x\n"
+				  "total_bytes: %d header_version: %d\n"
+				  "target_id: %d cfr_fmt: %d\n"
+				  "mu_rx_data_incl: %d freeze_data_incl: %d\n"
+				  "mu_rx_num_users: %d decimation_factor: %d\n"
+				  "freeze_tlv_version: %d\n"
+				  "he_ltf_type: %u ext_preamble_type = %u\n",
+				  cookie,
+				  dma_hdr->tag,
+				  dma_hdr->length,
+				  dma_hdr->upload_done,
+				  dma_hdr->capture_type,
+				  dma_hdr->preamble_type,
+				  dma_hdr->nss,
+				  dma_hdr->num_chains,
+				  dma_hdr->upload_pkt_bw,
+				  dma_hdr->sw_peer_id_valid,
+				  dma_hdr->sw_peer_id,
+				  dma_hdr->phy_ppdu_id,
+				  dma_hdr->total_bytes,
+				  dma_hdr->header_version,
+				  dma_hdr->target_id,
+				  dma_hdr->cfr_fmt,
+				  dma_hdr->mu_rx_data_incl,
+				  dma_hdr->freeze_data_incl,
+				  dma_hdr->mu_rx_num_users,
+				  dma_hdr->decimation_factor,
+				  dma_hdr->freeze_tlv_version,
+				  dma_hdr->rsvd3,
+				  dma_hdr->rsvd4);
+
+		} else {
+			cfr_debug("<DBRCOMP><%u>\n"
+				  "Tag: 0x%02x Length: %d udone: %d\n"
+				  "ctype: %d preamble: %d Nss: %d\n"
+				  "num_chains: %d bw: %d peervalid: %d\n"
+				  "peer_id: %d ppdu_id: 0x%04x\n"
+				  "total_bytes: %d header_version: %d\n"
+				  "target_id: %d cfr_fmt: %d\n"
+				  "mu_rx_data_incl: %d freeze_data_incl: %d\n"
+				  "mu_rx_num_users: %d decimation_factor: %d\n"
+				  "freeze_tlv_version: %d\n",
+				  cookie,
+				  dma_hdr->tag,
+				  dma_hdr->length,
+				  dma_hdr->upload_done,
+				  dma_hdr->capture_type,
+				  dma_hdr->preamble_type,
+				  dma_hdr->nss,
+				  dma_hdr->num_chains,
+				  dma_hdr->upload_pkt_bw,
+				  dma_hdr->sw_peer_id_valid,
+				  dma_hdr->sw_peer_id,
+				  dma_hdr->phy_ppdu_id,
+				  dma_hdr->total_bytes,
+				  dma_hdr->header_version,
+				  dma_hdr->target_id,
+				  dma_hdr->cfr_fmt,
+				  dma_hdr->mu_rx_data_incl,
+				  dma_hdr->freeze_data_incl,
+				  dma_hdr->mu_rx_num_users,
+				  dma_hdr->decimation_factor,
+				  dma_hdr->freeze_tlv_version);
+		}
 
 		if (dma_hdr->freeze_data_incl) {
 			if (dma_hdr->freeze_tlv_version ==
 					MACRX_FREEZE_TLV_VERSION_3)
 				dump_freeze_tlv_v3(freeze_tlv, cookie);
+			else if (dma_hdr->freeze_tlv_version ==
+					MACRX_FREEZE_TLV_VERSION_5)
+				dump_freeze_tlv_v5(freeze_tlv, cookie);
 			else
 				dump_freeze_tlv(freeze_tlv, cookie);
 		}
 
-		if (dma_hdr->mu_rx_data_incl)
+		if ((dma_hdr->mu_rx_data_incl) &&
+		    (dma_hdr->freeze_tlv_version ==
+		     MACRX_FREEZE_TLV_VERSION_5)) {
+			dump_mu_rx_info_v2(mu_rx_user_info,
+					   dma_hdr->mu_rx_num_users,
+					   cookie);
+		} else if (dma_hdr->mu_rx_data_incl) {
 			dump_mu_rx_info(mu_rx_user_info,
 					dma_hdr->mu_rx_num_users,
 					cookie);
+		}
 	} else {
 		cfr_err("<DBRCOMP><%u>\n"
 			"Tag: 0x%02x Length: %d udone: %d\n"
@@ -570,6 +725,11 @@ static QDF_STATUS check_dma_length(struct look_up_table *lut,
 		    lut->payload_length <= MAPLE_MAX_DATA_LENGTH_BYTES) {
 			return QDF_STATUS_SUCCESS;
 		}
+	} else if (target_type == TARGET_TYPE_QCN9224) {
+		if (lut->header_length <= WAIKIKI_MAX_HEADER_LENGTH_WORDS &&
+		    lut->payload_length <= WAIKIKI_MAX_DATA_LENGTH_BYTES) {
+			return QDF_STATUS_SUCCESS;
+		}
 	} else {
 		if (lut->header_length <= CYP_MAX_HEADER_LENGTH_WORDS &&
 		    lut->payload_length <= CYP_MAX_DATA_LENGTH_BYTES) {
@@ -1077,6 +1237,10 @@ static bool enh_cfr_dbr_event_handler(struct wlan_objmgr_pdev *pdev,
 		if (dma_hdr.freeze_tlv_version == MACRX_FREEZE_TLV_VERSION_3) {
 			freeze_tlv_len =
 				sizeof(struct macrx_freeze_capture_channel_v3);
+		} else if (dma_hdr.freeze_tlv_version ==
+				MACRX_FREEZE_TLV_VERSION_5) {
+			freeze_tlv_len =
+				sizeof(struct macrx_freeze_capture_channel_v5);
 		} else {
 			freeze_tlv_len =
 				sizeof(struct macrx_freeze_capture_channel);
@@ -2040,6 +2204,11 @@ QDF_STATUS cfr_enh_init_pdev(struct wlan_objmgr_psoc *psoc,
 		pcfr->num_subbufs = STREAMFS_NUM_SUBBUF_SPRUCE;
 		pcfr->chip_type = CFR_CAPTURE_RADIO_SPRUCE;
 		pcfr->max_mu_users = SPRUCE_CFR_MU_USERS;
+	} else if (target_type == TARGET_TYPE_QCN9224) {
+		pcfr->subbuf_size = STREAMFS_MAX_SUBBUF_WAIKIKI;
+		pcfr->num_subbufs = STREAMFS_NUM_SUBBUF_WAIKIKI;
+		pcfr->chip_type = CFR_CAPTURE_RADIO_WAIKIKI;
+		pcfr->max_mu_users = WAIKIKI_CFR_MU_USERS;
 	} else {
 		pcfr->subbuf_size = STREAMFS_MAX_SUBBUF_CYP;
 		pcfr->num_subbufs = STREAMFS_NUM_SUBBUF_CYP;