summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLv Zheng <lv.zheng@intel.com>2016-05-23 23:54:43 +0800
committerLv Zheng <lv.zheng@intel.com>2016-06-06 12:58:33 +0800
commit27a9dec7e5d613e1be7419a362676609a8a92cc6 (patch)
treea024d9d6c5a1ca21e61662c5cd7552919c352626
parent370047064ca35f6b46a17c31e83560fb9d615e0d (diff)
downloadacpica-27a9dec7e5d613e1be7419a362676609a8a92cc6.tar.gz
EFI: Add AcpiOsGetTimer() support
This patch adds AcpiOsGetTimer() support for EFI environment. Note that currently we don't support timezone. Lv Zheng. Signed-off-by: Lv Zheng <lv.zheng@intel.com>
-rw-r--r--source/include/platform/acefi.h2
-rw-r--r--source/include/platform/acefiex.h73
-rw-r--r--source/os_specific/service_layers/oseficlib.c1
-rw-r--r--source/os_specific/service_layers/osefixf.c61
4 files changed, 133 insertions, 4 deletions
diff --git a/source/include/platform/acefi.h b/source/include/platform/acefi.h
index 4e1bca132..c24b3058c 100644
--- a/source/include/platform/acefi.h
+++ b/source/include/platform/acefi.h
@@ -325,10 +325,12 @@ struct _SIMPLE_INPUT_INTERFACE;
struct _EFI_FILE_IO_INTERFACE;
struct _EFI_FILE_HANDLE;
struct _EFI_BOOT_SERVICES;
+struct _EFI_RUNTIME_SERVICES;
struct _EFI_SYSTEM_TABLE;
extern struct _EFI_SYSTEM_TABLE *ST;
extern struct _EFI_BOOT_SERVICES *BS;
+extern struct _EFI_RUNTIME_SERVICES *RT;
typedef union acpi_efi_file ACPI_EFI_FILE;
diff --git a/source/include/platform/acefiex.h b/source/include/platform/acefiex.h
index f78f034ad..fc1438738 100644
--- a/source/include/platform/acefiex.h
+++ b/source/include/platform/acefiex.h
@@ -616,6 +616,27 @@ EFI_STATUS
/*
+ * EFI Time
+ */
+typedef struct {
+ UINT32 Resolution;
+ UINT32 Accuracy;
+ BOOLEAN SetsToZero;
+} EFI_TIME_CAPABILITIES;
+
+typedef
+EFI_STATUS
+(EFIAPI *EFI_GET_TIME) (
+ EFI_TIME *Time,
+ EFI_TIME_CAPABILITIES *Capabilities);
+
+typedef
+EFI_STATUS
+(EFIAPI *EFI_SET_TIME) (
+ EFI_TIME *Time);
+
+
+/*
* Protocol handler functions
*/
typedef enum {
@@ -880,6 +901,54 @@ typedef struct _EFI_BOOT_SERVICES {
/*
+ * EFI Runtime Services Table
+ */
+#define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552
+#define EFI_RUNTIME_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
+
+typedef struct _EFI_RUNTIME_SERVICES {
+ EFI_TABLE_HEADER Hdr;
+
+ EFI_GET_TIME GetTime;
+ EFI_SET_TIME SetTime;
+#if 0
+ EFI_GET_WAKEUP_TIME GetWakeupTime;
+ EFI_SET_WAKEUP_TIME SetWakeupTime;
+#else
+ EFI_UNKNOWN_INTERFACE GetWakeupTime;
+ EFI_UNKNOWN_INTERFACE SetWakeupTime;
+#endif
+
+#if 0
+ EFI_SET_VIRTUAL_ADDRESS_MAP SetVirtualAddressMap;
+ EFI_CONVERT_POINTER ConvertPointer;
+#else
+ EFI_UNKNOWN_INTERFACE SetVirtualAddressMap;
+ EFI_UNKNOWN_INTERFACE ConvertPointer;
+#endif
+
+#if 0
+ EFI_GET_VARIABLE GetVariable;
+ EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName;
+ EFI_SET_VARIABLE SetVariable;
+#else
+ EFI_UNKNOWN_INTERFACE GetVariable;
+ EFI_UNKNOWN_INTERFACE GetNextVariableName;
+ EFI_UNKNOWN_INTERFACE SetVariable;
+#endif
+
+#if 0
+ EFI_GET_NEXT_HIGH_MONO_COUNT GetNextHighMonotonicCount;
+ EFI_RESET_SYSTEM ResetSystem;
+#else
+ EFI_UNKNOWN_INTERFACE GetNextHighMonotonicCount;
+ EFI_UNKNOWN_INTERFACE ResetSystem;
+#endif
+
+} EFI_RUNTIME_SERVICES;
+
+
+/*
* EFI System Table
*/
@@ -915,11 +984,7 @@ typedef struct _EFI_SYSTEM_TABLE {
EFI_HANDLE StandardErrorHandle;
SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr;
-#if 0
EFI_RUNTIME_SERVICES *RuntimeServices;
-#else
- EFI_HANDLE *RuntimeServices;
-#endif
EFI_BOOT_SERVICES *BootServices;
UINTN NumberOfTableEntries;
diff --git a/source/os_specific/service_layers/oseficlib.c b/source/os_specific/service_layers/oseficlib.c
index 062d1912d..69f92b6d1 100644
--- a/source/os_specific/service_layers/oseficlib.c
+++ b/source/os_specific/service_layers/oseficlib.c
@@ -1190,6 +1190,7 @@ efi_main (
ST = SystemTab;
BS = SystemTab->BootServices;
+ RT = SystemTab->RuntimeServices;
/* Disable the platform watchdog timer if we go interactive */
diff --git a/source/os_specific/service_layers/osefixf.c b/source/os_specific/service_layers/osefixf.c
index 2ab8683db..439494cbc 100644
--- a/source/os_specific/service_layers/osefixf.c
+++ b/source/os_specific/service_layers/osefixf.c
@@ -646,6 +646,67 @@ AcpiOsWriteMemory (
/******************************************************************************
*
+ * FUNCTION: AcpiOsGetTimer
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Current time in 100 nanosecond units
+ *
+ * DESCRIPTION: Get the current system time
+ *
+ *****************************************************************************/
+
+UINT64
+AcpiOsGetTimer (
+ void)
+{
+ EFI_STATUS EfiStatus;
+ EFI_TIME EfiTime;
+ int Year, Month, Day;
+ int Hour, Minute, Second;
+ UINT64 Timer;
+
+
+ EfiStatus = uefi_call_wrapper (RT->GetTime, 2, &EfiTime, NULL);
+ if (EFI_ERROR (EfiStatus))
+ {
+ return (-1);
+ }
+
+ Year = EfiTime.Year;
+ Month = EfiTime.Month;
+ Day = EfiTime.Day;
+ Hour = EfiTime.Hour;
+ Minute = EfiTime.Minute;
+ Second = EfiTime.Second;
+
+ /* 1..12 -> 11,12,1..10 */
+
+ if (0 >= (int) (Month -= 2))
+ {
+ /* Feb has leap days */
+
+ Month += 12;
+ Year -= 1;
+ }
+
+ /* Calculate days */
+
+ Timer = ((UINT64) (Year/4 - Year/100 + Year/400 + 367*Month/12 + Day) +
+ Year*365 - 719499);
+
+ /* Calculate seconds */
+
+ Timer = ((Timer*24 + Hour) * 60 + Minute) * 60 + Second;
+
+ /* Calculate 100 nanoseconds */
+
+ return ((Timer * ACPI_100NSEC_PER_SEC) + (EfiTime.Nanosecond / 100));
+}
+
+
+/******************************************************************************
+ *
* FUNCTION: AcpiOsAllocate
*
* PARAMETERS: Size - Amount to allocate, in bytes