[U-Boot] [PATCH v2 2/5] rockchip: efuse: add (misc) driver for RK3399 non-secure efuse block
Simon Glass
sjg at chromium.org
Sun Apr 30 03:48:45 UTC 2017
Hi Philipp,
On 28 April 2017 at 09:11, Philipp Tomsich
<philipp.tomsich at theobroma-systems.com> wrote:
> This adds a simple driver for reading the efuse block of the RK3399.
> It should be easy enough to add drivers for other devices (e.g. the
> RK3328, RK3368, etc.) by passing the device details via driver_data.
>
> Unlike the kernel driver (using the nvmem subsystem), we don't expose
> the efuse as multiple named cells, but rather as a linear memory that
> can be read using misc_read(...).
>
> The primary use case (as of today) is the generation of a 'serial#'
> (and a 'cpuid#') environment variable for the RK3399-Q7 (Puma)
> system-on-module.
>
> Note that this adds a debug-only (i.e. only if DEBUG is defined)
> command 'rk3399_dump_efuses' that dumps the efuse block's content.
> N.B.: The name 'rk3399_dump_efuses' was intentionally chosen to
> include a SoC-name (together with a comment in the function) to
> remind whoever adds support for additional SoCs that this
> function currently makes assumptions regarding the size of the
> fuse-box based on the RK3399. The hope is that the function is
> adjusted to reflect any changes resulting from generalising the
> driver for multiple SoCs and is then renamed.
>
> Signed-off-by: Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
> Tested-by: Klaus Goger <klaus.goger at theobroma-systems.com>
> ---
>
> Changes in v2: None
>
> drivers/misc/Kconfig | 14 ++++
> drivers/misc/Makefile | 1 +
> drivers/misc/rockchip-efuse.c | 163 ++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 178 insertions(+)
> create mode 100644 drivers/misc/rockchip-efuse.c
Reviewed-by: Simon Glass <sjg at chromium.org>
But please see below.
>
> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
> index 1aae4bc..ed57414 100644
> --- a/drivers/misc/Kconfig
> +++ b/drivers/misc/Kconfig
> @@ -20,6 +20,19 @@ config ALTERA_SYSID
> Select this to enable a sysid for Altera devices. Please find
> details on the "Embedded Peripherals IP User Guide" of Altera.
>
> +config ROCKCHIP_EFUSE
> + bool "Rockchip e-fuse support"
> + depends on MISC
> + help
> + Enable (read-only) access for the e-fuse block found in Rockchip
> + SoCs: accesses can either be made using byte addressing and a length
> + or through child-nodes that are generated based on the e-fuse map
> + retrieved from the DTS.
> +
> + This driver currently supports the RK3399 only, but can easily be
> + extended (by porting the read function from the Linux kernel sources)
> + to support other recent Rockchip devices.
> +
> config CMD_CROS_EC
> bool "Enable crosec command"
> depends on CROS_EC
> @@ -167,4 +180,5 @@ config I2C_EEPROM
> depends on MISC
> help
> Enable a generic driver for EEPROMs attached via I2C.
> +
> endmenu
> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> index e3151ea..77196fd 100644
> --- a/drivers/misc/Makefile
> +++ b/drivers/misc/Makefile
> @@ -51,3 +51,4 @@ obj-$(CONFIG_PCA9551_LED) += pca9551_led.o
> obj-$(CONFIG_FSL_DEVICE_DISABLE) += fsl_devdis.o
> obj-$(CONFIG_WINBOND_W83627) += winbond_w83627.o
> obj-$(CONFIG_QFW) += qfw.o
> +obj-$(CONFIG_ROCKCHIP_EFUSE) += rockchip-efuse.o
> diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c
> new file mode 100644
> index 0000000..6eb3616
> --- /dev/null
> +++ b/drivers/misc/rockchip-efuse.c
> @@ -0,0 +1,163 @@
> +/*
> + * eFuse driver for Rockchip devices
> + *
> + * Copyright 2017, Theobroma Systems Design und Consulting GmbH
> + * Written by Philipp Tomsich <philipp.tomsich at theobroma-systems.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#define DEBUG
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <command.h>
> +#include <display_options.h>
> +#include <dm.h>
> +#include <linux/bitops.h>
> +#include <linux/delay.h>
> +#include <misc.h>
> +
> +#define RK3399_A_SHIFT 16
> +#define RK3399_A_MASK 0x3ff
> +#define RK3399_NFUSES 32
> +#define RK3399_BYTES_PER_FUSE 4
> +#define RK3399_STROBSFTSEL BIT(9)
> +#define RK3399_RSB BIT(7)
> +#define RK3399_PD BIT(5)
> +#define RK3399_PGENB BIT(3)
> +#define RK3399_LOAD BIT(2)
> +#define RK3399_STROBE BIT(1)
> +#define RK3399_CSB BIT(0)
> +
> +struct rockchip_efuse_regs {
> + u32 ctrl; /* 0x00 efuse control register */
> + u32 dout; /* 0x04 efuse data out register */
> + u32 rf; /* 0x08 efuse redundancy bit used register */
> + u32 _rsvd0;
> + u32 jtag_pass; /* 0x10 JTAG password */
> + u32 strobe_finish_ctrl;
> + /* 0x14 efuse strobe finish control register */
> +};
> +
> +struct rockchip_efuse_platdata {
> + void __iomem *base;
> + struct clk *clk;
> +};
> +
> +#if defined(DEBUG)
> +static int dump_efuses(cmd_tbl_t *cmdtp, int flag,
> + int argc, char * const argv[])
> +{
> + /*
> + * N.B.: This function is tailored towards the RK3399 and assumes that
> + * there's always 32 fuses x 32 bits (i.e. 128 bytes of data) to
> + * be read.
> + */
> +
> + struct udevice *dev;
> + u8 fuses[128];
> + int ret;
> +
> + /* the first misc device will be used */
> + ret = uclass_first_device_err(UCLASS_MISC, &dev);
This might pick up a different device. Can you use
uclass_get_device_by_driver() perhaps?
Regards,
Simon
More information about the U-Boot
mailing list