[PATCH 2/2] rockchip: efuse: Add support for rk1808 non-secure efuse

Kever Yang kever.yang at rock-chips.com
Mon Mar 2 10:42:00 CET 2020


Hi Finley,


     NAK for this patch, rk1808 is not support by upstream U-Boot now.


Thanks,

- Kever

On 2020/2/20 上午10:53, Finley Xiao wrote:
> This adds the necessary data for handling eFuse on the rk1808.
>
> Signed-off-by: Finley Xiao <finley.xiao at rock-chips.com>
> ---
>   drivers/misc/rockchip-efuse.c | 114 ++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 114 insertions(+)
>
> diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c
> index 68762d3f6f..778e29f30d 100644
> --- a/drivers/misc/rockchip-efuse.c
> +++ b/drivers/misc/rockchip-efuse.c
> @@ -16,6 +16,46 @@
>   #include <malloc.h>
>   #include <misc.h>
>   
> +#define T_CSB_P_S		0
> +#define T_PGENB_P_S		0
> +#define T_LOAD_P_S		0
> +#define T_ADDR_P_S		0
> +#define T_STROBE_P_S		(0 + 110) /* 1.1us */
> +#define T_CSB_P_L		(0 + 110 + 1000 + 20) /* 200ns */
> +#define T_PGENB_P_L		(0 + 110 + 1000 + 20)
> +#define T_LOAD_P_L		(0 + 110 + 1000 + 20)
> +#define T_ADDR_P_L		(0 + 110 + 1000 + 20)
> +#define T_STROBE_P_L		(0 + 110 + 1000) /* 10us */
> +#define T_CSB_R_S		0
> +#define T_PGENB_R_S		0
> +#define T_LOAD_R_S		0
> +#define T_ADDR_R_S		2
> +#define T_STROBE_R_S		(2 + 3)
> +#define T_CSB_R_L		(2 + 3 + 3 + 3)
> +#define T_PGENB_R_L		(2 + 3 + 3 + 3)
> +#define T_LOAD_R_L		(2 + 3 + 3 + 3)
> +#define T_ADDR_R_L		(2 + 3 + 3 + 2)
> +#define T_STROBE_R_L		(2 + 3 + 3)
> +
> +#define T_CSB_P			0x28
> +#define T_PGENB_P		0x2c
> +#define T_LOAD_P		0x30
> +#define T_ADDR_P		0x34
> +#define T_STROBE_P		0x38
> +#define T_CSB_R			0x3c
> +#define T_PGENB_R		0x40
> +#define T_LOAD_R		0x44
> +#define T_ADDR_R		0x48
> +#define T_STROBE_R		0x4c
> +
> +#define RK1808_USER_MODE	BIT(0)
> +#define RK1808_INT_FINISH	BIT(0)
> +#define RK1808_AUTO_ENB		BIT(0)
> +#define RK1808_AUTO_RD		BIT(1)
> +#define RK1808_A_SHIFT		16
> +#define RK1808_A_MASK		0x3ff
> +#define RK1808_NBYTES		4
> +
>   #define RK3288_A_SHIFT          6
>   #define RK3288_A_MASK           0x3ff
>   #define RK3288_NFUSES           32
> @@ -109,6 +149,76 @@ U_BOOT_CMD(
>   );
>   #endif
>   
> +static void rk1808_efuse_timing_init(void __iomem *base)
> +{
> +	static bool init;
> +
> +	if (init)
> +		return;
> +
> +	/* enable auto mode */
> +	writel(readl(base) & (~RK1808_USER_MODE), base);
> +
> +	/* setup efuse timing */
> +	writel((T_CSB_P_S << 16) | T_CSB_P_L, base + T_CSB_P);
> +	writel((T_PGENB_P_S << 16) | T_PGENB_P_L, base + T_PGENB_P);
> +	writel((T_LOAD_P_S << 16) | T_LOAD_P_L, base + T_LOAD_P);
> +	writel((T_ADDR_P_S << 16) | T_ADDR_P_L, base + T_ADDR_P);
> +	writel((T_STROBE_P_S << 16) | T_STROBE_P_L, base + T_STROBE_P);
> +	writel((T_CSB_R_S << 16) | T_CSB_R_L, base + T_CSB_R);
> +	writel((T_PGENB_R_S << 16) | T_PGENB_R_L, base + T_PGENB_R);
> +	writel((T_LOAD_R_S << 16) | T_LOAD_R_L, base + T_LOAD_R);
> +	writel((T_ADDR_R_S << 16) | T_ADDR_R_L, base + T_ADDR_R);
> +	writel((T_STROBE_R_S << 16) | T_STROBE_R_L, base + T_STROBE_R);
> +
> +	init = true;
> +}
> +
> +static int rockchip_rk1808_efuse_read(struct udevice *dev, int offset,
> +				      void *buf, int size)
> +{
> +	struct rockchip_efuse_platdata *plat = dev_get_platdata(dev);
> +	struct rockchip_efuse_regs *efuse =
> +		(struct rockchip_efuse_regs *)plat->base;
> +	unsigned int addr_start, addr_end, addr_offset, addr_len;
> +	u32 out_value, status;
> +	u8 *buffer;
> +	int ret = 0, i = 0;
> +
> +	rk1808_efuse_timing_init(plat->base);
> +
> +	addr_start = rounddown(offset, RK1808_NBYTES) / RK1808_NBYTES;
> +	addr_end = roundup(offset + size, RK1808_NBYTES) / RK1808_NBYTES;
> +	addr_offset = offset % RK1808_NBYTES;
> +	addr_len = addr_end - addr_start;
> +
> +	buffer = calloc(1, sizeof(*buffer) * addr_len * RK1808_NBYTES);
> +	if (!buffer)
> +		return -ENOMEM;
> +
> +	while (addr_len--) {
> +		writel(RK1808_AUTO_RD | RK1808_AUTO_ENB |
> +		       ((addr_start++ & RK1808_A_MASK) << RK1808_A_SHIFT),
> +		       &efuse->auto_ctrl);
> +		udelay(2);
> +		status = readl(&efuse->int_status);
> +		if (!(status & RK1808_INT_FINISH)) {
> +			ret = -EIO;
> +			goto err;
> +		}
> +		out_value = readl(&efuse->dout2);
> +		writel(RK1808_INT_FINISH, &efuse->int_status);
> +
> +		memcpy(&buffer[i], &out_value, RK1808_NBYTES);
> +		i += RK1808_NBYTES;
> +	}
> +	memcpy(buf, buffer + addr_offset, size);
> +err:
> +	free(buffer);
> +
> +	return ret;
> +}
> +
>   static int rockchip_rk3288_efuse_read(struct udevice *dev, int offset,
>   				      void *buf, int size)
>   {
> @@ -273,6 +383,10 @@ static int rockchip_efuse_ofdata_to_platdata(struct udevice *dev)
>   
>   static const struct udevice_id rockchip_efuse_ids[] = {
>   	{
> +		.compatible = "rockchip,rk1808-efuse",
> +		.data = (ulong)&rockchip_rk1808_efuse_read,
> +	},
> +	{
>   		.compatible = "rockchip,rk3066a-efuse",
>   		.data = (ulong)&rockchip_rk3288_efuse_read,
>   	},




More information about the U-Boot mailing list