[U-Boot] [PATCH v2 2/5] rockchip: efuse: add (misc) driver for RK3399 non-secure efuse block

Dr. Philipp Tomsich philipp.tomsich at theobroma-systems.com
Wed May 3 10:25:36 UTC 2017


> On 03 May 2017, at 12:06, Simon Glass <sjg at chromium.org> wrote:
> 
> Hi Philipp,
> 
> On 29 April 2017 at 21:48, Simon Glass <sjg at chromium.org <mailto:sjg at chromium.org>> wrote:
>> 
>> 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?
> 
> 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.


More information about the U-Boot mailing list