diff --git a/i2c_smbus/i2c_smbus_piix4.cpp b/i2c_smbus/i2c_smbus_piix4.cpp index 124092ae..88ec6404 100644 --- a/i2c_smbus/i2c_smbus_piix4.cpp +++ b/i2c_smbus/i2c_smbus_piix4.cpp @@ -9,9 +9,37 @@ \*-----------------------------------------*/ #include "i2c_smbus_piix4.h" -#include #include "inpout32.h" #include "LogManager.h" +#include "ResourceManager.h" + +i2c_smbus_piix4::i2c_smbus_piix4() +{ + json drivers_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Drivers"); + bool amd_smbus_reduce_cpu = false; + + if(drivers_settings.contains("amd_smbus_reduce_cpu")) + { + amd_smbus_reduce_cpu = drivers_settings["amd_smbus_reduce_cpu"].get(); + } + + if(amd_smbus_reduce_cpu) + { + delay_timer = CreateWaitableTimerExW(NULL, NULL, CREATE_WAITABLE_TIMER_MANUAL_RESET | CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS); + if(!delay_timer) // high resolution timer not supported + { + delay_timer = CreateWaitableTimer(NULL, TRUE, NULL); // create regular timer instead + } + } +} + +i2c_smbus_piix4::~i2c_smbus_piix4() +{ + if(delay_timer) + { + CloseHandle(delay_timer); + } +} //Logic adapted from piix4_transaction() in i2c-piix4.c int i2c_smbus_piix4::piix4_transaction() @@ -41,11 +69,29 @@ int i2c_smbus_piix4::piix4_transaction() /* We will always wait for a fraction of a second! (See PIIX4 docs errata) */ temp = 0; - while ((++timeout < MAX_TIMEOUT) && temp <= 1) + if(delay_timer) { - temp = Inp32(SMBHSTSTS); - } + LARGE_INTEGER retry_delay; + retry_delay.QuadPart = -2500; + SetWaitableTimer(delay_timer, &retry_delay, 0, NULL, NULL, FALSE); + WaitForSingleObject(delay_timer, INFINITE); + + + while ((++timeout < MAX_TIMEOUT) && temp <= 1) + { + temp = Inp32(SMBHSTSTS); + SetWaitableTimer(delay_timer, &retry_delay, 0, NULL, NULL, FALSE); + WaitForSingleObject(delay_timer, INFINITE); + } + } + else + { + while ((++timeout < MAX_TIMEOUT) && temp <= 1) + { + temp = Inp32(SMBHSTSTS); + } + } /* If the SMBus is still busy, we give up */ if (timeout == MAX_TIMEOUT) { @@ -144,7 +190,7 @@ s32 i2c_smbus_piix4::piix4_access(u16 addr, char read_write, u8 command, int siz if (status) return status; - if ((read_write == I2C_SMBUS_WRITE) || (size == PIIX4_QUICK)) + if ((read_write == I2C_SMBUS_WRITE) || (size == PIIX4_QUICK)) return 0; switch (size) diff --git a/i2c_smbus/i2c_smbus_piix4.h b/i2c_smbus/i2c_smbus_piix4.h index fe3308d6..091da1ef 100644 --- a/i2c_smbus/i2c_smbus_piix4.h +++ b/i2c_smbus/i2c_smbus_piix4.h @@ -10,6 +10,7 @@ \*-----------------------------------------*/ #include "i2c_smbus.h" +#include "windows.h" #pragma once @@ -40,10 +41,13 @@ class i2c_smbus_piix4 : public i2c_smbus_interface { public: u16 piix4_smba = 0x0B00; + i2c_smbus_piix4(); + ~i2c_smbus_piix4(); private: int piix4_transaction(); s32 piix4_access(u16 addr, char read_write, u8 command, int size, i2c_smbus_data *data); s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data); s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data); -}; \ No newline at end of file + HANDLE delay_timer; +}; diff --git a/qt/OpenRGBSettingsPage.cpp b/qt/OpenRGBSettingsPage.cpp index 7ba7375f..c24b34d0 100644 --- a/qt/OpenRGBSettingsPage.cpp +++ b/qt/OpenRGBSettingsPage.cpp @@ -82,6 +82,21 @@ OpenRGBSettingsPage::OpenRGBSettingsPage(QWidget *parent) : ui->CheckboxLogConsole->setChecked(log_manager_settings["log_console"]); } + /*---------------------------------------------------------*\ + | Load drivers settings (Windows only) | + \*---------------------------------------------------------*/ +#ifdef _WIN32 + json drivers_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Drivers"); + + if(drivers_settings.contains("amd_smbus_reduce_cpu")) + { + ui->CheckboxAMDSMBusReduceCPU->setChecked(drivers_settings["amd_smbus_reduce_cpu"]); + } +#else + ui->DriversSettingsLabel->hide(); + ui->CheckboxAMDSMBusReduceCPU->hide(); +#endif + /*---------------------------------------------------------*\ | Load AutoStart settings | \*---------------------------------------------------------*/ @@ -530,3 +545,11 @@ void Ui::OpenRGBSettingsPage::on_CheckboxLogConsole_clicked() SaveSettings(); } +void Ui::OpenRGBSettingsPage::on_CheckboxAMDSMBusReduceCPU_clicked() +{ + json drivers_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Drivers"); + drivers_settings["amd_smbus_reduce_cpu"] = ui->CheckboxAMDSMBusReduceCPU->isChecked(); + ResourceManager::get()->GetSettingsManager()->SetSettings("Drivers", drivers_settings); + SaveSettings(); +} + diff --git a/qt/OpenRGBSettingsPage.h b/qt/OpenRGBSettingsPage.h index 50a49543..63f3d682 100644 --- a/qt/OpenRGBSettingsPage.h +++ b/qt/OpenRGBSettingsPage.h @@ -50,6 +50,7 @@ private slots: void on_CheckboxRunZoneChecks_clicked(); void on_OpenSettingsFolderButton_clicked(); void on_CheckboxLogConsole_clicked(); + void on_CheckboxAMDSMBusReduceCPU_clicked(); }; #endif // OPENRGBSETTINGSPAGE_H diff --git a/qt/OpenRGBSettingsPage.ui b/qt/OpenRGBSettingsPage.ui index 37955b3c..3bceb6d8 100644 --- a/qt/OpenRGBSettingsPage.ui +++ b/qt/OpenRGBSettingsPage.ui @@ -24,41 +24,12 @@ 0 0 - 398 - 554 + 418 + 464 - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 20 - 40 - - - - - - - - - - - Load Window Geometry - - - - - - - + 90000 @@ -71,33 +42,40 @@ - - + + - Run zone checks on rescan + Start Client - - + + - Start Server + Drivers Settings - + + + + Start at Login Status + + + + - - - - - + + - Start Minimized + Set Server Port + + + @@ -105,13 +83,6 @@ - - - - Start At Login - - - @@ -126,42 +97,35 @@ - - + + - Start Client + Start At Login - + Load Profile - - + + - Set Server Port + Start Server - - + + - Theme (restart required) + Start At Login Settings: - - - - Enable Log Console (restart required) - - - - + Custom Arguments @@ -175,17 +139,67 @@ - - + + - Start at Login Status + Start Minimized - - + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 20 + 40 + + + + + + + + + - Start At Login Settings: + Run zone checks on rescan + + + + + + + Enable Log Console (restart required) + + + + + + + Theme (restart required) + + + + + + + Load Window Geometry + + + + + + + + + + AMD SMBus: Reduce CPU Usage (restart required)