Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0-only
  2 *
  3 * Copyright (c) 2021, MediaTek Inc.
  4 * Copyright (c) 2021-2022, Intel Corporation.
  5 *
  6 * Authors:
  7 *  Amir Hanania <amir.hanania@intel.com>
  8 *  Haijun Liu <haijun.liu@mediatek.com>
  9 *  Moises Veleta <moises.veleta@intel.com>
 10 *  Ricardo Martinez <ricardo.martinez@linux.intel.com>
 11 *
 12 * Contributors:
 13 *  Chiranjeevi Rapolu <chiranjeevi.rapolu@intel.com>
 14 *  Eliot Lee <eliot.lee@intel.com>
 15 *  Sreehari Kancharla <sreehari.kancharla@intel.com>
 16 */
 17
 18#ifndef __T7XX_HIF_DPMAIF_H__
 19#define __T7XX_HIF_DPMAIF_H__
 20
 21#include <linux/bitmap.h>
 22#include <linux/mm_types.h>
 23#include <linux/netdevice.h>
 24#include <linux/sched.h>
 25#include <linux/skbuff.h>
 26#include <linux/spinlock.h>
 27#include <linux/types.h>
 28#include <linux/wait.h>
 29#include <linux/workqueue.h>
 30
 31#include "t7xx_dpmaif.h"
 32#include "t7xx_pci.h"
 33#include "t7xx_state_monitor.h"
 34
 35/* SKB control buffer */
 36struct t7xx_skb_cb {
 37	u8	netif_idx;
 38	u8	txq_number;
 39	u8	rx_pkt_type;
 40};
 41
 42#define T7XX_SKB_CB(__skb)	((struct t7xx_skb_cb *)(__skb)->cb)
 43
 44enum dpmaif_rdwr {
 45	DPMAIF_READ,
 46	DPMAIF_WRITE,
 47};
 48
 49/* Structure of DL BAT */
 50struct dpmaif_cur_rx_skb_info {
 51	bool			msg_pit_received;
 52	struct sk_buff		*cur_skb;
 53	unsigned int		cur_chn_idx;
 54	unsigned int		check_sum;
 55	unsigned int		pit_dp;
 56	unsigned int		pkt_type;
 57	int			err_payload;
 58};
 59
 60struct dpmaif_bat {
 61	unsigned int		p_buffer_addr;
 62	unsigned int		buffer_addr_ext;
 63};
 64
 65struct dpmaif_bat_skb {
 66	struct sk_buff		*skb;
 67	dma_addr_t		data_bus_addr;
 68	unsigned int		data_len;
 69};
 70
 71struct dpmaif_bat_page {
 72	struct page		*page;
 73	dma_addr_t		data_bus_addr;
 74	unsigned int		offset;
 75	unsigned int		data_len;
 76};
 77
 78enum bat_type {
 79	BAT_TYPE_NORMAL,
 80	BAT_TYPE_FRAG,
 81};
 82
 83struct dpmaif_bat_request {
 84	void			*bat_base;
 85	dma_addr_t		bat_bus_addr;
 86	unsigned int		bat_size_cnt;
 87	unsigned int		bat_wr_idx;
 88	unsigned int		bat_release_rd_idx;
 89	void			*bat_skb;
 90	unsigned int		pkt_buf_sz;
 91	unsigned long		*bat_bitmap;
 92	atomic_t		refcnt;
 93	spinlock_t		mask_lock; /* Protects BAT mask */
 94	enum bat_type		type;
 95};
 96
 97struct dpmaif_rx_queue {
 98	unsigned int		index;
 99	bool			que_started;
100	unsigned int		budget;
101
102	void			*pit_base;
103	dma_addr_t		pit_bus_addr;
104	unsigned int		pit_size_cnt;
105
106	unsigned int		pit_rd_idx;
107	unsigned int		pit_wr_idx;
108	unsigned int		pit_release_rd_idx;
109
110	struct dpmaif_bat_request *bat_req;
111	struct dpmaif_bat_request *bat_frag;
112
113	atomic_t		rx_processing;
114
115	struct dpmaif_ctrl	*dpmaif_ctrl;
116	unsigned int		expect_pit_seq;
117	unsigned int		pit_remain_release_cnt;
118	struct dpmaif_cur_rx_skb_info rx_data_info;
119	struct napi_struct	napi;
120	bool			sleep_lock_pending;
121};
122
123struct dpmaif_tx_queue {
124	unsigned int		index;
125	bool			que_started;
126	atomic_t		tx_budget;
127	void			*drb_base;
128	dma_addr_t		drb_bus_addr;
129	unsigned int		drb_size_cnt;
130	unsigned int		drb_wr_idx;
131	unsigned int		drb_rd_idx;
132	unsigned int		drb_release_rd_idx;
133	void			*drb_skb_base;
134	wait_queue_head_t	req_wq;
135	struct workqueue_struct	*worker;
136	struct work_struct	dpmaif_tx_work;
137	spinlock_t		tx_lock; /* Protects txq DRB */
138	atomic_t		tx_processing;
139
140	struct dpmaif_ctrl	*dpmaif_ctrl;
141	struct sk_buff_head	tx_skb_head;
142};
143
144struct dpmaif_isr_para {
145	struct dpmaif_ctrl	*dpmaif_ctrl;
146	unsigned char		pcie_int;
147	unsigned char		dlq_id;
148};
149
150enum dpmaif_state {
151	DPMAIF_STATE_MIN,
152	DPMAIF_STATE_PWROFF,
153	DPMAIF_STATE_PWRON,
154	DPMAIF_STATE_EXCEPTION,
155	DPMAIF_STATE_MAX
156};
157
158enum dpmaif_txq_state {
159	DMPAIF_TXQ_STATE_IRQ,
160	DMPAIF_TXQ_STATE_FULL,
161};
162
163struct dpmaif_callbacks {
164	void (*state_notify)(struct t7xx_pci_dev *t7xx_dev,
165			     enum dpmaif_txq_state state, int txq_number);
166	void (*recv_skb)(struct t7xx_ccmni_ctrl *ccmni_ctlb, struct sk_buff *skb,
167			 struct napi_struct *napi);
168};
169
170struct dpmaif_ctrl {
171	struct device			*dev;
172	struct t7xx_pci_dev		*t7xx_dev;
173	struct md_pm_entity		dpmaif_pm_entity;
174	enum dpmaif_state		state;
175	bool				dpmaif_sw_init_done;
176	struct dpmaif_hw_info		hw_info;
177	struct dpmaif_tx_queue		txq[DPMAIF_TXQ_NUM];
178	struct dpmaif_rx_queue		rxq[DPMAIF_RXQ_NUM];
179
180	unsigned char			rxq_int_mapping[DPMAIF_RXQ_NUM];
181	struct dpmaif_isr_para		isr_para[DPMAIF_RXQ_NUM];
182
183	struct dpmaif_bat_request	bat_req;
184	struct dpmaif_bat_request	bat_frag;
185	struct workqueue_struct		*bat_release_wq;
186	struct work_struct		bat_release_work;
187
188	wait_queue_head_t		tx_wq;
189	struct task_struct		*tx_thread;
190
191	struct dpmaif_callbacks		*callbacks;
192};
193
194struct dpmaif_ctrl *t7xx_dpmaif_hif_init(struct t7xx_pci_dev *t7xx_dev,
195					 struct dpmaif_callbacks *callbacks);
196void t7xx_dpmaif_hif_exit(struct dpmaif_ctrl *dpmaif_ctrl);
197int t7xx_dpmaif_md_state_callback(struct dpmaif_ctrl *dpmaif_ctrl, enum md_state state);
198unsigned int t7xx_ring_buf_get_next_wr_idx(unsigned int buf_len, unsigned int buf_idx);
199unsigned int t7xx_ring_buf_rd_wr_count(unsigned int total_cnt, unsigned int rd_idx,
200				       unsigned int wr_idx, enum dpmaif_rdwr);
201
202#endif /* __T7XX_HIF_DPMAIF_H__ */