CMOS support on sparc.
* gentpl.py (cmos): Add powerpc and sparc. * grub-core/Makefile.core.def (datetime): Add lib/ieee1275/cmos.c on powerpc and sparc. * grub-core/lib/cmos_datetime.c (grub_get_datetime) [__powerpc__ || __sparc__]: Rename to grub_get_datetime_cmos. (grub_set_datetime) [__powerpc__ || __sparc__]: Likewise to grub_set_datetime_cmos. * grub-core/lib/ieee1275/cmos.c: New file. * grub-core/lib/ieee1275/datetime.c (no_ieee1275_rtc): New vaiable. (find_rtc): Set no_ieee1275_rtc on error. (grub_get_datetime): Call grub_get_datetime_cmos on error. (grub_set_datetime): Call grub_set_datetime_cmos on error. * include/grub/cmos.h (grub_cmos_read): Return grub_err_t since it may fail. Move value to argument. All users updated (grub_cmos_write): Likewise. (grub_cmos_read) [__powerpc__ || __sparc__]: Rewritten. (grub_cmos_write) [__powerpc__ || __sparc__]: Likewise. * include/grub/datetime.h [__powerpc__ || __sparc__]: Declare grub_get_datetime_cmos and grub_set_datetime_cmos.
This commit is contained in:
parent
77546584e1
commit
a07a81b335
9 changed files with 231 additions and 26 deletions
|
@ -23,30 +23,44 @@
|
|||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
#if !defined (__powerpc__) && !defined (__sparc__)
|
||||
#define grub_get_datetime_cmos grub_get_datetime
|
||||
#define grub_set_datetime_cmos grub_set_datetime
|
||||
#endif
|
||||
|
||||
grub_err_t
|
||||
grub_get_datetime (struct grub_datetime *datetime)
|
||||
grub_get_datetime_cmos (struct grub_datetime *datetime)
|
||||
{
|
||||
int is_bcd, is_12hour;
|
||||
grub_uint8_t value, flag;
|
||||
grub_err_t err;
|
||||
|
||||
flag = grub_cmos_read (GRUB_CMOS_INDEX_STATUS_B);
|
||||
err = grub_cmos_read (GRUB_CMOS_INDEX_STATUS_B, &flag);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
is_bcd = ! (flag & GRUB_CMOS_STATUS_B_BINARY);
|
||||
|
||||
value = grub_cmos_read (GRUB_CMOS_INDEX_YEAR);
|
||||
err = grub_cmos_read (GRUB_CMOS_INDEX_YEAR, &value);
|
||||
if (err)
|
||||
return err;
|
||||
if (is_bcd)
|
||||
value = grub_bcd_to_num (value);
|
||||
|
||||
datetime->year = value;
|
||||
datetime->year += (value < 80) ? 2000 : 1900;
|
||||
|
||||
value = grub_cmos_read (GRUB_CMOS_INDEX_MONTH);
|
||||
err = grub_cmos_read (GRUB_CMOS_INDEX_MONTH, &value);
|
||||
if (err)
|
||||
return err;
|
||||
if (is_bcd)
|
||||
value = grub_bcd_to_num (value);
|
||||
|
||||
datetime->month = value;
|
||||
|
||||
value = grub_cmos_read (GRUB_CMOS_INDEX_DAY_OF_MONTH);
|
||||
err = grub_cmos_read (GRUB_CMOS_INDEX_DAY_OF_MONTH, &value);
|
||||
if (err)
|
||||
return err;
|
||||
if (is_bcd)
|
||||
value = grub_bcd_to_num (value);
|
||||
|
||||
|
@ -54,7 +68,9 @@ grub_get_datetime (struct grub_datetime *datetime)
|
|||
|
||||
is_12hour = ! (flag & GRUB_CMOS_STATUS_B_24HOUR);
|
||||
|
||||
value = grub_cmos_read (GRUB_CMOS_INDEX_HOUR);
|
||||
err = grub_cmos_read (GRUB_CMOS_INDEX_HOUR, &value);
|
||||
if (err)
|
||||
return err;
|
||||
if (is_12hour)
|
||||
{
|
||||
is_12hour = (value & 0x80);
|
||||
|
@ -71,13 +87,18 @@ grub_get_datetime (struct grub_datetime *datetime)
|
|||
|
||||
datetime->hour = value;
|
||||
|
||||
value = grub_cmos_read (GRUB_CMOS_INDEX_MINUTE);
|
||||
err = grub_cmos_read (GRUB_CMOS_INDEX_MINUTE, &value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (is_bcd)
|
||||
value = grub_bcd_to_num (value);
|
||||
|
||||
datetime->minute = value;
|
||||
|
||||
value = grub_cmos_read (GRUB_CMOS_INDEX_SECOND);
|
||||
err = grub_cmos_read (GRUB_CMOS_INDEX_SECOND, &value);
|
||||
if (err)
|
||||
return err;
|
||||
if (is_bcd)
|
||||
value = grub_bcd_to_num (value);
|
||||
|
||||
|
@ -87,12 +108,15 @@ grub_get_datetime (struct grub_datetime *datetime)
|
|||
}
|
||||
|
||||
grub_err_t
|
||||
grub_set_datetime (struct grub_datetime *datetime)
|
||||
grub_set_datetime_cmos (struct grub_datetime *datetime)
|
||||
{
|
||||
int is_bcd, is_12hour;
|
||||
grub_uint8_t value, flag;
|
||||
grub_err_t err;
|
||||
|
||||
flag = grub_cmos_read (GRUB_CMOS_INDEX_STATUS_B);
|
||||
err = grub_cmos_read (GRUB_CMOS_INDEX_STATUS_B, &flag);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
is_bcd = ! (flag & GRUB_CMOS_STATUS_B_BINARY);
|
||||
|
||||
|
@ -102,21 +126,27 @@ grub_set_datetime (struct grub_datetime *datetime)
|
|||
if (is_bcd)
|
||||
value = grub_num_to_bcd (value);
|
||||
|
||||
grub_cmos_write (GRUB_CMOS_INDEX_YEAR, value);
|
||||
err = grub_cmos_write (GRUB_CMOS_INDEX_YEAR, value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value = datetime->month;
|
||||
|
||||
if (is_bcd)
|
||||
value = grub_num_to_bcd (value);
|
||||
|
||||
grub_cmos_write (GRUB_CMOS_INDEX_MONTH, value);
|
||||
err = grub_cmos_write (GRUB_CMOS_INDEX_MONTH, value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value = datetime->day;
|
||||
|
||||
if (is_bcd)
|
||||
value = grub_num_to_bcd (value);
|
||||
|
||||
grub_cmos_write (GRUB_CMOS_INDEX_DAY_OF_MONTH, value);
|
||||
err = grub_cmos_write (GRUB_CMOS_INDEX_DAY_OF_MONTH, value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value = datetime->hour;
|
||||
|
||||
|
@ -138,21 +168,27 @@ grub_set_datetime (struct grub_datetime *datetime)
|
|||
if (is_12hour)
|
||||
value |= 0x80;
|
||||
|
||||
grub_cmos_write (GRUB_CMOS_INDEX_HOUR, value);
|
||||
err = grub_cmos_write (GRUB_CMOS_INDEX_HOUR, value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value = datetime->minute;
|
||||
|
||||
if (is_bcd)
|
||||
value = grub_num_to_bcd (value);
|
||||
|
||||
grub_cmos_write (GRUB_CMOS_INDEX_MINUTE, value);
|
||||
err = grub_cmos_write (GRUB_CMOS_INDEX_MINUTE, value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value = datetime->second;
|
||||
|
||||
if (is_bcd)
|
||||
value = grub_num_to_bcd (value);
|
||||
|
||||
grub_cmos_write (GRUB_CMOS_INDEX_SECOND, value);
|
||||
err = grub_cmos_write (GRUB_CMOS_INDEX_SECOND, value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue