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