cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mlx5dr.h (5089B)


      1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
      2/* Copyright (c) 2019, Mellanox Technologies */
      3
      4#ifndef _MLX5DR_H_
      5#define _MLX5DR_H_
      6
      7struct mlx5dr_domain;
      8struct mlx5dr_table;
      9struct mlx5dr_matcher;
     10struct mlx5dr_rule;
     11struct mlx5dr_action;
     12
     13enum mlx5dr_domain_type {
     14	MLX5DR_DOMAIN_TYPE_NIC_RX,
     15	MLX5DR_DOMAIN_TYPE_NIC_TX,
     16	MLX5DR_DOMAIN_TYPE_FDB,
     17};
     18
     19enum mlx5dr_domain_sync_flags {
     20	MLX5DR_DOMAIN_SYNC_FLAGS_SW = 1 << 0,
     21	MLX5DR_DOMAIN_SYNC_FLAGS_HW = 1 << 1,
     22};
     23
     24enum mlx5dr_action_reformat_type {
     25	DR_ACTION_REFORMAT_TYP_TNL_L2_TO_L2,
     26	DR_ACTION_REFORMAT_TYP_L2_TO_TNL_L2,
     27	DR_ACTION_REFORMAT_TYP_TNL_L3_TO_L2,
     28	DR_ACTION_REFORMAT_TYP_L2_TO_TNL_L3,
     29	DR_ACTION_REFORMAT_TYP_INSERT_HDR,
     30	DR_ACTION_REFORMAT_TYP_REMOVE_HDR,
     31};
     32
     33struct mlx5dr_match_parameters {
     34	size_t match_sz;
     35	u64 *match_buf; /* Device spec format */
     36};
     37
     38struct mlx5dr_action_dest {
     39	struct mlx5dr_action *dest;
     40	struct mlx5dr_action *reformat;
     41};
     42
     43struct mlx5dr_domain *
     44mlx5dr_domain_create(struct mlx5_core_dev *mdev, enum mlx5dr_domain_type type);
     45
     46int mlx5dr_domain_destroy(struct mlx5dr_domain *domain);
     47
     48int mlx5dr_domain_sync(struct mlx5dr_domain *domain, u32 flags);
     49
     50void mlx5dr_domain_set_peer(struct mlx5dr_domain *dmn,
     51			    struct mlx5dr_domain *peer_dmn);
     52
     53struct mlx5dr_table *
     54mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags);
     55
     56struct mlx5dr_table *
     57mlx5dr_table_get_from_fs_ft(struct mlx5_flow_table *ft);
     58
     59int mlx5dr_table_destroy(struct mlx5dr_table *table);
     60
     61u32 mlx5dr_table_get_id(struct mlx5dr_table *table);
     62
     63struct mlx5dr_matcher *
     64mlx5dr_matcher_create(struct mlx5dr_table *table,
     65		      u32 priority,
     66		      u8 match_criteria_enable,
     67		      struct mlx5dr_match_parameters *mask);
     68
     69int mlx5dr_matcher_destroy(struct mlx5dr_matcher *matcher);
     70
     71struct mlx5dr_rule *
     72mlx5dr_rule_create(struct mlx5dr_matcher *matcher,
     73		   struct mlx5dr_match_parameters *value,
     74		   size_t num_actions,
     75		   struct mlx5dr_action *actions[],
     76		   u32 flow_source);
     77
     78int mlx5dr_rule_destroy(struct mlx5dr_rule *rule);
     79
     80int mlx5dr_table_set_miss_action(struct mlx5dr_table *tbl,
     81				 struct mlx5dr_action *action);
     82
     83struct mlx5dr_action *
     84mlx5dr_action_create_dest_table_num(struct mlx5dr_domain *dmn, u32 table_num);
     85
     86struct mlx5dr_action *
     87mlx5dr_action_create_dest_table(struct mlx5dr_table *table);
     88
     89struct mlx5dr_action *
     90mlx5dr_action_create_dest_flow_fw_table(struct mlx5dr_domain *domain,
     91					struct mlx5_flow_table *ft);
     92
     93struct mlx5dr_action *
     94mlx5dr_action_create_dest_vport(struct mlx5dr_domain *domain,
     95				u16 vport, u8 vhca_id_valid,
     96				u16 vhca_id);
     97
     98struct mlx5dr_action *
     99mlx5dr_action_create_mult_dest_tbl(struct mlx5dr_domain *dmn,
    100				   struct mlx5dr_action_dest *dests,
    101				   u32 num_of_dests,
    102				   bool ignore_flow_level,
    103				   u32 flow_source);
    104
    105struct mlx5dr_action *mlx5dr_action_create_drop(void);
    106
    107struct mlx5dr_action *mlx5dr_action_create_tag(u32 tag_value);
    108
    109struct mlx5dr_action *
    110mlx5dr_action_create_flow_sampler(struct mlx5dr_domain *dmn, u32 sampler_id);
    111
    112struct mlx5dr_action *
    113mlx5dr_action_create_flow_counter(u32 counter_id);
    114
    115struct mlx5dr_action *
    116mlx5dr_action_create_packet_reformat(struct mlx5dr_domain *dmn,
    117				     enum mlx5dr_action_reformat_type reformat_type,
    118				     u8 reformat_param_0,
    119				     u8 reformat_param_1,
    120				     size_t data_sz,
    121				     void *data);
    122
    123struct mlx5dr_action *
    124mlx5dr_action_create_modify_header(struct mlx5dr_domain *domain,
    125				   u32 flags,
    126				   size_t actions_sz,
    127				   __be64 actions[]);
    128
    129struct mlx5dr_action *mlx5dr_action_create_pop_vlan(void);
    130
    131struct mlx5dr_action *
    132mlx5dr_action_create_push_vlan(struct mlx5dr_domain *domain, __be32 vlan_hdr);
    133
    134int mlx5dr_action_destroy(struct mlx5dr_action *action);
    135
    136static inline bool
    137mlx5dr_is_supported(struct mlx5_core_dev *dev)
    138{
    139	return MLX5_CAP_GEN(dev, roce) &&
    140	       (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner) ||
    141		(MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner_v2) &&
    142		 (MLX5_CAP_GEN(dev, steering_format_version) <=
    143		  MLX5_STEERING_FORMAT_CONNECTX_7)));
    144}
    145
    146/* buddy functions & structure */
    147
    148struct mlx5dr_icm_mr;
    149
    150struct mlx5dr_icm_buddy_mem {
    151	unsigned long		**bitmap;
    152	unsigned int		*num_free;
    153	u32			max_order;
    154	struct list_head	list_node;
    155	struct mlx5dr_icm_mr	*icm_mr;
    156	struct mlx5dr_icm_pool	*pool;
    157
    158	/* This is the list of used chunks. HW may be accessing this memory */
    159	struct list_head	used_list;
    160	u64			used_memory;
    161
    162	/* Hardware may be accessing this memory but at some future,
    163	 * undetermined time, it might cease to do so.
    164	 * sync_ste command sets them free.
    165	 */
    166	struct list_head	hot_list;
    167
    168	/* Memory optimisation */
    169	struct mlx5dr_ste	*ste_arr;
    170	struct list_head	*miss_list;
    171	u8			*hw_ste_arr;
    172};
    173
    174int mlx5dr_buddy_init(struct mlx5dr_icm_buddy_mem *buddy,
    175		      unsigned int max_order);
    176void mlx5dr_buddy_cleanup(struct mlx5dr_icm_buddy_mem *buddy);
    177int mlx5dr_buddy_alloc_mem(struct mlx5dr_icm_buddy_mem *buddy,
    178			   unsigned int order,
    179			   unsigned int *segment);
    180void mlx5dr_buddy_free_mem(struct mlx5dr_icm_buddy_mem *buddy,
    181			   unsigned int seg, unsigned int order);
    182
    183#endif /* _MLX5DR_H_ */