summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a
diff options
context:
space:
mode:
authorSupriya <ssharatkumar@nvidia.com>2014-06-13 03:14:27 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:10:14 -0400
commitb7793a493a1fa292a22d5ce84c43ee342b9824b2 (patch)
tree963d128e317d319d2f53aff96420aec17b732bf6 /drivers/gpu/nvgpu/gk20a
parentc32ac10b0bba400c1e83540a20c5ca210fa48613 (diff)
nvgpu: Host side changes to support HS mode
GM20B changes in PMU boot sequence to support booting in HS mode and LS mode Bug 1509680 Change-Id: I2832eda0efe17dd5e3a8f11dd06e7d4da267be70 Signed-off-by: Supriya <ssharatkumar@nvidia.com> Reviewed-on: http://git-master/r/423140 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com> Tested-by: Seshendra Gadagottu <sgadagottu@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Shridhar Rasal <srasal@nvidia.com> Reviewed-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h9
-rw-r--r--drivers/gpu/nvgpu/gk20a/hal_gk20a.c2
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c37
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.h17
4 files changed, 52 insertions, 13 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index 726994ff..da5cc917 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -28,6 +28,7 @@ struct channel_gk20a;
28struct gr_gk20a; 28struct gr_gk20a;
29struct sim_gk20a; 29struct sim_gk20a;
30struct gk20a_ctxsw_ucode_segments; 30struct gk20a_ctxsw_ucode_segments;
31struct acr_gm20b;
31 32
32#include <linux/sched.h> 33#include <linux/sched.h>
33#include <linux/spinlock.h> 34#include <linux/spinlock.h>
@@ -45,6 +46,7 @@ struct gk20a_ctxsw_ucode_segments;
45#include "priv_ring_gk20a.h" 46#include "priv_ring_gk20a.h"
46#include "therm_gk20a.h" 47#include "therm_gk20a.h"
47#include "platform_gk20a.h" 48#include "platform_gk20a.h"
49#include "gm20b/acr_gm20b.h"
48 50
49extern struct platform_device tegra_gk20a_device; 51extern struct platform_device tegra_gk20a_device;
50 52
@@ -205,6 +207,8 @@ struct gpu_ops {
205 struct pmu_sequence *seq); 207 struct pmu_sequence *seq);
206 void *(*get_pmu_seq_out_a_ptr)( 208 void *(*get_pmu_seq_out_a_ptr)(
207 struct pmu_sequence *seq); 209 struct pmu_sequence *seq);
210 void (*set_pmu_cmdline_args_secure_mode)(struct pmu_gk20a *pmu,
211 u32 val);
208 } pmu_ver; 212 } pmu_ver;
209 struct { 213 struct {
210 int (*get_netlist_name)(int index, char *name); 214 int (*get_netlist_name)(int index, char *name);
@@ -214,6 +218,10 @@ struct gpu_ops {
214 int (*set_sparse)(struct vm_gk20a *vm, u64 vaddr, 218 int (*set_sparse)(struct vm_gk20a *vm, u64 vaddr,
215 u32 num_pages, u32 pgsz_idx); 219 u32 num_pages, u32 pgsz_idx);
216 } mm; 220 } mm;
221 struct {
222 int (*pmu_setup_sw)(struct gk20a *g);
223 int (*pmu_setup_hw_and_bootstrap)(struct gk20a *g);
224 } pmu;
217}; 225};
218 226
219struct gk20a { 227struct gk20a {
@@ -236,6 +244,7 @@ struct gk20a {
236 struct sim_gk20a sim; 244 struct sim_gk20a sim;
237 struct mm_gk20a mm; 245 struct mm_gk20a mm;
238 struct pmu_gk20a pmu; 246 struct pmu_gk20a pmu;
247 struct acr_gm20b acr;
239 struct cooling_device_gk20a gk20a_cdev; 248 struct cooling_device_gk20a gk20a_cdev;
240 249
241 /* Save pmu fw here so that it lives cross suspend/resume. 250 /* Save pmu fw here so that it lives cross suspend/resume.
diff --git a/drivers/gpu/nvgpu/gk20a/hal_gk20a.c b/drivers/gpu/nvgpu/gk20a/hal_gk20a.c
index 66bc47a9..ad0a3dc7 100644
--- a/drivers/gpu/nvgpu/gk20a/hal_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/hal_gk20a.c
@@ -23,6 +23,7 @@
23#include "channel_gk20a.h" 23#include "channel_gk20a.h"
24#include "gr_ctx_gk20a.h" 24#include "gr_ctx_gk20a.h"
25#include "mm_gk20a.h" 25#include "mm_gk20a.h"
26#include "pmu_gk20a.h"
26 27
27struct gpu_ops gk20a_ops = { 28struct gpu_ops gk20a_ops = {
28 .clock_gating = { 29 .clock_gating = {
@@ -48,6 +49,7 @@ int gk20a_init_hal(struct gpu_ops *gops)
48 gk20a_init_fifo(gops); 49 gk20a_init_fifo(gops);
49 gk20a_init_gr_ctx(gops); 50 gk20a_init_gr_ctx(gops);
50 gk20a_init_mm(gops); 51 gk20a_init_mm(gops);
52 gk20a_init_pmu_ops(gops);
51 gops->name = "gk20a"; 53 gops->name = "gk20a";
52 54
53 return 0; 55 return 0;
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
index b784b9a6..9b1ecea1 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
@@ -38,10 +38,8 @@
38#define gk20a_dbg_pmu(fmt, arg...) \ 38#define gk20a_dbg_pmu(fmt, arg...) \
39 gk20a_dbg(gpu_dbg_pmu, fmt, ##arg) 39 gk20a_dbg(gpu_dbg_pmu, fmt, ##arg)
40 40
41static void pmu_dump_falcon_stats(struct pmu_gk20a *pmu);
42static int gk20a_pmu_get_elpg_residency_gating(struct gk20a *g, 41static int gk20a_pmu_get_elpg_residency_gating(struct gk20a *g,
43 u32 *ingating_time, u32 *ungating_time, u32 *gating_cnt); 42 u32 *ingating_time, u32 *ungating_time, u32 *gating_cnt);
44static void pmu_setup_hw(struct work_struct *work);
45static void ap_callback_init_and_enable_ctrl( 43static void ap_callback_init_and_enable_ctrl(
46 struct gk20a *g, struct pmu_msg *msg, 44 struct gk20a *g, struct pmu_msg *msg,
47 void *param, u32 seq_desc, u32 status); 45 void *param, u32 seq_desc, u32 status);
@@ -62,6 +60,10 @@ static void set_pmu_cmdline_args_cpufreq_v1(struct pmu_gk20a *pmu, u32 freq)
62{ 60{
63 pmu->args_v1.cpu_freq_hz = freq; 61 pmu->args_v1.cpu_freq_hz = freq;
64} 62}
63static void set_pmu_cmdline_args_secure_mode_v1(struct pmu_gk20a *pmu, u32 val)
64{
65 pmu->args_v1.secure_mode = val;
66}
65 67
66static void set_pmu_cmdline_args_cpufreq_v0(struct pmu_gk20a *pmu, u32 freq) 68static void set_pmu_cmdline_args_cpufreq_v0(struct pmu_gk20a *pmu, u32 freq)
67{ 69{
@@ -482,10 +484,12 @@ static void *get_pmu_sequence_out_alloc_ptr_v0(struct pmu_sequence *seq)
482 return (void *)(&seq->out_v0); 484 return (void *)(&seq->out_v0);
483} 485}
484 486
485static int gk20a_init_pmu(struct pmu_gk20a *pmu) 487int gk20a_init_pmu(struct pmu_gk20a *pmu)
486{ 488{
487 struct gk20a *g = pmu->g; 489 struct gk20a *g = pmu->g;
488 switch (pmu->desc->app_version) { 490 switch (pmu->desc->app_version) {
491 case APP_VERSION_GM20B_1:
492 case APP_VERSION_GM20B:
489 case APP_VERSION_1: 493 case APP_VERSION_1:
490 case APP_VERSION_2: 494 case APP_VERSION_2:
491 g->ops.pmu_ver.cmd_id_zbc_table_update = 16; 495 g->ops.pmu_ver.cmd_id_zbc_table_update = 16;
@@ -493,6 +497,8 @@ static int gk20a_init_pmu(struct pmu_gk20a *pmu)
493 pmu_cmdline_size_v1; 497 pmu_cmdline_size_v1;
494 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq = 498 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq =
495 set_pmu_cmdline_args_cpufreq_v1; 499 set_pmu_cmdline_args_cpufreq_v1;
500 g->ops.pmu_ver.set_pmu_cmdline_args_secure_mode =
501 set_pmu_cmdline_args_secure_mode_v1;
496 g->ops.pmu_ver.get_pmu_cmdline_args_ptr = 502 g->ops.pmu_ver.get_pmu_cmdline_args_ptr =
497 get_pmu_cmdline_args_ptr_v1; 503 get_pmu_cmdline_args_ptr_v1;
498 g->ops.pmu_ver.get_pmu_allocation_struct_size = 504 g->ops.pmu_ver.get_pmu_allocation_struct_size =
@@ -558,6 +564,8 @@ static int gk20a_init_pmu(struct pmu_gk20a *pmu)
558 pmu_cmdline_size_v0; 564 pmu_cmdline_size_v0;
559 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq = 565 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq =
560 set_pmu_cmdline_args_cpufreq_v0; 566 set_pmu_cmdline_args_cpufreq_v0;
567 g->ops.pmu_ver.set_pmu_cmdline_args_secure_mode =
568 NULL;
561 g->ops.pmu_ver.get_pmu_cmdline_args_ptr = 569 g->ops.pmu_ver.get_pmu_cmdline_args_ptr =
562 get_pmu_cmdline_args_ptr_v0; 570 get_pmu_cmdline_args_ptr_v0;
563 g->ops.pmu_ver.get_pmu_allocation_struct_size = 571 g->ops.pmu_ver.get_pmu_allocation_struct_size =
@@ -627,7 +635,7 @@ static int gk20a_init_pmu(struct pmu_gk20a *pmu)
627 return 0; 635 return 0;
628} 636}
629 637
630static void pmu_copy_from_dmem(struct pmu_gk20a *pmu, 638void pmu_copy_from_dmem(struct pmu_gk20a *pmu,
631 u32 src, u8 *dst, u32 size, u8 port) 639 u32 src, u8 *dst, u32 size, u8 port)
632{ 640{
633 struct gk20a *g = pmu->g; 641 struct gk20a *g = pmu->g;
@@ -673,7 +681,7 @@ static void pmu_copy_from_dmem(struct pmu_gk20a *pmu,
673 return; 681 return;
674} 682}
675 683
676static void pmu_copy_to_dmem(struct pmu_gk20a *pmu, 684void pmu_copy_to_dmem(struct pmu_gk20a *pmu,
677 u32 dst, u8 *src, u32 size, u8 port) 685 u32 dst, u8 *src, u32 size, u8 port)
678{ 686{
679 struct gk20a *g = pmu->g; 687 struct gk20a *g = pmu->g;
@@ -887,7 +895,7 @@ static int pmu_enable(struct pmu_gk20a *pmu, bool enable)
887 return 0; 895 return 0;
888} 896}
889 897
890static int pmu_reset(struct pmu_gk20a *pmu) 898int pmu_reset(struct pmu_gk20a *pmu)
891{ 899{
892 int err; 900 int err;
893 901
@@ -999,7 +1007,7 @@ static int pmu_bootstrap(struct pmu_gk20a *pmu)
999 return 0; 1007 return 0;
1000} 1008}
1001 1009
1002static void pmu_seq_init(struct pmu_gk20a *pmu) 1010void pmu_seq_init(struct pmu_gk20a *pmu)
1003{ 1011{
1004 u32 i; 1012 u32 i;
1005 1013
@@ -1784,7 +1792,7 @@ static int gk20a_aelpg_init_and_enable(struct gk20a *g, u8 ctrl_id);
1784static void pmu_setup_hw_load_zbc(struct gk20a *g); 1792static void pmu_setup_hw_load_zbc(struct gk20a *g);
1785static void pmu_setup_hw_enable_elpg(struct gk20a *g); 1793static void pmu_setup_hw_enable_elpg(struct gk20a *g);
1786 1794
1787static void pmu_setup_hw(struct work_struct *work) 1795void pmu_setup_hw(struct work_struct *work)
1788{ 1796{
1789 struct pmu_gk20a *pmu = container_of(work, struct pmu_gk20a, pg_init); 1797 struct pmu_gk20a *pmu = container_of(work, struct pmu_gk20a, pg_init);
1790 struct gk20a *g = pmu->g; 1798 struct gk20a *g = pmu->g;
@@ -1967,6 +1975,12 @@ static void pmu_setup_hw_enable_elpg(struct gk20a *g)
1967 } 1975 }
1968} 1976}
1969 1977
1978void gk20a_init_pmu_ops(struct gpu_ops *gops)
1979{
1980 gops->pmu.pmu_setup_sw = gk20a_init_pmu_setup_sw;
1981 gops->pmu.pmu_setup_hw_and_bootstrap = gk20a_init_pmu_setup_hw1;
1982}
1983
1970int gk20a_init_pmu_support(struct gk20a *g) 1984int gk20a_init_pmu_support(struct gk20a *g)
1971{ 1985{
1972 struct pmu_gk20a *pmu = &g->pmu; 1986 struct pmu_gk20a *pmu = &g->pmu;
@@ -1984,11 +1998,10 @@ int gk20a_init_pmu_support(struct gk20a *g)
1984 return err; 1998 return err;
1985 1999
1986 if (support_gk20a_pmu()) { 2000 if (support_gk20a_pmu()) {
1987 err = gk20a_init_pmu_setup_sw(g); 2001 err = g->ops.pmu.pmu_setup_sw(g);
1988 if (err) 2002 if (err)
1989 return err; 2003 return err;
1990 2004 err = g->ops.pmu.pmu_setup_hw_and_bootstrap(g);
1991 err = gk20a_init_pmu_setup_hw1(g);
1992 if (err) 2005 if (err)
1993 return err; 2006 return err;
1994 } 2007 }
@@ -2724,7 +2737,7 @@ static void pmu_dump_elpg_stats(struct pmu_gk20a *pmu)
2724 */ 2737 */
2725} 2738}
2726 2739
2727static void pmu_dump_falcon_stats(struct pmu_gk20a *pmu) 2740void pmu_dump_falcon_stats(struct pmu_gk20a *pmu)
2728{ 2741{
2729 struct gk20a *g = pmu->g; 2742 struct gk20a *g = pmu->g;
2730 int i; 2743 int i;
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h
index 2843d483..e9567e14 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h
@@ -51,6 +51,8 @@
51/* Mapping between AP_CTRLs and Idle counters */ 51/* Mapping between AP_CTRLs and Idle counters */
52#define PMU_AP_IDLE_MASK_GRAPHICS (PMU_AP_IDLE_MASK_HIST_IDX_1) 52#define PMU_AP_IDLE_MASK_GRAPHICS (PMU_AP_IDLE_MASK_HIST_IDX_1)
53 53
54#define APP_VERSION_GM20B_1 18547257
55#define APP_VERSION_GM20B 17615280
54#define APP_VERSION_2 18542378 56#define APP_VERSION_2 18542378
55#define APP_VERSION_1 17997577 57#define APP_VERSION_1 17997577
56#define APP_VERSION_0 16856675 58#define APP_VERSION_0 16856675
@@ -1058,6 +1060,8 @@ struct pmu_gk20a {
1058 }; 1060 };
1059 unsigned long perfmon_events_cnt; 1061 unsigned long perfmon_events_cnt;
1060 bool perfmon_sampling_enabled; 1062 bool perfmon_sampling_enabled;
1063 u8 pmu_mode; /*Added for GM20b, and ACR*/
1064 u32 falcon_id;
1061}; 1065};
1062 1066
1063int gk20a_init_pmu_support(struct gk20a *g); 1067int gk20a_init_pmu_support(struct gk20a *g);
@@ -1086,5 +1090,16 @@ int gk20a_pmu_debugfs_init(struct platform_device *dev);
1086void gk20a_pmu_reset_load_counters(struct gk20a *g); 1090void gk20a_pmu_reset_load_counters(struct gk20a *g);
1087void gk20a_pmu_get_load_counters(struct gk20a *g, u32 *busy_cycles, 1091void gk20a_pmu_get_load_counters(struct gk20a *g, u32 *busy_cycles,
1088 u32 *total_cycles); 1092 u32 *total_cycles);
1089 1093void gk20a_init_pmu_ops(struct gpu_ops *gops);
1094
1095void pmu_copy_to_dmem(struct pmu_gk20a *pmu,
1096 u32 dst, u8 *src, u32 size, u8 port);
1097void pmu_copy_from_dmem(struct pmu_gk20a *pmu,
1098 u32 src, u8 *dst, u32 size, u8 port);
1099int pmu_reset(struct pmu_gk20a *pmu);
1100int gk20a_init_pmu(struct pmu_gk20a *pmu);
1101void pmu_dump_falcon_stats(struct pmu_gk20a *pmu);
1102void gk20a_remove_pmu_support(struct pmu_gk20a *pmu);
1103void pmu_setup_hw(struct work_struct *work);
1104void pmu_seq_init(struct pmu_gk20a *pmu);
1090#endif /*__PMU_GK20A_H__*/ 1105#endif /*__PMU_GK20A_H__*/