| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*
- * Copyright (c) 2006-2023, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2023-02-25 GuEe-GUI the first version
- */
- #include <drivers/hwcache.h>
- #define DBG_TAG "rtdm.hwcache"
- #define DBG_LVL DBG_INFO
- #include <rtdbg.h>
- struct rt_hwcache_ops *rt_dm_cpu_dcache_ops = RT_NULL;
- struct rt_hwcache_ops *rt_dm_cpu_icache_ops = RT_NULL;
- static void hwcache_enable(struct rt_hwcache_ops *ops)
- {
- if (ops && ops->enable)
- {
- ops->enable();
- }
- }
- static void hwcache_disable(struct rt_hwcache_ops *ops)
- {
- if (ops && ops->enable)
- {
- ops->enable();
- }
- }
- static rt_base_t hwcache_status(struct rt_hwcache_ops *ops)
- {
- if (ops && ops->status)
- {
- return ops->status();
- }
- return 0;
- }
- static void hwcache_ops(struct rt_hwcache_ops *ops, int op, void *addr, int size)
- {
- if (ops)
- {
- if (op == RT_HW_CACHE_FLUSH)
- {
- if (ops->flush)
- {
- ops->flush(addr, size);
- }
- }
- else if (op == RT_HW_CACHE_INVALIDATE)
- {
- if (ops->invalidate)
- {
- ops->invalidate(addr, size);
- }
- }
- }
- }
- void rt_hwcache_icache_enable(void)
- {
- hwcache_enable(rt_dm_cpu_icache_ops);
- }
- void rt_hwcache_icache_disable(void)
- {
- hwcache_disable(rt_dm_cpu_icache_ops);
- }
- rt_base_t rt_hwcache_icache_status(void)
- {
- return hwcache_status(rt_dm_cpu_icache_ops);
- }
- void rt_hwcache_icache_ops(int ops, void *addr, int size)
- {
- hwcache_ops(rt_dm_cpu_icache_ops, ops, addr, size);
- }
- void rt_hwcache_dcache_enable(void)
- {
- hwcache_enable(rt_dm_cpu_dcache_ops);
- }
- void rt_hwcache_dcache_disable(void)
- {
- hwcache_disable(rt_dm_cpu_dcache_ops);
- }
- rt_base_t rt_hwcache_dcache_status(void)
- {
- return hwcache_status(rt_dm_cpu_dcache_ops);
- }
- void rt_hwcache_dcache_ops(int ops, void *addr, int size)
- {
- hwcache_ops(rt_dm_cpu_dcache_ops, ops, addr, size);
- }
- #ifdef RT_USING_OFW
- RT_OFW_STUB_RANGE_EXPORT(hwcache, _hwcache_ofw_start, _hwcache_ofw_end);
- static rt_err_t ofw_hwcache_init(void)
- {
- struct rt_ofw_node *cache_np;
- rt_ofw_foreach_allnodes(cache_np)
- {
- rt_ofw_stub_probe_range(cache_np, &_hwcache_ofw_start, &_hwcache_ofw_end);
- }
- return RT_EOK;
- }
- #else
- static rt_err_t ofw_hwcache_init(void)
- {
- return RT_EOK;
- }
- #endif /* !RT_USING_OFW */
- rt_err_t rt_hwcache_init(void)
- {
- rt_err_t err;
- LOG_D("init start");
- err = ofw_hwcache_init();
- LOG_D("init end");
- return err;
- }
|