gpu: nvgpu: support gk20a virtualization
[linux-3.10.git] / drivers / gpu / nvgpu / vgpu / ltc_vgpu.c
1 /*
2  * Virtualized GPU L2
3  *
4  * Copyright (c) 2014 NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  */
15
16 #include "vgpu/vgpu.h"
17
18 static int vgpu_determine_L2_size_bytes(struct gk20a *g)
19 {
20         struct gk20a_platform *platform = gk20a_get_platform(g->dev);
21         u32 cache_size = 0;
22
23         gk20a_dbg_fn("");
24
25         if (vgpu_get_attribute(platform->virt_handle,
26                         TEGRA_VGPU_ATTRIB_L2_SIZE, &cache_size))
27                 dev_err(dev_from_gk20a(g), "unable to get L2 size");
28
29         return cache_size;
30 }
31
32 static int vgpu_ltc_init_comptags(struct gk20a *g, struct gr_gk20a *gr)
33 {
34         struct gk20a_platform *platform = gk20a_get_platform(g->dev);
35         u32 max_comptag_lines = 0;
36
37         gk20a_dbg_fn("");
38
39         vgpu_get_attribute(platform->virt_handle,
40                         TEGRA_VGPU_ATTRIB_COMPTAG_LINES, &max_comptag_lines);
41         if (max_comptag_lines < 2)
42                 return -ENXIO;
43
44         gk20a_allocator_init(&gr->comp_tags, "comptag",
45                               1, /* start */
46                               max_comptag_lines - 1, /* length*/
47                               1); /* align */
48         return 0;
49 }
50
51 void vgpu_init_ltc_ops(struct gpu_ops *gops)
52 {
53         gops->ltc.determine_L2_size_bytes = vgpu_determine_L2_size_bytes;
54         gops->ltc.init_comptags = vgpu_ltc_init_comptags;
55 }