summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm206/bios_gm206.c
diff options
context:
space:
mode:
authorDavid Nieto <dmartineznie@nvidia.com>2016-09-19 14:28:08 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2016-10-20 01:10:17 -0400
commit2c3c567553a20e71b1dc0cba892772f33aacaa01 (patch)
tree4c553962b0c7508baa6983b96ee7737593a1156e /drivers/gpu/nvgpu/gm206/bios_gm206.c
parentf4b05d295fe821d2871ba22dde178674359fe563 (diff)
gpu: nvgpu: add support for devinit scripts exec
JIRA DNVGPU-117 Change-Id: I8c79e5b2fcad25588c950e786289443ed64fd48d Signed-off-by: David Nieto <dmartineznie@nvidia.com> Reviewed-on: http://git-master/r/1223221 (cherry-picked from commit f3185ad9f141ab32a224046185d0a409a8a513ff) Reviewed-on: http://git-master/r/1227254 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gm206/bios_gm206.c')
-rw-r--r--drivers/gpu/nvgpu/gm206/bios_gm206.c76
1 files changed, 76 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
74union 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
72struct biosdata { 88struct 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
312static 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
295static void gm206_bios_parse_devinit_appinfo(struct gk20a *g, int dmem_offset) 327static 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
600static u32 __gm206_bios_readbyte(struct gk20a *g, u32 offset)
601{
602 return (u32) g->bios.data[offset];
603}
604
605u8 gm206_bios_read_u8(struct gk20a *g, u32 offset)
606{
607 return (u8) __gm206_bios_readbyte(g, offset);
608}
609
610s8 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
619u16 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
629u32 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
565static void upload_code(struct gk20a *g, u32 dst, 641static 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{