3 int sun4i_ss_prng_seed(struct crypto_rng
*tfm
, const u8
*seed
,
6 struct sun4i_ss_alg_template
*algt
;
7 struct rng_alg
*alg
= crypto_rng_alg(tfm
);
9 algt
= container_of(alg
, struct sun4i_ss_alg_template
, alg
.rng
);
10 memcpy(algt
->ss
->seed
, seed
, slen
);
15 int sun4i_ss_prng_generate(struct crypto_rng
*tfm
, const u8
*src
,
16 unsigned int slen
, u8
*dst
, unsigned int dlen
)
18 struct sun4i_ss_alg_template
*algt
;
19 struct rng_alg
*alg
= crypto_rng_alg(tfm
);
22 u32
*data
= (u32
*)dst
;
23 const u32 mode
= SS_OP_PRNG
| SS_PRNG_CONTINUE
| SS_ENABLED
;
25 struct sun4i_ss_ctx
*ss
;
26 unsigned int todo
= (dlen
/ 4) * 4;
28 algt
= container_of(alg
, struct sun4i_ss_alg_template
, alg
.rng
);
31 spin_lock_bh(&ss
->slock
);
33 writel(mode
, ss
->base
+ SS_CTL
);
37 for (i
= 0; i
< SS_SEED_LEN
/ BITS_PER_LONG
; i
++)
38 writel(ss
->seed
[i
], ss
->base
+ SS_KEY0
+ i
* 4);
40 /* Read the random data */
41 len
= min_t(size_t, SS_DATA_LEN
/ BITS_PER_BYTE
, todo
);
42 readsl(ss
->base
+ SS_TXFIFO
, data
, len
/ 4);
47 for (i
= 0; i
< SS_SEED_LEN
/ BITS_PER_LONG
; i
++) {
48 v
= readl(ss
->base
+ SS_KEY0
+ i
* 4);
53 writel(0, ss
->base
+ SS_CTL
);
54 spin_unlock_bh(&ss
->slock
);