From fd739c288f61cc69a6653d76513bd9e4dc16f62c Mon Sep 17 00:00:00 2001 From: Wang Chen Date: Wed, 2 Apr 2025 15:39:44 +0800 Subject: [PATCH] bsp: k230: add hardlock driver This hardlock is required by some other drivers, such as sysctl power. This driver can be enable/disabled by configuration. Signed-off-by: Wang Chen --- bsp/k230/.config | 1 + bsp/k230/board/Kconfig | 4 + bsp/k230/drivers/interdrv/hardlock/SConscript | 14 +++ .../drivers/interdrv/hardlock/drv_hardlock.c | 113 ++++++++++++++++++ .../drivers/interdrv/hardlock/drv_hardlock.h | 58 +++++++++ bsp/k230/rtconfig.h | 1 + 6 files changed, 191 insertions(+) create mode 100644 bsp/k230/drivers/interdrv/hardlock/SConscript create mode 100644 bsp/k230/drivers/interdrv/hardlock/drv_hardlock.c create mode 100644 bsp/k230/drivers/interdrv/hardlock/drv_hardlock.h diff --git a/bsp/k230/.config b/bsp/k230/.config index 1e9ca9c186..0eeb0a7b9b 100644 --- a/bsp/k230/.config +++ b/bsp/k230/.config @@ -1489,6 +1489,7 @@ CONFIG_PKG_ZLIB_VER="latest" # # Drivers Configuration # +CONFIG_BSP_USING_HARDLOCK=y # CONFIG_BSP_USING_SDIO is not set # end of Drivers Configuration diff --git a/bsp/k230/board/Kconfig b/bsp/k230/board/Kconfig index df2ac7fa07..d63ec192f7 100644 --- a/bsp/k230/board/Kconfig +++ b/bsp/k230/board/Kconfig @@ -1,5 +1,9 @@ menu "Drivers Configuration" + config BSP_USING_HARDLOCK + bool "Enable Hard-Lock" + default y + menuconfig BSP_USING_SDIO bool "Enable SDIO" select RT_USING_SDIO diff --git a/bsp/k230/drivers/interdrv/hardlock/SConscript b/bsp/k230/drivers/interdrv/hardlock/SConscript new file mode 100644 index 0000000000..e73e2647c5 --- /dev/null +++ b/bsp/k230/drivers/interdrv/hardlock/SConscript @@ -0,0 +1,14 @@ +# RT-Thread building script for component + +from building import * + +cwd = GetCurrentDir() +src = [] +CPPPATH = [cwd] + +if GetDepend('BSP_USING_HARDLOCK'): + src += ['drv_hardlock.c'] + +group = DefineGroup('HARDLOCK', src, depend = [], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/k230/drivers/interdrv/hardlock/drv_hardlock.c b/bsp/k230/drivers/interdrv/hardlock/drv_hardlock.c new file mode 100644 index 0000000000..8d3175b9af --- /dev/null +++ b/bsp/k230/drivers/interdrv/hardlock/drv_hardlock.c @@ -0,0 +1,113 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include "ioremap.h" +#include "board.h" +#include "drv_hardlock.h" +#include + +#define DBG_TAG "HARDLOCK" + +#ifdef RT_DEBUG +#define DBG_LVL DBG_LOG +#else +#define DBG_LVL DBG_WARNING +#endif +#define DBG_COLOR + +struct device_hardlock +{ + volatile void *hw_base; + char used[HARDLOCK_MAX]; +}; +static struct device_hardlock hardlock; + +int kd_hardlock_lock(hardlock_type num) +{ + if(num < 0 || num >= HARDLOCK_MAX) + return -1; + + if(!readl(hardlock.hw_base + num * 0x4)) + { + LOG_D("hardlock-%d locked\n", num); + return 0; + } + + LOG_D("hardlock-%d is busy\n", num); + return -1; +} +RTM_EXPORT(kd_hardlock_lock); + +void kd_hardlock_unlock(hardlock_type num) +{ + if(num < 0 || num >= HARDLOCK_MAX) + return; + + if(readl(hardlock.hw_base + num * 0x4)) + { + writel(0x0, hardlock.hw_base + num * 0x4); + } + LOG_D("hardlock-%d unlock\n", num); +} +RTM_EXPORT(kd_hardlock_unlock); + +int kd_request_lock(hardlock_type num) +{ + if(num < 0 || num >= HARDLOCK_MAX) + return -1; + + if(!hardlock.used[num]) + { + hardlock.used[num] = 1; + return 0; + } + + LOG_E("request hardlock failed, hardlock-%d is used\n", num); + return -1; +} +RTM_EXPORT(kd_request_lock); + +int rt_hw_hardlock_init(void) +{ + struct device_hardlock *hard = &hardlock; + hard->hw_base = 0xA0 + rt_ioremap((void *)MAILBOX_BASE_ADDR, MAILBOX_IO_SIZE); + if(hard->hw_base == RT_NULL) + { + rt_kprintf("hardlock ioremap error\n"); + return -1; + } + + memset(hard->used, 0, sizeof(hard->used)); +#if 0 + rt_kprintf("canaan hardlock init OK\n"); +#endif + return 0; +} +INIT_BOARD_EXPORT(rt_hw_hardlock_init); \ No newline at end of file diff --git a/bsp/k230/drivers/interdrv/hardlock/drv_hardlock.h b/bsp/k230/drivers/interdrv/hardlock/drv_hardlock.h new file mode 100644 index 0000000000..d62f6d8f79 --- /dev/null +++ b/bsp/k230/drivers/interdrv/hardlock/drv_hardlock.h @@ -0,0 +1,58 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DRV_HARDLOCK_H__ +#define DRV_HARDLOCK_H__ +#include + +typedef enum k230_hardlock_type +{ + HARDLOCK_GPIO = 0, + HARDLOCK_KPU = 1, + HARDLOCK_TS = 2, + HARDLOCK_DISP = 3, + HARDLOCK_DISP_CPU0 = 4, + HARDLOCK_DISP_CPU1 = 5, + HARDLOCK_HASH = 6, + HARDLOCK_AES = 7, + HARDLOCK_SM4 = 8, + HARDLOCK_PDMA = 9, + HARDLOCK_MAX = 128 +} hardlock_type; + +#ifdef BSP_USING_HARDLOCK +extern int kd_hardlock_lock(hardlock_type num); +extern void kd_hardlock_unlock(hardlock_type num); +extern int kd_request_lock(hardlock_type num); +#else +rt_inline int kd_hardlock_lock(hardlock_type num) +{ return 0; } +rt_inline void kd_hardlock_unlock(hardlock_type num) +{} +rt_inline int kd_request_lock(hardlock_type num) +{ return num; } +#endif + +#endif \ No newline at end of file diff --git a/bsp/k230/rtconfig.h b/bsp/k230/rtconfig.h index 4fb86d9fa4..378b69b28f 100644 --- a/bsp/k230/rtconfig.h +++ b/bsp/k230/rtconfig.h @@ -559,6 +559,7 @@ /* Drivers Configuration */ +#define BSP_USING_HARDLOCK /* end of Drivers Configuration */ #define BOARD_fpgac908 #define __STACKSIZE__ 65536