Commit 753d6770 authored by Vladis Dronov's avatar Vladis Dronov Committed by Herbert Xu

hwrng: cn10k - Optimize cn10k_rng_read()

This function assumes that sizeof(void) is 1 and arithmetic works for
void pointers. This is a GNU C extention and may not work with other
compilers. Change this by using an u8 pointer.

Also move cn10k_read_trng() out of a loop thus saving some cycles.

Fixes: 38e9791a ("hwrng: cn10k - Add random number generator support")
Signed-off-by: default avatarVladis Dronov <vdronov@redhat.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 5a6477ea
...@@ -90,6 +90,7 @@ static int cn10k_rng_read(struct hwrng *hwrng, void *data, ...@@ -90,6 +90,7 @@ static int cn10k_rng_read(struct hwrng *hwrng, void *data,
{ {
struct cn10k_rng *rng = (struct cn10k_rng *)hwrng->priv; struct cn10k_rng *rng = (struct cn10k_rng *)hwrng->priv;
unsigned int size; unsigned int size;
u8 *pos = data;
int err = 0; int err = 0;
u64 value; u64 value;
...@@ -102,17 +103,20 @@ static int cn10k_rng_read(struct hwrng *hwrng, void *data, ...@@ -102,17 +103,20 @@ static int cn10k_rng_read(struct hwrng *hwrng, void *data,
while (size >= 8) { while (size >= 8) {
cn10k_read_trng(rng, &value); cn10k_read_trng(rng, &value);
*((u64 *)data) = (u64)value; *((u64 *)pos) = value;
size -= 8; size -= 8;
data += 8; pos += 8;
} }
while (size > 0) { if (size > 0) {
cn10k_read_trng(rng, &value); cn10k_read_trng(rng, &value);
*((u8 *)data) = (u8)value; while (size > 0) {
size--; *pos = (u8)value;
data++; value >>= 8;
size--;
pos++;
}
} }
return max - size; return max - size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment