diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/ltc_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/ltc_gk20a.c | 41 |
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 | ||
227 | static 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 | |||
227 | void gk20a_init_ltc(struct gpu_ops *gops) | 268 | void 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; |