diff --git a/bin/Barreleye.py b/bin/Barreleye.py index 6e8a8a49..e05d985f 100755 --- a/bin/Barreleye.py +++ b/bin/Barreleye.py @@ -212,7 +212,7 @@ 'process_name' : 'info', }, 'fan_algorithm' : { - 'system_state' : 'HOST_POWERED_ON', + 'system_state' : 'BMC_READY', 'start_process' : True, 'monitor_process' : True, 'process_name' : 'fan_algorithm', diff --git a/objects/fan_algorithm.c b/objects/fan_algorithm.c index 477b7cb5..1077d556 100755 --- a/objects/fan_algorithm.c +++ b/objects/fan_algorithm.c @@ -92,7 +92,6 @@ const char *gIntPath = "org.openbmc.SensorValue"; char *gMessage = NULL; -sd_bus *bus = NULL; #define MAX_BYTES 255 @@ -126,73 +125,72 @@ int Openloopspeed = 0; int Closeloopspeed = 0; int Finalfanspeed = 0; -static int i2c_open() { - int fd; - char fn[32]; - int rc; - - g_bus = 6; - snprintf(fn, sizeof(fn), "/dev/i2c-%d", g_bus); - fd = open(fn, O_RDWR); - if (fd == -1) { - LOG_ERR(errno, "Failed to open i2c device %s", fn); - close(fd); - return -1; - } - return fd; +static int i2c_open() +{ + int rc = 0, fd = -1; + char fn[32]; + + g_bus = 6; + snprintf(fn, sizeof(fn), "/dev/i2c-%d", g_bus); + fd = open(fn, O_RDWR); + if (fd == -1) { + LOG_ERR(errno, "Failed to open i2c device %s", fn); + close(fd); + return -1; + } + return fd; } -static int SetFanLed(int fd,int color) { - struct i2c_rdwr_ioctl_data data; - struct i2c_msg msg[2]; - int n_msg = 0; - int rc; - - memset(&msg, 0, sizeof(msg)); - - g_slave_addr = 0x20; - g_use_pec = 0; - g_n_write = 2; - - if(color==1) //blue light - { - g_write_bytes[0] = 0x03; - g_write_bytes[1] = 0x55; - g_write_color_bytes[0] = 0x02; - g_write_color_bytes[1] = 0xaa; - } - else //red light - { - g_write_bytes[0] = 0x03; - g_write_bytes[1] = 0xaa; - g_write_color_bytes[0] = 0x02; - g_write_color_bytes[1] = 0x55; - } +static int SetFanLed(int fd,int color) +{ + struct i2c_rdwr_ioctl_data data; + struct i2c_msg msg[2]; + int rc = 0, n_msg = 0; + + memset(&msg, 0, sizeof(msg)); + + g_slave_addr = 0x20; + g_use_pec = 0; + g_n_write = 2; + + if(color == 1) { + //blue light + g_write_bytes[0] = 0x03; + g_write_bytes[1] = 0x55; + g_write_color_bytes[0] = 0x02; + g_write_color_bytes[1] = 0xaa; + } else { + //red light + g_write_bytes[0] = 0x03; + g_write_bytes[1] = 0xaa; + g_write_color_bytes[0] = 0x02; + g_write_color_bytes[1] = 0x55; + } - if (1) { - msg[n_msg].addr = g_slave_addr; - msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0; - msg[n_msg].len = g_n_write; - msg[n_msg].buf = g_write_bytes; - n_msg++; - } - if (1) { - msg[n_msg].addr = g_slave_addr; - msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0; - msg[n_msg].len = g_n_write; - msg[n_msg].buf = g_write_color_bytes; - n_msg++; - } - data.msgs = msg; - data.nmsgs = n_msg; - rc = ioctl(fd, I2C_RDWR, &data); - if (rc < 0) { - LOG_ERR(errno, "Failed to do raw io"); - close(fd); - return -1; - } - - return 0; + if (1) { + msg[n_msg].addr = g_slave_addr; + msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0; + msg[n_msg].len = g_n_write; + msg[n_msg].buf = g_write_bytes; + n_msg++; + } + if (1) { + msg[n_msg].addr = g_slave_addr; + msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0; + msg[n_msg].len = g_n_write; + msg[n_msg].buf = g_write_color_bytes; + n_msg++; + } + data.msgs = msg; + data.nmsgs = n_msg; + rc = ioctl(fd, I2C_RDWR, &data); + if (rc < 0) { + LOG_ERR(errno, "Failed to do raw io"); + close(fd); + return -1; + } + + return 0; } @@ -218,76 +216,63 @@ int CloseLoop (int cpureading,int dimmreading) static int DIMM_differential_error = 0; static int DIMM_last_error = 0; -//CPU closeloop -CPU_tracking_error = cpureading - g_CPUVariable; -Interal_CPU_Err[intergral_i]=CPU_tracking_error; -CPU_integral_error = 0; -for(i=0;i 100) -{ - CPU_PWM_speed = 100; -} -if(CPU_PWM_speed < 0) -{ - CPU_PWM_speed = 0; -} + CPU_differential_error = CPU_tracking_error - CPU_last_error; + CPU_PID_value = g_Kp * CPU_tracking_error + g_Ki * CPU_integral_error + g_Kd * CPU_differential_error; + CPU_PWM_speed = CPU_PID_value + g_fanspeed; -CPU_last_error = CPU_tracking_error; + if(CPU_PWM_speed > 100) + CPU_PWM_speed = 100; + if(CPU_PWM_speed < 0) + CPU_PWM_speed = 0; -//DIMM closeloop + CPU_last_error = CPU_tracking_error; + //DIMM closeloop DIMM_tracking_error = dimmreading - g_DIMMVariable; - Interal_DIMM_Err[intergral_i]=DIMM_tracking_error; - intergral_i++; - DIMM_integral_error = 0; - for(i=0;i 100) - { - DIMM_PWM_speed = 100; - } - if(DIMM_PWM_speed < 0) - { - DIMM_PWM_speed = 0; - } + if(DIMM_PWM_speed > 100) + DIMM_PWM_speed = 100; + + if(DIMM_PWM_speed < 0) + DIMM_PWM_speed = 0; DIMM_last_error = DIMM_tracking_error; - if (DIMM_PWM_speed>CPU_PWM_speed) - Closeloopspeed=DIMM_PWM_speed; + if (DIMM_PWM_speed > CPU_PWM_speed) + Closeloopspeed = DIMM_PWM_speed; else - Closeloopspeed=CPU_PWM_speed; + Closeloopspeed = CPU_PWM_speed; if(intergral_i == g_Sampling_N) intergral_i = 0; - - } int OpenLoop (int sensorreading) { - - int speed = 0; float paramA= 0; float paramB= 2; @@ -295,268 +280,220 @@ int OpenLoop (int sensorreading) int Low_Amb = 20; int Up_Amb = 40; - if (sensorreading >= Up_Amb) - { - speed = 100; - //printf("## Ambient >=%dC, the Fan duty is %d \n",Up_Amb,speed); - } - else if (sensorreading <= Low_Amb) - { - speed = 40; - //printf("## Ambient <=%dC, the Fan duty is %d \n",Low_Amb,speed); - } - else - { + if (sensorreading >= Up_Amb) { + speed = 100; +// printf("## Ambient >=%dC, the Fan duty is %d \n",Up_Amb,speed); + } else if (sensorreading <= Low_Amb) { + speed = 40; +// printf("## Ambient <=%dC, the Fan duty is %d \n",Low_Amb,speed); + } else { speed = ( paramA * sensorreading * sensorreading ) + ( paramB * sensorreading ) + paramC; + if(speed > 100) - { speed = 100; - } + if(speed < 40) - { speed = 40; - } - // printf("The Fan duty is %d \n",speed); - +// printf("The Fan duty is %d \n",speed); } - Openloopspeed=speed; + Openloopspeed = speed; -return 0; + return 0; } - - -int Fan_control_algorithm(void) { - - sd_bus *bus; - sd_bus_slot *slot; - int r, Ambient_reading, rc,retry,i; +int Fan_control_algorithm(void) +{ + sd_bus *bus = NULL; + sd_bus_error bus_error = SD_BUS_ERROR_NULL; + sd_bus_message *response = NULL; + int Ambient_reading = 0, rc = 0, i = 0; int CPU0_core_temperature[12]; int CPU1_core_temperature[12]; int DIMM_temperature[32]; int HighestCPUtemp = 0; int HighestDIMMtemp = 0; int CPUnocore[2]; - int fd; + int fd = -1; int FinalFanSpeed = 0; - int CPUtemp=0; - - r = -1; - while(r < 0) { - /* Connect to the user bus this time */ - r = sd_bus_open_system(&bus); - if(r < 0){ - fprintf(stderr, "fan 1 Failed to connect to system bus: %s\n", strerror(-r)); - sleep(1); - } + int CPUtemp = 0; + do { + /* Connect to the user bus this time */ + rc = sd_bus_open_system(&bus); + if(rc < 0) { + fprintf(stderr, "fan 1 Failed to connect to system bus: %s\n", strerror(-rc)); + bus = sd_bus_flush_close_unref(bus); + sleep(1); } - // SD Bus error report mechanism. - sd_bus_error bus_error = SD_BUS_ERROR_NULL; - sd_bus_message *response = NULL, *m = NULL;; - sd_bus_error_free(&bus_error); - sd_bus_message_unref(response); - - -while(1){ - fd = i2c_open(); - CPUtemp=0; - for(i=0;i<12;i++){ - sd_bus_error_free(&bus_error); - - rc = sd_bus_call_method(bus, // On the System Bus - gService, // Service to contact - gCPU0ObjPath[i], // Object path - gIntPath, // Interface name - "getValue", // Method to be called - &bus_error, // object to return error - &response, // Response message on success - NULL); // input message (string,byte) - - if(rc < 0) - { - //fprintf(stderr, "gCPU0ObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message); - // goto finish; - CPU0_core_temperature[i]=0; - } - else - { - rc = sd_bus_message_read(response, "v","i", &CPU0_core_temperature[i]); - if (rc < 0 ) - { - // fprintf(stderr, "gCPU0ObjPath Failed to parse response message:[%s]\n", strerror(-rc)); - // goto finish; + } while (rc < 0); + + while (1) { + CPUtemp = 0; + for(i=0; i<12; i++) { + rc = sd_bus_call_method(bus, // On the System Bus + gService, // Service to contact + gCPU0ObjPath[i], // Object path + gIntPath, // Interface name + "getValue", // Method to be called + &bus_error, // object to return error + &response, // Response message on success + NULL); // input message (string,byte) + if(rc < 0) { +// fprintf(stderr, "gCPU0ObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message); + CPU0_core_temperature[i] = 0; + } else { + rc = sd_bus_message_read(response, "v","i", &CPU0_core_temperature[i]); + if (rc < 0 ) { + fprintf(stderr, "gCPU0ObjPath Failed to parse response message:[%s]\n", strerror(-rc)); + CPU0_core_temperature[i] = 0; + } } +// fprintf(stderr, "CPU0 core %d temperature is %d\n",i ,CPU0_core_temperature[i]); + if(CPU0_core_temperature[i] > HighestCPUtemp) { + HighestCPUtemp = CPU0_core_temperature[i]; + CPUnocore[0] = 0; + CPUnocore[1] = i; + } + CPUtemp = CPUtemp + CPU0_core_temperature[i]; + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); } - //printf("CPU0 core %d value=[%d] \n",i,CPU0_core_temperature[i]); - if(CPU0_core_temperature[i] > HighestCPUtemp ) - { - HighestCPUtemp = CPU0_core_temperature[i]; - CPUnocore[0]=0; - CPUnocore[1]=i; - } - CPUtemp=CPUtemp+CPU0_core_temperature[i]; - } - - for(i=0;i<12;i++){ - sd_bus_error_free(&bus_error); - - rc = sd_bus_call_method(bus, // On the System Bus - gService, // Service to contact - gCPU1ObjPath[i], // Object path - gIntPath, // Interface name - "getValue", // Method to be called - &bus_error, // object to return error - &response, // Response message on success - NULL); // input message (string,byte) - - if(rc < 0) - { - //fprintf(stderr, "gCPU1ObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message); - CPU1_core_temperature[i]=0; - //goto finish; - } - else - { - rc = sd_bus_message_read(response, "v","i", &CPU1_core_temperature[i]); - - } - - if(CPU1_core_temperature[i] > HighestCPUtemp ) - { - HighestCPUtemp = CPU1_core_temperature[i]; - CPUnocore[0]=1; - CPUnocore[1]=i; + for(i=0; i<12; i++) { + rc = sd_bus_call_method(bus, // On the System Bus + gService, // Service to contact + gCPU1ObjPath[i], // Object path + gIntPath, // Interface name + "getValue", // Method to be called + &bus_error, // object to return error + &response, // Response message on success + NULL); // input message (string,byte) + if(rc < 0) { +// fprintf(stderr, "gCPU1ObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message); + CPU1_core_temperature[i] = 0; + } else { + rc = sd_bus_message_read(response, "v","i", &CPU1_core_temperature[i]); + if (rc < 0 ) { + fprintf(stderr, "gCPU1ObjPath Failed to parse response message:[%s]\n", strerror(-rc)); + CPU1_core_temperature[i] = 0; + } + } +// fprintf(stderr, "CPU1 core %d temperature is %d\n",i ,CPU1_core_temperature[i]); + if(CPU1_core_temperature[i] > HighestCPUtemp ) { + HighestCPUtemp = CPU1_core_temperature[i]; + CPUnocore[0] = 1; + CPUnocore[1] = i; + } + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); } - - } - +// fprintf(stderr, "Highest CPU temperature = [%d]\n", HighestCPUtemp); - for(i=0;i<32;i++){ - sd_bus_error_free(&bus_error); - - rc = sd_bus_call_method(bus, // On the System Bus - gService, // Service to contact - gDIMMObjPath[i], // Object path - gIntPath, // Interface name - "getValue", // Method to be called - &bus_error, // object to return error - &response, // Response message on success - NULL); // input message (string,byte) - - if(rc < 0) - { - - DIMM_temperature[i]=0; - } - else - { - rc = sd_bus_message_read(response, "v","i", &DIMM_temperature[i]); - - if (rc < 0 ) - { - fprintf(stderr, "gDIMMObjPath Failed to parse response message:[%s]\n", strerror(-rc)); - + for(i=0; i<32; i++) { + rc = sd_bus_call_method(bus, // On the System Bus + gService, // Service to contact + gDIMMObjPath[i], // Object path + gIntPath, // Interface name + "getValue", // Method to be called + &bus_error, // object to return error + &response, // Response message on success + NULL); // input message (string,byte) + if(rc < 0) { +// fprintf(stderr, "gDIMMObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message); + DIMM_temperature[i] = 0; + } else { + rc = sd_bus_message_read(response, "v","i", &DIMM_temperature[i]); + if (rc < 0 ) { + fprintf(stderr, "gDIMMObjPath Failed to parse response message:[%s]\n", strerror(-rc)); + DIMM_temperature[i] = 0; + } } - +// fprintf(stderr, "DIMM %d temperature is %d\n", i, DIMM_temperature[i]); + if(DIMM_temperature[i] > HighestDIMMtemp ) + HighestDIMMtemp = DIMM_temperature[i]; + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); } +// fprintf(stderr, "Highest DIMM temperature = [%d]\n",HighestDIMMtemp); + + rc = sd_bus_call_method(bus, // On the System Bus + gService, // Service to contact + gObjPath_Ambient, // Object path + gIntPath, // Interface name + "getValue", // Method to be called + &bus_error, // object to return error + &response, // Response message on success + NULL); // input message (string,byte) + if(rc < 0) { +// fprintf(stderr, "fan2 Failed to resolve fruid to dbus: %s\n", bus_error.message); + Ambient_reading = 0; + } else { + rc = sd_bus_message_read(response, "v","i", &Ambient_reading); + if (rc < 0 ) { + fprintf(stderr, "fan3 Failed to parse response message:[%s]\n", strerror(-rc)); + Ambient_reading = 0; + } + } + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); +// fprintf(stderr, "Highest ambient inlet temperature = [%d]\n", HighestCPUtemp); - if(DIMM_temperature[i] > HighestDIMMtemp ) - HighestDIMMtemp = DIMM_temperature[i]; - } - printf("Highest DIMM temperatur is value %d \n",HighestDIMMtemp); - - - - sd_bus_error_free(&bus_error); - rc = sd_bus_call_method(bus, // On the System Bus - gService, // Service to contact - gObjPath_Ambient, // Object path - gIntPath, // Interface name - "getValue", // Method to be called - &bus_error, // object to return error - &response, // Response message on success - NULL); // input message (string,byte) - // NULL); // First argument to getObjectFromId - //"BOARD_1"); // Second Argument - - if(rc < 0) - { - fprintf(stderr, "fan2 Failed to resolve fruid to dbus: %s\n", bus_error.message); - - } - - rc = sd_bus_message_read(response, "v","i", &Ambient_reading); - if (rc < 0 ) - { - fprintf(stderr, "fan3 Failed to parse response message:[%s]\n", strerror(-rc)); - - } - - if (CPUtemp==0) - { - HighestCPUtemp=0; - HighestDIMMtemp=0; - } - - CloseLoop(HighestCPUtemp,HighestDIMMtemp); - OpenLoop(Ambient_reading); + if (CPUtemp == 0) { + HighestCPUtemp = 0; + HighestDIMMtemp = 0; + } - + CloseLoop(HighestCPUtemp,HighestDIMMtemp); + OpenLoop(Ambient_reading); - if(Openloopspeed>Closeloopspeed) - g_fanspeed=Openloopspeed; + if(Openloopspeed > Closeloopspeed) + g_fanspeed = Openloopspeed; else - g_fanspeed=Closeloopspeed; + g_fanspeed = Closeloopspeed; - if(g_fanspeed>30) - SetFanLed(fd,1); - else - SetFanLed(fd,2); - - FinalFanSpeed=g_fanspeed*255; - FinalFanSpeed=FinalFanSpeed/100; - - if(HighestCPUtemp==0) //OCC sensor does not enable - { - FinalFanSpeed=255; - } - + fd = i2c_open(); + if (fd == -1) { + fprintf(stderr, "Fail to set FAN LED\n"); + } else { + if(g_fanspeed > 30) + SetFanLed(fd,1); + else + SetFanLed(fd,2); + close(fd); + } - for(i=0;i<6;i++){ - - sd_bus_error_free(&bus_error); - rc = sd_bus_call_method(bus, // On the System Bus - gService, // Service to contact - fanObjPath[i], // Object path - gIntPath, // Interface name - "setValue", // Method to be called - &bus_error, // object to return error - &response, // Response message on success - "i", // input message (string,byte) - FinalFanSpeed); // First argument - - if(rc < 0) - { - fprintf(stderr, "fanObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message); - // goto finish; - } - - - } - - close(fd); - sleep(1); + FinalFanSpeed = g_fanspeed * 255; + FinalFanSpeed = FinalFanSpeed / 100; + + if(HighestCPUtemp == 0) //OCC sensor does not enable + FinalFanSpeed = 255; + + for(i=0; i<6; i++) { + rc = sd_bus_call_method(bus, // On the System Bus + gService, // Service to contact + fanObjPath[i], // Object path + gIntPath, // Interface name + "setValue", // Method to be called + &bus_error, // object to return error + &response, // Response message on success + "i", // input message (string,byte) + FinalFanSpeed); // First argument + if(rc < 0) + fprintf(stderr, "fanObjPath Failed to resolve fruid to dbus: %s\n", bus_error.message); + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); + } - - finish: - sd_bus_unref(bus); +finish: + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); + sd_bus_flush(bus); sleep(1); -} - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + } + bus = sd_bus_flush_close_unref(bus); + return rc < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } diff --git a/objects/info.c b/objects/info.c index d872c3fe..2b98dbb4 100644 --- a/objects/info.c +++ b/objects/info.c @@ -17,7 +17,6 @@ const char *gIntPath_c = "org.openbmc.control.Chassis"; //const char *chassis_iface = "org.openbmc.SensorValue"; char *gMessage = NULL; -sd_bus *bus = NULL; #define MAX_BYTES 255 @@ -32,323 +31,296 @@ uint8_t g_read_tmp[MAX_BYTES]; uint8_t g_bus = -1; uint8_t g_slave_addr = 0xff; -static int i2c_open() { - int fd; - char fn[32]; - int rc; - - g_bus = 6; - snprintf(fn, sizeof(fn), "/dev/i2c-%d", g_bus); - fd = open(fn, O_RDWR); - if (fd == -1) { - LOG_ERR(errno, "Failed to open i2c device %s", fn); - close(fd); - return -1; - } - - g_slave_addr = 0x4f; - rc = ioctl(fd, I2C_SLAVE, g_slave_addr); - if (rc < 0) { - LOG_ERR(errno, "Failed to open slave @ address 0x%x", g_slave_addr); - close(fd); - } - - return fd; +static int i2c_open() +{ + int rc = 0, fd = -1; + char fn[32]; + + g_bus = 6; + snprintf(fn, sizeof(fn), "/dev/i2c-%d", g_bus); + fd = open(fn, O_RDWR); + if (fd == -1) { + LOG_ERR(errno, "Failed to open i2c device %s", fn); + close(fd); + return -1; + } + + g_slave_addr = 0x4f; + + rc = ioctl(fd, I2C_SLAVE, g_slave_addr); + if (rc < 0) { + LOG_ERR(errno, "Failed to open slave @ address 0x%x", g_slave_addr); + close(fd); + } + + return fd; } static int i2c_io(int fd) { - struct i2c_rdwr_ioctl_data data; - struct i2c_msg msg[2]; - int n_msg = 0; - int rc; - - memset(&msg, 0, sizeof(msg)); - - g_slave_addr = 0x5f; - g_use_pec = 0; - g_n_write = 3; - g_write_bytes[0] = 0xfc; - g_write_bytes[1] = 0x3; - g_write_bytes[2] = 0x0; - - - g_n_read = 5; - - - if (1) { - msg[n_msg].addr = g_slave_addr; - msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0; - msg[n_msg].len = g_n_write; - msg[n_msg].buf = g_write_bytes; - n_msg++; - } - - if (1) { - msg[n_msg].addr = g_slave_addr; - msg[n_msg].flags = I2C_M_RD - | ((g_use_pec) ? I2C_CLIENT_PEC : 0) - | ((g_n_read == 0) ? I2C_M_RECV_LEN : 0); - /* - * In case of g_n_read is 0, block length will be added by - * the underlying bus driver. - */ - msg[n_msg].len = (g_n_read) ? g_n_read : 256; - msg[n_msg].buf = g_read_bytes; - if (g_n_read == 0) { - /* If we're using variable length block reads, we have to set the - * first byte of the buffer to at least one or the kernel complains. - */ - g_read_bytes[0] = 1; - } - n_msg++; - } - - data.msgs = msg; - data.nmsgs = n_msg; - - rc = ioctl(fd, I2C_RDWR, &data); - if (rc < 0) { - LOG_ERR(errno, "Failed to do raw io"); - close(fd); - return -1; - } - - return 0; + struct i2c_rdwr_ioctl_data data; + struct i2c_msg msg[2]; + int rc = 0, n_msg = 0; + + memset(&msg, 0, sizeof(msg)); + + g_slave_addr = 0x5f; + g_use_pec = 0; + g_n_write = 3; + g_write_bytes[0] = 0xfc; + g_write_bytes[1] = 0x3; + g_write_bytes[2] = 0x0; + g_n_read = 5; + + if (1) { + msg[n_msg].addr = g_slave_addr; + msg[n_msg].flags = (g_use_pec) ? I2C_CLIENT_PEC : 0; + msg[n_msg].len = g_n_write; + msg[n_msg].buf = g_write_bytes; + n_msg++; + } + + if (1) { + msg[n_msg].addr = g_slave_addr; + msg[n_msg].flags = I2C_M_RD | ((g_use_pec) ? I2C_CLIENT_PEC : 0) + | ((g_n_read == 0) ? I2C_M_RECV_LEN : 0); + /* + * In case of g_n_read is 0, block length will be added by + * the underlying bus driver. + */ + msg[n_msg].len = (g_n_read) ? g_n_read : 256; + msg[n_msg].buf = g_read_bytes; + if (g_n_read == 0) { + /* If we're using variable length block reads, we have to set the + * first byte of the buffer to at least one or the kernel complains. + */ + g_read_bytes[0] = 1; + } + n_msg++; + } + + data.msgs = msg; + data.nmsgs = n_msg; + + rc = ioctl(fd, I2C_RDWR, &data); + if (rc < 0) { + LOG_ERR(errno, "Failed to do raw io"); + close(fd); + return -1; + } + + return 0; } int get_hdd_status(void) { - int fd, i; - char *test; - test="Ken"; - char str[10]; - fd = i2c_open(); - if (fd < 0) { - return -1; - } - - if (i2c_io(fd) < 0) { - close(fd); - return -1; - } - - //printf("Received:\n "); - if (g_n_read == 0) { - g_n_read = g_read_bytes[0] + 1; - } - for (i = 0; i < g_n_read; i++) { - //printf(" 0x%x", g_read_bytes[i]); - } - if ((g_read_tmp[2]!=g_read_bytes[2])||(g_read_tmp[3]!=g_read_bytes[3])) - { - sprintf(str, "HDD change:0x%x,0x%x", g_read_bytes[2], g_read_bytes[3]); - - send_esel_to_dbus(str, "Low", "assoc", "hack", 3); - } - - g_read_tmp[2]=g_read_bytes[2]; - g_read_tmp[3]=g_read_bytes[3]; - close(fd); -} + int fd = -1, i = 0; + char *test = NULL; + test = "Ken"; + char str[10]; + + fd = i2c_open(); + if (fd < 0) + return -1; + + if (i2c_io(fd) < 0) { + close(fd); + return -1; + } -int send_esel_to_dbus(const char *desc, const char *sev, const char *details, uint8_t *debug, size_t debuglen) { +// printf("Received:\n "); + if (g_n_read == 0) + g_n_read = g_read_bytes[0] + 1; +#if 0 + for (i = 0; i < g_n_read; i++) + printf(" 0x%x", g_read_bytes[i]); +#endif + + if ((g_read_tmp[2] != g_read_bytes[2]) || (g_read_tmp[3] != g_read_bytes[3])) { + sprintf(str, "HDD change:0x%x,0x%x", g_read_bytes[2], g_read_bytes[3]); + send_esel_to_dbus(str, "Low", "assoc", "hack", 3); + } + + g_read_tmp[2]=g_read_bytes[2]; + g_read_tmp[3]=g_read_bytes[3]; + close(fd); +} + +int send_esel_to_dbus(const char *desc, const char *sev, const char *details, uint8_t *debug, size_t debuglen) +{ sd_bus *mbus = NULL; - sd_bus_error error = SD_BUS_ERROR_NULL; - sd_bus_message *reply = NULL, *m=NULL; - uint16_t x; - int r; - sd_bus_error_free(&error); + sd_bus_error error = SD_BUS_ERROR_NULL; + sd_bus_message *reply = NULL, *m = NULL; + uint16_t value = 0; + int ret = 0; + + fprintf(stderr,"add sel\n"); + ret = sd_bus_open_system(&mbus); + if (ret < 0) { + fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-ret)); + goto finish; + } - printf("add sel\n"); - r = sd_bus_open_system(&mbus); - if (r < 0) { - fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r)); + ret = sd_bus_message_new_method_call(mbus,&m, + "org.openbmc.records.events", + "/org/openbmc/records/events", + "org.openbmc.recordlog", + "acceptHostMessage"); + if (ret < 0) { + fprintf(stderr, "Failed to add the method object: %s\n", strerror(-ret)); goto finish; } - r = sd_bus_message_new_method_call(mbus,&m, - "org.openbmc.records.events", - "/org/openbmc/records/events", - "org.openbmc.recordlog", - "acceptHostMessage"); - if (r < 0) { - fprintf(stderr, "Failed to add the method object: %s\n", strerror(-r)); - goto finish; - } - - r = sd_bus_message_append(m, "sss", desc, sev, details); - if (r < 0) { - fprintf(stderr, "Failed add the message strings : %s\n", strerror(-r)); - goto finish; - } - - r = sd_bus_message_append_array(m, 'y', debug, debuglen); - if (r < 0) { - fprintf(stderr, "Failed to add the raw array of bytes: %s\n", strerror(-r)); - goto finish; - } - // Call the IPMI responder on the bus so the message can be sent to the CEC - r = sd_bus_call(mbus, m, 0, &error, &reply); - if (r < 0) { - fprintf(stderr, "Failed to call the method: %s %s\n", __FUNCTION__, strerror(-r)); - goto finish; - } - r = sd_bus_message_read(reply, "q", &x); - if (r < 0) { - fprintf(stderr, "Failed to get a rc from the method: %s\n", strerror(-r)); - } + ret = sd_bus_message_append(m, "sss", desc, sev, details); + if (ret < 0) { + fprintf(stderr, "Failed add the message strings : %s\n", strerror(-ret)); + goto finish; + } + + ret = sd_bus_message_append_array(m, 'y', debug, debuglen); + if (ret < 0) { + fprintf(stderr, "Failed to add the raw array of bytes: %s\n", strerror(-ret)); + goto finish; + } + + // Call the IPMI responder on the bus so the message can be sent to the CEC + ret = sd_bus_call(mbus, m, 0, &error, &reply); + if (ret < 0) { + fprintf(stderr, "Failed to call the method: %s %s\n", __FUNCTION__, strerror(-ret)); + goto finish; + } + ret = sd_bus_message_read(reply, "q", &value); + if (ret < 0) { + fprintf(stderr, "Failed to get a rc from the method: %s\n", strerror(-ret)); + } finish: - sd_bus_error_free(&error); - sd_bus_message_unref(m); - sd_bus_message_unref(reply); - return r; + sd_bus_error_free(&error); + m = sd_bus_message_unref(m); + reply = sd_bus_message_unref(reply); + mbus = sd_bus_flush_close_unref(mbus); + return ret; } -int start_system_information(void) { - - sd_bus *bus; - sd_bus_slot *slot; - int r, x, rc,retry; - char *OccStatus; - r = -1; - while(r < 0) { + +int start_system_information(void) +{ + sd_bus *bus = NULL; + sd_bus_error bus_error = SD_BUS_ERROR_NULL; + sd_bus_message *response = NULL; + int ret = 0, value = 0; + char *OccStatus = NULL; + /* Connect to the user bus this time */ - r = sd_bus_open_system(&bus); - if(r < 0){ - fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r)); + do { + ret = sd_bus_open_system(&bus); + if(ret < 0) { + fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-ret)); + bus = sd_bus_flush_close_unref(bus); + } sleep(1); - } - // goto finish; + } while (ret < 0); + while (1) { + ret = sd_bus_call_method(bus, // On the System Bus + gService_c, // Service to contact + gObjPath_c, // Object path + gIntPath_c, // Interface name + "getPowerState", // Method to be called + &bus_error, // object to return error + &response, // Response message on success + NULL); // input message (string,byte) + if(ret < 0) { +// fprintf(stderr, "Failed to resolve getPowerState to dbus: %s\n", bus_error.message); + goto finish; } - // SD Bus error report mechanism. - sd_bus_error bus_error = SD_BUS_ERROR_NULL; - sd_bus_message *response = NULL, *m = NULL;; - sd_bus_error_free(&bus_error); - sd_bus_message_unref(response); -// send_esel_to_dbus("desc", "sev", "assoc", "hack", 3); - -while(1){ - sd_bus_error_free(&bus_error); - - - - rc = sd_bus_call_method(bus, // On the System Bus - gService_c, // Service to contact - gObjPath_c, // Object path - gIntPath_c, // Interface name - "getPowerState", // Method to be called - &bus_error, // object to return error - &response, // Response message on success - NULL); // input message (string,byte) - // NULL); // First argument to getObjectFromId - //"BOARD_1"); // Second Argument - if(rc < 0) - { - fprintf(stderr, "Failed to resolve getPowerState to dbus: %s\n", bus_error.message); - r = sd_bus_open_system(&bus); - if(r < 0){ - fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r)); - sleep(1); - } - - goto finish; - } - - rc = sd_bus_message_read(response, "i", &x); - if (rc < 0 ) - { - fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-rc)); - goto finish; - } - printf("PowerState value=[%d] \n",x); - if (x == 0 ) goto finish; - get_hdd_status(); - sleep(1); - sd_bus_error_free(&bus_error); - rc = sd_bus_call_method(bus, // On the System Bus - gService, // Service to contact - gObjPath_o, // Object path - gIntPath, // Interface name - "getValue", // Method to be called - &bus_error, // object to return error - &response, // Response message on success - NULL); // input message (string,byte) - // NULL); // First argument to getObjectFromId - //"BOARD_1"); // Second Argument - if(rc < 0) - { - fprintf(stderr, "Failed to resolve fruid to dbus: %s\n", bus_error.message); - goto finish; - } - - rc = sd_bus_message_read(response, "v","s", &OccStatus); - if (rc < 0 ) - { - fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-rc)); - goto finish; - } - printf("OCCtate value=[%s][%d] \n",OccStatus,strcmp(OccStatus, "Disable")); + + ret = sd_bus_message_read(response, "i", &value); + if (ret < 0 ) { + fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-ret)); + goto finish; + } + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); +// fprintf(stderr,"PowerState value = [%d] \n",value); + if (value == 0 ) + goto finish; - if (strcmp(OccStatus, "Disable") != 1 ) goto finish; - - rc = sd_bus_call_method(bus, // On the System Bus - gService, // Service to contact - gObjPath, // Object path - gIntPath, // Interface name - "getValue", // Method to be called - &bus_error, // object to return error - &response, // Response message on success - NULL); // input message (string,byte) - // NULL); // First argument to getObjectFromId - //"BOARD_1"); // Second Argument - - if(rc < 0) - { - fprintf(stderr, "Failed to resolve fruid to dbus: %s\n", bus_error.message); - goto finish; - } - - rc = sd_bus_message_read(response, "v","i", &x); - if (rc < 0 ) - { - fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-rc)); - goto finish; - } - printf("CPU value=[%d] \n",x); - - if(x >= 90) - { - //printf("====Ken poweroff==== \n"); - send_esel_to_dbus("CPU thermal trip", "High", "assoc", "hack", 3); - sd_bus_error_free(&bus_error); - rc = sd_bus_call_method(bus, // On the System Bus - gService_c, // Service to contact - gObjPath_c, // Object path - gIntPath_c, // Interface name - "powerOff", // Method to be called - &bus_error, // object to return error - &response, // Response message on success - NULL); // input message (string,byte) - // NULL); // First argument to getObjectFromId - //"BOARD_1"); // Second Argument - - if(rc < 0) - { - fprintf(stderr, "Failed to resolve poweroff to dbus: %s\n", bus_error.message); - goto finish; - } + get_hdd_status(); - } + sleep(1); + + ret = sd_bus_call_method(bus, // On the System Bus + gService, // Service to contact + gObjPath_o, // Object path + gIntPath, // Interface name + "getValue", // Method to be called + &bus_error, // object to return error + &response, // Response message on success + NULL); // input message (string,byte) + if(ret < 0) { + fprintf(stderr, "Failed to resolve fruid to dbus: %s\n", bus_error.message); + goto finish; + } + ret = sd_bus_message_read(response, "v","s", &OccStatus); + if (ret < 0 ) { + fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-ret)); + goto finish; + } + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); + fprintf(stderr,"OCCState value = [%s][%d] \n",OccStatus,strcmp(OccStatus, "Disable")); + if (strcmp(OccStatus, "Disable") != 1 ) + goto finish; + + ret = sd_bus_call_method(bus, // On the System Bus + gService, // Service to contact + gObjPath, // Object path + gIntPath, // Interface name + "getValue", // Method to be called + &bus_error, // object to return error + &response, // Response message on success + NULL); // input message (string,byte) + if(ret < 0) { + fprintf(stderr, "Failed to resolve fruid to dbus: %s\n", bus_error.message); + goto finish; + } + ret = sd_bus_message_read(response, "v","i", &value); + if (ret < 0 ) { + fprintf(stderr, "Failed to parse response message:[%s]\n", strerror(-ret)); + goto finish; + } + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); + fprintf(stderr,"CPU value = [%d] \n",value); + if(value >= 90) { + //printf("====Ken poweroff==== \n"); + send_esel_to_dbus("CPU thermal trip", "High", "assoc", "hack", 3); + + ret = sd_bus_call_method(bus, // On the System Bus + gService_c, // Service to contact + gObjPath_c, // Object path + gIntPath_c, // Interface name + "powerOff", // Method to be called + &bus_error, // object to return error + &response, // Response message on success + NULL); // input message (string,byte) + + if(ret < 0) { + fprintf(stderr, "Failed to resolve poweroff to dbus: %s\n", bus_error.message); + goto finish; + } + sd_bus_error_free(&bus_error); + } - sleep(1); -/// sd_bus_unref(bus); - finish: - sd_bus_unref(bus); +finish: + sd_bus_error_free(&bus_error); + response = sd_bus_message_unref(response); + sd_bus_flush(bus); sleep(1); -} - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; + } + + bus = sd_bus_flush_close_unref(bus); + return ret < 0 ? EXIT_FAILURE : EXIT_SUCCESS; }