From d90e1cb7b44666febe010d538682098d6ebb4971 Mon Sep 17 00:00:00 2001 From: chao an Date: Thu, 21 Mar 2024 11:24:40 +0800 Subject: [PATCH] arch/tricore: add spinlock support add atomic test and set operation Signed-off-by: chao an --- arch/tricore/Kconfig | 1 + arch/tricore/include/spinlock.h | 88 +++++++++++++++++++ arch/tricore/src/common/Make.defs | 4 + arch/tricore/src/common/tricore_testset.c | 61 +++++++++++++ .../tricore/tc3xx/tc397/configs/nsh/defconfig | 1 + 5 files changed, 155 insertions(+) create mode 100644 arch/tricore/include/spinlock.h create mode 100644 arch/tricore/src/common/tricore_testset.c diff --git a/arch/tricore/Kconfig b/arch/tricore/Kconfig index 4926bb84b4..e9b5454588 100644 --- a/arch/tricore/Kconfig +++ b/arch/tricore/Kconfig @@ -18,6 +18,7 @@ endchoice # Tricore Toolchain Selection config ARCH_TC3XX bool + select ARCH_HAVE_TESTSET default n config ARCH_FAMILY diff --git a/arch/tricore/include/spinlock.h b/arch/tricore/include/spinlock.h new file mode 100644 index 0000000000..6f75e8fd5b --- /dev/null +++ b/arch/tricore/include/spinlock.h @@ -0,0 +1,88 @@ +/**************************************************************************** + * arch/tricore/include/spinlock.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_TRICORE_INCLUDE_SPINLOCK_H +#define __ARCH_TRICORE_INCLUDE_SPINLOCK_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#ifndef __ASSEMBLY__ +# include +#endif /* __ASSEMBLY__ */ + +/**************************************************************************** + * Pre-processor Prototypes + ****************************************************************************/ + +/* Spinlock states */ + +#define SP_UNLOCKED 0 /* The Un-locked state */ +#define SP_LOCKED 1 /* The Locked state */ + +/* Memory barriers for use with NuttX spinlock logic + * + * Data Memory Barrier (DMB) acts as a memory barrier. + * Data Synchronization Barrier (DSB) acts as a special kind of memory + * barrier. + */ + +#define SP_DSB() __dsync() +#define SP_DMB() __asm("":::"memory") + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/* The Type of a spinlock. */ + +typedef long spinlock_t; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: up_testset + * + * Description: + * Perform an atomic test and set operation on the provided spinlock. + * + * This function must be provided via the architecture-specific logic. + * + * Input Parameters: + * lock - The address of spinlock object. + * + * Returned Value: + * The spinlock is always locked upon return. The value of previous value + * of the spinlock variable is returned, either SP_LOCKED if the spinlock + * as previously locked (meaning that the test-and-set operation failed to + * obtain the lock) or SP_UNLOCKED if the spinlock was previously unlocked + * (meaning that we successfully obtained the lock) + * + ****************************************************************************/ + +/* See prototype in nuttx/include/nuttx/spinlock.h */ + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_TRICORE_INCLUDE_SPINLOCK_H */ diff --git a/arch/tricore/src/common/Make.defs b/arch/tricore/src/common/Make.defs index ba9610a227..ebb666ac17 100644 --- a/arch/tricore/src/common/Make.defs +++ b/arch/tricore/src/common/Make.defs @@ -46,5 +46,9 @@ CMN_CSRCS += tricore_trapcall.c CMN_CSRCS += tricore_systimer.c CMN_CSRCS += tricore_usestack.c +ifeq ($(CONFIG_SPINLOCK),y) + CMN_CSRCS += tricore_testset.c +endif + CFLAGS += -DIFX_CFG_EXTEND_TRAP_HOOKS CFLAGS += -DIFX_USE_SW_MANAGED_INT diff --git a/arch/tricore/src/common/tricore_testset.c b/arch/tricore/src/common/tricore_testset.c new file mode 100644 index 0000000000..cc4242de58 --- /dev/null +++ b/arch/tricore/src/common/tricore_testset.c @@ -0,0 +1,61 @@ +/**************************************************************************** + * arch/tricore/src/common/tricore_testset.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "tricore_internal.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_testset + * + * Description: + * Perform an atomic test and set operation on the provided spinlock. + * This function must be provided via the architecture-specific logic. + * + * Input Parameters: + * lock - A reference to the spinlock object. + * + * Returned Value: + * The spinlock is always locked upon return. The previous value of the + * spinlock variable is returned, either SP_LOCKED if the spinlock was + * previously locked (meaning that the test-and-set operation failed to + * obtain the lock) or SP_UNLOCKED if the spinlock was previously unlocked + * (meaning that we successfully obtained the lock). + * + ****************************************************************************/ + +spinlock_t up_testset(volatile spinlock_t *lock) +{ + /* Perform the compare and set operation */ + + return __cmpswapw((volatile void *)lock, SP_LOCKED, SP_UNLOCKED); +} + diff --git a/boards/tricore/tc3xx/tc397/configs/nsh/defconfig b/boards/tricore/tc3xx/tc397/configs/nsh/defconfig index f2bef67c2f..8501d45700 100644 --- a/boards/tricore/tc3xx/tc397/configs/nsh/defconfig +++ b/boards/tricore/tc3xx/tc397/configs/nsh/defconfig @@ -40,6 +40,7 @@ CONFIG_READLINE_CMD_HISTORY=y CONFIG_SCHED_HPWORK=y CONFIG_SCHED_HPWORKPRIORITY=192 CONFIG_SCHED_WAITPID=y +CONFIG_SPINLOCK=y CONFIG_STACK_COLORATION=y CONFIG_START_MONTH=3 CONFIG_START_YEAR=2016