diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gm206')
-rw-r--r-- | drivers/gpu/nvgpu/gm206/bios_gm206.c | 76 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gm206/bios_gm206.h | 5 |
2 files changed, 81 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gm206/bios_gm206.c b/drivers/gpu/nvgpu/gm206/bios_gm206.c index 8693912e..ea65e392 100644 --- a/drivers/gpu/nvgpu/gm206/bios_gm206.c +++ b/drivers/gpu/nvgpu/gm206/bios_gm206.c | |||
@@ -68,6 +68,22 @@ struct bit { | |||
68 | #define TOKEN_ID_PERF_PTRS 0x50 | 68 | #define TOKEN_ID_PERF_PTRS 0x50 |
69 | #define TOKEN_ID_CLOCK_PTRS 0x43 | 69 | #define TOKEN_ID_CLOCK_PTRS 0x43 |
70 | #define TOKEN_ID_VIRT_PTRS 0x56 | 70 | #define TOKEN_ID_VIRT_PTRS 0x56 |
71 | #define TOKEN_ID_MEMORY_PTRS 0x4D | ||
72 | |||
73 | |||
74 | union memory_ptrs { | ||
75 | struct { | ||
76 | u8 rsvd0[2]; | ||
77 | u8 mem_strap_data_count; | ||
78 | u16 mem_strap_xlat_tbl_ptr; | ||
79 | u8 rsvd1[8]; | ||
80 | } v1 __packed; | ||
81 | struct { | ||
82 | u8 mem_strap_data_count; | ||
83 | u16 mem_strap_xlat_tbl_ptr; | ||
84 | u8 rsvd[14]; | ||
85 | } v2 __packed; | ||
86 | }; | ||
71 | 87 | ||
72 | struct biosdata { | 88 | struct biosdata { |
73 | u32 version; | 89 | u32 version; |
@@ -290,6 +306,22 @@ static void gm206_bios_parse_nvinit_ptrs(struct gk20a *g, int offset) | |||
290 | g->bios.devinit_tables_size = nvinit_ptrs.devinit_tables_size; | 306 | g->bios.devinit_tables_size = nvinit_ptrs.devinit_tables_size; |
291 | g->bios.bootscripts = &g->bios.data[nvinit_ptrs.bootscripts_ptr]; | 307 | g->bios.bootscripts = &g->bios.data[nvinit_ptrs.bootscripts_ptr]; |
292 | g->bios.bootscripts_size = nvinit_ptrs.bootscripts_size; | 308 | g->bios.bootscripts_size = nvinit_ptrs.bootscripts_size; |
309 | g->bios.condition_table_ptr = nvinit_ptrs.condition_table_ptr; | ||
310 | } | ||
311 | |||
312 | static void gm206_bios_parse_memory_ptrs(struct gk20a *g, int offset, u8 version) | ||
313 | { | ||
314 | union memory_ptrs memory_ptrs; | ||
315 | |||
316 | if ((version < 1) || (version > 2)) | ||
317 | return; | ||
318 | |||
319 | memcpy(&memory_ptrs, &g->bios.data[offset], sizeof(memory_ptrs)); | ||
320 | |||
321 | g->bios.mem_strap_data_count = (version > 1) ? memory_ptrs.v2.mem_strap_data_count : | ||
322 | memory_ptrs.v1.mem_strap_data_count; | ||
323 | g->bios.mem_strap_xlat_tbl_ptr = (version > 1) ? memory_ptrs.v2.mem_strap_xlat_tbl_ptr : | ||
324 | memory_ptrs.v1.mem_strap_xlat_tbl_ptr; | ||
293 | } | 325 | } |
294 | 326 | ||
295 | static void gm206_bios_parse_devinit_appinfo(struct gk20a *g, int dmem_offset) | 327 | static void gm206_bios_parse_devinit_appinfo(struct gk20a *g, int dmem_offset) |
@@ -553,6 +585,9 @@ static void gm206_bios_parse_bit(struct gk20a *g, int offset) | |||
553 | g->bios.virt_token = | 585 | g->bios.virt_token = |
554 | (struct bit_token *)&g->bios.data[offset]; | 586 | (struct bit_token *)&g->bios.data[offset]; |
555 | break; | 587 | break; |
588 | case TOKEN_ID_MEMORY_PTRS: | ||
589 | gm206_bios_parse_memory_ptrs(g, bit_token.data_ptr, | ||
590 | bit_token.data_version); | ||
556 | default: | 591 | default: |
557 | break; | 592 | break; |
558 | } | 593 | } |
@@ -562,6 +597,47 @@ static void gm206_bios_parse_bit(struct gk20a *g, int offset) | |||
562 | gk20a_dbg_fn("done"); | 597 | gk20a_dbg_fn("done"); |
563 | } | 598 | } |
564 | 599 | ||
600 | static u32 __gm206_bios_readbyte(struct gk20a *g, u32 offset) | ||
601 | { | ||
602 | return (u32) g->bios.data[offset]; | ||
603 | } | ||
604 | |||
605 | u8 gm206_bios_read_u8(struct gk20a *g, u32 offset) | ||
606 | { | ||
607 | return (u8) __gm206_bios_readbyte(g, offset); | ||
608 | } | ||
609 | |||
610 | s8 gm206_bios_read_s8(struct gk20a *g, u32 offset) | ||
611 | { | ||
612 | u32 val; | ||
613 | val = __gm206_bios_readbyte(g, offset); | ||
614 | val = val & 0x80 ? (val | ~0xff) : val; | ||
615 | |||
616 | return (s8) val; | ||
617 | } | ||
618 | |||
619 | u16 gm206_bios_read_u16(struct gk20a *g, u32 offset) | ||
620 | { | ||
621 | u16 val; | ||
622 | |||
623 | val = __gm206_bios_readbyte(g, offset) | | ||
624 | (__gm206_bios_readbyte(g, offset+1) << 8); | ||
625 | |||
626 | return val; | ||
627 | } | ||
628 | |||
629 | u32 gm206_bios_read_u32(struct gk20a *g, u32 offset) | ||
630 | { | ||
631 | u32 val; | ||
632 | |||
633 | val = __gm206_bios_readbyte(g, offset) | | ||
634 | (__gm206_bios_readbyte(g, offset+1) << 8) | | ||
635 | (__gm206_bios_readbyte(g, offset+2) << 16) | | ||
636 | (__gm206_bios_readbyte(g, offset+3) << 24); | ||
637 | |||
638 | return val; | ||
639 | } | ||
640 | |||
565 | static void upload_code(struct gk20a *g, u32 dst, | 641 | static void upload_code(struct gk20a *g, u32 dst, |
566 | u8 *src, u32 size, u8 port, bool sec) | 642 | u8 *src, u32 size, u8 port, bool sec) |
567 | { | 643 | { |
diff --git a/drivers/gpu/nvgpu/gm206/bios_gm206.h b/drivers/gpu/nvgpu/gm206/bios_gm206.h index 1ee4e14c..937ba0c5 100644 --- a/drivers/gpu/nvgpu/gm206/bios_gm206.h +++ b/drivers/gpu/nvgpu/gm206/bios_gm206.h | |||
@@ -55,4 +55,9 @@ struct bit_token { | |||
55 | struct gpu_ops; | 55 | struct gpu_ops; |
56 | 56 | ||
57 | void gm206_init_bios(struct gpu_ops *gops); | 57 | void gm206_init_bios(struct gpu_ops *gops); |
58 | u8 gm206_bios_read_u8(struct gk20a *g, u32 offset); | ||
59 | s8 gm206_bios_read_s8(struct gk20a *g, u32 offset); | ||
60 | u16 gm206_bios_read_u16(struct gk20a *g, u32 offset); | ||
61 | u32 gm206_bios_read_u32(struct gk20a *g, u32 offset); | ||
62 | |||
58 | #endif | 63 | #endif |