7c60ed4fb8b5e0fa068b2def2973b0ecf695c646
[linux-3.10.git] / drivers / video / tegra / host / gk20a / gr_ctx_gk20a.h
1 /*
2  * drivers/video/tegra/host/gk20a/gr_ctx_gk20a.h
3  *
4  * GK20A Graphics Context
5  *
6  * Copyright (c) 2011, NVIDIA CORPORATION.  All rights reserved.
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms and conditions of the GNU General Public License,
10  * version 2, as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along with
18  * this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21 #ifndef __GR_CTX_GK20A_H__
22 #define __GR_CTX_GK20A_H__
23
24
25 /* production netlist, one and only one from below */
26 #undef GK20A_NETLIST_IMAGE_FW_NAME
27 /* emulation netlists, match majorV with HW */
28 #define GK20A_NETLIST_IMAGE_A   "NETA_img.bin"
29 #define GK20A_NETLIST_IMAGE_B   "NETB_img.bin"
30 #undef  GK20A_NETLIST_IMAGE_C
31 #undef  GK20A_NETLIST_IMAGE_D
32
33 union __max_name {
34 #ifdef GK20A_NETLIST_IMAGE_A
35         char __name_a[sizeof(GK20A_NETLIST_IMAGE_A)];
36 #endif
37 #ifdef GK20A_NETLIST_IMAGE_B
38         char __name_b[sizeof(GK20A_NETLIST_IMAGE_B)];
39 #endif
40 #ifdef GK20A_NETLIST_IMAGE_C
41         char __name_c[sizeof(GK20A_NETLIST_IMAGE_C)];
42 #endif
43 #ifdef GK20A_NETLIST_IMAGE_D
44         char __name_d[sizeof(GK20A_NETLIST_IMAGE_D)];
45 #endif
46 };
47
48 #define MAX_NETLIST_NAME sizeof(union __max_name)
49
50 /* index for emulation netlists */
51 #define NETLIST_FINAL           -1
52 #define NETLIST_SLOT_A          0
53 #define NETLIST_SLOT_B          1
54 #define NETLIST_SLOT_C          2
55 #define NETLIST_SLOT_D          3
56 #define MAX_NETLIST             4
57
58 /* netlist regions */
59 #define NETLIST_REGIONID_FECS_UCODE_DATA        0
60 #define NETLIST_REGIONID_FECS_UCODE_INST        1
61 #define NETLIST_REGIONID_GPCCS_UCODE_DATA       2
62 #define NETLIST_REGIONID_GPCCS_UCODE_INST       3
63 #define NETLIST_REGIONID_SW_BUNDLE_INIT         4
64 #define NETLIST_REGIONID_SW_CTX_LOAD            5
65 #define NETLIST_REGIONID_SW_NON_CTX_LOAD        6
66 #define NETLIST_REGIONID_SW_METHOD_INIT         7
67 #define NETLIST_REGIONID_CTXREG_SYS             8
68 #define NETLIST_REGIONID_CTXREG_GPC             9
69 #define NETLIST_REGIONID_CTXREG_TPC             10
70 #define NETLIST_REGIONID_CTXREG_ZCULL_GPC       11
71 #define NETLIST_REGIONID_CTXREG_PM_SYS          12
72 #define NETLIST_REGIONID_CTXREG_PM_GPC          13
73 #define NETLIST_REGIONID_CTXREG_PM_TPC          14
74 #define NETLIST_REGIONID_MAJORV                 15
75 #define NETLIST_REGIONID_BUFFER_SIZE            16
76 #define NETLIST_REGIONID_CTXSW_REG_BASE_INDEX   17
77 #define NETLIST_REGIONID_NETLIST_NUM            18
78 #define NETLIST_REGIONID_CTXREG_PPC             19
79 #define NETLIST_REGIONID_CTXREG_PMPPC           20
80
81 struct netlist_region {
82         u32 region_id;
83         u32 data_size;
84         u32 data_offset;
85 };
86
87 struct netlist_image_header {
88         u32 version;
89         u32 regions;
90 };
91
92 struct netlist_image {
93         struct netlist_image_header header;
94         struct netlist_region regions[1];
95 };
96
97 struct av_gk20a {
98         u32 addr;
99         u32 value;
100 };
101 struct aiv_gk20a {
102         u32 addr;
103         u32 index;
104         u32 value;
105 };
106 struct aiv_list_gk20a {
107         struct aiv_gk20a *l;
108         u32 count;
109 };
110 struct av_list_gk20a {
111         struct av_gk20a *l;
112         u32 count;
113 };
114 struct u32_list_gk20a {
115         u32 *l;
116         u32 count;
117 };
118
119 static inline
120 struct av_gk20a *alloc_av_list_gk20a(struct av_list_gk20a *avl)
121 {
122         avl->l = kzalloc(avl->count * sizeof(*avl->l), GFP_KERNEL);
123         return avl->l;
124 }
125
126 static inline
127 struct aiv_gk20a *alloc_aiv_list_gk20a(struct aiv_list_gk20a *aivl)
128 {
129         aivl->l = kzalloc(aivl->count * sizeof(*aivl->l), GFP_KERNEL);
130         return aivl->l;
131 }
132
133 static inline
134 u32 *alloc_u32_list_gk20a(struct u32_list_gk20a *u32l)
135 {
136         u32l->l = kzalloc(u32l->count * sizeof(*u32l->l), GFP_KERNEL);
137         return u32l->l;
138 }
139
140 struct gr_ucode_gk20a {
141         struct {
142                 struct u32_list_gk20a inst;
143                 struct u32_list_gk20a data;
144         } gpccs, fecs;
145 };
146
147 /* main entry for grctx loading */
148 int gr_gk20a_init_ctx_vars(struct gk20a *g, struct gr_gk20a *gr);
149
150 #endif /*__GR_CTX_GK20A_H__*/