summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorraywu <raywu@aaeon.com.tw>2018-10-30 13:53:10 +0800
committerraywu <raywu@aaeon.com.tw>2018-10-30 13:53:10 +0800
commit64ba2a17a34969a80bb3894899ae65669e9ad542 (patch)
treea60b648c42d6a0d4092b13b54447e414f7c6c2a6
parent3555fa3e90144b4206806405020d19f535d6ec03 (diff)
downloadzprj-64ba2a17a34969a80bb3894899ae65669e9ad542.tar.xz
DW01 - Support RTC Wake from S5
-rw-r--r--Board/SB/SBSetup/SB.sd159
-rw-r--r--Board/SB/SBSetup/SB.unibin144652 -> 150328 bytes
-rw-r--r--Chipset/SB/SleepSmi.c135
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
--- a/Board/SB/SBSetup/SB.uni
+++ b/Board/SB/SBSetup/SB.uni
Binary files 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 <<
//<AMI_PHDR_START>
//----------------------------------------------------------------------------
@@ -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 );