[PATCH v1 3/4] aarch64/versal: Port JFFS2 GQSPI NOR Driver from Zynqmp

Kinsey Moore kinsey.moore at oarcorp.com
Thu Oct 19 13:43:17 UTC 2023


It looks like this is an older version of the JFFS2 XQspiPsu adapter. The
only real difference other than this being dated is the IRQ used. I'd
rather that be factored out and make the existing code shared. Beyond that,
both this and the ZynqMP version it was pulled from would be obviated by a
generic JFFS2 NOR flashdev driver which I can go ahead and post. I was
hoping to make it NAND compatible before posting, but I just haven't had
the time. Alternatively, I can send it to you for testing if you'd prefer.

On Thu, Oct 19, 2023 at 12:43 AM <aaron.nyholm at unfoldedeffective.com> wrote:

> From: Aaron Nyholm <aaron.nyholm at southerninnovation.com>
>
> ---
>  .../include/bsp/jffs2_xqspipsu.h              |  62 ++++++
>  bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c   | 190 ++++++++++++++++++
>  spec/build/bsps/aarch64/xilinx-versal/grp.yml |   4 +
>  .../aarch64/xilinx-versal/objjffs2qspinor.yml |  20 ++
>  .../aarch64/xilinx-versal/objxqspiflash.yml   |   2 -
>  5 files changed, 276 insertions(+), 2 deletions(-)
>  create mode 100644 bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h
>  create mode 100644 bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c
>  create mode 100644
> spec/build/bsps/aarch64/xilinx-versal/objjffs2qspinor.yml
>
> diff --git a/bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h
> b/bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h
> new file mode 100644
> index 0000000000..4a1cdac7a6
> --- /dev/null
> +++ b/bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h
> @@ -0,0 +1,62 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/**
> + * @file
> + *
> + * @ingroup RTEMSBSPsAArch64XilinxVersal
> + *
> + * @brief Xilinx Versal QSPI JFFS2 flash driver definitions
> + */
> +
> +/*
> + * Copyright (C) 2023 Aaron Nyholm
> + *
> + * 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 OWNER 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 LIBBSP_XILINX_VERSAL_JFFS2_XQSPIPSU_H
> +#define LIBBSP_XILINX_VERSAL_JFFS2_XQSPIPSU_H
> +
> +#include <dev/spi/xqspipsu.h>
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif /* __cplusplus */
> +
> +/**
> + * @brief Mount jffs2 filesystem.
> + *
> + * @param[in] mount_dir The directory to mount the filesystem at.
> + * @param[in] qspipsu_ptr A pointer to an initialized QSPI instance.
> + *
> + * @retval 0 Successful operation. Negative number otherwise.
> + */
> +int xilinx_versal_nor_jffs2_initialize(
> +  const char *mount_dir,
> +  XQspiPsu *qspipsu_ptr
> +);
> +
> +#ifdef __cplusplus
> +}
> +#endif /* __cplusplus */
> +
> +#endif /* LIBBSP_XILINX_VERSAL_JFFS2_XQSPIPSU_H */
> diff --git a/bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c
> b/bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c
> new file mode 100644
> index 0000000000..c84280b420
> --- /dev/null
> +++ b/bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c
> @@ -0,0 +1,190 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +
> +/*
> + * Copyright (C) 2023 Aaron Nyholm
> + *
> + * 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 OWNER 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 <string.h>
> +
> +#include <bsp/irq.h>
> +#include <bsp/jffs2_xqspipsu.h>
> +#include <rtems/jffs2.h>
> +#include <rtems/libio.h>
> +#include <xqspipsu-flash-helper.h>
> +
> +typedef struct {
> +  rtems_jffs2_flash_control super;
> +  XQspiPsu *qspipsu;
> +} flash_control;
> +
> +#ifndef versal
> +#define versal
> +#endif
> +
> +/* From the N25Q00A datasheet */
> +#define BLOCK_SIZE (128UL * 1024UL) //(64UL * 1024UL)
> +#define FLASH_SIZE (512UL * BLOCK_SIZE)
> +#define FLASH_DEVICE_ID 0xbb21 /* Type: 0xbb, Capacity: 0x21 */
> +
> +static flash_control *get_flash_control( rtems_jffs2_flash_control *super
> )
> +{
> +  return (flash_control *) super;
> +}
> +
> +static int do_read(
> +  rtems_jffs2_flash_control *super,
> +  uint32_t offset,
> +  unsigned char *buffer,
> +  size_t size_of_buffer
> +)
> +{
> +  int Status;
> +
> +  flash_control *self = get_flash_control( super );
> +  XQspiPsu *QspiPsuPtr = self->qspipsu;
> +  u8* ReadBuffer = NULL;
> +
> +  Status = QspiPsu_NOR_Read(
> +    QspiPsuPtr,
> +    offset,
> +    size_of_buffer,
> +    &ReadBuffer
> +  );
> +  if ( Status != XST_SUCCESS ) {
> +    return Status;
> +  }
> +
> +  /*
> +   * We have to copy since we can't be sure that buffer is properly
> aligned.
> +   */
> +  memcpy( buffer, ReadBuffer, size_of_buffer );
> +
> +  return 0;
> +}
> +
> +static int do_write(
> +  rtems_jffs2_flash_control *super,
> +  uint32_t offset,
> +  const unsigned char *buffer,
> +  size_t size_of_buffer
> +)
> +{
> +  int Status;
> +
> +  flash_control *self = get_flash_control( super );
> +  XQspiPsu *QspiPsuPtr = self->qspipsu;
> +
> +  Status = QspiPsu_NOR_Write(
> +    QspiPsuPtr,
> +    offset,
> +    size_of_buffer,
> +    (unsigned char *) buffer
> +  );
> +  if ( Status != XST_SUCCESS ) {
> +    return Status;
> +  }
> +
> +  return 0;
> +}
> +
> +static int do_erase(
> +  rtems_jffs2_flash_control *super,
> +  uint32_t offset
> +)
> +{
> +  int Status;
> +
> +  flash_control *self = get_flash_control( super );
> +  XQspiPsu *QspiPsuPtr = self->qspipsu;
> +
> +  Status = QspiPsu_NOR_Erase(
> +    QspiPsuPtr,
> +    offset,
> +    BLOCK_SIZE
> +  );
> +  if ( Status != XST_SUCCESS ) {
> +    return Status;
> +  }
> +
> +  return 0;
> +}
> +
> +static void do_destroy( rtems_jffs2_flash_control *super )
> +{
> +  flash_control *self = get_flash_control( super );
> +
> +  rtems_interrupt_handler_remove(
> +    VERSAL_IRQ_QSPI,
> +    (rtems_interrupt_handler) XQspiPsu_InterruptHandler,
> +    self->qspipsu
> +  );
> +}
> +
> +static flash_control flash_instance = {
> +  .super = {
> +    .block_size        = BLOCK_SIZE,
> +    .flash_size        = FLASH_SIZE,
> +    .read              = do_read,
> +    .write             = do_write,
> +    .erase             = do_erase,
> +    .destroy           = do_destroy,
> +    .device_identifier = FLASH_DEVICE_ID
> +  }
> +};
> +
> +static rtems_jffs2_mount_data mount_data = {
> +  .flash_control      = &flash_instance.super,
> +  .compressor_control = NULL
> +};
> +
> +int xilinx_versal_nor_jffs2_initialize(
> +  const char *mount_dir,
> +  XQspiPsu *qspipsu_ptr
> +)
> +{
> +  int rv = 0;
> +
> +  flash_instance.qspipsu = qspipsu_ptr;
> +
> +  rv = QspiPsu_NOR_Initialize(
> +    flash_instance.qspipsu,
> +    VERSAL_IRQ_QSPI
> +  );
> +  if ( rv != 0 ) {
> +    return rv;
> +  }
> +
> +  rv = mount_and_make_target_path(
> +    NULL,
> +    mount_dir,
> +    RTEMS_FILESYSTEM_TYPE_JFFS2,
> +    RTEMS_FILESYSTEM_READ_WRITE,
> +    &mount_data
> +  );
> +  if ( rv != 0 ) {
> +    return rv;
> +  }
> +
> +  return 0;
> +}
> diff --git a/spec/build/bsps/aarch64/xilinx-versal/grp.yml
> b/spec/build/bsps/aarch64/xilinx-versal/grp.yml
> index 098a8481db..a7e7a9442e 100644
> --- a/spec/build/bsps/aarch64/xilinx-versal/grp.yml
> +++ b/spec/build/bsps/aarch64/xilinx-versal/grp.yml
> @@ -24,6 +24,10 @@ links:
>    uid: abi
>  - role: build-dependency
>    uid: obj
> +- role: build-dependency
> +  uid: ../../objqspipsu
> +- role: build-dependency
> +  uid: objjffs2qspinor
>  - role: build-dependency
>    uid: objxqspiflash
>  - role: build-dependency
> diff --git a/spec/build/bsps/aarch64/xilinx-versal/objjffs2qspinor.yml
> b/spec/build/bsps/aarch64/xilinx-versal/objjffs2qspinor.yml
> new file mode 100644
> index 0000000000..933e377b3e
> --- /dev/null
> +++ b/spec/build/bsps/aarch64/xilinx-versal/objjffs2qspinor.yml
> @@ -0,0 +1,20 @@
> +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
> +build-type: objects
> +cflags: []
> +copyrights:
> +- Copyright (C) 2023 Aaron Nyholm
> +cppflags: []
> +cxxflags: []
> +enabled-by: true
> +includes:
> +- bsps/include/dev/spi/
> +- bsps/include/xil/
> +- bsps/include/xil/${XIL_SUPPORT_PATH}/
> +install:
> +- destination: ${BSP_INCLUDEDIR}/bsp
> +  source:
> +  - bsps/aarch64/xilinx-versal/include/bsp/jffs2_xqspipsu.h
> +links: []
> +source:
> +    - bsps/aarch64/xilinx-versal/jffs2_xqspipsu.c
> +type: build
> diff --git a/spec/build/bsps/aarch64/xilinx-versal/objxqspiflash.yml
> b/spec/build/bsps/aarch64/xilinx-versal/objxqspiflash.yml
> index 6d84bfa8cd..4fe5adc44b 100644
> --- a/spec/build/bsps/aarch64/xilinx-versal/objxqspiflash.yml
> +++ b/spec/build/bsps/aarch64/xilinx-versal/objxqspiflash.yml
> @@ -17,8 +17,6 @@ install:
>  links:
>  - role: build-dependency
>    uid: ../../objxilinxsupport
> -- role: build-dependency
> -  uid: ../../objqspipsu
>  source:
>      - bsps/aarch64/xilinx-versal/dev/spi/versal_xqspi_flash.c
>  type: build
> --
> 2.25.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20231019/ea7c1878/attachment-0001.htm>


More information about the devel mailing list