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:
Saurabh Gorecha 2020-07-09 02:20:08 +05:30 committed by joanna.farley
parent acca14b6b2
commit 905f93c770
7 changed files with 90 additions and 17 deletions

View File

@ -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 */

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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,

View File

@ -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,

View File

@ -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 */

View File

@ -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 \