diff options
author | Kevin Huang <kevinh@nvidia.com> | 2014-05-23 16:45:57 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:10:03 -0400 |
commit | 7d917f43a5a8abc41988e606ef5e7311dcf23ff8 (patch) | |
tree | 224224ab2160dca7cc6fca19bd5d6a0a6ebb9bae /drivers/gpu | |
parent | 28c35a1b99cdfc8ef950241471a213a211bd1836 (diff) |
gpu: nvgpu: gm20b: fix compression sharing
For GM20B alone, the LTC count is already accounted for the HW logic
for the CBC base calculation from the postDivide address. So SW
doesn't have to explicity divide it by the LTC count in the postDivide
address calculation.
Bug 1477079
Change-Id: I558bbe66bbcfb7edfa21210d0dc22c6170149260
Signed-off-by: Kevin Huang <kevinh@nvidia.com>
Reviewed-on: http://git-master/r/414264
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/ltc_common.c | 7 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/ltc_gm20b.c | 14 |
3 files changed, 21 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 081ec077..f16be5a1 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h | |||
@@ -84,6 +84,7 @@ struct gpu_ops { | |||
84 | void (*init_fs_state)(struct gk20a *g); | 84 | void (*init_fs_state)(struct gk20a *g); |
85 | void (*elpg_flush)(struct gk20a *g); | 85 | void (*elpg_flush)(struct gk20a *g); |
86 | void (*isr)(struct gk20a *g); | 86 | void (*isr)(struct gk20a *g); |
87 | u32 (*cbc_fix_config)(struct gk20a *g, int base); | ||
87 | } ltc; | 88 | } ltc; |
88 | struct { | 89 | struct { |
89 | int (*init_fs_state)(struct gk20a *g); | 90 | int (*init_fs_state)(struct gk20a *g); |
diff --git a/drivers/gpu/nvgpu/gk20a/ltc_common.c b/drivers/gpu/nvgpu/gk20a/ltc_common.c index 72477983..75530b25 100644 --- a/drivers/gpu/nvgpu/gk20a/ltc_common.c +++ b/drivers/gpu/nvgpu/gk20a/ltc_common.c | |||
@@ -291,7 +291,7 @@ static void gk20a_ltc_init_cbc(struct gk20a *g, struct gr_gk20a *gr) | |||
291 | compbit_base_post_divide64 = compbit_store_base_iova >> | 291 | compbit_base_post_divide64 = compbit_store_base_iova >> |
292 | ltc_ltcs_ltss_cbc_base_alignment_shift_v(); | 292 | ltc_ltcs_ltss_cbc_base_alignment_shift_v(); |
293 | 293 | ||
294 | do_div(compbit_base_post_divide64, gr->num_fbps); | 294 | do_div(compbit_base_post_divide64, g->ltc_count); |
295 | compbit_base_post_divide = u64_lo32(compbit_base_post_divide64); | 295 | compbit_base_post_divide = u64_lo32(compbit_base_post_divide64); |
296 | 296 | ||
297 | compbit_base_post_multiply64 = ((u64)compbit_base_post_divide * | 297 | compbit_base_post_multiply64 = ((u64)compbit_base_post_divide * |
@@ -300,6 +300,11 @@ static void gk20a_ltc_init_cbc(struct gk20a *g, struct gr_gk20a *gr) | |||
300 | if (compbit_base_post_multiply64 < compbit_store_base_iova) | 300 | if (compbit_base_post_multiply64 < compbit_store_base_iova) |
301 | compbit_base_post_divide++; | 301 | compbit_base_post_divide++; |
302 | 302 | ||
303 | /* Bug 1477079 indicates sw adjustment on the posted divided base. */ | ||
304 | if (g->ops.ltc.cbc_fix_config) | ||
305 | compbit_base_post_divide = | ||
306 | g->ops.ltc.cbc_fix_config(g, compbit_base_post_divide); | ||
307 | |||
303 | gk20a_writel(g, ltc_ltcs_ltss_cbc_base_r(), | 308 | gk20a_writel(g, ltc_ltcs_ltss_cbc_base_r(), |
304 | compbit_base_post_divide); | 309 | compbit_base_post_divide); |
305 | 310 | ||
diff --git a/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c b/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c index 43c90970..91046d93 100644 --- a/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/ltc_gm20b.c | |||
@@ -237,6 +237,19 @@ static void gm20b_ltc_g_elpg_flush_locked(struct gk20a *g) | |||
237 | "g_elpg_flush too many retries"); | 237 | "g_elpg_flush too many retries"); |
238 | } | 238 | } |
239 | 239 | ||
240 | u32 gm20b_ltc_cbc_fix_config(struct gk20a *g, int base) | ||
241 | { | ||
242 | u32 val = gk20a_readl(g, ltc_ltcs_ltss_cbc_num_active_ltcs_r()); | ||
243 | if (val == 2) { | ||
244 | return base * 2; | ||
245 | } else if (val != 1) { | ||
246 | gk20a_err(dev_from_gk20a(g), | ||
247 | "Invalid number of active ltcs: %08x\n", val); | ||
248 | } | ||
249 | |||
250 | return base; | ||
251 | } | ||
252 | |||
240 | void gm20b_init_ltc(struct gpu_ops *gops) | 253 | void gm20b_init_ltc(struct gpu_ops *gops) |
241 | { | 254 | { |
242 | /* Gk20a reused ops. */ | 255 | /* Gk20a reused ops. */ |
@@ -255,4 +268,5 @@ void gm20b_init_ltc(struct gpu_ops *gops) | |||
255 | gops->ltc.cbc_ctrl = gm20b_ltc_cbc_ctrl; | 268 | gops->ltc.cbc_ctrl = gm20b_ltc_cbc_ctrl; |
256 | gops->ltc.elpg_flush = gm20b_ltc_g_elpg_flush_locked; | 269 | gops->ltc.elpg_flush = gm20b_ltc_g_elpg_flush_locked; |
257 | gops->ltc.isr = gm20b_ltc_isr; | 270 | gops->ltc.isr = gm20b_ltc_isr; |
271 | gops->ltc.cbc_fix_config = gm20b_ltc_cbc_fix_config; | ||
258 | } | 272 | } |