162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Copyright (c) 2021, MediaTek Inc. 462306a36Sopenharmony_ci * Copyright (c) 2021-2022, Intel Corporation. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Authors: 762306a36Sopenharmony_ci * Amir Hanania <amir.hanania@intel.com> 862306a36Sopenharmony_ci * Haijun Liu <haijun.liu@mediatek.com> 962306a36Sopenharmony_ci * Moises Veleta <moises.veleta@intel.com> 1062306a36Sopenharmony_ci * Ricardo Martinez <ricardo.martinez@linux.intel.com> 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * Contributors: 1362306a36Sopenharmony_ci * Chiranjeevi Rapolu <chiranjeevi.rapolu@intel.com> 1462306a36Sopenharmony_ci * Eliot Lee <eliot.lee@intel.com> 1562306a36Sopenharmony_ci * Sreehari Kancharla <sreehari.kancharla@intel.com> 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifndef __T7XX_DPMAIF_H__ 1962306a36Sopenharmony_ci#define __T7XX_DPMAIF_H__ 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include <linux/bits.h> 2262306a36Sopenharmony_ci#include <linux/types.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define DPMAIF_DL_PIT_SEQ_VALUE 251 2562306a36Sopenharmony_ci#define DPMAIF_UL_DRB_SIZE_WORD 4 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define DPMAIF_MAX_CHECK_COUNT 1000000 2862306a36Sopenharmony_ci#define DPMAIF_CHECK_TIMEOUT_US 10000 2962306a36Sopenharmony_ci#define DPMAIF_CHECK_INIT_TIMEOUT_US 100000 3062306a36Sopenharmony_ci#define DPMAIF_CHECK_DELAY_US 10 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define DPMAIF_RXQ_NUM 2 3362306a36Sopenharmony_ci#define DPMAIF_TXQ_NUM 5 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistruct dpmaif_isr_en_mask { 3662306a36Sopenharmony_ci unsigned int ap_ul_l2intr_en_msk; 3762306a36Sopenharmony_ci unsigned int ap_dl_l2intr_en_msk; 3862306a36Sopenharmony_ci unsigned int ap_udl_ip_busy_en_msk; 3962306a36Sopenharmony_ci unsigned int ap_dl_l2intr_err_en_msk; 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistruct dpmaif_ul { 4362306a36Sopenharmony_ci bool que_started; 4462306a36Sopenharmony_ci unsigned char reserved[3]; 4562306a36Sopenharmony_ci dma_addr_t drb_base; 4662306a36Sopenharmony_ci unsigned int drb_size_cnt; 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct dpmaif_dl { 5062306a36Sopenharmony_ci bool que_started; 5162306a36Sopenharmony_ci unsigned char reserved[3]; 5262306a36Sopenharmony_ci dma_addr_t pit_base; 5362306a36Sopenharmony_ci unsigned int pit_size_cnt; 5462306a36Sopenharmony_ci dma_addr_t bat_base; 5562306a36Sopenharmony_ci unsigned int bat_size_cnt; 5662306a36Sopenharmony_ci dma_addr_t frg_base; 5762306a36Sopenharmony_ci unsigned int frg_size_cnt; 5862306a36Sopenharmony_ci unsigned int pit_seq; 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistruct dpmaif_hw_info { 6262306a36Sopenharmony_ci struct device *dev; 6362306a36Sopenharmony_ci void __iomem *pcie_base; 6462306a36Sopenharmony_ci struct dpmaif_dl dl_que[DPMAIF_RXQ_NUM]; 6562306a36Sopenharmony_ci struct dpmaif_ul ul_que[DPMAIF_TXQ_NUM]; 6662306a36Sopenharmony_ci struct dpmaif_isr_en_mask isr_en_mask; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* DPMAIF HW Initialization parameter structure */ 7062306a36Sopenharmony_cistruct dpmaif_hw_params { 7162306a36Sopenharmony_ci /* UL part */ 7262306a36Sopenharmony_ci dma_addr_t drb_base_addr[DPMAIF_TXQ_NUM]; 7362306a36Sopenharmony_ci unsigned int drb_size_cnt[DPMAIF_TXQ_NUM]; 7462306a36Sopenharmony_ci /* DL part */ 7562306a36Sopenharmony_ci dma_addr_t pkt_bat_base_addr[DPMAIF_RXQ_NUM]; 7662306a36Sopenharmony_ci unsigned int pkt_bat_size_cnt[DPMAIF_RXQ_NUM]; 7762306a36Sopenharmony_ci dma_addr_t frg_bat_base_addr[DPMAIF_RXQ_NUM]; 7862306a36Sopenharmony_ci unsigned int frg_bat_size_cnt[DPMAIF_RXQ_NUM]; 7962306a36Sopenharmony_ci dma_addr_t pit_base_addr[DPMAIF_RXQ_NUM]; 8062306a36Sopenharmony_ci unsigned int pit_size_cnt[DPMAIF_RXQ_NUM]; 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cienum dpmaif_hw_intr_type { 8462306a36Sopenharmony_ci DPF_INTR_INVALID_MIN, 8562306a36Sopenharmony_ci DPF_INTR_UL_DONE, 8662306a36Sopenharmony_ci DPF_INTR_UL_DRB_EMPTY, 8762306a36Sopenharmony_ci DPF_INTR_UL_MD_NOTREADY, 8862306a36Sopenharmony_ci DPF_INTR_UL_MD_PWR_NOTREADY, 8962306a36Sopenharmony_ci DPF_INTR_UL_LEN_ERR, 9062306a36Sopenharmony_ci DPF_INTR_DL_DONE, 9162306a36Sopenharmony_ci DPF_INTR_DL_SKB_LEN_ERR, 9262306a36Sopenharmony_ci DPF_INTR_DL_BATCNT_LEN_ERR, 9362306a36Sopenharmony_ci DPF_INTR_DL_PITCNT_LEN_ERR, 9462306a36Sopenharmony_ci DPF_INTR_DL_PKT_EMPTY_SET, 9562306a36Sopenharmony_ci DPF_INTR_DL_FRG_EMPTY_SET, 9662306a36Sopenharmony_ci DPF_INTR_DL_MTU_ERR, 9762306a36Sopenharmony_ci DPF_INTR_DL_FRGCNT_LEN_ERR, 9862306a36Sopenharmony_ci DPF_INTR_DL_Q0_PITCNT_LEN_ERR, 9962306a36Sopenharmony_ci DPF_INTR_DL_Q1_PITCNT_LEN_ERR, 10062306a36Sopenharmony_ci DPF_INTR_DL_HPC_ENT_TYPE_ERR, 10162306a36Sopenharmony_ci DPF_INTR_DL_Q0_DONE, 10262306a36Sopenharmony_ci DPF_INTR_DL_Q1_DONE, 10362306a36Sopenharmony_ci DPF_INTR_INVALID_MAX 10462306a36Sopenharmony_ci}; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci#define DPF_RX_QNO0 0 10762306a36Sopenharmony_ci#define DPF_RX_QNO1 1 10862306a36Sopenharmony_ci#define DPF_RX_QNO_DFT DPF_RX_QNO0 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistruct dpmaif_hw_intr_st_para { 11162306a36Sopenharmony_ci unsigned int intr_cnt; 11262306a36Sopenharmony_ci enum dpmaif_hw_intr_type intr_types[DPF_INTR_INVALID_MAX - 1]; 11362306a36Sopenharmony_ci unsigned int intr_queues[DPF_INTR_INVALID_MAX - 1]; 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#define DPMAIF_HW_BAT_REMAIN 64 11762306a36Sopenharmony_ci#define DPMAIF_HW_BAT_PKTBUF (128 * 28) 11862306a36Sopenharmony_ci#define DPMAIF_HW_FRG_PKTBUF 128 11962306a36Sopenharmony_ci#define DPMAIF_HW_BAT_RSVLEN 64 12062306a36Sopenharmony_ci#define DPMAIF_HW_PKT_BIDCNT 1 12162306a36Sopenharmony_ci#define DPMAIF_HW_MTU_SIZE (3 * 1024 + 8) 12262306a36Sopenharmony_ci#define DPMAIF_HW_CHK_BAT_NUM 62 12362306a36Sopenharmony_ci#define DPMAIF_HW_CHK_FRG_NUM 3 12462306a36Sopenharmony_ci#define DPMAIF_HW_CHK_PIT_NUM (2 * DPMAIF_HW_CHK_BAT_NUM) 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#define DP_UL_INT_DONE_OFFSET 0 12762306a36Sopenharmony_ci#define DP_UL_INT_QDONE_MSK GENMASK(4, 0) 12862306a36Sopenharmony_ci#define DP_UL_INT_EMPTY_MSK GENMASK(9, 5) 12962306a36Sopenharmony_ci#define DP_UL_INT_MD_NOTREADY_MSK GENMASK(14, 10) 13062306a36Sopenharmony_ci#define DP_UL_INT_MD_PWR_NOTREADY_MSK GENMASK(19, 15) 13162306a36Sopenharmony_ci#define DP_UL_INT_ERR_MSK GENMASK(24, 20) 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#define DP_DL_INT_QDONE_MSK BIT(0) 13462306a36Sopenharmony_ci#define DP_DL_INT_SKB_LEN_ERR BIT(1) 13562306a36Sopenharmony_ci#define DP_DL_INT_BATCNT_LEN_ERR BIT(2) 13662306a36Sopenharmony_ci#define DP_DL_INT_PITCNT_LEN_ERR BIT(3) 13762306a36Sopenharmony_ci#define DP_DL_INT_PKT_EMPTY_MSK BIT(4) 13862306a36Sopenharmony_ci#define DP_DL_INT_FRG_EMPTY_MSK BIT(5) 13962306a36Sopenharmony_ci#define DP_DL_INT_MTU_ERR_MSK BIT(6) 14062306a36Sopenharmony_ci#define DP_DL_INT_FRG_LEN_ERR_MSK BIT(7) 14162306a36Sopenharmony_ci#define DP_DL_INT_Q0_PITCNT_LEN_ERR BIT(8) 14262306a36Sopenharmony_ci#define DP_DL_INT_Q1_PITCNT_LEN_ERR BIT(9) 14362306a36Sopenharmony_ci#define DP_DL_INT_HPC_ENT_TYPE_ERR BIT(10) 14462306a36Sopenharmony_ci#define DP_DL_INT_Q0_DONE BIT(13) 14562306a36Sopenharmony_ci#define DP_DL_INT_Q1_DONE BIT(14) 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci#define DP_DL_Q0_STATUS_MASK (DP_DL_INT_Q0_PITCNT_LEN_ERR | DP_DL_INT_Q0_DONE) 14862306a36Sopenharmony_ci#define DP_DL_Q1_STATUS_MASK (DP_DL_INT_Q1_PITCNT_LEN_ERR | DP_DL_INT_Q1_DONE) 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ciint t7xx_dpmaif_hw_init(struct dpmaif_hw_info *hw_info, struct dpmaif_hw_params *init_param); 15162306a36Sopenharmony_ciint t7xx_dpmaif_hw_stop_all_txq(struct dpmaif_hw_info *hw_info); 15262306a36Sopenharmony_ciint t7xx_dpmaif_hw_stop_all_rxq(struct dpmaif_hw_info *hw_info); 15362306a36Sopenharmony_civoid t7xx_dpmaif_start_hw(struct dpmaif_hw_info *hw_info); 15462306a36Sopenharmony_ciint t7xx_dpmaif_hw_get_intr_cnt(struct dpmaif_hw_info *hw_info, 15562306a36Sopenharmony_ci struct dpmaif_hw_intr_st_para *para, int qno); 15662306a36Sopenharmony_civoid t7xx_dpmaif_unmask_ulq_intr(struct dpmaif_hw_info *hw_info, unsigned int q_num); 15762306a36Sopenharmony_civoid t7xx_dpmaif_ul_update_hw_drb_cnt(struct dpmaif_hw_info *hw_info, unsigned int q_num, 15862306a36Sopenharmony_ci unsigned int drb_entry_cnt); 15962306a36Sopenharmony_ciint t7xx_dpmaif_dl_snd_hw_bat_cnt(struct dpmaif_hw_info *hw_info, unsigned int bat_entry_cnt); 16062306a36Sopenharmony_ciint t7xx_dpmaif_dl_snd_hw_frg_cnt(struct dpmaif_hw_info *hw_info, unsigned int frg_entry_cnt); 16162306a36Sopenharmony_ciint t7xx_dpmaif_dlq_add_pit_remain_cnt(struct dpmaif_hw_info *hw_info, unsigned int dlq_pit_idx, 16262306a36Sopenharmony_ci unsigned int pit_remain_cnt); 16362306a36Sopenharmony_civoid t7xx_dpmaif_dlq_unmask_pitcnt_len_err_intr(struct dpmaif_hw_info *hw_info, 16462306a36Sopenharmony_ci unsigned int qno); 16562306a36Sopenharmony_civoid t7xx_dpmaif_dlq_unmask_rx_done(struct dpmaif_hw_info *hw_info, unsigned int qno); 16662306a36Sopenharmony_cibool t7xx_dpmaif_ul_clr_done(struct dpmaif_hw_info *hw_info, unsigned int qno); 16762306a36Sopenharmony_civoid t7xx_dpmaif_ul_clr_all_intr(struct dpmaif_hw_info *hw_info); 16862306a36Sopenharmony_civoid t7xx_dpmaif_dl_clr_all_intr(struct dpmaif_hw_info *hw_info); 16962306a36Sopenharmony_civoid t7xx_dpmaif_clr_ip_busy_sts(struct dpmaif_hw_info *hw_info); 17062306a36Sopenharmony_civoid t7xx_dpmaif_dl_unmask_batcnt_len_err_intr(struct dpmaif_hw_info *hw_info); 17162306a36Sopenharmony_civoid t7xx_dpmaif_dl_unmask_pitcnt_len_err_intr(struct dpmaif_hw_info *hw_info); 17262306a36Sopenharmony_ciunsigned int t7xx_dpmaif_ul_get_rd_idx(struct dpmaif_hw_info *hw_info, unsigned int q_num); 17362306a36Sopenharmony_ciunsigned int t7xx_dpmaif_dl_get_bat_rd_idx(struct dpmaif_hw_info *hw_info, unsigned int q_num); 17462306a36Sopenharmony_ciunsigned int t7xx_dpmaif_dl_get_bat_wr_idx(struct dpmaif_hw_info *hw_info, unsigned int q_num); 17562306a36Sopenharmony_ciunsigned int t7xx_dpmaif_dl_get_frg_rd_idx(struct dpmaif_hw_info *hw_info, unsigned int q_num); 17662306a36Sopenharmony_ciunsigned int t7xx_dpmaif_dl_dlq_pit_get_wr_idx(struct dpmaif_hw_info *hw_info, 17762306a36Sopenharmony_ci unsigned int dlq_pit_idx); 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci#endif /* __T7XX_DPMAIF_H__ */ 180