profile_mem.h (9505B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * Routines for managing HW profile tables. 8 */ 9 10 #ifndef _SOC_PROFILE_MEM_H 11 #define _SOC_PROFILE_MEM_H 12 13 #include <soc/defs.h> 14 #include <soc/mem.h> 15 16 #define SOC_PROFILE_MEM_F_NO_SHARE 0x1 17 #define SOC_PROFILE_MEM_DMA_THRESHHOLD 8 18 #define SOC_PROFILE_MEM_WRITE_DMA_MODE 1 19 #define SOC_PROFILE_MEM_WRITE_PIO_MODE 2 20 21 typedef struct soc_profile_mem_entry_s { 22 uint32 ref_count; /* Reference counters */ 23 int entries_per_set; /* Number of entries per set */ 24 } soc_profile_mem_entry_t; 25 26 typedef struct soc_profile_mem_table_s { 27 soc_mem_t mem; /* Memory id */ 28 int index_min; 29 int index_max; 30 int entry_words; /* Entry word size */ 31 uint32 *data_mask; /* optional entry comparison mask */ 32 soc_profile_mem_entry_t *entries; /* Entry info array */ 33 uint32 *cache_p; /* Pointer to concatenated cached entries */ 34 } soc_profile_mem_table_t; 35 36 typedef struct soc_profile_mem_s { 37 soc_profile_mem_table_t *tables; /* Table info array */ 38 int table_count; /* Number of entries in tables array */ 39 uint32 flags; /* SOC_PROFILE_MEM_F_xxx */ 40 } soc_profile_mem_t; 41 42 typedef struct soc_profile_reg_entry_s { 43 uint32 ref_count; /* Reference counters */ 44 int entries_per_set; /* Number of entries per set */ 45 uint64 *cache_p; /* Pointer to cached entries */ 46 } soc_profile_reg_entry_t; 47 48 #define SOC_PROFILE_FLAG_XPE_SINGLE_ACC 0x1 49 typedef struct soc_profile_reg_s { 50 soc_reg_t *regs; /* Pointer to array of register id */ 51 int regs_count; /* Number of entries in regs */ 52 soc_profile_reg_entry_t *entries; /* Pointer to array of entries */ 53 int profile_flag; /* Profile flag */ 54 } soc_profile_reg_t; 55 56 extern void soc_profile_mem_t_init(soc_profile_mem_t *profile); 57 extern int soc_profile_mem_index_create(int unit, 58 soc_mem_t *mem_array, 59 int *entry_words_array, 60 int *index_min_array, 61 int *index_max_array, 62 void **data_mask_array, 63 int table_count, 64 soc_profile_mem_t *profile); 65 extern int soc_profile_mem_create(int unit, 66 soc_mem_t *mem_array, 67 int *entry_words_array, 68 int table_count, 69 soc_profile_mem_t *profile); 70 extern int soc_profile_mem_destroy(int unit, 71 soc_profile_mem_t *profile); 72 73 extern int soc_profile_mem_add_unique(int unit, 74 soc_profile_mem_t *profile, 75 void **entries_array, 76 int entries_per_set0, 77 int pipe, 78 uint32 *index0); 79 80 extern int soc_profile_mem_add(int unit, 81 soc_profile_mem_t *profile, 82 void **entries, 83 int entries_per_set0, 84 uint32 *index0); 85 86 extern int soc_profile_mem_search(int unit, 87 soc_profile_mem_t *profile, 88 void **entries, 89 int entries_per_set0, 90 uint32 *index0); 91 92 extern int soc_profile_mem_single_table_add(int unit, 93 soc_profile_mem_t *profile, 94 void *entries, 95 int entries_per_set, 96 int *index); 97 extern int soc_profile_mem_delete_unique(int unit, 98 soc_profile_mem_t *profile, 99 uint32 index0, int pipe); 100 extern int soc_profile_mem_delete(int unit, 101 soc_profile_mem_t *profile, 102 uint32 index); 103 extern int soc_profile_mem_set(int unit, 104 soc_profile_mem_t *profile, 105 void **entries_array, 106 uint32 index0); 107 extern int soc_profile_mem_get(int unit, 108 soc_profile_mem_t *profile, 109 int index0, 110 int count, 111 void **entries_array); 112 extern int soc_profile_mem_index_get(int unit, 113 soc_profile_mem_t *profile, 114 soc_mem_t mem, 115 int *index); 116 extern int soc_profile_mem_single_table_get(int unit, 117 soc_profile_mem_t *profile, 118 int index, 119 int count, 120 void *entries); 121 extern int soc_profile_mem_reference_unique(int unit, 122 soc_profile_mem_t *profile, 123 int index0, 124 int entries_per_set0, 125 int pipe); 126 extern int soc_profile_mem_reference(int unit, 127 soc_profile_mem_t *profile, 128 int index0, 129 int entries_per_set0); 130 extern int soc_profile_mem_ref_count_get(int unit, 131 soc_profile_mem_t *profile, 132 int index, int *ref_count); 133 extern int soc_profile_mem_fields32_modify_unique(int unit, 134 soc_profile_mem_t *profile, 135 int table_id, 136 int field_count, 137 soc_field_t *fields, 138 uint32 *values); 139 extern int soc_profile_mem_fields32_modify(int unit, 140 soc_profile_mem_t *profile, 141 int table_id, 142 int field_count, 143 soc_field_t *fields, 144 uint32 *values); 145 extern int soc_profile_mem_field32_modify(int unit, 146 soc_profile_mem_t *profile, 147 int table_id, 148 soc_field_t field, 149 uint32 value); 150 151 extern void soc_profile_reg_t_init(soc_profile_reg_t *profile_reg); 152 extern int soc_profile_reg_create(int unit, 153 soc_reg_t *regs, 154 int regs_count, 155 soc_profile_reg_t *profile_reg); 156 extern int soc_profile_reg_destroy(int unit, 157 soc_profile_reg_t *profile_reg); 158 extern int soc_profile_reg_add(int unit, 159 soc_profile_reg_t *profile_reg, 160 uint64 **entries, 161 int entries_per_set, 162 uint32 *index); 163 extern int soc_profile_reg_delete(int unit, 164 soc_profile_reg_t *profile_reg, 165 uint32 index); 166 extern int soc_profile_reg_get(int unit, 167 soc_profile_reg_t *profile_reg, 168 uint32 index, 169 int count, 170 uint64 **entries); 171 extern int soc_profile_reg_reference(int unit, 172 soc_profile_reg_t *profile_reg, 173 uint32 index, 174 int entries_per_set_override); 175 extern int soc_profile_reg_ref_count_get(int unit, 176 soc_profile_reg_t *profile_reg, 177 uint32 index, int *ref_count); 178 extern int soc_profile_mem_sw_state_set(int unit, soc_profile_mem_t *profile, 179 void **entries_array, int ent_per_set0, 180 uint32 index0); 181 182 extern int soc_profile_mem_write_mode_get(int unit, 183 soc_profile_mem_t *profile, 184 uint32 index0, int *mode); 185 186 /* Macro to get a pointer to the entry at the specified index */ 187 #define SOC_PROFILE_MEM_ENTRY(_unit, _profile_mem, _cast, _index) \ 188 ((_cast)&_profile_mem->tables[0].cache_p[(_index) * _profile_mem->tables[0].entry_words]) 189 190 /* Macro to adjust the ref count at the specifed index. 191 * Positive and negative "_count" values are accepted. 192 */ 193 #define SOC_PROFILE_MEM_REFERENCE(_unit, _profile_mem, _index, _count) \ 194 (_profile_mem->tables[0].entries[_index].ref_count += _count) 195 196 /* Macro to set the number of entries per set */ 197 #define SOC_PROFILE_MEM_ENTRIES_PER_SET(_unit, _profile_mem, _index, _num) \ 198 (_profile_mem->tables[0].entries[_index].entries_per_set = _num) 199 200 #endif /* !_SOC_PROFILE_MEM_H */