1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
/*
* Copyright : (C) 2025 Phytium Information Technology, Inc.
* All Rights Reserved.
*
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
* either version 1.0 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the Phytium Public License for more details.
*
*
* FilePath: sys.c
* Created Date: 2025-04-30 15:18:08
* Last Modified: 2025-05-07 14:53:21
* Description: This file is for
*
* Modify History:
* Ver Who Date Changes
* ----- ---------- -------- ---------------------------------
* 1.0 LiuSM 2025-04-30 15:18:08 First version
*/
#include <metal/compiler.h>
#include <metal/io.h>
#include <metal/sys.h>
#include <stdint.h>
#include "faarch.h"
#include "mmu.h"
#include "cache.h"
#include "rtthread.h"
#define _DISABLE_INTERRUPTS() \
__asm volatile("MSR DAIFSET, #2" :: \
: "memory"); \
__asm volatile("DSB SY"); \
__asm volatile("ISB SY");
#define _ENABLE_INTERRUPTS() \
__asm volatile("MSR DAIFCLR, #2" :: \
: "memory"); \
__asm volatile("DSB SY"); \
__asm volatile("ISB SY");
void sys_irq_restore_enable(unsigned int flags)
{
#ifdef __aarch64__
_ENABLE_INTERRUPTS();
#else
MTCPSR(flags);
#endif
}
unsigned int sys_irq_save_disable(void)
{
unsigned int state = 0;
#ifdef __aarch64__
_DISABLE_INTERRUPTS();
#else
state = MFCPSR();
MTCPSR(state | 0xc0);
#endif
return state;
}
void metal_machine_cache_flush(void *addr, unsigned int len)
{
rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)addr, len);;
}
void metal_machine_cache_invalidate(void *addr, unsigned int len)
{
rt_hw_cpu_dcache_ops(RT_HW_CACHE_INVALIDATE, (void *)addr, len);
}
/**
* @brief poll function until some event happens
*/
void metal_weak metal_generic_default_poll(void)
{
metal_asm volatile("wfi");
}
void *metal_machine_io_mem_map(void *va, metal_phys_addr_t pa,
size_t size, unsigned int flags)
{
// rt_aspace_t aspace = NULL;
// aspace = (rt_aspace_t)rt_malloc(sizeof(*aspace));
// printf("sys_io_mem_map: va=%p, pa=0x%lx, size=0x%lx, flags=0x%x\n", va, pa, size, flags);
// printf("sys_io_mem_map: aspace=0x%p\n", aspace);
// int err = RT_EOK;
// void *ret;
// ret = rt_hw_mmu_map(aspace, va, pa, size, flags);
// if (ret == RT_NULL)
// {
// err = -RT_ERROR;
// }
// return err;
(void)va;
(void)pa;
(void)size;
(void)flags;
return va;
}
|