19d26e4fcSRobert Mustacchi /******************************************************************************
29d26e4fcSRobert Mustacchi 
3*df36e06dSRobert Mustacchi   Copyright (c) 2013-2018, Intel Corporation
49d26e4fcSRobert Mustacchi   All rights reserved.
59d26e4fcSRobert Mustacchi 
69d26e4fcSRobert Mustacchi   Redistribution and use in source and binary forms, with or without
79d26e4fcSRobert Mustacchi   modification, are permitted provided that the following conditions are met:
89d26e4fcSRobert Mustacchi 
99d26e4fcSRobert Mustacchi    1. Redistributions of source code must retain the above copyright notice,
109d26e4fcSRobert Mustacchi       this list of conditions and the following disclaimer.
119d26e4fcSRobert Mustacchi 
129d26e4fcSRobert Mustacchi    2. Redistributions in binary form must reproduce the above copyright
139d26e4fcSRobert Mustacchi       notice, this list of conditions and the following disclaimer in the
149d26e4fcSRobert Mustacchi       documentation and/or other materials provided with the distribution.
159d26e4fcSRobert Mustacchi 
169d26e4fcSRobert Mustacchi    3. Neither the name of the Intel Corporation nor the names of its
179d26e4fcSRobert Mustacchi       contributors may be used to endorse or promote products derived from
189d26e4fcSRobert Mustacchi       this software without specific prior written permission.
199d26e4fcSRobert Mustacchi 
209d26e4fcSRobert Mustacchi   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
219d26e4fcSRobert Mustacchi   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
229d26e4fcSRobert Mustacchi   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
239d26e4fcSRobert Mustacchi   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
249d26e4fcSRobert Mustacchi   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
259d26e4fcSRobert Mustacchi   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
269d26e4fcSRobert Mustacchi   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
279d26e4fcSRobert Mustacchi   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
289d26e4fcSRobert Mustacchi   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
299d26e4fcSRobert Mustacchi   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
309d26e4fcSRobert Mustacchi   POSSIBILITY OF SUCH DAMAGE.
319d26e4fcSRobert Mustacchi 
329d26e4fcSRobert Mustacchi ******************************************************************************/
333d75a287SRobert Mustacchi /*$FreeBSD$*/
349d26e4fcSRobert Mustacchi 
359d26e4fcSRobert Mustacchi #ifndef _I40E_ADMINQ_H_
369d26e4fcSRobert Mustacchi #define _I40E_ADMINQ_H_
379d26e4fcSRobert Mustacchi 
389d26e4fcSRobert Mustacchi #include "i40e_osdep.h"
399d26e4fcSRobert Mustacchi #include "i40e_status.h"
409d26e4fcSRobert Mustacchi #include "i40e_adminq_cmd.h"
419d26e4fcSRobert Mustacchi 
429d26e4fcSRobert Mustacchi #define I40E_ADMINQ_DESC(R, i)   \
439d26e4fcSRobert Mustacchi 	(&(((struct i40e_aq_desc *)((R).desc_buf.va))[i]))
449d26e4fcSRobert Mustacchi 
459d26e4fcSRobert Mustacchi #define I40E_ADMINQ_DESC_ALIGNMENT 4096
469d26e4fcSRobert Mustacchi 
479d26e4fcSRobert Mustacchi struct i40e_adminq_ring {
489d26e4fcSRobert Mustacchi 	struct i40e_virt_mem dma_head;	/* space for dma structures */
499d26e4fcSRobert Mustacchi 	struct i40e_dma_mem desc_buf;	/* descriptor ring memory */
509d26e4fcSRobert Mustacchi 	struct i40e_virt_mem cmd_buf;	/* command buffer memory */
519d26e4fcSRobert Mustacchi 
529d26e4fcSRobert Mustacchi 	union {
539d26e4fcSRobert Mustacchi 		struct i40e_dma_mem *asq_bi;
549d26e4fcSRobert Mustacchi 		struct i40e_dma_mem *arq_bi;
559d26e4fcSRobert Mustacchi 	} r;
569d26e4fcSRobert Mustacchi 
579d26e4fcSRobert Mustacchi 	u16 count;		/* Number of descriptors */
589d26e4fcSRobert Mustacchi 	u16 rx_buf_len;		/* Admin Receive Queue buffer length */
599d26e4fcSRobert Mustacchi 
609d26e4fcSRobert Mustacchi 	/* used for interrupt processing */
619d26e4fcSRobert Mustacchi 	u16 next_to_use;
629d26e4fcSRobert Mustacchi 	u16 next_to_clean;
639d26e4fcSRobert Mustacchi 
649d26e4fcSRobert Mustacchi 	/* used for queue tracking */
659d26e4fcSRobert Mustacchi 	u32 head;
669d26e4fcSRobert Mustacchi 	u32 tail;
679d26e4fcSRobert Mustacchi 	u32 len;
689d26e4fcSRobert Mustacchi 	u32 bah;
699d26e4fcSRobert Mustacchi 	u32 bal;
709d26e4fcSRobert Mustacchi };
719d26e4fcSRobert Mustacchi 
729d26e4fcSRobert Mustacchi /* ASQ transaction details */
739d26e4fcSRobert Mustacchi struct i40e_asq_cmd_details {
749d26e4fcSRobert Mustacchi 	void *callback; /* cast from type I40E_ADMINQ_CALLBACK */
759d26e4fcSRobert Mustacchi 	u64 cookie;
769d26e4fcSRobert Mustacchi 	u16 flags_ena;
779d26e4fcSRobert Mustacchi 	u16 flags_dis;
789d26e4fcSRobert Mustacchi 	bool async;
799d26e4fcSRobert Mustacchi 	bool postpone;
809d26e4fcSRobert Mustacchi 	struct i40e_aq_desc *wb_desc;
819d26e4fcSRobert Mustacchi };
829d26e4fcSRobert Mustacchi 
839d26e4fcSRobert Mustacchi #define I40E_ADMINQ_DETAILS(R, i)   \
849d26e4fcSRobert Mustacchi 	(&(((struct i40e_asq_cmd_details *)((R).cmd_buf.va))[i]))
859d26e4fcSRobert Mustacchi 
869d26e4fcSRobert Mustacchi /* ARQ event information */
879d26e4fcSRobert Mustacchi struct i40e_arq_event_info {
889d26e4fcSRobert Mustacchi 	struct i40e_aq_desc desc;
899d26e4fcSRobert Mustacchi 	u16 msg_len;
909d26e4fcSRobert Mustacchi 	u16 buf_len;
919d26e4fcSRobert Mustacchi 	u8 *msg_buf;
929d26e4fcSRobert Mustacchi };
939d26e4fcSRobert Mustacchi 
949d26e4fcSRobert Mustacchi /* Admin Queue information */
959d26e4fcSRobert Mustacchi struct i40e_adminq_info {
969d26e4fcSRobert Mustacchi 	struct i40e_adminq_ring arq;    /* receive queue */
979d26e4fcSRobert Mustacchi 	struct i40e_adminq_ring asq;    /* send queue */
989d26e4fcSRobert Mustacchi 	u32 asq_cmd_timeout;            /* send queue cmd write back timeout*/
999d26e4fcSRobert Mustacchi 	u16 num_arq_entries;            /* receive queue depth */
1009d26e4fcSRobert Mustacchi 	u16 num_asq_entries;            /* send queue depth */
1019d26e4fcSRobert Mustacchi 	u16 arq_buf_size;               /* receive queue buffer size */
1029d26e4fcSRobert Mustacchi 	u16 asq_buf_size;               /* send queue buffer size */
1039d26e4fcSRobert Mustacchi 	u16 fw_maj_ver;                 /* firmware major version */
1049d26e4fcSRobert Mustacchi 	u16 fw_min_ver;                 /* firmware minor version */
1059d26e4fcSRobert Mustacchi 	u32 fw_build;                   /* firmware build number */
1069d26e4fcSRobert Mustacchi 	u16 api_maj_ver;                /* api major version */
1079d26e4fcSRobert Mustacchi 	u16 api_min_ver;                /* api minor version */
1089d26e4fcSRobert Mustacchi 
1099d26e4fcSRobert Mustacchi 	struct i40e_spinlock asq_spinlock; /* Send queue spinlock */
1109d26e4fcSRobert Mustacchi 	struct i40e_spinlock arq_spinlock; /* Receive queue spinlock */
1119d26e4fcSRobert Mustacchi 
1129d26e4fcSRobert Mustacchi 	/* last status values on send and receive queues */
1139d26e4fcSRobert Mustacchi 	enum i40e_admin_queue_err asq_last_status;
1149d26e4fcSRobert Mustacchi 	enum i40e_admin_queue_err arq_last_status;
1159d26e4fcSRobert Mustacchi };
1169d26e4fcSRobert Mustacchi 
1173d75a287SRobert Mustacchi /**
1183d75a287SRobert Mustacchi  * i40e_aq_rc_to_posix - convert errors to user-land codes
1193d75a287SRobert Mustacchi  * aq_ret: AdminQ handler error code can override aq_rc
1203d75a287SRobert Mustacchi  * aq_rc: AdminQ firmware error code to convert
1213d75a287SRobert Mustacchi  **/
i40e_aq_rc_to_posix(int aq_ret,int aq_rc)1223d75a287SRobert Mustacchi static INLINE int i40e_aq_rc_to_posix(int aq_ret, int aq_rc)
1233d75a287SRobert Mustacchi {
1243d75a287SRobert Mustacchi 	int aq_to_posix[] = {
1253d75a287SRobert Mustacchi 		0,           /* I40E_AQ_RC_OK */
1263d75a287SRobert Mustacchi 		-EPERM,      /* I40E_AQ_RC_EPERM */
1273d75a287SRobert Mustacchi 		-ENOENT,     /* I40E_AQ_RC_ENOENT */
1283d75a287SRobert Mustacchi 		-ESRCH,      /* I40E_AQ_RC_ESRCH */
1293d75a287SRobert Mustacchi 		-EINTR,      /* I40E_AQ_RC_EINTR */
1303d75a287SRobert Mustacchi 		-EIO,        /* I40E_AQ_RC_EIO */
1313d75a287SRobert Mustacchi 		-ENXIO,      /* I40E_AQ_RC_ENXIO */
1323d75a287SRobert Mustacchi 		-E2BIG,      /* I40E_AQ_RC_E2BIG */
1333d75a287SRobert Mustacchi 		-EAGAIN,     /* I40E_AQ_RC_EAGAIN */
1343d75a287SRobert Mustacchi 		-ENOMEM,     /* I40E_AQ_RC_ENOMEM */
1353d75a287SRobert Mustacchi 		-EACCES,     /* I40E_AQ_RC_EACCES */
1363d75a287SRobert Mustacchi 		-EFAULT,     /* I40E_AQ_RC_EFAULT */
1373d75a287SRobert Mustacchi 		-EBUSY,      /* I40E_AQ_RC_EBUSY */
1383d75a287SRobert Mustacchi 		-EEXIST,     /* I40E_AQ_RC_EEXIST */
1393d75a287SRobert Mustacchi 		-EINVAL,     /* I40E_AQ_RC_EINVAL */
1403d75a287SRobert Mustacchi 		-ENOTTY,     /* I40E_AQ_RC_ENOTTY */
1413d75a287SRobert Mustacchi 		-ENOSPC,     /* I40E_AQ_RC_ENOSPC */
1423d75a287SRobert Mustacchi 		-ENOSYS,     /* I40E_AQ_RC_ENOSYS */
1433d75a287SRobert Mustacchi 		-ERANGE,     /* I40E_AQ_RC_ERANGE */
1443d75a287SRobert Mustacchi 		-EPIPE,      /* I40E_AQ_RC_EFLUSHED */
1453d75a287SRobert Mustacchi 		-ESPIPE,     /* I40E_AQ_RC_BAD_ADDR */
1463d75a287SRobert Mustacchi 		-EROFS,      /* I40E_AQ_RC_EMODE */
1473d75a287SRobert Mustacchi 		-EFBIG,      /* I40E_AQ_RC_EFBIG */
1483d75a287SRobert Mustacchi 	};
1493d75a287SRobert Mustacchi 
1503d75a287SRobert Mustacchi 	/* aq_rc is invalid if AQ timed out */
1513d75a287SRobert Mustacchi 	if (aq_ret == I40E_ERR_ADMIN_QUEUE_TIMEOUT)
1523d75a287SRobert Mustacchi 		return -EAGAIN;
1533d75a287SRobert Mustacchi 
1543d75a287SRobert Mustacchi 	if (!((u32)aq_rc < (sizeof(aq_to_posix) / sizeof((aq_to_posix)[0]))))
1553d75a287SRobert Mustacchi 		return -ERANGE;
1563d75a287SRobert Mustacchi 
1573d75a287SRobert Mustacchi 	return aq_to_posix[aq_rc];
1583d75a287SRobert Mustacchi }
1593d75a287SRobert Mustacchi 
1609d26e4fcSRobert Mustacchi /* general information */
1613d75a287SRobert Mustacchi #define I40E_AQ_LARGE_BUF	512
16293f1cac5SPaul Winder #define I40E_ASQ_CMD_TIMEOUT	250000  /* usecs */
1639d26e4fcSRobert Mustacchi 
1649d26e4fcSRobert Mustacchi void i40e_fill_default_direct_cmd_desc(struct i40e_aq_desc *desc,
1659d26e4fcSRobert Mustacchi 				       u16 opcode);
1669d26e4fcSRobert Mustacchi 
1679d26e4fcSRobert Mustacchi #endif /* _I40E_ADMINQ_H_ */
168