f-stack/dpdk/drivers/event/dlb2/pf/base/dlb2_mbox.h

597 lines
13 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2016-2020 Intel Corporation
*/
#ifndef __DLB2_BASE_DLB2_MBOX_H
#define __DLB2_BASE_DLB2_MBOX_H
#include "dlb2_osdep_types.h"
#include "dlb2_regs.h"
#define DLB2_MBOX_INTERFACE_VERSION 1
/*
* The PF uses its PF->VF mailbox to send responses to VF requests, as well as
* to send requests of its own (e.g. notifying a VF of an impending FLR).
* To avoid communication race conditions, e.g. the PF sends a response and then
* sends a request before the VF reads the response, the PF->VF mailbox is
* divided into two sections:
* - Bytes 0-47: PF responses
* - Bytes 48-63: PF requests
*
* Partitioning the PF->VF mailbox allows responses and requests to occupy the
* mailbox simultaneously.
*/
#define DLB2_PF2VF_RESP_BYTES 48
#define DLB2_PF2VF_RESP_BASE 0
#define DLB2_PF2VF_RESP_BASE_WORD (DLB2_PF2VF_RESP_BASE / 4)
#define DLB2_PF2VF_REQ_BYTES 16
#define DLB2_PF2VF_REQ_BASE (DLB2_PF2VF_RESP_BASE + DLB2_PF2VF_RESP_BYTES)
#define DLB2_PF2VF_REQ_BASE_WORD (DLB2_PF2VF_REQ_BASE / 4)
/*
* Similarly, the VF->PF mailbox is divided into two sections:
* - Bytes 0-239: VF requests
* -- (Bytes 0-3 are unused due to a hardware errata)
* - Bytes 240-255: VF responses
*/
#define DLB2_VF2PF_REQ_BYTES 236
#define DLB2_VF2PF_REQ_BASE 4
#define DLB2_VF2PF_REQ_BASE_WORD (DLB2_VF2PF_REQ_BASE / 4)
#define DLB2_VF2PF_RESP_BYTES 16
#define DLB2_VF2PF_RESP_BASE (DLB2_VF2PF_REQ_BASE + DLB2_VF2PF_REQ_BYTES)
#define DLB2_VF2PF_RESP_BASE_WORD (DLB2_VF2PF_RESP_BASE / 4)
/* VF-initiated commands */
enum dlb2_mbox_cmd_type {
DLB2_MBOX_CMD_REGISTER,
DLB2_MBOX_CMD_UNREGISTER,
DLB2_MBOX_CMD_GET_NUM_RESOURCES,
DLB2_MBOX_CMD_CREATE_SCHED_DOMAIN,
DLB2_MBOX_CMD_RESET_SCHED_DOMAIN,
DLB2_MBOX_CMD_CREATE_LDB_QUEUE,
DLB2_MBOX_CMD_CREATE_DIR_QUEUE,
DLB2_MBOX_CMD_CREATE_LDB_PORT,
DLB2_MBOX_CMD_CREATE_DIR_PORT,
DLB2_MBOX_CMD_ENABLE_LDB_PORT,
DLB2_MBOX_CMD_DISABLE_LDB_PORT,
DLB2_MBOX_CMD_ENABLE_DIR_PORT,
DLB2_MBOX_CMD_DISABLE_DIR_PORT,
DLB2_MBOX_CMD_LDB_PORT_OWNED_BY_DOMAIN,
DLB2_MBOX_CMD_DIR_PORT_OWNED_BY_DOMAIN,
DLB2_MBOX_CMD_MAP_QID,
DLB2_MBOX_CMD_UNMAP_QID,
DLB2_MBOX_CMD_START_DOMAIN,
DLB2_MBOX_CMD_ENABLE_LDB_PORT_INTR,
DLB2_MBOX_CMD_ENABLE_DIR_PORT_INTR,
DLB2_MBOX_CMD_ARM_CQ_INTR,
DLB2_MBOX_CMD_GET_NUM_USED_RESOURCES,
DLB2_MBOX_CMD_GET_SN_ALLOCATION,
DLB2_MBOX_CMD_GET_LDB_QUEUE_DEPTH,
DLB2_MBOX_CMD_GET_DIR_QUEUE_DEPTH,
DLB2_MBOX_CMD_PENDING_PORT_UNMAPS,
DLB2_MBOX_CMD_GET_COS_BW,
DLB2_MBOX_CMD_GET_SN_OCCUPANCY,
DLB2_MBOX_CMD_QUERY_CQ_POLL_MODE,
/* NUM_QE_CMD_TYPES must be last */
NUM_DLB2_MBOX_CMD_TYPES,
};
static const char dlb2_mbox_cmd_type_strings[][128] = {
"DLB2_MBOX_CMD_REGISTER",
"DLB2_MBOX_CMD_UNREGISTER",
"DLB2_MBOX_CMD_GET_NUM_RESOURCES",
"DLB2_MBOX_CMD_CREATE_SCHED_DOMAIN",
"DLB2_MBOX_CMD_RESET_SCHED_DOMAIN",
"DLB2_MBOX_CMD_CREATE_LDB_QUEUE",
"DLB2_MBOX_CMD_CREATE_DIR_QUEUE",
"DLB2_MBOX_CMD_CREATE_LDB_PORT",
"DLB2_MBOX_CMD_CREATE_DIR_PORT",
"DLB2_MBOX_CMD_ENABLE_LDB_PORT",
"DLB2_MBOX_CMD_DISABLE_LDB_PORT",
"DLB2_MBOX_CMD_ENABLE_DIR_PORT",
"DLB2_MBOX_CMD_DISABLE_DIR_PORT",
"DLB2_MBOX_CMD_LDB_PORT_OWNED_BY_DOMAIN",
"DLB2_MBOX_CMD_DIR_PORT_OWNED_BY_DOMAIN",
"DLB2_MBOX_CMD_MAP_QID",
"DLB2_MBOX_CMD_UNMAP_QID",
"DLB2_MBOX_CMD_START_DOMAIN",
"DLB2_MBOX_CMD_ENABLE_LDB_PORT_INTR",
"DLB2_MBOX_CMD_ENABLE_DIR_PORT_INTR",
"DLB2_MBOX_CMD_ARM_CQ_INTR",
"DLB2_MBOX_CMD_GET_NUM_USED_RESOURCES",
"DLB2_MBOX_CMD_GET_SN_ALLOCATION",
"DLB2_MBOX_CMD_GET_LDB_QUEUE_DEPTH",
"DLB2_MBOX_CMD_GET_DIR_QUEUE_DEPTH",
"DLB2_MBOX_CMD_PENDING_PORT_UNMAPS",
"DLB2_MBOX_CMD_GET_COS_BW",
"DLB2_MBOX_CMD_GET_SN_OCCUPANCY",
"DLB2_MBOX_CMD_QUERY_CQ_POLL_MODE",
};
/* PF-initiated commands */
enum dlb2_mbox_vf_cmd_type {
DLB2_MBOX_VF_CMD_DOMAIN_ALERT,
DLB2_MBOX_VF_CMD_NOTIFICATION,
DLB2_MBOX_VF_CMD_IN_USE,
/* NUM_DLB2_MBOX_VF_CMD_TYPES must be last */
NUM_DLB2_MBOX_VF_CMD_TYPES,
};
static const char dlb2_mbox_vf_cmd_type_strings[][128] = {
"DLB2_MBOX_VF_CMD_DOMAIN_ALERT",
"DLB2_MBOX_VF_CMD_NOTIFICATION",
"DLB2_MBOX_VF_CMD_IN_USE",
};
#define DLB2_MBOX_CMD_TYPE(hdr) \
(((struct dlb2_mbox_req_hdr *)hdr)->type)
#define DLB2_MBOX_CMD_STRING(hdr) \
dlb2_mbox_cmd_type_strings[DLB2_MBOX_CMD_TYPE(hdr)]
enum dlb2_mbox_status_type {
DLB2_MBOX_ST_SUCCESS,
DLB2_MBOX_ST_INVALID_CMD_TYPE,
DLB2_MBOX_ST_VERSION_MISMATCH,
DLB2_MBOX_ST_INVALID_OWNER_VF,
};
static const char dlb2_mbox_status_type_strings[][128] = {
"DLB2_MBOX_ST_SUCCESS",
"DLB2_MBOX_ST_INVALID_CMD_TYPE",
"DLB2_MBOX_ST_VERSION_MISMATCH",
"DLB2_MBOX_ST_INVALID_OWNER_VF",
};
#define DLB2_MBOX_ST_TYPE(hdr) \
(((struct dlb2_mbox_resp_hdr *)hdr)->status)
#define DLB2_MBOX_ST_STRING(hdr) \
dlb2_mbox_status_type_strings[DLB2_MBOX_ST_TYPE(hdr)]
/* This structure is always the first field in a request structure */
struct dlb2_mbox_req_hdr {
u32 type;
};
/* This structure is always the first field in a response structure */
struct dlb2_mbox_resp_hdr {
u32 status;
};
struct dlb2_mbox_register_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u16 min_interface_version;
u16 max_interface_version;
};
struct dlb2_mbox_register_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 interface_version;
u8 pf_id;
u8 vf_id;
u8 is_auxiliary_vf;
u8 primary_vf_id;
u32 padding;
};
struct dlb2_mbox_unregister_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 padding;
};
struct dlb2_mbox_unregister_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 padding;
};
struct dlb2_mbox_get_num_resources_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 padding;
};
struct dlb2_mbox_get_num_resources_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u16 num_sched_domains;
u16 num_ldb_queues;
u16 num_ldb_ports;
u16 num_cos_ldb_ports[4];
u16 num_dir_ports;
u32 num_atomic_inflights;
u32 num_hist_list_entries;
u32 max_contiguous_hist_list_entries;
u16 num_ldb_credits;
u16 num_dir_credits;
};
struct dlb2_mbox_create_sched_domain_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 num_ldb_queues;
u32 num_ldb_ports;
u32 num_cos_ldb_ports[4];
u32 num_dir_ports;
u32 num_atomic_inflights;
u32 num_hist_list_entries;
u32 num_ldb_credits;
u32 num_dir_credits;
u8 cos_strict;
u8 padding0[3];
u32 padding1;
};
struct dlb2_mbox_create_sched_domain_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 id;
};
struct dlb2_mbox_reset_sched_domain_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 id;
};
struct dlb2_mbox_reset_sched_domain_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
};
struct dlb2_mbox_create_ldb_queue_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 num_sequence_numbers;
u32 num_qid_inflights;
u32 num_atomic_inflights;
u32 lock_id_comp_level;
u32 depth_threshold;
u32 padding;
};
struct dlb2_mbox_create_ldb_queue_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 id;
};
struct dlb2_mbox_create_dir_queue_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 depth_threshold;
};
struct dlb2_mbox_create_dir_queue_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 id;
};
struct dlb2_mbox_create_ldb_port_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u16 cq_depth;
u16 cq_history_list_size;
u8 cos_id;
u8 cos_strict;
u16 padding1;
u64 cq_base_address;
};
struct dlb2_mbox_create_ldb_port_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 id;
};
struct dlb2_mbox_create_dir_port_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u64 cq_base_address;
u16 cq_depth;
u16 padding0;
s32 queue_id;
};
struct dlb2_mbox_create_dir_port_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 id;
};
struct dlb2_mbox_enable_ldb_port_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 padding;
};
struct dlb2_mbox_enable_ldb_port_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 padding;
};
struct dlb2_mbox_disable_ldb_port_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 padding;
};
struct dlb2_mbox_disable_ldb_port_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 padding;
};
struct dlb2_mbox_enable_dir_port_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 padding;
};
struct dlb2_mbox_enable_dir_port_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 padding;
};
struct dlb2_mbox_disable_dir_port_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 padding;
};
struct dlb2_mbox_disable_dir_port_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 padding;
};
struct dlb2_mbox_ldb_port_owned_by_domain_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 padding;
};
struct dlb2_mbox_ldb_port_owned_by_domain_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
s32 owned;
};
struct dlb2_mbox_dir_port_owned_by_domain_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 padding;
};
struct dlb2_mbox_dir_port_owned_by_domain_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
s32 owned;
};
struct dlb2_mbox_map_qid_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 qid;
u32 priority;
u32 padding0;
};
struct dlb2_mbox_map_qid_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 id;
};
struct dlb2_mbox_unmap_qid_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 qid;
};
struct dlb2_mbox_unmap_qid_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 padding;
};
struct dlb2_mbox_start_domain_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
};
struct dlb2_mbox_start_domain_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 padding;
};
struct dlb2_mbox_enable_ldb_port_intr_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u16 port_id;
u16 thresh;
u16 vector;
u16 owner_vf;
u16 reserved[2];
};
struct dlb2_mbox_enable_ldb_port_intr_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 padding;
};
struct dlb2_mbox_enable_dir_port_intr_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u16 port_id;
u16 thresh;
u16 vector;
u16 owner_vf;
u16 reserved[2];
};
struct dlb2_mbox_enable_dir_port_intr_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 padding;
};
struct dlb2_mbox_arm_cq_intr_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 is_ldb;
};
struct dlb2_mbox_arm_cq_intr_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 padding0;
};
/*
* The alert_id and aux_alert_data follows the format of the alerts defined in
* dlb2_types.h. The alert id contains an enum dlb2_domain_alert_id value, and
* the aux_alert_data value varies depending on the alert.
*/
struct dlb2_mbox_vf_alert_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 alert_id;
u32 aux_alert_data;
};
enum dlb2_mbox_vf_notification_type {
DLB2_MBOX_VF_NOTIFICATION_PRE_RESET,
DLB2_MBOX_VF_NOTIFICATION_POST_RESET,
/* NUM_DLB2_MBOX_VF_NOTIFICATION_TYPES must be last */
NUM_DLB2_MBOX_VF_NOTIFICATION_TYPES,
};
struct dlb2_mbox_vf_notification_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 notification;
};
struct dlb2_mbox_vf_in_use_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 padding;
};
struct dlb2_mbox_vf_in_use_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 in_use;
};
struct dlb2_mbox_get_sn_allocation_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 group_id;
};
struct dlb2_mbox_get_sn_allocation_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 num;
};
struct dlb2_mbox_get_ldb_queue_depth_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 queue_id;
u32 padding;
};
struct dlb2_mbox_get_ldb_queue_depth_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 depth;
};
struct dlb2_mbox_get_dir_queue_depth_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 queue_id;
u32 padding;
};
struct dlb2_mbox_get_dir_queue_depth_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 depth;
};
struct dlb2_mbox_pending_port_unmaps_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 domain_id;
u32 port_id;
u32 padding;
};
struct dlb2_mbox_pending_port_unmaps_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 num;
};
struct dlb2_mbox_get_cos_bw_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 cos_id;
};
struct dlb2_mbox_get_cos_bw_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 num;
};
struct dlb2_mbox_get_sn_occupancy_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 group_id;
};
struct dlb2_mbox_get_sn_occupancy_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 num;
};
struct dlb2_mbox_query_cq_poll_mode_cmd_req {
struct dlb2_mbox_req_hdr hdr;
u32 padding;
};
struct dlb2_mbox_query_cq_poll_mode_cmd_resp {
struct dlb2_mbox_resp_hdr hdr;
u32 error_code;
u32 status;
u32 mode;
};
#endif /* __DLB2_BASE_DLB2_MBOX_H */