Workaround buggy timer in raspberry pie by using our own timer
implementation.
This commit is contained in:
parent
eeb8499721
commit
5ad9f728eb
4 changed files with 37 additions and 7 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2013-12-22 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Workaround buggy timer in raspberry pie by using our own timer
|
||||||
|
implementation.
|
||||||
|
|
||||||
2013-12-22 Vladimir Serbinenko <phcoder@gmail.com>
|
2013-12-22 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* include/grub/arm/uboot/kernel.h (GRUB_KERNEL_MACHINE_HEAP_SIZE):
|
* include/grub/arm/uboot/kernel.h (GRUB_KERNEL_MACHINE_HEAP_SIZE):
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <grub/uboot/disk.h>
|
#include <grub/uboot/disk.h>
|
||||||
#include <grub/uboot/uboot.h>
|
#include <grub/uboot/uboot.h>
|
||||||
#include <grub/uboot/api_public.h>
|
#include <grub/uboot/api_public.h>
|
||||||
|
#include <grub/cpu/system.h>
|
||||||
|
|
||||||
extern char __bss_start[];
|
extern char __bss_start[];
|
||||||
extern char _end[];
|
extern char _end[];
|
||||||
|
@ -69,6 +70,19 @@ uboot_timer_ms (void)
|
||||||
return (((grub_uint64_t) high) << 32) | cur;
|
return (((grub_uint64_t) high) << 32) | cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __arm__
|
||||||
|
static grub_uint64_t
|
||||||
|
rpi_timer_ms (void)
|
||||||
|
{
|
||||||
|
static grub_uint32_t last = 0, high = 0;
|
||||||
|
grub_uint32_t cur = *(volatile grub_uint32_t *) 0x20003004;
|
||||||
|
if (cur < last)
|
||||||
|
high++;
|
||||||
|
last = cur;
|
||||||
|
return grub_divmod64 ((((grub_uint64_t) high) << 32) | cur, 1000, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_machine_init (void)
|
grub_machine_init (void)
|
||||||
{
|
{
|
||||||
|
@ -106,8 +120,17 @@ grub_machine_init (void)
|
||||||
grub_uboot_probe_hardware ();
|
grub_uboot_probe_hardware ();
|
||||||
|
|
||||||
/* Initialise timer */
|
/* Initialise timer */
|
||||||
timer_start = grub_uboot_get_timer (0);
|
#ifdef __arm__
|
||||||
grub_install_get_time_ms (uboot_timer_ms);
|
if (grub_uboot_get_machine_type () == GRUB_ARM_MACHINE_TYPE_RASPBERRY_PI)
|
||||||
|
{
|
||||||
|
grub_install_get_time_ms (rpi_timer_ms);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
timer_start = grub_uboot_get_timer (0);
|
||||||
|
grub_install_get_time_ms (uboot_timer_ms);
|
||||||
|
}
|
||||||
|
|
||||||
/* Initialize */
|
/* Initialize */
|
||||||
grub_ubootdisk_init ();
|
grub_ubootdisk_init ();
|
||||||
|
|
|
@ -23,11 +23,7 @@
|
||||||
#define LINUX_ZIMAGE_OFFSET 0x24
|
#define LINUX_ZIMAGE_OFFSET 0x24
|
||||||
#define LINUX_ZIMAGE_MAGIC 0x016f2818
|
#define LINUX_ZIMAGE_MAGIC 0x016f2818
|
||||||
|
|
||||||
enum
|
#include "system.h"
|
||||||
{
|
|
||||||
GRUB_ARM_MACHINE_TYPE_RASPBERRY_PI = 3138,
|
|
||||||
GRUB_ARM_MACHINE_TYPE_FDT = 0xFFFFFFFF
|
|
||||||
};
|
|
||||||
|
|
||||||
#if defined GRUB_MACHINE_UBOOT
|
#if defined GRUB_MACHINE_UBOOT
|
||||||
# include <grub/uboot/uboot.h>
|
# include <grub/uboot/uboot.h>
|
||||||
|
|
|
@ -1,6 +1,12 @@
|
||||||
#ifndef GRUB_SYSTEM_CPU_HEADER
|
#ifndef GRUB_SYSTEM_CPU_HEADER
|
||||||
#define GRUB_SYSTEM_CPU_HEADER
|
#define GRUB_SYSTEM_CPU_HEADER
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
GRUB_ARM_MACHINE_TYPE_RASPBERRY_PI = 3138,
|
||||||
|
GRUB_ARM_MACHINE_TYPE_FDT = 0xFFFFFFFF
|
||||||
|
};
|
||||||
|
|
||||||
void grub_arm_disable_caches_mmu (void);
|
void grub_arm_disable_caches_mmu (void);
|
||||||
|
|
||||||
#endif /* ! GRUB_SYSTEM_CPU_HEADER */
|
#endif /* ! GRUB_SYSTEM_CPU_HEADER */
|
||||||
|
|
Loading…
Reference in a new issue