From 04e5a741bbd2dde20d9541c30a027b03c21e3d04 Mon Sep 17 00:00:00 2001 From: wanda Date: Thu, 3 Jan 2019 16:15:10 +0800 Subject: [PATCH] update d5254 for onlp --- .../onlp/builds/src/module/src/fani.c | 399 ++++--- .../onlp/builds/src/module/src/ledi.c | 575 ++++----- .../onlp/builds/src/module/src/platform_lib.c | 8 +- .../onlp/builds/src/module/src/platform_lib.h | 82 +- .../onlp/builds/src/module/src/psui.c | 190 ++- .../onlp/builds/src/module/src/sfpi.c | 418 ++++--- .../onlp/builds/src/module/src/sysi.c | 1040 +++-------------- .../onlp/builds/src/module/src/thermali.c | 174 +-- 8 files changed, 1020 insertions(+), 1866 deletions(-) diff --git a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/fani.c b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/fani.c index e2b1c221..68dc6548 100644 --- a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/fani.c +++ b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/fani.c @@ -27,179 +27,56 @@ #include #include #include +#include #include "platform_lib.h" #define VALIDATE(_id) \ do { \ - if(!ONLP_OID_IS_FAN(_id)) { \ + if(!ONLP_OID_IS_FAN(_id)) { \ return ONLP_STATUS_E_INVALID; \ } \ } while(0) +#define SLOW_PWM 100 +#define NORMAL_PWM 175 +#define MAX_PWM 255 +#define STEP_SIZE 100 +#define FAN_ON_MAIN_BOARD_COUNT 5 +#define LOCAL_ID_TO_PSU_ID(id) (id-FAN_ON_MAIN_BOARD_COUNT) +#define FAN_CAPS ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE -typedef struct fani_info_s { - int slow_pwm; - int normal_pwm; - int max_pwm; - int step_size; - char input_file[ONLP_CONFIG_INFO_STR_MAX]; - char pwm_file[ONLP_CONFIG_INFO_STR_MAX]; -} fani_info_t; +static int _fani_status_failed_check(uint32_t* status, int local_id); +static int _fani_status_present_check(uint32_t* status, int local_id); - -static fani_info_t __info_list[ONLP_FAN_COUNT] = { - {}, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan1_input", - "/sys/class/hwmon/hwmon1/device/pwm1" - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan3_input", - "/sys/class/hwmon/hwmon1/device/pwm2" - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan5_input", - "/sys/class/hwmon/hwmon1/device/pwm3" - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan7_input", - "/sys/class/hwmon/hwmon1/device/pwm4" - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan9_input", - "/sys/class/hwmon/hwmon1/device/pwm5" /*sync with pwm1*/ - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan2_input", - "/sys/class/hwmon/hwmon1/device/pwm1" - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan4_input", - "/sys/class/hwmon/hwmon1/device/pwm2" - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan6_input", - "/sys/class/hwmon/hwmon1/device/pwm3" - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan8_input", - "/sys/class/hwmon/hwmon1/device/pwm4" - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/fan10_input", - "/sys/class/hwmon/hwmon1/device/pwm5" /*sync with pwm1*/ - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/rpm_psu1", - "/sys/class/hwmon/hwmon1/device/pwm_psu1" - }, - { - 100,175,255,100, - "/sys/class/hwmon/hwmon1/device/rpm_psu2", - "/sys/class/hwmon/hwmon1/device/pwm_psu2" +#define MAKE_FAN_INFO_NODE_ON_FAN_BOARD(id) \ + { \ + { \ + ONLP_FAN_ID_CREATE(ONLP_FAN_##id), "Fan "#id, 0, \ + { \ + ONLP_LED_ID_CREATE(ONLP_LED_FAN##id), \ + } \ + }, \ + 0, 0 \ } -}; + +#define MAKE_FAN_INFO_NODE_ON_PSU(psu_id) \ + { \ + { ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_##psu_id), "PSU-"#psu_id" Fan", ONLP_PSU_ID_CREATE(ONLP_PSU_##psu_id)}, \ + 0, 0 \ + } + /* Static values */ static onlp_fan_info_t __onlp_fan_info[ONLP_FAN_COUNT] = { - { }, /* Not used */ - { { - ONLP_FAN_ID_CREATE(ONLP_FAN_1), "Fan 1", 0, - { - ONLP_FAN_ID_CREATE(ONLP_FAN_1_WEAK), - ONLP_LED_ID_CREATE(ONLP_LED_FAN1_GREEN), - ONLP_LED_ID_CREATE(ONLP_LED_FAN1_RED) - } - }, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { - ONLP_FAN_ID_CREATE(ONLP_FAN_2), "Fan 2", 0, - { - ONLP_FAN_ID_CREATE(ONLP_FAN_2_WEAK), - ONLP_LED_ID_CREATE(ONLP_LED_FAN2_GREEN), - ONLP_LED_ID_CREATE(ONLP_LED_FAN2_RED) - } - }, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { - ONLP_FAN_ID_CREATE(ONLP_FAN_3), "Fan 3", 0, - { - ONLP_FAN_ID_CREATE(ONLP_FAN_3_WEAK), - ONLP_LED_ID_CREATE(ONLP_LED_FAN3_GREEN), - ONLP_LED_ID_CREATE(ONLP_LED_FAN3_RED) - } - }, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { - ONLP_FAN_ID_CREATE(ONLP_FAN_4), "Fan 4", 0, - { - ONLP_FAN_ID_CREATE(ONLP_FAN_4_WEAK), - ONLP_LED_ID_CREATE(ONLP_LED_FAN4_GREEN), - ONLP_LED_ID_CREATE(ONLP_LED_FAN4_RED) - } - }, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { - ONLP_FAN_ID_CREATE(ONLP_FAN_5), "Fan 5", 0, - { - ONLP_FAN_ID_CREATE(ONLP_FAN_5_WEAK), - ONLP_LED_ID_CREATE(ONLP_LED_FAN5_GREEN), - ONLP_LED_ID_CREATE(ONLP_LED_FAN5_RED) - } - }, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { ONLP_FAN_ID_CREATE(ONLP_FAN_1_WEAK), "Fan 1 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_1)}, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - - { { ONLP_FAN_ID_CREATE(ONLP_FAN_2_WEAK), "Fan 2 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_2)}, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { ONLP_FAN_ID_CREATE(ONLP_FAN_3_WEAK), "Fan 3 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_3)}, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { ONLP_FAN_ID_CREATE(ONLP_FAN_4_WEAK), "Fan 4 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_4)}, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { ONLP_FAN_ID_CREATE(ONLP_FAN_5_WEAK), "Fan 5 WEAK", ONLP_FAN_ID_CREATE(ONLP_FAN_5)}, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_1), "PSU-1 Fan", ONLP_PSU_ID_CREATE(ONLP_PSU_1)}, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - }, - { { ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_2), "PSU-2 Fan", ONLP_PSU_ID_CREATE(ONLP_PSU_2)}, - ONLP_FAN_STATUS_PRESENT|ONLP_FAN_STATUS_F2B, - ONLP_FAN_CAPS_F2B|ONLP_FAN_CAPS_GET_RPM|ONLP_FAN_CAPS_GET_PERCENTAGE - } + MAKE_FAN_INFO_NODE_ON_FAN_BOARD(1), + MAKE_FAN_INFO_NODE_ON_FAN_BOARD(2), + MAKE_FAN_INFO_NODE_ON_FAN_BOARD(3), + MAKE_FAN_INFO_NODE_ON_FAN_BOARD(4), + MAKE_FAN_INFO_NODE_ON_FAN_BOARD(5), + MAKE_FAN_INFO_NODE_ON_PSU(1), + MAKE_FAN_INFO_NODE_ON_PSU(2), }; @@ -217,42 +94,176 @@ onlp_fani_info_get(onlp_oid_t id, onlp_fan_info_t* info) { int rv = ONLP_STATUS_OK; int local_id; - int pwm; + int lrpm, rrpm, pwm, psu_id; VALIDATE(id); + pwm = 0; local_id = ONLP_OID_ID_GET(id); if(local_id >= ONLP_FAN_MAX) { rv = ONLP_STATUS_E_INVALID; } - - if( ONLP_STATUS_OK == rv) { - *info = __onlp_fan_info[local_id]; - rv = onlp_file_read_int(&info->rpm, __info_list[local_id].input_file); + if(rv ==ONLP_STATUS_OK) { + *info = __onlp_fan_info[LOCAL_ID_TO_INFO_IDX(local_id)]; + rv = onlp_fani_status_get(id, &info->status); } - if(ONLP_STATUS_OK == rv) { - rv = onlp_file_read_int(&pwm, __info_list[local_id].pwm_file); - } + if(rv == ONLP_STATUS_OK) { + if(info->status & ONLP_FAN_STATUS_PRESENT) { + switch(local_id) { + case ONLP_FAN_1: + case ONLP_FAN_2: + case ONLP_FAN_3: + case ONLP_FAN_4: + case ONLP_FAN_5: + if(info->status & ONLP_FAN_STATUS_F2B) { + info->caps = FAN_CAPS|ONLP_FAN_CAPS_F2B; + } else if(info->status & ONLP_FAN_STATUS_B2F) { + info->caps = FAN_CAPS|ONLP_FAN_CAPS_B2F; + } else { + info->caps = FAN_CAPS; + } - if( ONLP_STATUS_OK == rv) { - if(0 == info->rpm) { - info->mode = ONLP_FAN_MODE_OFF; - } else if(pwm < __info_list[local_id].slow_pwm) { - info->mode = ONLP_FAN_MODE_SLOW; - } else if(pwm < __info_list[local_id].normal_pwm) { - info->mode = ONLP_FAN_MODE_NORMAL; - } else if(pwm < __info_list[local_id].max_pwm) { - info->mode = ONLP_FAN_MODE_FAST; + rv = onlp_file_read_int(&lrpm, INV_HWMON_PREFIX"fan%d_input", local_id*2-1); + if(rv != ONLP_STATUS_OK ) { return rv; } + rv = onlp_file_read_int(&rrpm, INV_HWMON_PREFIX"fan%d_input", local_id*2); + if(rv != ONLP_STATUS_OK ) { return rv; } + rv = onlp_file_read_int(&pwm,INV_HWMON_PREFIX"pwm%d", local_id); + if(rv != ONLP_STATUS_OK ) { return rv; } + + if(lrpm <=0 && rrpm <=0) { + info->rpm = 0; + } else if(lrpm <= 0) { + info->rpm = rrpm; + } else if(rrpm <= 0) { + info->rpm = lrpm; + } else { + info->rpm = (lrpm+rrpm)/2; + } + + break; + case ONLP_FAN_PSU_1: + case ONLP_FAN_PSU_2: + info->caps = FAN_CAPS|ONLP_FAN_CAPS_F2B; + psu_id = LOCAL_ID_TO_PSU_ID(local_id); + rv = onlp_file_read_int(&info->rpm,INV_HWMON_PREFIX"rpm_psu%d", psu_id); + if(rv != ONLP_STATUS_OK) { return rv; } + rv = onlp_file_read_int(&pwm, INV_HWMON_PREFIX"pwm_psu%d", psu_id); + if(rv != ONLP_STATUS_OK) { return rv; } + break; + default: + rv = ONLP_STATUS_E_INVALID; + break; + } + if(rv == ONLP_STATUS_OK) { + if(info->rpm <= 0) { + info->mode = ONLP_FAN_MODE_OFF; + info->percentage = 0; + } else { + info->percentage = (pwm*100)/MAX_PWM; + if(pwm < SLOW_PWM) { + info->mode = ONLP_FAN_MODE_SLOW; + } else if(pwm < NORMAL_PWM) { + info->mode = ONLP_FAN_MODE_NORMAL; + } else if(pwm < MAX_PWM) { + info->mode = ONLP_FAN_MODE_FAST; + } else { + info->mode = ONLP_FAN_MODE_MAX; + } + } + } } else { - info->mode = ONLP_FAN_MODE_MAX; + info->caps = 0; + info->rpm = 0; + info->percentage = 0; + info->mode = ONLP_FAN_MODE_OFF; } - - info->percentage = (pwm*100)/__info_list[local_id].max_pwm; snprintf(info->model, ONLP_CONFIG_INFO_STR_MAX, "NA"); snprintf(info->serial, ONLP_CONFIG_INFO_STR_MAX, "NA"); } return rv; } +static int _fani_status_failed_check(uint32_t* status, int local_id) +{ + int rv; + int lrpm, rrpm, rpm, pwm, psu_id; + switch(local_id) { + case ONLP_FAN_1: + case ONLP_FAN_2: + case ONLP_FAN_3: + case ONLP_FAN_4: + case ONLP_FAN_5: + rv = onlp_file_read_int(&lrpm, INV_HWMON_PREFIX"fan%d_input", local_id*2-1); + if(rv != ONLP_STATUS_OK ) { return rv; } + rv = onlp_file_read_int(&rrpm, INV_HWMON_PREFIX"fan%d_input", local_id*2); + if(rv != ONLP_STATUS_OK ) { return rv; } + rv = onlp_file_read_int(&pwm,INV_HWMON_PREFIX"pwm%d", local_id); + if(rv != ONLP_STATUS_OK ) { return rv; } + + if( lrpm <= 0 || rrpm <=0 || pwm <=0 || pwm > MAX_PWM) { + *status |= ONLP_FAN_STATUS_FAILED; + *status &= (~ONLP_FAN_STATUS_B2F); + *status &= (~ONLP_FAN_STATUS_F2B); + } else { + *status &= (~ONLP_FAN_STATUS_FAILED); + } + break; + case ONLP_FAN_PSU_1: + case ONLP_FAN_PSU_2: + psu_id = LOCAL_ID_TO_PSU_ID(local_id); + rv = onlp_file_read_int(&rpm, INV_HWMON_PREFIX"rpm_psu%d", psu_id); + if(rv != ONLP_STATUS_OK ) { return rv; } + rv = onlp_file_read_int(&pwm, INV_HWMON_PREFIX"pwm_psu%d", psu_id); + if(rv != ONLP_STATUS_OK ) { return rv; } + + if( rpm <= 0 || pwm <=0 || pwm > MAX_PWM) { + *status |= ONLP_FAN_STATUS_FAILED; + *status &= (~ONLP_FAN_STATUS_B2F); + *status &= (~ONLP_FAN_STATUS_F2B); + } else { + *status &= (~ONLP_FAN_STATUS_FAILED); + } + break; + default: + rv = ONLP_STATUS_E_INVALID; + break; + } + return rv; +} + +static int _fani_status_present_check(uint32_t* status, int local_id) +{ + int rv; + int gpi; + int info_idx; + int len; + char buf[ONLP_CONFIG_INFO_STR_MAX]; + if(local_id >= ONLP_FAN_1 && local_id <= ONLP_FAN_4){ + info_idx = LOCAL_ID_TO_INFO_IDX(local_id); + rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, INV_HWMON_PREFIX"fan_gpi"); + }else if(local_id == ONLP_FAN_5){ + info_idx = LOCAL_ID_TO_INFO_IDX(local_id)-ONLP_FAN_4; + rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, INV_HWMON_PREFIX"fan_gpi2"); + }else{ + rv = ONLP_STATUS_E_INVALID; + } + if( rv == ONLP_STATUS_OK ) { + sscanf( buf, "0x%x\n", &gpi); + /* B[0-3] installed(0)/uninstalled(1) + B[4-7] FRtype(0)/RFtype(1) */ + if (!((gpi>>info_idx) & 1)) { + *status |= ONLP_FAN_STATUS_PRESENT; + if (!((gpi>>(info_idx+4)) & 1)) { + *status |= ONLP_FAN_STATUS_F2B; + } else { + *status |= ONLP_FAN_STATUS_B2F; + } + } else { + *status = 0; + } + } + return rv; +} + /** * @brief Retrieve the fan's operational status. @@ -267,12 +278,42 @@ int onlp_fani_status_get(onlp_oid_t id, uint32_t* rv) onlp_fan_info_t* info; int local_id; VALIDATE(id); + uint32_t psu_status; local_id = ONLP_OID_ID_GET(id); if(local_id >= ONLP_FAN_MAX) { result = ONLP_STATUS_E_INVALID; } else { - info = &__onlp_fan_info[local_id]; + info = &__onlp_fan_info[LOCAL_ID_TO_INFO_IDX(local_id)]; + switch(local_id) { + case ONLP_FAN_1: + case ONLP_FAN_2: + case ONLP_FAN_3: + case ONLP_FAN_4: + case ONLP_FAN_5: + result = _fani_status_present_check(&info->status, local_id); + if (result == ONLP_STATUS_OK ) { + if (info->status & ONLP_FAN_STATUS_PRESENT) { + result = _fani_status_failed_check(&info->status, local_id); + } + } + break; + case ONLP_FAN_PSU_1: + case ONLP_FAN_PSU_2: + result = onlp_psui_status_get((&info->hdr)->poid, &psu_status); + if(result != ONLP_STATUS_OK) { return result; } + + if(psu_status & ONLP_PSU_STATUS_PRESENT) { + info->status |= ONLP_FAN_STATUS_PRESENT; + result = _fani_status_failed_check(&info->status, local_id); + } else { + info->status = 0; + } + break; + default: + result = ONLP_STATUS_E_INVALID; + break; + } *rv = info->status; } return result; @@ -294,7 +335,7 @@ int onlp_fani_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* hdr) if(local_id >= ONLP_FAN_MAX) { result = ONLP_STATUS_E_INVALID; } else { - info = &__onlp_fan_info[local_id]; + info = &__onlp_fan_info[LOCAL_ID_TO_INFO_IDX(local_id)]; *hdr = info->hdr; } return result; diff --git a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/ledi.c b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/ledi.c index 4781ca37..a18c328d 100644 --- a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/ledi.c +++ b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/ledi.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "platform_lib.h" @@ -43,365 +44,193 @@ */ /* CAPS*/ -#define CPLD_LED_GREEN_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_GREEN|ONLP_LED_CAPS_GREEN_BLINKING -#define CPLD_LED_RED_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_RED|ONLP_LED_CAPS_RED_BLINKING -#define PSOC_LED_GREEN_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_GREEN -#define PSOC_LED_RED_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_RED +#define SYS_LED_CAPS ONLP_LED_CAPS_ON_OFF|ONLP_LED_CAPS_GREEN|ONLP_LED_CAPS_GREEN_BLINKING| \ + ONLP_LED_CAPS_RED|ONLP_LED_CAPS_RED_BLINKING|ONLP_LED_CAPS_ORANGE +#define FAN_LED_CAPS ONLP_LED_CAPS_RED|ONLP_LED_CAPS_GREEN +#define LOCAL_ID_TO_FAN_ID(id) (id-1) -typedef enum platform_led_color_e { - PLATFORM_LED_COLOR_NONE, - PLATFORM_LED_COLOR_RED, - PLATFORM_LED_COLOR_GREEN, - PLATFORM_LED_COLOR_ANY, - PLATFORM_LED_COLOR_MAX -} platform_led_color_t; - -typedef enum cpld_led_mode_e { - CPLD_LED_MODE_OFF = 0, - CPLD_LED_MODE_0_5_HZ = 1, - CPLD_LED_MODE_1_HZ = 2, - CPLD_LED_MODE_2_HZ = 3, - CPLD_LED_MODE_ON = 7 -} cpld_led_mode_t; - -typedef enum led_driver_mode_e { - LED_DRIVER_MODE_NONE, - LED_DRIVER_MODE_CPLD, - LED_DRIVER_MODE_PSOC -} led_driver_mode_t; - - -typedef struct ledi_info_s { - platform_led_color_t color; - led_driver_mode_t driver; - char file[ONLP_CONFIG_INFO_STR_MAX]; -} ledi_info_t; +typedef enum sys_led_mode_e { + SYS_LED_MODE_OFF = 0, + SYS_LED_MODE_0_5_HZ = 1, + SYS_LED_MODE_1_HZ = 2, + SYS_LED_MODE_2_HZ = 3, + SYS_LED_MODE_ON = 7 +} sys_led_mode_t; /* function declarations*/ -static onlp_led_mode_t _cpld_onlp_led_mode_convert(platform_led_color_t color, cpld_led_mode_t mode); -static int _onlp_cpld_led_mode_convert(onlp_led_mode_t onlp_led_mode, platform_led_color_t *pcolor, cpld_led_mode_t *pmode); -static int _cpld_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info); -static int _psoc_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info); -static int _cpld_onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t onlp_mode); -static int _psoc_onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t onlp_mode); - -static ledi_info_t __info_list[ONLP_LED_COUNT] = { - {}, - {PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_CPLD, "/sys/bus/i2c/devices/0-0055*grn_led"}, - {PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_CPLD, "/sys/bus/i2c/devices/0-0055*red_led"}, - {PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn1"}, - {PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red1"}, - {PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn2"}, - {PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red2"}, - {PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn3"}, - {PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red3"}, - {PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn4"}, - {PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red4"}, - {PLATFORM_LED_COLOR_GREEN, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_grn5"}, - {PLATFORM_LED_COLOR_RED, LED_DRIVER_MODE_PSOC,"/sys/bus/i2c/devices/0-0066*fan_led_red5"}, -}; - +static int _sys_onlp_led_mode_convert(sys_led_mode_t grn_mode, sys_led_mode_t red_mode, onlp_led_mode_t* pmode); +static int _sys_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info); +static int _fan_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info); +static int _sys_onlp_ledi_mode_set(onlp_led_mode_t onlp_mode); /* * Get the information for the given LED OID. */ +#define MAKE_MGMT_LED_INFO_NODE \ + { \ + { ONLP_LED_ID_CREATE(ONLP_LED_MGMT), "MGMT LED" , 0 }, \ + ONLP_LED_STATUS_PRESENT, \ + SYS_LED_CAPS, \ + } + +#define MAKE_LED_INFO_NODE_ON_FAN(fan_id) \ + { \ + { ONLP_LED_ID_CREATE(ONLP_LED_FAN##fan_id), \ + "FAN LED "#fan_id, \ + ONLP_FAN_ID_CREATE(ONLP_FAN_##fan_id) \ + }, \ + 0, \ + 0, \ + } + static onlp_led_info_t __onlp_led_info[ONLP_LED_COUNT] = { - { }, /* Not used */ - { - { ONLP_LED_ID_CREATE(ONLP_LED_MGMT_GREEN), "MGMT LED GREEN", 0 }, - ONLP_LED_STATUS_PRESENT, - CPLD_LED_GREEN_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_MGMT_RED), "MGMT LED RED", 0 }, - ONLP_LED_STATUS_PRESENT, - CPLD_LED_RED_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN1_GREEN), "FAN LED 1 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_1) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_GREEN_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN1_RED), "FAN LED 1 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_1) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_RED_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN2_GREEN), "FAN LED 2 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_2) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_GREEN_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN2_RED), "FAN LED 2 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_2) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_RED_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN3_GREEN), "FAN LED 3 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_3) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_GREEN_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN3_RED), "FAN LED 3 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_3) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_RED_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN4_GREEN), "FAN LED 4 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_4) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_GREEN_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN4_RED), "FAN LED 4 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_4) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_RED_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN5_GREEN), "FAN LED 5 GREEN", ONLP_FAN_ID_CREATE(ONLP_FAN_5) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_GREEN_CAPS, - }, - { - { ONLP_LED_ID_CREATE(ONLP_LED_FAN5_RED), "FAN LED 5 RED", ONLP_FAN_ID_CREATE(ONLP_FAN_5) }, - ONLP_LED_STATUS_PRESENT, - PSOC_LED_RED_CAPS, - }, + MAKE_MGMT_LED_INFO_NODE, + MAKE_LED_INFO_NODE_ON_FAN(1), + MAKE_LED_INFO_NODE_ON_FAN(2), + MAKE_LED_INFO_NODE_ON_FAN(3), + MAKE_LED_INFO_NODE_ON_FAN(4), + MAKE_LED_INFO_NODE_ON_FAN(5), }; + /* convert platform led type to onlp_led_mode type*/ -static onlp_led_mode_t _cpld_onlp_led_mode_convert(platform_led_color_t color, cpld_led_mode_t mode) -{ - onlp_led_mode_t ret = ONLP_LED_MODE_OFF; - - /* First select the basic state */ - switch(mode) { - case CPLD_LED_MODE_0_5_HZ: - case CPLD_LED_MODE_1_HZ: - case CPLD_LED_MODE_2_HZ: - ret = ONLP_LED_MODE_BLINKING; - break; - case CPLD_LED_MODE_ON: - ret = ONLP_LED_MODE_ON; - break; - case CPLD_LED_MODE_OFF: - default: - ret = ONLP_LED_MODE_OFF; - break; - } - if (ret != ONLP_LED_MODE_OFF) { - /* Add shift to color */ - switch(color) { - case PLATFORM_LED_COLOR_RED: - ret += (ONLP_LED_MODE_RED - ONLP_LED_MODE_ON); - break; - case PLATFORM_LED_COLOR_GREEN: - ret += (ONLP_LED_MODE_GREEN - ONLP_LED_MODE_ON); - break; - default: - break; - } - } - return ret; -} - -static int _onlp_cpld_led_mode_convert(onlp_led_mode_t onlp_led_mode, platform_led_color_t *pcolor, cpld_led_mode_t *pmode) +static int _sys_onlp_led_mode_convert(sys_led_mode_t grn_mode, sys_led_mode_t red_mode, onlp_led_mode_t* pmode) { int rv = ONLP_STATUS_OK; - switch(onlp_led_mode) { - case ONLP_LED_MODE_OFF: - *pcolor = PLATFORM_LED_COLOR_ANY; - *pmode = CPLD_LED_MODE_OFF; - break; - case ONLP_LED_MODE_ON: - *pcolor = PLATFORM_LED_COLOR_ANY; - *pmode = CPLD_LED_MODE_ON; - break; - case ONLP_LED_MODE_BLINKING: - *pcolor = PLATFORM_LED_COLOR_ANY; - *pmode = CPLD_LED_MODE_1_HZ; - break; - case ONLP_LED_MODE_RED: - *pcolor = PLATFORM_LED_COLOR_RED; - *pmode = CPLD_LED_MODE_ON; - break; - case ONLP_LED_MODE_RED_BLINKING: - /* cannot determine the blink level currently, just choose 1Hz*/ - *pcolor = PLATFORM_LED_COLOR_RED; - *pmode = CPLD_LED_MODE_1_HZ; - break; - case ONLP_LED_MODE_GREEN: - *pcolor = PLATFORM_LED_COLOR_GREEN; - *pmode = CPLD_LED_MODE_ON; - break; - case ONLP_LED_MODE_GREEN_BLINKING: - /* cannot determine the blink level currently, just choose 1Hz*/ - *pcolor = PLATFORM_LED_COLOR_GREEN; - *pmode = CPLD_LED_MODE_1_HZ; - break; + *pmode = ONLP_LED_MODE_OFF; + switch(grn_mode) { + case SYS_LED_MODE_0_5_HZ: + case SYS_LED_MODE_1_HZ: + case SYS_LED_MODE_2_HZ: + *pmode = ONLP_LED_MODE_GREEN_BLINKING; + break; + case SYS_LED_MODE_ON: + *pmode = ONLP_LED_MODE_GREEN; + break; + case SYS_LED_MODE_OFF: + *pmode = ONLP_LED_MODE_OFF; + break; default: - rv = ONLP_STATUS_E_INVALID; + return ONLP_STATUS_E_INVALID; break; } - return rv; -} - - -static int _cpld_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info) -{ - int local_id; - int rv = ONLP_STATUS_OK; - platform_led_color_t color; - cpld_led_mode_t mode; - - local_id = ONLP_OID_ID_GET(id); - - /* Set the onlp_oid_hdr_t and capabilities */ - *info = __onlp_led_info[local_id]; - - color = __info_list[local_id].color; - - rv = onlp_file_read_int((int*)&mode, __info_list[local_id].file); - - if( ONLP_STATUS_OK == rv ) { - info->mode = _cpld_onlp_led_mode_convert(color, mode); - - /* Set the on/off status */ - if (info->mode != ONLP_LED_MODE_OFF) { - info->status |= ONLP_LED_STATUS_ON; + switch(red_mode) { + case SYS_LED_MODE_0_5_HZ: + case SYS_LED_MODE_1_HZ: + case SYS_LED_MODE_2_HZ: + if(grn_mode == SYS_LED_MODE_OFF) { + *pmode = ONLP_LED_MODE_RED_BLINKING; } else { - info->status &= (~ONLP_LED_STATUS_ON); + return ONLP_STATUS_E_INVALID; } + break; + case SYS_LED_MODE_ON: + if(grn_mode == SYS_LED_MODE_OFF) { + *pmode = ONLP_LED_MODE_RED; + } else if(grn_mode == SYS_LED_MODE_ON) { + *pmode = ONLP_LED_MODE_ORANGE; + } else { + return ONLP_STATUS_E_INVALID; + } + break; + case SYS_LED_MODE_OFF: + if(grn_mode == SYS_LED_MODE_OFF) { + *pmode = ONLP_LED_MODE_OFF; + } + break; + default: + return ONLP_STATUS_E_INVALID; + break; } + return rv; +} + + +static int _sys_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info) +{ + int local_id; + int rv = ONLP_STATUS_OK; + sys_led_mode_t grn_mode, red_mode; + local_id = ONLP_OID_ID_GET(id); + int idx = LOCAL_ID_TO_INFO_IDX(local_id); + /* Set the onlp_oid_hdr_t and capabilities */ + *info = __onlp_led_info[idx]; + + rv = onlp_file_read_int((int*)&grn_mode, INV_SYSLED_PREFIX"grn_led"); + if(rv != ONLP_STATUS_OK) { return rv; } + rv = onlp_file_read_int((int*)&red_mode, INV_SYSLED_PREFIX"red_led"); + if(rv != ONLP_STATUS_OK) { return rv; } + + rv = _sys_onlp_led_mode_convert(grn_mode, red_mode, &info->mode); + if(rv != ONLP_STATUS_OK) { return rv; } + + /* Set the on/off status */ + if (info->mode != ONLP_LED_MODE_OFF) { + info->status |= ONLP_LED_STATUS_ON; + } else { + info->status &= (~ONLP_LED_STATUS_ON); + } + return rv; } -static int _psoc_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info) +static int _fan_onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info) { int local_id; int rv = ONLP_STATUS_OK; - int mode; - platform_led_color_t color; - + int grn_mode, red_mode; local_id = ONLP_OID_ID_GET(id); - + int fan_id = LOCAL_ID_TO_FAN_ID(local_id); + int idx = LOCAL_ID_TO_INFO_IDX(local_id); /* Set the onlp_oid_hdr_t and capabilities */ - *info = __onlp_led_info[local_id]; - color = __info_list[local_id].color; + *info = __onlp_led_info[idx]; - rv = onlp_file_read_int((int*)&mode, __info_list[local_id].file); + rv = onlp_ledi_status_get(id, &info->status); + if( rv != ONLP_STATUS_OK ) { return rv; } - if( ONLP_STATUS_OK == rv ) { + if( info->status & ONLP_LED_STATUS_PRESENT) { + info->caps = FAN_LED_CAPS; + rv = onlp_file_read_int((int*)&grn_mode, INV_HWMON_PREFIX"fan_led_grn%d", fan_id); + if(rv != ONLP_STATUS_OK ) { return rv; } + rv = onlp_file_read_int((int*)&red_mode, INV_HWMON_PREFIX"fan_led_red%d", fan_id); + if(rv != ONLP_STATUS_OK ) { return rv; } - if(!mode) { + if(grn_mode == 1 && red_mode == 0) { + info->mode = ONLP_LED_MODE_GREEN; + } else if(grn_mode == 0 && red_mode == 1) { + info->mode = ONLP_LED_MODE_RED; + } else if(grn_mode == 0 && red_mode == 0) { info->mode = ONLP_LED_MODE_OFF; } else { - info->mode = ONLP_LED_MODE_ON; - } - - if(info->mode != ONLP_LED_MODE_OFF) { - switch(color) { - case PLATFORM_LED_COLOR_RED: - info->mode += (ONLP_LED_MODE_RED - ONLP_LED_MODE_ON); - break; - case PLATFORM_LED_COLOR_GREEN: - info->mode += (ONLP_LED_MODE_GREEN - ONLP_LED_MODE_ON); - break; - default: - break; - } - } - - /* Set the on/off status */ - if (info->mode != ONLP_LED_MODE_OFF) { - info->status |= ONLP_LED_STATUS_ON; - } else { - info->status &= (~ONLP_LED_STATUS_ON); - } - } - - return rv; -} - -static int _cpld_onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t onlp_mode) -{ - int local_id; - int rv = ONLP_STATUS_OK; - platform_led_color_t color; - cpld_led_mode_t cpld_mode; - - local_id = ONLP_OID_ID_GET(id); - - - /*convert onlp_led_mode to platform mod*/ - rv = _onlp_cpld_led_mode_convert(onlp_mode, &color, &cpld_mode); - - if( ONLP_STATUS_OK == rv) { - if((color != __info_list[local_id].color)&&(color != PLATFORM_LED_COLOR_ANY)) { rv = ONLP_STATUS_E_INVALID; - } else { - rv = onlp_file_write_int(cpld_mode, __info_list[local_id].file); } + } else { + info->mode = ONLP_LED_MODE_OFF; } - return rv; } -static int _psoc_onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t onlp_mode) +static int _sys_onlp_ledi_mode_set(onlp_led_mode_t onlp_mode) { - int local_id; int rv = ONLP_STATUS_OK; - platform_led_color_t color; - int psoc_mode; - int psoc_diag; - local_id = ONLP_OID_ID_GET(id); - - rv = platform_psoc_diag_enable_read(&psoc_diag); - - if( ONLP_STATUS_OK == rv ) { - if(!psoc_diag) { - rv = ONLP_STATUS_E_UNSUPPORTED; - } - } - - switch(onlp_mode) { - case ONLP_LED_MODE_OFF: - psoc_mode = 0; - color = PLATFORM_LED_COLOR_ANY; - break; - case ONLP_LED_MODE_ON: - psoc_mode = 1; - color = PLATFORM_LED_COLOR_ANY; - break; - case ONLP_LED_MODE_RED: - color = PLATFORM_LED_COLOR_RED; - psoc_mode = 1; - break; - case ONLP_LED_MODE_GREEN: - color = PLATFORM_LED_COLOR_GREEN; - psoc_mode = 1; - break; - default: - rv = ONLP_STATUS_E_INVALID; - break; - } - - if( ONLP_STATUS_OK == rv) { - if((psoc_mode)&&(color != __info_list[local_id].color)&&(color != PLATFORM_LED_COLOR_ANY)) { - rv = ONLP_STATUS_E_INVALID; - } else { - rv = onlp_file_write_int(psoc_mode, __info_list[local_id].file); - } + if( onlp_mode == ONLP_LED_MODE_OFF) { + rv = onlp_file_write_int(SYS_LED_MODE_OFF, INV_SYSLED_PREFIX"grn_led"); + if(rv != ONLP_STATUS_OK ) { return rv; } + rv = onlp_file_write_int(SYS_LED_MODE_OFF, INV_SYSLED_PREFIX"red_led"); + } else { + rv = ONLP_STATUS_E_UNSUPPORTED; } return rv; } + + /* * This function will be called prior to any other onlp_ledi_* functions. */ @@ -416,23 +245,25 @@ onlp_ledi_info_get(onlp_oid_t id, onlp_led_info_t* info) { int rv = ONLP_STATUS_OK; VALIDATE(id); - - if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) { + int local_id; + local_id = ONLP_OID_ID_GET(id); + if(local_id >= ONLP_LED_MAX) { return ONLP_STATUS_E_INVALID; } - switch(__info_list[ONLP_OID_ID_GET(id)].driver) { - case LED_DRIVER_MODE_NONE: - *info = __onlp_led_info[ONLP_OID_ID_GET(id)]; + switch(local_id) { + case ONLP_LED_MGMT: + rv = _sys_onlp_ledi_info_get(id, info); break; - case LED_DRIVER_MODE_CPLD: - rv = _cpld_onlp_ledi_info_get(id, info); - break; - case LED_DRIVER_MODE_PSOC: - rv = _psoc_onlp_ledi_info_get(id, info); + case ONLP_LED_FAN1: + case ONLP_LED_FAN2: + case ONLP_LED_FAN3: + case ONLP_LED_FAN4: + case ONLP_LED_FAN5: + rv = _fan_onlp_ledi_info_get(id, info); break; default: - rv = ONLP_STATUS_E_UNSUPPORTED; + rv = ONLP_STATUS_E_INVALID; break; } return rv; @@ -449,13 +280,70 @@ int onlp_ledi_status_get(onlp_oid_t id, uint32_t* rv) onlp_led_info_t* info; VALIDATE(id); + int local_id = ONLP_OID_ID_GET(id); + int info_idx = LOCAL_ID_TO_INFO_IDX(local_id); + int fan_id = LOCAL_ID_TO_FAN_ID(local_id); + int mode, grn_mode, red_mode; + onlp_led_mode_t pmode; + uint32_t fan_status; - if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) { + if(local_id >= ONLP_LED_MAX) { result = ONLP_STATUS_E_INVALID; - } else { - info = &__onlp_led_info[ONLP_OID_ID_GET(id)]; - *rv = info->status; } + if(result == ONLP_STATUS_OK) { + info = &__onlp_led_info[info_idx]; + switch(local_id) { + case ONLP_LED_MGMT: + result = onlp_file_read_int((int*)&grn_mode, INV_SYSLED_PREFIX"grn_led"); + if(result != ONLP_STATUS_OK) { return result; } + result = onlp_file_read_int((int*)&red_mode, INV_SYSLED_PREFIX"red_led"); + if(result != ONLP_STATUS_OK) { return result; } + + result = _sys_onlp_led_mode_convert(grn_mode, red_mode, &pmode); + if(result != ONLP_STATUS_OK) { return result; } + + if( pmode != ONLP_LED_MODE_OFF) { + info->status |= ONLP_LED_STATUS_ON; + } else { + info->status &= (~ONLP_LED_STATUS_ON); + } + + *rv = info->status; + break; + case ONLP_LED_FAN1: + case ONLP_LED_FAN2: + case ONLP_LED_FAN3: + case ONLP_LED_FAN4: + case ONLP_LED_FAN5: + result = onlp_fani_status_get((&info->hdr)->poid, &fan_status); + if(result != ONLP_STATUS_OK) { return result; } + + if(fan_status & ONLP_FAN_STATUS_PRESENT) { + info->status |= ONLP_LED_STATUS_PRESENT; + info->status &= (~ONLP_LED_STATUS_ON); + + result = onlp_file_read_int((int*)&mode, INV_HWMON_PREFIX"fan_led_grn%d", fan_id); + if(result != ONLP_STATUS_OK) { return result; } + if(mode) { + info->status |= ONLP_LED_STATUS_ON; + } + + result = onlp_file_read_int((int*)&mode, INV_HWMON_PREFIX"fan_led_red%d", fan_id); + if(result != ONLP_STATUS_OK) { return result; } + if(mode) { + info->status |= ONLP_LED_STATUS_ON; + } + } else { + info->status = 0; + } + *rv = info->status; + break; + default: + result = ONLP_STATUS_E_INVALID; + break; + } + } + return result; } @@ -471,10 +359,13 @@ int onlp_ledi_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* rv) VALIDATE(id); - if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) { + int local_id; + local_id = ONLP_OID_ID_GET(id); + int idx = LOCAL_ID_TO_INFO_IDX(local_id); + if(local_id >= ONLP_LED_MAX) { result = ONLP_STATUS_E_INVALID; } else { - info = &__onlp_led_info[ONLP_OID_ID_GET(id)]; + info = &__onlp_led_info[idx]; *rv = info->hdr; } return result; @@ -494,13 +385,15 @@ onlp_ledi_set(onlp_oid_t id, int on_or_off) { onlp_led_mode_t mode; VALIDATE(id); + int local_id; + local_id = ONLP_OID_ID_GET(id); + int idx = LOCAL_ID_TO_INFO_IDX(local_id); - if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) { + if(local_id >= ONLP_LED_MAX) { return ONLP_STATUS_E_INVALID; } - - if (__onlp_led_info[ONLP_OID_ID_GET(id)].caps & ONLP_LED_CAPS_ON_OFF) { + if (__onlp_led_info[idx].caps & ONLP_LED_CAPS_ON_OFF) { mode = on_or_off?ONLP_LED_MODE_ON:ONLP_LED_MODE_OFF; return onlp_ledi_mode_set(id, mode); } @@ -519,22 +412,28 @@ onlp_ledi_mode_set(onlp_oid_t id, onlp_led_mode_t mode) { int rv = ONLP_STATUS_OK; VALIDATE(id); + int local_id; + local_id = ONLP_OID_ID_GET(id); - if(ONLP_OID_ID_GET(id) >= ONLP_LED_MAX) { + if(local_id >= ONLP_LED_MAX) { return ONLP_STATUS_E_INVALID; } - - switch(__info_list[ONLP_OID_ID_GET(id)].driver) { - case LED_DRIVER_MODE_CPLD: - rv = _cpld_onlp_ledi_mode_set(id, mode); + switch(local_id) { + case ONLP_LED_MGMT: + rv = _sys_onlp_ledi_mode_set(mode); break; - case LED_DRIVER_MODE_PSOC: - rv = _psoc_onlp_ledi_mode_set(id, mode); - break; - default: + case ONLP_LED_FAN1: + case ONLP_LED_FAN2: + case ONLP_LED_FAN3: + case ONLP_LED_FAN4: + case ONLP_LED_FAN5: rv = ONLP_STATUS_E_UNSUPPORTED; break; + default: + rv = ONLP_STATUS_E_INVALID; + break; } + return rv; } diff --git a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/platform_lib.c b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/platform_lib.c index 8bd82691..bb04678b 100644 --- a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/platform_lib.c +++ b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/platform_lib.c @@ -34,17 +34,17 @@ #include "platform_lib.h" -int platform_psoc_diag_enable_read(int *enable) +int platform_hwmon_diag_enable_read(int *enable) { int rv = ONLP_STATUS_OK; - rv = onlp_file_read_int((int*)enable, PLATFORM_PSOC_DIAG_PATH); + rv = onlp_file_read_int((int*)enable, INV_HWMON_PREFIX"diag"); return rv; } -int platform_psoc_diag_enable_write(int enable) +int platform_hwmon_diag_enable_write(int enable) { int rv = ONLP_STATUS_OK; - rv = onlp_file_write_int(enable, PLATFORM_PSOC_DIAG_PATH); + rv = onlp_file_write_int(enable, INV_HWMON_PREFIX"diag"); return rv; } diff --git a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/platform_lib.h b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/platform_lib.h index eb598bdd..0852d0fa 100644 --- a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/platform_lib.h +++ b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/platform_lib.h @@ -41,25 +41,15 @@ * |----ONLP_THERMAL_3_ON_MAIN_BROAD * |----ONLP_THERMAL_4_ON_MAIN_BROAD * |----ONLP_THERMAL_5_ON_MAIN_BROAD - * |----ONLP_FAN_1--------ONLP_FAN_1_WEAK - * | |--ONLP_LED_FAN1_GREEN - * | |--ONLP_LED_FAN1_RED + * |----ONLP_FAN_1--------ONLP_LED_FAN1 * | - * |----ONLP_FAN_2--------ONLP_FAN_2_WEAK - * | |--ONLP_LED_FAN2_GREEN - * | |--ONLP_LED_FAN2_RED + * |----ONLP_FAN_2--------ONLP_LED_FAN2 * | - * |----ONLP_FAN_3--------ONLP_FAN_3_WEAK - * | |--ONLP_LED_FAN3_GREEN - * | |--ONLP_LED_FAN3_RED + * |----ONLP_FAN_3--------ONLP_LED_FAN3 * | - * |----ONLP_FAN_4--------ONLP_FAN_4_WEAK - * | |--ONLP_LED_FAN4_GREEN - * | |--ONLP_LED_FAN4_RED + * |----ONLP_FAN_4--------ONLP_LED_FAN4 * | - * |----ONLP_FAN_5--------ONLP_FAN_5_WEAK - * | |--ONLP_LED_FAN5_GREEN - * | |--ONLP_LED_FAN5_RED + * |----ONLP_FAN_5--------ONLP_LED_FAN5 * | * |----ONLP_PSU_1--------ONLP_THERMAL_1_ON_PSU1 * | |--ONLP_THERMAL_2_ON_PSU1 @@ -69,14 +59,21 @@ * | |--ONLP_THERMAL_2_ON_PSU2 * | |--ONLP_FAN_PSU_2 * | - * |----ONLP_LED_MGMT_GREEN - * |----ONLP_LED_MGMT_RED + * |----ONLP_LED_MGMT */ +#define INV_SYSLED_PREFIX "/sys/class/hwmon/hwmon2/device/" +#define INV_HWMON_PREFIX "/sys/class/hwmon/hwmon1/device/" +#define INV_CTMP_PREFIX "/sys/class/hwmon/hwmon0/" +#define INV_SFP_PREFIX "/sys/class/swps/" +#define INV_SYS_PREFIX "/sys/class/eeprom/vpd/" + +#define OID_MAP_TO_INFO_IDX(oid) ONLP_OID_ID_GET(oid)-1 +#define LOCAL_ID_TO_INFO_IDX(id) (id-1) + /* Thermal definitions*/ enum onlp_thermal_id { - ONLP_THERMAL_RESERVED = 0, - ONLP_THERMAL_CPU_PHY, + ONLP_THERMAL_CPU_PHY = 1, ONLP_THERMAL_CPU_CORE0, ONLP_THERMAL_CPU_CORE1, ONLP_THERMAL_CPU_CORE2, @@ -93,65 +90,50 @@ enum onlp_thermal_id { ONLP_THERMAL_MAX }; -#define ONLP_THERMAL_COUNT 15 /*include "reserved"*/ +#define ONLP_THERMAL_COUNT 14 /*include "reserved"*/ /* Fan definitions*/ enum onlp_fan_id { - ONLP_FAN_RESERVED = 0, - ONLP_FAN_1, + ONLP_FAN_1 = 1, ONLP_FAN_2, ONLP_FAN_3, ONLP_FAN_4, ONLP_FAN_5, - ONLP_FAN_1_WEAK, - ONLP_FAN_2_WEAK, - ONLP_FAN_3_WEAK, - ONLP_FAN_4_WEAK, - ONLP_FAN_5_WEAK, ONLP_FAN_PSU_1, ONLP_FAN_PSU_2, ONLP_FAN_MAX }; -#define ONLP_FAN_COUNT 13 /*include "reserved"*/ +#define ONLP_FAN_COUNT 7 /*include "reserved"*/ /* PSU definitions*/ enum onlp_psu_id { - ONLP_PSU_RESERVED, - ONLP_PSU_1, + ONLP_PSU_1 = 1, ONLP_PSU_2, ONLP_PSU_MAX }; -#define ONLP_PSU_COUNT 3 /*include "reserved"*/ +#define ONLP_PSU_COUNT 2 /*include "reserved"*/ /* LED definitions*/ enum onlp_led_id { - ONLP_LED_RESERVED = 0, - ONLP_LED_MGMT_GREEN, - ONLP_LED_MGMT_RED, - ONLP_LED_FAN1_GREEN, - ONLP_LED_FAN1_RED, - ONLP_LED_FAN2_GREEN, - ONLP_LED_FAN2_RED, - ONLP_LED_FAN3_GREEN, - ONLP_LED_FAN3_RED, - ONLP_LED_FAN4_GREEN, - ONLP_LED_FAN4_RED, - ONLP_LED_FAN5_GREEN, - ONLP_LED_FAN5_RED, + ONLP_LED_MGMT = 1, + ONLP_LED_FAN1, + ONLP_LED_FAN2, + ONLP_LED_FAN3, + ONLP_LED_FAN4, + ONLP_LED_FAN5, ONLP_LED_MAX }; -#define ONLP_LED_COUNT 13 /*include "reserved"*/ +#define ONLP_LED_COUNT 6 /*include "reserved"*/ /* platform functions*/ -#define PLATFORM_PSOC_DIAG_PATH "/sys/class/hwmon/hwmon1/device/diag" -#define PLATFORM_PSOC_DIAG_LOCK platform_psoc_diag_enable_write(0) -#define PLATFORM_PSOC_DIAG_UNLOCK platform_psoc_diag_enable_write(1) -int platform_psoc_diag_enable_read(int *enable); -int platform_psoc_diag_enable_write(int enable); +#define PLATFORM_HWMON_DIAG_LOCK platform_hwmon_diag_enable_write(0) +#define PLATFORM_HWMON_DIAG_UNLOCK platform_hwmon_diag_enable_write(1) +int platform_hwmon_diag_enable_read(int *enable); +int platform_hwmon_diag_enable_write(int enable); diff --git a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/psui.c b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/psui.c index b97c87ee..cabf4370 100644 --- a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/psui.c +++ b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/psui.c @@ -36,92 +36,34 @@ } \ } while(0) -#define PSUI_PLATFORM_PSU_MODEL "DPS-800AB-37D" - - -typedef enum psoc_psu_state_e { - PSOC_PSU_NORMAL = 0, - PSOC_PSU_NA_1, //001 - PSOC_PSU_UNPOWERED, //010 - PSOC_PSU_NA_3, //011 - PSOC_PSU_FAULT, //100 - PSOC_PSU_NA_5, //101 - PSOC_PSU_NA_6, //110 - PSOC_PSU_NOT_INSTALLED //111 -} psoc_psu_state_t; - - -typedef struct psui_info_s { - char vendor[ONLP_CONFIG_INFO_STR_MAX]; - char serial[ONLP_CONFIG_INFO_STR_MAX]; - char state[ONLP_CONFIG_INFO_STR_MAX]; - char vin[ONLP_CONFIG_INFO_STR_MAX]; - char vout[ONLP_CONFIG_INFO_STR_MAX]; - char iin[ONLP_CONFIG_INFO_STR_MAX]; - char iout[ONLP_CONFIG_INFO_STR_MAX]; - char pin[ONLP_CONFIG_INFO_STR_MAX]; - char pout[ONLP_CONFIG_INFO_STR_MAX]; -} psui_info_t; - - -static psui_info_t __info_list[ONLP_PSU_COUNT] = { - {}, - { - "/sys/class/hwmon/hwmon1/device/psoc_psu1_vendor", - "/sys/class/hwmon/hwmon1/device/psoc_psu1_serial", - "/sys/class/hwmon/hwmon1/device/psu1", - "/sys/class/hwmon/hwmon1/device/psoc_psu1_vin", - "/sys/class/hwmon/hwmon1/device/psoc_psu1_vout", - "/sys/class/hwmon/hwmon1/device/psoc_psu1_iin", - "/sys/class/hwmon/hwmon1/device/psoc_psu1_iout", - "/sys/class/hwmon/hwmon1/device/psoc_psu1_pin", - "/sys/class/hwmon/hwmon1/device/psoc_psu1_pout" - }, - { - "/sys/class/hwmon/hwmon1/device/psoc_psu2_vendor", - "/sys/class/hwmon/hwmon1/device/psoc_psu2_serial", - "/sys/class/hwmon/hwmon1/device/psu2", - "/sys/class/hwmon/hwmon1/device/psoc_psu2_vin", - "/sys/class/hwmon/hwmon1/device/psoc_psu2_vout", - "/sys/class/hwmon/hwmon1/device/psoc_psu2_iin", - "/sys/class/hwmon/hwmon1/device/psoc_psu2_iout", - "/sys/class/hwmon/hwmon1/device/psoc_psu2_pin", - "/sys/class/hwmon/hwmon1/device/psoc_psu2_pout" - } -}; +typedef enum hwmon_psu_state_e { + HWMON_PSU_NORMAL = 0, + HWMON_PSU_UNPOWERED = 2, //010 + HWMON_PSU_FAULT = 4, //100 + HWMON_PSU_NOT_INSTALLED = 7 //111 +} hwmon_psu_state_t; /* * Get all information about the given PSU oid. */ -static onlp_psu_info_t __onlp_psu_info[ONLP_PSU_COUNT] = { - { }, /* Not used */ - { - { - ONLP_PSU_ID_CREATE(ONLP_PSU_1), "PSU-1", 0, - { - ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU1), - ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU1), - ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_1) - } - }, - "","",ONLP_PSU_STATUS_PRESENT, - ONLP_PSU_CAPS_DC12|ONLP_PSU_CAPS_VIN|ONLP_PSU_CAPS_VOUT|ONLP_PSU_CAPS_IIN|ONLP_PSU_CAPS_IOUT|ONLP_PSU_CAPS_PIN|ONLP_PSU_CAPS_POUT - }, - { - { - ONLP_PSU_ID_CREATE(ONLP_PSU_2), "PSU-2", 0, - { - ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU2), - ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU2), - ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_2) - } - }, - "","",ONLP_PSU_STATUS_PRESENT, - ONLP_PSU_CAPS_DC12|ONLP_PSU_CAPS_VIN|ONLP_PSU_CAPS_VOUT|ONLP_PSU_CAPS_IIN|ONLP_PSU_CAPS_IOUT|ONLP_PSU_CAPS_PIN|ONLP_PSU_CAPS_POUT +#define MAKE_PSU_NODE_INFO(id) \ + { \ + { \ + ONLP_PSU_ID_CREATE(ONLP_PSU_##id), "PSU-"#id, 0, \ + { \ + ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU##id), \ + ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU##id), \ + ONLP_FAN_ID_CREATE(ONLP_FAN_PSU_##id) \ + } \ + }, \ + "","", 0, 0 \ } -}; +static onlp_psu_info_t __onlp_psu_info[ONLP_PSU_COUNT] = { + MAKE_PSU_NODE_INFO(1), + MAKE_PSU_NODE_INFO(2) +}; int onlp_psui_init(void) @@ -137,7 +79,6 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) int len; int local_id = ONLP_OID_ID_GET(id); uint8_t temp[ONLP_CONFIG_INFO_STR_MAX] = {0}; - psoc_psu_state_t psoc_state; VALIDATE(id); @@ -146,45 +87,63 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) } - *info = __onlp_psu_info[local_id]; /* Set the onlp_oid_hdr_t */ + *info = __onlp_psu_info[LOCAL_ID_TO_INFO_IDX(local_id)]; /* Set the onlp_oid_hdr_t */ - ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len, __info_list[local_id].vendor); + ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len, INV_HWMON_PREFIX"psoc_psu%d_vendor", local_id); + if(ret != ONLP_STATUS_OK) { return ret; } /*remove the '\n'*/ temp[strlen((char*)temp)-1] = 0; snprintf(info->model, ONLP_CONFIG_INFO_STR_MAX, "%s", temp); memset(temp, 0, ONLP_CONFIG_INFO_STR_MAX); - ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len,__info_list[local_id].serial); + ret = onlp_file_read(temp, ONLP_CONFIG_INFO_STR_MAX, &len, INV_HWMON_PREFIX"psoc_psu%d_serial", local_id); + if(ret != ONLP_STATUS_OK) { return ret; } /*remove the '\n'*/ temp[strlen((char*)temp)-1] = 0; snprintf(info->serial, ONLP_CONFIG_INFO_STR_MAX, "%s", temp); + ret = onlp_psui_status_get(id, &info->status); + if(ret != ONLP_STATUS_OK) { return ret; } - ret = onlp_file_read_int((int*)&psoc_state, __info_list[local_id].state); + if(info->status & ONLP_PSU_STATUS_PRESENT) { + info->caps = ONLP_PSU_CAPS_AC; + /*millivolts*/ + ret = onlp_file_read_int(&info->mvin, INV_HWMON_PREFIX"psoc_psu%d_vin", local_id); + if(ret != ONLP_STATUS_OK) { return ret; } + if(info->mvin >= 0) { + info->caps |= ONLP_PSU_CAPS_VIN; + } + ret = onlp_file_read_int(&info->mvout, INV_HWMON_PREFIX"psoc_psu%d_vout", local_id); + if(ret != ONLP_STATUS_OK) { return ret; } + if(info->mvout >= 0) { + info->caps |= ONLP_PSU_CAPS_VOUT; + } - if( PSOC_PSU_UNPOWERED == psoc_state) { - info->status = ONLP_PSU_STATUS_PRESENT|ONLP_PSU_STATUS_UNPLUGGED; - } else if ( PSOC_PSU_NORMAL == psoc_state) { - info->status = ONLP_PSU_STATUS_PRESENT; - } else if( PSOC_PSU_FAULT == psoc_state) { - info->status = ONLP_PSU_STATUS_PRESENT|ONLP_PSU_STATUS_FAILED; - } else { - info->status = 0; + /* milliamps */ + ret = onlp_file_read_int(&info->miin, INV_HWMON_PREFIX"psoc_psu%d_iin", local_id); + if(ret != ONLP_STATUS_OK) { return ret; } + if(info->miin >= 0) { + info->caps |= ONLP_PSU_CAPS_IIN; + } + ret = onlp_file_read_int(&info->miout, INV_HWMON_PREFIX"psoc_psu%d_iout", local_id); + if(ret != ONLP_STATUS_OK) { return ret; } + if(info->miout >= 0) { + info->caps |= ONLP_PSU_CAPS_IOUT; + } + + /* milliwatts */ + ret = onlp_file_read_int(&info->mpin, INV_HWMON_PREFIX"psoc_psu%d_pin", local_id); + if(ret != ONLP_STATUS_OK) { return ret; } + if(info->mpin >= 0) { + info->caps |= ONLP_PSU_CAPS_PIN; + } + ret = onlp_file_read_int(&info->mpout, INV_HWMON_PREFIX"psoc_psu%d_pout", local_id); + if(ret != ONLP_STATUS_OK) { return ret; } + if(info->mpout >= 0) { + info->caps |= ONLP_PSU_CAPS_POUT; + } } - - /*millivolts*/ - ret = onlp_file_read_int(&info->mvin, __info_list[local_id].vin); - ret = onlp_file_read_int(&info->mvout, __info_list[local_id].vout); - - /* milliamps */ - ret = onlp_file_read_int(&info->miin, __info_list[local_id].iin); - ret = onlp_file_read_int(&info->miout, __info_list[local_id].iout); - - /* milliwatts */ - ret = onlp_file_read_int(&info->mpin, __info_list[local_id].pin); - ret = onlp_file_read_int(&info->mpout, __info_list[local_id].pout); - return ret; } @@ -197,24 +156,29 @@ onlp_psui_info_get(onlp_oid_t id, onlp_psu_info_t* info) int onlp_psui_status_get(onlp_oid_t id, uint32_t* rv) { int result = ONLP_STATUS_OK; - psoc_psu_state_t psoc_state; + hwmon_psu_state_t psu_state; int local_id; VALIDATE(id); + int len; + char buf[ONLP_CONFIG_INFO_STR_MAX]; local_id = ONLP_OID_ID_GET(id); if(local_id >= ONLP_PSU_MAX) { result = ONLP_STATUS_E_INVALID; } else { - result = onlp_file_read_int((int*)&psoc_state, __info_list[local_id].state); - - if( PSOC_PSU_UNPOWERED == psoc_state) { + result = onlp_file_read((uint8_t*)&buf, ONLP_CONFIG_INFO_STR_MAX, &len, "%s""psu%d", INV_HWMON_PREFIX, local_id); + if( result != ONLP_STATUS_OK ) {return result;} + psu_state = (uint8_t)strtoul(buf, NULL, 0); + if( psu_state == HWMON_PSU_UNPOWERED) { *rv = ONLP_PSU_STATUS_PRESENT|ONLP_PSU_STATUS_UNPLUGGED; - } else if ( PSOC_PSU_NORMAL == psoc_state) { + } else if ( psu_state == HWMON_PSU_NORMAL) { *rv = ONLP_PSU_STATUS_PRESENT; - } else if( PSOC_PSU_FAULT == psoc_state) { + } else if( psu_state == HWMON_PSU_FAULT) { *rv = ONLP_PSU_STATUS_PRESENT|ONLP_PSU_STATUS_FAILED; - } else { + } else if( psu_state == HWMON_PSU_NOT_INSTALLED) { *rv = 0; + } else { + result = ONLP_STATUS_E_INVALID; } } return result; @@ -236,7 +200,7 @@ int onlp_psui_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* rv) if(local_id >= ONLP_PSU_MAX) { result = ONLP_STATUS_E_INVALID; } else { - info = &__onlp_psu_info[local_id]; + info = &__onlp_psu_info[LOCAL_ID_TO_INFO_IDX(local_id)]; *rv = info->hdr; } return result; diff --git a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/sfpi.c b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/sfpi.c index 696d384f..d9a447cc 100644 --- a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/sfpi.c +++ b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/sfpi.c @@ -23,8 +23,8 @@ * * ***********************************************************/ -#include +#include #include /* For O_RDWR && open */ #include #include @@ -33,19 +33,41 @@ #include #include "platform_lib.h" #include +#include #define MAX_SFP_PATH 128 -//static char sfp_node_path[MAX_SFP_PATH] = {0}; -#define MUX_START_INDEX 1 +#define MUX_START_INDEX 10 +#define QSFP_DEV_ADDR 0x50 #define NUM_OF_SFP_PORT 48 #define NUM_OF_QSFP_PORT 6 #define NUM_OF_ALL_PORT (NUM_OF_SFP_PORT+NUM_OF_QSFP_PORT) + +#define FRONT_PORT_TO_MUX_INDEX(port) (port+MUX_START_INDEX) /************************************************************ * * SFPI Entry Points * ***********************************************************/ +enum onlp_sfp_port_type { + ONLP_PORT_TYPE_SFP = 0, + ONLP_PORT_TYPE_QSFP, + ONLP_PORT_TYPE_MAX +}; + +static int +onlp_sfpi_port_type(int port) +{ + if(port >= 0 && port < NUM_OF_SFP_PORT) { + return ONLP_PORT_TYPE_SFP; + } else if(port >= NUM_OF_SFP_PORT && port < NUM_OF_ALL_PORT) { + return ONLP_PORT_TYPE_QSFP; + } else { + AIM_LOG_ERROR("Invalid port(%d)\r\n", port); + return ONLP_STATUS_E_PARAM; + } +} + int onlp_sfpi_init(void) { @@ -53,76 +75,24 @@ onlp_sfpi_init(void) return ONLP_STATUS_OK; } -int -onlp_sfpi_port_is_valid(int port){ - if(port > NUM_OF_ALL_PORT || port < 1) - return 0; - return 1; -} - -int -onlp_sfpi_get_file_byte(int port, char* attr){ - if(!onlp_sfpi_port_is_valid(port)){ - return -1; - } - char path[128]={0}; - int err = snprintf(path, sizeof(path), "/sys/class/swps/port%d/%s", (port-1), attr); - if( err < 0){ - return err; - } - FILE* pFile = fopen(path, "r"); - if(pFile == NULL){ - return ONLP_STATUS_E_UNSUPPORTED; - } - char buf[8] = {0}; - fread( buf, sizeof(buf), sizeof(buf), pFile ); - int ret = strtol (buf, NULL, 10); - fclose(pFile); - return ret; -} - -int -onlp_sfpi_set_file_byte(int port, char* attr, int value){ - if(!onlp_sfpi_port_is_valid(port)){ - return -1; - } - if(value > 10 || value < 0){ - return -1; - } - char path[128]={0}; - int err = snprintf(path, sizeof(path), "/sys/class/swps/port%d/%s", (port-1), attr); - if( err < 0){ - return err; - } - FILE* pFile = fopen(path, "r+"); - if(pFile == NULL){ - return ONLP_STATUS_E_UNSUPPORTED; - } - char buf = 0; - buf = value+'0'; - err = fwrite(&buf, sizeof(buf), sizeof(buf), pFile); - if(err < 0){ - return err; - } - fclose(pFile); - return err; -} - -int -onlp_sfpi_port2chan(int port){ - return port+9; +int onlp_sfpi_port_map(int port, int* rport) +{ + int p_type = onlp_sfpi_port_type(port); + if(p_type < 0) {return ONLP_STATUS_E_INVALID;} + *rport = port; + return ONLP_STATUS_OK; } int onlp_sfpi_bitmap_get(onlp_sfp_bitmap_t* bmap) { /* - * Ports {1, 54} + * Ports {0, 53} */ int p; AIM_BITMAP_CLR_ALL(bmap); - for(p = 1; p <= NUM_OF_ALL_PORT; p++) { + for(p = 0; p < NUM_OF_ALL_PORT; p++) { AIM_BITMAP_SET(bmap, p); } @@ -137,55 +107,101 @@ onlp_sfpi_is_present(int port) * Return 0 if not present. * Return < 0 if error. */ - int present = -999; - present = onlp_sfpi_get_file_byte(port, "present"); - if(present >= 0){ - return (-present)+1; + int p_type = onlp_sfpi_port_type(port); + if(p_type < 0) {return ONLP_STATUS_E_INVALID;} + + int present; + int rv; + if(onlp_file_read_int(&present, INV_SFP_PREFIX"port%d/present", port) != ONLP_STATUS_OK) { + return ONLP_STATUS_E_INTERNAL; } - return present; + if(present == 0) { + rv = true; + } else if (present == 1) { + rv = false; + } else { + AIM_LOG_ERROR("Unvalid present status %d from port(%d)\r\n",present,port); + return ONLP_STATUS_E_INTERNAL; + } + return rv; } int onlp_sfpi_presence_bitmap_get(onlp_sfp_bitmap_t* dst) { AIM_BITMAP_CLR_ALL(dst); - int port=MUX_START_INDEX; - for(port=MUX_START_INDEX;port<=NUM_OF_ALL_PORT;port++){ - if(onlp_sfpi_is_present(port)) - AIM_BITMAP_SET(dst, port); + int port; + for(port = 0; port < NUM_OF_ALL_PORT; port++) { + if(onlp_sfpi_is_present(port) == true) { + AIM_BITMAP_MOD(dst, port, 1); + } else if(onlp_sfpi_is_present(port) == false) { + AIM_BITMAP_MOD(dst, port, 0); + } else { + return ONLP_STATUS_E_INTERNAL; + } } return ONLP_STATUS_OK; } -int +static int onlp_sfpi_is_rx_los(int port) { - if(port <= NUM_OF_SFP_PORT){ - if (onlp_sfpi_is_present(port) == 1){ - int rxlos = onlp_sfpi_get_file_byte(port, "rxlos"); - if(rxlos < 0){ - AIM_LOG_ERROR("Unable to read rxlos from port(%d)\r\n", port); - return ONLP_STATUS_E_INTERNAL; - } - return rxlos; + int rxlos; + int rv; + int len; + char buf[ONLP_CONFIG_INFO_STR_MAX]; + + int p_type = onlp_sfpi_port_type(port); + + if(p_type == ONLP_PORT_TYPE_SFP) { + if(onlp_file_read_int(&rxlos, INV_SFP_PREFIX"port%d/rxlos", port) != ONLP_STATUS_OK) { + return ONLP_STATUS_E_INTERNAL; } - return 0; + if(rxlos == 0) { + rv = true; + } else { + rv = false; + } + } else if(p_type == ONLP_PORT_TYPE_QSFP) { + if(onlp_file_read((uint8_t*)buf, ONLP_CONFIG_INFO_STR_MAX, &len, INV_SFP_PREFIX"port%d/soft_rx_los", port) != ONLP_STATUS_OK) { + return ONLP_STATUS_E_INTERNAL; + } + if(sscanf( buf, "0x%x\n", &rxlos) != 1) { + AIM_LOG_ERROR("Unable to read rxlos from port(%d)\r\n", port); + return ONLP_STATUS_E_INTERNAL; + } + if(rxlos < 0 || rxlos > 0x0f) { + AIM_LOG_ERROR("Unable to read rxlos from port(%d)\r\n", port); + return ONLP_STATUS_E_INTERNAL; + } else if(rxlos == 0) { + rv = true; + } else { + rv = false; + } + } else { + return ONLP_STATUS_E_INVALID; } - else if(port > NUM_OF_SFP_PORT){ - return 0; - } - AIM_LOG_ERROR("Read rxlos from port(%d) out of range.\r\n", port); - return ONLP_STATUS_E_INTERNAL; + + return rv; } int onlp_sfpi_rx_los_bitmap_get(onlp_sfp_bitmap_t* dst) -{ +{ AIM_BITMAP_CLR_ALL(dst); - int port=MUX_START_INDEX; - for(port=MUX_START_INDEX;port<=NUM_OF_ALL_PORT;port++){ - if(onlp_sfpi_is_rx_los(port)) - AIM_BITMAP_SET(dst, port); + int port; + int isrxlos; + for(port = 0; port < NUM_OF_ALL_PORT; port++) { + if(onlp_sfpi_is_present(port) == true) { + isrxlos = onlp_sfpi_is_rx_los(port); + if(isrxlos == true) { + AIM_BITMAP_MOD(dst, port, 1); + } else if(isrxlos == false) { + AIM_BITMAP_MOD(dst, port, 0); + } else { + return ONLP_STATUS_E_INTERNAL; + } + } } return ONLP_STATUS_OK; } @@ -212,12 +228,14 @@ onlp_sfpi_eeprom_read(int port, uint8_t data[256]) * Return OK if eeprom is read */ memset(data, 0, 256); - - int byte = -1; - byte = onlp_i2c_read(onlp_sfpi_port2chan(port), 0x50, 0, 256, data, 0); - if(byte < 0){ + + if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; } + int sts; + int bus = FRONT_PORT_TO_MUX_INDEX(port); + sts = onlp_i2c_read(bus, QSFP_DEV_ADDR, 0, 256, data, ONLP_I2C_F_FORCE); + if(sts < 0) { AIM_LOG_ERROR("Unable to read eeprom from port(%d)\r\n", port); - return ONLP_STATUS_E_INTERNAL; + return ONLP_STATUS_E_MISSING; } return ONLP_STATUS_OK; } @@ -225,64 +243,59 @@ onlp_sfpi_eeprom_read(int port, uint8_t data[256]) int onlp_sfpi_dev_readb(int port, uint8_t devaddr, uint8_t addr) { - int bus = onlp_sfpi_port2chan(port); + if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; } + int bus = FRONT_PORT_TO_MUX_INDEX(port); return onlp_i2c_readb(bus, devaddr, addr, ONLP_I2C_F_FORCE); } int onlp_sfpi_dev_writeb(int port, uint8_t devaddr, uint8_t addr, uint8_t value) { - int bus = onlp_sfpi_port2chan(port); + if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; } + int bus = FRONT_PORT_TO_MUX_INDEX(port); return onlp_i2c_writeb(bus, devaddr, addr, value, ONLP_I2C_F_FORCE); } int onlp_sfpi_dev_readw(int port, uint8_t devaddr, uint8_t addr) { - int bus = onlp_sfpi_port2chan(port); + if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; } + int bus = FRONT_PORT_TO_MUX_INDEX(port); return onlp_i2c_readw(bus, devaddr, addr, ONLP_I2C_F_FORCE); } int onlp_sfpi_dev_writew(int port, uint8_t devaddr, uint8_t addr, uint16_t value) { - int bus = onlp_sfpi_port2chan(port); + if(onlp_sfpi_port_type(port) < 0) { return ONLP_STATUS_E_INVALID; } + int bus = FRONT_PORT_TO_MUX_INDEX(port); return onlp_i2c_writew(bus, devaddr, addr, value, ONLP_I2C_F_FORCE); } int onlp_sfpi_control_supported(int port, onlp_sfp_control_t control, int* rv) { + *rv = 0; + int p_type = onlp_sfpi_port_type(port); + if(p_type < 0) { return ONLP_STATUS_E_INVALID; } switch (control) { - case ONLP_SFP_CONTROL_RESET_STATE: - if(port >= NUM_OF_SFP_PORT && port < (NUM_OF_SFP_PORT + NUM_OF_QSFP_PORT)){ - *rv = 1; - } - else{ - *rv = 0; - } - break; - case ONLP_SFP_CONTROL_RX_LOS: - *rv = 0; - break; - case ONLP_SFP_CONTROL_TX_DISABLE: - if(port <= NUM_OF_SFP_PORT){ - *rv = 1; - } - else if(port >= NUM_OF_SFP_PORT && port < (NUM_OF_SFP_PORT + NUM_OF_QSFP_PORT)){ - *rv = 0; - } - break; - case ONLP_SFP_CONTROL_LP_MODE: - if(port >= NUM_OF_SFP_PORT && port < (NUM_OF_SFP_PORT + NUM_OF_QSFP_PORT)){ - *rv = 1; - } - else{ - *rv = 0; - } - break; - default: - break; + case ONLP_SFP_CONTROL_RESET_STATE: + if(p_type == ONLP_PORT_TYPE_QSFP) { + *rv = 1; + } + break; + case ONLP_SFP_CONTROL_TX_DISABLE: + if(p_type == ONLP_PORT_TYPE_SFP) { + *rv = 1; + } + break; + case ONLP_SFP_CONTROL_LP_MODE: + if(p_type == ONLP_PORT_TYPE_QSFP) { + *rv = 1; + } + break; + default: + break; } return ONLP_STATUS_OK; @@ -291,100 +304,69 @@ onlp_sfpi_control_supported(int port, onlp_sfp_control_t control, int* rv) int onlp_sfpi_control_set(int port, onlp_sfp_control_t control, int value) { - int ret_val = 0; - int err = 0; + int ret = ONLP_STATUS_E_UNSUPPORTED; + int p_type = onlp_sfpi_port_type(port); + if(p_type < 0) { return ONLP_STATUS_E_INVALID; } switch (control) { - case ONLP_SFP_CONTROL_RESET_STATE: - err = onlp_sfpi_set_file_byte(port, "reset", value); - if(err == ONLP_STATUS_E_UNSUPPORTED){ - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; - } - ret_val = ONLP_STATUS_OK; - break; - case ONLP_SFP_CONTROL_RX_LOS: - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; - case ONLP_SFP_CONTROL_TX_DISABLE: - err = onlp_sfpi_set_file_byte(port, "tx_disable", value); - if(err == ONLP_STATUS_E_UNSUPPORTED){ - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; - } - ret_val = ONLP_STATUS_OK; - break; - case ONLP_SFP_CONTROL_LP_MODE: - err = onlp_sfpi_set_file_byte(port, "lpmod", value); - if(err == ONLP_STATUS_E_UNSUPPORTED){ - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; - } - ret_val = ONLP_STATUS_OK; - break; - default: - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; + case ONLP_SFP_CONTROL_RESET_STATE: + if(p_type == ONLP_PORT_TYPE_QSFP) { + ret = onlp_file_write_int(value, INV_SFP_PREFIX"port%d/reset", port); + } + break; + case ONLP_SFP_CONTROL_TX_DISABLE: + if(p_type == ONLP_PORT_TYPE_SFP) { + ret = onlp_file_write_int(value, INV_SFP_PREFIX"port%d/tx_disable", port); + } + break; + case ONLP_SFP_CONTROL_LP_MODE: + if(p_type == ONLP_PORT_TYPE_QSFP) { + ret = onlp_file_write_int(value, INV_SFP_PREFIX"port%d/lpmod", port); + } + break; + default: + break; } - return ret_val; + + return ret; } int onlp_sfpi_control_get(int port, onlp_sfp_control_t control, int* value) { - int ret_val = 0; - int err = 0; - + int ret = ONLP_STATUS_E_UNSUPPORTED; + int p_type = onlp_sfpi_port_type(port); + if(p_type < 0) { return ONLP_STATUS_E_INVALID; } switch (control) { - case ONLP_SFP_CONTROL_RESET_STATE: - err = onlp_sfpi_get_file_byte(port, "reset"); - if(err == ONLP_STATUS_E_UNSUPPORTED){ - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; - } - *value = err; - ret_val = ONLP_STATUS_OK; - break; - case ONLP_SFP_CONTROL_RX_LOS: - err = onlp_sfpi_get_file_byte(port, "rxlos"); - if(err == ONLP_STATUS_E_UNSUPPORTED){ - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; - } - *value = err; - ret_val = ONLP_STATUS_OK; - break; - case ONLP_SFP_CONTROL_TX_DISABLE: - err = onlp_sfpi_get_file_byte(port, "tx_disable"); - if(err == ONLP_STATUS_E_UNSUPPORTED){ - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; - } - *value = err; - ret_val = ONLP_STATUS_OK; - break; - case ONLP_SFP_CONTROL_LP_MODE: - err = onlp_sfpi_get_file_byte(port, "lpmod"); - if(err == ONLP_STATUS_E_UNSUPPORTED){ - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; - } - *value = err; - ret_val = ONLP_STATUS_OK; - break; - case ONLP_SFP_CONTROL_TX_FAULT: - err = onlp_sfpi_get_file_byte(port, "tx_fault"); - if(err == ONLP_STATUS_E_UNSUPPORTED){ - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; - } - *value = err; - ret_val = ONLP_STATUS_OK; - break; - default: - ret_val = ONLP_STATUS_E_UNSUPPORTED; - break; + case ONLP_SFP_CONTROL_RESET_STATE: + if(p_type == ONLP_PORT_TYPE_QSFP) { + ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/reset", port); + } + break; + case ONLP_SFP_CONTROL_RX_LOS: + if(p_type == ONLP_PORT_TYPE_SFP) { + ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/rxlos", port); + } + break; + case ONLP_SFP_CONTROL_TX_DISABLE: + if(p_type == ONLP_PORT_TYPE_SFP) { + ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/tx_disable", port); + } + break; + case ONLP_SFP_CONTROL_LP_MODE: + if(p_type == ONLP_PORT_TYPE_QSFP) { + ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/lpmod", port); + } + break; + case ONLP_SFP_CONTROL_TX_FAULT: + if(p_type == ONLP_PORT_TYPE_SFP) { + ret = onlp_file_read_int(value, INV_SFP_PREFIX"port%d/tx_fault", port); + } + break; + default: + break; } - return ret_val; + + return ret; } int @@ -398,3 +380,9 @@ onlp_sfpi_debug(int port, aim_pvs_t* pvs) { aim_printf(pvs, "Debug data for port %d goes here.", port); } + +int +onlp_sfpi_ioctl(int port, va_list vargs) +{ + return ONLP_STATUS_E_UNSUPPORTED; +} diff --git a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/sysi.c b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/sysi.c index f1544719..7e0ee398 100644 --- a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/sysi.c +++ b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/sysi.c @@ -66,124 +66,26 @@ #define TLV_CODE_VENDOR_EXT 0xFD #define TLV_CODE_CRC_32 0xFE - -typedef struct sysi_onie_vpd_s { - uint8_t type; - char file[ONLP_CONFIG_INFO_STR_MAX]; -} sysi_onie_vpd_t; - - - - - -typedef struct sysi_platform_info_s { - char type[SYSI_PLATFORM_INFO_TYPE_STR_MAX]; - char file[ONLP_CONFIG_INFO_STR_MAX]; - int (*parsing_func_ptr)(char* file_str, char* version); -} sysi_platform_info_t; - -static int _sysi_cpld_version_parsing(char* file_str, char* version); -static int _sysi_psoc_version_parsing(char* file_str, char* version); -static int _sysi_onie_product_name_get(char** product_name); -static int _sysi_onie_part_number_get(char** part_number); -static int _sysi_onie_serial_number_get(char** serial_number); -static int _sysi_onie_mac_base_get(uint8_t mac_base[6]); -static int _sysi_onie_manuf_date_get(char** manuf_date); -static int _sysi_onie_device_version_get(uint8_t* device_version); -static int _sysi_onie_label_revision_get(char** label_revision); -static int _sysi_onie_platform_name_get(char** platform_name); -static int _sysi_onie_onie_version_get(char** onie_version); -static int _sysi_onie_mac_size_get(uint16_t* mac_size); -static int _sysi_onie_manuf_name_get(char** manuf_name); -static int _sysi_onie_manuf_country_get(char** manuf_country); -static int _sysi_onie_vendor_name_get(char** vendor_name); -static int _sysi_onie_diag_version_get(char** diag_version); -static int _sysi_onie_service_tag_get(char** service_tag); -static int _sysi_onie_vendor_ext_get(list_head_t *vendor_ext); -static int _sysi_onie_crc_32_get(uint32_t* crc_32); - -static int _sysi_onie_info_total_len_get(onlp_onie_info_t *onie, uint16_t *total_len); - - - -static sysi_onie_vpd_t __tlv_vpd_info[SYSI_ONIE_TYPE_SUPPORT_NUM] = { - { - TLV_CODE_PRODUCT_NAME, - "/sys/class/eeprom/vpd/product_name" - }, - { - TLV_CODE_PART_NUMBER, - "/sys/class/eeprom/vpd/pn" - }, - { - TLV_CODE_SERIAL_NUMBER, - "/sys/class/eeprom/vpd/sn" - }, - { - TLV_CODE_MAC_BASE, - "/sys/class/eeprom/vpd/base_mac_addr" - }, - { - TLV_CODE_MANUF_DATE, - "/sys/class/eeprom/vpd/man_date" - }, - { - TLV_CODE_DEVICE_VERSION, - "/sys/class/eeprom/vpd/dev_ver" - }, - { - TLV_CODE_LABEL_REVISION, - "/sys/class/eeprom/vpd/label_rev" - }, - { - TLV_CODE_PLATFORM_NAME, - "/sys/class/eeprom/vpd/plat_name" - }, - { - TLV_CODE_ONIE_VERSION, - "/sys/class/eeprom/vpd/ldr_ver" - }, - { - TLV_CODE_MAC_SIZE, - "/sys/class/eeprom/vpd/mac_addr" - }, - { - TLV_CODE_MANUF_NAME, - "/sys/class/eeprom/vpd/manufacturer" - }, - { - TLV_CODE_MANUF_COUNTRY, - "/sys/class/eeprom/vpd/country_code" - }, - { - TLV_CODE_VENDOR_NAME, - "/sys/class/eeprom/vpd/vendor_name" - }, - { - TLV_CODE_DIAG_VERSION, - "/sys/class/eeprom/vpd/diag_ver" - }, - { - TLV_CODE_SERVICE_TAG, - "/sys/class/eeprom/vpd/service_tag" - }, - { - TLV_CODE_VENDOR_EXT, - "/sys/class/eeprom/vpd/vendor_ext" - }, - { - TLV_CODE_CRC_32, - "/sys/class/eeprom/vpd/crc32" - } +static uint8_t __tlv_code_list[SYSI_ONIE_TYPE_SUPPORT_NUM] = { + TLV_CODE_PRODUCT_NAME, + TLV_CODE_PART_NUMBER, + TLV_CODE_SERIAL_NUMBER, + TLV_CODE_MAC_BASE, + TLV_CODE_MANUF_DATE, + TLV_CODE_DEVICE_VERSION, + TLV_CODE_LABEL_REVISION, + TLV_CODE_PLATFORM_NAME, + TLV_CODE_ONIE_VERSION, + TLV_CODE_MAC_SIZE, + TLV_CODE_MANUF_NAME, + TLV_CODE_MANUF_COUNTRY, + TLV_CODE_VENDOR_NAME, + TLV_CODE_DIAG_VERSION, + TLV_CODE_SERVICE_TAG, + TLV_CODE_VENDOR_EXT, + TLV_CODE_CRC_32 }; - -static sysi_platform_info_t __platform_info[SYSI_PLATFORM_INFO_NUM] = { - {"cpld", "/sys/class/hwmon/hwmon2/device/info",_sysi_cpld_version_parsing}, - {"psoc", "/sys/class/hwmon/hwmon1/device/version",_sysi_psoc_version_parsing} -}; - - static onlp_oid_t __oid_info[] = { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_PHY), ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE0), @@ -202,15 +104,15 @@ static onlp_oid_t __oid_info[] = { ONLP_FAN_ID_CREATE(ONLP_FAN_5), ONLP_PSU_ID_CREATE(ONLP_PSU_1), ONLP_PSU_ID_CREATE(ONLP_PSU_2), - ONLP_LED_ID_CREATE(ONLP_LED_MGMT_GREEN), - ONLP_LED_ID_CREATE(ONLP_LED_MGMT_RED), - 0 /*end*/ + ONLP_LED_ID_CREATE(ONLP_LED_MGMT), + 0/*end*/ }; +static int _sysi_version_parsing(char* file_str, char* str_buf, char* version); +static void _case_tlv_code_string(onlp_onie_info_t* info, char** member, char* path); +static int _parse_tlv(onlp_onie_info_t* info, uint8_t type); - - -static int _sysi_cpld_version_parsing(char* file_str, char* version) +static int _sysi_version_parsing(char* file_str, char* str_buf, char* version) { int rv = ONLP_STATUS_OK; int len; @@ -218,731 +120,151 @@ static int _sysi_cpld_version_parsing(char* file_str, char* version) char *temp; rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX*4, &len, file_str); + if( rv != ONLP_STATUS_OK ) { return rv; } - temp = strstr(buf, "The CPLD version is "); + temp = strstr(buf, str_buf); if(temp) { - temp += strlen("The CPLD version is "); + temp += strlen(str_buf); snprintf(version,ONLP_CONFIG_INFO_STR_MAX, temp); /*remove '\n'*/ - version[strlen(version)-1] = 0; + version[strlen(version)-1] = '\0'; } else { rv = ONLP_STATUS_E_MISSING; } return rv; } -static int _sysi_psoc_version_parsing(char* file_str, char* version) +static void _case_tlv_code_string(onlp_onie_info_t* info, char** member, char* path) { int rv = ONLP_STATUS_OK; int len; char buf[ONLP_CONFIG_INFO_STR_MAX]; - char *temp; - - rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, file_str); - temp = strstr(buf, "ver: "); - if(temp) { - temp += strlen("ver: "); - snprintf(version,ONLP_CONFIG_INFO_STR_MAX, temp); - /*remove '\n'*/ - version[strlen(version)-1] = 0; + rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, path); + if( rv == ONLP_STATUS_OK ) { + info->_hdr_length += 2; + buf[strlen(buf)-1] = '\0'; + *member = aim_fstrdup("%s",buf); + info->_hdr_length += strlen(*member); } else { - rv = ONLP_STATUS_E_MISSING; - } - return rv; -} - -static int _sysi_onie_product_name_get(char** product_name) -{ - int rv = ONLP_STATUS_OK; - int i; - int len; - char* path; - char buf[ONLP_CONFIG_INFO_STR_MAX]; - - for(i=0; iproduct_name), INV_SYS_PREFIX"product_name"); + break; + case TLV_CODE_PART_NUMBER: + _case_tlv_code_string(info, &(info->part_number), INV_SYS_PREFIX"pn"); + break; + case TLV_CODE_SERIAL_NUMBER: + _case_tlv_code_string(info, &(info->serial_number), INV_SYS_PREFIX"sn"); + break; + case TLV_CODE_MANUF_DATE: + _case_tlv_code_string(info, &(info->manufacture_date), INV_SYS_PREFIX"man_date"); + break; + case TLV_CODE_LABEL_REVISION: + _case_tlv_code_string(info, &(info->label_revision), INV_SYS_PREFIX"label_rev"); + break; + case TLV_CODE_PLATFORM_NAME: + _case_tlv_code_string(info, &(info->platform_name), INV_SYS_PREFIX"plat_name"); + break; + case TLV_CODE_ONIE_VERSION: + _case_tlv_code_string(info, &(info->onie_version), INV_SYS_PREFIX"ldr_ver"); + break; + case TLV_CODE_MANUF_NAME: + _case_tlv_code_string(info, &(info->manufacturer), INV_SYS_PREFIX"manufacturer"); + break; + case TLV_CODE_MANUF_COUNTRY: + _case_tlv_code_string(info, &(info->country_code), INV_SYS_PREFIX"country_code"); + break; + case TLV_CODE_VENDOR_NAME: + _case_tlv_code_string(info, &(info->vendor), INV_SYS_PREFIX"vendor_name"); + break; + case TLV_CODE_SERVICE_TAG: + _case_tlv_code_string(info, &(info->service_tag), INV_SYS_PREFIX"service_tag"); + break; + case TLV_CODE_DIAG_VERSION: + _case_tlv_code_string(info, &(info->diag_version), INV_SYS_PREFIX"diag_ver"); + break; - for(i=0; imac[0], &info->mac[1], &info->mac[2], + &info->mac[3], &info->mac[4], &info->mac[5]) == 6) { + info->_hdr_length += 2; + info->_hdr_length += 6; + } else { + /*parsing fail*/ + memset(info->mac, 0, 6); + } + } else { + memset(info->mac, 0, 6); + rv = ONLP_STATUS_OK; + } + break; + + case TLV_CODE_DEVICE_VERSION: + rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, INV_SYS_PREFIX"dev_ver"); + if( rv == ONLP_STATUS_OK ) { + info->_hdr_length += 2; + info->device_version= (uint8_t)strtoul(buf, NULL, 0); + info->_hdr_length += 1; + } else { + info->device_version = 0; + rv = ONLP_STATUS_OK; + } + break; + case TLV_CODE_MAC_SIZE: + rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, INV_SYS_PREFIX"mac_addr"); + if( rv == ONLP_STATUS_OK ) { + info->_hdr_length += 2; + info->mac_range = (uint16_t)strtoul(buf, NULL, 0); + info->_hdr_length += 2; + } else { + info->mac_range = 0; + rv = ONLP_STATUS_OK; + } + break; + + case TLV_CODE_VENDOR_EXT: + list_init(&info->vx_list); + rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, INV_SYS_PREFIX"vendor_ext"); + if( rv == ONLP_STATUS_OK ) { + /*TODO*/ } - } - if( SYSI_ONIE_TYPE_SUPPORT_NUM == i) { - /* Cannot find support type */ - rv = ONLP_STATUS_E_UNSUPPORTED; - } - if( ONLP_STATUS_OK == rv) { - /*get info*/ - rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, path); - } - if( ONLP_STATUS_OK == rv) { - /*remove \n in file output*/ - buf[strlen(buf)-1] = 0; - *part_number = aim_fstrdup("%s",buf); - } else { - /*alloc a empty array for it*/ - *part_number = aim_zmalloc(1); rv = ONLP_STATUS_OK; - } + break; + case TLV_CODE_CRC_32: + rv = onlp_file_read((uint8_t*)buf,ONLP_CONFIG_INFO_STR_MAX, &len, INV_SYS_PREFIX"crc32"); + if( rv == ONLP_STATUS_OK ) { + info->_hdr_length += 2; + info->crc = (uint32_t)strtoul(buf, NULL, 0); + info->_hdr_length += 4; + } else { + info->crc = 0; + rv = ONLP_STATUS_OK; + } + break; + + default: + break; + } return rv; } -static int _sysi_onie_serial_number_get(char** serial_number) -{ - int rv = ONLP_STATUS_OK; - int i; - int len; - char* path; - char buf[ONLP_CONFIG_INFO_STR_MAX]; - - for(i=0; iproduct_name)!= 0) { - len += 2; - len += strlen(onie->product_name); - } - /*part_number*/ - if(strlen(onie->part_number)!= 0) { - len += 2; - len += strlen(onie->part_number); - } - /*serial_number*/ - if(strlen(onie->serial_number)!= 0) { - len += 2; - len += strlen(onie->serial_number); - } - - /*mac*/ - len += 2; - len += 6; - - /*manufacture_date*/ - if(strlen(onie->manufacture_date)!= 0) { - len += 2; - len += 19; - } - - /*device_version*/ - len += 2; - len += 1; - - /*label_revision*/ - if(strlen(onie->label_revision)!= 0) { - len += 2; - len += strlen(onie->label_revision); - } - - /*platform_name*/ - if(strlen(onie->platform_name)!= 0) { - len += 2; - len += strlen(onie->platform_name); - } - - /*onie_version*/ - if(strlen(onie->onie_version)!= 0) { - len += 2; - len += strlen(onie->onie_version); - } - - /*mac_range*/ - len += 2; - len += 2; - - /*manufacturer*/ - if(strlen(onie->manufacturer)!= 0) { - len += 2; - len += strlen(onie->manufacturer); - } - - /*country_code*/ - if(strlen(onie->country_code)!= 0) { - len += 2; - len += 2; - } - - /*vendor*/ - if(strlen(onie->vendor)!= 0) { - len += 2; - len += strlen(onie->vendor); - } - - /*diag_version*/ - if(strlen(onie->diag_version)!= 0) { - len += 2; - len += strlen(onie->diag_version); - } - - /*service_tag*/ - if(strlen(onie->service_tag)!= 0) { - len += 2; - len += strlen(onie->service_tag); - } - - /*crc*/ - len += 2; - len += 4; - - /*vx_list*/ - /*TODO*/ - - *total_len = len; - return ONLP_STATUS_OK; -} - - - const char* onlp_sysi_platform_get(void) { @@ -1023,70 +345,21 @@ onlp_sysi_onie_data_free(uint8_t* data) } } + int onlp_sysi_onie_info_get (onlp_onie_info_t *onie) { int rv = ONLP_STATUS_OK; - uint16_t total_len; + int i; + onie->_hdr_length = 0; + for(i = 0; i < SYSI_ONIE_TYPE_SUPPORT_NUM; i++) { + if( rv != ONLP_STATUS_OK ) { return rv; } + rv = _parse_tlv(onie, (__tlv_code_list[i])); - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_product_name_get(&onie->product_name); } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_part_number_get(&onie->part_number); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_serial_number_get(&onie->serial_number); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_mac_base_get(onie->mac); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_manuf_date_get(&onie->manufacture_date); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_device_version_get(&onie->device_version); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_label_revision_get(&onie->label_revision); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_platform_name_get(&onie->platform_name); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_onie_version_get(&onie->onie_version); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_mac_size_get(&onie->mac_range); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_manuf_name_get(&onie->manufacturer); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_manuf_country_get(&onie->country_code); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_vendor_name_get(&onie->vendor); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_diag_version_get(&onie->diag_version); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_service_tag_get(&onie->service_tag); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_vendor_ext_get(&onie->vx_list); - } - if(ONLP_STATUS_OK == rv) { - rv = _sysi_onie_crc_32_get(&onie->crc); - } - - _sysi_onie_info_total_len_get(onie, &total_len); - onie->_hdr_id_string = aim_fstrdup("TlvInfo"); onie->_hdr_version = 0x1; - onie->_hdr_length = total_len; return rv; } @@ -1094,25 +367,20 @@ onlp_sysi_onie_info_get (onlp_onie_info_t *onie) int onlp_sysi_platform_info_get(onlp_platform_info_t* pi) { - int i; int rv = ONLP_STATUS_OK; char cpld_str[ONLP_CONFIG_INFO_STR_MAX]= {0}; char other_str[ONLP_CONFIG_INFO_STR_MAX]= {0}; char version[ONLP_CONFIG_INFO_STR_MAX]; + pi->cpld_versions = NULL; + pi->other_versions = NULL; - for(i=0 ; i 0) { @@ -1159,7 +427,7 @@ int onlp_sysi_platform_manage_fans(void) { /*Ensure switch manager is working*/ - PLATFORM_PSOC_DIAG_LOCK; + PLATFORM_HWMON_DIAG_LOCK; return ONLP_STATUS_OK; } @@ -1167,7 +435,7 @@ int onlp_sysi_platform_manage_leds(void) { /*Ensure switch manager is working*/ - PLATFORM_PSOC_DIAG_LOCK; + PLATFORM_HWMON_DIAG_LOCK; return ONLP_STATUS_OK; } diff --git a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/thermali.c b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/thermali.c index bcbfda1f..bad55c09 100644 --- a/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/thermali.c +++ b/packages/platforms/inventec/x86-64/x86-64-inventec-d5254/onlp/builds/src/module/src/thermali.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "platform_lib.h" #define VALIDATE(_id) \ @@ -37,88 +38,72 @@ } while(0) -typedef struct thermali_info_s { +typedef struct thermali_path_s { char file[ONLP_CONFIG_INFO_STR_MAX]; -} thermali_info_t; +} thermali_path_t; -static thermali_info_t __info_list[ONLP_THERMAL_COUNT] = { - {}, - {"/sys/class/hwmon/hwmon0/temp1_input"}, - {"/sys/class/hwmon/hwmon0/temp2_input"}, - {"/sys/class/hwmon/hwmon0/temp3_input"}, - {"/sys/class/hwmon/hwmon0/temp4_input"}, - {"/sys/class/hwmon/hwmon0/temp5_input"}, - {"/sys/class/hwmon/hwmon1/device/temp1_input"}, - {"/sys/class/hwmon/hwmon1/device/temp2_input"}, - {"/sys/class/hwmon/hwmon1/device/temp3_input"}, - {"/sys/class/hwmon/hwmon1/device/temp4_input"}, - {"/sys/class/hwmon/hwmon1/device/temp5_input"}, - {"/sys/class/hwmon/hwmon1/device/thermal_psu1"}, - {"/sys/class/hwmon/hwmon1/device/thermal2_psu1"}, - {"/sys/class/hwmon/hwmon1/device/thermal_psu2"}, - {"/sys/class/hwmon/hwmon1/device/thermal2_psu2"} +#define MAKE_THERMAL_PATH_ON_CPU(id) { INV_CTMP_PREFIX"temp"#id"_input"} +#define MAKE_THERMAL_PATH_ON_MAIN_BROAD(id) { INV_HWMON_PREFIX"temp"#id"_input"} +#define MAKE_THERMAL1_PATH_ON_PSU(psu_id) { INV_HWMON_PREFIX"thermal_psu"#psu_id} +#define MAKE_THERMAL2_PATH_ON_PSU(psu_id) { INV_HWMON_PREFIX"thermal2_psu"#psu_id} + +static thermali_path_t __path_list[ONLP_THERMAL_COUNT] = { + MAKE_THERMAL_PATH_ON_CPU(1), + MAKE_THERMAL_PATH_ON_CPU(2), + MAKE_THERMAL_PATH_ON_CPU(3), + MAKE_THERMAL_PATH_ON_CPU(4), + MAKE_THERMAL_PATH_ON_CPU(5), + MAKE_THERMAL_PATH_ON_MAIN_BROAD(1), + MAKE_THERMAL_PATH_ON_MAIN_BROAD(2), + MAKE_THERMAL_PATH_ON_MAIN_BROAD(3), + MAKE_THERMAL_PATH_ON_MAIN_BROAD(4), + MAKE_THERMAL_PATH_ON_MAIN_BROAD(5), + MAKE_THERMAL1_PATH_ON_PSU(1), + MAKE_THERMAL2_PATH_ON_PSU(1), + MAKE_THERMAL1_PATH_ON_PSU(2), + MAKE_THERMAL2_PATH_ON_PSU(2) }; +#define MAKE_THERMAL_INFO_NODE_ON_CPU_PHY \ + { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_PHY), "CPU Physical", 0}, \ + ONLP_THERMAL_STATUS_PRESENT, \ + ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS \ + } +#define MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(id) \ + { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE##id), "CPU Core "#id, 0},\ + ONLP_THERMAL_STATUS_PRESENT, \ + ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS \ + } +#define MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(id) \ + { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_##id##_ON_MAIN_BROAD), "Thermal Sensor "#id, 0}, \ + ONLP_THERMAL_STATUS_PRESENT, \ + ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS \ + } +#define MAKE_THERMAL_INFO_NODE_ON_PSU(thermal_id, psu_id) \ + { { \ + ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_##thermal_id##_ON_PSU##psu_id), \ + "PSU-"#psu_id" Thermal Sensor "#thermal_id, \ + ONLP_PSU_ID_CREATE(ONLP_PSU_##psu_id) \ + }, \ + ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS \ + } /* Static values */ static onlp_thermal_info_t __onlp_thermal_info[ONLP_THERMAL_COUNT] = { - { }, /* Not used */ - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_PHY), "CPU Physical", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE0), "CPU Core0", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE1), "CPU Core1", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE2), "CPU Core2", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_CPU_CORE3), "CPU Core3", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_MAIN_BROAD), "Thermal Sensor 1", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_MAIN_BROAD), "Thermal Sensor 2", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_3_ON_MAIN_BROAD), "Thermal Sensor 3", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_4_ON_MAIN_BROAD), "Thermal Sensor 4", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_5_ON_MAIN_BROAD), "Thermal Sensor 5", 0}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU1), "PSU-1 Thermal Sensor 1", ONLP_PSU_ID_CREATE(ONLP_PSU_1)}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU1), "PSU-1 Thermal Sensor 2", ONLP_PSU_ID_CREATE(ONLP_PSU_1)}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_1_ON_PSU2), "PSU-2 Thermal Sensor 1", ONLP_PSU_ID_CREATE(ONLP_PSU_2)}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - }, - { { ONLP_THERMAL_ID_CREATE(ONLP_THERMAL_2_ON_PSU2), "PSU-2 Thermal Sensor 2", ONLP_PSU_ID_CREATE(ONLP_PSU_2)}, - ONLP_THERMAL_STATUS_PRESENT, - ONLP_THERMAL_CAPS_GET_TEMPERATURE, 0, ONLP_THERMAL_THRESHOLD_INIT_DEFAULTS - } + MAKE_THERMAL_INFO_NODE_ON_CPU_PHY, + MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(0), + MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(1), + MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(2), + MAKE_THERMAL_INFO_NODE_ON_CPU_CORE(3), + MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(1), + MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(2), + MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(3), + MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(4), + MAKE_THERMAL_INFO_NODE_ON_MAIN_BROAD(5), + MAKE_THERMAL_INFO_NODE_ON_PSU(1,1), + MAKE_THERMAL_INFO_NODE_ON_PSU(2,1), + MAKE_THERMAL_INFO_NODE_ON_PSU(1,2), + MAKE_THERMAL_INFO_NODE_ON_PSU(2,2) }; /* @@ -145,6 +130,7 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info) { int local_id; VALIDATE(id); + int ret; local_id = ONLP_OID_ID_GET(id); if(local_id >= ONLP_THERMAL_MAX) { @@ -152,8 +138,15 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info) } /* Set the onlp_oid_hdr_t and capabilities */ - *info = __onlp_thermal_info[local_id]; - return onlp_file_read_int(&info->mcelsius, __info_list[local_id].file); + *info = __onlp_thermal_info[LOCAL_ID_TO_INFO_IDX(local_id)]; + ret = onlp_thermali_status_get(id, &info->status); + if( ret != ONLP_STATUS_OK ) { return ret; } + + if(info->status & ONLP_THERMAL_STATUS_PRESENT) { + ret = onlp_file_read_int(&info->mcelsius, __path_list[LOCAL_ID_TO_INFO_IDX(local_id)].file); + } + + return ret; } @@ -165,19 +158,38 @@ onlp_thermali_info_get(onlp_oid_t id, onlp_thermal_info_t* info) int onlp_thermali_status_get(onlp_oid_t id, uint32_t* rv) { int local_id; - + int ret = ONLP_STATUS_OK; onlp_thermal_info_t* info; VALIDATE(id); + uint32_t psu_status; local_id = ONLP_OID_ID_GET(id); if(local_id >= ONLP_THERMAL_MAX) { return ONLP_STATUS_E_INVALID; } - info = &__onlp_thermal_info[local_id]; + info = &__onlp_thermal_info[LOCAL_ID_TO_INFO_IDX(local_id)]; + + switch(local_id) { + case ONLP_THERMAL_1_ON_PSU1: + case ONLP_THERMAL_2_ON_PSU1: + case ONLP_THERMAL_1_ON_PSU2: + case ONLP_THERMAL_2_ON_PSU2: + ret = onlp_psui_status_get((&info->hdr)->poid, &psu_status); + if(ret != ONLP_STATUS_OK) {return ret;} + + if(psu_status & ONLP_PSU_STATUS_PRESENT) { + info->status |= ONLP_THERMAL_STATUS_PRESENT; + } else { + info->status = 0; + } + break; + default: + break; + } *rv = info->status; - return ONLP_STATUS_OK; + return ret; } /** @@ -195,7 +207,7 @@ int onlp_thermali_hdr_get(onlp_oid_t id, onlp_oid_hdr_t* rv) if(local_id >= ONLP_THERMAL_MAX) { return ONLP_STATUS_E_INVALID; } - info = &__onlp_thermal_info[local_id]; + info = &__onlp_thermal_info[LOCAL_ID_TO_INFO_IDX(local_id)]; *rv = info->hdr;