1862cd659SVeerasenareddy Burru /* SPDX-License-Identifier: GPL-2.0 */
2862cd659SVeerasenareddy Burru /* Marvell Octeon EP (EndPoint) Ethernet Driver
3862cd659SVeerasenareddy Burru *
4862cd659SVeerasenareddy Burru * Copyright (C) 2020 Marvell.
5862cd659SVeerasenareddy Burru *
6862cd659SVeerasenareddy Burru */
7862cd659SVeerasenareddy Burru
8862cd659SVeerasenareddy Burru #ifndef _OCTEP_MAIN_H_
9862cd659SVeerasenareddy Burru #define _OCTEP_MAIN_H_
10862cd659SVeerasenareddy Burru
11862cd659SVeerasenareddy Burru #include "octep_tx.h"
12862cd659SVeerasenareddy Burru #include "octep_rx.h"
13862cd659SVeerasenareddy Burru #include "octep_ctrl_mbox.h"
14862cd659SVeerasenareddy Burru
15862cd659SVeerasenareddy Burru #define OCTEP_DRV_NAME "octeon_ep"
16862cd659SVeerasenareddy Burru #define OCTEP_DRV_STRING "Marvell Octeon EndPoint NIC Driver"
17862cd659SVeerasenareddy Burru
18862cd659SVeerasenareddy Burru #define OCTEP_PCIID_CN93_PF 0xB200177d
19862cd659SVeerasenareddy Burru #define OCTEP_PCIID_CN93_VF 0xB203177d
20862cd659SVeerasenareddy Burru
21862cd659SVeerasenareddy Burru #define OCTEP_PCI_DEVICE_ID_CN93_PF 0xB200
22862cd659SVeerasenareddy Burru #define OCTEP_PCI_DEVICE_ID_CN93_VF 0xB203
23862cd659SVeerasenareddy Burru
2463d9e129SVeerasenareddy Burru #define OCTEP_PCI_DEVICE_ID_CNF95N_PF 0xB400 //95N PF
2563d9e129SVeerasenareddy Burru
26862cd659SVeerasenareddy Burru #define OCTEP_MAX_QUEUES 63
27862cd659SVeerasenareddy Burru #define OCTEP_MAX_IQ OCTEP_MAX_QUEUES
28862cd659SVeerasenareddy Burru #define OCTEP_MAX_OQ OCTEP_MAX_QUEUES
29862cd659SVeerasenareddy Burru #define OCTEP_MAX_VF 64
30862cd659SVeerasenareddy Burru
31862cd659SVeerasenareddy Burru #define OCTEP_MAX_MSIX_VECTORS OCTEP_MAX_OQ
32862cd659SVeerasenareddy Burru
33862cd659SVeerasenareddy Burru /* Flags to disable and enable Interrupts */
34862cd659SVeerasenareddy Burru #define OCTEP_INPUT_INTR (1)
35862cd659SVeerasenareddy Burru #define OCTEP_OUTPUT_INTR (2)
36862cd659SVeerasenareddy Burru #define OCTEP_MBOX_INTR (4)
37862cd659SVeerasenareddy Burru #define OCTEP_ALL_INTR 0xff
38862cd659SVeerasenareddy Burru
39862cd659SVeerasenareddy Burru #define OCTEP_IQ_INTR_RESEND_BIT 59
40862cd659SVeerasenareddy Burru #define OCTEP_OQ_INTR_RESEND_BIT 59
41862cd659SVeerasenareddy Burru
42862cd659SVeerasenareddy Burru #define OCTEP_MMIO_REGIONS 3
43862cd659SVeerasenareddy Burru /* PCI address space mapping information.
44862cd659SVeerasenareddy Burru * Each of the 3 address spaces given by BAR0, BAR2 and BAR4 of
45862cd659SVeerasenareddy Burru * Octeon gets mapped to different physical address spaces in
46862cd659SVeerasenareddy Burru * the kernel.
47862cd659SVeerasenareddy Burru */
48862cd659SVeerasenareddy Burru struct octep_mmio {
49862cd659SVeerasenareddy Burru /* The physical address to which the PCI address space is mapped. */
50862cd659SVeerasenareddy Burru u8 __iomem *hw_addr;
51862cd659SVeerasenareddy Burru
52862cd659SVeerasenareddy Burru /* Flag indicating the mapping was successful. */
53862cd659SVeerasenareddy Burru int mapped;
54862cd659SVeerasenareddy Burru };
55862cd659SVeerasenareddy Burru
56862cd659SVeerasenareddy Burru struct octep_pci_win_regs {
57862cd659SVeerasenareddy Burru u8 __iomem *pci_win_wr_addr;
58862cd659SVeerasenareddy Burru u8 __iomem *pci_win_rd_addr;
59862cd659SVeerasenareddy Burru u8 __iomem *pci_win_wr_data;
60862cd659SVeerasenareddy Burru u8 __iomem *pci_win_rd_data;
61862cd659SVeerasenareddy Burru };
62862cd659SVeerasenareddy Burru
63862cd659SVeerasenareddy Burru struct octep_hw_ops {
64862cd659SVeerasenareddy Burru void (*setup_iq_regs)(struct octep_device *oct, int q);
65862cd659SVeerasenareddy Burru void (*setup_oq_regs)(struct octep_device *oct, int q);
66862cd659SVeerasenareddy Burru void (*setup_mbox_regs)(struct octep_device *oct, int mbox);
67862cd659SVeerasenareddy Burru
68862cd659SVeerasenareddy Burru irqreturn_t (*non_ioq_intr_handler)(void *ioq_vector);
69862cd659SVeerasenareddy Burru irqreturn_t (*ioq_intr_handler)(void *ioq_vector);
70862cd659SVeerasenareddy Burru int (*soft_reset)(struct octep_device *oct);
71862cd659SVeerasenareddy Burru void (*reinit_regs)(struct octep_device *oct);
72862cd659SVeerasenareddy Burru u32 (*update_iq_read_idx)(struct octep_iq *iq);
73862cd659SVeerasenareddy Burru
74862cd659SVeerasenareddy Burru void (*enable_interrupts)(struct octep_device *oct);
75862cd659SVeerasenareddy Burru void (*disable_interrupts)(struct octep_device *oct);
7624d43332SVeerasenareddy Burru bool (*poll_non_ioq_interrupts)(struct octep_device *oct);
77862cd659SVeerasenareddy Burru
78862cd659SVeerasenareddy Burru void (*enable_io_queues)(struct octep_device *oct);
79862cd659SVeerasenareddy Burru void (*disable_io_queues)(struct octep_device *oct);
80862cd659SVeerasenareddy Burru void (*enable_iq)(struct octep_device *oct, int q);
81862cd659SVeerasenareddy Burru void (*disable_iq)(struct octep_device *oct, int q);
82862cd659SVeerasenareddy Burru void (*enable_oq)(struct octep_device *oct, int q);
83862cd659SVeerasenareddy Burru void (*disable_oq)(struct octep_device *oct, int q);
84862cd659SVeerasenareddy Burru void (*reset_io_queues)(struct octep_device *oct);
85862cd659SVeerasenareddy Burru void (*dump_registers)(struct octep_device *oct);
86862cd659SVeerasenareddy Burru };
87862cd659SVeerasenareddy Burru
88862cd659SVeerasenareddy Burru /* Octeon mailbox data */
89862cd659SVeerasenareddy Burru struct octep_mbox_data {
90862cd659SVeerasenareddy Burru u32 cmd;
91862cd659SVeerasenareddy Burru u32 total_len;
92862cd659SVeerasenareddy Burru u32 recv_len;
93862cd659SVeerasenareddy Burru u32 rsvd;
94862cd659SVeerasenareddy Burru u64 *data;
95862cd659SVeerasenareddy Burru };
96862cd659SVeerasenareddy Burru
97862cd659SVeerasenareddy Burru /* Octeon device mailbox */
98862cd659SVeerasenareddy Burru struct octep_mbox {
99862cd659SVeerasenareddy Burru /* A spinlock to protect access to this q_mbox. */
100862cd659SVeerasenareddy Burru spinlock_t lock;
101862cd659SVeerasenareddy Burru
102862cd659SVeerasenareddy Burru u32 q_no;
103862cd659SVeerasenareddy Burru u32 state;
104862cd659SVeerasenareddy Burru
105862cd659SVeerasenareddy Burru /* SLI_MAC_PF_MBOX_INT for PF, SLI_PKT_MBOX_INT for VF. */
1061f2c2d0cSVeerasenareddy Burru u8 __iomem *mbox_int_reg;
107862cd659SVeerasenareddy Burru
108862cd659SVeerasenareddy Burru /* SLI_PKT_PF_VF_MBOX_SIG(0) for PF,
109862cd659SVeerasenareddy Burru * SLI_PKT_PF_VF_MBOX_SIG(1) for VF.
110862cd659SVeerasenareddy Burru */
1111f2c2d0cSVeerasenareddy Burru u8 __iomem *mbox_write_reg;
112862cd659SVeerasenareddy Burru
113862cd659SVeerasenareddy Burru /* SLI_PKT_PF_VF_MBOX_SIG(1) for PF,
114862cd659SVeerasenareddy Burru * SLI_PKT_PF_VF_MBOX_SIG(0) for VF.
115862cd659SVeerasenareddy Burru */
1161f2c2d0cSVeerasenareddy Burru u8 __iomem *mbox_read_reg;
117862cd659SVeerasenareddy Burru
118862cd659SVeerasenareddy Burru struct octep_mbox_data mbox_data;
119862cd659SVeerasenareddy Burru };
120862cd659SVeerasenareddy Burru
121862cd659SVeerasenareddy Burru /* Tx/Rx queue vector per interrupt. */
122862cd659SVeerasenareddy Burru struct octep_ioq_vector {
123862cd659SVeerasenareddy Burru char name[OCTEP_MSIX_NAME_SIZE];
124862cd659SVeerasenareddy Burru struct napi_struct napi;
125862cd659SVeerasenareddy Burru struct octep_device *octep_dev;
126862cd659SVeerasenareddy Burru struct octep_iq *iq;
127862cd659SVeerasenareddy Burru struct octep_oq *oq;
128862cd659SVeerasenareddy Burru cpumask_t affinity_mask;
129862cd659SVeerasenareddy Burru };
130862cd659SVeerasenareddy Burru
131862cd659SVeerasenareddy Burru /* Octeon hardware/firmware offload capability flags. */
132862cd659SVeerasenareddy Burru #define OCTEP_CAP_TX_CHECKSUM BIT(0)
133862cd659SVeerasenareddy Burru #define OCTEP_CAP_RX_CHECKSUM BIT(1)
134862cd659SVeerasenareddy Burru #define OCTEP_CAP_TSO BIT(2)
135862cd659SVeerasenareddy Burru
136862cd659SVeerasenareddy Burru /* Link modes */
137862cd659SVeerasenareddy Burru enum octep_link_mode_bit_indices {
138862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_10GBASE_T = 0,
139862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_10GBASE_R,
140862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_10GBASE_CR,
141862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_10GBASE_KR,
142862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_10GBASE_LR,
143862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_10GBASE_SR,
144862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_25GBASE_CR,
145862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_25GBASE_KR,
146862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_25GBASE_SR,
147862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_40GBASE_CR4,
148862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_40GBASE_KR4,
149862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_40GBASE_LR4,
150862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_40GBASE_SR4,
151862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_50GBASE_CR2,
152862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_50GBASE_KR2,
153862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_50GBASE_SR2,
154862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_50GBASE_CR,
155862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_50GBASE_KR,
156862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_50GBASE_LR,
157862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_50GBASE_SR,
158862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_100GBASE_CR4,
159862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_100GBASE_KR4,
160862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_100GBASE_LR4,
161862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_100GBASE_SR4,
162862cd659SVeerasenareddy Burru OCTEP_LINK_MODE_NBITS
163862cd659SVeerasenareddy Burru };
164862cd659SVeerasenareddy Burru
165862cd659SVeerasenareddy Burru /* Hardware interface link state information. */
166862cd659SVeerasenareddy Burru struct octep_iface_link_info {
167862cd659SVeerasenareddy Burru /* Bitmap of Supported link speeds/modes. */
168862cd659SVeerasenareddy Burru u64 supported_modes;
169862cd659SVeerasenareddy Burru
170862cd659SVeerasenareddy Burru /* Bitmap of Advertised link speeds/modes. */
171862cd659SVeerasenareddy Burru u64 advertised_modes;
172862cd659SVeerasenareddy Burru
173862cd659SVeerasenareddy Burru /* Negotiated link speed in Mbps. */
174862cd659SVeerasenareddy Burru u32 speed;
175862cd659SVeerasenareddy Burru
176862cd659SVeerasenareddy Burru /* MTU */
177862cd659SVeerasenareddy Burru u16 mtu;
178862cd659SVeerasenareddy Burru
179862cd659SVeerasenareddy Burru /* Autonegotation state. */
180862cd659SVeerasenareddy Burru #define OCTEP_LINK_MODE_AUTONEG_SUPPORTED BIT(0)
181862cd659SVeerasenareddy Burru #define OCTEP_LINK_MODE_AUTONEG_ADVERTISED BIT(1)
182862cd659SVeerasenareddy Burru u8 autoneg;
183862cd659SVeerasenareddy Burru
184862cd659SVeerasenareddy Burru /* Pause frames setting. */
185862cd659SVeerasenareddy Burru #define OCTEP_LINK_MODE_PAUSE_SUPPORTED BIT(0)
186862cd659SVeerasenareddy Burru #define OCTEP_LINK_MODE_PAUSE_ADVERTISED BIT(1)
187862cd659SVeerasenareddy Burru u8 pause;
188862cd659SVeerasenareddy Burru
189862cd659SVeerasenareddy Burru /* Admin state of the link (ifconfig <iface> up/down */
190862cd659SVeerasenareddy Burru u8 admin_up;
191862cd659SVeerasenareddy Burru
192862cd659SVeerasenareddy Burru /* Operational state of the link: physical link is up down */
193862cd659SVeerasenareddy Burru u8 oper_up;
194862cd659SVeerasenareddy Burru };
195862cd659SVeerasenareddy Burru
196862cd659SVeerasenareddy Burru /* The Octeon device specific private data structure.
197862cd659SVeerasenareddy Burru * Each Octeon device has this structure to represent all its components.
198862cd659SVeerasenareddy Burru */
199862cd659SVeerasenareddy Burru struct octep_device {
200862cd659SVeerasenareddy Burru struct octep_config *conf;
201862cd659SVeerasenareddy Burru
202862cd659SVeerasenareddy Burru /* Octeon Chip type. */
203862cd659SVeerasenareddy Burru u16 chip_id;
204862cd659SVeerasenareddy Burru u16 rev_id;
205862cd659SVeerasenareddy Burru
206862cd659SVeerasenareddy Burru /* Device capabilities enabled */
207862cd659SVeerasenareddy Burru u64 caps_enabled;
208862cd659SVeerasenareddy Burru /* Device capabilities supported */
209862cd659SVeerasenareddy Burru u64 caps_supported;
210862cd659SVeerasenareddy Burru
211862cd659SVeerasenareddy Burru /* Pointer to basic Linux device */
212862cd659SVeerasenareddy Burru struct device *dev;
213862cd659SVeerasenareddy Burru /* Linux PCI device pointer */
214862cd659SVeerasenareddy Burru struct pci_dev *pdev;
215862cd659SVeerasenareddy Burru /* Netdev corresponding to the Octeon device */
216862cd659SVeerasenareddy Burru struct net_device *netdev;
217862cd659SVeerasenareddy Burru
218862cd659SVeerasenareddy Burru /* memory mapped io range */
219862cd659SVeerasenareddy Burru struct octep_mmio mmio[OCTEP_MMIO_REGIONS];
220862cd659SVeerasenareddy Burru
221862cd659SVeerasenareddy Burru /* MAC address */
222862cd659SVeerasenareddy Burru u8 mac_addr[ETH_ALEN];
223862cd659SVeerasenareddy Burru
224862cd659SVeerasenareddy Burru /* Tx queues (IQ: Instruction Queue) */
225862cd659SVeerasenareddy Burru u16 num_iqs;
226862cd659SVeerasenareddy Burru /* pkind value to be used in every Tx hardware descriptor */
227862cd659SVeerasenareddy Burru u8 pkind;
228862cd659SVeerasenareddy Burru /* Pointers to Octeon Tx queues */
229862cd659SVeerasenareddy Burru struct octep_iq *iq[OCTEP_MAX_IQ];
230862cd659SVeerasenareddy Burru
231862cd659SVeerasenareddy Burru /* Rx queues (OQ: Output Queue) */
232862cd659SVeerasenareddy Burru u16 num_oqs;
233862cd659SVeerasenareddy Burru /* Pointers to Octeon Rx queues */
234862cd659SVeerasenareddy Burru struct octep_oq *oq[OCTEP_MAX_OQ];
235862cd659SVeerasenareddy Burru
236862cd659SVeerasenareddy Burru /* Hardware port number of the PCIe interface */
237862cd659SVeerasenareddy Burru u16 pcie_port;
238862cd659SVeerasenareddy Burru
239862cd659SVeerasenareddy Burru /* PCI Window registers to access some hardware CSRs */
240862cd659SVeerasenareddy Burru struct octep_pci_win_regs pci_win_regs;
241862cd659SVeerasenareddy Burru /* Hardware operations */
242862cd659SVeerasenareddy Burru struct octep_hw_ops hw_ops;
243862cd659SVeerasenareddy Burru
244862cd659SVeerasenareddy Burru /* IRQ info */
245862cd659SVeerasenareddy Burru u16 num_irqs;
246862cd659SVeerasenareddy Burru u16 num_non_ioq_irqs;
247862cd659SVeerasenareddy Burru char *non_ioq_irq_names;
248862cd659SVeerasenareddy Burru struct msix_entry *msix_entries;
249862cd659SVeerasenareddy Burru /* IOq information of it's corresponding MSI-X interrupt. */
250862cd659SVeerasenareddy Burru struct octep_ioq_vector *ioq_vector[OCTEP_MAX_QUEUES];
251862cd659SVeerasenareddy Burru
252862cd659SVeerasenareddy Burru /* Hardware Interface Tx statistics */
253862cd659SVeerasenareddy Burru struct octep_iface_tx_stats iface_tx_stats;
254862cd659SVeerasenareddy Burru /* Hardware Interface Rx statistics */
255862cd659SVeerasenareddy Burru struct octep_iface_rx_stats iface_rx_stats;
256862cd659SVeerasenareddy Burru
257862cd659SVeerasenareddy Burru /* Hardware Interface Link info like supported modes, aneg support */
258862cd659SVeerasenareddy Burru struct octep_iface_link_info link_info;
259862cd659SVeerasenareddy Burru
260862cd659SVeerasenareddy Burru /* Mailbox to talk to VFs */
261862cd659SVeerasenareddy Burru struct octep_mbox *mbox[OCTEP_MAX_VF];
262862cd659SVeerasenareddy Burru
263862cd659SVeerasenareddy Burru /* Work entry to handle Tx timeout */
264862cd659SVeerasenareddy Burru struct work_struct tx_timeout_task;
265862cd659SVeerasenareddy Burru
266862cd659SVeerasenareddy Burru /* control mbox over pf */
267862cd659SVeerasenareddy Burru struct octep_ctrl_mbox ctrl_mbox;
268862cd659SVeerasenareddy Burru
269862cd659SVeerasenareddy Burru /* offset for iface stats */
270862cd659SVeerasenareddy Burru u32 ctrl_mbox_ifstats_offset;
271862cd659SVeerasenareddy Burru
272862cd659SVeerasenareddy Burru /* Work entry to handle ctrl mbox interrupt */
273862cd659SVeerasenareddy Burru struct work_struct ctrl_mbox_task;
27424d43332SVeerasenareddy Burru /* Wait queue for host to firmware requests */
27524d43332SVeerasenareddy Burru wait_queue_head_t ctrl_req_wait_q;
27624d43332SVeerasenareddy Burru /* List of objects waiting for h2f response */
27724d43332SVeerasenareddy Burru struct list_head ctrl_req_wait_list;
278862cd659SVeerasenareddy Burru
27924d43332SVeerasenareddy Burru /* Enable non-ioq interrupt polling */
28024d43332SVeerasenareddy Burru bool poll_non_ioq_intr;
28124d43332SVeerasenareddy Burru /* Work entry to poll non-ioq interrupts */
28224d43332SVeerasenareddy Burru struct delayed_work intr_poll_task;
283*5cb96c29SVeerasenareddy Burru
284*5cb96c29SVeerasenareddy Burru /* Firmware heartbeat timer */
285*5cb96c29SVeerasenareddy Burru struct timer_list hb_timer;
286*5cb96c29SVeerasenareddy Burru /* Firmware heartbeat miss count tracked by timer */
287*5cb96c29SVeerasenareddy Burru atomic_t hb_miss_cnt;
288*5cb96c29SVeerasenareddy Burru /* Task to reset device on heartbeat miss */
289*5cb96c29SVeerasenareddy Burru struct delayed_work hb_task;
290862cd659SVeerasenareddy Burru };
291862cd659SVeerasenareddy Burru
OCTEP_MAJOR_REV(struct octep_device * oct)292862cd659SVeerasenareddy Burru static inline u16 OCTEP_MAJOR_REV(struct octep_device *oct)
293862cd659SVeerasenareddy Burru {
294862cd659SVeerasenareddy Burru u16 rev = (oct->rev_id & 0xC) >> 2;
295862cd659SVeerasenareddy Burru
296862cd659SVeerasenareddy Burru return (rev == 0) ? 1 : rev;
297862cd659SVeerasenareddy Burru }
298862cd659SVeerasenareddy Burru
OCTEP_MINOR_REV(struct octep_device * oct)299862cd659SVeerasenareddy Burru static inline u16 OCTEP_MINOR_REV(struct octep_device *oct)
300862cd659SVeerasenareddy Burru {
301862cd659SVeerasenareddy Burru return (oct->rev_id & 0x3);
302862cd659SVeerasenareddy Burru }
303862cd659SVeerasenareddy Burru
304862cd659SVeerasenareddy Burru /* Octeon CSR read/write access APIs */
305862cd659SVeerasenareddy Burru #define octep_write_csr(octep_dev, reg_off, value) \
3061f2c2d0cSVeerasenareddy Burru writel(value, (octep_dev)->mmio[0].hw_addr + (reg_off))
307862cd659SVeerasenareddy Burru
308862cd659SVeerasenareddy Burru #define octep_write_csr64(octep_dev, reg_off, val64) \
309862cd659SVeerasenareddy Burru writeq(val64, (octep_dev)->mmio[0].hw_addr + (reg_off))
310862cd659SVeerasenareddy Burru
311862cd659SVeerasenareddy Burru #define octep_read_csr(octep_dev, reg_off) \
3121f2c2d0cSVeerasenareddy Burru readl((octep_dev)->mmio[0].hw_addr + (reg_off))
313862cd659SVeerasenareddy Burru
314862cd659SVeerasenareddy Burru #define octep_read_csr64(octep_dev, reg_off) \
315862cd659SVeerasenareddy Burru readq((octep_dev)->mmio[0].hw_addr + (reg_off))
316862cd659SVeerasenareddy Burru
317862cd659SVeerasenareddy Burru /* Read windowed register.
318862cd659SVeerasenareddy Burru * @param oct - pointer to the Octeon device.
319862cd659SVeerasenareddy Burru * @param addr - Address of the register to read.
320862cd659SVeerasenareddy Burru *
321862cd659SVeerasenareddy Burru * This routine is called to read from the indirectly accessed
322862cd659SVeerasenareddy Burru * Octeon registers that are visible through a PCI BAR0 mapped window
323862cd659SVeerasenareddy Burru * register.
324862cd659SVeerasenareddy Burru * @return - 64 bit value read from the register.
325862cd659SVeerasenareddy Burru */
326862cd659SVeerasenareddy Burru static inline u64
OCTEP_PCI_WIN_READ(struct octep_device * oct,u64 addr)327862cd659SVeerasenareddy Burru OCTEP_PCI_WIN_READ(struct octep_device *oct, u64 addr)
328862cd659SVeerasenareddy Burru {
329862cd659SVeerasenareddy Burru u64 val64;
330862cd659SVeerasenareddy Burru
331862cd659SVeerasenareddy Burru addr |= 1ull << 53; /* read 8 bytes */
332862cd659SVeerasenareddy Burru writeq(addr, oct->pci_win_regs.pci_win_rd_addr);
333862cd659SVeerasenareddy Burru val64 = readq(oct->pci_win_regs.pci_win_rd_data);
334862cd659SVeerasenareddy Burru
335862cd659SVeerasenareddy Burru dev_dbg(&oct->pdev->dev,
336862cd659SVeerasenareddy Burru "%s: reg: 0x%016llx val: 0x%016llx\n", __func__, addr, val64);
337862cd659SVeerasenareddy Burru
338862cd659SVeerasenareddy Burru return val64;
339862cd659SVeerasenareddy Burru }
340862cd659SVeerasenareddy Burru
341862cd659SVeerasenareddy Burru /* Write windowed register.
342862cd659SVeerasenareddy Burru * @param oct - pointer to the Octeon device.
343862cd659SVeerasenareddy Burru * @param addr - Address of the register to write
344862cd659SVeerasenareddy Burru * @param val - Value to write
345862cd659SVeerasenareddy Burru *
346862cd659SVeerasenareddy Burru * This routine is called to write to the indirectly accessed
347862cd659SVeerasenareddy Burru * Octeon registers that are visible through a PCI BAR0 mapped window
348862cd659SVeerasenareddy Burru * register.
349862cd659SVeerasenareddy Burru * @return Nothing.
350862cd659SVeerasenareddy Burru */
351862cd659SVeerasenareddy Burru static inline void
OCTEP_PCI_WIN_WRITE(struct octep_device * oct,u64 addr,u64 val)352862cd659SVeerasenareddy Burru OCTEP_PCI_WIN_WRITE(struct octep_device *oct, u64 addr, u64 val)
353862cd659SVeerasenareddy Burru {
354862cd659SVeerasenareddy Burru writeq(addr, oct->pci_win_regs.pci_win_wr_addr);
355862cd659SVeerasenareddy Burru writeq(val, oct->pci_win_regs.pci_win_wr_data);
356862cd659SVeerasenareddy Burru
357862cd659SVeerasenareddy Burru dev_dbg(&oct->pdev->dev,
358862cd659SVeerasenareddy Burru "%s: reg: 0x%016llx val: 0x%016llx\n", __func__, addr, val);
359862cd659SVeerasenareddy Burru }
360862cd659SVeerasenareddy Burru
3611f2c2d0cSVeerasenareddy Burru extern struct workqueue_struct *octep_wq;
3621f2c2d0cSVeerasenareddy Burru
363862cd659SVeerasenareddy Burru int octep_device_setup(struct octep_device *oct);
364862cd659SVeerasenareddy Burru int octep_setup_iqs(struct octep_device *oct);
365862cd659SVeerasenareddy Burru void octep_free_iqs(struct octep_device *oct);
366862cd659SVeerasenareddy Burru void octep_clean_iqs(struct octep_device *oct);
367862cd659SVeerasenareddy Burru int octep_setup_oqs(struct octep_device *oct);
368862cd659SVeerasenareddy Burru void octep_free_oqs(struct octep_device *oct);
369862cd659SVeerasenareddy Burru void octep_oq_dbell_init(struct octep_device *oct);
370862cd659SVeerasenareddy Burru void octep_device_setup_cn93_pf(struct octep_device *oct);
371862cd659SVeerasenareddy Burru int octep_iq_process_completions(struct octep_iq *iq, u16 budget);
372862cd659SVeerasenareddy Burru int octep_oq_process_rx(struct octep_oq *oq, int budget);
373862cd659SVeerasenareddy Burru void octep_set_ethtool_ops(struct net_device *netdev);
374862cd659SVeerasenareddy Burru
375862cd659SVeerasenareddy Burru #endif /* _OCTEP_MAIN_H_ */
376