summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/vbios
diff options
context:
space:
mode:
authorVijayakumar <vsubbu@nvidia.com>2017-03-23 05:17:24 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2017-03-24 15:44:34 -0400
commitb48186488d0108dee7b3fb755b2d99f4652780df (patch)
tree545e2d44494b43bf0c47dbd7b58e85d1bd812ec0 /drivers/gpu/nvgpu/common/vbios
parent81660ab58ce695b79c94e145745512516c592afe (diff)
gpu: nvgpu: fix vbios mem table parsing
bios tables are packed data structures. keeping packed structrues inside union and assigning values from it does not work. bug 200287822 Change-Id: I1df9541495b96786412533570c51d779bfd0f43f Signed-off-by: Vijayakumar <vsubbu@nvidia.com> Reviewed-on: http://git-master/r/1326798 Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Thomas Fleury <tfleury@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common/vbios')
-rw-r--r--drivers/gpu/nvgpu/common/vbios/bios.c55
1 files changed, 32 insertions, 23 deletions
diff --git a/drivers/gpu/nvgpu/common/vbios/bios.c b/drivers/gpu/nvgpu/common/vbios/bios.c
index c31f9a29..b640a761 100644
--- a/drivers/gpu/nvgpu/common/vbios/bios.c
+++ b/drivers/gpu/nvgpu/common/vbios/bios.c
@@ -65,20 +65,21 @@ struct bit {
65#define TOKEN_ID_VIRT_PTRS 0x56 65#define TOKEN_ID_VIRT_PTRS 0x56
66#define TOKEN_ID_MEMORY_PTRS 0x4D 66#define TOKEN_ID_MEMORY_PTRS 0x4D
67 67
68#define MEMORY_PTRS_V1 1
69#define MEMORY_PTRS_V2 2
70
71struct memory_ptrs_v1 {
72 u8 rsvd0[2];
73 u8 mem_strap_data_count;
74 u16 mem_strap_xlat_tbl_ptr;
75 u8 rsvd1[8];
76} __packed;
68 77
69union memory_ptrs { 78struct memory_ptrs_v2 {
70 struct { 79 u8 mem_strap_data_count;
71 u8 rsvd0[2]; 80 u16 mem_strap_xlat_tbl_ptr;
72 u8 mem_strap_data_count; 81 u8 rsvd[14];
73 u16 mem_strap_xlat_tbl_ptr; 82} __packed;
74 u8 rsvd1[8];
75 } v1 __packed;
76 struct {
77 u8 mem_strap_data_count;
78 u16 mem_strap_xlat_tbl_ptr;
79 u8 rsvd[14];
80 } v2 __packed;
81};
82 83
83struct biosdata { 84struct biosdata {
84 u32 version; 85 u32 version;
@@ -322,17 +323,25 @@ static void nvgpu_bios_parse_nvinit_ptrs(struct gk20a *g, int offset)
322 323
323static void nvgpu_bios_parse_memory_ptrs(struct gk20a *g, int offset, u8 version) 324static void nvgpu_bios_parse_memory_ptrs(struct gk20a *g, int offset, u8 version)
324{ 325{
325 union memory_ptrs memory_ptrs; 326 struct memory_ptrs_v1 v1;
326 327 struct memory_ptrs_v2 v2;
327 if ((version < 1) || (version > 2)) 328
329 switch (version) {
330 case MEMORY_PTRS_V1:
331 memcpy(&v1, &g->bios.data[offset], sizeof(v1));
332 g->bios.mem_strap_data_count = v1.mem_strap_data_count;
333 g->bios.mem_strap_xlat_tbl_ptr = v1.mem_strap_xlat_tbl_ptr;
328 return; 334 return;
329 335 case MEMORY_PTRS_V2:
330 memcpy(&memory_ptrs, &g->bios.data[offset], sizeof(memory_ptrs)); 336 memcpy(&v2, &g->bios.data[offset], sizeof(v2));
331 337 g->bios.mem_strap_data_count = v2.mem_strap_data_count;
332 g->bios.mem_strap_data_count = (version > 1) ? memory_ptrs.v2.mem_strap_data_count : 338 g->bios.mem_strap_xlat_tbl_ptr = v2.mem_strap_xlat_tbl_ptr;
333 memory_ptrs.v1.mem_strap_data_count; 339 return;
334 g->bios.mem_strap_xlat_tbl_ptr = (version > 1) ? memory_ptrs.v2.mem_strap_xlat_tbl_ptr : 340 default:
335 memory_ptrs.v1.mem_strap_xlat_tbl_ptr; 341 gk20a_err(dev_from_gk20a(g),
342 "unknown vbios memory table version %x", version);
343 return;
344 }
336} 345}
337 346
338static void nvgpu_bios_parse_devinit_appinfo(struct gk20a *g, int dmem_offset) 347static void nvgpu_bios_parse_devinit_appinfo(struct gk20a *g, int dmem_offset)