Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bsp/k230/.config
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 4 additions & 0 deletions bsp/k230/board/Kconfig
Original file line number Diff line number Diff line change
@@ -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
Expand Down
14 changes: 14 additions & 0 deletions bsp/k230/drivers/interdrv/hardlock/SConscript
Original file line number Diff line number Diff line change
@@ -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')
113 changes: 113 additions & 0 deletions bsp/k230/drivers/interdrv/hardlock/drv_hardlock.c
Original file line number Diff line number Diff line change
@@ -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 <rtthread.h>
#include <rthw.h>
#include <rtdevice.h>
#include <riscv_io.h>
#include <string.h>
#include "ioremap.h"
#include "board.h"
#include "drv_hardlock.h"
#include <rtdbg.h>

#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);
58 changes: 58 additions & 0 deletions bsp/k230/drivers/interdrv/hardlock/drv_hardlock.h
Original file line number Diff line number Diff line change
@@ -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 <rtdef.h>

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
1 change: 1 addition & 0 deletions bsp/k230/rtconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,7 @@

/* Drivers Configuration */

#define BSP_USING_HARDLOCK
/* end of Drivers Configuration */
#define BOARD_fpgac908
#define __STACKSIZE__ 65536
Expand Down