This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 50f0fd4df2 risc-v/litex: Add system reset and access to core control 
registers.
50f0fd4df2 is described below

commit 50f0fd4df2bb0d578fa72e59ce4efa7e48a5646d
Author: Stuart Ianna <[email protected]>
AuthorDate: Fri Aug 25 12:00:35 2023 +1000

    risc-v/litex: Add system reset and access to core control registers.
---
 arch/risc-v/Kconfig                                |   1 +
 arch/risc-v/src/litex/Make.defs                    |   1 +
 arch/risc-v/src/litex/hardware/litex_memorymap.h   |   4 +
 arch/risc-v/src/litex/litex_ctrl.c                 | 108 +++++++++++++++++++++
 arch/risc-v/src/litex/litex_ctrl.h                 | 105 ++++++++++++++++++++
 arch/risc-v/src/litex/litex_systemreset.c          |  52 ++++++++++
 .../litex/arty_a7/configs/knsh-tickless/defconfig  |   1 +
 boards/risc-v/litex/arty_a7/configs/knsh/defconfig |   1 +
 .../litex/arty_a7/configs/nsh-tickless/defconfig   |   1 +
 boards/risc-v/litex/arty_a7/configs/nsh/defconfig  |   1 +
 boards/risc-v/litex/arty_a7/src/Makefile           |   4 +
 boards/risc-v/litex/arty_a7/src/litex_reset.c      |  78 +++++++++++++++
 12 files changed, 357 insertions(+)

diff --git a/arch/risc-v/Kconfig b/arch/risc-v/Kconfig
index 275c28639a..a0ded26b0b 100644
--- a/arch/risc-v/Kconfig
+++ b/arch/risc-v/Kconfig
@@ -45,6 +45,7 @@ config ARCH_CHIP_LITEX
        select ARCH_RV_ISA_A
        select ARCH_DCACHE
        select ARCH_HAVE_TICKLESS
+       select ARCH_HAVE_RESET
        ---help---
                Enjoy Digital LITEX VEXRISCV softcore processor (RV32IMA).
 
diff --git a/arch/risc-v/src/litex/Make.defs b/arch/risc-v/src/litex/Make.defs
index ed868915b0..f3bfabac1b 100644
--- a/arch/risc-v/src/litex/Make.defs
+++ b/arch/risc-v/src/litex/Make.defs
@@ -30,6 +30,7 @@ endif
 
 # Specify our C code within this directory to be included
 CHIP_CSRCS  = litex_allocateheap.c litex_clockconfig.c
+CHIP_CSRCS += litex_ctrl.c litex_systemreset.c
 CHIP_CSRCS += litex_irq.c litex_irq_dispatch.c
 CHIP_CSRCS += litex_lowputc.c litex_serial.c
 CHIP_CSRCS += litex_start.c
diff --git a/arch/risc-v/src/litex/hardware/litex_memorymap.h 
b/arch/risc-v/src/litex/hardware/litex_memorymap.h
index fc9423e199..98584f5d40 100644
--- a/arch/risc-v/src/litex/hardware/litex_memorymap.h
+++ b/arch/risc-v/src/litex/hardware/litex_memorymap.h
@@ -60,6 +60,10 @@
     #define LITEX_SDPHY_BASE        0xf0005000
 #endif
 
+/* Litex core control block */
+
+#define LITEX_CTRL_BASE         0xf0000800
+
 /* GPIO peripheral definitions.
  *  - LITEX_GPIO_BASE is the first 32-bit address which contains a block
  *    of GPIO registers (peripheral). Each block can contain up to 32 pins.
diff --git a/arch/risc-v/src/litex/litex_ctrl.c 
b/arch/risc-v/src/litex/litex_ctrl.c
new file mode 100644
index 0000000000..c5293bddc1
--- /dev/null
+++ b/arch/risc-v/src/litex/litex_ctrl.c
@@ -0,0 +1,108 @@
+/****************************************************************************
+ * arch/risc-v/src/litex/litex_ctrl.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 <stdint.h>
+
+#include "hardware/litex_memorymap.h"
+#include "riscv_internal.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define LITEX_CTRL_RST_OFFSET             0x00
+#define LITEX_CTRL_SCRATCH_OFFSET         0x04
+#define LITEX_CTRL_BUS_ERROR_OFFSET       0x08
+
+#define LITEX_CTRL_RST_RESET_BIT          0x00
+
+#define CTRL_REG(X) (LITEX_CTRL_BASE + X)
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: litex_ctrl_reset
+ *
+ * Description:
+ *   Request a core reset.
+ *
+ * Returned Value:
+ *  None: This function should not return.
+ *
+ ****************************************************************************/
+
+void litex_ctrl_reset(void)
+{
+  putreg32(0x1 << LITEX_CTRL_RST_RESET_BIT, CTRL_REG(LITEX_CTRL_RST_OFFSET));
+}
+
+/****************************************************************************
+ * Name: litex_ctrl_write_scratch
+ *
+ * Description:
+ *   Write a value to the litex control block scratch register.
+ *
+ * Input Parameters:
+ *   value  - The value to store in the register.
+ *
+ ****************************************************************************/
+
+void litex_ctrl_write_scratch(uint32_t value)
+{
+  putreg32(value, CTRL_REG(LITEX_CTRL_SCRATCH_OFFSET));
+}
+
+/****************************************************************************
+ * Name: litex_ctrl_read_scratch
+ *
+ * Description:
+ *   Read a stored value from the litex control block scratch register.
+ *
+ * Returned Value:
+ *  The value stored in the scratch register.
+ *
+ ****************************************************************************/
+
+uint32_t litex_ctrl_read_scratch(void)
+{
+  return getreg32(CTRL_REG(LITEX_CTRL_SCRATCH_OFFSET));
+}
+
+/****************************************************************************
+ * Name: litex_ctrl_read_bus_error
+ *
+ * Description:
+ *   Read any bus error reported in the control block.
+ *
+ * Returned Value:
+ *  The bus error number stored.
+ *
+ ****************************************************************************/
+
+uint32_t litex_ctrl_read_bus_error(void)
+{
+  return getreg32(CTRL_REG(LITEX_CTRL_BUS_ERROR_OFFSET));
+}
diff --git a/arch/risc-v/src/litex/litex_ctrl.h 
b/arch/risc-v/src/litex/litex_ctrl.h
new file mode 100644
index 0000000000..4e4fd7618f
--- /dev/null
+++ b/arch/risc-v/src/litex/litex_ctrl.h
@@ -0,0 +1,105 @@
+/****************************************************************************
+ * arch/risc-v/src/litex/litex_ctrl.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_RISCV_SRC_LITEX_LITEX_CTRL_H
+#define __ARCH_RISCV_SRC_LITEX_LITEX_CTRL_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include "chip.h"
+
+/****************************************************************************
+ * Public Function Prototypes
+ ****************************************************************************/
+
+#ifndef __ASSEMBLY__
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C"
+{
+#else
+#define EXTERN extern
+#endif
+
+/****************************************************************************
+ * Name: litex_ctrl_reset
+ *
+ * Description:
+ *   Request a core reset.
+ *
+ * Returned Value:
+ *  None: This function should not return.
+ *
+ ****************************************************************************/
+
+void litex_ctrl_reset(void) noreturn_function;
+
+/****************************************************************************
+ * Name: litex_ctrl_write_scratch
+ *
+ * Description:
+ *   Write a value to the litex control block scratch register.
+ *
+ * Input Parameters:
+ *   value  - The value to store in the register.
+ *
+ ****************************************************************************/
+
+void litex_ctrl_write_scratch(uint32_t value);
+
+/****************************************************************************
+ * Name: litex_ctrl_read_scratch
+ *
+ * Description:
+ *   Read a stored value from the litex control block scratch register.
+ *
+ * Returned Value:
+ *  The value stored in the scratch register.
+ *
+ ****************************************************************************/
+
+uint32_t litex_ctrl_read_scratch(void);
+
+/****************************************************************************
+ * Name: litex_ctrl_read_bus_error
+ *
+ * Description:
+ *   Read any bus error reported in the control block.
+ *
+ * Returned Value:
+ *  The bus error number stored.
+ *
+ ****************************************************************************/
+
+uint32_t litex_ctrl_read_bus_error(void);
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ARCH_RISCV_SRC_LITEX_LITEX_CTRL_H */
diff --git a/arch/risc-v/src/litex/litex_systemreset.c 
b/arch/risc-v/src/litex/litex_systemreset.c
new file mode 100644
index 0000000000..ae13c7c89d
--- /dev/null
+++ b/arch/risc-v/src/litex/litex_systemreset.c
@@ -0,0 +1,52 @@
+/****************************************************************************
+ * arch/risc-v/src/litex/litex_systemreset.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 <stdint.h>
+#include <nuttx/config.h>
+
+#include "litex_ctrl.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: up_systemreset
+ *
+ * Description:
+ *   Does a warm reset of the core through litex ctrl register block.
+ *
+ ****************************************************************************/
+
+void up_systemreset(void)
+{
+  /* Should not return */
+
+  litex_ctrl_reset();
+
+  for (; ; )
+    {
+      up_mdelay(250);
+    }
+}
diff --git a/boards/risc-v/litex/arty_a7/configs/knsh-tickless/defconfig 
b/boards/risc-v/litex/arty_a7/configs/knsh-tickless/defconfig
index 5b38853179..83a307a6cf 100644
--- a/boards/risc-v/litex/arty_a7/configs/knsh-tickless/defconfig
+++ b/boards/risc-v/litex/arty_a7/configs/knsh-tickless/defconfig
@@ -32,6 +32,7 @@ CONFIG_ARCH_USE_MMU=y
 CONFIG_ARCH_USE_MPU=y
 CONFIG_ARCH_USE_S_MODE=y
 CONFIG_BINFMT_ELF_EXECUTABLE=y
+CONFIG_BOARDCTL_RESET=y
 CONFIG_BOARDCTL_ROMDISK=y
 CONFIG_BOARD_LATE_INITIALIZE=y
 CONFIG_BOARD_LOOPSPERMSEC=10000
diff --git a/boards/risc-v/litex/arty_a7/configs/knsh/defconfig 
b/boards/risc-v/litex/arty_a7/configs/knsh/defconfig
index 013081976f..eb58bb67aa 100644
--- a/boards/risc-v/litex/arty_a7/configs/knsh/defconfig
+++ b/boards/risc-v/litex/arty_a7/configs/knsh/defconfig
@@ -32,6 +32,7 @@ CONFIG_ARCH_USE_MMU=y
 CONFIG_ARCH_USE_MPU=y
 CONFIG_ARCH_USE_S_MODE=y
 CONFIG_BINFMT_ELF_EXECUTABLE=y
+CONFIG_BOARDCTL_RESET=y
 CONFIG_BOARDCTL_ROMDISK=y
 CONFIG_BOARD_LATE_INITIALIZE=y
 CONFIG_BOARD_LOOPSPERMSEC=10000
diff --git a/boards/risc-v/litex/arty_a7/configs/nsh-tickless/defconfig 
b/boards/risc-v/litex/arty_a7/configs/nsh-tickless/defconfig
index 55a1de68c7..2c88bdcff4 100644
--- a/boards/risc-v/litex/arty_a7/configs/nsh-tickless/defconfig
+++ b/boards/risc-v/litex/arty_a7/configs/nsh-tickless/defconfig
@@ -28,6 +28,7 @@ CONFIG_ARCH_CHIP_LITEX=y
 CONFIG_ARCH_INTERRUPTSTACK=8192
 CONFIG_ARCH_RISCV=y
 CONFIG_ARCH_STACKDUMP=y
+CONFIG_BOARDCTL_RESET=y
 CONFIG_BOARD_LOOPSPERMSEC=10000
 CONFIG_BUILTIN=y
 CONFIG_DEBUG_FULLOPT=y
diff --git a/boards/risc-v/litex/arty_a7/configs/nsh/defconfig 
b/boards/risc-v/litex/arty_a7/configs/nsh/defconfig
index 3e481de8da..a02e7037c6 100644
--- a/boards/risc-v/litex/arty_a7/configs/nsh/defconfig
+++ b/boards/risc-v/litex/arty_a7/configs/nsh/defconfig
@@ -28,6 +28,7 @@ CONFIG_ARCH_CHIP_LITEX=y
 CONFIG_ARCH_INTERRUPTSTACK=8192
 CONFIG_ARCH_RISCV=y
 CONFIG_ARCH_STACKDUMP=y
+CONFIG_BOARDCTL_RESET=y
 CONFIG_BOARD_LOOPSPERMSEC=10000
 CONFIG_BUILTIN=y
 CONFIG_DEBUG_FULLOPT=y
diff --git a/boards/risc-v/litex/arty_a7/src/Makefile 
b/boards/risc-v/litex/arty_a7/src/Makefile
index ae8f0e7456..65518bffa4 100644
--- a/boards/risc-v/litex/arty_a7/src/Makefile
+++ b/boards/risc-v/litex/arty_a7/src/Makefile
@@ -42,4 +42,8 @@ ifeq ($(CONFIG_LITEX_APPLICATION_RAMDISK),y)
 CSRCS += litex_ramdisk.c
 endif
 
+ifeq ($(CONFIG_BOARDCTL_RESET),y)
+CSRCS += litex_reset.c
+endif
+
 include $(TOPDIR)/boards/Board.mk
diff --git a/boards/risc-v/litex/arty_a7/src/litex_reset.c 
b/boards/risc-v/litex/arty_a7/src/litex_reset.c
new file mode 100644
index 0000000000..2f3445fae7
--- /dev/null
+++ b/boards/risc-v/litex/arty_a7/src/litex_reset.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+ * boards/risc-v/litex/arty_a7/src/litex_reset.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 <nuttx/config.h>
+
+#include <assert.h>
+#include <nuttx/board.h>
+#include <nuttx/arch.h>
+
+#ifdef CONFIG_BOARDCTL_RESET
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: board_reset
+ *
+ * Description:
+ *   Reset board.  Support for this function is required by board-level
+ *   logic if CONFIG_BOARDCTL_RESET is selected.
+ *
+ * Input Parameters:
+ *   status - Status information provided with the reset event.  This
+ *            meaning of this status information is board-specific.  If not
+ *            used by a board, the value zero may be provided in calls to
+ *            board_reset().
+ *
+ * Returned Value:
+ *   If this function returns, then it was not possible to power-off the
+ *   board due to some constraints.  The return value in this case is a
+ *   board-specific reason for the failure to shutdown.
+ *
+ * Additionally: This function is called from assert if
+ *  CONFIG_BOARD_RESET_ON_ASSERT >= 1. In this case status is set to
+ *  CONFIG_BOARD_ASSERT_RESET_VALUE
+ *
+ ****************************************************************************/
+
+int board_reset(int status)
+{
+  switch (status)
+    {
+      case CONFIG_BOARD_ASSERT_RESET_VALUE:
+      default:
+        up_systemreset();
+    }
+
+  /* up_systemreset can't actually return. However, let's try to catch the
+   * case that this changes in the future, or the logic is extended to a case
+   * which can fail.
+  */
+
+  return -ENODEV;
+}
+
+#endif /* CONFIG_BOARDCTL_RESET */

Reply via email to