162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright (c) 2018, Intel Corporation. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef _ICE_CONTROLQ_H_ 562306a36Sopenharmony_ci#define _ICE_CONTROLQ_H_ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "ice_adminq_cmd.h" 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci/* Maximum buffer lengths for all control queue types */ 1062306a36Sopenharmony_ci#define ICE_AQ_MAX_BUF_LEN 4096 1162306a36Sopenharmony_ci#define ICE_MBXQ_MAX_BUF_LEN 4096 1262306a36Sopenharmony_ci#define ICE_SBQ_MAX_BUF_LEN 512 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define ICE_CTL_Q_DESC(R, i) \ 1562306a36Sopenharmony_ci (&(((struct ice_aq_desc *)((R).desc_buf.va))[i])) 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define ICE_CTL_Q_DESC_UNUSED(R) \ 1862306a36Sopenharmony_ci ((u16)((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \ 1962306a36Sopenharmony_ci (R)->next_to_clean - (R)->next_to_use - 1)) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* Defines that help manage the driver vs FW API checks. 2262306a36Sopenharmony_ci * Take a look at ice_aq_ver_check in ice_controlq.c for actual usage. 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci#define EXP_FW_API_VER_BRANCH 0x00 2562306a36Sopenharmony_ci#define EXP_FW_API_VER_MAJOR 0x01 2662306a36Sopenharmony_ci#define EXP_FW_API_VER_MINOR 0x05 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* Different control queue types: These are mainly for SW consumption. */ 2962306a36Sopenharmony_cienum ice_ctl_q { 3062306a36Sopenharmony_ci ICE_CTL_Q_UNKNOWN = 0, 3162306a36Sopenharmony_ci ICE_CTL_Q_ADMIN, 3262306a36Sopenharmony_ci ICE_CTL_Q_MAILBOX, 3362306a36Sopenharmony_ci ICE_CTL_Q_SB, 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* Control Queue timeout settings - max delay 1s */ 3762306a36Sopenharmony_ci#define ICE_CTL_Q_SQ_CMD_TIMEOUT HZ /* Wait max 1s */ 3862306a36Sopenharmony_ci#define ICE_CTL_Q_ADMIN_INIT_TIMEOUT 10 /* Count 10 times */ 3962306a36Sopenharmony_ci#define ICE_CTL_Q_ADMIN_INIT_MSEC 100 /* Check every 100msec */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistruct ice_ctl_q_ring { 4262306a36Sopenharmony_ci void *dma_head; /* Virtual address to DMA head */ 4362306a36Sopenharmony_ci struct ice_dma_mem desc_buf; /* descriptor ring memory */ 4462306a36Sopenharmony_ci void *cmd_buf; /* command buffer memory */ 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci union { 4762306a36Sopenharmony_ci struct ice_dma_mem *sq_bi; 4862306a36Sopenharmony_ci struct ice_dma_mem *rq_bi; 4962306a36Sopenharmony_ci } r; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci u16 count; /* Number of descriptors */ 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci /* used for interrupt processing */ 5462306a36Sopenharmony_ci u16 next_to_use; 5562306a36Sopenharmony_ci u16 next_to_clean; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci /* used for queue tracking */ 5862306a36Sopenharmony_ci u32 head; 5962306a36Sopenharmony_ci u32 tail; 6062306a36Sopenharmony_ci u32 len; 6162306a36Sopenharmony_ci u32 bah; 6262306a36Sopenharmony_ci u32 bal; 6362306a36Sopenharmony_ci u32 len_mask; 6462306a36Sopenharmony_ci u32 len_ena_mask; 6562306a36Sopenharmony_ci u32 len_crit_mask; 6662306a36Sopenharmony_ci u32 head_mask; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* sq transaction details */ 7062306a36Sopenharmony_cistruct ice_sq_cd { 7162306a36Sopenharmony_ci struct ice_aq_desc *wb_desc; 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define ICE_CTL_Q_DETAILS(R, i) (&(((struct ice_sq_cd *)((R).cmd_buf))[i])) 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* rq event information */ 7762306a36Sopenharmony_cistruct ice_rq_event_info { 7862306a36Sopenharmony_ci struct ice_aq_desc desc; 7962306a36Sopenharmony_ci u16 msg_len; 8062306a36Sopenharmony_ci u16 buf_len; 8162306a36Sopenharmony_ci u8 *msg_buf; 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* Control Queue information */ 8562306a36Sopenharmony_cistruct ice_ctl_q_info { 8662306a36Sopenharmony_ci enum ice_ctl_q qtype; 8762306a36Sopenharmony_ci struct ice_ctl_q_ring rq; /* receive queue */ 8862306a36Sopenharmony_ci struct ice_ctl_q_ring sq; /* send queue */ 8962306a36Sopenharmony_ci u16 num_rq_entries; /* receive queue depth */ 9062306a36Sopenharmony_ci u16 num_sq_entries; /* send queue depth */ 9162306a36Sopenharmony_ci u16 rq_buf_size; /* receive queue buffer size */ 9262306a36Sopenharmony_ci u16 sq_buf_size; /* send queue buffer size */ 9362306a36Sopenharmony_ci enum ice_aq_err sq_last_status; /* last status on send queue */ 9462306a36Sopenharmony_ci struct mutex sq_lock; /* Send queue lock */ 9562306a36Sopenharmony_ci struct mutex rq_lock; /* Receive queue lock */ 9662306a36Sopenharmony_ci}; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci#endif /* _ICE_CONTROLQ_H_ */ 99