xref: /freebsd/sys/dev/liquidio/base/lio_device.h (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
1f173c2b7SSean Bruno /*
2f173c2b7SSean Bruno  *   BSD LICENSE
3f173c2b7SSean Bruno  *
4f173c2b7SSean Bruno  *   Copyright(c) 2017 Cavium, Inc.. All rights reserved.
5f173c2b7SSean Bruno  *   All rights reserved.
6f173c2b7SSean Bruno  *
7f173c2b7SSean Bruno  *   Redistribution and use in source and binary forms, with or without
8f173c2b7SSean Bruno  *   modification, are permitted provided that the following conditions
9f173c2b7SSean Bruno  *   are met:
10f173c2b7SSean Bruno  *
11f173c2b7SSean Bruno  *     * Redistributions of source code must retain the above copyright
12f173c2b7SSean Bruno  *       notice, this list of conditions and the following disclaimer.
13f173c2b7SSean Bruno  *     * Redistributions in binary form must reproduce the above copyright
14f173c2b7SSean Bruno  *       notice, this list of conditions and the following disclaimer in
15f173c2b7SSean Bruno  *       the documentation and/or other materials provided with the
16f173c2b7SSean Bruno  *       distribution.
17f173c2b7SSean Bruno  *     * Neither the name of Cavium, Inc. nor the names of its
18f173c2b7SSean Bruno  *       contributors may be used to endorse or promote products derived
19f173c2b7SSean Bruno  *       from this software without specific prior written permission.
20f173c2b7SSean Bruno  *
21f173c2b7SSean Bruno  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22f173c2b7SSean Bruno  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23f173c2b7SSean Bruno  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24f173c2b7SSean Bruno  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25f173c2b7SSean Bruno  *   OWNER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26f173c2b7SSean Bruno  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27f173c2b7SSean Bruno  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28f173c2b7SSean Bruno  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29f173c2b7SSean Bruno  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30f173c2b7SSean Bruno  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31f173c2b7SSean Bruno  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32f173c2b7SSean Bruno  */
33f173c2b7SSean Bruno 
34f173c2b7SSean Bruno /*
35f173c2b7SSean Bruno  *  \brief Host Driver: This file defines the octeon device structure.
36f173c2b7SSean Bruno  */
37f173c2b7SSean Bruno 
38f173c2b7SSean Bruno #ifndef _LIO_DEVICE_H_
39f173c2b7SSean Bruno #define _LIO_DEVICE_H_
40f173c2b7SSean Bruno 
41f173c2b7SSean Bruno #include <sys/endian.h>	/* for BYTE_ORDER */
42f173c2b7SSean Bruno 
43f173c2b7SSean Bruno /* PCI VendorId Device Id */
44f173c2b7SSean Bruno #define LIO_CN23XX_PF_PCIID	0x9702177d
45f173c2b7SSean Bruno /*
46f173c2b7SSean Bruno  *  Driver identifies chips by these Ids, created by clubbing together
47f173c2b7SSean Bruno  *  DeviceId+RevisionId; Where Revision Id is not used to distinguish
48f173c2b7SSean Bruno  *  between chips, a value of 0 is used for revision id.
49f173c2b7SSean Bruno  */
50f173c2b7SSean Bruno #define LIO_CN23XX_PF_VID		0x9702
51f173c2b7SSean Bruno #define LIO_CN2350_10G_SUBDEVICE	0x03
52f173c2b7SSean Bruno #define LIO_CN2350_10G_SUBDEVICE1	0x04
53f173c2b7SSean Bruno #define LIO_CN2360_10G_SUBDEVICE	0x05
54f173c2b7SSean Bruno #define LIO_CN2350_25G_SUBDEVICE	0x07
55f173c2b7SSean Bruno #define LIO_CN2360_25G_SUBDEVICE	0x06
56f173c2b7SSean Bruno 
57f173c2b7SSean Bruno 
58f173c2b7SSean Bruno /* Endian-swap modes supported by Octeon. */
59f173c2b7SSean Bruno enum lio_pci_swap_mode {
60f173c2b7SSean Bruno 	LIO_PCI_PASSTHROUGH	= 0,
61f173c2b7SSean Bruno 	LIO_PCI_SWAP_64BIT	= 1,
62f173c2b7SSean Bruno 	LIO_PCI_SWAP_32BIT	= 2,
63f173c2b7SSean Bruno 	LIO_PCI_LW_SWAP_32BIT	= 3
64f173c2b7SSean Bruno };
65f173c2b7SSean Bruno 
66f173c2b7SSean Bruno enum {
67f173c2b7SSean Bruno 	LIO_CFG_TYPE_DEFAULT	= 0,
68f173c2b7SSean Bruno 	LIO_NUM_CFGS,
69f173c2b7SSean Bruno };
70f173c2b7SSean Bruno 
71f173c2b7SSean Bruno #define OCTEON_OUTPUT_INTR	(2)
72f173c2b7SSean Bruno #define OCTEON_ALL_INTR		0xff
73f173c2b7SSean Bruno 
74f173c2b7SSean Bruno /*---------------   PCI BAR1 index registers -------------*/
75f173c2b7SSean Bruno 
76f173c2b7SSean Bruno /* BAR1 Mask */
77f173c2b7SSean Bruno #define LIO_PCI_BAR1_ENABLE_CA		1
78f173c2b7SSean Bruno #define LIO_PCI_BAR1_ENDIAN_MODE	LIO_PCI_SWAP_64BIT
79f173c2b7SSean Bruno #define LIO_PCI_BAR1_ENTRY_VALID	1
80f173c2b7SSean Bruno #define LIO_PCI_BAR1_MASK		((LIO_PCI_BAR1_ENABLE_CA << 3) |   \
81f173c2b7SSean Bruno 					 (LIO_PCI_BAR1_ENDIAN_MODE << 1) | \
82f173c2b7SSean Bruno 					 LIO_PCI_BAR1_ENTRY_VALID)
83f173c2b7SSean Bruno 
84f173c2b7SSean Bruno /*
85f173c2b7SSean Bruno  *  Octeon Device state.
86f173c2b7SSean Bruno  *  Each octeon device goes through each of these states
87f173c2b7SSean Bruno  *  as it is initialized.
88f173c2b7SSean Bruno  */
89f173c2b7SSean Bruno #define LIO_DEV_BEGIN_STATE		0x0
90f173c2b7SSean Bruno #define LIO_DEV_PCI_ENABLE_DONE		0x1
91f173c2b7SSean Bruno #define LIO_DEV_PCI_MAP_DONE		0x2
92f173c2b7SSean Bruno #define LIO_DEV_DISPATCH_INIT_DONE	0x3
93f173c2b7SSean Bruno #define LIO_DEV_INSTR_QUEUE_INIT_DONE	0x4
94f173c2b7SSean Bruno #define LIO_DEV_SC_BUFF_POOL_INIT_DONE	0x5
95f173c2b7SSean Bruno #define LIO_DEV_MSIX_ALLOC_VECTOR_DONE	0x6
96f173c2b7SSean Bruno #define LIO_DEV_RESP_LIST_INIT_DONE	0x7
97f173c2b7SSean Bruno #define LIO_DEV_DROQ_INIT_DONE		0x8
98f173c2b7SSean Bruno #define LIO_DEV_INTR_SET_DONE		0xa
99f173c2b7SSean Bruno #define LIO_DEV_IO_QUEUES_DONE		0xb
100f173c2b7SSean Bruno #define LIO_DEV_CONSOLE_INIT_DONE	0xc
101f173c2b7SSean Bruno #define LIO_DEV_HOST_OK			0xd
102f173c2b7SSean Bruno #define LIO_DEV_CORE_OK			0xe
103f173c2b7SSean Bruno #define LIO_DEV_RUNNING			0xf
104f173c2b7SSean Bruno #define LIO_DEV_IN_RESET		0x10
105f173c2b7SSean Bruno #define LIO_DEV_STATE_INVALID		0x11
106f173c2b7SSean Bruno 
107f173c2b7SSean Bruno #define LIO_DEV_STATES			LIO_DEV_STATE_INVALID
108f173c2b7SSean Bruno 
109f173c2b7SSean Bruno /*
110f173c2b7SSean Bruno  * Octeon Device interrupts
111f173c2b7SSean Bruno  * These interrupt bits are set in int_status filed of
112f173c2b7SSean Bruno  * octeon_device structure
113f173c2b7SSean Bruno  */
114f173c2b7SSean Bruno #define LIO_DEV_INTR_DMA0_FORCE	0x01
115f173c2b7SSean Bruno #define LIO_DEV_INTR_DMA1_FORCE	0x02
116f173c2b7SSean Bruno #define LIO_DEV_INTR_PKT_DATA	0x04
117f173c2b7SSean Bruno 
118f173c2b7SSean Bruno #define LIO_RESET_MSECS		(3000)
119f173c2b7SSean Bruno 
120f173c2b7SSean Bruno /*---------------------------DISPATCH LIST-------------------------------*/
121f173c2b7SSean Bruno 
122f173c2b7SSean Bruno /*
123f173c2b7SSean Bruno  *  The dispatch list entry.
124f173c2b7SSean Bruno  *  The driver keeps a record of functions registered for each
125f173c2b7SSean Bruno  *  response header opcode in this structure. Since the opcode is
126f173c2b7SSean Bruno  *  hashed to index into the driver's list, more than one opcode
127f173c2b7SSean Bruno  *  can hash to the same entry, in which case the list field points
128f173c2b7SSean Bruno  *  to a linked list with the other entries.
129f173c2b7SSean Bruno  */
130f173c2b7SSean Bruno struct lio_dispatch {
131f173c2b7SSean Bruno 	/* Singly-linked tail queue node for this entry */
132f173c2b7SSean Bruno 	struct lio_stailq_node	node;
133f173c2b7SSean Bruno 
134f173c2b7SSean Bruno 	/* Singly-linked tail queue head for this entry */
135f173c2b7SSean Bruno 	struct lio_stailq_head	head;
136f173c2b7SSean Bruno 
137f173c2b7SSean Bruno 	/* The opcode for which the dispatch function & arg should be used */
138f173c2b7SSean Bruno 	uint16_t		opcode;
139f173c2b7SSean Bruno 
140f173c2b7SSean Bruno 	/* The function to be called for a packet received by the driver */
141f173c2b7SSean Bruno 	lio_dispatch_fn_t	dispatch_fn;
142f173c2b7SSean Bruno 
143f173c2b7SSean Bruno 	/*
144f173c2b7SSean Bruno 	 * The application specified argument to be passed to the above
145f173c2b7SSean Bruno 	 * function along with the received packet
146f173c2b7SSean Bruno 	 */
147f173c2b7SSean Bruno 	void			*arg;
148f173c2b7SSean Bruno };
149f173c2b7SSean Bruno 
150f173c2b7SSean Bruno /* The dispatch list structure. */
151f173c2b7SSean Bruno struct lio_dispatch_list {
152f173c2b7SSean Bruno 	/* access to dispatch list must be atomic */
153f173c2b7SSean Bruno 	struct mtx		lock;
154f173c2b7SSean Bruno 
155f173c2b7SSean Bruno 	/* Count of dispatch functions currently registered */
156f173c2b7SSean Bruno 	uint32_t		count;
157f173c2b7SSean Bruno 
158f173c2b7SSean Bruno 	/* The list of dispatch functions */
159f173c2b7SSean Bruno 	struct lio_dispatch	*dlist;
160f173c2b7SSean Bruno };
161f173c2b7SSean Bruno 
162f173c2b7SSean Bruno /*-----------------------  THE OCTEON DEVICE  ---------------------------*/
163f173c2b7SSean Bruno 
164f173c2b7SSean Bruno #define LIO_MEM_REGIONS		3
165f173c2b7SSean Bruno /*
166f173c2b7SSean Bruno  *  PCI address space information.
167f173c2b7SSean Bruno  *  Each of the 3 address spaces given by BAR0, BAR2 and BAR4 of
168f173c2b7SSean Bruno  *  Octeon gets mapped to different physical address spaces in
169f173c2b7SSean Bruno  *  the kernel.
170f173c2b7SSean Bruno  */
171f173c2b7SSean Bruno struct lio_mem_bus_space {
172f173c2b7SSean Bruno 	struct resource		*pci_mem;
173f173c2b7SSean Bruno 	bus_space_tag_t		tag;
174f173c2b7SSean Bruno 	bus_space_handle_t	handle;
175f173c2b7SSean Bruno };
176f173c2b7SSean Bruno 
177f173c2b7SSean Bruno #define LIO_MAX_MAPS	32
178f173c2b7SSean Bruno 
179f173c2b7SSean Bruno struct lio_io_enable {
180f173c2b7SSean Bruno 	uint64_t	iq;
181f173c2b7SSean Bruno 	uint64_t	oq;
182f173c2b7SSean Bruno 	uint64_t	iq64B;
183f173c2b7SSean Bruno };
184f173c2b7SSean Bruno 
185f173c2b7SSean Bruno struct lio_reg_list {
186f173c2b7SSean Bruno 	uint32_t	pci_win_wr_addr;
187f173c2b7SSean Bruno 
188f173c2b7SSean Bruno 	uint32_t	pci_win_rd_addr_hi;
189f173c2b7SSean Bruno 	uint32_t	pci_win_rd_addr_lo;
190f173c2b7SSean Bruno 	uint32_t	pci_win_rd_addr;
191f173c2b7SSean Bruno 
192f173c2b7SSean Bruno 	uint32_t	pci_win_wr_data_hi;
193f173c2b7SSean Bruno 	uint32_t	pci_win_wr_data_lo;
194f173c2b7SSean Bruno 	uint32_t	pci_win_wr_data;
195f173c2b7SSean Bruno 
196f173c2b7SSean Bruno 	uint32_t	pci_win_rd_data;
197f173c2b7SSean Bruno };
198f173c2b7SSean Bruno 
199f173c2b7SSean Bruno #define LIO_MAX_CONSOLE_READ_BYTES	512
200f173c2b7SSean Bruno 
201f173c2b7SSean Bruno typedef int (*octeon_console_print_fn)(struct octeon_device *oct,
202f173c2b7SSean Bruno 				       uint32_t num, char *pre, char *suf);
203f173c2b7SSean Bruno struct lio_console {
204f173c2b7SSean Bruno 	uint32_t	active;
205f173c2b7SSean Bruno 	uint32_t	waiting;
206f173c2b7SSean Bruno 	uint64_t	addr;
207f173c2b7SSean Bruno 	uint32_t	buffer_size;
208f173c2b7SSean Bruno 	uint64_t	input_base_addr;
209f173c2b7SSean Bruno 	uint64_t	output_base_addr;
210f173c2b7SSean Bruno 	octeon_console_print_fn	print;
211f173c2b7SSean Bruno 	char		leftover[LIO_MAX_CONSOLE_READ_BYTES];
212f173c2b7SSean Bruno };
213f173c2b7SSean Bruno 
214f173c2b7SSean Bruno struct lio_board_info {
215f173c2b7SSean Bruno 	char		name[LIO_BOARD_NAME];
216f173c2b7SSean Bruno 	char		serial_number[LIO_SERIAL_NUM_LEN];
217f173c2b7SSean Bruno 	uint64_t	major;
218f173c2b7SSean Bruno 	uint64_t	minor;
219f173c2b7SSean Bruno };
220f173c2b7SSean Bruno 
221f173c2b7SSean Bruno struct lio_fn_list {
222f173c2b7SSean Bruno 	void		(*setup_iq_regs) (struct octeon_device *, uint32_t);
223f173c2b7SSean Bruno 	void		(*setup_oq_regs) (struct octeon_device *, uint32_t);
224f173c2b7SSean Bruno 
225f173c2b7SSean Bruno 	void		(*process_interrupt_regs) (void *);
226f173c2b7SSean Bruno 	uint64_t	(*msix_interrupt_handler) (void *);
227f173c2b7SSean Bruno 	int		(*soft_reset) (struct octeon_device *);
228f173c2b7SSean Bruno 	int		(*setup_device_regs) (struct octeon_device *);
229f173c2b7SSean Bruno 	void		(*bar1_idx_setup) (struct octeon_device *, uint64_t,
230f173c2b7SSean Bruno 					   uint32_t, int);
231f173c2b7SSean Bruno 	void		(*bar1_idx_write) (struct octeon_device *, uint32_t,
232f173c2b7SSean Bruno 					   uint32_t);
233f173c2b7SSean Bruno 	uint32_t	(*bar1_idx_read) (struct octeon_device *, uint32_t);
234f173c2b7SSean Bruno 	uint32_t	(*update_iq_read_idx) (struct lio_instr_queue *);
235f173c2b7SSean Bruno 
236f173c2b7SSean Bruno 	void		(*enable_interrupt) (struct octeon_device *, uint8_t);
237f173c2b7SSean Bruno 	void		(*disable_interrupt) (struct octeon_device *, uint8_t);
238f173c2b7SSean Bruno 
239f173c2b7SSean Bruno 	int		(*enable_io_queues) (struct octeon_device *);
240f173c2b7SSean Bruno 	void		(*disable_io_queues) (struct octeon_device *);
241f173c2b7SSean Bruno };
242f173c2b7SSean Bruno 
243f173c2b7SSean Bruno /* Must be multiple of 8, changing breaks ABI */
244f173c2b7SSean Bruno #define LIO_BOOTMEM_NAME_LEN	128
245f173c2b7SSean Bruno 
246f173c2b7SSean Bruno /*
247f173c2b7SSean Bruno  * Structure for named memory blocks
248f173c2b7SSean Bruno  * Number of descriptors
249f173c2b7SSean Bruno  * available can be changed without affecting compatibility,
250f173c2b7SSean Bruno  * but name length changes require a bump in the bootmem
251f173c2b7SSean Bruno  * descriptor version
252f173c2b7SSean Bruno  * Note: This structure must be naturally 64 bit aligned, as a single
253f173c2b7SSean Bruno  * memory image will be used by both 32 and 64 bit programs.
254f173c2b7SSean Bruno  */
255f173c2b7SSean Bruno struct cvmx_bootmem_named_block_desc {
256f173c2b7SSean Bruno 	/* Base address of named block */
257f173c2b7SSean Bruno 	uint64_t	base_addr;
258f173c2b7SSean Bruno 
259f173c2b7SSean Bruno 	/* Size actually allocated for named block */
260f173c2b7SSean Bruno 	uint64_t	size;
261f173c2b7SSean Bruno 
262f173c2b7SSean Bruno 	/* name of named block */
263f173c2b7SSean Bruno 	char		name[LIO_BOOTMEM_NAME_LEN];
264f173c2b7SSean Bruno };
265f173c2b7SSean Bruno 
266f173c2b7SSean Bruno struct lio_fw_info {
267f173c2b7SSean Bruno 	uint32_t	max_nic_ports;		/* max nic ports for the device */
268f173c2b7SSean Bruno 	uint32_t	num_gmx_ports;		/* num gmx ports */
269f173c2b7SSean Bruno 	uint64_t	app_cap_flags;		/* firmware cap flags */
270f173c2b7SSean Bruno 
271f173c2b7SSean Bruno 	/*
272f173c2b7SSean Bruno 	 * The core application is running in this mode.
273f173c2b7SSean Bruno 	 * See octeon-drv-opcodes.h for values.
274f173c2b7SSean Bruno 	 */
275f173c2b7SSean Bruno 	uint32_t	app_mode;
276f173c2b7SSean Bruno 	char		lio_firmware_version[32];
277f173c2b7SSean Bruno };
278f173c2b7SSean Bruno 
279f173c2b7SSean Bruno struct lio_callout {
280f173c2b7SSean Bruno 	struct callout	timer;
281f173c2b7SSean Bruno 	void		*ctxptr;
282f173c2b7SSean Bruno 	uint64_t	ctxul;
283f173c2b7SSean Bruno };
284f173c2b7SSean Bruno 
285f173c2b7SSean Bruno #define LIO_NIC_STARTER_TIMEOUT	30000	/* 30000ms (30s) */
286f173c2b7SSean Bruno 
287f173c2b7SSean Bruno struct lio_tq {
288f173c2b7SSean Bruno 	struct taskqueue	*tq;
289f173c2b7SSean Bruno 	struct timeout_task	work;
290f173c2b7SSean Bruno 	void			*ctxptr;
291f173c2b7SSean Bruno 	uint64_t		ctxul;
292f173c2b7SSean Bruno };
293f173c2b7SSean Bruno 
294f173c2b7SSean Bruno struct lio_if_props {
295f173c2b7SSean Bruno 	/*
296f173c2b7SSean Bruno 	 * Each interface in the Octeon device has a network
297f173c2b7SSean Bruno 	 * device pointer (used for OS specific calls).
298f173c2b7SSean Bruno 	 */
299f173c2b7SSean Bruno 	int		rx_on;
300f173c2b7SSean Bruno 	int		gmxport;
301f173c2b7SSean Bruno 	struct ifnet	*ifp;
302f173c2b7SSean Bruno };
303f173c2b7SSean Bruno 
304f173c2b7SSean Bruno #define LIO_MSIX_PO_INT		0x1
305f173c2b7SSean Bruno #define LIO_MSIX_PI_INT		0x2
306f173c2b7SSean Bruno 
307f173c2b7SSean Bruno struct lio_pf_vf_hs_word {
308f173c2b7SSean Bruno #if BYTE_ORDER == LITTLE_ENDIAN
309f173c2b7SSean Bruno 	/* PKIND value assigned for the DPI interface */
310f173c2b7SSean Bruno 	uint64_t pkind:8;
311f173c2b7SSean Bruno 
312f173c2b7SSean Bruno 	/* OCTEON core clock multiplier   */
313f173c2b7SSean Bruno 	uint64_t core_tics_per_us:16;
314f173c2b7SSean Bruno 
315f173c2b7SSean Bruno 	/* OCTEON coprocessor clock multiplier  */
316f173c2b7SSean Bruno 	uint64_t coproc_tics_per_us:16;
317f173c2b7SSean Bruno 
318f173c2b7SSean Bruno 	/* app that currently running on OCTEON  */
319f173c2b7SSean Bruno 	uint64_t app_mode:8;
320f173c2b7SSean Bruno 
321f173c2b7SSean Bruno 	/* RESERVED */
322f173c2b7SSean Bruno 	uint64_t reserved:16;
323f173c2b7SSean Bruno 
324f173c2b7SSean Bruno #else					/* BYTE_ORDER != LITTLE_ENDIAN */
325f173c2b7SSean Bruno 
326f173c2b7SSean Bruno 	/* RESERVED */
327f173c2b7SSean Bruno 	uint64_t reserved:16;
328f173c2b7SSean Bruno 
329f173c2b7SSean Bruno 	/* app that currently running on OCTEON  */
330f173c2b7SSean Bruno 	uint64_t app_mode:8;
331f173c2b7SSean Bruno 
332f173c2b7SSean Bruno 	/* OCTEON coprocessor clock multiplier  */
333f173c2b7SSean Bruno 	uint64_t coproc_tics_per_us:16;
334f173c2b7SSean Bruno 
335f173c2b7SSean Bruno 	/* OCTEON core clock multiplier   */
336f173c2b7SSean Bruno 	uint64_t core_tics_per_us:16;
337f173c2b7SSean Bruno 
338f173c2b7SSean Bruno 	/* PKIND value assigned for the DPI interface */
339f173c2b7SSean Bruno 	uint64_t pkind:8;
340f173c2b7SSean Bruno #endif	/* BYTE_ORDER == LITTLE_ENDIAN */
341f173c2b7SSean Bruno };
342f173c2b7SSean Bruno 
343f173c2b7SSean Bruno struct lio_sriov_info {
344f173c2b7SSean Bruno 
345f173c2b7SSean Bruno 	/* Actual rings left for PF device */
346f173c2b7SSean Bruno 	uint32_t	num_pf_rings;
347f173c2b7SSean Bruno 
348f173c2b7SSean Bruno 	/* SRN of PF usable IO queues */
349f173c2b7SSean Bruno 	uint32_t	pf_srn;
350f173c2b7SSean Bruno 
351f173c2b7SSean Bruno 	/* total pf rings */
352f173c2b7SSean Bruno 	uint32_t	trs;
353f173c2b7SSean Bruno };
354f173c2b7SSean Bruno 
355f173c2b7SSean Bruno struct lio_ioq_vector {
356f173c2b7SSean Bruno 	struct octeon_device	*oct_dev;
357f173c2b7SSean Bruno 	struct resource		*msix_res;
358f173c2b7SSean Bruno 	void			*tag;
359f173c2b7SSean Bruno 	int			droq_index;
360f173c2b7SSean Bruno 	int			vector;
361f173c2b7SSean Bruno 	cpuset_t		affinity_mask;
362f173c2b7SSean Bruno 	uint32_t		ioq_num;
363f173c2b7SSean Bruno };
364f173c2b7SSean Bruno 
365f173c2b7SSean Bruno /*
366f173c2b7SSean Bruno  *  The Octeon device.
367f173c2b7SSean Bruno  *  Each Octeon device has this structure to represent all its
368f173c2b7SSean Bruno  *  components.
369f173c2b7SSean Bruno  */
370f173c2b7SSean Bruno struct octeon_device {
371f173c2b7SSean Bruno 	/* Lock for PCI window configuration accesses */
372f173c2b7SSean Bruno 	struct mtx	pci_win_lock;
373f173c2b7SSean Bruno 
374f173c2b7SSean Bruno 	/* Lock for memory accesses */
375f173c2b7SSean Bruno 	struct mtx	mem_access_lock;
376f173c2b7SSean Bruno 
377f173c2b7SSean Bruno 	/* PCI device pointer */
378f173c2b7SSean Bruno 	device_t	device;
379f173c2b7SSean Bruno 
380f173c2b7SSean Bruno 	/* Chip specific information. */
381f173c2b7SSean Bruno 	void		*chip;
382f173c2b7SSean Bruno 
383f173c2b7SSean Bruno 	/* Number of interfaces detected in this octeon device. */
384f173c2b7SSean Bruno 	uint32_t	ifcount;
385f173c2b7SSean Bruno 
386f173c2b7SSean Bruno 	struct lio_if_props props;
387f173c2b7SSean Bruno 
388f173c2b7SSean Bruno 	/* Octeon Chip type. */
389f173c2b7SSean Bruno 	uint16_t	chip_id;
390f173c2b7SSean Bruno 
391f173c2b7SSean Bruno 	uint16_t	rev_id;
392f173c2b7SSean Bruno 
393f173c2b7SSean Bruno 	uint16_t	subdevice_id;
394f173c2b7SSean Bruno 
395f173c2b7SSean Bruno 	uint16_t	pf_num;
396f173c2b7SSean Bruno 
397f173c2b7SSean Bruno 
398f173c2b7SSean Bruno 	/* This device's id - set by the driver. */
399f173c2b7SSean Bruno 	uint32_t	octeon_id;
400f173c2b7SSean Bruno 
401f173c2b7SSean Bruno 	/* This device's PCIe port used for traffic. */
402f173c2b7SSean Bruno 	uint16_t	pcie_port;
403f173c2b7SSean Bruno 
404f173c2b7SSean Bruno 	uint16_t	flags;
405f173c2b7SSean Bruno #define LIO_FLAG_MSIX_ENABLED		(uint32_t)(1 << 2)
406f173c2b7SSean Bruno 
407f173c2b7SSean Bruno 	/* The state of this device */
408f173c2b7SSean Bruno 	volatile int	status;
409f173c2b7SSean Bruno 
410f173c2b7SSean Bruno 	/* memory mapped io range */
411f173c2b7SSean Bruno 	struct lio_mem_bus_space mem_bus_space[LIO_MEM_REGIONS];
412f173c2b7SSean Bruno 
413f173c2b7SSean Bruno 	struct lio_reg_list reg_list;
414f173c2b7SSean Bruno 
415f173c2b7SSean Bruno 	struct lio_fn_list fn_list;
416f173c2b7SSean Bruno 
417f173c2b7SSean Bruno 	struct lio_board_info boardinfo;
418f173c2b7SSean Bruno 
419f173c2b7SSean Bruno 	uint32_t	num_iqs;
420f173c2b7SSean Bruno 
421f173c2b7SSean Bruno 	/* The pool containing pre allocated buffers used for soft commands */
422f173c2b7SSean Bruno 	struct lio_sc_buffer_pool sc_buf_pool;
423f173c2b7SSean Bruno 
424f173c2b7SSean Bruno 	/* The input instruction queues */
425f173c2b7SSean Bruno 	struct lio_instr_queue *instr_queue[LIO_MAX_POSSIBLE_INSTR_QUEUES];
426f173c2b7SSean Bruno 
427f173c2b7SSean Bruno 	/* The doubly-linked list of instruction response */
428f173c2b7SSean Bruno 	struct lio_response_list response_list[LIO_MAX_RESPONSE_LISTS];
429f173c2b7SSean Bruno 
430f173c2b7SSean Bruno 	uint32_t	num_oqs;
431f173c2b7SSean Bruno 
432f173c2b7SSean Bruno 	/* The DROQ output queues  */
433f173c2b7SSean Bruno 	struct lio_droq	*droq[LIO_MAX_POSSIBLE_OUTPUT_QUEUES];
434f173c2b7SSean Bruno 
435f173c2b7SSean Bruno 	struct lio_io_enable io_qmask;
436f173c2b7SSean Bruno 
437f173c2b7SSean Bruno 	/* List of dispatch functions */
438f173c2b7SSean Bruno 	struct lio_dispatch_list dispatch;
439f173c2b7SSean Bruno 
440f173c2b7SSean Bruno 	uint32_t	int_status;
441f173c2b7SSean Bruno 
442f173c2b7SSean Bruno 	/* Physical location of the cvmx_bootmem_desc_t in octeon memory */
443f173c2b7SSean Bruno 	uint64_t	bootmem_desc_addr;
444f173c2b7SSean Bruno 
445f173c2b7SSean Bruno 	/*
446f173c2b7SSean Bruno 	 * Placeholder memory for named blocks.
447f173c2b7SSean Bruno 	 * Assumes single-threaded access
448f173c2b7SSean Bruno 	 */
449f173c2b7SSean Bruno 	struct cvmx_bootmem_named_block_desc bootmem_named_block_desc;
450f173c2b7SSean Bruno 
451f173c2b7SSean Bruno 	/* Address of consoles descriptor */
452f173c2b7SSean Bruno 	uint64_t	console_desc_addr;
453f173c2b7SSean Bruno 
454f173c2b7SSean Bruno 	/* Number of consoles available. 0 means they are inaccessible */
455f173c2b7SSean Bruno 	uint32_t	num_consoles;
456f173c2b7SSean Bruno 
457f173c2b7SSean Bruno 	/* Console caches */
458f173c2b7SSean Bruno 	struct lio_console console[LIO_MAX_MAPS];
459f173c2b7SSean Bruno 
460f173c2b7SSean Bruno 	/* Console named block info */
461f173c2b7SSean Bruno 	struct {
462f173c2b7SSean Bruno 		uint64_t	dram_region_base;
463f173c2b7SSean Bruno 		int		bar1_index;
464f173c2b7SSean Bruno 	}	console_nb_info;
465f173c2b7SSean Bruno 
466f173c2b7SSean Bruno 	/* Coprocessor clock rate. */
467f173c2b7SSean Bruno 	uint64_t	coproc_clock_rate;
468f173c2b7SSean Bruno 
469f173c2b7SSean Bruno 	/*
470f173c2b7SSean Bruno 	 * The core application is running in this mode. See lio_common.h
471f173c2b7SSean Bruno 	 * for values.
472f173c2b7SSean Bruno 	 */
473f173c2b7SSean Bruno 	uint32_t	app_mode;
474f173c2b7SSean Bruno 
475f173c2b7SSean Bruno 	struct lio_fw_info fw_info;
476f173c2b7SSean Bruno 
477f173c2b7SSean Bruno 	/* The name given to this device. */
478f173c2b7SSean Bruno 	char		device_name[32];
479f173c2b7SSean Bruno 
480f173c2b7SSean Bruno 	struct lio_tq	dma_comp_tq;
481f173c2b7SSean Bruno 
482f173c2b7SSean Bruno 	/* Lock for dma response list */
483f173c2b7SSean Bruno 	struct mtx	cmd_resp_wqlock;
484f173c2b7SSean Bruno 	uint32_t	cmd_resp_state;
485f173c2b7SSean Bruno 
486f173c2b7SSean Bruno 	struct lio_tq	check_db_tq[LIO_MAX_POSSIBLE_INSTR_QUEUES];
487f173c2b7SSean Bruno 
488f173c2b7SSean Bruno 	struct lio_callout console_timer[LIO_MAX_MAPS];
489f173c2b7SSean Bruno 
490f173c2b7SSean Bruno 	int		num_msix_irqs;
491f173c2b7SSean Bruno 
492f173c2b7SSean Bruno 	/* For PF, there is one non-ioq interrupt handler */
493f173c2b7SSean Bruno 	struct resource	*msix_res;
494f173c2b7SSean Bruno 	int		aux_vector;
495f173c2b7SSean Bruno 	void		*tag;
496f173c2b7SSean Bruno 
497f173c2b7SSean Bruno #define INTRNAMSIZ (32)
498f173c2b7SSean Bruno #define IRQ_NAME_OFF(i) ((i) * INTRNAMSIZ)
499f173c2b7SSean Bruno 
500f173c2b7SSean Bruno 	struct lio_sriov_info sriov_info;
501f173c2b7SSean Bruno 
502f173c2b7SSean Bruno 	struct lio_pf_vf_hs_word pfvf_hsword;
503f173c2b7SSean Bruno 
504f173c2b7SSean Bruno 	int		msix_on;
505f173c2b7SSean Bruno 
506f173c2b7SSean Bruno 	/* IOq information of it's corresponding MSI-X interrupt. */
507f173c2b7SSean Bruno 	struct lio_ioq_vector *ioq_vector;
508f173c2b7SSean Bruno 
509f173c2b7SSean Bruno 	int		rx_pause;
510f173c2b7SSean Bruno 	int		tx_pause;
511f173c2b7SSean Bruno 
512f173c2b7SSean Bruno 	/* TX/RX process pkt budget */
513f173c2b7SSean Bruno 	uint32_t	rx_budget;
514f173c2b7SSean Bruno 	uint32_t	tx_budget;
515f173c2b7SSean Bruno 
516f173c2b7SSean Bruno 	struct octeon_link_stats link_stats;	/* stastics from firmware */
517f173c2b7SSean Bruno 
518f173c2b7SSean Bruno 	struct proc	*watchdog_task;
519f173c2b7SSean Bruno 
520f173c2b7SSean Bruno 	volatile bool	cores_crashed;
521f173c2b7SSean Bruno 
522f173c2b7SSean Bruno 	uint32_t	rx_coalesce_usecs;
523f173c2b7SSean Bruno 	uint32_t	rx_max_coalesced_frames;
524f173c2b7SSean Bruno 	uint32_t	tx_max_coalesced_frames;
525f173c2b7SSean Bruno 
526f173c2b7SSean Bruno #define OCTEON_UBOOT_BUFFER_SIZE 512
527f173c2b7SSean Bruno 	char		uboot_version[OCTEON_UBOOT_BUFFER_SIZE];
528f173c2b7SSean Bruno 	int		uboot_len;
529f173c2b7SSean Bruno 	int		uboot_sidx, uboot_eidx;
530f173c2b7SSean Bruno 
531f173c2b7SSean Bruno 	struct {
532f173c2b7SSean Bruno 		int	bus;
533f173c2b7SSean Bruno 		int	dev;
534f173c2b7SSean Bruno 		int	func;
535f173c2b7SSean Bruno 	}	loc;
536f173c2b7SSean Bruno 
537f173c2b7SSean Bruno 	volatile int	*adapter_refcount;	/* reference count of adapter */
538f173c2b7SSean Bruno };
539f173c2b7SSean Bruno 
540f173c2b7SSean Bruno #define LIO_DRV_ONLINE		1
541f173c2b7SSean Bruno #define LIO_DRV_OFFLINE		2
542f173c2b7SSean Bruno #define LIO_CN23XX_PF(oct)	((oct)->chip_id == LIO_CN23XX_PF_VID)
543f173c2b7SSean Bruno #define LIO_CHIP_CONF(oct, TYPE)					\
544f173c2b7SSean Bruno 	(((struct lio_ ## TYPE  *)((oct)->chip))->conf)
545f173c2b7SSean Bruno #define MAX_IO_PENDING_PKT_COUNT	100
546f173c2b7SSean Bruno 
547f173c2b7SSean Bruno /*------------------ Function Prototypes ----------------------*/
548f173c2b7SSean Bruno 
549f173c2b7SSean Bruno /* Initialize device list memory */
550f173c2b7SSean Bruno void	lio_init_device_list(int conf_type);
551f173c2b7SSean Bruno 
552f173c2b7SSean Bruno /* Free memory for Input and Output queue structures for a octeon device */
553f173c2b7SSean Bruno void	lio_free_device_mem(struct octeon_device *oct);
554f173c2b7SSean Bruno 
555f173c2b7SSean Bruno /*
556f173c2b7SSean Bruno  * Look up a free entry in the octeon_device table and allocate resources
557f173c2b7SSean Bruno  * for the octeon_device structure for an octeon device. Called at init
558f173c2b7SSean Bruno  * time.
559f173c2b7SSean Bruno  */
560f173c2b7SSean Bruno struct octeon_device	*lio_allocate_device(device_t device);
561f173c2b7SSean Bruno 
562f173c2b7SSean Bruno /*
563f173c2b7SSean Bruno  *  Register a device's bus location at initialization time.
564f173c2b7SSean Bruno  *  @param oct        - pointer to the octeon device structure.
565f173c2b7SSean Bruno  *  @param bus        - PCIe bus #
566f173c2b7SSean Bruno  *  @param dev        - PCIe device #
567f173c2b7SSean Bruno  *  @param func       - PCIe function #
568f173c2b7SSean Bruno  *  @param is_pf      - TRUE for PF, FALSE for VF
569f173c2b7SSean Bruno  *  @return reference count of device's adapter
570f173c2b7SSean Bruno  */
571f173c2b7SSean Bruno int	lio_register_device(struct octeon_device *oct, int bus, int dev,
572f173c2b7SSean Bruno 			    int func, int is_pf);
573f173c2b7SSean Bruno 
574f173c2b7SSean Bruno /*
575f173c2b7SSean Bruno  *  Deregister a device at de-initialization time.
576f173c2b7SSean Bruno  *  @param oct - pointer to the octeon device structure.
577f173c2b7SSean Bruno  *  @return reference count of device's adapter
578f173c2b7SSean Bruno  */
579f173c2b7SSean Bruno int	lio_deregister_device(struct octeon_device *oct);
580f173c2b7SSean Bruno 
581f173c2b7SSean Bruno /*
582f173c2b7SSean Bruno  *  Initialize the driver's dispatch list which is a mix of a hash table
583f173c2b7SSean Bruno  *  and a linked list. This is done at driver load time.
584f173c2b7SSean Bruno  *  @param octeon_dev - pointer to the octeon device structure.
585f173c2b7SSean Bruno  *  @return 0 on success, else -ve error value
586f173c2b7SSean Bruno  */
587f173c2b7SSean Bruno int	lio_init_dispatch_list(struct octeon_device *octeon_dev);
588f173c2b7SSean Bruno 
589f173c2b7SSean Bruno /*
590f173c2b7SSean Bruno  * Delete the driver's dispatch list and all registered entries.
591f173c2b7SSean Bruno  * This is done at driver unload time.
592f173c2b7SSean Bruno  * @param octeon_dev - pointer to the octeon device structure.
593f173c2b7SSean Bruno  */
594f173c2b7SSean Bruno void	lio_delete_dispatch_list(struct octeon_device *octeon_dev);
595f173c2b7SSean Bruno 
596f173c2b7SSean Bruno /*
597f173c2b7SSean Bruno  * Initialize the core device fields with the info returned by the FW.
598f173c2b7SSean Bruno  * @param recv_info - Receive info structure
599f173c2b7SSean Bruno  * @param buf       - Receive buffer
600f173c2b7SSean Bruno  */
601f173c2b7SSean Bruno int	lio_core_drv_init(struct lio_recv_info *recv_info, void *buf);
602f173c2b7SSean Bruno 
603f173c2b7SSean Bruno /*
604f173c2b7SSean Bruno  *  Gets the dispatch function registered to receive packets with a
605f173c2b7SSean Bruno  *  given opcode/subcode.
606f173c2b7SSean Bruno  *  @param  octeon_dev  - the octeon device pointer.
607f173c2b7SSean Bruno  *  @param  opcode      - the opcode for which the dispatch function
608f173c2b7SSean Bruno  *                        is to checked.
609f173c2b7SSean Bruno  *  @param  subcode     - the subcode for which the dispatch function
610f173c2b7SSean Bruno  *                        is to checked.
611f173c2b7SSean Bruno  *
612f173c2b7SSean Bruno  *  @return Success: lio_dispatch_fn_t (dispatch function pointer)
613f173c2b7SSean Bruno  *  @return Failure: NULL
614f173c2b7SSean Bruno  *
615f173c2b7SSean Bruno  *  Looks up the dispatch list to get the dispatch function for a
616f173c2b7SSean Bruno  *  given opcode.
617f173c2b7SSean Bruno  */
618f173c2b7SSean Bruno lio_dispatch_fn_t	lio_get_dispatch(struct octeon_device *octeon_dev,
619f173c2b7SSean Bruno 					 uint16_t opcode, uint16_t subcode);
620f173c2b7SSean Bruno 
621f173c2b7SSean Bruno /*
622f173c2b7SSean Bruno  *  Get the octeon device pointer.
623f173c2b7SSean Bruno  *  @param octeon_id  - The id for which the octeon device pointer is required.
624f173c2b7SSean Bruno  *  @return Success: Octeon device pointer.
625f173c2b7SSean Bruno  *  @return Failure: NULL.
626f173c2b7SSean Bruno  */
627f173c2b7SSean Bruno struct octeon_device	*lio_get_device(uint32_t octeon_id);
628f173c2b7SSean Bruno 
629f173c2b7SSean Bruno /*
630f173c2b7SSean Bruno  *  Get the octeon id assigned to the octeon device passed as argument.
631f173c2b7SSean Bruno  *  This function is exported to other modules.
632f173c2b7SSean Bruno  *  @param dev - octeon device pointer passed as a void *.
633f173c2b7SSean Bruno  *  @return octeon device id
634f173c2b7SSean Bruno  */
635f173c2b7SSean Bruno int	lio_get_device_id(void *dev);
636f173c2b7SSean Bruno 
637f173c2b7SSean Bruno static inline uint16_t
OCTEON_MAJOR_REV(struct octeon_device * oct)638f173c2b7SSean Bruno OCTEON_MAJOR_REV(struct octeon_device *oct)
639f173c2b7SSean Bruno {
640f173c2b7SSean Bruno 
641f173c2b7SSean Bruno 	uint16_t rev = (oct->rev_id & 0xC) >> 2;
642f173c2b7SSean Bruno 
643f173c2b7SSean Bruno 	return ((rev == 0) ? 1 : rev);
644f173c2b7SSean Bruno }
645f173c2b7SSean Bruno 
646f173c2b7SSean Bruno static inline uint16_t
OCTEON_MINOR_REV(struct octeon_device * oct)647f173c2b7SSean Bruno OCTEON_MINOR_REV(struct octeon_device *oct)
648f173c2b7SSean Bruno {
649f173c2b7SSean Bruno 
650f173c2b7SSean Bruno 	return (oct->rev_id & 0x3);
651f173c2b7SSean Bruno }
652f173c2b7SSean Bruno 
653f173c2b7SSean Bruno /*
654f173c2b7SSean Bruno  *  Read windowed register.
655f173c2b7SSean Bruno  *  @param  oct   -  pointer to the Octeon device.
656f173c2b7SSean Bruno  *  @param  addr  -  Address of the register to read.
657f173c2b7SSean Bruno  *
658f173c2b7SSean Bruno  *  This routine is called to read from the indirectly accessed
659f173c2b7SSean Bruno  *  Octeon registers that are visible through a PCI BAR0 mapped window
660f173c2b7SSean Bruno  *  register.
661f173c2b7SSean Bruno  *  @return  - 64 bit value read from the register.
662f173c2b7SSean Bruno  */
663f173c2b7SSean Bruno 
664f173c2b7SSean Bruno uint64_t	lio_pci_readq(struct octeon_device *oct, uint64_t addr);
665f173c2b7SSean Bruno 
666f173c2b7SSean Bruno /*
667f173c2b7SSean Bruno  *  Write windowed register.
668f173c2b7SSean Bruno  *  @param  oct  -  pointer to the Octeon device.
669f173c2b7SSean Bruno  *  @param  val  -  Value to write
670f173c2b7SSean Bruno  *  @param  addr -  Address of the register to write
671f173c2b7SSean Bruno  *
672f173c2b7SSean Bruno  *  This routine is called to write to the indirectly accessed
673f173c2b7SSean Bruno  *  Octeon registers that are visible through a PCI BAR0 mapped window
674f173c2b7SSean Bruno  *  register.
675f173c2b7SSean Bruno  *  @return   Nothing.
676f173c2b7SSean Bruno  */
677f173c2b7SSean Bruno void	lio_pci_writeq(struct octeon_device *oct, uint64_t val, uint64_t addr);
678f173c2b7SSean Bruno 
679f173c2b7SSean Bruno /*
680f173c2b7SSean Bruno  * Checks if memory access is okay
681f173c2b7SSean Bruno  *
682f173c2b7SSean Bruno  * @param oct which octeon to send to
683f173c2b7SSean Bruno  * @return Zero on success, negative on failure.
684f173c2b7SSean Bruno  */
685f173c2b7SSean Bruno int	lio_mem_access_ok(struct octeon_device *oct);
686f173c2b7SSean Bruno 
687f173c2b7SSean Bruno /*
688f173c2b7SSean Bruno  * Waits for DDR initialization.
689f173c2b7SSean Bruno  *
690f173c2b7SSean Bruno  * @param oct which octeon to send to
691f173c2b7SSean Bruno  * @param timeout_in_ms pointer to how long to wait until DDR is initialized
692f173c2b7SSean Bruno  * in ms.
693f173c2b7SSean Bruno  *                      If contents are 0, it waits until contents are non-zero
694f173c2b7SSean Bruno  *                      before starting to check.
695f173c2b7SSean Bruno  * @return Zero on success, negative on failure.
696f173c2b7SSean Bruno  */
697f173c2b7SSean Bruno int	lio_wait_for_ddr_init(struct octeon_device *oct,
698f173c2b7SSean Bruno 			      unsigned long *timeout_in_ms);
699f173c2b7SSean Bruno 
700f173c2b7SSean Bruno /*
701f173c2b7SSean Bruno  * Wait for u-boot to boot and be waiting for a command.
702f173c2b7SSean Bruno  *
703f173c2b7SSean Bruno  * @param wait_time_hundredths
704f173c2b7SSean Bruno  *               Maximum time to wait
705f173c2b7SSean Bruno  *
706f173c2b7SSean Bruno  * @return Zero on success, negative on failure.
707f173c2b7SSean Bruno  */
708f173c2b7SSean Bruno int	lio_wait_for_bootloader(struct octeon_device *oct,
709f173c2b7SSean Bruno 				uint32_t wait_time_hundredths);
710f173c2b7SSean Bruno 
711f173c2b7SSean Bruno /*
712f173c2b7SSean Bruno  * Initialize console access
713f173c2b7SSean Bruno  *
714f173c2b7SSean Bruno  * @param oct which octeon initialize
715f173c2b7SSean Bruno  * @return Zero on success, negative on failure.
716f173c2b7SSean Bruno  */
717f173c2b7SSean Bruno int	lio_init_consoles(struct octeon_device *oct);
718f173c2b7SSean Bruno 
719f173c2b7SSean Bruno /*
720f173c2b7SSean Bruno  * Adds access to a console to the device.
721f173c2b7SSean Bruno  *
722f173c2b7SSean Bruno  * @param oct:		which octeon to add to
723f173c2b7SSean Bruno  * @param console_num:	which console
724f173c2b7SSean Bruno  * @param dbg_enb:      ptr to debug enablement string, one of:
725f173c2b7SSean Bruno  *                    * NULL for no debug output (i.e. disabled)
726f173c2b7SSean Bruno  *                    * empty string enables debug output (via default method)
727f173c2b7SSean Bruno  *                    * specific string to enable debug console output
728f173c2b7SSean Bruno  *
729f173c2b7SSean Bruno  * @return Zero on success, negative on failure.
730f173c2b7SSean Bruno  */
731f173c2b7SSean Bruno int	lio_add_console(struct octeon_device *oct, uint32_t console_num,
732f173c2b7SSean Bruno 			char *dbg_enb);
733f173c2b7SSean Bruno 
734f173c2b7SSean Bruno /* write or read from a console */
735f173c2b7SSean Bruno int	lio_console_write(struct octeon_device *oct, uint32_t console_num,
736f173c2b7SSean Bruno 			  char *buffer, uint32_t write_request_size,
737f173c2b7SSean Bruno 			  uint32_t flags);
738f173c2b7SSean Bruno 
739f173c2b7SSean Bruno /* Removes all attached consoles. */
740f173c2b7SSean Bruno void	lio_remove_consoles(struct octeon_device *oct);
741f173c2b7SSean Bruno 
742f173c2b7SSean Bruno /*
743f173c2b7SSean Bruno  * Send a string to u-boot on console 0 as a command.
744f173c2b7SSean Bruno  *
745f173c2b7SSean Bruno  * @param oct which octeon to send to
746f173c2b7SSean Bruno  * @param cmd_str String to send
747f173c2b7SSean Bruno  * @param wait_hundredths Time to wait for u-boot to accept the command.
748f173c2b7SSean Bruno  *
749f173c2b7SSean Bruno  * @return Zero on success, negative on failure.
750f173c2b7SSean Bruno  */
751f173c2b7SSean Bruno int	lio_console_send_cmd(struct octeon_device *oct, char *cmd_str,
752f173c2b7SSean Bruno 			     uint32_t wait_hundredths);
753f173c2b7SSean Bruno 
754f173c2b7SSean Bruno /*
755f173c2b7SSean Bruno  *  Parses, validates, and downloads firmware, then boots associated cores.
756f173c2b7SSean Bruno  *  @param oct which octeon to download firmware to
757f173c2b7SSean Bruno  *  @param data  - The complete firmware file image
758f173c2b7SSean Bruno  *  @param size  - The size of the data
759f173c2b7SSean Bruno  *
760f173c2b7SSean Bruno  *  @return 0 if success.
761f173c2b7SSean Bruno  *         -EINVAL if file is incompatible or badly formatted.
762f173c2b7SSean Bruno  *         -ENODEV if no handler was found for the application type or an
763f173c2b7SSean Bruno  *         invalid octeon id was passed.
764f173c2b7SSean Bruno  */
765f173c2b7SSean Bruno int	lio_download_firmware(struct octeon_device *oct, const uint8_t *data,
766f173c2b7SSean Bruno 			      size_t size);
767f173c2b7SSean Bruno 
768f173c2b7SSean Bruno char	*lio_get_state_string(volatile int *state_ptr);
769f173c2b7SSean Bruno 
770f173c2b7SSean Bruno /*
771f173c2b7SSean Bruno  *  Sets up instruction queues for the device
772f173c2b7SSean Bruno  *  @param oct which octeon to setup
773f173c2b7SSean Bruno  *
774f173c2b7SSean Bruno  *  @return 0 if success. 1 if fails
775f173c2b7SSean Bruno  */
776f173c2b7SSean Bruno int	lio_setup_instr_queue0(struct octeon_device *oct);
777f173c2b7SSean Bruno 
778f173c2b7SSean Bruno /*
779f173c2b7SSean Bruno  *  Sets up output queues for the device
780f173c2b7SSean Bruno  *  @param oct which octeon to setup
781f173c2b7SSean Bruno  *
782f173c2b7SSean Bruno  *  @return 0 if success. 1 if fails
783f173c2b7SSean Bruno  */
784f173c2b7SSean Bruno int	lio_setup_output_queue0(struct octeon_device *oct);
785f173c2b7SSean Bruno 
786f173c2b7SSean Bruno int	lio_get_tx_qsize(struct octeon_device *oct, uint32_t q_no);
787f173c2b7SSean Bruno 
788f173c2b7SSean Bruno int	lio_get_rx_qsize(struct octeon_device *oct, uint32_t q_no);
789f173c2b7SSean Bruno 
790f173c2b7SSean Bruno /*
791f173c2b7SSean Bruno  *  Retrieve the config for the device
792f173c2b7SSean Bruno  *  @param oct which octeon
793f173c2b7SSean Bruno  *  @param card_type type of card
794f173c2b7SSean Bruno  *
795f173c2b7SSean Bruno  *  @returns pointer to configuration
796f173c2b7SSean Bruno  */
797f173c2b7SSean Bruno void	*lio_get_config_info(struct octeon_device *oct, uint16_t card_type);
798f173c2b7SSean Bruno 
799f173c2b7SSean Bruno /*
800f173c2b7SSean Bruno  *  Gets the octeon device configuration
801*17db4b52SGordon Bergling  *  @return - pointer to the octeon configuration structure
802f173c2b7SSean Bruno  */
803f173c2b7SSean Bruno struct lio_config	*lio_get_conf(struct octeon_device *oct);
804f173c2b7SSean Bruno 
805f173c2b7SSean Bruno void	lio_free_ioq_vector(struct octeon_device *oct);
806f173c2b7SSean Bruno int	lio_allocate_ioq_vector(struct octeon_device *oct);
807f173c2b7SSean Bruno void	lio_enable_irq(struct lio_droq *droq, struct lio_instr_queue *iq);
808f173c2b7SSean Bruno 
809f173c2b7SSean Bruno static inline uint32_t
lio_read_pci_cfg(struct octeon_device * oct,uint32_t reg)810f173c2b7SSean Bruno lio_read_pci_cfg(struct octeon_device *oct, uint32_t reg)
811f173c2b7SSean Bruno {
812f173c2b7SSean Bruno 
813f173c2b7SSean Bruno 	return (pci_read_config(oct->device, reg, 4));
814f173c2b7SSean Bruno }
815f173c2b7SSean Bruno 
816f173c2b7SSean Bruno static inline void
lio_write_pci_cfg(struct octeon_device * oct,uint32_t reg,uint32_t value)817f173c2b7SSean Bruno lio_write_pci_cfg(struct octeon_device *oct, uint32_t reg, uint32_t value)
818f173c2b7SSean Bruno {
819f173c2b7SSean Bruno 
820f173c2b7SSean Bruno 	pci_write_config(oct->device, reg, value, 4);
821f173c2b7SSean Bruno }
822f173c2b7SSean Bruno 
823f173c2b7SSean Bruno static inline uint8_t
lio_read_csr8(struct octeon_device * oct,uint32_t reg)824f173c2b7SSean Bruno lio_read_csr8(struct octeon_device *oct, uint32_t reg)
825f173c2b7SSean Bruno {
826f173c2b7SSean Bruno 
827f173c2b7SSean Bruno 	return (bus_space_read_1(oct->mem_bus_space[0].tag,
828f173c2b7SSean Bruno 				 oct->mem_bus_space[0].handle, reg));
829f173c2b7SSean Bruno }
830f173c2b7SSean Bruno 
831f173c2b7SSean Bruno static inline void
lio_write_csr8(struct octeon_device * oct,uint32_t reg,uint8_t val)832f173c2b7SSean Bruno lio_write_csr8(struct octeon_device *oct, uint32_t reg, uint8_t val)
833f173c2b7SSean Bruno {
834f173c2b7SSean Bruno 
835f173c2b7SSean Bruno 	bus_space_write_1(oct->mem_bus_space[0].tag,
836f173c2b7SSean Bruno 			  oct->mem_bus_space[0].handle, reg, val);
837f173c2b7SSean Bruno }
838f173c2b7SSean Bruno 
839f173c2b7SSean Bruno static inline uint16_t
lio_read_csr16(struct octeon_device * oct,uint32_t reg)840f173c2b7SSean Bruno lio_read_csr16(struct octeon_device *oct, uint32_t reg)
841f173c2b7SSean Bruno {
842f173c2b7SSean Bruno 
843f173c2b7SSean Bruno 	return (bus_space_read_2(oct->mem_bus_space[0].tag,
844f173c2b7SSean Bruno 				 oct->mem_bus_space[0].handle, reg));
845f173c2b7SSean Bruno }
846f173c2b7SSean Bruno 
847f173c2b7SSean Bruno static inline void
lio_write_csr16(struct octeon_device * oct,uint32_t reg,uint16_t val)848f173c2b7SSean Bruno lio_write_csr16(struct octeon_device *oct, uint32_t reg, uint16_t val)
849f173c2b7SSean Bruno {
850f173c2b7SSean Bruno 
851f173c2b7SSean Bruno 	bus_space_write_2(oct->mem_bus_space[0].tag,
852f173c2b7SSean Bruno 			  oct->mem_bus_space[0].handle, reg, val);
853f173c2b7SSean Bruno }
854f173c2b7SSean Bruno 
855f173c2b7SSean Bruno static inline uint32_t
lio_read_csr32(struct octeon_device * oct,uint32_t reg)856f173c2b7SSean Bruno lio_read_csr32(struct octeon_device *oct, uint32_t reg)
857f173c2b7SSean Bruno {
858f173c2b7SSean Bruno 
859f173c2b7SSean Bruno 	return (bus_space_read_4(oct->mem_bus_space[0].tag,
860f173c2b7SSean Bruno 				 oct->mem_bus_space[0].handle, reg));
861f173c2b7SSean Bruno }
862f173c2b7SSean Bruno 
863f173c2b7SSean Bruno static inline void
lio_write_csr32(struct octeon_device * oct,uint32_t reg,uint32_t val)864f173c2b7SSean Bruno lio_write_csr32(struct octeon_device *oct, uint32_t reg, uint32_t val)
865f173c2b7SSean Bruno {
866f173c2b7SSean Bruno 
867f173c2b7SSean Bruno 	bus_space_write_4(oct->mem_bus_space[0].tag,
868f173c2b7SSean Bruno 			  oct->mem_bus_space[0].handle, reg, val);
869f173c2b7SSean Bruno }
870f173c2b7SSean Bruno 
871f173c2b7SSean Bruno static inline uint64_t
lio_read_csr64(struct octeon_device * oct,uint32_t reg)872f173c2b7SSean Bruno lio_read_csr64(struct octeon_device *oct, uint32_t reg)
873f173c2b7SSean Bruno {
874f173c2b7SSean Bruno 
8753de0952fSSean Bruno #ifdef __i386__
8763de0952fSSean Bruno 	return (lio_read_csr32(oct, reg) |
8773de0952fSSean Bruno 			((uint64_t)lio_read_csr32(oct, reg + 4) << 32));
8783de0952fSSean Bruno #else
879f173c2b7SSean Bruno 	return (bus_space_read_8(oct->mem_bus_space[0].tag,
880f173c2b7SSean Bruno 				 oct->mem_bus_space[0].handle, reg));
8813de0952fSSean Bruno #endif
882f173c2b7SSean Bruno }
883f173c2b7SSean Bruno 
884f173c2b7SSean Bruno static inline void
lio_write_csr64(struct octeon_device * oct,uint32_t reg,uint64_t val)885f173c2b7SSean Bruno lio_write_csr64(struct octeon_device *oct, uint32_t reg, uint64_t val)
886f173c2b7SSean Bruno {
887f173c2b7SSean Bruno 
8883de0952fSSean Bruno #ifdef __i386__
8893de0952fSSean Bruno 	lio_write_csr32(oct, reg, (uint32_t)val);
8903de0952fSSean Bruno 	lio_write_csr32(oct, reg + 4, val >> 32);
8913de0952fSSean Bruno #else
892f173c2b7SSean Bruno 	bus_space_write_8(oct->mem_bus_space[0].tag,
893f173c2b7SSean Bruno 			  oct->mem_bus_space[0].handle, reg, val);
8943de0952fSSean Bruno #endif
895f173c2b7SSean Bruno }
896f173c2b7SSean Bruno 
897f173c2b7SSean Bruno #endif	/* _LIO_DEVICE_H_ */
898