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 <engine/graph.h>
9
10#include "nv20.h"
11#include "regs.h"
12
13/*******************************************************************************
14 * Graphics object classes
15 ******************************************************************************/
16
17struct nouveau_oclass
18nv25_graph_sclass[] = {
19	{ 0x0012, &nv04_graph_ofuncs, NULL }, /* beta1 */
20	{ 0x0019, &nv04_graph_ofuncs, NULL }, /* clip */
21	{ 0x0030, &nv04_graph_ofuncs, NULL }, /* null */
22	{ 0x0039, &nv04_graph_ofuncs, NULL }, /* m2mf */
23	{ 0x0043, &nv04_graph_ofuncs, NULL }, /* rop */
24	{ 0x0044, &nv04_graph_ofuncs, NULL }, /* patt */
25	{ 0x004a, &nv04_graph_ofuncs, NULL }, /* gdi */
26	{ 0x0062, &nv04_graph_ofuncs, NULL }, /* surf2d */
27	{ 0x0072, &nv04_graph_ofuncs, NULL }, /* beta4 */
28	{ 0x0089, &nv04_graph_ofuncs, NULL }, /* sifm */
29	{ 0x008a, &nv04_graph_ofuncs, NULL }, /* ifc */
30	{ 0x0096, &nv04_graph_ofuncs, NULL }, /* celcius */
31	{ 0x009e, &nv04_graph_ofuncs, NULL }, /* swzsurf */
32	{ 0x009f, &nv04_graph_ofuncs, NULL }, /* imageblit */
33	{ 0x0597, &nv04_graph_ofuncs, NULL }, /* kelvin */
34	{},
35};
36
37/*******************************************************************************
38 * PGRAPH context
39 ******************************************************************************/
40
41static int
42nv25_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, 0x3724,
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, 0x035c, 0xffff0000);
60	nv_wo32(chan, 0x03c0, 0x0fff0000);
61	nv_wo32(chan, 0x03c4, 0x0fff0000);
62	nv_wo32(chan, 0x049c, 0x00000101);
63	nv_wo32(chan, 0x04b0, 0x00000111);
64	nv_wo32(chan, 0x04c8, 0x00000080);
65	nv_wo32(chan, 0x04cc, 0xffff0000);
66	nv_wo32(chan, 0x04d0, 0x00000001);
67	nv_wo32(chan, 0x04e4, 0x44400000);
68	nv_wo32(chan, 0x04fc, 0x4b800000);
69	for (i = 0x0510; i <= 0x051c; i += 4)
70		nv_wo32(chan, i, 0x00030303);
71	for (i = 0x0530; i <= 0x053c; i += 4)
72		nv_wo32(chan, i, 0x00080000);
73	for (i = 0x0548; i <= 0x0554; i += 4)
74		nv_wo32(chan, i, 0x01012000);
75	for (i = 0x0558; i <= 0x0564; i += 4)
76		nv_wo32(chan, i, 0x000105b8);
77	for (i = 0x0568; i <= 0x0574; i += 4)
78		nv_wo32(chan, i, 0x00080008);
79	for (i = 0x0598; i <= 0x05d4; i += 4)
80		nv_wo32(chan, i, 0x07ff0000);
81	nv_wo32(chan, 0x05e0, 0x4b7fffff);
82	nv_wo32(chan, 0x0620, 0x00000080);
83	nv_wo32(chan, 0x0624, 0x30201000);
84	nv_wo32(chan, 0x0628, 0x70605040);
85	nv_wo32(chan, 0x062c, 0xb0a09080);
86	nv_wo32(chan, 0x0630, 0xf0e0d0c0);
87	nv_wo32(chan, 0x0664, 0x00000001);
88	nv_wo32(chan, 0x066c, 0x00004000);
89	nv_wo32(chan, 0x0678, 0x00000001);
90	nv_wo32(chan, 0x0680, 0x00040000);
91	nv_wo32(chan, 0x0684, 0x00010000);
92	for (i = 0x1b04; i <= 0x2374; i += 16) {
93		nv_wo32(chan, (i + 0), 0x10700ff9);
94		nv_wo32(chan, (i + 4), 0x0436086c);
95		nv_wo32(chan, (i + 8), 0x000c001b);
96	}
97	nv_wo32(chan, 0x2704, 0x3f800000);
98	nv_wo32(chan, 0x2718, 0x3f800000);
99	nv_wo32(chan, 0x2744, 0x40000000);
100	nv_wo32(chan, 0x2748, 0x3f800000);
101	nv_wo32(chan, 0x274c, 0x3f000000);
102	nv_wo32(chan, 0x2754, 0x40000000);
103	nv_wo32(chan, 0x2758, 0x3f800000);
104	nv_wo32(chan, 0x2760, 0xbf800000);
105	nv_wo32(chan, 0x2768, 0xbf800000);
106	nv_wo32(chan, 0x308c, 0x000fe000);
107	nv_wo32(chan, 0x3108, 0x000003f8);
108	nv_wo32(chan, 0x3468, 0x002fe000);
109	for (i = 0x3484; i <= 0x34a0; i += 4)
110		nv_wo32(chan, i, 0x001c527c);
111	return 0;
112}
113
114static struct nouveau_oclass
115nv25_graph_cclass = {
116	.handle = NV_ENGCTX(GR, 0x25),
117	.ofuncs = &(struct nouveau_ofuncs) {
118		.ctor = nv25_graph_context_ctor,
119		.dtor = _nouveau_graph_context_dtor,
120		.init = nv20_graph_context_init,
121		.fini = nv20_graph_context_fini,
122		.rd32 = _nouveau_graph_context_rd32,
123		.wr32 = _nouveau_graph_context_wr32,
124	},
125};
126
127/*******************************************************************************
128 * PGRAPH engine/subdev functions
129 ******************************************************************************/
130
131static int
132nv25_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
133	       struct nouveau_oclass *oclass, void *data, u32 size,
134	       struct nouveau_object **pobject)
135{
136	struct nv20_graph_priv *priv;
137	int ret;
138
139	ret = nouveau_graph_create(parent, engine, oclass, true, &priv);
140	*pobject = nv_object(priv);
141	if (ret)
142		return ret;
143
144	ret = nouveau_gpuobj_new(nv_object(priv), NULL, 32 * 4, 16,
145				 NVOBJ_FLAG_ZERO_ALLOC, &priv->ctxtab);
146	if (ret)
147		return ret;
148
149	nv_subdev(priv)->unit = 0x00001000;
150	nv_subdev(priv)->intr = nv20_graph_intr;
151	nv_engine(priv)->cclass = &nv25_graph_cclass;
152	nv_engine(priv)->sclass = nv25_graph_sclass;
153	nv_engine(priv)->tile_prog = nv20_graph_tile_prog;
154	return 0;
155}
156
157struct nouveau_oclass
158nv25_graph_oclass = {
159	.handle = NV_ENGINE(GR, 0x25),
160	.ofuncs = &(struct nouveau_ofuncs) {
161		.ctor = nv25_graph_ctor,
162		.dtor = nv20_graph_dtor,
163		.init = nv20_graph_init,
164		.fini = _nouveau_graph_fini,
165	},
166};
167