9
0
Fork 0

efi: move x86 clocksource to device/driver

so we can dynamicly register the device

As we may need to use HW IP for clocksource.

As on EFI we could use Timestamp GUID if present (Not often the case as it's
not even enabled by default on any Target on EDK II not even OVMF)

Or if we choose we could use a Simulated Timestamp driver that work on Event
(Add Later)

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2017-03-03 13:34:03 +01:00 committed by Sascha Hauer
parent 8972eb7ff1
commit da11bd9d60
6 changed files with 46 additions and 16 deletions

View File

@ -77,7 +77,7 @@ choice
select EFI_GUID
select EFI_DEVICEPATH
select PRINTF_UUID
select CLOCKSOURCE_EFI
select CLOCKSOURCE_EFI_X86
config X86_BIOS_BRINGUP
bool "16 bit BIOS"

View File

@ -1,4 +1,5 @@
obj-$(CONFIG_X86_64) += reloc_x86_64.o crt0-efi-x86_64.o
obj-$(CONFIG_X86_32) += reloc_ia32.o crt0-efi-ia32.o
obj-y += clocksource.o
extra-$(CONFIG_X86_32) += elf_ia32_efi.lds
extra-$(CONFIG_X86_64) += elf_x86_64_efi.lds

View File

@ -0,0 +1,11 @@
#include <common.h>
#include <init.h>
#include <driver.h>
static int efi_x86_pure_init(void)
{
struct device_d *dev = device_alloc("efi-cs-x86", DEVICE_ID_SINGLE);
return platform_device_register(dev);
}
core_initcall(efi_x86_pure_init);

View File

@ -34,9 +34,9 @@ config CLOCKSOURCE_DUMMY_RATE
The option CONFIG_CLOCKSOURCE_DUMMY_RATE is used to adjust this clocksource.
The bigger rate valuest makes clocksource "faster".
config CLOCKSOURCE_EFI
bool
depends on EFI_BOOTUP
config CLOCKSOURCE_EFI_X86
bool "EFI X86 HW driver"
depends on EFI_BOOTUP && X86
config CLOCKSOURCE_MVEBU
bool

View File

@ -3,7 +3,7 @@ obj-$(CONFIG_ARM_SMP_TWD) += arm_smp_twd.o
obj-$(CONFIG_CLOCKSOURCE_BCM283X) += bcm2835.o
obj-$(CONFIG_CLOCKSOURCE_CLPS711X) += clps711x.o
obj-$(CONFIG_CLOCKSOURCE_DIGIC) += digic.o
obj-$(CONFIG_CLOCKSOURCE_EFI) += efi.o
obj-$(CONFIG_CLOCKSOURCE_EFI_X86) += efi_x86.o
obj-$(CONFIG_CLOCKSOURCE_MVEBU) += mvebu.o
obj-$(CONFIG_CLOCKSOURCE_NOMADIK) += nomadik.o
obj-$(CONFIG_CLOCKSOURCE_ORION) += orion.o

View File

@ -1,5 +1,6 @@
#include <common.h>
#include <init.h>
#include <driver.h>
#include <efi.h>
#include <efi/efi.h>
#include <clock.h>
@ -38,24 +39,41 @@ static uint64_t ticks_freq(void)
return (ticks_end - ticks_start) * 1000;
}
static uint64_t efi_clocksource_read(void)
static uint64_t efi_x86_cs_read(void)
{
return 1000 * 1000 * ticks_read() / freq;
}
static struct clocksource cs = {
.read = efi_clocksource_read,
.mask = CLOCKSOURCE_MASK(64),
.shift = 0,
};
static int efi_clocksource_init(void)
static int efi_x86_cs_init(struct clocksource *cs)
{
cs.mult = clocksource_hz2mult(1000 * 1000, cs.shift);
cs->mult = clocksource_hz2mult(1000 * 1000, cs->shift);
freq = ticks_freq();
return init_clock(&cs);
return 0;
}
static struct clocksource efi_x86_cs = {
.read = efi_x86_cs_read,
.mask = CLOCKSOURCE_MASK(64),
.shift = 0,
.priority = 100,
.init = efi_x86_cs_init,
};
static int efi_x86_cs_probe(struct device_d *dev)
{
return init_clock(&efi_x86_cs);
}
static struct driver_d efi_x86_cs_driver = {
.name = "efi-cs-x86",
.probe = efi_x86_cs_probe,
};
static int efi_x86_cs_initcall(void)
{
return platform_driver_register(&efi_x86_cs_driver);
}
/* for efi the time must be init at core initcall level */
core_initcall(efi_clocksource_init);
core_initcall(efi_x86_cs_initcall);