• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <core/os.h>
2 #include <core/engctx.h>
3 #include <core/enum.h>
4 
5 #include <subdev/timer.h>
6 #include <subdev/fb.h>
7 
8 #include "nv20.h"
9 #include "regs.h"
10 
11 /*******************************************************************************
12  * Graphics object classes
13  ******************************************************************************/
14 
15 static struct nouveau_oclass
16 nv35_graph_sclass[] = {
17 	{ 0x0012, &nv04_graph_ofuncs, NULL }, /* beta1 */
18 	{ 0x0019, &nv04_graph_ofuncs, NULL }, /* clip */
19 	{ 0x0030, &nv04_graph_ofuncs, NULL }, /* null */
20 	{ 0x0039, &nv04_graph_ofuncs, NULL }, /* m2mf */
21 	{ 0x0043, &nv04_graph_ofuncs, NULL }, /* rop */
22 	{ 0x0044, &nv04_graph_ofuncs, NULL }, /* patt */
23 	{ 0x004a, &nv04_graph_ofuncs, NULL }, /* gdi */
24 	{ 0x0062, &nv04_graph_ofuncs, NULL }, /* surf2d */
25 	{ 0x0072, &nv04_graph_ofuncs, NULL }, /* beta4 */
26 	{ 0x0089, &nv04_graph_ofuncs, NULL }, /* sifm */
27 	{ 0x008a, &nv04_graph_ofuncs, NULL }, /* ifc */
28 	{ 0x009f, &nv04_graph_ofuncs, NULL }, /* imageblit */
29 	{ 0x0362, &nv04_graph_ofuncs, NULL }, /* surf2d (nv30) */
30 	{ 0x0389, &nv04_graph_ofuncs, NULL }, /* sifm (nv30) */
31 	{ 0x038a, &nv04_graph_ofuncs, NULL }, /* ifc (nv30) */
32 	{ 0x039e, &nv04_graph_ofuncs, NULL }, /* swzsurf (nv30) */
33 	{ 0x0497, &nv04_graph_ofuncs, NULL }, /* rankine */
34 	{},
35 };
36 
37 /*******************************************************************************
38  * PGRAPH context
39  ******************************************************************************/
40 
41 static int
nv35_graph_context_ctor(struct nouveau_object * parent,struct nouveau_object * engine,struct nouveau_oclass * oclass,void * data,u32 size,struct nouveau_object ** pobject)42 nv35_graph_context_ctor(struct nouveau_object *parent,
43 			struct nouveau_object *engine,
44 			struct nouveau_oclass *oclass, void *data, u32 size,
45 			struct nouveau_object **pobject)
46 {
47 	struct nv20_graph_chan *chan;
48 	int ret, i;
49 
50 	ret = nouveau_graph_context_create(parent, engine, oclass, NULL, 0x577c,
51 					   16, NVOBJ_FLAG_ZERO_ALLOC, &chan);
52 	*pobject = nv_object(chan);
53 	if (ret)
54 		return ret;
55 
56 	chan->chid = nouveau_fifo_chan(parent)->chid;
57 
58 	nv_wo32(chan, 0x0028, 0x00000001 | (chan->chid << 24));
59 	nv_wo32(chan, 0x040c, 0x00000101);
60 	nv_wo32(chan, 0x0420, 0x00000111);
61 	nv_wo32(chan, 0x0424, 0x00000060);
62 	nv_wo32(chan, 0x0440, 0x00000080);
63 	nv_wo32(chan, 0x0444, 0xffff0000);
64 	nv_wo32(chan, 0x0448, 0x00000001);
65 	nv_wo32(chan, 0x045c, 0x44400000);
66 	nv_wo32(chan, 0x0488, 0xffff0000);
67 	for (i = 0x04dc; i < 0x04e4; i += 4)
68 		nv_wo32(chan, i, 0x0fff0000);
69 	nv_wo32(chan, 0x04e8, 0x00011100);
70 	for (i = 0x0504; i < 0x0544; i += 4)
71 		nv_wo32(chan, i, 0x07ff0000);
72 	nv_wo32(chan, 0x054c, 0x4b7fffff);
73 	nv_wo32(chan, 0x0588, 0x00000080);
74 	nv_wo32(chan, 0x058c, 0x30201000);
75 	nv_wo32(chan, 0x0590, 0x70605040);
76 	nv_wo32(chan, 0x0594, 0xb8a89888);
77 	nv_wo32(chan, 0x0598, 0xf8e8d8c8);
78 	nv_wo32(chan, 0x05ac, 0xb0000000);
79 	for (i = 0x0604; i < 0x0644; i += 4)
80 		nv_wo32(chan, i, 0x00010588);
81 	for (i = 0x0644; i < 0x0684; i += 4)
82 		nv_wo32(chan, i, 0x00030303);
83 	for (i = 0x06c4; i < 0x0704; i += 4)
84 		nv_wo32(chan, i, 0x0008aae4);
85 	for (i = 0x0704; i < 0x0744; i += 4)
86 		nv_wo32(chan, i, 0x01012000);
87 	for (i = 0x0744; i < 0x0784; i += 4)
88 		nv_wo32(chan, i, 0x00080008);
89 	nv_wo32(chan, 0x0860, 0x00040000);
90 	nv_wo32(chan, 0x0864, 0x00010000);
91 	for (i = 0x0868; i < 0x0878; i += 4)
92 		nv_wo32(chan, i, 0x00040004);
93 	for (i = 0x1f1c; i <= 0x308c ; i += 16) {
94 		nv_wo32(chan, i + 0, 0x10700ff9);
95 		nv_wo32(chan, i + 4, 0x0436086c);
96 		nv_wo32(chan, i + 8, 0x000c001b);
97 	}
98 	for (i = 0x30bc; i < 0x30cc; i += 4)
99 		nv_wo32(chan, i, 0x0000ffff);
100 	nv_wo32(chan, 0x3450, 0x3f800000);
101 	nv_wo32(chan, 0x380c, 0x3f800000);
102 	nv_wo32(chan, 0x3820, 0x3f800000);
103 	nv_wo32(chan, 0x384c, 0x40000000);
104 	nv_wo32(chan, 0x3850, 0x3f800000);
105 	nv_wo32(chan, 0x3854, 0x3f000000);
106 	nv_wo32(chan, 0x385c, 0x40000000);
107 	nv_wo32(chan, 0x3860, 0x3f800000);
108 	nv_wo32(chan, 0x3868, 0xbf800000);
109 	nv_wo32(chan, 0x3870, 0xbf800000);
110 	return 0;
111 }
112 
113 static struct nouveau_oclass
114 nv35_graph_cclass = {
115 	.handle = NV_ENGCTX(GR, 0x35),
116 	.ofuncs = &(struct nouveau_ofuncs) {
117 		.ctor = nv35_graph_context_ctor,
118 		.dtor = _nouveau_graph_context_dtor,
119 		.init = nv20_graph_context_init,
120 		.fini = nv20_graph_context_fini,
121 		.rd32 = _nouveau_graph_context_rd32,
122 		.wr32 = _nouveau_graph_context_wr32,
123 	},
124 };
125 
126 /*******************************************************************************
127  * PGRAPH engine/subdev functions
128  ******************************************************************************/
129 
130 static int
nv35_graph_ctor(struct nouveau_object * parent,struct nouveau_object * engine,struct nouveau_oclass * oclass,void * data,u32 size,struct nouveau_object ** pobject)131 nv35_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
132 	       struct nouveau_oclass *oclass, void *data, u32 size,
133 	       struct nouveau_object **pobject)
134 {
135 	struct nv20_graph_priv *priv;
136 	int ret;
137 
138 	ret = nouveau_graph_create(parent, engine, oclass, true, &priv);
139 	*pobject = nv_object(priv);
140 	if (ret)
141 		return ret;
142 
143 	ret = nouveau_gpuobj_new(nv_object(priv), NULL, 32 * 4, 16,
144 				 NVOBJ_FLAG_ZERO_ALLOC, &priv->ctxtab);
145 	if (ret)
146 		return ret;
147 
148 	nv_subdev(priv)->unit = 0x00001000;
149 	nv_subdev(priv)->intr = nv20_graph_intr;
150 	nv_engine(priv)->cclass = &nv35_graph_cclass;
151 	nv_engine(priv)->sclass = nv35_graph_sclass;
152 	nv_engine(priv)->tile_prog = nv20_graph_tile_prog;
153 	return 0;
154 }
155 
156 struct nouveau_oclass
157 nv35_graph_oclass = {
158 	.handle = NV_ENGINE(GR, 0x35),
159 	.ofuncs = &(struct nouveau_ofuncs) {
160 		.ctor = nv35_graph_ctor,
161 		.dtor = nv20_graph_dtor,
162 		.init = nv30_graph_init,
163 		.fini = _nouveau_graph_fini,
164 	},
165 };
166