summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/ltc_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/ltc_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/ltc_gk20a.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/ltc_gk20a.c b/drivers/gpu/nvgpu/gk20a/ltc_gk20a.c
index 2794b3db..aa094dc7 100644
--- a/drivers/gpu/nvgpu/gk20a/ltc_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/ltc_gk20a.c
@@ -224,6 +224,47 @@ static void gk20a_mm_g_elpg_flush_locked(struct gk20a *g)
224 224
225} 225}
226 226
227static int gk20a_determine_L2_size_bytes(struct gk20a *g)
228{
229 u32 lts_per_ltc;
230 u32 ways;
231 u32 sets;
232 u32 bytes_per_line;
233 u32 active_ltcs;
234 u32 cache_size;
235
236 u32 tmp;
237 u32 active_sets_value;
238
239 tmp = gk20a_readl(g, ltc_ltc0_lts0_tstg_cfg1_r());
240 ways = hweight32(ltc_ltc0_lts0_tstg_cfg1_active_ways_v(tmp));
241
242 active_sets_value = ltc_ltc0_lts0_tstg_cfg1_active_sets_v(tmp);
243 if (active_sets_value == ltc_ltc0_lts0_tstg_cfg1_active_sets_all_v()) {
244 sets = 64;
245 } else if (active_sets_value ==
246 ltc_ltc0_lts0_tstg_cfg1_active_sets_half_v()) {
247 sets = 32;
248 } else if (active_sets_value ==
249 ltc_ltc0_lts0_tstg_cfg1_active_sets_quarter_v()) {
250 sets = 16;
251 } else {
252 dev_err(dev_from_gk20a(g),
253 "Unknown constant %u for active sets",
254 (unsigned)active_sets_value);
255 sets = 0;
256 }
257
258 active_ltcs = g->gr.num_fbps;
259
260 /* chip-specific values */
261 lts_per_ltc = 1;
262 bytes_per_line = 128;
263 cache_size = active_ltcs * lts_per_ltc * ways * sets * bytes_per_line;
264
265 return cache_size;
266}
267
227void gk20a_init_ltc(struct gpu_ops *gops) 268void gk20a_init_ltc(struct gpu_ops *gops)
228{ 269{
229 gops->ltc.determine_L2_size_bytes = gk20a_determine_L2_size_bytes; 270 gops->ltc.determine_L2_size_bytes = gk20a_determine_L2_size_bytes;