summaryrefslogtreecommitdiff
path: root/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-drivers-mtd-nvmxip-introduce-QSPI-XIP-driver.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-drivers-mtd-nvmxip-introduce-QSPI-XIP-driver.patch')
-rw-r--r--meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-drivers-mtd-nvmxip-introduce-QSPI-XIP-driver.patch271
1 files changed, 271 insertions, 0 deletions
diff --git a/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-drivers-mtd-nvmxip-introduce-QSPI-XIP-driver.patch b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-drivers-mtd-nvmxip-introduce-QSPI-XIP-driver.patch
new file mode 100644
index 0000000000..aa3db9cb5e
--- /dev/null
+++ b/meta-arm/meta-arm-bsp/recipes-bsp/u-boot/u-boot/corstone1000/0028-drivers-mtd-nvmxip-introduce-QSPI-XIP-driver.patch
@@ -0,0 +1,271 @@
+From 4b71ade0e8e5ad3692b1decb5c1d0c9472827535 Mon Sep 17 00:00:00 2001
+From: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Date: Fri, 14 Apr 2023 13:44:25 +0100
+Subject: [PATCH 28/42] drivers/mtd/nvmxip: introduce QSPI XIP driver
+
+add nvmxip_qspi driver under UCLASS_NVMXIP
+
+The device associated with this driver is the parent of the blk#<id> device
+nvmxip_qspi can be reused by other platforms. If the platform
+has custom settings to apply before using the flash, then the platform
+can provide its own parent driver belonging to UCLASS_NVMXIP and reuse
+nvmxip-blk driver. The custom driver can be implemented like nvmxip_qspi in
+addition to the platform custom settings.
+
+Platforms can use multiple NVM XIP devices at the same time by defining a
+DT node for each one of them.
+
+For more details please refer to doc/develop/driver-model/nvmxip_qspi.rst
+
+Signed-off-by: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+Upstream-Status: Backport [https://github.com/u-boot/u-boot/commit/c9c2c95d4cd27fe0cd41fe13a863899d268f973c]
+---
+ MAINTAINERS | 1 +
+ doc/develop/driver-model/nvmxip.rst | 45 +++++++++++-
+ .../nvmxip/nvmxip_qspi.txt | 56 +++++++++++++++
+ drivers/mtd/nvmxip/Kconfig | 6 ++
+ drivers/mtd/nvmxip/Makefile | 1 +
+ drivers/mtd/nvmxip/nvmxip_qspi.c | 70 +++++++++++++++++++
+ 6 files changed, 178 insertions(+), 1 deletion(-)
+ create mode 100644 doc/device-tree-bindings/nvmxip/nvmxip_qspi.txt
+ create mode 100644 drivers/mtd/nvmxip/nvmxip_qspi.c
+
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 1dbfab5f43..f81654346e 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -1206,6 +1206,7 @@ NVMXIP
+ M: Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+ S: Maintained
+ F: doc/develop/driver-model/nvmxip.rst
++F: doc/device-tree-bindings/nvmxip/nvmxip_qspi.txt
+ F: drivers/mtd/nvmxip/
+
+ NVMEM
+diff --git a/doc/develop/driver-model/nvmxip.rst b/doc/develop/driver-model/nvmxip.rst
+index fe087b13d2..09afdbcccf 100644
+--- a/doc/develop/driver-model/nvmxip.rst
++++ b/doc/develop/driver-model/nvmxip.rst
+@@ -25,7 +25,33 @@ The NVMXIP Uclass provides the following drivers:
+ the Uclass creates a block device and binds it with the nvmxip-blk.
+ The Uclass driver implemented by drivers/mtd/nvmxip/nvmxip-uclass.c
+
+- The implementation is generic and can be used by different platforms.
++ nvmxip_qspi driver :
++
++ The driver probed with the DT and is the parent of the blk#<id> device.
++ nvmxip_qspi can be reused by other platforms. If the platform
++ has custom settings to apply before using the flash, then the platform
++ can provide its own parent driver belonging to UCLASS_NVMXIP and reuse
++ nvmxip-blk. The custom driver can be implemented like nvmxip_qspi in
++ addition to the platform custom settings.
++ The nvmxip_qspi driver belongs to UCLASS_NVMXIP.
++ The driver implemented by drivers/mtd/nvmxip/nvmxip_qspi.c
++
++ For example, if we have two NVMXIP devices described in the DT
++ The devices hierarchy is as follows:
++
++::
++
++ => dm tree
++
++ Class Index Probed Driver Name
++ -----------------------------------------------------------
++ ...
++ nvmxip 0 [ + ] nvmxip_qspi |-- nvmxip-qspi1@08000000
++ blk 3 [ + ] nvmxip-blk | `-- nvmxip-qspi1@08000000.blk#1
++ nvmxip 1 [ + ] nvmxip_qspi |-- nvmxip-qspi2@08200000
++ blk 4 [ + ] nvmxip-blk | `-- nvmxip-qspi2@08200000.blk#2
++
++The implementation is generic and can be used by different platforms.
+
+ Supported hardware
+ --------------------------------
+@@ -43,6 +69,23 @@ config NVMXIP
+ handles the read operation. This driver is HW agnostic and can support
+ multiple flash devices at the same time.
+
++config NVMXIP_QSPI
++ This option allows the emulation of a block storage device on top of a QSPI XIP flash.
++ Any platform that needs to emulate one or multiple QSPI XIP flash devices can turn this
++ option on to enable the functionality. NVMXIP config is selected automatically.
++ Platforms that need to add custom treatments before accessing to the flash, can
++ write their own driver (same as nvmxip_qspi in addition to the custom settings).
++
++Device Tree nodes
++--------------------
++
++Multiple QSPI XIP flash devices can be used at the same time by describing them through DT
++nodes.
++
++Please refer to the documentation of the DT binding at:
++
++doc/device-tree-bindings/nvmxip/nvmxip_qspi.txt
++
+ Contributors
+ ------------
+ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+diff --git a/doc/device-tree-bindings/nvmxip/nvmxip_qspi.txt b/doc/device-tree-bindings/nvmxip/nvmxip_qspi.txt
+new file mode 100644
+index 0000000000..cc60e9efdc
+--- /dev/null
++++ b/doc/device-tree-bindings/nvmxip/nvmxip_qspi.txt
+@@ -0,0 +1,56 @@
++Specifying NVMXIP information for devices
++======================================
++
++QSPI XIP flash device nodes
++---------------------------
++
++Each flash device should have its own node.
++
++Each node must specify the following fields:
++
++1)
++ compatible = "nvmxip,qspi";
++
++This allows to bind the flash device with the nvmxip_qspi driver
++If a platform has its own driver, please provide your own compatible
++string.
++
++2)
++ reg = <0x0 0x08000000 0x0 0x00200000>;
++
++The start address and size of the flash device. The values give here are an
++example (when the cell size is 2).
++
++When cell size is 1, the reg field looks like this:
++
++ reg = <0x08000000 0x00200000>;
++
++3)
++
++ lba_shift = <9>;
++
++The number of bit shifts used to calculate the size in bytes of one block.
++In this example the block size is 1 << 9 = 2 ^ 9 = 512 bytes
++
++4)
++
++ lba = <4096>;
++
++The number of blocks.
++
++Example of multiple flash devices
++----------------------------------------------------
++
++ nvmxip-qspi1@08000000 {
++ compatible = "nvmxip,qspi";
++ reg = <0x0 0x08000000 0x0 0x00200000>;
++ lba_shift = <9>;
++ lba = <4096>;
++ };
++
++ nvmxip-qspi2@08200000 {
++ compatible = "nvmxip,qspi";
++ reg = <0x0 0x08200000 0x0 0x00100000>;
++ lba_shift = <9>;
++ lba = <2048>;
++ };
+diff --git a/drivers/mtd/nvmxip/Kconfig b/drivers/mtd/nvmxip/Kconfig
+index ef53fc3c79..3ef7105026 100644
+--- a/drivers/mtd/nvmxip/Kconfig
++++ b/drivers/mtd/nvmxip/Kconfig
+@@ -11,3 +11,9 @@ config NVMXIP
+ This option allows the emulation of a block storage device
+ on top of a direct access non volatile memory XIP flash devices.
+ This support provides the read operation.
++
++config NVMXIP_QSPI
++ bool "QSPI XIP support"
++ select NVMXIP
++ help
++ This option allows the emulation of a block storage device on top of a QSPI XIP flash
+diff --git a/drivers/mtd/nvmxip/Makefile b/drivers/mtd/nvmxip/Makefile
+index 07890982c7..54eacc102e 100644
+--- a/drivers/mtd/nvmxip/Makefile
++++ b/drivers/mtd/nvmxip/Makefile
+@@ -5,3 +5,4 @@
+ # Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
+
+ obj-y += nvmxip-uclass.o nvmxip.o
++obj-$(CONFIG_NVMXIP_QSPI) += nvmxip_qspi.o
+diff --git a/drivers/mtd/nvmxip/nvmxip_qspi.c b/drivers/mtd/nvmxip/nvmxip_qspi.c
+new file mode 100644
+index 0000000000..7221fd1cb4
+--- /dev/null
++++ b/drivers/mtd/nvmxip/nvmxip_qspi.c
+@@ -0,0 +1,70 @@
++// SPDX-License-Identifier: GPL-2.0+
++/*
++ * Copyright 2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
++ *
++ * Authors:
++ * Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
++ */
++
++#include <common.h>
++#include <dm.h>
++#include <fdt_support.h>
++#include <linux/errno.h>
++#include "nvmxip.h"
++
++#include <asm/global_data.h>
++DECLARE_GLOBAL_DATA_PTR;
++
++#define NVMXIP_QSPI_DRV_NAME "nvmxip_qspi"
++
++/**
++ * nvmxip_qspi_of_to_plat() -read from DT
++ * @dev: the NVMXIP device
++ *
++ * Read from the DT the NVMXIP information.
++ *
++ * Return:
++ *
++ * 0 on success. Otherwise, failure
++ */
++static int nvmxip_qspi_of_to_plat(struct udevice *dev)
++{
++ struct nvmxip_plat *plat = dev_get_plat(dev);
++ int ret;
++
++ plat->phys_base = (phys_addr_t)dev_read_addr(dev);
++ if (plat->phys_base == FDT_ADDR_T_NONE) {
++ log_err("[%s]: can not get base address from device tree\n", dev->name);
++ return -EINVAL;
++ }
++
++ ret = dev_read_u32(dev, "lba_shift", &plat->lba_shift);
++ if (ret) {
++ log_err("[%s]: can not get lba_shift from device tree\n", dev->name);
++ return -EINVAL;
++ }
++
++ ret = dev_read_u32(dev, "lba", (u32 *)&plat->lba);
++ if (ret) {
++ log_err("[%s]: can not get lba from device tree\n", dev->name);
++ return -EINVAL;
++ }
++
++ log_debug("[%s]: XIP device base addr: 0x%llx , lba_shift: %d , lbas: %lu\n",
++ dev->name, plat->phys_base, plat->lba_shift, plat->lba);
++
++ return 0;
++}
++
++static const struct udevice_id nvmxip_qspi_ids[] = {
++ { .compatible = "nvmxip,qspi" },
++ { /* sentinel */ }
++};
++
++U_BOOT_DRIVER(nvmxip_qspi) = {
++ .name = NVMXIP_QSPI_DRV_NAME,
++ .id = UCLASS_NVMXIP,
++ .of_match = nvmxip_qspi_ids,
++ .of_to_plat = nvmxip_qspi_of_to_plat,
++ .plat_auto = sizeof(struct nvmxip_plat),
++};
+--
+2.25.1
+