Prepare some api for DM (#7894)
Signed-off-by: GuEe-GUI <GuEe-GUI@github.com>
This commit is contained in:
parent
f5fe1a5d7b
commit
d3417aa0d7
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <drivers/ofw.h>
|
#include <drivers/ofw.h>
|
||||||
#include <drivers/ofw_io.h>
|
#include <drivers/ofw_io.h>
|
||||||
#include <drivers/ofw_fdt.h>
|
#include <drivers/ofw_fdt.h>
|
||||||
|
@ -249,7 +250,7 @@ rt_bool_t rt_ofw_node_tag_equ(const struct rt_ofw_node *np, const char *tag)
|
||||||
if (np && tag)
|
if (np && tag)
|
||||||
{
|
{
|
||||||
const char *node_name = rt_fdt_node_name(np->full_name);
|
const char *node_name = rt_fdt_node_name(np->full_name);
|
||||||
rt_size_t tag_len = rt_strchrnul(node_name, '@') - node_name;
|
rt_size_t tag_len = strchrnul(node_name, '@') - node_name;
|
||||||
|
|
||||||
ret = (rt_strlen(tag) == tag_len && !rt_strncmp(node_name, tag, tag_len));
|
ret = (rt_strlen(tag) == tag_len && !rt_strncmp(node_name, tag, tag_len));
|
||||||
}
|
}
|
||||||
|
@ -569,7 +570,7 @@ struct rt_ofw_node *rt_ofw_find_node_by_ids_r(struct rt_ofw_node *from, const st
|
||||||
|
|
||||||
struct rt_ofw_node *rt_ofw_find_node_by_path(const char *path)
|
struct rt_ofw_node *rt_ofw_find_node_by_path(const char *path)
|
||||||
{
|
{
|
||||||
struct rt_ofw_node *np, *parent, *tmp;
|
struct rt_ofw_node *np = RT_NULL, *parent, *tmp = RT_NULL;
|
||||||
|
|
||||||
if (path)
|
if (path)
|
||||||
{
|
{
|
||||||
|
@ -584,7 +585,7 @@ struct rt_ofw_node *rt_ofw_find_node_by_path(const char *path)
|
||||||
|
|
||||||
while (*path)
|
while (*path)
|
||||||
{
|
{
|
||||||
const char *next = rt_strchrnul(path, '/');
|
const char *next = strchrnul(path, '/');
|
||||||
rt_size_t len = next - path;
|
rt_size_t len = next - path;
|
||||||
|
|
||||||
tmp = RT_NULL;
|
tmp = RT_NULL;
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <rthw.h>
|
#include <rthw.h>
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <drivers/ofw_fdt.h>
|
#include <drivers/ofw_fdt.h>
|
||||||
#include <drivers/ofw_raw.h>
|
#include <drivers/ofw_raw.h>
|
||||||
#include <drivers/core/dm.h>
|
#include <drivers/core/dm.h>
|
||||||
|
@ -40,7 +41,7 @@ static rt_size_t _root_addr_cells;
|
||||||
|
|
||||||
const char *rt_fdt_node_name(const char *full_name)
|
const char *rt_fdt_node_name(const char *full_name)
|
||||||
{
|
{
|
||||||
const char *node_name = rt_strrchr(full_name, '/');
|
const char *node_name = strrchr(full_name, '/');
|
||||||
|
|
||||||
return node_name ? node_name + 1 : full_name;
|
return node_name ? node_name + 1 : full_name;
|
||||||
}
|
}
|
||||||
|
@ -701,7 +702,7 @@ rt_err_t rt_fdt_scan_chosen_stdout(void)
|
||||||
|
|
||||||
if (stdout_path && len)
|
if (stdout_path && len)
|
||||||
{
|
{
|
||||||
const char *path_split = rt_strchrnul(stdout_path, ':');
|
const char *path_split = strchrnul(stdout_path, ':');
|
||||||
|
|
||||||
if (*path_split != '\0')
|
if (*path_split != '\0')
|
||||||
{
|
{
|
||||||
|
@ -780,13 +781,13 @@ rt_err_t rt_fdt_scan_chosen_stdout(void)
|
||||||
|
|
||||||
if (*options)
|
if (*options)
|
||||||
{
|
{
|
||||||
type_len = rt_strchrnul(options, ',') - options;
|
type_len = strchrnul(options, ',') - options;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options && *options && *options != ' ')
|
if (options && *options && *options != ' ')
|
||||||
{
|
{
|
||||||
options_len = rt_strchrnul(options, ' ') - options;
|
options_len = strchrnul(options, ' ') - options;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* console > stdout-path */
|
/* console > stdout-path */
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <drivers/pic.h>
|
#include <drivers/pic.h>
|
||||||
#include <drivers/ofw.h>
|
#include <drivers/ofw.h>
|
||||||
#include <drivers/ofw_io.h>
|
#include <drivers/ofw_io.h>
|
||||||
|
@ -130,7 +131,7 @@ static rt_err_t ofw_parse_irq_map(struct rt_ofw_node *np, struct rt_ofw_cell_arg
|
||||||
* <0x1800 0 0 4 &gic 0 0 GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; // INTD
|
* <0x1800 0 0 4 &gic 0 0 GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; // INTD
|
||||||
* };
|
* };
|
||||||
*
|
*
|
||||||
* In fact, basically no SoC will be use multi ic to implemented INTx.
|
* In fact, almost no SoC will be use multi IC to implement INTx.
|
||||||
* before call ofw_parse_irq_map(np, &args):
|
* before call ofw_parse_irq_map(np, &args):
|
||||||
*
|
*
|
||||||
* args.data = addr;
|
* args.data = addr;
|
||||||
|
|
|
@ -76,6 +76,16 @@ static void *_ioremap_type(void *paddr, size_t size, enum ioremap_type type)
|
||||||
return v_addr;
|
return v_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rt_weak void *rt_ioremap_early(void *paddr, size_t size)
|
||||||
|
{
|
||||||
|
if (!size)
|
||||||
|
{
|
||||||
|
return RT_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return paddr;
|
||||||
|
}
|
||||||
|
|
||||||
void *rt_ioremap(void *paddr, size_t size)
|
void *rt_ioremap(void *paddr, size_t size)
|
||||||
{
|
{
|
||||||
return _ioremap_type(paddr, size, MM_AREA_TYPE_PHY);
|
return _ioremap_type(paddr, size, MM_AREA_TYPE_PHY);
|
||||||
|
|
|
@ -30,6 +30,7 @@ extern "C" {
|
||||||
* | Currently as non-cacheable
|
* | Currently as non-cacheable
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
void *rt_ioremap_early(void *paddr, size_t size);
|
||||||
void *rt_ioremap(void *paddr, size_t size);
|
void *rt_ioremap(void *paddr, size_t size);
|
||||||
void *rt_ioremap_nocache(void *paddr, size_t size);
|
void *rt_ioremap_nocache(void *paddr, size_t size);
|
||||||
void *rt_ioremap_cached(void *paddr, size_t size);
|
void *rt_ioremap_cached(void *paddr, size_t size);
|
||||||
|
|
|
@ -63,6 +63,8 @@ typedef struct tag_region
|
||||||
{
|
{
|
||||||
rt_size_t start;
|
rt_size_t start;
|
||||||
rt_size_t end;
|
rt_size_t end;
|
||||||
|
|
||||||
|
const char *name;
|
||||||
} rt_region_t;
|
} rt_region_t;
|
||||||
|
|
||||||
extern const rt_size_t rt_mpr_size;
|
extern const rt_size_t rt_mpr_size;
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
menu "RT-Thread Architecture"
|
|
||||||
|
|
||||||
config ARCH_CPU_64BIT
|
config ARCH_CPU_64BIT
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
@ -239,6 +237,6 @@ config ARCH_CPU_STACK_GROWS_UPWARD
|
||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
|
|
||||||
source "$RTT_DIR/libcpu/aarch64/Kconfig"
|
if ARCH_ARMV8 && ARCH_CPU_64BIT
|
||||||
|
source "$RTT_DIR/libcpu/aarch64/Kconfig"
|
||||||
endmenu
|
endif
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
if ARCH_ARMV8 && ARCH_CPU_64BIT
|
menu "AArch64 Architecture Configuration"
|
||||||
|
|
||||||
config ARCH_TEXT_OFFSET
|
config ARCH_TEXT_OFFSET
|
||||||
hex "Text offset"
|
hex "Text offset"
|
||||||
|
@ -16,4 +16,4 @@ config ARCH_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
endif
|
endmenu
|
||||||
|
|
|
@ -23,30 +23,20 @@ typedef union {
|
||||||
} rt_hw_spinlock_t;
|
} rt_hw_spinlock_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rt_inline void rt_hw_isb(void)
|
#define rt_hw_barrier(cmd, ...) \
|
||||||
{
|
__asm__ volatile (RT_STRINGIFY(cmd) " "RT_STRINGIFY(__VA_ARGS__):::"memory")
|
||||||
__asm__ volatile ("isb":::"memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
rt_inline void rt_hw_dmb(void)
|
#define rt_hw_isb() rt_hw_barrier(isb)
|
||||||
{
|
#define rt_hw_dmb() rt_hw_barrier(dmb, ish)
|
||||||
__asm__ volatile ("dmb ish":::"memory");
|
#define rt_hw_wmb() rt_hw_barrier(dmb, ishst)
|
||||||
}
|
#define rt_hw_rmb() rt_hw_barrier(dmb, ishld)
|
||||||
|
#define rt_hw_dsb() rt_hw_barrier(dsb, ish)
|
||||||
|
|
||||||
rt_inline void rt_hw_wmb(void)
|
#define rt_hw_wfi() rt_hw_barrier(wfi)
|
||||||
{
|
#define rt_hw_wfe() rt_hw_barrier(wfe)
|
||||||
__asm__ volatile ("dmb ishst":::"memory");
|
#define rt_hw_sev() rt_hw_barrier(sev)
|
||||||
}
|
|
||||||
|
|
||||||
rt_inline void rt_hw_rmb(void)
|
#define rt_hw_cpu_relax() rt_hw_barrier(yield)
|
||||||
{
|
|
||||||
__asm__ volatile ("dmb ishld":::"memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
rt_inline void rt_hw_dsb(void)
|
|
||||||
{
|
|
||||||
__asm__ volatile ("dsb ish":::"memory");
|
|
||||||
}
|
|
||||||
|
|
||||||
void _thread_start(void);
|
void _thread_start(void);
|
||||||
#endif /*CPUPORT_H__*/
|
#endif /*CPUPORT_H__*/
|
||||||
|
|
|
@ -590,6 +590,31 @@ static int _map_single_page_2M(unsigned long *lv0_tbl, unsigned long va,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *rt_ioremap_early(void *paddr, size_t size)
|
||||||
|
{
|
||||||
|
size_t count;
|
||||||
|
static void *tbl = RT_NULL;
|
||||||
|
|
||||||
|
if (!size)
|
||||||
|
{
|
||||||
|
return RT_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tbl)
|
||||||
|
{
|
||||||
|
tbl = rt_hw_mmu_tbl_get();
|
||||||
|
}
|
||||||
|
|
||||||
|
count = (size + ARCH_SECTION_MASK) >> ARCH_SECTION_SHIFT;
|
||||||
|
|
||||||
|
while (count --> 0)
|
||||||
|
{
|
||||||
|
_map_single_page_2M(tbl, (unsigned long)paddr, (unsigned long)paddr, MMU_MAP_K_DEVICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return paddr;
|
||||||
|
}
|
||||||
|
|
||||||
static int _init_map_2M(unsigned long *lv0_tbl, unsigned long va,
|
static int _init_map_2M(unsigned long *lv0_tbl, unsigned long va,
|
||||||
unsigned long pa, unsigned long count,
|
unsigned long pa, unsigned long count,
|
||||||
unsigned long attr)
|
unsigned long attr)
|
||||||
|
|
Loading…
Reference in New Issue