diff options
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 5 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gm206/bios_gm206.c | 55 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gm206/bios_gm206.h | 21 |
3 files changed, 74 insertions, 7 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 1ca8ff77..62269f21 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h | |||
@@ -53,6 +53,7 @@ struct acr_desc; | |||
53 | #include "cde_gk20a.h" | 53 | #include "cde_gk20a.h" |
54 | #include "debug_gk20a.h" | 54 | #include "debug_gk20a.h" |
55 | #include "sched_gk20a.h" | 55 | #include "sched_gk20a.h" |
56 | #include "gm206/bios_gm206.h" | ||
56 | 57 | ||
57 | /* PTIMER_REF_FREQ_HZ corresponds to a period of 32 nanoseconds. | 58 | /* PTIMER_REF_FREQ_HZ corresponds to a period of 32 nanoseconds. |
58 | 32 ns is the resolution of ptimer. */ | 59 | 32 ns is the resolution of ptimer. */ |
@@ -656,6 +657,8 @@ struct gpu_ops { | |||
656 | 657 | ||
657 | struct { | 658 | struct { |
658 | int (*init)(struct gk20a *g); | 659 | int (*init)(struct gk20a *g); |
660 | void *(*get_perf_table_ptrs)(struct gk20a *g, | ||
661 | struct bit_token *ptoken, u8 table_id); | ||
659 | } bios; | 662 | } bios; |
660 | #if defined(CONFIG_GK20A_CYCLE_STATS) | 663 | #if defined(CONFIG_GK20A_CYCLE_STATS) |
661 | struct { | 664 | struct { |
@@ -704,6 +707,8 @@ struct nvgpu_bios { | |||
704 | u32 devinit_tables_phys_base; | 707 | u32 devinit_tables_phys_base; |
705 | u32 devinit_script_phys_base; | 708 | u32 devinit_script_phys_base; |
706 | 709 | ||
710 | struct bit_token *perf_token; | ||
711 | struct bit_token *clock_token; | ||
707 | u32 expansion_rom_offset; | 712 | u32 expansion_rom_offset; |
708 | }; | 713 | }; |
709 | 714 | ||
diff --git a/drivers/gpu/nvgpu/gm206/bios_gm206.c b/drivers/gpu/nvgpu/gm206/bios_gm206.c index 212fae62..7159ef83 100644 --- a/drivers/gpu/nvgpu/gm206/bios_gm206.c +++ b/drivers/gpu/nvgpu/gm206/bios_gm206.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include "hw_mc_gm206.h" | 21 | #include "hw_mc_gm206.h" |
22 | #include "hw_xve_gm206.h" | 22 | #include "hw_xve_gm206.h" |
23 | #include "hw_top_gm206.h" | 23 | #include "hw_top_gm206.h" |
24 | #include "bios_gm206.h" | ||
24 | 25 | ||
25 | #define BIT_HEADER_ID 0xb8ff | 26 | #define BIT_HEADER_ID 0xb8ff |
26 | #define BIT_HEADER_SIGNATURE 0x00544942 | 27 | #define BIT_HEADER_SIGNATURE 0x00544942 |
@@ -54,15 +55,10 @@ struct bit { | |||
54 | u8 header_checksum; | 55 | u8 header_checksum; |
55 | } __packed; | 56 | } __packed; |
56 | 57 | ||
57 | struct bit_token { | ||
58 | u8 token_id; | ||
59 | u8 data_version; | ||
60 | u16 data_size; | ||
61 | u16 data_ptr; | ||
62 | } __packed; | ||
63 | |||
64 | #define TOKEN_ID_NVINIT_PTRS 0x49 | 58 | #define TOKEN_ID_NVINIT_PTRS 0x49 |
65 | #define TOKEN_ID_FALCON_DATA 0x70 | 59 | #define TOKEN_ID_FALCON_DATA 0x70 |
60 | #define TOKEN_ID_PERF_PTRS 0x50 | ||
61 | #define TOKEN_ID_CLOCK_PTRS 0x43 | ||
66 | 62 | ||
67 | struct nvinit_ptrs { | 63 | struct nvinit_ptrs { |
68 | u16 initscript_table_ptr; | 64 | u16 initscript_table_ptr; |
@@ -423,6 +419,42 @@ static void gm206_bios_parse_falcon_data_v2(struct gk20a *g, int offset) | |||
423 | "could not parse falcon ucode table"); | 419 | "could not parse falcon ucode table"); |
424 | } | 420 | } |
425 | 421 | ||
422 | static void *gm206_bios_get_perf_table_ptrs(struct gk20a *g, | ||
423 | struct bit_token *ptoken, u8 table_id) | ||
424 | { | ||
425 | u32 perf_table_id_offset = 0; | ||
426 | u8 *perf_table_ptr = NULL; | ||
427 | |||
428 | if (ptoken != NULL && | ||
429 | table_id < (ptoken->data_size/sizeof(u32))) { | ||
430 | |||
431 | perf_table_id_offset = *((u32 *)&g->bios.data[ | ||
432 | ptoken->data_ptr + | ||
433 | (table_id * PERF_PTRS_WIDTH)]); | ||
434 | |||
435 | gk20a_dbg_info("Perf_Tbl_ID-offset 0x%x Tbl_ID_Ptr-offset- 0x%x", | ||
436 | (ptoken->data_ptr + | ||
437 | (table_id * PERF_PTRS_WIDTH)), | ||
438 | perf_table_id_offset); | ||
439 | |||
440 | if (perf_table_id_offset != 0) { | ||
441 | /* check is perf_table_id_offset is > 64k */ | ||
442 | if (perf_table_id_offset & ~0xFFFF) | ||
443 | perf_table_ptr = | ||
444 | &g->bios.data[g->bios.expansion_rom_offset + | ||
445 | perf_table_id_offset]; | ||
446 | else | ||
447 | perf_table_ptr = | ||
448 | &g->bios.data[perf_table_id_offset]; | ||
449 | } else | ||
450 | gk20a_warn(g->dev, "PERF TABLE ID %d is NULL", | ||
451 | table_id); | ||
452 | } else | ||
453 | gk20a_warn(g->dev, "INVALID PERF TABLE ID - %d ", table_id); | ||
454 | |||
455 | return (void *)perf_table_ptr; | ||
456 | } | ||
457 | |||
426 | static void gm206_bios_parse_bit(struct gk20a *g, int offset) | 458 | static void gm206_bios_parse_bit(struct gk20a *g, int offset) |
427 | { | 459 | { |
428 | struct bit bit; | 460 | struct bit bit; |
@@ -453,6 +485,14 @@ static void gm206_bios_parse_bit(struct gk20a *g, int offset) | |||
453 | gm206_bios_parse_falcon_data_v2(g, | 485 | gm206_bios_parse_falcon_data_v2(g, |
454 | bit_token.data_ptr); | 486 | bit_token.data_ptr); |
455 | break; | 487 | break; |
488 | case TOKEN_ID_PERF_PTRS: | ||
489 | g->bios.perf_token = | ||
490 | (struct bit_token *)&g->bios.data[offset]; | ||
491 | break; | ||
492 | case TOKEN_ID_CLOCK_PTRS: | ||
493 | g->bios.clock_token = | ||
494 | (struct bit_token *)&g->bios.data[offset]; | ||
495 | break; | ||
456 | default: | 496 | default: |
457 | break; | 497 | break; |
458 | } | 498 | } |
@@ -715,4 +755,5 @@ static int gm206_bios_init(struct gk20a *g) | |||
715 | void gm206_init_bios(struct gpu_ops *gops) | 755 | void gm206_init_bios(struct gpu_ops *gops) |
716 | { | 756 | { |
717 | gops->bios.init = gm206_bios_init; | 757 | gops->bios.init = gm206_bios_init; |
758 | gops->bios.get_perf_table_ptrs = gm206_bios_get_perf_table_ptrs; | ||
718 | } | 759 | } |
diff --git a/drivers/gpu/nvgpu/gm206/bios_gm206.h b/drivers/gpu/nvgpu/gm206/bios_gm206.h index 28bfd7b8..f93e5f58 100644 --- a/drivers/gpu/nvgpu/gm206/bios_gm206.h +++ b/drivers/gpu/nvgpu/gm206/bios_gm206.h | |||
@@ -13,6 +13,27 @@ | |||
13 | 13 | ||
14 | #ifndef NVGPU_BIOS_GM206_H | 14 | #ifndef NVGPU_BIOS_GM206_H |
15 | #define NVGPU_BIOS_GM206_H | 15 | #define NVGPU_BIOS_GM206_H |
16 | |||
17 | #define PERF_PTRS_WIDTH 0x4 | ||
18 | |||
19 | enum { | ||
20 | CLOCKS_TABLE = 2, | ||
21 | CLOCK_PROGRAMMING_TABLE, | ||
22 | NAFLL_TABLE, | ||
23 | ADC_TABLE, | ||
24 | }; | ||
25 | |||
26 | enum { | ||
27 | CONTINUOUS_VIRTUAL_BINNING_TABLE, | ||
28 | }; | ||
29 | |||
30 | struct bit_token { | ||
31 | u8 token_id; | ||
32 | u8 data_version; | ||
33 | u16 data_size; | ||
34 | u16 data_ptr; | ||
35 | } __packed; | ||
36 | |||
16 | struct gpu_ops; | 37 | struct gpu_ops; |
17 | 38 | ||
18 | void gm206_init_bios(struct gpu_ops *gops); | 39 | void gm206_init_bios(struct gpu_ops *gops); |