mem.c (5401B)
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 * SOC ESW Memory (Table) Utilities 8 */ 9 10 #include <shared/bsl.h> 11 #include <sal/core/libc.h> 12 #include <soc/mem.h> 13 #include <soc/error.h> 14 #include <soc/drv.h> 15 #if defined(BCM_TRIDENT3_SUPPORT) 16 #include <soc/esw/flow_db.h> 17 #endif /* BCM_TRIDENT3_SUPPORT */ 18 19 #if defined(BCM_ESW_SUPPORT) 20 21 22 #ifdef BCM_TRIDENT3_SUPPORT 23 /* 24 * Function: 25 * soc_mem_view_phy_mem_get 26 * Purpose: 27 * Convert a given mem view to physical memory 28 * Parameters: unit - device 29 * view (IN) - mem view 30 * mem (OUT) - physical memory 31 * 32 * Returns: 33 * SOC_E_NONE - conversion succeeded 34 * SOC_E_XXX - other error 35 * Notes: 36 * This internally calls flow db utility functions 37 * to convert given mem view to underlying physical 38 * memory 39 */ 40 int 41 soc_mem_view_phy_mem_get(int unit, 42 soc_mem_t view, 43 soc_mem_t *mem) 44 { 45 int rv = SOC_E_NONE; 46 soc_flow_db_mem_view_info_t view_info; 47 48 if (!mem) return SOC_E_PARAM; 49 50 sal_memset(&view_info, 0x0, sizeof(view_info)); 51 52 rv = soc_flow_db_mem_view_info_get(unit, view, &view_info); 53 if (rv != SOC_E_NONE) { 54 if (rv == SOC_E_PARAM) { 55 #if defined(BCM_ESW_SUPPORT) 56 LOG_CLI((BSL_META("mem view %d is invalid\n"), 57 view)); 58 #endif 59 assert(0); 60 } 61 return rv; 62 } 63 *mem = view_info.mem; 64 return SOC_E_NONE; 65 } 66 67 /* 68 * Function: 69 * soc_mem_view_split_field_info_get 70 * Purpose: 71 * For a given field of a given memory view, 72 * get the split field information: user field width and split position, 73 * the two hardware field info. 74 * Parameters: unit - device 75 * view (IN) - mem view 76 * field (IN) - field 77 * sf_info (OUT) - field information 78 * Returns: 79 * SOC_E_NONE - if the field information is found 80 * SOC_E_XXX - if the field is not found 81 * Notes: 82 * This internally calls flow db utility functions 83 * to find information for a given field 84 */ 85 int soc_mem_view_split_field_info_get(int unit, 86 soc_mem_t view, 87 soc_field_t field, 88 soc_mem_view_split_field_info_t *sf_info) /* split field info */ 89 { 90 soc_flow_db_mem_view_split_field_info_t view_sf_info; 91 int i; 92 93 if (!sf_info) return SOC_E_PARAM; 94 95 sal_memset(&view_sf_info, 0x0, sizeof(view_sf_info)); 96 SOC_IF_ERROR_RETURN(soc_flow_db_mem_view_split_field_info_get(unit, 97 view, field, &view_sf_info)); 98 99 sf_info->num_fld = view_sf_info.num_fld; 100 sf_info->width = view_sf_info.width; 101 for (i = 0; i < sf_info->num_fld; i++) { 102 sf_info->fld[i].field.field = view_sf_info.field[i].field_id; 103 sf_info->fld[i].field.len = view_sf_info.field[i].width; 104 sf_info->fld[i].field.bp = view_sf_info.field[i].offset; 105 sf_info->fld[i].field.flags = view_sf_info.field[i].flags; 106 sf_info->fld[i].v_offset = view_sf_info.field[i].v_offset; 107 } 108 return SOC_E_NONE; 109 } 110 111 /* 112 * Function: 113 * soc_mem_view_fieldinfo_get 114 * Purpose: 115 * For a given field of a given memory view, 116 * get the information about the field - like - 117 * width, offset, flags 118 * Parameters: unit - device 119 * view (IN) - mem view 120 * field (IN) - field 121 * fieldinfo (OUT) - field information 122 * Returns: 123 * SOC_E_NONE - if the field information is found 124 * SOC_E_XXX - if the field is not found 125 * Notes: 126 * This internally calls flow db utility functions 127 * to find information for a given field 128 */ 129 int soc_mem_view_fieldinfo_get(int unit, 130 soc_mem_t view, 131 soc_field_t field, 132 soc_field_info_t *fieldinfo) 133 { 134 int rv = SOC_E_NONE; 135 soc_flow_db_mem_view_field_info_t view_field_info; 136 137 if (!fieldinfo) return SOC_E_PARAM; 138 139 sal_memset(&view_field_info, 0x0, sizeof(view_field_info)); 140 141 rv = soc_flow_db_mem_view_field_info_get(unit, view, field, &view_field_info); 142 if (rv != SOC_E_NONE) { 143 if (rv == SOC_E_NOT_FOUND) { 144 #if defined(BCM_ESW_SUPPORT) 145 /* this print statement can be enhanced to 146 find the physical memory 147 and field (could be logical) */ 148 LOG_CLI((BSL_META("mem view %d field 0x%x is invalid\n"), 149 view, field)); 150 #endif 151 assert(0); 152 } 153 return rv; 154 } 155 156 fieldinfo->field = view_field_info.field_id; 157 fieldinfo->len = view_field_info.width; 158 fieldinfo->bp = view_field_info.offset; 159 fieldinfo->flags = view_field_info.flags; 160 return SOC_E_NONE; 161 } 162 163 /* 164 * Function: 165 * soc_mem_view_field_valid 166 * Purpose: 167 * For a given field of a given memory view, 168 * find out if this is a valid field 169 * Parameters: unit - device 170 * view (IN) - mem view 171 * field (IN) - field 172 * Returns: 173 * 0 - not a valid field 174 * 1 - valid field 175 * Notes: 176 * This internally calls flow db utility functions 177 * to find information for a given field 178 */ 179 int 180 soc_mem_view_field_valid(int unit, 181 soc_mem_t view, 182 soc_field_t field) 183 { 184 return soc_flow_db_mem_view_field_is_valid(unit, view, field); 185 } 186 #endif 187 188 #endif /* defined(BCM_ESW_SUPPORT) */