forked from enclustra-bsp/xilinx-uboot
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
timer: Add generic driver for RISC-V privileged architecture defined …
…timer RISC-V privileged architecture v1.10 defines a real-time counter, exposed as a memory-mapped machine-mode register - mtime. mtime must run at constant frequency, and the platform must provide a mechanism for determining the timebase of mtime. The mtime register has a 64-bit precision on all RV32, RV64, and RV128 systems. Different platform may have different implementation of the mtime block hence an API riscv_get_time() is required by this driver for platform codes to hide such implementation details. For example, on some platforms mtime is provided by the CLINT module, while on some other platforms a simple 'rdtime' can be used to get the timer counter. With this timer driver the U-Boot timer functionalities like delay works correctly now. Signed-off-by: Bin Meng <[email protected]> Reviewed-by: Lukas Auer <[email protected]> Reviewed-by: Anup Patel <[email protected]>
- Loading branch information
Showing
3 changed files
with
64 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* Copyright (C) 2018, Bin Meng <[email protected]> | ||
* | ||
* RISC-V privileged architecture defined generic timer driver | ||
* | ||
* This driver relies on RISC-V platform codes to provide the essential API | ||
* riscv_get_time() which is supposed to return the timer counter as defined | ||
* by the RISC-V privileged architecture spec. | ||
* | ||
* This driver can be used in both M-mode and S-mode U-Boot. | ||
*/ | ||
|
||
#include <common.h> | ||
#include <dm.h> | ||
#include <errno.h> | ||
#include <timer.h> | ||
#include <asm/io.h> | ||
|
||
/** | ||
* riscv_get_time() - get the timer counter | ||
* | ||
* Platform codes should provide this API in order to make this driver function. | ||
* | ||
* @time: the 64-bit timer count as defined by the RISC-V privileged | ||
* architecture spec. | ||
* @return: 0 on success, -ve on error. | ||
*/ | ||
extern int riscv_get_time(u64 *time); | ||
|
||
static int riscv_timer_get_count(struct udevice *dev, u64 *count) | ||
{ | ||
return riscv_get_time(count); | ||
} | ||
|
||
static int riscv_timer_probe(struct udevice *dev) | ||
{ | ||
struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); | ||
|
||
/* clock frequency was passed from the cpu driver as driver data */ | ||
uc_priv->clock_rate = dev->driver_data; | ||
|
||
return 0; | ||
} | ||
|
||
static const struct timer_ops riscv_timer_ops = { | ||
.get_count = riscv_timer_get_count, | ||
}; | ||
|
||
U_BOOT_DRIVER(riscv_timer) = { | ||
.name = "riscv_timer", | ||
.id = UCLASS_TIMER, | ||
.probe = riscv_timer_probe, | ||
.ops = &riscv_timer_ops, | ||
.flags = DM_FLAG_PRE_RELOC, | ||
}; |