[PATCH v2 25/30] rng: rockchip: Add support for rkrng variant
Kever Yang
kever.yang at rock-chips.com
Tue Apr 8 05:24:14 CEST 2025
On 2025/4/8 06:46, Jonas Karlman wrote:
> From: Lin Jinhan <troy.lin at rock-chips.com>
>
> Add support for rkrng variant, used by e.g. RK3528 and RK3576.
>
> Imported from vendor U-Boot linux-6.1-stan-rkr5 tag with minor
> adjustments for mainline.
>
> Signed-off-by: Lin Jinhan <troy.lin at rock-chips.com>
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
> ---
> v2: Rebase on "rockchip: Update rng compatible for RK356x and RK3588"
> ---
> drivers/rng/rockchip_rng.c | 73 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 73 insertions(+)
>
> diff --git a/drivers/rng/rockchip_rng.c b/drivers/rng/rockchip_rng.c
> index 6e4e3abf08c8..d854ea900442 100644
> --- a/drivers/rng/rockchip_rng.c
> +++ b/drivers/rng/rockchip_rng.c
> @@ -70,6 +70,27 @@
> #define TRNG_v1_VERSION_CODE 0x46BC
> /* end of TRNG V1 register define */
>
> +/* start of RKRNG register define */
> +#define RKRNG_CTRL 0x0010
> +#define RKRNG_CTRL_INST_REQ BIT(0)
> +#define RKRNG_CTRL_RESEED_REQ BIT(1)
> +#define RKRNG_CTRL_TEST_REQ BIT(2)
> +#define RKRNG_CTRL_SW_DRNG_REQ BIT(3)
> +#define RKRNG_CTRL_SW_TRNG_REQ BIT(4)
> +
> +#define RKRNG_STATE 0x0014
> +#define RKRNG_STATE_INST_ACK BIT(0)
> +#define RKRNG_STATE_RESEED_ACK BIT(1)
> +#define RKRNG_STATE_TEST_ACK BIT(2)
> +#define RKRNG_STATE_SW_DRNG_ACK BIT(3)
> +#define RKRNG_STATE_SW_TRNG_ACK BIT(4)
> +
> +/* DRNG_DATA_0 ~ DNG_DATA_7 */
> +#define RKRNG_DRNG_DATA_0 0x0070
> +#define RKRNG_DRNG_DATA_7 0x008C
> +
> +/* end of RKRNG register define */
> +
> #define RK_RNG_TIME_OUT 50000 /* max 50ms */
>
> #define trng_write(pdata, pos, val) writel(val, (pdata)->base + (pos))
> @@ -228,6 +249,49 @@ exit:
> return retval;
> }
>
> +static int rkrng_init(struct udevice *dev)
> +{
> + struct rk_rng_plat *pdata = dev_get_priv(dev);
> + u32 reg = 0;
> +
> + rk_clrreg(pdata->base + RKRNG_CTRL, 0xffff);
> +
> + reg = trng_read(pdata, RKRNG_STATE);
> + trng_write(pdata, RKRNG_STATE, reg);
> +
> + return 0;
> +}
> +
> +static int rkrng_rng_read(struct udevice *dev, void *data, size_t len)
> +{
> + struct rk_rng_plat *pdata = dev_get_priv(dev);
> + u32 reg = 0;
> + int retval;
> +
> + if (len > RK_HW_RNG_MAX)
> + return -EINVAL;
> +
> + reg = RKRNG_CTRL_SW_DRNG_REQ;
> +
> + rk_clrsetreg(pdata->base + RKRNG_CTRL, 0xffff, reg);
> +
> + retval = readl_poll_timeout(pdata->base + RKRNG_STATE, reg,
> + (reg & RKRNG_STATE_SW_DRNG_ACK),
> + RK_RNG_TIME_OUT);
> + if (retval)
> + goto exit;
> +
> + trng_write(pdata, RKRNG_STATE, reg);
> +
> + rk_rng_read_regs(pdata->base + RKRNG_DRNG_DATA_0, data, len);
> +
> +exit:
> + /* close TRNG */
> + rk_clrreg(pdata->base + RKRNG_CTRL, 0xffff);
> +
> + return retval;
> +}
> +
> static int rockchip_rng_read(struct udevice *dev, void *data, size_t len)
> {
> unsigned char *buf = data;
> @@ -295,6 +359,11 @@ static const struct rk_rng_soc_data rk_trngv1_soc_data = {
> .rk_rng_read = rk_trngv1_rng_read,
> };
>
> +static const struct rk_rng_soc_data rkrng_soc_data = {
> + .rk_rng_init = rkrng_init,
> + .rk_rng_read = rkrng_rng_read,
> +};
> +
> static const struct dm_rng_ops rockchip_rng_ops = {
> .read = rockchip_rng_read,
> };
> @@ -324,6 +393,10 @@ static const struct udevice_id rockchip_rng_match[] = {
> .compatible = "rockchip,rk3588-rng",
> .data = (ulong)&rk_trngv1_soc_data,
> },
> + {
> + .compatible = "rockchip,rkrng",
> + .data = (ulong)&rkrng_soc_data,
> + },
> {},
> };
>
More information about the U-Boot
mailing list