mirror of https://github.com/F-Stack/f-stack.git
342 lines
11 KiB
C
342 lines
11 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2023 Intel Corporation
|
|
*/
|
|
|
|
#ifndef _CPFL_CPCHNL_H_
|
|
#define _CPFL_CPCHNL_H_
|
|
|
|
/** @brief Command Opcodes
|
|
* Values are to be different from virtchnl.h opcodes
|
|
*/
|
|
enum cpchnl2_ops {
|
|
/* vport info */
|
|
CPCHNL2_OP_GET_VPORT_LIST = 0x8025,
|
|
CPCHNL2_OP_GET_VPORT_INFO = 0x8026,
|
|
|
|
/* DPHMA Event notifications */
|
|
CPCHNL2_OP_EVENT = 0x8050,
|
|
};
|
|
|
|
/* Note! This affects the size of structs below */
|
|
#define CPCHNL2_MAX_TC_AMOUNT 8
|
|
|
|
#define CPCHNL2_ETH_LENGTH_OF_ADDRESS 6
|
|
|
|
/* vport statuses - must match the DB ones - see enum cp_vport_status*/
|
|
#define CPCHNL2_VPORT_STATUS_CREATED 0
|
|
#define CPCHNL2_VPORT_STATUS_ENABLED 1
|
|
#define CPCHNL2_VPORT_STATUS_DISABLED 2
|
|
#define CPCHNL2_VPORT_STATUS_DESTROYED 3
|
|
|
|
/* Queue Groups Extension */
|
|
/**************************************************/
|
|
|
|
#define MAX_Q_REGIONS 16
|
|
/* TBD - with current structure sizes, in order not to exceed 4KB ICQH buffer
|
|
* no more than 11 queue groups are allowed per a single vport..
|
|
* More will be possible only with future msg fragmentation.
|
|
*/
|
|
#define MAX_Q_VPORT_GROUPS 11
|
|
|
|
#define CPCHNL2_CHECK_STRUCT_LEN(n, X) enum static_assert_enum_##X \
|
|
{ static_assert_##X = (n) / ((sizeof(struct X) == (n)) ? 1 : 0) }
|
|
|
|
struct cpchnl2_queue_chunk {
|
|
u32 type; /* 0:QUEUE_TYPE_TX, 1:QUEUE_TYPE_RX */ /* enum nsl_lan_queue_type */
|
|
u32 start_queue_id;
|
|
u32 num_queues;
|
|
u8 pad[4];
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(16, cpchnl2_queue_chunk);
|
|
|
|
/* structure to specify several chunks of contiguous queues */
|
|
struct cpchnl2_queue_grp_chunks {
|
|
u16 num_chunks;
|
|
u8 reserved[6];
|
|
struct cpchnl2_queue_chunk chunks[MAX_Q_REGIONS];
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(264, cpchnl2_queue_grp_chunks);
|
|
|
|
struct cpchnl2_rx_queue_group_info {
|
|
/* User can ask to update rss_lut size originally allocated
|
|
* by CreateVport command. New size will be returned if allocation succeeded,
|
|
* otherwise original rss_size from CreateVport will be returned.
|
|
*/
|
|
u16 rss_lut_size;
|
|
u8 pad[6]; /*Future extension purpose*/
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(8, cpchnl2_rx_queue_group_info);
|
|
|
|
struct cpchnl2_tx_queue_group_info {
|
|
u8 tx_tc; /*TX TC queue group will be connected to*/
|
|
/* Each group can have its own priority, value 0-7, while each group with unique
|
|
* priority is strict priority. It can be single set of queue groups which configured with
|
|
* same priority, then they are assumed part of WFQ arbitration group and are expected to be
|
|
* assigned with weight.
|
|
*/
|
|
u8 priority;
|
|
/* Determines if queue group is expected to be Strict Priority according to its priority */
|
|
u8 is_sp;
|
|
u8 pad;
|
|
/* Peak Info Rate Weight in case Queue Group is part of WFQ arbitration set.
|
|
* The weights of the groups are independent of each other. Possible values: 1-200.
|
|
*/
|
|
u16 pir_weight;
|
|
/* Future extension purpose for CIR only */
|
|
u8 cir_pad[2];
|
|
u8 pad2[8]; /* Future extension purpose*/
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(16, cpchnl2_tx_queue_group_info);
|
|
|
|
struct cpchnl2_queue_group_id {
|
|
/* Queue group ID - depended on it's type:
|
|
* Data & p2p - is an index which is relative to Vport.
|
|
* Config & Mailbox - is an ID which is relative to func.
|
|
* This ID is used in future calls, i.e. delete.
|
|
* Requested by host and assigned by Control plane.
|
|
*/
|
|
u16 queue_group_id;
|
|
/* Functional type: see CPCHNL2_QUEUE_GROUP_TYPE definitions */
|
|
u16 queue_group_type;
|
|
u8 pad[4];
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(8, cpchnl2_queue_group_id);
|
|
|
|
struct cpchnl2_queue_group_info {
|
|
/* IN */
|
|
struct cpchnl2_queue_group_id qg_id;
|
|
|
|
/* IN, Number of queues of different types in the group. */
|
|
u16 num_tx_q;
|
|
u16 num_tx_complq;
|
|
u16 num_rx_q;
|
|
u16 num_rx_bufq;
|
|
|
|
struct cpchnl2_tx_queue_group_info tx_q_grp_info;
|
|
struct cpchnl2_rx_queue_group_info rx_q_grp_info;
|
|
|
|
u8 egress_port;
|
|
u8 pad[39]; /*Future extension purpose*/
|
|
struct cpchnl2_queue_grp_chunks chunks;
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(344, cpchnl2_queue_group_info);
|
|
|
|
struct cpchnl2_queue_groups {
|
|
u16 num_queue_groups; /* Number of queue groups in struct below */
|
|
u8 pad[6];
|
|
/* group information , number is determined by param above */
|
|
struct cpchnl2_queue_group_info groups[MAX_Q_VPORT_GROUPS];
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(3792, cpchnl2_queue_groups);
|
|
|
|
/**
|
|
* @brief function types
|
|
*/
|
|
enum cpchnl2_func_type {
|
|
CPCHNL2_FTYPE_LAN_VF = 0x0,
|
|
CPCHNL2_FTYPE_LAN_RSV1 = 0x1,
|
|
CPCHNL2_FTYPE_LAN_PF = 0x2,
|
|
CPCHNL2_FTYPE_LAN_RSV2 = 0x3,
|
|
CPCHNL2_FTYPE_LAN_MAX
|
|
};
|
|
|
|
/**
|
|
* @brief containing vport id & type
|
|
*/
|
|
struct cpchnl2_vport_id {
|
|
u32 vport_id;
|
|
u16 vport_type;
|
|
u8 pad[2];
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(8, cpchnl2_vport_id);
|
|
|
|
struct cpchnl2_func_id {
|
|
/* Function type: 0 - LAN PF, 1 - LAN VF, Rest - "reserved" */
|
|
u8 func_type;
|
|
/* Always relevant, indexing is according to LAN PE 0-15, while only 0-4 APFs
|
|
* and 8-12 CPFs are valid
|
|
*/
|
|
u8 pf_id;
|
|
/* Valid only if "type" above is VF, indexing is relative to PF specified above. */
|
|
u16 vf_id;
|
|
u8 pad[4];
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(8, cpchnl2_func_id);
|
|
|
|
/* Note! Do not change the fields and especially their order as should eventually
|
|
* be aligned to 32bit. Must match the virtchnl structure definition.
|
|
* If should change, change also the relevant FAS and virtchnl code, under permission.
|
|
*/
|
|
struct cpchnl2_vport_info {
|
|
u16 vport_index;
|
|
/* VSI index, global indexing aligned to HW.
|
|
* Index of HW VSI is allocated by HMA during "CreateVport" virtChnl command.
|
|
* Relevant for VSI backed Vports only, not relevant for vport_type = "Qdev".
|
|
*/
|
|
u16 vsi_id;
|
|
u8 vport_status; /* enum cpchnl2_vport_status */
|
|
/* 0 - LAN VF, 2 - LAN PF. Rest - reserved. Can be later expanded to other PEs */
|
|
u8 func_type;
|
|
/* Valid only if "type" above is VF, indexing is relative to PF specified above. */
|
|
u16 vf_id;
|
|
/* Always relevant, indexing is according to LAN PE 0-15,
|
|
* while only 0-4 APFs and 8-12 CPFs are valid.
|
|
*/
|
|
u8 pf_id;
|
|
u8 rss_enabled; /* if RSS is enabled for Vport. Driven by Node Policy. Currently '0' */
|
|
/* MAC Address assigned for this vport, all 0s for "Qdev" Vport type */
|
|
u8 mac_addr[CPCHNL2_ETH_LENGTH_OF_ADDRESS];
|
|
u16 vmrl_id;
|
|
/* Indicates if IMC created SEM MAC rule for this Vport.
|
|
* Currently this is done by IMC for all Vport of type "Default" only,
|
|
* but can be different in the future.
|
|
*/
|
|
u8 sem_mac_rule_exist;
|
|
/* Bitmask to inform which TC is valid.
|
|
* 0x1 << TCnum. 1b: valid else 0.
|
|
* Driven by Node Policy on system level, then Sysetm level TCs are
|
|
* reported to IDPF and it can enable Vport level TCs on TX according
|
|
* to Syetm enabled ones.
|
|
* If TC aware mode - bit set for valid TC.
|
|
* otherwise =1 (only bit 0 is set. represents the VSI
|
|
*/
|
|
u8 tx_tc_bitmask;
|
|
/* For each valid TC, TEID of VPORT node over TC in TX LAN WS.
|
|
* If TC aware mode - up to 8 TC TEIDs. Otherwise vport_tc_teid[0] shall hold VSI TEID
|
|
*/
|
|
u32 vport_tc_teid[CPCHNL2_MAX_TC_AMOUNT];
|
|
/* For each valid TC, bandwidth in mbps.
|
|
* Default BW per Vport is from Node policy
|
|
* If TC aware mode -per TC. Otherwise, bandwidth[0] holds VSI bandwidth
|
|
*/
|
|
u32 bandwidth[CPCHNL2_MAX_TC_AMOUNT];
|
|
/* From Node Policy. */
|
|
u16 max_mtu;
|
|
u16 default_rx_qid; /* Default LAN RX Queue ID */
|
|
u16 vport_flags; /* see: VPORT_FLAGS */
|
|
u8 egress_port;
|
|
/* Host LAN APF: 0; ACC LAN APF: 4; IMC LAN APF: 5; ACC LAN CPF: 4; IMC LAN CPF: 5 */
|
|
u8 host_id;
|
|
u8 pad_reserved[4];
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(96, cpchnl2_vport_info);
|
|
|
|
/*
|
|
* CPCHNL2_OP_GET_VPORT_LIST
|
|
*/
|
|
|
|
/**
|
|
* @brief Used for CPCHNL2_OP_GET_VPORT_LIST opcode request
|
|
* @param func_type Func type: 0 - LAN_VF, 2 - LAN_PF. Rest - reserved (see enum cpchnl2_func_type)
|
|
* @param pf_id Always relevant, indexing is according to LAN PE 0-15, while only 0-4 APFs and 8-12
|
|
* CPFs are valid
|
|
* @param vf_id Valid only if "type" above is VF, indexing is relative to PF specified above
|
|
*/
|
|
struct cpchnl2_get_vport_list_request {
|
|
u8 func_type;
|
|
u8 pf_id;
|
|
u16 vf_id;
|
|
u8 pad[4];
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(8, cpchnl2_get_vport_list_request);
|
|
|
|
/**
|
|
* @brief Used for CPCHNL2_OP_GET_VPORT_LIST opcode response
|
|
* @param func_type Func type: 0 - LAN_VF, 2 - LAN_PF. Rest - reserved. Can be later extended to
|
|
* other PE types
|
|
* @param pf_id Always relevant, indexing is according to LAN PE 0-15, while only 0-4 APFs and 8-12
|
|
* CPFs are valid
|
|
* @param vf_id Valid only if "type" above is VF, indexing is relative to PF specified above
|
|
* @param nof_vports Number of vports created on the function
|
|
* @param vports array of the IDs and types. vport ID is elative to its func (PF/VF). same as in
|
|
* Create Vport
|
|
* vport_type: Aligned to VirtChnl types: Default, SIOV, etc.
|
|
*/
|
|
struct cpchnl2_get_vport_list_response {
|
|
u8 func_type;
|
|
u8 pf_id;
|
|
u16 vf_id;
|
|
u16 nof_vports;
|
|
u8 pad[2];
|
|
struct cpchnl2_vport_id vports[];
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(8, cpchnl2_get_vport_list_response);
|
|
|
|
/*
|
|
* CPCHNL2_OP_GET_VPORT_INFO
|
|
*/
|
|
/**
|
|
* @brief Used for CPCHNL2_OP_GET_VPORT_INFO opcode request
|
|
* @param vport a structure containing vport_id (relative to function) and type
|
|
* @param func a structure containing function type, pf_id, vf_id
|
|
*/
|
|
struct cpchnl2_get_vport_info_request {
|
|
struct cpchnl2_vport_id vport;
|
|
struct cpchnl2_func_id func;
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(16, cpchnl2_get_vport_info_request);
|
|
|
|
/**
|
|
* @brief Used for CPCHNL2_OP_GET_VPORT_INFO opcode response
|
|
* @param vport a structure containing vport_id (relative to function) and type to get info for
|
|
* @param info a structure all the information for a given vport
|
|
* @param queue_groups a structure containing all the queue groups of the given vport
|
|
*/
|
|
struct cpchnl2_get_vport_info_response {
|
|
struct cpchnl2_vport_id vport;
|
|
struct cpchnl2_vport_info info;
|
|
struct cpchnl2_queue_groups queue_groups;
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(3896, cpchnl2_get_vport_info_response);
|
|
|
|
/* Cpchnl events
|
|
* Sends event message to inform the peer of notification that may affect it.
|
|
* No direct response is expected from the peer, though it may generate other
|
|
* messages in response to this one.
|
|
*/
|
|
enum cpchnl2_event {
|
|
CPCHNL2_EVENT_UNKNOWN = 0,
|
|
CPCHNL2_EVENT_VPORT_CREATED,
|
|
CPCHNL2_EVENT_VPORT_DESTROYED,
|
|
CPCHNL2_EVENT_VPORT_ENABLED,
|
|
CPCHNL2_EVENT_VPORT_DISABLED,
|
|
CPCHNL2_PKG_EVENT,
|
|
CPCHNL2_EVENT_ADD_QUEUE_GROUPS,
|
|
CPCHNL2_EVENT_DEL_QUEUE_GROUPS,
|
|
CPCHNL2_EVENT_ADD_QUEUES,
|
|
CPCHNL2_EVENT_DEL_QUEUES
|
|
};
|
|
|
|
/*
|
|
* This is for CPCHNL2_EVENT_VPORT_CREATED
|
|
*/
|
|
struct cpchnl2_event_vport_created {
|
|
struct cpchnl2_vport_id vport; /* Vport identifier to point to specific Vport */
|
|
struct cpchnl2_vport_info info; /* Vport configuration info */
|
|
struct cpchnl2_queue_groups queue_groups; /* Vport assign queue groups configuration info */
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(3896, cpchnl2_event_vport_created);
|
|
|
|
/*
|
|
* This is for CPCHNL2_EVENT_VPORT_DESTROYED
|
|
*/
|
|
struct cpchnl2_event_vport_destroyed {
|
|
/* Vport identifier to point to specific Vport */
|
|
struct cpchnl2_vport_id vport;
|
|
struct cpchnl2_func_id func;
|
|
};
|
|
CPCHNL2_CHECK_STRUCT_LEN(16, cpchnl2_event_vport_destroyed);
|
|
|
|
struct cpchnl2_event_info {
|
|
struct {
|
|
s32 type; /* See enum cpchnl2_event */
|
|
uint8_t reserved[4]; /* Reserved */
|
|
} header;
|
|
union {
|
|
struct cpchnl2_event_vport_created vport_created;
|
|
struct cpchnl2_event_vport_destroyed vport_destroyed;
|
|
} data;
|
|
};
|
|
|
|
#endif /* _CPFL_CPCHNL_H_ */
|