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 }