diff --git a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/platform_lib.c b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/platform_lib.c index 57d05d7608..c70558567c 100644 --- a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/platform_lib.c +++ b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/platform_lib.c @@ -27,6 +27,8 @@ #include #include "platform_lib.h" +#define PSU_MODEL_NAME_LEN 10 + enum onlp_fan_dir onlp_get_fan_dir(int fid) { int len = 0; @@ -79,4 +81,46 @@ int get_pcb_id() pcb_id = (atoi(data) >> 2) & 0xff; return pcb_id; +} + +psu_type_t get_psu_type(int tid, int psu_tid_start, char* modelname, int modelname_len) +{ + int ret = 0; + int pid = 0; + char *node = NULL; + char *mn = NULL; + + pid = (tid - psu_tid_start) < NUM_OF_THERMAL_PER_PSU ? PSU1_ID : PSU2_ID; + + /* Check model name */ + node = (pid == PSU1_ID) ? PSU_SYSFS_NODE(psu1_model) : PSU_SYSFS_NODE(psu2_model); + + ret = onlp_file_read_str(&mn, node); + + if (ret <= 0 || ret > PSU_MODEL_NAME_LEN || mn == NULL) { + AIM_FREE_IF_PTR(mn); + return PSU_TYPE_UNKNOWN; + } + + if (!strncmp(mn, "PS-2601-6R", strlen("PS-2601-6R"))) { + if (modelname) + aim_strlcpy(modelname, mn, strlen(mn) < + (modelname_len-1) ? (strlen(mn)+1) : + (modelname_len-1)); + AIM_FREE_IF_PTR(mn); + + return PSU_TYPE_PS_2601_6R; + } + + if (!strncmp(mn, "DD-2601-6R", strlen("DD-2601-6R"))) { + if (modelname) + aim_strlcpy(modelname, mn, strlen(mn) < + (modelname_len-1) ? (strlen(mn)+1) : + (modelname_len-1)); + AIM_FREE_IF_PTR(mn); + return PSU_TYPE_DD_2601_6R; + } + + AIM_FREE_IF_PTR(mn); + return PSU_TYPE_UNKNOWN; } \ No newline at end of file diff --git a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/platform_lib.h b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/platform_lib.h index a0a324bd17..806fb1d427 100644 --- a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/platform_lib.h +++ b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/platform_lib.h @@ -43,8 +43,16 @@ #define SYS_LED_PATH "/sys/devices/platform/as7535_28xb_led/" #define IDPROM_PATH "/sys/devices/platform/as7535_28xb_sys/eeprom" +#define PSU_SYSFS_NODE(node) PSU_SYSFS_PATH#node + int get_pcb_id(); +typedef enum psu_type { + PSU_TYPE_PS_2601_6R = 0, + PSU_TYPE_DD_2601_6R, + PSU_TYPE_UNKNOWN, +} psu_type_t; + enum onlp_thermal_id { THERMAL_RESERVED = 0, THERMAL_CPU_CORE, @@ -81,6 +89,7 @@ enum onlp_fan_dir { }; enum onlp_fan_dir onlp_get_fan_dir(int fid); +psu_type_t get_psu_type(int tid, int psu_tid_start, char* modelname, int modelname_len); #define AIM_FREE_IF_PTR(p) \ do \ diff --git a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/thermali.c b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/thermali.c index 4b2ef9e1d0..019700bd8e 100644 --- a/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/thermali.c +++ b/packages/platforms/accton/x86-64/as7535-28xb/onlp/builds/x86_64_accton_as7535_28xb/module/src/thermali.c @@ -88,31 +88,31 @@ static onlp_thermal_info_t tinfo[] = { { }, /* Not used */ { { ONLP_THERMAL_ID_CREATE(THERMAL_CPU_CORE), "CPU Core", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {94000, 100000, 103000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_1_ON_MAIN_BROAD), "LM75-4B", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {74000, 79000, 84000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_2_ON_MAIN_BROAD), "TMP431_0x4C_U50", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {84000, 89000, 94000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_3_ON_MAIN_BROAD), "TMP431_0x4C_MAC", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {97000, 102000, 107000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_4_ON_MAIN_BROAD), "LM75-4D", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {87000, 92000, 97000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_5_ON_MAIN_BROAD), "LM75-4E", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {80000, 85000, 90000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_6_ON_MAIN_BROAD), "LM75-4F", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {80000, 85000, 90000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_1_ON_PSU1), "PSU-1 Thermal Sensor 1", ONLP_PSU_ID_CREATE(PSU1_ID), {0} }, ONLP_THERMAL_STATUS_PRESENT, @@ -145,39 +145,39 @@ static onlp_thermal_info_t tinfo_r02[] = { { }, /* Not used */ { { ONLP_THERMAL_ID_CREATE(THERMAL_CPU_CORE), "CPU Core", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {94000, 100000, 103000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_1_ON_MAIN_BROAD), "LM75-4B", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {74000, 79000, 84000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_2_ON_MAIN_BROAD), "TMP431_0x4C_U50", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {84000, 89000, 94000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_3_ON_MAIN_BROAD), "TMP431_0x4C_MAC", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {97000, 102000, 107000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_4_ON_MAIN_BROAD), "LM75-4D", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {87000, 92000, 97000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_5_ON_MAIN_BROAD), "LM75-4E", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {80000, 85000, 90000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_6_ON_MAIN_BROAD), "LM75-4F", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {80000, 85000, 90000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_7_ON_MAIN_BROAD), "TMP431_0x4C_U93", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {82000, 87000, 92000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_8_ON_MAIN_BROAD), "TMP431_0x4C_C10", 0, {0} }, ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_ALL, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS + ONLP_THERMAL_CAPS_ALL, 0, {102000, 107000, 112000} }, { { ONLP_THERMAL_ID_CREATE(THERMAL_1_ON_PSU1), "PSU-1 Thermal Sensor 1", ONLP_PSU_ID_CREATE(PSU1_ID), {0} }, ONLP_THERMAL_STATUS_PRESENT, @@ -205,6 +205,34 @@ static onlp_thermal_info_t tinfo_r02[] = { } }; +typedef struct threshold_t { + int warning; + int error; + int shutdown; +} threshold_t; + +threshold_t threshold[CHASSIS_PSU_COUNT][NUM_OF_THERMAL_PER_PSU] = { + [PSU_TYPE_PS_2601_6R][0].warning = 85000, + [PSU_TYPE_PS_2601_6R][0].error = 90000, + [PSU_TYPE_PS_2601_6R][0].shutdown = 95000, + [PSU_TYPE_PS_2601_6R][1].warning = 110000, + [PSU_TYPE_PS_2601_6R][1].error = 115000, + [PSU_TYPE_PS_2601_6R][1].shutdown = 120000, + [PSU_TYPE_PS_2601_6R][2].warning = 95000, + [PSU_TYPE_PS_2601_6R][2].error = 100000, + [PSU_TYPE_PS_2601_6R][2].shutdown = 105000, + + [PSU_TYPE_DD_2601_6R][0].warning = 80000, + [PSU_TYPE_DD_2601_6R][0].error = 103000, + [PSU_TYPE_DD_2601_6R][0].shutdown = 105000, + [PSU_TYPE_DD_2601_6R][1].warning = 82500, + [PSU_TYPE_DD_2601_6R][1].error = 105500, + [PSU_TYPE_DD_2601_6R][1].shutdown = 107500, + [PSU_TYPE_DD_2601_6R][2].warning = 85000, + [PSU_TYPE_DD_2601_6R][2].error = 108000, + [PSU_TYPE_DD_2601_6R][2].shutdown = 110000, +}; + /* * This will be called to intiialize the thermali subsystem. */ @@ -231,13 +259,37 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info) VALIDATE(id); int pcb_id = 0; + psu_type_t psu_mod_type = 0; + int psu_temp_idx = 0, psu_tid_start = 0; + int thermal_cnt = 0; + tid = ONLP_OID_ID_GET(id); pcb_id = get_pcb_id(); - if (pcb_id == 1) + + if (pcb_id == 1) { *info = tinfo_r02[tid]; - else + thermal_cnt = CHASSIS_THERMAL_COUNT_R02; + } + else { *info = tinfo[tid]; + thermal_cnt = CHASSIS_THERMAL_COUNT; + } + + psu_tid_start = thermal_cnt + 1; + + /*Assign psu temperature threshold value*/ + if( tid >= psu_tid_start ) { + psu_mod_type = get_psu_type(tid, psu_tid_start, NULL, 0); + + if( psu_mod_type != PSU_TYPE_UNKNOWN ) + { + psu_temp_idx = ( tid - psu_tid_start ) % NUM_OF_THERMAL_PER_PSU; /*0~2*/ + info->thresholds.warning = threshold[psu_mod_type][psu_temp_idx].warning; + info->thresholds.error = threshold[psu_mod_type][psu_temp_idx].error; + info->thresholds.shutdown = threshold[psu_mod_type][psu_temp_idx].shutdown; + } + } if (tid == THERMAL_CPU_CORE) { return onlp_file_read_int_max(&info->mcelsius, cpu_coretemp_files);