[libcpu/risc-v/c906] add ioremap && default param (#7345)
This commit is contained in:
parent
a09a2ea6fe
commit
cbedb6b40b
|
@ -40,13 +40,13 @@ static inline uint32_t readl(const volatile void *addr)
|
||||||
static inline void write_reg(
|
static inline void write_reg(
|
||||||
uint32_t val, volatile void *addr, unsigned offset)
|
uint32_t val, volatile void *addr, unsigned offset)
|
||||||
{
|
{
|
||||||
writel(val, addr + offset);
|
writel(val, (void *)((rt_size_t)addr + offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t read_reg(
|
static inline uint32_t read_reg(
|
||||||
const volatile void *addr, unsigned offset)
|
const volatile void *addr, unsigned offset)
|
||||||
{
|
{
|
||||||
return readl(addr + offset);
|
return readl((void *)((rt_size_t)addr + offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // ARCH_IO_H
|
#endif // ARCH_IO_H
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
|
@ -7,6 +7,7 @@
|
||||||
* Date Author Notes
|
* Date Author Notes
|
||||||
* 2021-10-19 JasonHu first version
|
* 2021-10-19 JasonHu first version
|
||||||
* 2021-11-12 JasonHu fix bug that not intr on f133
|
* 2021-11-12 JasonHu fix bug that not intr on f133
|
||||||
|
* 2023-04-22 flyingcys add plic register ioremap
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
@ -30,13 +31,23 @@ struct plic_handler
|
||||||
|
|
||||||
rt_inline void plic_toggle(struct plic_handler *handler, int hwirq, int enable);
|
rt_inline void plic_toggle(struct plic_handler *handler, int hwirq, int enable);
|
||||||
struct plic_handler c906_plic_handlers[C906_NR_CPUS];
|
struct plic_handler c906_plic_handlers[C906_NR_CPUS];
|
||||||
|
static void *c906_irq_priority[INTERRUPTS_MAX] = {RT_NULL};
|
||||||
|
|
||||||
rt_inline void plic_irq_toggle(int hwirq, int enable)
|
rt_inline void plic_irq_toggle(int hwirq, int enable)
|
||||||
{
|
{
|
||||||
int cpu = 0;
|
int cpu = 0;
|
||||||
|
void *priority_addr;
|
||||||
|
|
||||||
/* set priority of interrupt, interrupt 0 is zero. */
|
/* set priority of interrupt, interrupt 0 is zero. */
|
||||||
writel(enable, c906_plic_regs + PRIORITY_BASE + hwirq * PRIORITY_PER_ID);
|
priority_addr = (void *)((rt_size_t)c906_plic_regs + PRIORITY_BASE + hwirq * PRIORITY_PER_ID);
|
||||||
|
#ifdef RT_USING_SMART
|
||||||
|
if (c906_irq_priority[hwirq] == RT_NULL)
|
||||||
|
{
|
||||||
|
c906_irq_priority[hwirq] = rt_ioremap(priority_addr, 0x1000);
|
||||||
|
}
|
||||||
|
priority_addr = c906_irq_priority[hwirq];
|
||||||
|
#endif
|
||||||
|
writel(enable, priority_addr);
|
||||||
struct plic_handler *handler = &c906_plic_handlers[cpu];
|
struct plic_handler *handler = &c906_plic_handlers[cpu];
|
||||||
|
|
||||||
if (handler->present)
|
if (handler->present)
|
||||||
|
@ -76,7 +87,7 @@ void plic_complete(int irqno)
|
||||||
int cpu = 0;
|
int cpu = 0;
|
||||||
struct plic_handler *handler = &c906_plic_handlers[cpu];
|
struct plic_handler *handler = &c906_plic_handlers[cpu];
|
||||||
|
|
||||||
writel(irqno, handler->hart_base + CONTEXT_CLAIM);
|
writel(irqno, (void *)((rt_size_t)handler->hart_base + CONTEXT_CLAIM));
|
||||||
}
|
}
|
||||||
|
|
||||||
void plic_disable_irq(int irqno)
|
void plic_disable_irq(int irqno)
|
||||||
|
@ -101,7 +112,7 @@ void plic_handle_irq(void)
|
||||||
unsigned int irq;
|
unsigned int irq;
|
||||||
|
|
||||||
struct plic_handler *handler = &c906_plic_handlers[cpu];
|
struct plic_handler *handler = &c906_plic_handlers[cpu];
|
||||||
void *claim = handler->hart_base + CONTEXT_CLAIM;
|
void *claim = (void *)((rt_size_t)handler->hart_base + CONTEXT_CLAIM);
|
||||||
|
|
||||||
if (c906_plic_regs == RT_NULL || !handler->present)
|
if (c906_plic_regs == RT_NULL || !handler->present)
|
||||||
{
|
{
|
||||||
|
@ -128,7 +139,7 @@ void plic_handle_irq(void)
|
||||||
|
|
||||||
rt_inline void plic_toggle(struct plic_handler *handler, int hwirq, int enable)
|
rt_inline void plic_toggle(struct plic_handler *handler, int hwirq, int enable)
|
||||||
{
|
{
|
||||||
uint32_t *reg = handler->enable_base + (hwirq / 32) * sizeof(uint32_t);
|
uint32_t *reg = (uint32_t *)((rt_size_t)handler->enable_base + (hwirq / 32) * sizeof(uint32_t));
|
||||||
uint32_t hwirq_mask = 1 << (hwirq % 32);
|
uint32_t hwirq_mask = 1 << (hwirq % 32);
|
||||||
|
|
||||||
if (enable)
|
if (enable)
|
||||||
|
@ -188,11 +199,15 @@ void plic_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
handler->present = RT_TRUE;
|
handler->present = RT_TRUE;
|
||||||
handler->hart_base = c906_plic_regs + CONTEXT_BASE + i * CONTEXT_PER_HART;
|
handler->hart_base = (void *)((rt_size_t)c906_plic_regs + CONTEXT_BASE + i * CONTEXT_PER_HART);
|
||||||
handler->enable_base = c906_plic_regs + ENABLE_BASE + i * ENABLE_PER_HART;
|
handler->enable_base = (void *)((rt_size_t)c906_plic_regs + ENABLE_BASE + i * ENABLE_PER_HART);
|
||||||
|
#ifdef RT_USING_SMART
|
||||||
|
handler->hart_base = rt_ioremap(handler->hart_base, 0x1000);
|
||||||
|
handler->enable_base = rt_ioremap(handler->enable_base, 0x1000);
|
||||||
|
#endif
|
||||||
done:
|
done:
|
||||||
/* priority must be > threshold to trigger an interrupt */
|
/* priority must be > threshold to trigger an interrupt */
|
||||||
writel(threshold, handler->hart_base + CONTEXT_THRESHOLD);
|
writel(threshold, (void *)((rt_size_t)handler->hart_base + CONTEXT_THRESHOLD));
|
||||||
for (hwirq = 1; hwirq <= nr_irqs; hwirq++)
|
for (hwirq = 1; hwirq <= nr_irqs; hwirq++)
|
||||||
{
|
{
|
||||||
plic_toggle(handler, hwirq, 0);
|
plic_toggle(handler, hwirq, 0);
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* Change Logs:
|
* Change Logs:
|
||||||
* Date Author Notes
|
* Date Author Notes
|
||||||
* 2021-10-19 JasonHu first version
|
* 2021-10-19 JasonHu first version
|
||||||
|
* 2023-04-22 flyingcys add C906_PLIC_PHY_ADDR macro judge
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __RISCV64_PLIC_H__
|
#ifndef __RISCV64_PLIC_H__
|
||||||
|
@ -13,7 +14,9 @@
|
||||||
|
|
||||||
#include <rt_interrupt.h>
|
#include <rt_interrupt.h>
|
||||||
|
|
||||||
|
#ifndef C906_PLIC_PHY_ADDR
|
||||||
#define C906_PLIC_PHY_ADDR (0x10000000)
|
#define C906_PLIC_PHY_ADDR (0x10000000)
|
||||||
|
#endif
|
||||||
#define C906_PLIC_NR_EXT_IRQS (IRQ_MAX_NR)
|
#define C906_PLIC_NR_EXT_IRQS (IRQ_MAX_NR)
|
||||||
#define C906_NR_CPUS (NR_CPUS)
|
#define C906_NR_CPUS (NR_CPUS)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
|
@ -16,7 +16,9 @@
|
||||||
#define NR_CPUS 1
|
#define NR_CPUS 1
|
||||||
|
|
||||||
#define IRQ_OFFSET 16
|
#define IRQ_OFFSET 16
|
||||||
|
#ifndef IRQ_MAX_NR
|
||||||
#define IRQ_MAX_NR 207
|
#define IRQ_MAX_NR 207
|
||||||
|
#endif
|
||||||
#define INTERRUPTS_MAX (IRQ_OFFSET + IRQ_MAX_NR)
|
#define INTERRUPTS_MAX (IRQ_OFFSET + IRQ_MAX_NR)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
|
@ -12,8 +12,9 @@
|
||||||
#define TICK_H__
|
#define TICK_H__
|
||||||
|
|
||||||
/* timer clock is 24 MHZ */
|
/* timer clock is 24 MHZ */
|
||||||
|
#ifndef TIMER_CLK_FREQ
|
||||||
#define TIMER_CLK_FREQ (24000000)
|
#define TIMER_CLK_FREQ (24000000)
|
||||||
|
#endif
|
||||||
int tick_isr(void);
|
int tick_isr(void);
|
||||||
int rt_hw_tick_init(void);
|
int rt_hw_tick_init(void);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue