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