From: Beilei Xing <beilei.x...@intel.com>

The CPCHNL2 defines the API (v2) used for communication between the
CPF driver and its on-chip management software. The CPFL PMD is a
specific CPF driver to utilize CPCHNL2 for device configuration and
event probing.

Signed-off-by: Beilei Xing <beilei.x...@intel.com>
---
 drivers/net/cpfl/cpfl_cpchnl.h | 340 +++++++++++++++++++++++++++++++++
 1 file changed, 340 insertions(+)
 create mode 100644 drivers/net/cpfl/cpfl_cpchnl.h

diff --git a/drivers/net/cpfl/cpfl_cpchnl.h b/drivers/net/cpfl/cpfl_cpchnl.h
new file mode 100644
index 0000000000..2eefcbcc10
--- /dev/null
+++ b/drivers/net/cpfl/cpfl_cpchnl.h
@@ -0,0 +1,340 @@
+/* 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
+
+#define CPCHNL2_FUNC_TYPE_PF           0
+#define CPCHNL2_FUNC_TYPE_SRIOV                1
+
+/* 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_PF = 0,
+       CPCHNL2_FTYPE_LAN_VF = 1,
+       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 PF, 1 - LAN VF. 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;
+       u8 pad_reserved[5];
+};
+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_PF, 1 - LAN_VF. 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_PF, 1 - LAN_VF. 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_ */
-- 
2.34.1

Reply via email to