From 64ba2a17a34969a80bb3894899ae65669e9ad542 Mon Sep 17 00:00:00 2001 From: raywu Date: Tue, 30 Oct 2018 13:53:10 +0800 Subject: DW01 - Support RTC Wake from S5 --- Board/SB/SBSetup/SB.sd | 159 ++++++++++++++++++++++++++++++++++++++++++++++-- Board/SB/SBSetup/SB.uni | Bin 144652 -> 150328 bytes Chipset/SB/SleepSmi.c | 135 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 287 insertions(+), 7 deletions(-) diff --git a/Board/SB/SBSetup/SB.sd b/Board/SB/SBSetup/SB.sd index d944b68..05d0f79 100644 --- a/Board/SB/SBSetup/SB.sd +++ b/Board/SB/SBSetup/SB.sd @@ -691,6 +691,15 @@ UINT8 ADspMode; UINT8 NFCE; + + UINT8 AaeonWakeOnRtc; //AAEON_RTC_001_Elflo+ +// UINT8 FixedWakeOnRTCS5; //AAEON_RTC_001_Elflo- +// UINT8 DynamicWakeOnRTCS5; //AAEON_RTC_001_Elflo- + UINT8 AaeonRTCWakeupTimeDay; + UINT8 AaeonRTCWakeupTimeHour; + UINT8 AaeonRTCWakeupTimeMinute; + UINT8 AaeonRTCWakeupTimeSecond; + UINT8 AaeonRTCWakeupTimeMinuteIncrease; #endif #ifdef FORM_SET_TYPEDEF @@ -709,6 +718,98 @@ //--------------------------------------------------------------------------- #ifdef CONTROL_DEFINITION + #define AAEON_WAKEONRTC_DIS\ + text \ + help = STRING_TOKEN(STR_WAKE_ON_RTC_PROMPT_HELP), \ + text = STRING_TOKEN(STR_WAKE_ON_RTC_PROMPT), \ + text = STRING_TOKEN(STR_DISABLED), \ + flags = 0, \ + key = 0; + + #define AAEON_WAKEONRTC\ + oneof varid = SETUP_DATA.AaeonWakeOnRtc,\ + prompt = STRING_TOKEN(STR_WAKE_ON_RTC_PROMPT),\ + help = STRING_TOKEN(STR_WAKE_ON_RTC_PROMPT_HELP),\ + option text = STRING_TOKEN(STR_DISABLED), value=0, flags= DEFAULT | MANUFACTURING | RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_WOR_FIXED), value=1, flags= RESET_REQUIRED;\ + option text = STRING_TOKEN(STR_WOR_DYNAMIC), value=2, flags= RESET_REQUIRED;\ + endoneof; + +//AAEON_RTC_001_Elflo- >> +// #define AAEON_ONEOF_FIXED_WAKEONRTCS5\ +// oneof varid = SETUP_DATA.FixedWakeOnRTCS5,\ +// prompt = STRING_TOKEN(STR_FIXED_WAKE_ON_RTCS5_PROMPT),\ +// help = STRING_TOKEN(STR_FIXED_WAKE_ON_RTCS5_HELP),\ +// option text = STRING_TOKEN(STR_DISABLED), value=0, flags= DEFAULT | MANUFACTURING | RESET_REQUIRED;\ +// option text = STRING_TOKEN(STR_ENABLED), value=1, flags= RESET_REQUIRED;\ +// endoneof; +//AAEON_RTC_001_Elflo- << + + #define AAEON_NUM_RTCWAKEUP_TIMEDAY\ + numeric varid = SETUP_DATA.AaeonRTCWakeupTimeDay,\ + prompt = STRING_TOKEN(STR_RTC_WAKEUP_DAY_PROMPT),\ + help = STRING_TOKEN(STR_RTC_DAY_HELP),\ + flags = RESET_REQUIRED,\ + minimum = 0,\ + maximum = 31,\ + step = 1,\ + default = 0,\ + endnumeric; + + #define AAEON_NUM_RTCWAKEUP_TIMEHOUR\ + numeric varid = SETUP_DATA.AaeonRTCWakeupTimeHour,\ + prompt = STRING_TOKEN(STR_RTC_WAKEUP_HOUR_PROMPT),\ + help = STRING_TOKEN(STR_RTC_HOUR_HELP),\ + flags = RESET_REQUIRED,\ + minimum = 0,\ + maximum = 23,\ + step = 1,\ + default = 0,\ + endnumeric; + + #define AAEON_NUM_RTCWAKEUP_TIMEMINUTE\ + numeric varid = SETUP_DATA.AaeonRTCWakeupTimeMinute,\ + prompt = STRING_TOKEN(STR_RTC_WAKEUP_MINUTE_PROMPT),\ + help = STRING_TOKEN(STR_TIME_MINUTE_HELP),\ + flags = RESET_REQUIRED,\ + minimum = 0,\ + maximum = 59,\ + step = 1,\ + default = 0,\ + endnumeric; + + #define AAEON_NUM_RTCWAKEUP_TIMESECOND\ + numeric varid = SETUP_DATA.AaeonRTCWakeupTimeSecond,\ + prompt = STRING_TOKEN(STR_RTC_WAKEUP_SECOND_PROMPT),\ + help = STRING_TOKEN(STR_TIME_SECOND_HELP),\ + flags = RESET_REQUIRED,\ + minimum = 0,\ + maximum = 59,\ + step = 1,\ + default = 0,\ + endnumeric; + +//AAEON_RTC_001_Elflo- >> +// #define AAEON_ONEOF_DYNAMIC_WAKEONRTCS5\ +// oneof varid = SETUP_DATA.DynamicWakeOnRTCS5,\ +// prompt = STRING_TOKEN(STR_DYNAMIC_WAKE_ON_RTCS5_PROMPT),\ +// help = STRING_TOKEN(STR_DYNAMIC_WAKE_ON_RTCS5_HELP),\ +// option text = STRING_TOKEN(STR_DISABLED), value=0, flags= DEFAULT | MANUFACTURING | RESET_REQUIRED;\ +// option text = STRING_TOKEN(STR_ENABLED), value=1, flags= RESET_REQUIRED;\ +// endoneof; +//AAEON_RTC_001_Elflo- << + + #define AAEON_NUM_RTCWAKEUP_TIMEMINUTEINCREASE\ + numeric varid = SETUP_DATA.AaeonRTCWakeupTimeMinuteIncrease,\ + prompt = STRING_TOKEN(STR_RTC_WAKEUP_MINUTE_INCREASE_PROMPT),\ + help = STRING_TOKEN(STR_TIME_MINUTE_INCREASE_HELP),\ + flags = RESET_REQUIRED,\ + minimum = 1,\ + maximum = 5,\ + step = 1,\ + default = 1,\ + endnumeric; + #define SB_ONEOF_ECTG\ oneof varid = SETUP_DATA.ECTG,\ prompt = STRING_TOKEN (STR_ECTG),\ @@ -1034,11 +1135,11 @@ oneof varid = SETUP_DATA.PchUsb30Mode,\ prompt = STRING_TOKEN (STR_PCH_USB30_MODE_PROMPT),\ help = STRING_TOKEN (STR_PCH_USB30_MODE_HELP),\ - option text = STRING_TOKEN (STR_COMMON_SMART_AUTO), value = 3, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED, key = 0;\ + option text = STRING_TOKEN (STR_COMMON_SMART_AUTO), value = 3, flags = RESET_REQUIRED, key = 0;\ option text = STRING_TOKEN (STR_COMMON_AUTO), value = 2, flags = RESET_REQUIRED, key = 0;\ option text = STRING_TOKEN (STR_COMMON_ENABLED), value = 1, flags = RESET_REQUIRED, key = 0;\ option text = STRING_TOKEN (STR_COMMON_DISABLED), value = 0, flags = RESET_REQUIRED, key = 0;\ - option text = STRING_TOKEN (STR_COMMON_MANUAL), value = 4, flags = RESET_REQUIRED, key = 0;\ + option text = STRING_TOKEN (STR_COMMON_MANUAL), value = 4, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED, key = 0;\ endoneof; #define SB_ONEOF_PCHENABLERMH1\ @@ -1087,8 +1188,8 @@ prompt = STRING_TOKEN (STR_PCH_ENABLE_USB30_PIN),\ help = STRING_TOKEN (STR_PCH_ENABLE_USB30_PIN_HELP),\ option text = STRING_TOKEN (STR_SELECT_PER_PIN), value = 0, flags = RESET_REQUIRED, key = 0;\ - option text = STRING_TOKEN (STR_SELECT_ALL_PIN_DISABLE), value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED, key = 0;\ - option text = STRING_TOKEN (STR_SELECT_ALL_PIN_ENABLE), value = 2, flags = RESET_REQUIRED, key = 0;\ + option text = STRING_TOKEN (STR_SELECT_ALL_PIN_DISABLE), value = 1, flags = RESET_REQUIRED, key = 0;\ + option text = STRING_TOKEN (STR_SELECT_ALL_PIN_ENABLE), value = 2, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED, key = 0;\ endoneof; #define SB_ONEOF_USB20PERPINROUTE00\ @@ -1311,8 +1412,8 @@ oneof varid = SETUP_DATA.PchUsbPerPortCtl,\ prompt = STRING_TOKEN (STR_PCH_USB_PER_PORT_PROMPT),\ help = STRING_TOKEN (STR_PCH_USB_PER_PORT_HELP),\ - option text = STRING_TOKEN (STR_COMMON_DISABLED), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED, key = 0;\ - option text = STRING_TOKEN (STR_COMMON_ENABLED), value = 1, flags = RESET_REQUIRED, key = 0;\ + option text = STRING_TOKEN (STR_COMMON_DISABLED), value = 0, flags = RESET_REQUIRED, key = 0;\ + option text = STRING_TOKEN (STR_COMMON_ENABLED), value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED, key = 0;\ endoneof; #if EHCI_CON_DISCON_WAKE_UP_SUPPORT @@ -5416,6 +5517,14 @@ //--------------------------------------------------------------------------- #ifdef CONTROLS_WITH_DEFAULTS + AAEON_WAKEONRTC //AAEON_RTC_001_Elflo+ +// AAEON_ONEOF_FIXED_WAKEONRTCS5 //AAEON_RTC_001_Elflo- + AAEON_NUM_RTCWAKEUP_TIMEDAY + AAEON_NUM_RTCWAKEUP_TIMEHOUR + AAEON_NUM_RTCWAKEUP_TIMEMINUTE + AAEON_NUM_RTCWAKEUP_TIMESECOND +// AAEON_ONEOF_DYNAMIC_WAKEONRTCS5 //AAEON_RTC_001_Elflo- + AAEON_NUM_RTCWAKEUP_TIMEMINUTEINCREASE SB_ONEOF_ECTG SB_ONEOF_PCHLAN @@ -7348,6 +7457,11 @@ goto THERMAL_CONFIG_FORM_ID, prompt = STRING_TOKEN (STR_THERMAL_CONFIGURATION), help = STRING_TOKEN (STR_THERMAL_CONFIGURATION_HELP); + + goto S5_RTCWAKE_FORM_ID, + prompt = STRING_TOKEN(STR_S5_RTCWAKE_FORM), + help = STRING_TOKEN(STR_S5_RTCWAKE_FORM_HELP); + #endif //---------------------------------------------------------------------------- @@ -7851,6 +7965,39 @@ #endif // End of SB_FORM_SATA_SFMS_OPTIONS +//DW01_Custom_Support_RTC_Wake >> + form formid = AUTO_ID(S5_RTCWAKE_FORM_ID), + title = STRING_TOKEN(STR_S5_RTCWAKE_FORM); + + AAEON_WAKEONRTC //AAEON_RTC_001_Elflo+ + +//AAEON_RTC_001_Elflo- >> +// grayoutif ideqval SETUP_DATA.DynamicWakeOnRTCS5 == 1; +// AAEON_ONEOF_FIXED_WAKEONRTCS5 +// endif; +//AAEON_RTC_001_Elflo- << + +// suppressif ideqval SETUP_DATA.FixedWakeOnRTCS5 == 0; //AAEON_RTC_001_Elflo- + suppressif NOT ideqval SETUP_DATA.AaeonWakeOnRtc == 1; //AAEON_RTC_001_Elflo+ + AAEON_NUM_RTCWAKEUP_TIMEDAY + AAEON_NUM_RTCWAKEUP_TIMEHOUR + AAEON_NUM_RTCWAKEUP_TIMEMINUTE + AAEON_NUM_RTCWAKEUP_TIMESECOND + endif; +//AAEON_RTC_001_Elflo- >> +// SEPARATOR +// grayoutif ideqval SETUP_DATA.FixedWakeOnRTCS5 == 1; +// AAEON_ONEOF_DYNAMIC_WAKEONRTCS5 +// endif; +//AAEON_RTC_001_Elflo- << + +// suppressif ideqval SETUP_DATA.DynamicWakeOnRTCS5 == 0; //AAEON_RTC_001_Elflo- + suppressif NOT ideqval SETUP_DATA.AaeonWakeOnRtc == 2; //AAEON_RTC_001_Elflo+ + AAEON_NUM_RTCWAKEUP_TIMEMINUTEINCREASE + endif; + endform; // AAEON_FORM_ID +//DW01_Custom_Support_RTC_Wake << + #endif //---------------------------------------------------------------------------- // diff --git a/Board/SB/SBSetup/SB.uni b/Board/SB/SBSetup/SB.uni index ceb801a..69d1bdb 100644 Binary files a/Board/SB/SBSetup/SB.uni and b/Board/SB/SBSetup/SB.uni differ diff --git a/Chipset/SB/SleepSmi.c b/Chipset/SB/SleepSmi.c index 6f17597..86debbe 100644 --- a/Chipset/SB/SleepSmi.c +++ b/Chipset/SB/SleepSmi.c @@ -120,8 +120,89 @@ EFI_GUID gThisFileGuid = \ // External Declaration(s) // Function Definition(s) - +// DW01_Custom_Support_RTC_Wake >> +typedef struct { + UINT8 AaeonRTCWakeupTimeHour ; + UINT8 AaeonRTCWakeupTimeMinute ; + UINT8 AaeonRTCWakeupTimeSecond ; + UINT8 AaeonRTCWakeupDateDay; +} SMMData ; + +SMMData gSmmData ; + +EFI_GUID gSetupGuid = SETUP_GUID; +SETUP_DATA SetupData; //--------------------------------------------------------------------------- +UINT8 DecToBCD(UINT8 Dec) +{ + UINT8 FirstDigit = Dec % 10; + UINT8 SecondDigit = Dec / 10; + + return (SecondDigit << 4) + FirstDigit; +} +UINT8 BCDToDec(UINT8 BCD) +{ + UINT8 FirstDigit = BCD & 0xf; + UINT8 SecondDigit = BCD >> 4;; + + return SecondDigit * 10 + FirstDigit; +} +UINT8 ReadRtcIndex(IN UINT8 Index) +{ + UINT8 volatile Value; + + // Check if Data Time is valid + if(Index <= 9) do { + IoWrite8(0x70, 0x0A | 0x80); + Value = IoRead8(0x71); + } while (Value & 0x80); + + IoWrite8(0x70, Index | 0x80); + // Read register + Value = IoRead8(0x71); + if (Index <= 9) Value = BCDToDec(Value); + return (UINT8)Value; +} +void WriteRtcIndex(IN UINT8 Index, IN UINT8 Value) +{ + IoWrite8(0x70,Index | 0x80); + if (Index <= 9 ) Value = DecToBCD(Value); + // Write Register + IoWrite8(0x71,Value); +} +void SetWakeupTime ( + IN EFI_TIME *Time +) +{ + UINT8 Value; + + WriteRtcIndex(5,Time->Hour); + WriteRtcIndex(3,Time->Minute); + WriteRtcIndex(1,Time->Second); + Value = ReadRtcIndex(0x0D) & 0xC0; + WriteRtcIndex(0x0D,(Value|DecToBCD(Time->Day))); + + //Set Enable + Value = ReadRtcIndex(0xB); + Value |= 1 << 5; + WriteRtcIndex(0xB,Value); +} +VOID RTCWakeFunc(){ + UINT32 i = 0; + EFI_TIME Time; + + Time.Hour = gSmmData.AaeonRTCWakeupTimeHour; + Time.Minute = gSmmData.AaeonRTCWakeupTimeMinute; + Time.Second = gSmmData.AaeonRTCWakeupTimeSecond; + Time.Day = gSmmData.AaeonRTCWakeupDateDay; + + SetWakeupTime(&Time); + //Clear RTC PM1 status + IoWrite16(PM_BASE_ADDRESS , ( IoRead16(PM_BASE_ADDRESS) | (1 << 10) )); + //set RTC_EN bit to wake up from the alarm + IoWrite32(PM_BASE_ADDRESS, ( IoRead32(PM_BASE_ADDRESS) | (1 << 26) )); +} +// DW01_Custom_Support_RTC_Wake << // //---------------------------------------------------------------------------- @@ -311,6 +392,49 @@ VOID S5SleepSmiOccurred ( if (gPchWakeOnLan) Enable_GbE_PME(); +// DW01_Custom_Support_RTC_Wake >> + { + EFI_STATUS Status = EFI_SUCCESS; + UINT8 Value; + + //Disable RTC alarm and clear RTC PM1 status + Value = ReadRtcIndex(0xB); + Value &= ~((UINT8)1 << 5); + WriteRtcIndex(0xB,Value); + //Clear Alarm Flag (AF) by reading RTC Reg C + Value = ReadRtcIndex(0xC); + IoWrite16(PM_BASE_ADDRESS , ( IoRead16(PM_BASE_ADDRESS) | (1 << 10) )); + + if(!EFI_ERROR(Status)){ + //if(gSetupData.FixedWakeOnRTCS5 == 1){ + if(SetupData.AaeonWakeOnRtc == 1){ + gSmmData.AaeonRTCWakeupTimeHour = SetupData.AaeonRTCWakeupTimeHour ; + gSmmData.AaeonRTCWakeupTimeMinute = SetupData.AaeonRTCWakeupTimeMinute ; + gSmmData.AaeonRTCWakeupTimeSecond = SetupData.AaeonRTCWakeupTimeSecond ; + gSmmData.AaeonRTCWakeupDateDay = SetupData.AaeonRTCWakeupTimeDay; + } + + //if(gSetupData.DynamicWakeOnRTCS5 == 1){ + if(SetupData.AaeonWakeOnRtc == 2){ + gSmmData.AaeonRTCWakeupTimeHour = ReadRtcIndex(4); + gSmmData.AaeonRTCWakeupTimeMinute = ReadRtcIndex(2); + gSmmData.AaeonRTCWakeupTimeSecond = ReadRtcIndex(0); + gSmmData.AaeonRTCWakeupTimeMinute += SetupData.AaeonRTCWakeupTimeMinuteIncrease; + if (gSmmData.AaeonRTCWakeupTimeMinute >= 60) + { + gSmmData.AaeonRTCWakeupTimeMinute = 0; + ++gSmmData.AaeonRTCWakeupTimeHour; + if (gSmmData.AaeonRTCWakeupTimeHour == 24) + gSmmData.AaeonRTCWakeupTimeHour = 0; + } + } + } + + if(SetupData.AaeonWakeOnRtc == 1 || SetupData.AaeonWakeOnRtc == 2) + RTCWakeFunc(); + } +// DW01_Custom_Support_RTC_Wake << + // Program AfterG3 bit depend the setup question. ProgramAfterG3Bit(); @@ -439,6 +563,15 @@ EFI_STATUS InitSleepSmi ( gPchWakeOnLan = (SbSetupData->PchWakeOnLan == 1) ? TRUE : FALSE; Status = pBS->FreePool( SbSetupData ); +// DW01_Custom_Support_RTC_Wake >> + VariableSize = sizeof(SETUP_DATA); + Status = pRS->GetVariable( L"Setup", \ + &gSetupGuid, \ + NULL, \ + &VariableSize, \ + &SetupData ); + +// DW01_Custom_Support_RTC_Wake << // Porting End return InitSmmHandler( ImageHandle, SystemTable, InSmmFunction, NULL ); -- cgit v1.2.3