1c9ff6c91SIgor Mitsyanko /* SPDX-License-Identifier: GPL-2.0+ */
2c9ff6c91SIgor Mitsyanko /* Copyright (c) 2018 Quantenna Communications, Inc. All rights reserved. */
3c9ff6c91SIgor Mitsyanko 
4c9ff6c91SIgor Mitsyanko #ifndef _QTN_FMAC_PCIE_H_
5c9ff6c91SIgor Mitsyanko #define _QTN_FMAC_PCIE_H_
6c9ff6c91SIgor Mitsyanko 
7c9ff6c91SIgor Mitsyanko #include <linux/pci.h>
8c9ff6c91SIgor Mitsyanko #include <linux/spinlock.h>
9c9ff6c91SIgor Mitsyanko #include <linux/io.h>
10c9ff6c91SIgor Mitsyanko #include <linux/skbuff.h>
11c9ff6c91SIgor Mitsyanko #include <linux/workqueue.h>
12c9ff6c91SIgor Mitsyanko #include <linux/interrupt.h>
13c9ff6c91SIgor Mitsyanko 
14c9ff6c91SIgor Mitsyanko #include "shm_ipc.h"
15addc7540SIgor Mitsyanko #include "bus.h"
16c9ff6c91SIgor Mitsyanko 
17c9ff6c91SIgor Mitsyanko #define SKB_BUF_SIZE		2048
18c9ff6c91SIgor Mitsyanko 
19c9ff6c91SIgor Mitsyanko #define QTN_FW_DL_TIMEOUT_MS	3000
20c9ff6c91SIgor Mitsyanko #define QTN_FW_QLINK_TIMEOUT_MS	30000
21c9ff6c91SIgor Mitsyanko #define QTN_EP_RESET_WAIT_MS	1000
22c9ff6c91SIgor Mitsyanko 
23c9ff6c91SIgor Mitsyanko struct qtnf_pcie_bus_priv {
24c9ff6c91SIgor Mitsyanko 	struct pci_dev *pdev;
25c9ff6c91SIgor Mitsyanko 
2697aef03cSSergey Matyukevich 	int (*probe_cb)(struct qtnf_bus *bus, unsigned int tx_bd_size,
2797aef03cSSergey Matyukevich 			unsigned int rx_bd_size);
28b7da53cdSIgor Mitsyanko 	void (*remove_cb)(struct qtnf_bus *bus);
29b7da53cdSIgor Mitsyanko 	int (*suspend_cb)(struct qtnf_bus *bus);
30b7da53cdSIgor Mitsyanko 	int (*resume_cb)(struct qtnf_bus *bus);
31b7da53cdSIgor Mitsyanko 	u64 (*dma_mask_get_cb)(void);
32b7da53cdSIgor Mitsyanko 
33c9ff6c91SIgor Mitsyanko 	spinlock_t tx_reclaim_lock;
34c9ff6c91SIgor Mitsyanko 	spinlock_t tx_lock;
35c9ff6c91SIgor Mitsyanko 
36c9ff6c91SIgor Mitsyanko 	struct workqueue_struct *workqueue;
37c9ff6c91SIgor Mitsyanko 	struct tasklet_struct reclaim_tq;
38c9ff6c91SIgor Mitsyanko 
39c9ff6c91SIgor Mitsyanko 	void __iomem *sysctl_bar;
40c9ff6c91SIgor Mitsyanko 	void __iomem *epmem_bar;
41c9ff6c91SIgor Mitsyanko 	void __iomem *dmareg_bar;
42c9ff6c91SIgor Mitsyanko 
43c9ff6c91SIgor Mitsyanko 	struct qtnf_shm_ipc shm_ipc_ep_in;
44c9ff6c91SIgor Mitsyanko 	struct qtnf_shm_ipc shm_ipc_ep_out;
45c9ff6c91SIgor Mitsyanko 
46c9ff6c91SIgor Mitsyanko 	u16 tx_bd_num;
47c9ff6c91SIgor Mitsyanko 	u16 rx_bd_num;
48c9ff6c91SIgor Mitsyanko 
49c9ff6c91SIgor Mitsyanko 	struct sk_buff **tx_skb;
50c9ff6c91SIgor Mitsyanko 	struct sk_buff **rx_skb;
51c9ff6c91SIgor Mitsyanko 
52b7da53cdSIgor Mitsyanko 	unsigned int fw_blksize;
53b7da53cdSIgor Mitsyanko 
54c9ff6c91SIgor Mitsyanko 	u32 rx_bd_w_index;
55c9ff6c91SIgor Mitsyanko 	u32 rx_bd_r_index;
56c9ff6c91SIgor Mitsyanko 
57c9ff6c91SIgor Mitsyanko 	u32 tx_bd_w_index;
58c9ff6c91SIgor Mitsyanko 	u32 tx_bd_r_index;
59c9ff6c91SIgor Mitsyanko 
60c9ff6c91SIgor Mitsyanko 	/* diagnostics stats */
61c9ff6c91SIgor Mitsyanko 	u32 pcie_irq_count;
62c9ff6c91SIgor Mitsyanko 	u32 tx_full_count;
63c9ff6c91SIgor Mitsyanko 	u32 tx_done_count;
64c9ff6c91SIgor Mitsyanko 	u32 tx_reclaim_done;
65c9ff6c91SIgor Mitsyanko 	u32 tx_reclaim_req;
66c9ff6c91SIgor Mitsyanko 
67c9ff6c91SIgor Mitsyanko 	u8 msi_enabled;
68c9ff6c91SIgor Mitsyanko 	u8 tx_stopped;
69b7da53cdSIgor Mitsyanko 	bool flashboot;
70c9ff6c91SIgor Mitsyanko };
71c9ff6c91SIgor Mitsyanko 
72addc7540SIgor Mitsyanko int qtnf_pcie_control_tx(struct qtnf_bus *bus, struct sk_buff *skb);
73addc7540SIgor Mitsyanko int qtnf_pcie_alloc_skb_array(struct qtnf_pcie_bus_priv *priv);
74ae1946beSSergey Matyukevich int qtnf_pcie_fw_boot_done(struct qtnf_bus *bus);
75addc7540SIgor Mitsyanko void qtnf_pcie_init_shm_ipc(struct qtnf_pcie_bus_priv *priv,
76addc7540SIgor Mitsyanko 			    struct qtnf_shm_ipc_region __iomem *ipc_tx_reg,
77addc7540SIgor Mitsyanko 			    struct qtnf_shm_ipc_region __iomem *ipc_rx_reg,
78addc7540SIgor Mitsyanko 			    const struct qtnf_shm_ipc_int *ipc_int);
79b7da53cdSIgor Mitsyanko struct qtnf_bus *qtnf_pcie_pearl_alloc(struct pci_dev *pdev);
80e401fa25SSergey Matyukevich struct qtnf_bus *qtnf_pcie_topaz_alloc(struct pci_dev *pdev);
81addc7540SIgor Mitsyanko 
qtnf_non_posted_write(u32 val,void __iomem * basereg)82c9ff6c91SIgor Mitsyanko static inline void qtnf_non_posted_write(u32 val, void __iomem *basereg)
83c9ff6c91SIgor Mitsyanko {
84c9ff6c91SIgor Mitsyanko 	writel(val, basereg);
85c9ff6c91SIgor Mitsyanko 
86c9ff6c91SIgor Mitsyanko 	/* flush posted write */
87c9ff6c91SIgor Mitsyanko 	readl(basereg);
88c9ff6c91SIgor Mitsyanko }
89c9ff6c91SIgor Mitsyanko 
90c9ff6c91SIgor Mitsyanko #endif /* _QTN_FMAC_PCIE_H_ */
91