]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Initial implementation of ofwclock
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 7 Feb 2010 21:56:25 +0000 (22:56 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 7 Feb 2010 21:56:25 +0000 (22:56 +0100)
ChangeLog.ofwclock [new file with mode: 0644]
conf/powerpc-ieee1275.rmk
conf/sparc64-ieee1275.rmk
lib/ieee1275/datetime.c [new file with mode: 0644]

diff --git a/ChangeLog.ofwclock b/ChangeLog.ofwclock
new file mode 100644 (file)
index 0000000..1cdd99c
--- /dev/null
@@ -0,0 +1,15 @@
+2010-02-07  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * conf/powerpc-ieee1275.rmk (pkglib_MODULES): Add datetime.mod,
+       date.mod, datehook.mod.
+       (datetime_mod_SOURCES): New variable.
+       (datetime_mod_CFLAGS): Likewise.
+       (datetime_mod_LDFLAGS): Likewise.
+       (date_mod_SOURCES): Likewise.
+       (date_mod_CFLAGS): Likewise.
+       (date_mod_LDFLAGS): Likewise.
+       (datehook_mod_SOURCES): Likewise.
+       (datehook_mod_CFLAGS): Likewise.
+       (datehook_mod_LDFLAGS): Likewise.
+       * conf/sparc64-ieee1275.rmk: Likewise.
+       * lib/ieee1275/datetime.c: New file.
index 8622293abc00608a8ce4174b8403a08314762900..73e56e66f38337fd5ac2ad21c3bf0d6274fa2252 100644 (file)
@@ -105,4 +105,21 @@ lsmmap_mod_SOURCES = commands/lsmmap.c
 lsmmap_mod_CFLAGS = $(COMMON_CFLAGS)
 lsmmap_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+pkglib_MODULES += datetime.mod date.mod datehook.mod
+
+# For datetime.mod
+datetime_mod_SOURCES = lib/ieee1275/datetime.c
+datetime_mod_CFLAGS = $(COMMON_CFLAGS)
+datetime_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For date.mod
+date_mod_SOURCES = commands/date.c
+date_mod_CFLAGS = $(COMMON_CFLAGS)
+date_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For datehook.mod
+datehook_mod_SOURCES = hook/datehook.c
+datehook_mod_CFLAGS = $(COMMON_CFLAGS)
+datehook_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 include $(srcdir)/conf/common.mk
index befc7dce57738f7e112b48b525e7f578e4b46a6d..6210826e2b48c56cf5f68329c31ac7d31eef8aa5 100644 (file)
@@ -133,4 +133,21 @@ lsmmap_mod_SOURCES = commands/lsmmap.c
 lsmmap_mod_CFLAGS = $(COMMON_CFLAGS)
 lsmmap_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+pkglib_MODULES += datetime.mod date.mod datehook.mod
+
+# For datetime.mod
+datetime_mod_SOURCES = lib/ieee1275/datetime.c
+datetime_mod_CFLAGS = $(COMMON_CFLAGS)
+datetime_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For date.mod
+date_mod_SOURCES = commands/date.c
+date_mod_CFLAGS = $(COMMON_CFLAGS)
+date_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
+# For datehook.mod
+datehook_mod_SOURCES = hook/datehook.c
+datehook_mod_CFLAGS = $(COMMON_CFLAGS)
+datehook_mod_LDFLAGS = $(COMMON_LDFLAGS)
+
 include $(srcdir)/conf/common.mk
diff --git a/lib/ieee1275/datetime.c b/lib/ieee1275/datetime.c
new file mode 100644 (file)
index 0000000..aaf17b0
--- /dev/null
@@ -0,0 +1,142 @@
+/* kern/cmos_datetime.c - CMOS datetime function.
+ *
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2008,2009  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/datetime.h>
+#include <grub/ieee1275/ieee1275.h>
+#include <grub/misc.h>
+
+static char *rtc = 0;
+
+static void
+find_rtc (void)
+{
+  auto int hook (struct grub_ieee1275_devalias *alias);
+  int hook (struct grub_ieee1275_devalias *alias)
+  {
+    if (grub_strcmp (alias->type, "rtc") == 0)
+      {
+       grub_dprintf ("datetime", "Found RTC %s\n", alias->name);
+       rtc = grub_strdup (alias->name);
+       return 1;
+      }
+    return 0;
+  }
+  
+  grub_ieee1275_devices_iterate (hook);
+}
+
+grub_err_t
+grub_get_datetime (struct grub_datetime *datetime)
+{
+  struct get_time_args
+  {
+    struct grub_ieee1275_common_hdr common;
+    grub_ieee1275_cell_t method;
+    grub_ieee1275_cell_t device;
+    grub_ieee1275_cell_t catch_result;
+    grub_ieee1275_cell_t year;
+    grub_ieee1275_cell_t month;
+    grub_ieee1275_cell_t day;
+    grub_ieee1275_cell_t hour;
+    grub_ieee1275_cell_t minute;
+    grub_ieee1275_cell_t second;
+  }
+  args;
+  int status;
+  grub_ieee1275_ihandle_t ihandle;
+
+  if (!rtc)
+    find_rtc ();
+  if (!rtc)
+    return grub_error (GRUB_ERR_IO, "no RTC found");
+
+  status = grub_ieee1275_open (rtc, &ihandle);
+  if (status == -1)
+    return grub_error (GRUB_ERR_IO, "couldn't open RTC");
+
+  INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 7);
+  args.device = (grub_ieee1275_cell_t) ihandle;
+  args.method = (grub_ieee1275_cell_t) "get-time";
+
+  status = IEEE1275_CALL_ENTRY_FN (&args);
+
+  grub_ieee1275_close (ihandle);
+
+  if (status == -1)
+    return grub_error (GRUB_ERR_IO, "get-time failed");
+
+  datetime->year = args.year;
+  datetime->month = args.month;
+  datetime->day = args.day;
+  datetime->hour = args.hour;
+  datetime->minute = args.minute;
+  datetime->second = args.second;
+
+  return GRUB_ERR_NONE;
+}
+
+grub_err_t
+grub_set_datetime (struct grub_datetime *datetime)
+{
+  struct get_time_args
+  {
+    struct grub_ieee1275_common_hdr common;
+    grub_ieee1275_cell_t method;
+    grub_ieee1275_cell_t device;
+    grub_ieee1275_cell_t year;
+    grub_ieee1275_cell_t month;
+    grub_ieee1275_cell_t day;
+    grub_ieee1275_cell_t hour;
+    grub_ieee1275_cell_t minute;
+    grub_ieee1275_cell_t second;
+    grub_ieee1275_cell_t catch_result;
+  }
+  args;
+  int status;
+  grub_ieee1275_ihandle_t ihandle;
+
+  if (!rtc)
+    find_rtc ();
+  if (!rtc)
+    return grub_error (GRUB_ERR_IO, "no RTC found");
+
+  status = grub_ieee1275_open (rtc, &ihandle);
+  if (status == -1)
+    return grub_error (GRUB_ERR_IO, "couldn't open RTC");
+
+  INIT_IEEE1275_COMMON (&args.common, "call-method", 8, 1);
+  args.device = (grub_ieee1275_cell_t) ihandle;
+  args.method = (grub_ieee1275_cell_t) "set-time";
+
+  args.year = datetime->year;
+  args.month = datetime->month;
+  args.day = datetime->day;
+  args.hour = datetime->hour;
+  args.minute = datetime->minute;
+  args.second = datetime->second;
+
+  status = IEEE1275_CALL_ENTRY_FN (&args);
+
+  grub_ieee1275_close (ihandle);
+
+  if (status == -1)
+    return grub_error (GRUB_ERR_IO, "set-time failed");
+
+  return GRUB_ERR_NONE;
+}