123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- From 26af7aabd2d8225c6b2056234626ba5099610871 Mon Sep 17 00:00:00 2001
- From: Sriram R <quic_srirrama@quicinc.com>
- Date: Fri, 2 Dec 2022 23:37:14 +0200
- Subject: [PATCH] wifi: ath11k: update ce configurations for IPQ5018
- IPQ5018 is a single pdev device. Update host
- and target CE configurations accordingly.
- Tested-on: IPQ5018 hw1.0 AHB WLAN.HK.2.6.0.1-00861-QCAHKSWPL_SILICONZ-1
- Signed-off-by: Sriram R <quic_srirrama@quicinc.com>
- Co-developed-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com>
- Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com>
- Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
- Link: https://lore.kernel.org/r/20221122132152.17771-4-quic_kathirve@quicinc.com
- ---
- drivers/net/wireless/ath/ath11k/core.c | 4 +
- drivers/net/wireless/ath/ath11k/core.h | 3 +
- drivers/net/wireless/ath/ath11k/hw.c | 191 +++++++++++++++++++++++++
- 3 files changed, 198 insertions(+)
- --- a/drivers/net/wireless/ath/ath11k/core.c
- +++ b/drivers/net/wireless/ath/ath11k/core.c
- @@ -630,6 +630,10 @@ static const struct ath11k_hw_params ath
- .internal_sleep_clock = false,
- .host_ce_config = ath11k_host_ce_config_qcn9074,
- .ce_count = CE_CNT_5018,
- + .target_ce_config = ath11k_target_ce_config_wlan_ipq5018,
- + .target_ce_count = TARGET_CE_CNT_5018,
- + .svc_to_ce_map = ath11k_target_service_to_ce_map_wlan_ipq5018,
- + .svc_to_ce_map_len = SVC_CE_MAP_LEN_5018,
- .rxdma1_enable = true,
- .num_rxmda_per_pdev = RXDMA_PER_PDEV_5018,
- .rx_mac_buf_ring = false,
- --- a/drivers/net/wireless/ath/ath11k/core.h
- +++ b/drivers/net/wireless/ath/ath11k/core.h
- @@ -1145,6 +1145,9 @@ extern const struct service_to_pipe ath1
- extern const struct ce_pipe_config ath11k_target_ce_config_wlan_qca6390[];
- extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qca6390[];
-
- +extern const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[];
- +extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq5018[];
- +
- extern const struct ce_pipe_config ath11k_target_ce_config_wlan_qcn9074[];
- extern const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qcn9074[];
- int ath11k_core_qmi_firmware_ready(struct ath11k_base *ab);
- --- a/drivers/net/wireless/ath/ath11k/hw.c
- +++ b/drivers/net/wireless/ath/ath11k/hw.c
- @@ -1972,6 +1972,197 @@ const struct ath11k_hw_ring_mask ath11k_
- },
- };
-
- +/* Target firmware's Copy Engine configuration for IPQ5018 */
- +const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[] = {
- + /* CE0: host->target HTC control and raw streams */
- + {
- + .pipenum = __cpu_to_le32(0),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT),
- + .nentries = __cpu_to_le32(32),
- + .nbytes_max = __cpu_to_le32(2048),
- + .flags = __cpu_to_le32(CE_ATTR_FLAGS),
- + .reserved = __cpu_to_le32(0),
- + },
- +
- + /* CE1: target->host HTT + HTC control */
- + {
- + .pipenum = __cpu_to_le32(1),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN),
- + .nentries = __cpu_to_le32(32),
- + .nbytes_max = __cpu_to_le32(2048),
- + .flags = __cpu_to_le32(CE_ATTR_FLAGS),
- + .reserved = __cpu_to_le32(0),
- + },
- +
- + /* CE2: target->host WMI */
- + {
- + .pipenum = __cpu_to_le32(2),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN),
- + .nentries = __cpu_to_le32(32),
- + .nbytes_max = __cpu_to_le32(2048),
- + .flags = __cpu_to_le32(CE_ATTR_FLAGS),
- + .reserved = __cpu_to_le32(0),
- + },
- +
- + /* CE3: host->target WMI */
- + {
- + .pipenum = __cpu_to_le32(3),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT),
- + .nentries = __cpu_to_le32(32),
- + .nbytes_max = __cpu_to_le32(2048),
- + .flags = __cpu_to_le32(CE_ATTR_FLAGS),
- + .reserved = __cpu_to_le32(0),
- + },
- +
- + /* CE4: host->target HTT */
- + {
- + .pipenum = __cpu_to_le32(4),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT),
- + .nentries = __cpu_to_le32(256),
- + .nbytes_max = __cpu_to_le32(256),
- + .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
- + .reserved = __cpu_to_le32(0),
- + },
- +
- + /* CE5: target->host Pktlog */
- + {
- + .pipenum = __cpu_to_le32(5),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN),
- + .nentries = __cpu_to_le32(32),
- + .nbytes_max = __cpu_to_le32(2048),
- + .flags = __cpu_to_le32(CE_ATTR_FLAGS),
- + .reserved = __cpu_to_le32(0),
- + },
- +
- + /* CE6: Reserved for target autonomous hif_memcpy */
- + {
- + .pipenum = __cpu_to_le32(6),
- + .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
- + .nentries = __cpu_to_le32(32),
- + .nbytes_max = __cpu_to_le32(16384),
- + .flags = __cpu_to_le32(CE_ATTR_FLAGS),
- + .reserved = __cpu_to_le32(0),
- + },
- +
- + /* CE7 used only by Host */
- + {
- + .pipenum = __cpu_to_le32(7),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT),
- + .nentries = __cpu_to_le32(32),
- + .nbytes_max = __cpu_to_le32(2048),
- + .flags = __cpu_to_le32(0x2000),
- + .reserved = __cpu_to_le32(0),
- + },
- +
- + /* CE8 target->host used only by IPA */
- + {
- + .pipenum = __cpu_to_le32(8),
- + .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
- + .nentries = __cpu_to_le32(32),
- + .nbytes_max = __cpu_to_le32(16384),
- + .flags = __cpu_to_le32(CE_ATTR_FLAGS),
- + .reserved = __cpu_to_le32(0),
- + },
- +};
- +
- +/* Map from service/endpoint to Copy Engine for IPQ5018.
- + * This table is derived from the CE TABLE, above.
- + * It is passed to the Target at startup for use by firmware.
- + */
- +const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq5018[] = {
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
- + .pipenum = __cpu_to_le32(3),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
- + .pipenum = __cpu_to_le32(2),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
- + .pipenum = __cpu_to_le32(3),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
- + .pipenum = __cpu_to_le32(2),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
- + .pipenum = __cpu_to_le32(3),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
- + .pipenum = __cpu_to_le32(2),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
- + .pipenum = __cpu_to_le32(3),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
- + .pipenum = __cpu_to_le32(2),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
- + .pipenum = __cpu_to_le32(3),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
- + .pipenum = __cpu_to_le32(2),
- + },
- +
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
- + .pipenum = __cpu_to_le32(0),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
- + .pipenum = __cpu_to_le32(1),
- + },
- +
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
- + .pipenum = __cpu_to_le32(0),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
- + .pipenum = __cpu_to_le32(1),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
- + .pipedir = __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */
- + .pipenum = __cpu_to_le32(4),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
- + .pipenum = __cpu_to_le32(1),
- + },
- + {
- + .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG),
- + .pipedir = __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */
- + .pipenum = __cpu_to_le32(5),
- + },
- +
- + /* (Additions here) */
- +
- + { /* terminator entry */ }
- +};
- +
- const struct ath11k_hw_regs ipq8074_regs = {
- /* SW2TCL(x) R0 ring configuration address */
- .hal_tcl1_ring_base_lsb = 0x00000510,
|