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_HIF_DPMAIF_H__ 1962306a36Sopenharmony_ci#define __T7XX_HIF_DPMAIF_H__ 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include <linux/bitmap.h> 2262306a36Sopenharmony_ci#include <linux/mm_types.h> 2362306a36Sopenharmony_ci#include <linux/netdevice.h> 2462306a36Sopenharmony_ci#include <linux/sched.h> 2562306a36Sopenharmony_ci#include <linux/skbuff.h> 2662306a36Sopenharmony_ci#include <linux/spinlock.h> 2762306a36Sopenharmony_ci#include <linux/types.h> 2862306a36Sopenharmony_ci#include <linux/wait.h> 2962306a36Sopenharmony_ci#include <linux/workqueue.h> 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#include "t7xx_dpmaif.h" 3262306a36Sopenharmony_ci#include "t7xx_pci.h" 3362306a36Sopenharmony_ci#include "t7xx_state_monitor.h" 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* SKB control buffer */ 3662306a36Sopenharmony_cistruct t7xx_skb_cb { 3762306a36Sopenharmony_ci u8 netif_idx; 3862306a36Sopenharmony_ci u8 txq_number; 3962306a36Sopenharmony_ci u8 rx_pkt_type; 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define T7XX_SKB_CB(__skb) ((struct t7xx_skb_cb *)(__skb)->cb) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cienum dpmaif_rdwr { 4562306a36Sopenharmony_ci DPMAIF_READ, 4662306a36Sopenharmony_ci DPMAIF_WRITE, 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/* Structure of DL BAT */ 5062306a36Sopenharmony_cistruct dpmaif_cur_rx_skb_info { 5162306a36Sopenharmony_ci bool msg_pit_received; 5262306a36Sopenharmony_ci struct sk_buff *cur_skb; 5362306a36Sopenharmony_ci unsigned int cur_chn_idx; 5462306a36Sopenharmony_ci unsigned int check_sum; 5562306a36Sopenharmony_ci unsigned int pit_dp; 5662306a36Sopenharmony_ci unsigned int pkt_type; 5762306a36Sopenharmony_ci int err_payload; 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistruct dpmaif_bat { 6162306a36Sopenharmony_ci unsigned int p_buffer_addr; 6262306a36Sopenharmony_ci unsigned int buffer_addr_ext; 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistruct dpmaif_bat_skb { 6662306a36Sopenharmony_ci struct sk_buff *skb; 6762306a36Sopenharmony_ci dma_addr_t data_bus_addr; 6862306a36Sopenharmony_ci unsigned int data_len; 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistruct dpmaif_bat_page { 7262306a36Sopenharmony_ci struct page *page; 7362306a36Sopenharmony_ci dma_addr_t data_bus_addr; 7462306a36Sopenharmony_ci unsigned int offset; 7562306a36Sopenharmony_ci unsigned int data_len; 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cienum bat_type { 7962306a36Sopenharmony_ci BAT_TYPE_NORMAL, 8062306a36Sopenharmony_ci BAT_TYPE_FRAG, 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistruct dpmaif_bat_request { 8462306a36Sopenharmony_ci void *bat_base; 8562306a36Sopenharmony_ci dma_addr_t bat_bus_addr; 8662306a36Sopenharmony_ci unsigned int bat_size_cnt; 8762306a36Sopenharmony_ci unsigned int bat_wr_idx; 8862306a36Sopenharmony_ci unsigned int bat_release_rd_idx; 8962306a36Sopenharmony_ci void *bat_skb; 9062306a36Sopenharmony_ci unsigned int pkt_buf_sz; 9162306a36Sopenharmony_ci unsigned long *bat_bitmap; 9262306a36Sopenharmony_ci atomic_t refcnt; 9362306a36Sopenharmony_ci spinlock_t mask_lock; /* Protects BAT mask */ 9462306a36Sopenharmony_ci enum bat_type type; 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistruct dpmaif_rx_queue { 9862306a36Sopenharmony_ci unsigned int index; 9962306a36Sopenharmony_ci bool que_started; 10062306a36Sopenharmony_ci unsigned int budget; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci void *pit_base; 10362306a36Sopenharmony_ci dma_addr_t pit_bus_addr; 10462306a36Sopenharmony_ci unsigned int pit_size_cnt; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci unsigned int pit_rd_idx; 10762306a36Sopenharmony_ci unsigned int pit_wr_idx; 10862306a36Sopenharmony_ci unsigned int pit_release_rd_idx; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci struct dpmaif_bat_request *bat_req; 11162306a36Sopenharmony_ci struct dpmaif_bat_request *bat_frag; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci atomic_t rx_processing; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci struct dpmaif_ctrl *dpmaif_ctrl; 11662306a36Sopenharmony_ci unsigned int expect_pit_seq; 11762306a36Sopenharmony_ci unsigned int pit_remain_release_cnt; 11862306a36Sopenharmony_ci struct dpmaif_cur_rx_skb_info rx_data_info; 11962306a36Sopenharmony_ci struct napi_struct napi; 12062306a36Sopenharmony_ci bool sleep_lock_pending; 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistruct dpmaif_tx_queue { 12462306a36Sopenharmony_ci unsigned int index; 12562306a36Sopenharmony_ci bool que_started; 12662306a36Sopenharmony_ci atomic_t tx_budget; 12762306a36Sopenharmony_ci void *drb_base; 12862306a36Sopenharmony_ci dma_addr_t drb_bus_addr; 12962306a36Sopenharmony_ci unsigned int drb_size_cnt; 13062306a36Sopenharmony_ci unsigned int drb_wr_idx; 13162306a36Sopenharmony_ci unsigned int drb_rd_idx; 13262306a36Sopenharmony_ci unsigned int drb_release_rd_idx; 13362306a36Sopenharmony_ci void *drb_skb_base; 13462306a36Sopenharmony_ci wait_queue_head_t req_wq; 13562306a36Sopenharmony_ci struct workqueue_struct *worker; 13662306a36Sopenharmony_ci struct work_struct dpmaif_tx_work; 13762306a36Sopenharmony_ci spinlock_t tx_lock; /* Protects txq DRB */ 13862306a36Sopenharmony_ci atomic_t tx_processing; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci struct dpmaif_ctrl *dpmaif_ctrl; 14162306a36Sopenharmony_ci struct sk_buff_head tx_skb_head; 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cistruct dpmaif_isr_para { 14562306a36Sopenharmony_ci struct dpmaif_ctrl *dpmaif_ctrl; 14662306a36Sopenharmony_ci unsigned char pcie_int; 14762306a36Sopenharmony_ci unsigned char dlq_id; 14862306a36Sopenharmony_ci}; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cienum dpmaif_state { 15162306a36Sopenharmony_ci DPMAIF_STATE_MIN, 15262306a36Sopenharmony_ci DPMAIF_STATE_PWROFF, 15362306a36Sopenharmony_ci DPMAIF_STATE_PWRON, 15462306a36Sopenharmony_ci DPMAIF_STATE_EXCEPTION, 15562306a36Sopenharmony_ci DPMAIF_STATE_MAX 15662306a36Sopenharmony_ci}; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cienum dpmaif_txq_state { 15962306a36Sopenharmony_ci DMPAIF_TXQ_STATE_IRQ, 16062306a36Sopenharmony_ci DMPAIF_TXQ_STATE_FULL, 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistruct dpmaif_callbacks { 16462306a36Sopenharmony_ci void (*state_notify)(struct t7xx_pci_dev *t7xx_dev, 16562306a36Sopenharmony_ci enum dpmaif_txq_state state, int txq_number); 16662306a36Sopenharmony_ci void (*recv_skb)(struct t7xx_ccmni_ctrl *ccmni_ctlb, struct sk_buff *skb, 16762306a36Sopenharmony_ci struct napi_struct *napi); 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistruct dpmaif_ctrl { 17162306a36Sopenharmony_ci struct device *dev; 17262306a36Sopenharmony_ci struct t7xx_pci_dev *t7xx_dev; 17362306a36Sopenharmony_ci struct md_pm_entity dpmaif_pm_entity; 17462306a36Sopenharmony_ci enum dpmaif_state state; 17562306a36Sopenharmony_ci bool dpmaif_sw_init_done; 17662306a36Sopenharmony_ci struct dpmaif_hw_info hw_info; 17762306a36Sopenharmony_ci struct dpmaif_tx_queue txq[DPMAIF_TXQ_NUM]; 17862306a36Sopenharmony_ci struct dpmaif_rx_queue rxq[DPMAIF_RXQ_NUM]; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci unsigned char rxq_int_mapping[DPMAIF_RXQ_NUM]; 18162306a36Sopenharmony_ci struct dpmaif_isr_para isr_para[DPMAIF_RXQ_NUM]; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci struct dpmaif_bat_request bat_req; 18462306a36Sopenharmony_ci struct dpmaif_bat_request bat_frag; 18562306a36Sopenharmony_ci struct workqueue_struct *bat_release_wq; 18662306a36Sopenharmony_ci struct work_struct bat_release_work; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci wait_queue_head_t tx_wq; 18962306a36Sopenharmony_ci struct task_struct *tx_thread; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci struct dpmaif_callbacks *callbacks; 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cistruct dpmaif_ctrl *t7xx_dpmaif_hif_init(struct t7xx_pci_dev *t7xx_dev, 19562306a36Sopenharmony_ci struct dpmaif_callbacks *callbacks); 19662306a36Sopenharmony_civoid t7xx_dpmaif_hif_exit(struct dpmaif_ctrl *dpmaif_ctrl); 19762306a36Sopenharmony_ciint t7xx_dpmaif_md_state_callback(struct dpmaif_ctrl *dpmaif_ctrl, enum md_state state); 19862306a36Sopenharmony_ciunsigned int t7xx_ring_buf_get_next_wr_idx(unsigned int buf_len, unsigned int buf_idx); 19962306a36Sopenharmony_ciunsigned int t7xx_ring_buf_rd_wr_count(unsigned int total_cnt, unsigned int rd_idx, 20062306a36Sopenharmony_ci unsigned int wr_idx, enum dpmaif_rdwr); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci#endif /* __T7XX_HIF_DPMAIF_H__ */ 203