root/drivers/net/ethernet/intel/iavf/iavf_adv_rss.h
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2021, Intel Corporation. */

#ifndef _IAVF_ADV_RSS_H_
#define _IAVF_ADV_RSS_H_

struct iavf_adapter;

/* State of advanced RSS configuration */
enum iavf_adv_rss_state_t {
        IAVF_ADV_RSS_ADD_REQUEST,       /* User requests to add RSS */
        IAVF_ADV_RSS_ADD_PENDING,       /* RSS pending add by the PF */
        IAVF_ADV_RSS_DEL_REQUEST,       /* Driver requests to delete RSS */
        IAVF_ADV_RSS_DEL_PENDING,       /* RSS pending delete by the PF */
        IAVF_ADV_RSS_ACTIVE,            /* RSS configuration is active */
};

enum iavf_adv_rss_flow_seg_hdr {
        IAVF_ADV_RSS_FLOW_SEG_HDR_NONE  = 0x00000000,
        IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4  = 0x00000001,
        IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6  = 0x00000002,
        IAVF_ADV_RSS_FLOW_SEG_HDR_TCP   = 0x00000004,
        IAVF_ADV_RSS_FLOW_SEG_HDR_UDP   = 0x00000008,
        IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP  = 0x00000010,
        IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC          = 0x00000400,
        IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC_TEID     = 0x00000800,
        IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_IP       = 0x00001000,
        IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_EH       = 0x00002000,
        IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_DWN      = 0x00004000,
        IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_UP       = 0x00008000,
};

#define IAVF_ADV_RSS_FLOW_SEG_HDR_L3            \
        (IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4 |       \
         IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6)

#define IAVF_ADV_RSS_FLOW_SEG_HDR_L4            \
        (IAVF_ADV_RSS_FLOW_SEG_HDR_TCP |        \
         IAVF_ADV_RSS_FLOW_SEG_HDR_UDP |        \
         IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP)

#define IAVF_ADV_RSS_FLOW_SEG_HDR_GTP           \
        (IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC |       \
         IAVF_ADV_RSS_FLOW_SEG_HDR_GTPC_TEID |  \
         IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_IP |    \
         IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_EH |    \
         IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_DWN |   \
         IAVF_ADV_RSS_FLOW_SEG_HDR_GTPU_UP)

enum iavf_adv_rss_flow_field {
        /* L3 */
        IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_SA,
        IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_DA,
        IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_SA,
        IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_DA,
        /* L4 */
        IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_SRC_PORT,
        IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_DST_PORT,
        IAVF_ADV_RSS_FLOW_FIELD_IDX_UDP_SRC_PORT,
        IAVF_ADV_RSS_FLOW_FIELD_IDX_UDP_DST_PORT,
        IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_SRC_PORT,
        IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_DST_PORT,
        /* GTPC_TEID */
        IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPC_TEID,
        /* GTPU_IP */
        IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_IP_TEID,
        /* GTPU_EH */
        IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_EH_TEID,
        IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_EH_QFI,
        /* GTPU_UP */
        IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_UP_TEID,
        /* GTPU_DWN */
        IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_DWN_TEID,

        /* The total number of enums must not exceed 64 */
        IAVF_ADV_RSS_FLOW_FIELD_IDX_MAX
};

#define IAVF_ADV_RSS_HASH_INVALID       0
#define IAVF_ADV_RSS_HASH_FLD_IPV4_SA   \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_SA)
#define IAVF_ADV_RSS_HASH_FLD_IPV6_SA   \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_SA)
#define IAVF_ADV_RSS_HASH_FLD_IPV4_DA   \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_DA)
#define IAVF_ADV_RSS_HASH_FLD_IPV6_DA   \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_DA)
#define IAVF_ADV_RSS_HASH_FLD_TCP_SRC_PORT      \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_SRC_PORT)
#define IAVF_ADV_RSS_HASH_FLD_TCP_DST_PORT      \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_DST_PORT)
#define IAVF_ADV_RSS_HASH_FLD_UDP_SRC_PORT      \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_UDP_SRC_PORT)
#define IAVF_ADV_RSS_HASH_FLD_UDP_DST_PORT      \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_UDP_DST_PORT)
#define IAVF_ADV_RSS_HASH_FLD_SCTP_SRC_PORT     \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_SRC_PORT)
#define IAVF_ADV_RSS_HASH_FLD_SCTP_DST_PORT     \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_DST_PORT)
#define IAVF_ADV_RSS_HASH_FLD_GTPC_TEID BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPC_TEID)
#define IAVF_ADV_RSS_HASH_FLD_GTPU_IP_TEID BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_IP_TEID)
#define IAVF_ADV_RSS_HASH_FLD_GTPU_EH_TEID BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_EH_TEID)
#define IAVF_ADV_RSS_HASH_FLD_GTPU_UP_TEID BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_UP_TEID)
#define IAVF_ADV_RSS_HASH_FLD_GTPU_DWN_TEID \
        BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_GTPU_DWN_TEID)

/* bookkeeping of advanced RSS configuration */
struct iavf_adv_rss {
        enum iavf_adv_rss_state_t state;
        struct list_head list;

        u32 packet_hdrs;
        u64 hash_flds;
        bool symm;

        struct virtchnl_rss_cfg cfg_msg;
};

int
iavf_fill_adv_rss_cfg_msg(struct virtchnl_rss_cfg *rss_cfg,
                          u32 packet_hdrs, u64 hash_flds, bool symm);
struct iavf_adv_rss *
iavf_find_adv_rss_cfg_by_hdrs(struct iavf_adapter *adapter, u32 packet_hdrs);
void
iavf_print_adv_rss_cfg(struct iavf_adapter *adapter, struct iavf_adv_rss *rss,
                       const char *action, const char *result);
#endif /* _IAVF_ADV_RSS_H_ */