qti: Add RNG driver
This patch adds RNG driver and use it to generate random number for stack protection. Change-Id: I73d79e68d08b5aa902dc7fad48e17a03f996178d Signed-off-by: Saurabh Gorecha <sgorecha@codeaurora.org>
This commit is contained in:
parent
acca14b6b2
commit
905f93c770
|
@ -0,0 +1,14 @@
|
|||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef QTI_RNG_H
|
||||
#define QTI_RNG_H
|
||||
|
||||
#include <stdinit.h>
|
||||
|
||||
int qti_rng_get_data(uint8_t *out, uint32_t out_len);
|
||||
|
||||
#endif /* QTI_RNG_H */
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <lib/mmio.h>
|
||||
|
||||
#include <qti_rng_io.h>
|
||||
|
||||
int qti_rng_get_data(uint8_t *out, uint32_t out_len)
|
||||
{
|
||||
uint32_t tmp_rndm = 0;
|
||||
uint32_t bytes_left = out_len;
|
||||
int i = 0;
|
||||
|
||||
if (NULL == out || 0 == out_len) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* RNG HW initialized at previous boot image.
|
||||
* RNG clocks are expected to be ON.
|
||||
*/
|
||||
|
||||
do {
|
||||
/* There is no data to read */
|
||||
if ((mmio_read_32(SEC_PRNG_STATUS) &
|
||||
SEC_PRNG_STATUS_DATA_AVAIL_BMSK) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
while ((tmp_rndm = mmio_read_32(SEC_PRNG_DATA_OUT)) == 0) {
|
||||
;
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
*out = (uint8_t) (tmp_rndm >> (8 * i));
|
||||
|
||||
out++;
|
||||
bytes_left--;
|
||||
|
||||
if (bytes_left == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} while (bytes_left != 0);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
@ -9,16 +9,18 @@
|
|||
|
||||
#include <platform.h>
|
||||
#include <platform_def.h>
|
||||
#include <qti_rng.h>
|
||||
#include <qtiseclib_interface.h>
|
||||
|
||||
u_register_t plat_get_stack_protector_canary(void)
|
||||
{
|
||||
u_register_t random = 0x0;
|
||||
|
||||
/* get random data , the below API doesn't return random = 0 in success
|
||||
* case */
|
||||
qtiseclib_prng_get_data((uint8_t *) &random, sizeof(random));
|
||||
assert(0x0 != random);
|
||||
/*
|
||||
* get random data , the below API doesn't return random = 0 on success
|
||||
*/
|
||||
qti_rng_get_data((uint8_t *) &random, sizeof(random));
|
||||
assert(random != 0x0);
|
||||
|
||||
return random;
|
||||
}
|
||||
|
|
|
@ -63,7 +63,6 @@ void qtiseclib_kryo4_silver_reset_asm(void);
|
|||
void qtiseclib_bl31_platform_setup(void);
|
||||
void qtiseclib_invoke_isr(uint32_t irq, void *handle);
|
||||
void qtiseclib_panic(void);
|
||||
int qtiseclib_prng_get_data(uint8_t *out, uint32_t out_len);
|
||||
|
||||
int qtiseclib_mem_assign(const memprot_info_t *mem_info,
|
||||
uint32_t mem_info_list_cnt,
|
||||
|
|
|
@ -67,17 +67,6 @@ void qtiseclib_panic(void)
|
|||
{
|
||||
}
|
||||
|
||||
int qtiseclib_prng_get_data(uint8_t *out, uint32_t out_len)
|
||||
{
|
||||
/* fill dummy data to avoid assert and print
|
||||
* stub implementation in setup call
|
||||
*/
|
||||
for (int i = 0; i < out_len; i++) {
|
||||
out[i] = 0x11;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
qtiseclib_mem_assign(const memprot_info_t *mem_info,
|
||||
uint32_t mem_info_list_cnt,
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
#ifndef QTI_RNG_IO_H
|
||||
#define QTI_RNG_IO_H
|
||||
|
||||
#define SEC_PRNG_STATUS 0x00791004
|
||||
#define SEC_PRNG_STATUS_DATA_AVAIL_BMSK 0x1
|
||||
#define SEC_PRNG_DATA_OUT 0x00791000
|
||||
|
||||
|
||||
#endif /* QTI_RNG_IO_H */
|
||||
|
|
@ -59,6 +59,7 @@ QTI_BL31_SOURCES := $(QTI_PLAT_PATH)/common/src/$(ARCH)/qti_helpers.S \
|
|||
$(QTI_PLAT_PATH)/common/src/qti_syscall.c \
|
||||
$(QTI_PLAT_PATH)/common/src/qti_topology.c \
|
||||
$(QTI_PLAT_PATH)/common/src/qti_pm.c \
|
||||
$(QTI_PLAT_PATH)/common/src/qti_rng.c \
|
||||
$(QTI_PLAT_PATH)/qtiseclib/src/qtiseclib_cb_interface.c \
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue