diff options
-rw-r--r-- | plat/qti/common/inc/qti_rng.h | 14 | ||||
-rw-r--r-- | plat/qti/common/src/qti_rng.c | 53 | ||||
-rw-r--r-- | plat/qti/common/src/qti_stack_protector.c | 12 | ||||
-rw-r--r-- | plat/qti/qtiseclib/inc/qtiseclib_interface.h | 1 | ||||
-rw-r--r-- | plat/qti/qtiseclib/src/qtiseclib_interface_stub.c | 11 | ||||
-rw-r--r-- | plat/qti/sc7180/inc/qti_rng_io.h | 15 | ||||
-rw-r--r-- | plat/qti/sc7180/platform.mk | 1 |
7 files changed, 90 insertions, 17 deletions
diff --git a/plat/qti/common/inc/qti_rng.h b/plat/qti/common/inc/qti_rng.h new file mode 100644 index 000000000..c933dea12 --- /dev/null +++ b/plat/qti/common/inc/qti_rng.h @@ -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 */ diff --git a/plat/qti/common/src/qti_rng.c b/plat/qti/common/src/qti_rng.c new file mode 100644 index 000000000..a904209be --- /dev/null +++ b/plat/qti/common/src/qti_rng.c @@ -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; +} diff --git a/plat/qti/common/src/qti_stack_protector.c b/plat/qti/common/src/qti_stack_protector.c index b2dbfb001..572830f9c 100644 --- a/plat/qti/common/src/qti_stack_protector.c +++ b/plat/qti/common/src/qti_stack_protector.c @@ -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; } diff --git a/plat/qti/qtiseclib/inc/qtiseclib_interface.h b/plat/qti/qtiseclib/inc/qtiseclib_interface.h index edabc5b69..357bb6a2d 100644 --- a/plat/qti/qtiseclib/inc/qtiseclib_interface.h +++ b/plat/qti/qtiseclib/inc/qtiseclib_interface.h @@ -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, diff --git a/plat/qti/qtiseclib/src/qtiseclib_interface_stub.c b/plat/qti/qtiseclib/src/qtiseclib_interface_stub.c index 494083b58..70485fe90 100644 --- a/plat/qti/qtiseclib/src/qtiseclib_interface_stub.c +++ b/plat/qti/qtiseclib/src/qtiseclib_interface_stub.c @@ -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, diff --git a/plat/qti/sc7180/inc/qti_rng_io.h b/plat/qti/sc7180/inc/qti_rng_io.h new file mode 100644 index 000000000..f50234f2b --- /dev/null +++ b/plat/qti/sc7180/inc/qti_rng_io.h @@ -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 */ + diff --git a/plat/qti/sc7180/platform.mk b/plat/qti/sc7180/platform.mk index 45e6b3347..e55135567 100644 --- a/plat/qti/sc7180/platform.mk +++ b/plat/qti/sc7180/platform.mk @@ -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 \ |