diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-03-23 11:43:53 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-05-23 17:15:25 -0400 |
commit | fb64e1f1b9c2162f521dfe3956655accb911d6a7 (patch) | |
tree | 15236c00323c8d24102f5a1221f1b313d62bfac2 /drivers/gpu/nvgpu/gm206/gr_gm206.c | |
parent | c25e1da93e09a421b8c2b91df720d4bc603db378 (diff) |
gpu: nvgpu: Add support for gm204 and gm206
Add support for chips gm204 and gm206. Adds also support for reading
VBIOS and booting devinit and pre-os images on PMU.
Change-Id: I4824b44245611e5379ace62793cc37158048f432
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/1120467
GVS: Gerrit_Virtual_Submit
Reviewed-by: Ken Adams <kadams@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gm206/gr_gm206.c')
-rw-r--r-- | drivers/gpu/nvgpu/gm206/gr_gm206.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gm206/gr_gm206.c b/drivers/gpu/nvgpu/gm206/gr_gm206.c new file mode 100644 index 00000000..cad080ac --- /dev/null +++ b/drivers/gpu/nvgpu/gm206/gr_gm206.c | |||
@@ -0,0 +1,92 @@ | |||
1 | /* | ||
2 | * gm206 GR | ||
3 | * | ||
4 | * Copyright (c) 2011-2016, 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 <linux/types.h> | ||
17 | #include <linux/delay.h> /* for mdelay */ | ||
18 | #include <linux/io.h> | ||
19 | #include <linux/tegra-fuse.h> | ||
20 | #include <linux/vmalloc.h> | ||
21 | |||
22 | #include "gk20a/gk20a.h" | ||
23 | |||
24 | #include "gm20b/gr_gm20b.h" | ||
25 | #include "gr_gm206.h" | ||
26 | #include "hw_fb_gm206.h" | ||
27 | #include "hw_gr_gm206.h" | ||
28 | |||
29 | static void gr_gm206_init_gpc_mmu(struct gk20a *g) | ||
30 | { | ||
31 | u32 temp; | ||
32 | |||
33 | gk20a_dbg_info("initialize gpc mmu"); | ||
34 | |||
35 | temp = gk20a_readl(g, fb_mmu_ctrl_r()); | ||
36 | temp &= gr_gpcs_pri_mmu_ctrl_vm_pg_size_m() | | ||
37 | gr_gpcs_pri_mmu_ctrl_use_pdb_big_page_size_m() | | ||
38 | gr_gpcs_pri_mmu_ctrl_use_full_comp_tag_line_m() | | ||
39 | gr_gpcs_pri_mmu_ctrl_vol_fault_m() | | ||
40 | gr_gpcs_pri_mmu_ctrl_comp_fault_m() | | ||
41 | gr_gpcs_pri_mmu_ctrl_miss_gran_m() | | ||
42 | gr_gpcs_pri_mmu_ctrl_cache_mode_m() | | ||
43 | gr_gpcs_pri_mmu_ctrl_mmu_aperture_m() | | ||
44 | gr_gpcs_pri_mmu_ctrl_mmu_vol_m() | | ||
45 | gr_gpcs_pri_mmu_ctrl_mmu_disable_m(); | ||
46 | gk20a_writel(g, gr_gpcs_pri_mmu_ctrl_r(), temp); | ||
47 | gk20a_writel(g, gr_gpcs_pri_mmu_pm_unit_mask_r(), 0); | ||
48 | gk20a_writel(g, gr_gpcs_pri_mmu_pm_req_mask_r(), 0); | ||
49 | |||
50 | gk20a_writel(g, gr_gpcs_pri_mmu_debug_ctrl_r(), | ||
51 | gk20a_readl(g, fb_mmu_debug_ctrl_r())); | ||
52 | gk20a_writel(g, gr_gpcs_pri_mmu_debug_wr_r(), | ||
53 | gk20a_readl(g, fb_mmu_debug_wr_r())); | ||
54 | gk20a_writel(g, gr_gpcs_pri_mmu_debug_rd_r(), | ||
55 | gk20a_readl(g, fb_mmu_debug_rd_r())); | ||
56 | |||
57 | gk20a_writel(g, gr_gpcs_mmu_num_active_ltcs_r(), | ||
58 | gk20a_readl(g, fb_fbhub_num_active_ltcs_r())); | ||
59 | /* TODO: num_active_ltcs2! */ | ||
60 | gk20a_writel(g, 0x50833c, gk20a_readl(g, 0x100804)); | ||
61 | } | ||
62 | |||
63 | static void gr_gm206_bundle_cb_defaults(struct gk20a *g) | ||
64 | { | ||
65 | struct gr_gk20a *gr = &g->gr; | ||
66 | |||
67 | gr->bundle_cb_default_size = | ||
68 | gr_scc_bundle_cb_size_div_256b__prod_v(); | ||
69 | gr->min_gpm_fifo_depth = | ||
70 | gr_pd_ab_dist_cfg2_state_limit_min_gpm_fifo_depths_v(); | ||
71 | gr->bundle_cb_token_limit = | ||
72 | gr_pd_ab_dist_cfg2_token_limit_init_v(); | ||
73 | } | ||
74 | |||
75 | static void gr_gm206_cb_size_default(struct gk20a *g) | ||
76 | { | ||
77 | struct gr_gk20a *gr = &g->gr; | ||
78 | |||
79 | if (!gr->attrib_cb_default_size) | ||
80 | gr->attrib_cb_default_size = | ||
81 | gr_gpc0_ppc0_cbm_beta_cb_size_v_default_v(); | ||
82 | gr->alpha_cb_default_size = | ||
83 | gr_gpc0_ppc0_cbm_alpha_cb_size_v_default_v(); | ||
84 | } | ||
85 | |||
86 | void gm206_init_gr(struct gpu_ops *gops) | ||
87 | { | ||
88 | gm20b_init_gr(gops); | ||
89 | gops->gr.init_gpc_mmu = gr_gm206_init_gpc_mmu; | ||
90 | gops->gr.bundle_cb_defaults = gr_gm206_bundle_cb_defaults; | ||
91 | gops->gr.cb_size_default = gr_gm206_cb_size_default; | ||
92 | } | ||