1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2019-2024 Broadcom 3 * All rights reserved. 4 */ 5 6 #ifndef _TF_RESOURCES_H_ 7 #define _TF_RESOURCES_H_ 8 #include <rte_common.h> 9 #include <tf_rm.h> 10 #include "bnxt.h" 11 12 #define TF_NUM_TBL_SCOPE 16 /* < Number of TBL scopes */ 13 14 #ifdef TF_FLOW_SCALE_QUERY 15 /* Feature of flow scale query */ 16 enum tf_resc_opt { 17 TF_RESC_FREE, 18 TF_RESC_ALLOC 19 }; 20 21 /** 22 * WC TCAM includes a set of rows, and each row have 4-slices; 23 * each slice has 160bit 24 */ 25 typedef struct __rte_packed_begin tf_resc_wc_tcam_usage { 26 uint16_t max_row_number; /* Max number of rows (excluding AFM), 160bit row */ 27 uint16_t slice_row_1_p_used; /* 1-slice rows partially used */ 28 uint16_t slice_row_1_f_used; /* 1-slice rows fully used */ 29 uint16_t slice_row_2_p_used; /* 2-slice rows partially used */ 30 uint16_t slice_row_2_f_used; /* 2-slice rows fully used */ 31 uint16_t slice_row_4_used; /* 4-slice rows fully used */ 32 uint16_t unused_row_number; /* number of unused rows */ 33 uint8_t reserved[2]; 34 } __rte_packed_end tf_resc_wc_tcam_usage_t; 35 36 /* Resource Internal EM memory pool; vary size records */ 37 typedef struct __rte_packed_begin tf_resc_em_usage { 38 uint16_t max_entries; /* Max 16-Bytes entries */ 39 uint16_t used_entries; /* each record takes up to 7 entries by design */ 40 } __rte_packed_end tf_resc_em_usage_t; 41 42 /* Resource Meter */ 43 typedef struct __rte_packed_begin tf_resc_meter_usage { 44 uint16_t max_meter_instance; /* 1023 for Thor, app can reserve some entries */ 45 uint16_t max_meter_profile; /* 256 for Thor, app can reserve some profiles */ 46 uint16_t used_meter_instance; /* meter instance: fixed size record */ 47 uint16_t used_meter_profile; /* meter profile: fixed size record */ 48 } __rte_packed_end tf_resc_meter_usage_t; 49 50 /* Resource Counter */ 51 typedef struct __rte_packed_begin tf_resc_cnt_usage { 52 uint16_t max_entries; /* each counter take 64-Bytes */ 53 uint16_t used_entries; /* each record uses one entry */ 54 } __rte_packed_end tf_resc_cnt_usage_t; 55 56 /* Resource Action */ 57 typedef struct __rte_packed_begin tf_resc_act_usage { 58 uint16_t max_entries; /* Max 8-Bytes entries */ 59 uint16_t num_compact_act_records; /* 8-Bytes records */ 60 uint16_t num_full_act_records; /* 16-Bytes records */ 61 uint16_t free_entries; /* unused entries */ 62 } __rte_packed_end tf_resc_act_usage_t; 63 64 /* Resource SP SMAC */ 65 typedef struct __rte_packed_begin tf_resc_act_sp_smac_usage { 66 uint16_t max_entries; /* Max 8-Bytes entries */ 67 uint16_t num_sp_smac_records; /* 8-Bytes records */ 68 uint16_t num_sp_smac_ipv4_records; /* 8-Bytes records */ 69 uint16_t num_sp_smac_ipv6_records; /* 16-Bytes records */ 70 uint16_t free_entries; /* unused entries */ 71 } __rte_packed_end tf_resc_act_sp_smac_usage_t; 72 73 /* Resource ACT MODIFY and ACT ENCAP */ 74 typedef struct __rte_packed_begin tf_resc_act_mod_enc_usage { 75 uint16_t max_entries; /* Max 8-Bytes entries */ 76 struct { 77 uint16_t num_8b_records; /* 8-bytes records */ 78 uint16_t num_16b_records; /* 16-bytes records */ 79 uint16_t num_32b_records; /* 32-bytes records */ 80 uint16_t num_64b_records; /* 64-bytes records */ 81 uint16_t num_128b_records; /* 128-bytes records */ 82 } data; 83 int16_t free_entries; /* unused entries */ 84 } __rte_packed_end tf_resc_act_mod_enc_usage_t; 85 86 /* All types of resource usage on both direction */ 87 typedef struct __rte_packed_begin cfa_tf_resc_usage { 88 tf_resc_em_usage_t em_int_usage; 89 tf_resc_wc_tcam_usage_t wc_tcam_usage; 90 tf_resc_cnt_usage_t cnt_usage; 91 tf_resc_act_usage_t act_usage; 92 tf_resc_meter_usage_t meter_usage; 93 tf_resc_act_mod_enc_usage_t mod_encap_usage; 94 tf_resc_act_sp_smac_usage_t sp_smac_usage; 95 } __rte_packed_end cfa_tf_resc_usage_t; 96 97 /* global data stored in firmware memory and TruFlow driver */ 98 extern cfa_tf_resc_usage_t tf_resc_usage[TF_DIR_MAX]; 99 100 void tf_resc_usage_reset(struct tf *tfp, enum tf_device_type type); 101 102 void tf_tcam_usage_init(struct tf *tfp); 103 104 int tf_tcam_usage_update(struct tf *tfp, 105 enum tf_dir dir, 106 int tcam_tbl_type, 107 void *key_row, 108 enum tf_resc_opt resc_opt); 109 110 void tf_em_usage_init(struct tf *tfp, enum tf_dir dir, uint16_t max_entries); 111 112 int tf_em_usage_update(struct tf *tfp, 113 enum tf_dir dir, 114 uint16_t size, 115 enum tf_resc_opt resc_opt); 116 117 void tf_tbl_usage_init(struct tf *tfp, 118 enum tf_dir dir, 119 uint32_t tbl_type, 120 uint16_t max_entries); 121 122 int tf_tbl_usage_update(struct tf *tfp, 123 enum tf_dir dir, 124 uint32_t tbl_type, 125 enum tf_resc_opt resc_opt); 126 127 void dump_tf_resc_usage(enum tf_dir dir, void *data, uint32_t size); 128 129 extern struct tf_rm_element_cfg tf_tbl_p58[TF_DIR_MAX][TF_TBL_TYPE_MAX]; 130 131 void tf_resc_pause_usage_update(void); 132 133 void tf_resc_resume_usage_update(void); 134 135 void tf_resc_usage_update_all(struct bnxt *bp); 136 137 #endif /* TF_FLOW_SCALE_QUERY */ 138 139 #endif /* _TF_RESOURCES_H_ */ 140