openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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) */