> On 03 May 2017, at 12:06, Simon Glass <[email protected]> wrote: > > Hi Philipp, > > On 29 April 2017 at 21:48, Simon Glass <[email protected] > <mailto:[email protected]>> wrote: >> >> Hi Philipp, >> >> On 28 April 2017 at 09:11, Philipp Tomsich >> <[email protected]> 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 <[email protected]> >>> Tested-by: Klaus Goger <[email protected]> >>> --- >>> >>> 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 <[email protected]> >> >> 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 <[email protected]> >>> + * >>> + * 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? > > I've applied just the first patch in this series for now. Let me know > if you would rather keep the driver finding as you have it.
I was just about to resubmit the new series. I’ll rebase to you next-branch and then submit what’s missing. _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

