update d5254 for onlp

This commit is contained in:
wanda
2019-01-03 16:15:10 +08:00
parent 7e34979bbd
commit 04e5a741bb
8 changed files with 1020 additions and 1866 deletions

View File

@@ -27,179 +27,56 @@
#include <onlplib/file.h>
#include <fcntl.h>
#include <unistd.h>
#include <onlp/platformi/psui.h>
#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;

View File

@@ -29,6 +29,7 @@
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <onlp/platformi/fani.h>
#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;
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -23,8 +23,8 @@
*
*
***********************************************************/
#include <onlp/platformi/sfpi.h>
#include <onlp/platformi/sfpi.h>
#include <fcntl.h> /* For O_RDWR && open */
#include <stdio.h>
#include <string.h>
@@ -33,19 +33,41 @@
#include <onlplib/i2c.h>
#include "platform_lib.h"
#include <dirent.h>
#include <onlplib/file.h>
#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;
}

View File

@@ -27,6 +27,7 @@
#include <onlplib/file.h>
#include <onlp/platformi/thermali.h>
#include <fcntl.h>
#include <onlp/platformi/psui.h>
#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;