Эх сурвалжийг харах

qcacmn: add ce src/dst desc changes for wcn6450

WCN6450 uses adrastea copy engines with the following changes
for data and control messages between host and target,
 * 40-bit addressing support
 * SRC/DST desc format changes

Add ce desc changes required for WCN6450 data path.

Change-Id: I71f60f8f23aa7eebb9fa3848d33a02d579e9ef7a
CRs-Fixed: 3381129
Venkateswara Naralasetty 2 жил өмнө
parent
commit
1067c35404

+ 80 - 3
hif/src/ce/ce_internal.h

@@ -196,13 +196,90 @@ struct CE_state {
 #ifdef QCA_WIFI_3_0
 #define HIF_CE_DESC_ADDR_TO_DMA(desc) \
 	(qdf_dma_addr_t)(((uint64_t)(desc)->buffer_addr + \
-	((uint64_t)((desc)->buffer_addr_hi & 0x1F) << 32)))
+	((uint64_t)((desc)->buffer_addr_hi & CE_RING_BASE_ADDR_HIGH_MASK) << \
+	 32)))
 #else
 #define HIF_CE_DESC_ADDR_TO_DMA(desc) \
 	(qdf_dma_addr_t)((desc)->buffer_addr)
 #endif
 
-#ifdef QCA_WIFI_3_0
+#if defined(QCA_WIFI_WCN6450)
+struct CE_src_desc {
+	uint32_t buffer_addr:32;
+#if _BYTE_ORDER == _BIG_ENDIAN
+	uint32_t gather:1,
+		 packet_result_offset:12,
+		 toeplitz_hash_enable:1, /* reserved */
+		 addr_x_search_disable:1, /* reserved */
+		 addr_y_search_disable:1, /* reserved */
+		 misc_int_disable:1,
+		 target_int_disable:1,
+		 host_int_disable:1,
+		 dest_byte_swap:1,
+		 byte_swap:1,
+		 type:2, /* reserved */
+		 tx_classify:1,
+		 buffer_addr_hi:8;
+	uint32_t meta_data:16,
+		 nbytes:16;
+#else
+	uint32_t buffer_addr_hi:8,
+		 tx_classify:1,
+		 type:2, /* reserved */
+		 byte_swap:1, /* src_byte_swap */
+		 dest_byte_swap:1,
+		 host_int_disable:1,
+		 target_int_disable:1,
+		 misc_int_disable:1,
+		 addr_y_search_disable:1, /* reserved */
+		 addr_x_search_disable:1, /* reserved */
+		 toeplitz_hash_enable:1, /* reserved */
+		 packet_result_offset:12,
+		 gather:1;
+	uint32_t nbytes:16,
+		 meta_data:16;
+#endif
+	uint32_t toeplitz_hash_result:32;
+};
+
+struct CE_dest_desc {
+	uint32_t buffer_addr:32;
+#if _BYTE_ORDER == _BIG_ENDIAN
+	uint32_t gather:1,
+		 packet_result_offset:12,
+		 toeplitz_hash_enable:1, /* reserved */
+		 addr_x_search_disable:1, /* reserved */
+		 addr_y_search_disable:1, /* reserved */
+		 misc_int_disable:1,
+		 target_int_disable:1,
+		 host_int_disable:1,
+		 byte_swap:1, /* dest_byte_swap */
+		 src_byte_swap:1,
+		 type:2, /* reserved */
+		 tx_classify:1,
+		 buffer_addr_hi:8;
+	uint32_t meta_data:16,
+		 nbytes:16;
+#else
+	uint32_t buffer_addr_hi:8,
+		 tx_classify:1,
+		 type:2, /* reserved */
+		 src_byte_swap:1,
+		 byte_swap:1, /* dest_byte_swap */
+		 host_int_disable:1,
+		 target_int_disable:1,
+		 misc_int_disable:1,
+		 addr_y_search_disable:1, /* reserved */
+		 addr_x_search_disable:1, /* reserved */
+		 toeplitz_hash_enable:1, /* reserved */
+		 packet_result_offset:12,
+		 gather:1;
+	uint32_t nbytes:16,
+		 meta_data:16;
+#endif
+	uint32_t toeplitz_hash_result:32;
+};
+#elif defined(QCA_WIFI_3_0)
 struct CE_src_desc {
 	uint32_t buffer_addr:32;
 #if _BYTE_ORDER == _BIG_ENDIAN
@@ -325,7 +402,7 @@ struct CE_dest_desc {
 		 meta_data:12;
 #endif
 };
-#endif /* QCA_WIFI_3_0 */
+#endif /* QCA_WIFI_WCN6450 */
 
 struct ce_srng_src_desc {
 	uint32_t buffer_addr_lo;

+ 6 - 0
hif/src/ce/ce_reg.h

@@ -328,6 +328,12 @@ unsigned int hif_get_dst_ring_read_index(struct hif_softc *scn,
 	A_TARGET_READ(scn, (CE_ctrl_addr) + CURRENT_SRRI_ADDRESS)
 #endif
 
+#ifdef WLAN_40BIT_ADDRESSING_SUPPORT
+#define CE_RING_BASE_ADDR_HIGH_MASK 0xFF
+#else
+#define CE_RING_BASE_ADDR_HIGH_MASK 0x1F
+#endif
+
 #define CE_SRC_RING_BASE_ADDR_SET(scn, CE_ctrl_addr, addr) \
 	A_TARGET_WRITE(scn, (CE_ctrl_addr) + SR_BA_ADDRESS, (addr))
 

+ 12 - 7
hif/src/ce/ce_service_legacy.c

@@ -82,7 +82,7 @@ ce_buffer_addr_hi_set(struct CE_src_desc *shadow_src_desc,
 		      uint32_t user_flags)
 {
 	shadow_src_desc->buffer_addr_hi =
-			(uint32_t)((dma_addr >> 32) & 0x1F);
+		(uint32_t)((dma_addr >> 32) & CE_RING_BASE_ADDR_HIGH_MASK);
 	user_flags |= shadow_src_desc->buffer_addr_hi;
 	memcpy(&(((uint32_t *)shadow_src_desc)[1]), &user_flags,
 	       sizeof(uint32_t));
@@ -560,9 +560,11 @@ ce_send_nolock_legacy(struct CE_handle *copyeng,
 		/* Update low 32 bits source descriptor address */
 		shadow_src_desc->buffer_addr =
 			(uint32_t)(dma_addr & 0xFFFFFFFF);
+
 #ifdef QCA_WIFI_3_0
 		shadow_src_desc->buffer_addr_hi =
-			(uint32_t)((dma_addr >> 32) & 0x1F);
+			(uint32_t)((dma_addr >> 32) &
+				   CE_RING_BASE_ADDR_HIGH_MASK);
 		user_flags |= shadow_src_desc->buffer_addr_hi;
 		memcpy(&(((uint32_t *)shadow_src_desc)[1]), &user_flags,
 		       sizeof(uint32_t));
@@ -739,7 +741,8 @@ ce_recv_buf_enqueue_legacy(struct CE_handle *copyeng,
 		dest_desc->buffer_addr = (uint32_t)(dma_addr & 0xFFFFFFFF);
 #ifdef QCA_WIFI_3_0
 		dest_desc->buffer_addr_hi =
-			(uint32_t)((dma_addr >> 32) & 0x1F);
+			(uint32_t)((dma_addr >> 32) &
+				   CE_RING_BASE_ADDR_HIGH_MASK);
 #endif
 		dest_desc->nbytes = 0;
 
@@ -1140,8 +1143,9 @@ static void ce_legacy_src_ring_setup(struct hif_softc *scn, uint32_t ce_id,
 
 		tmp = CE_SRC_RING_BASE_ADDR_HIGH_GET(
 				scn, ctrl_addr);
-		tmp &= ~0x1F;
-		dma_addr = ((dma_addr >> 32) & 0x1F) | tmp;
+		tmp &= ~CE_RING_BASE_ADDR_HIGH_MASK;
+		dma_addr =
+			((dma_addr >> 32) & CE_RING_BASE_ADDR_HIGH_MASK) | tmp;
 		CE_SRC_RING_BASE_ADDR_HIGH_SET(scn,
 					ctrl_addr, (uint32_t)dma_addr);
 	}
@@ -1178,8 +1182,9 @@ static void ce_legacy_dest_ring_setup(struct hif_softc *scn, uint32_t ce_id,
 
 		tmp = CE_DEST_RING_BASE_ADDR_HIGH_GET(scn,
 						      ctrl_addr);
-		tmp &= ~0x1F;
-		dma_addr = ((dma_addr >> 32) & 0x1F) | tmp;
+		tmp &= ~CE_RING_BASE_ADDR_HIGH_MASK;
+		dma_addr =
+			((dma_addr >> 32) & CE_RING_BASE_ADDR_HIGH_MASK) | tmp;
 		CE_DEST_RING_BASE_ADDR_HIGH_SET(scn,
 				ctrl_addr, (uint32_t)dma_addr);
 	}