From cde8c5fc3e934fc23c1a56b0dee388bccdc60b2a Mon Sep 17 00:00:00 2001 From: Sagar Kamble Date: Mon, 7 Jan 2019 12:53:07 +0530 Subject: [PATCH] gpu: nvgpu: unit: falcon bootstrap test Add unit test for functions nvgpu_falcon_bootstrap and nvgpu_falcon_bl_bootstrap. JIRA NVGPU-898 Change-Id: I32267d994c8f3afc188234227dd56c38a28c5898 Signed-off-by: Sagar Kamble Reviewed-on: https://git-master.nvidia.com/r/2160243 GVS: Gerrit_Virtual_Submit Reviewed-by: Vaibhav Kachore Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/libnvgpu-drv_safe.export | 2 + userspace/units/falcon/falcon/falcon.c | 115 +++++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/drivers/gpu/nvgpu/libnvgpu-drv_safe.export b/drivers/gpu/nvgpu/libnvgpu-drv_safe.export index e66965c8d..05b9a0752 100644 --- a/drivers/gpu/nvgpu/libnvgpu-drv_safe.export +++ b/drivers/gpu/nvgpu/libnvgpu-drv_safe.export @@ -78,6 +78,8 @@ nvgpu_dma_alloc_map_sys nvgpu_dma_alloc_sys nvgpu_dma_free nvgpu_dma_unmap_free +nvgpu_falcon_bl_bootstrap +nvgpu_falcon_bootstrap nvgpu_falcon_copy_to_dmem nvgpu_falcon_copy_to_imem nvgpu_falcon_get_instance diff --git a/userspace/units/falcon/falcon/falcon.c b/userspace/units/falcon/falcon/falcon.c index d8fdf96a2..ca45f5bd0 100644 --- a/userspace/units/falcon/falcon/falcon.c +++ b/userspace/units/falcon/falcon/falcon.c @@ -788,6 +788,120 @@ static int test_falcon_mailbox(struct unit_module *m, struct gk20a *g, return UNIT_SUCCESS; } +static bool falcon_check_reg_group(struct gk20a *g, + struct nvgpu_reg_access *sequence, + u32 size) +{ + u32 i; + + for (i = 0; i < size; i++) { + if (nvgpu_posix_io_readl_reg_space(g, sequence->addr) != + sequence->value) { + break; + } + } + + return i == size; +} + +/* + * Invalid: Calling these interfaces on uninitialized falcon should return + * -EINVAL. + * Invalid: Invoke nvgpu_falcon_bl_bootstrap with invalid parameters filled in + * nvgpu_falcon_bl_info struct and verify that nvgpu_falcon_bootstrap + * fails. + * + * Valid: Invoke nvgpu_falcon_bootstrap with boot_vector value and verify the + * expected state of Falcon registers - falcon_falcon_dmactl_r, + * falcon_falcon_bootvec_r, falcon_falcon_cpuctl_r + * Valid: Invoke nvgpu_falcon_bl_bootstrap with sample parameters filled in + * nvgpu_falcon_bl_info struct and verify IMEM, DMEM and registers + * related to nvgpu_falcon_bootstrap interface. + */ +static int test_falcon_bootstrap(struct unit_module *m, struct gk20a *g, + void *__args) +{ +#define BL_DESC_SIZE 64 + struct nvgpu_falcon_bl_info bl_info; + u32 boot_vector = 0xF000; + /* Define a group of expected register writes */ + struct nvgpu_reg_access bootstrap_group[] = { + { .addr = 0x0010a10c, + .value = falcon_falcon_dmactl_require_ctx_f(0) }, + { .addr = 0x0010a104, + .value = falcon_falcon_bootvec_vec_f(boot_vector) }, + { .addr = 0x0010a100, + .value = falcon_falcon_cpuctl_startcpu_f(1) }, + }; + u32 i; + int err; + + err = nvgpu_falcon_bootstrap(uninit_flcn, boot_vector); + if (err != -EINVAL) { + unit_return_fail(m, "Invalid falcon bootstrap should " + "fail\n"); + } + + err = nvgpu_falcon_bl_bootstrap(uninit_flcn, &bl_info); + if (err != -EINVAL) { + unit_return_fail(m, "Invalid falcon bl_bootstrap " + "should fail\n"); + } + + err = nvgpu_falcon_bootstrap(pmu_flcn, boot_vector); + if (err) { + unit_return_fail(m, "PMU falcon bootstrap failed\n"); + } + + if (falcon_check_reg_group(g, bootstrap_group, + ARRAY_SIZE(bootstrap_group)) == false) { + unit_return_fail(m, "Failed checking bootstrap sequence\n"); + } + + bl_info.bl_desc = (u8 *) malloc(BL_DESC_SIZE); + if (!bl_info.bl_desc) { + unit_return_fail(m, "Failed creating BL info\n"); + } + + for (i = 0; i < BL_DESC_SIZE; i++) { + bl_info.bl_desc[i] = (u8)(rand() & 0xff); + } + + bl_info.bl_desc_size = BL_DESC_SIZE; + bl_info.bl_src = (void *)rand_test_data; + bl_info.bl_size = RAND_DATA_SIZE; + bl_info.bl_start_tag = 0x0; + + err = nvgpu_falcon_bl_bootstrap(pmu_flcn, &bl_info); + if (err) { + unit_return_fail(m, "PMU falcon bl bootstrap failed\n"); + } + + if (falcon_check_reg_group(g, bootstrap_group, + ARRAY_SIZE(bootstrap_group)) == false) { + unit_return_fail(m, "Failed checking bootstrap sequence\n"); + } + + /* Set the bootloader source size to greater than imem size */ + bl_info.bl_size = UTF_FALCON_IMEM_DMEM_SIZE + 1; + err = nvgpu_falcon_bl_bootstrap(pmu_flcn, &bl_info); + if (!err) { + unit_return_fail(m, "PMU falcon bl bootstrap passed with " + "invalid bl_info\n"); + } + + /* Set the bootloader desc size to greater than dmem size */ + bl_info.bl_size = RAND_DATA_SIZE; + bl_info.bl_desc_size = UTF_FALCON_IMEM_DMEM_SIZE + 1; + err = nvgpu_falcon_bl_bootstrap(pmu_flcn, &bl_info); + if (!err) { + unit_return_fail(m, "PMU falcon bl bootstrap passed with " + "invalid bl_info\n"); + } + + return UNIT_SUCCESS; +} + struct unit_module_test falcon_tests[] = { UNIT_TEST(falcon_sw_init_free, test_falcon_sw_init_free, NULL, 0), UNIT_TEST(falcon_reset, test_falcon_reset, NULL, 0), @@ -799,6 +913,7 @@ struct unit_module_test falcon_tests[] = { UNIT_TEST(falcon_mem_rw_aligned, test_falcon_mem_rw_aligned, NULL, 0), UNIT_TEST(falcon_mem_rw_zero, test_falcon_mem_rw_zero, NULL, 0), UNIT_TEST(falcon_mailbox, test_falcon_mailbox, NULL, 0), + UNIT_TEST(falcon_bootstrap, test_falcon_bootstrap, NULL, 0), /* Cleanup */ UNIT_TEST(falcon_free_test_env, free_falcon_test_env, NULL, 0),