diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/common/vbios/bios.c | 55 |
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 | |||
71 | struct 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 | ||
69 | union memory_ptrs { | 78 | struct 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 | ||
83 | struct biosdata { | 84 | struct 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 | ||
323 | static void nvgpu_bios_parse_memory_ptrs(struct gk20a *g, int offset, u8 version) | 324 | static 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 | ||
338 | static void nvgpu_bios_parse_devinit_appinfo(struct gk20a *g, int dmem_offset) | 347 | static void nvgpu_bios_parse_devinit_appinfo(struct gk20a *g, int dmem_offset) |