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

phymod_util.c (4503B)


      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 #include <phymod/phymod_util.h>
      8 #include <phymod/acc/phymod_tsc_iblk.h>
      9 
     10 
     11 #define BLACKHAWK_DEVICE_MODEL 0x26
     12 #define PMD_DEVICE_MODE_MASK   0x3f
     13 
     14 int phymod_util_lane_config_get(const phymod_access_t *phys, int *start_lane, int *num_of_lane)
     15 {
     16     int i ;
     17     uint32_t val, is_bh = 0;
     18 
     19     /* first read PMD device id */
     20     PHYMOD_IF_ERR_RETURN
     21         (phymod_tscbh_iblk_read(phys, 0x1d100, &val));
     22     if ((val & PMD_DEVICE_MODE_MASK) == BLACKHAWK_DEVICE_MODEL) {
     23         is_bh = 1;
     24     }
     25 
     26     switch (phys->lane_mask) {
     27         case 0x1:
     28             *start_lane = 0;
     29             *num_of_lane = 1;
     30             break;
     31         case 0x2:
     32             *start_lane = 1;
     33             *num_of_lane = 1;
     34             break;
     35         case 0x4:
     36             *start_lane = 2;
     37             *num_of_lane = 1;
     38             break;
     39         case 0x8:
     40             *start_lane = 3;
     41             *num_of_lane = 1;
     42             break;
     43         case 0x3:
     44             *start_lane = 0;
     45             *num_of_lane = 2;
     46             break;
     47         case 0xc:
     48             *start_lane = 2;
     49             *num_of_lane = 2;
     50             break;
     51         case 0x7:
     52             *start_lane = 0;
     53             *num_of_lane = 3;
     54             break;
     55         case 0xf:
     56             *start_lane = 0;
     57             *num_of_lane = 4;
     58             break;
     59         case 0x10:
     60             *start_lane = 4;
     61             *num_of_lane = 1;
     62             break;
     63         case 0x20:
     64             *start_lane = 5;
     65             *num_of_lane = 1;
     66             break;
     67         case 0x40:
     68             *start_lane = 6;
     69             *num_of_lane = 1;
     70             break;
     71         case 0x80:
     72             *start_lane = 7;
     73             *num_of_lane = 1;
     74             break;
     75         case 0x30:
     76             *start_lane = 4;
     77             *num_of_lane = 2;
     78             break;
     79         case 0xc0:
     80             *start_lane = 6;
     81             *num_of_lane = 2;
     82             break;
     83         case 0xf0:
     84             *start_lane = 4;
     85             *num_of_lane = 4;
     86             break;
     87         case 0xff:
     88             *start_lane = 0;
     89             *num_of_lane = 8;
     90             break;
     91         case 0x100:
     92             *start_lane = 8;
     93             *num_of_lane = 1;
     94             break;
     95         case 0x200:
     96             *start_lane = 9;
     97             *num_of_lane = 1;
     98             break;
     99         case 0x400:
    100             *start_lane = 10;
    101             *num_of_lane = 1;
    102             break;
    103         case 0x800:
    104             *start_lane = 11;
    105             *num_of_lane = 1;
    106             break;
    107         case 0x1000:
    108             *start_lane = 12;
    109             *num_of_lane = 1;
    110             break;
    111         case 0x2000:
    112             *start_lane = 13;
    113             *num_of_lane = 1;
    114             break;
    115         case 0x4000:
    116             *start_lane = 14;
    117             *num_of_lane = 1;
    118             break;
    119         case 0x8000:
    120             *start_lane = 15;
    121             *num_of_lane = 1;
    122             break;
    123         default:
    124             /*Support non-consecutive lanes*/
    125             for(i = 0; i < 16; i++)
    126             {
    127                 if(phys->lane_mask & (1 << i))
    128                 {
    129                     *start_lane = i;
    130                     break;
    131                 }
    132             }
    133             if (is_bh) {
    134                 *num_of_lane = 8;
    135             } else {
    136                 *num_of_lane = 4;
    137             }
    138     }
    139     return PHYMOD_E_NONE;
    140 }
    141 
    142 int phymod_core_name_get(const phymod_core_access_t *core,  uint32_t serdes_id, char *core_name, phymod_core_info_t *info)
    143 {
    144     char* rev_char[4]={"A", "B", "C", "D"};
    145     char rev_num[]="7";
    146     uint8_t rev_letter, rev_number;
    147 
    148     info->serdes_id = serdes_id;
    149     rev_letter = (serdes_id & 0xc000) >> 14;
    150     rev_number = (serdes_id & 0x3800) >> 11;
    151     PHYMOD_STRCAT(core_name, rev_char[rev_letter]);
    152     PHYMOD_SNPRINTF(rev_num, 2, "%d", rev_number);
    153     PHYMOD_STRCAT(core_name, rev_num);
    154     PHYMOD_STRNCPY(info->name, core_name, PHYMOD_STRLEN(core_name)+1);
    155 
    156     return PHYMOD_E_NONE;
    157 }
    158 
    159 int phymod_swap_bit(uint16_t original_value, uint16_t *swapped_val)
    160 {
    161     uint16_t new_val, temp_val;
    162     uint16_t i;
    163 
    164     new_val = 0;
    165     for (i = 0; i < 16; i++) {
    166         temp_val = 0x0;
    167         temp_val = (original_value & (0x1 << (15 - i))) >> (15 -i);
    168         temp_val = (temp_val << i) & (0x1 << i);
    169         new_val |= temp_val;
    170    }
    171    *swapped_val = new_val;
    172     return PHYMOD_E_NONE;
    173 }