diff --git a/drivers/gpu/nvgpu/common/acr/acr_blob_construct.c b/drivers/gpu/nvgpu/common/acr/acr_blob_construct.c index ee5955e2f..777ccd273 100644 --- a/drivers/gpu/nvgpu/common/acr/acr_blob_construct.c +++ b/drivers/gpu/nvgpu/common/acr/acr_blob_construct.c @@ -48,6 +48,7 @@ #if defined(CONFIG_NVGPU_DGPU) || defined(CONFIG_NVGPU_LS_PMU) #define UCODE_PARAMS (1) +#define UCODE_DESC_TOOL_VERSION 0x4U #else #define UCODE_PARAMS (0) #endif @@ -61,6 +62,7 @@ int nvgpu_acr_lsf_pmu_ucode_details(struct gk20a *g, void *lsf_ucode_img) struct nvgpu_firmware *fw_image; struct flcn_ucode_img *p_img = (struct flcn_ucode_img *)lsf_ucode_img; + struct ls_falcon_ucode_desc_v1 tmp_desc_v1; int err = 0; lsf_desc = nvgpu_kzalloc(g, sizeof(struct lsf_ucode_desc)); @@ -79,6 +81,20 @@ int nvgpu_acr_lsf_pmu_ucode_details(struct gk20a *g, void *lsf_ucode_img) lsf_desc->falcon_id = FALCON_ID_PMU; p_img->desc = (struct ls_falcon_ucode_desc *)(void *)fw_desc->data; + if (p_img->desc->tools_version >= UCODE_DESC_TOOL_VERSION) { + (void) memset((u8 *)&tmp_desc_v1, 0, + sizeof(struct ls_falcon_ucode_desc_v1)); + + nvgpu_memcpy((u8 *)&tmp_desc_v1, (u8 *)fw_desc->data, + sizeof(struct ls_falcon_ucode_desc_v1)); + + nvgpu_memcpy((u8 *)&p_img->desc->bootloader_start_offset, + (u8 *)&tmp_desc_v1.bootloader_start_offset, + sizeof(struct ls_falcon_ucode_desc) - + offsetof(struct ls_falcon_ucode_desc, + bootloader_start_offset)); + } + p_img->data = (u32 *)(void *)fw_image->data; p_img->data_size = p_img->desc->app_start_offset + p_img->desc->app_size; p_img->lsf_desc = (struct lsf_ucode_desc *)lsf_desc; diff --git a/drivers/gpu/nvgpu/common/acr/acr_blob_construct.h b/drivers/gpu/nvgpu/common/acr/acr_blob_construct.h index 92d879db8..1407a023b 100644 --- a/drivers/gpu/nvgpu/common/acr/acr_blob_construct.h +++ b/drivers/gpu/nvgpu/common/acr/acr_blob_construct.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -54,6 +54,32 @@ struct ls_falcon_ucode_desc { u32 compressed; }; +struct ls_falcon_ucode_desc_v1 { + u32 descriptor_size; + u32 image_size; + u32 tools_version; + u32 app_version; + char date[UCODE_NB_MAX_DATE_LENGTH]; + u32 secure_bootloader; + u32 bootloader_start_offset; + u32 bootloader_size; + u32 bootloader_imem_offset; + u32 bootloader_entry_point; + u32 app_start_offset; + u32 app_size; + u32 app_imem_offset; + u32 app_imem_entry; + u32 app_dmem_offset; + u32 app_resident_code_offset; + u32 app_resident_code_size; + u32 app_resident_data_offset; + u32 app_resident_data_size; + u32 nb_imem_overlays; + u32 nb_dmem_overlays; + struct {u32 start; u32 size; } load_ovl[64]; + u32 compressed; +}; + struct flcn_ucode_img { u32 *data; struct ls_falcon_ucode_desc *desc;