mirror of
https://github.com/Fishwaldo/opensbi.git
synced 2025-03-23 23:31:36 +00:00
lib: sbi: Add timer frequency to struct sbi_timer_device
Generic mdelay() and udelay() functions can be provided by the sbi_timer framework if timer frequency is available in the timer instance provided by the platform support or timer driver. This patch adds timer frequency (timer_freq) member in the struct sbi_timer_device for above purpose. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Xiang W <wxjstz@126.com>
This commit is contained in:
parent
72154f4708
commit
12e7af9ab7
10 changed files with 25 additions and 1 deletions
|
@ -17,6 +17,9 @@ struct sbi_timer_device {
|
||||||
/** Name of the timer operations */
|
/** Name of the timer operations */
|
||||||
char name[32];
|
char name[32];
|
||||||
|
|
||||||
|
/** Frequency of timer in HZ */
|
||||||
|
unsigned long timer_freq;
|
||||||
|
|
||||||
/** Get free-running timer value */
|
/** Get free-running timer value */
|
||||||
u64 (*timer_value)(void);
|
u64 (*timer_value)(void);
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
struct aclint_mtimer_data {
|
struct aclint_mtimer_data {
|
||||||
/* Public details */
|
/* Public details */
|
||||||
|
unsigned long mtime_freq;
|
||||||
unsigned long mtime_addr;
|
unsigned long mtime_addr;
|
||||||
unsigned long mtime_size;
|
unsigned long mtime_size;
|
||||||
unsigned long mtimecmp_addr;
|
unsigned long mtimecmp_addr;
|
||||||
|
|
|
@ -186,6 +186,8 @@ int aclint_mtimer_cold_init(struct aclint_mtimer_data *mt,
|
||||||
(mt->first_hartid >= SBI_HARTMASK_MAX_BITS) ||
|
(mt->first_hartid >= SBI_HARTMASK_MAX_BITS) ||
|
||||||
(mt->hart_count > ACLINT_MTIMER_MAX_HARTS))
|
(mt->hart_count > ACLINT_MTIMER_MAX_HARTS))
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
if (reference && mt->mtime_freq != reference->mtime_freq)
|
||||||
|
return SBI_EINVAL;
|
||||||
|
|
||||||
/* Initialize private data */
|
/* Initialize private data */
|
||||||
aclint_mtimer_set_reference(mt, reference);
|
aclint_mtimer_set_reference(mt, reference);
|
||||||
|
@ -227,6 +229,7 @@ int aclint_mtimer_cold_init(struct aclint_mtimer_data *mt,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mtimer.timer_freq = mt->mtime_freq;
|
||||||
sbi_timer_set_device(&mtimer);
|
sbi_timer_set_device(&mtimer);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -38,6 +38,10 @@ static int timer_mtimer_cold_init(void *fdt, int nodeoff,
|
||||||
mt->has_64bit_mmio = true;
|
mt->has_64bit_mmio = true;
|
||||||
mt->has_shared_mtime = false;
|
mt->has_shared_mtime = false;
|
||||||
|
|
||||||
|
rc = fdt_parse_timebase_frequency(fdt, &mt->mtime_freq);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
if (match->data) { /* SiFive CLINT */
|
if (match->data) { /* SiFive CLINT */
|
||||||
/* Set CLINT addresses */
|
/* Set CLINT addresses */
|
||||||
mt->mtimecmp_addr = addr[0] + ACLINT_DEFAULT_MTIMECMP_OFFSET;
|
mt->mtimecmp_addr = addr[0] + ACLINT_DEFAULT_MTIMECMP_OFFSET;
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define ARIANE_PLIC_NUM_SOURCES 3
|
#define ARIANE_PLIC_NUM_SOURCES 3
|
||||||
#define ARIANE_HART_COUNT 1
|
#define ARIANE_HART_COUNT 1
|
||||||
#define ARIANE_CLINT_ADDR 0x2000000
|
#define ARIANE_CLINT_ADDR 0x2000000
|
||||||
|
#define ARIANE_ACLINT_MTIMER_FREQ 1000000
|
||||||
#define ARIANE_ACLINT_MSWI_ADDR (ARIANE_CLINT_ADDR + \
|
#define ARIANE_ACLINT_MSWI_ADDR (ARIANE_CLINT_ADDR + \
|
||||||
CLINT_MSWI_OFFSET)
|
CLINT_MSWI_OFFSET)
|
||||||
#define ARIANE_ACLINT_MTIMER_ADDR (ARIANE_CLINT_ADDR + \
|
#define ARIANE_ACLINT_MTIMER_ADDR (ARIANE_CLINT_ADDR + \
|
||||||
|
@ -44,6 +45,7 @@ static struct aclint_mswi_data mswi = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct aclint_mtimer_data mtimer = {
|
static struct aclint_mtimer_data mtimer = {
|
||||||
|
.mtime_freq = ARIANE_ACLINT_MTIMER_FREQ,
|
||||||
.mtime_addr = ARIANE_ACLINT_MTIMER_ADDR +
|
.mtime_addr = ARIANE_ACLINT_MTIMER_ADDR +
|
||||||
ACLINT_DEFAULT_MTIME_OFFSET,
|
ACLINT_DEFAULT_MTIME_OFFSET,
|
||||||
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define OPENPITON_DEFAULT_PLIC_NUM_SOURCES 2
|
#define OPENPITON_DEFAULT_PLIC_NUM_SOURCES 2
|
||||||
#define OPENPITON_DEFAULT_HART_COUNT 3
|
#define OPENPITON_DEFAULT_HART_COUNT 3
|
||||||
#define OPENPITON_DEFAULT_CLINT_ADDR 0xfff1020000
|
#define OPENPITON_DEFAULT_CLINT_ADDR 0xfff1020000
|
||||||
|
#define OPENPITON_DEFAULT_ACLINT_MTIMER_FREQ 1000000
|
||||||
#define OPENPITON_DEFAULT_ACLINT_MSWI_ADDR \
|
#define OPENPITON_DEFAULT_ACLINT_MSWI_ADDR \
|
||||||
(OPENPITON_DEFAULT_CLINT_ADDR + CLINT_MSWI_OFFSET)
|
(OPENPITON_DEFAULT_CLINT_ADDR + CLINT_MSWI_OFFSET)
|
||||||
#define OPENPITON_DEFAULT_ACLINT_MTIMER_ADDR \
|
#define OPENPITON_DEFAULT_ACLINT_MTIMER_ADDR \
|
||||||
|
@ -49,6 +50,7 @@ static struct aclint_mswi_data mswi = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct aclint_mtimer_data mtimer = {
|
static struct aclint_mtimer_data mtimer = {
|
||||||
|
.mtime_freq = OPENPITON_DEFAULT_ACLINT_MTIMER_FREQ,
|
||||||
.mtime_addr = OPENPITON_DEFAULT_ACLINT_MTIMER_ADDR +
|
.mtime_addr = OPENPITON_DEFAULT_ACLINT_MTIMER_ADDR +
|
||||||
ACLINT_DEFAULT_MTIME_OFFSET,
|
ACLINT_DEFAULT_MTIME_OFFSET,
|
||||||
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
||||||
|
@ -68,6 +70,7 @@ static int openpiton_early_init(bool cold_boot)
|
||||||
void *fdt;
|
void *fdt;
|
||||||
struct platform_uart_data uart_data;
|
struct platform_uart_data uart_data;
|
||||||
struct plic_data plic_data;
|
struct plic_data plic_data;
|
||||||
|
unsigned long aclint_freq;
|
||||||
uint64_t clint_addr;
|
uint64_t clint_addr;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
@ -83,6 +86,10 @@ static int openpiton_early_init(bool cold_boot)
|
||||||
if (!rc)
|
if (!rc)
|
||||||
plic = plic_data;
|
plic = plic_data;
|
||||||
|
|
||||||
|
rc = fdt_parse_timebase_frequency(fdt, &aclint_freq);
|
||||||
|
if (!rc)
|
||||||
|
mtimer.mtime_freq = aclint_freq;
|
||||||
|
|
||||||
rc = fdt_parse_compat_addr(fdt, &clint_addr, "riscv,clint0");
|
rc = fdt_parse_compat_addr(fdt, &clint_addr, "riscv,clint0");
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
mswi.addr = clint_addr;
|
mswi.addr = clint_addr;
|
||||||
|
|
|
@ -42,6 +42,7 @@ static struct aclint_mswi_data mswi = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct aclint_mtimer_data mtimer = {
|
static struct aclint_mtimer_data mtimer = {
|
||||||
|
.mtime_freq = K210_ACLINT_MTIMER_FREQ,
|
||||||
.mtime_addr = K210_ACLINT_MTIMER_ADDR +
|
.mtime_addr = K210_ACLINT_MTIMER_ADDR +
|
||||||
ACLINT_DEFAULT_MTIME_OFFSET,
|
ACLINT_DEFAULT_MTIME_OFFSET,
|
||||||
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#define K210_HART_COUNT 2
|
#define K210_HART_COUNT 2
|
||||||
|
|
||||||
#define K210_UART_BAUDRATE 115200
|
#define K210_UART_BAUDRATE 115200
|
||||||
|
#define K210_ACLINT_MTIMER_FREQ 7800000
|
||||||
#define K210_CLK0_FREQ 26000000UL
|
#define K210_CLK0_FREQ 26000000UL
|
||||||
#define K210_PLIC_NUM_SOURCES 65
|
#define K210_PLIC_NUM_SOURCES 65
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,7 @@ static struct aclint_mswi_data mswi = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct aclint_mtimer_data mtimer = {
|
static struct aclint_mtimer_data mtimer = {
|
||||||
|
.mtime_freq = UX600_TIMER_FREQ,
|
||||||
.mtime_addr = UX600_ACLINT_MTIMER_ADDR +
|
.mtime_addr = UX600_ACLINT_MTIMER_ADDR +
|
||||||
ACLINT_DEFAULT_MTIME_OFFSET,
|
ACLINT_DEFAULT_MTIME_OFFSET,
|
||||||
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#define PLATFORM_PLIC_NUM_SOURCES 128
|
#define PLATFORM_PLIC_NUM_SOURCES 128
|
||||||
#define PLATFORM_HART_COUNT 4
|
#define PLATFORM_HART_COUNT 4
|
||||||
#define PLATFORM_CLINT_ADDR 0x2000000
|
#define PLATFORM_CLINT_ADDR 0x2000000
|
||||||
|
#define PLATFORM_ACLINT_MTIMER_FREQ 10000000
|
||||||
#define PLATFORM_ACLINT_MSWI_ADDR (PLATFORM_CLINT_ADDR + \
|
#define PLATFORM_ACLINT_MSWI_ADDR (PLATFORM_CLINT_ADDR + \
|
||||||
CLINT_MSWI_OFFSET)
|
CLINT_MSWI_OFFSET)
|
||||||
#define PLATFORM_ACLINT_MTIMER_ADDR (PLATFORM_CLINT_ADDR + \
|
#define PLATFORM_ACLINT_MTIMER_ADDR (PLATFORM_CLINT_ADDR + \
|
||||||
|
@ -43,6 +44,7 @@ static struct aclint_mswi_data mswi = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct aclint_mtimer_data mtimer = {
|
static struct aclint_mtimer_data mtimer = {
|
||||||
|
.mtime_freq = PLATFORM_ACLINT_MTIMER_FREQ,
|
||||||
.mtime_addr = PLATFORM_ACLINT_MTIMER_ADDR +
|
.mtime_addr = PLATFORM_ACLINT_MTIMER_ADDR +
|
||||||
ACLINT_DEFAULT_MTIME_OFFSET,
|
ACLINT_DEFAULT_MTIME_OFFSET,
|
||||||
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
.mtime_size = ACLINT_DEFAULT_MTIME_SIZE,
|
||||||
|
|
Loading…
Add table
Reference in a new issue