int mainboard_smi_apmc(u8 apmc) { ec_set_ports(EC_MAILBOX_PORT, EC_MAILBOX_PORT+1); switch (apmc) { case 0xe1: /* ACPI ENABLE */ send_ec_command(EC_SMI_DISABLE); send_ec_command(EC_ACPI_ENABLE); break; case 0x1e: /* ACPI DISABLE */ send_ec_command(EC_SMI_ENABLE); send_ec_command(EC_ACPI_DISABLE); break; case APMC_FINALIZE: if (mainboard_finalized) { printk(BIOS_DEBUG, "SMI#: Already finalized\n"); return 0; } intel_me_finalize_smm(); intel_pch_finalize_smm(); intel_sandybridge_finalize_smm(); intel_model_206ax_finalize_smm(); mainboard_finalized = 1; break; } return 0; }
void mainboard_suspend_resume(void) { /* Call SMM finalize() handlers before resume */ outb(0xcb, 0xb2); /* Enable EC ACPI mode for the OS before resume */ send_ec_command(EC_SMI_DISABLE); send_ec_command(EC_ACPI_ENABLE); }
int ec_ext_write(uint16_t addr, uint8_t data) { send_ec_command(WR_EC); send_ec_data(0x02); send_ec_data(addr & 0xff); send_ec_command(WX_EC); send_ec_data(addr >> 8); return send_ec_data(data); }
uint8_t ec_ext_read(uint16_t addr) { send_ec_command(WR_EC); send_ec_data(0x02); send_ec_data(addr & 0xff); send_ec_command(RX_EC); send_ec_data(addr >> 8); return recv_ec_data(); }
static void ec_setup(void) { /* Thermal limits? Values are from ectool's ram dump. */ ec_write(0xd1, 0x57); /* CPUH */ ec_write(0xd2, 0xc9); /* CPUL */ ec_write(0xd4, 0x64); /* SYSH */ ec_write(0xd5, 0xc9); /* SYSL */ send_ec_command(0x04); /* Set_SMI_Enable */ send_ec_command(0xab); /* Set_ACPI_Disable */ send_ec_command(0xac); /* Clr_SYS_Flag? well, why not? */ send_ec_command(0xad); /* Set_Thml_Value */ }
void mainboard_smi_gpi(u16 gpi_sts) { if (gpi_sts & (1 << EC_SMI_GPI)) { /* Process all pending EC requests */ ec_set_ports(EC_MAILBOX_PORT, EC_MAILBOX_PORT+1); while (mainboard_smi_ec() != 0xff); /* The EC may keep asserting SMI# for some * period unless we kick it here. */ send_ec_command(EC_SMI_DISABLE); send_ec_command(EC_SMI_ENABLE); } }
int mainboard_smi_apmc(u8 apmc) { switch (apmc) { case APM_CNT_ACPI_ENABLE: send_ec_command(0x05); /* Set_SMI_Disable */ send_ec_command(0xaa); /* Set_ACPI_Enable */ break; case APM_CNT_ACPI_DISABLE: send_ec_command(0x04); /* Set_SMI_Enable */ send_ec_command(0xab); /* Set_ACPI_Disable */ break; } return 0; }
uint8_t ec_read(uint8_t addr) { send_ec_command(RD_EC); send_ec_data(addr); return recv_ec_data(); }
u8 ec_read(u8 addr) { send_ec_command(0x80); send_ec_data(addr); return recv_ec_data(); }
int ec_write(uint8_t addr, uint8_t data) { send_ec_command(WR_EC); send_ec_data(addr); return send_ec_data(data); }
/** * Sets the PWM rate of a fan in IT8516E_MODE_PWM * * @param idx Selects the fan; 0: CPU, 1: System * @param pwm PWM rate measured in 255ths */ static void it8516e_set_fan_pwm(const u8 idx, const u8 pwm) { if (send_ec_command(IT8516E_CMD_SET_FAN_PWM)) return; if (send_ec_data(idx)) return; send_ec_data(pwm); }
/** * Sets the operating mode of a fan * * @param idx Selects the fan; 0: CPU, 1: System * @param mode Mode to set */ static void it8516e_set_fan_mode(const u8 idx, const u8 mode) { if (send_ec_command(IT8516E_CMD_SET_FAN_MODE)) return; if (send_ec_data(idx)) return; send_ec_data(mode); }
/** * Sets the minimum and maximum PWM rate of a fan in IT8516E_MODE_THERMAL * * @param idx Selects the fan; 0: CPU, 1: System * @param min Minimum PWM rate in % * @param max Maximum PWM rate in % */ static void it8516e_set_fan_limits(const u8 idx, const u8 min, const u8 max) { if (send_ec_command(IT8516E_CMD_SET_FAN_LIMITS)) return; if (send_ec_data(idx)) return; if (send_ec_data(min)) return; send_ec_data(max); }
/** * Sets the target speed in RPM for a fan in IT8516E_MODE_SPEED * * @param idx Selects the fan; 0: CPU, 1: System * @param speed Speed in RPM */ static void it8516e_set_fan_speed(const u8 idx, const u16 speed) { if (send_ec_command(IT8516E_CMD_SET_FAN_SPEED)) return; if (send_ec_data(idx)) return; if (send_ec_data(speed & 0xff)) return; send_ec_data(speed >> 8); }
/** * Sets the target temperature for a fan in IT8516E_MODE_THERMAL * * @param idx Selects the fan; 0: CPU, 1: System * @param temp Temperature in 64ths degree C */ static void it8516e_set_fan_temperature(const u8 idx, const u16 temp) { if (send_ec_command(IT8516E_CMD_SET_FAN_TEMP)) return; if (send_ec_data(idx)) return; if (send_ec_data(temp & 0xff)) return; send_ec_data(temp >> 8); }
/* * Get Board ID via EC I/O port write/read */ int get_board_id(void) { uint8_t buffer[2]; uint8_t index; if (send_ec_command(EC_FAB_ID_CMD) == 0) { for (index = 0; index < sizeof(buffer); index++) buffer[index] = recv_ec_data(); return (buffer[1] << 8) | buffer[0]; } return -1; }
void lumpy_ec_init(void) { printk(BIOS_DEBUG, "lumpy_ec_init\n"); if (acpi_slp_type == 3) return; /* * Enable EC control of fan speed. * * This will be changed to OS control in ACPI EC _REG * method when the OS is ready to control the fan. */ ec_write(EC_FAN_SPEED, 0); send_ec_command_data(EC_BATTERY_MODE, EC_BATTERY_MODE_NORMAL); send_ec_command_data(EC_POWER_BUTTON_MODE, EC_POWER_BUTTON_MODE_OS); send_ec_command(EC_SMI_DISABLE); send_ec_command(EC_ACPI_ENABLE); send_ec_command(EC_BACKLIGHT_ON); }
/* Get Board ID via EC I/O port write/read */ int get_board_id(void) { MAYBE_STATIC int id = -1; if (id < 0) { if (CONFIG(EC_GOOGLE_CHROMEEC)) id = get_board_id_via_ext_ec(); else{ uint8_t buffer[2]; uint8_t index; if (send_ec_command(EC_FAB_ID_CMD) == 0) { for (index = 0; index < sizeof(buffer); index++) buffer[index] = recv_ec_data(); id = (buffer[0] << 8) | buffer[1]; } } } return id; }
u8 read_ec_command_byte(u8 command) { send_ec_command(command); return __ec_read(EC_MAILBOX_DATA); }
/** * Sets the type of the external temperature sensor used * * @param type Type of sensor to set */ static void it8516e_set_systemp_type(const u8 type) { if (send_ec_command(IT8516E_CMD_SET_SYSTEMP_TYPE)) return; send_ec_data(type); }
void mainboard_suspend_resume(void) { /* Enable EC ACPI mode for the OS before resume */ send_ec_command(EC_SMI_DISABLE); send_ec_command(EC_ACPI_ENABLE); }
int ec_write(u8 addr, u8 data) { send_ec_command(0x81); send_ec_data(addr); return send_ec_data(data); }
u8 ec_query(void) { send_ec_command(0x84); return recv_ec_data(); }
uint8_t ec_query(void) { send_ec_command(QR_EC); return recv_ec_data(); }