summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.c11
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h2
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c17
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.h9
-rw-r--r--drivers/gpu/nvgpu/gm20b/gr_gm20b.c18
-rw-r--r--include/uapi/linux/nvgpu.h7
6 files changed, 64 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c
index 4283e1ad..c07e7e4b 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.c
@@ -2142,6 +2142,17 @@ int gk20a_init_gpu_characteristics(struct gk20a *g)
2142 if (platform->clk_round_rate) 2142 if (platform->clk_round_rate)
2143 gpu->max_freq = platform->clk_round_rate(g->dev, UINT_MAX); 2143 gpu->max_freq = platform->clk_round_rate(g->dev, UINT_MAX);
2144 2144
2145 g->ops.gr.get_preemption_mode_flags(g, &g->gr.preemption_mode_rec);
2146 gpu->graphics_preemption_mode_flags =
2147 g->gr.preemption_mode_rec.graphics_preemption_mode_flags;
2148 gpu->compute_preemption_mode_flags =
2149 g->gr.preemption_mode_rec.compute_preemption_mode_flags;
2150 gpu->default_graphics_preempt_mode =
2151 g->gr.preemption_mode_rec.default_graphics_preempt_mode;
2152 gpu->default_compute_preempt_mode =
2153 g->gr.preemption_mode_rec.default_compute_preempt_mode;
2154
2155
2145 return 0; 2156 return 0;
2146} 2157}
2147 2158
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h
index 64e410db..09198fa5 100644
--- a/drivers/gpu/nvgpu/gk20a/gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gk20a.h
@@ -257,6 +257,8 @@ struct gpu_ops {
257 int (*set_preemption_mode)(struct channel_gk20a *ch, 257 int (*set_preemption_mode)(struct channel_gk20a *ch,
258 u32 graphics_preempt_mode, 258 u32 graphics_preempt_mode,
259 u32 compute_preempt_mode); 259 u32 compute_preempt_mode);
260 int (*get_preemption_mode_flags)(struct gk20a *g,
261 struct nvgpu_preemption_modes_rec *preemption_modes_rec);
260 } gr; 262 } gr;
261 const char *name; 263 const char *name;
262 struct { 264 struct {
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index aa63e559..8b645cc2 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -8659,6 +8659,22 @@ clean_up:
8659 return err; 8659 return err;
8660} 8660}
8661 8661
8662static int gr_gk20a_get_preemption_mode_flags(struct gk20a *g,
8663 struct nvgpu_preemption_modes_rec *preemption_modes_rec)
8664{
8665 preemption_modes_rec->graphics_preemption_mode_flags =
8666 NVGPU_GRAPHICS_PREEMPTION_MODE_WFI;
8667 preemption_modes_rec->compute_preemption_mode_flags =
8668 NVGPU_COMPUTE_PREEMPTION_MODE_WFI;
8669
8670 preemption_modes_rec->default_graphics_preempt_mode =
8671 NVGPU_GRAPHICS_PREEMPTION_MODE_WFI;
8672 preemption_modes_rec->default_compute_preempt_mode =
8673 NVGPU_COMPUTE_PREEMPTION_MODE_WFI;
8674
8675 return 0;
8676}
8677
8662void gk20a_init_gr_ops(struct gpu_ops *gops) 8678void gk20a_init_gr_ops(struct gpu_ops *gops)
8663{ 8679{
8664 gops->gr.access_smpc_reg = gr_gk20a_access_smpc_reg; 8680 gops->gr.access_smpc_reg = gr_gk20a_access_smpc_reg;
@@ -8726,4 +8742,5 @@ void gk20a_init_gr_ops(struct gpu_ops *gops)
8726 gops->gr.update_sm_error_state = gk20a_gr_update_sm_error_state; 8742 gops->gr.update_sm_error_state = gk20a_gr_update_sm_error_state;
8727 gops->gr.clear_sm_error_state = gk20a_gr_clear_sm_error_state; 8743 gops->gr.clear_sm_error_state = gk20a_gr_clear_sm_error_state;
8728 gops->gr.suspend_contexts = gr_gk20a_suspend_contexts; 8744 gops->gr.suspend_contexts = gr_gk20a_suspend_contexts;
8745 gops->gr.get_preemption_mode_flags = gr_gk20a_get_preemption_mode_flags;
8729} 8746}
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
index 10997c17..15d1ea7d 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.h
@@ -188,6 +188,14 @@ struct gr_gk20a_isr_data {
188 u32 class_num; 188 u32 class_num;
189}; 189};
190 190
191struct nvgpu_preemption_modes_rec {
192 u32 graphics_preemption_mode_flags; /* supported preemption modes */
193 u32 compute_preemption_mode_flags; /* supported preemption modes */
194
195 u32 default_graphics_preempt_mode; /* default mode */
196 u32 default_compute_preempt_mode; /* default mode */
197};
198
191struct gr_gk20a { 199struct gr_gk20a {
192 struct gk20a *g; 200 struct gk20a *g;
193 struct { 201 struct {
@@ -325,6 +333,7 @@ struct gr_gk20a {
325 bool sw_ready; 333 bool sw_ready;
326 bool skip_ucode_init; 334 bool skip_ucode_init;
327 335
336 struct nvgpu_preemption_modes_rec preemption_mode_rec;
328#ifdef CONFIG_ARCH_TEGRA_18x_SOC 337#ifdef CONFIG_ARCH_TEGRA_18x_SOC
329 struct gr_t18x t18x; 338 struct gr_t18x t18x;
330#endif 339#endif
diff --git a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
index dbe30f00..2a982f87 100644
--- a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
@@ -1345,6 +1345,23 @@ fail:
1345 return err; 1345 return err;
1346} 1346}
1347 1347
1348static int gr_gm20b_get_preemption_mode_flags(struct gk20a *g,
1349 struct nvgpu_preemption_modes_rec *preemption_modes_rec)
1350{
1351 preemption_modes_rec->graphics_preemption_mode_flags =
1352 NVGPU_GRAPHICS_PREEMPTION_MODE_WFI;
1353 preemption_modes_rec->compute_preemption_mode_flags = (
1354 NVGPU_COMPUTE_PREEMPTION_MODE_WFI |
1355 NVGPU_COMPUTE_PREEMPTION_MODE_CTA);
1356
1357 preemption_modes_rec->default_graphics_preempt_mode =
1358 NVGPU_GRAPHICS_PREEMPTION_MODE_WFI;
1359 preemption_modes_rec->default_compute_preempt_mode =
1360 NVGPU_COMPUTE_PREEMPTION_MODE_CTA;
1361
1362 return 0;
1363}
1364
1348void gm20b_init_gr(struct gpu_ops *gops) 1365void gm20b_init_gr(struct gpu_ops *gops)
1349{ 1366{
1350 gops->gr.init_gpc_mmu = gr_gm20b_init_gpc_mmu; 1367 gops->gr.init_gpc_mmu = gr_gm20b_init_gpc_mmu;
@@ -1417,4 +1434,5 @@ void gm20b_init_gr(struct gpu_ops *gops)
1417 gops->gr.update_sm_error_state = gm20b_gr_update_sm_error_state; 1434 gops->gr.update_sm_error_state = gm20b_gr_update_sm_error_state;
1418 gops->gr.clear_sm_error_state = gm20b_gr_clear_sm_error_state; 1435 gops->gr.clear_sm_error_state = gm20b_gr_clear_sm_error_state;
1419 gops->gr.suspend_contexts = gr_gk20a_suspend_contexts; 1436 gops->gr.suspend_contexts = gr_gk20a_suspend_contexts;
1437 gops->gr.get_preemption_mode_flags = gr_gm20b_get_preemption_mode_flags;
1420} 1438}
diff --git a/include/uapi/linux/nvgpu.h b/include/uapi/linux/nvgpu.h
index 8ebe8d06..82b78f8f 100644
--- a/include/uapi/linux/nvgpu.h
+++ b/include/uapi/linux/nvgpu.h
@@ -187,6 +187,13 @@ struct nvgpu_gpu_characteristics {
187 187
188 __u64 max_freq; 188 __u64 max_freq;
189 189
190 /* supported preemption modes */
191 __u32 graphics_preemption_mode_flags; /* NVGPU_GRAPHICS_PREEMPTION_MODE_* */
192 __u32 compute_preemption_mode_flags; /* NVGPU_COMPUTE_PREEMPTION_MODE_* */
193 /* default preemption modes */
194 __u32 default_graphics_preempt_mode; /* NVGPU_GRAPHICS_PREEMPTION_MODE_* */
195 __u32 default_compute_preempt_mode; /* NVGPU_COMPUTE_PREEMPTION_MODE_* */
196
190 /* Notes: 197 /* Notes:
191 - This struct can be safely appended with new fields. However, always 198 - This struct can be safely appended with new fields. However, always
192 keep the structure size multiple of 8 and make sure that the binary 199 keep the structure size multiple of 8 and make sure that the binary