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