1 /* 2 * Copyright 2010 Red Hat Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: Ben Skeggs 23 */ 24 #include "ctxgf100.h" 25 26 #include <subdev/fb.h> 27 #include <subdev/mc.h> 28 #include <subdev/timer.h> 29 #include <engine/fifo.h> 30 31 /******************************************************************************* 32 * PGRAPH context register lists 33 ******************************************************************************/ 34 35 static const struct gf100_gr_init 36 gf100_grctx_init_icmd_0[] = { 37 { 0x001000, 1, 0x01, 0x00000004 }, 38 { 0x0000a9, 1, 0x01, 0x0000ffff }, 39 { 0x000038, 1, 0x01, 0x0fac6881 }, 40 { 0x00003d, 1, 0x01, 0x00000001 }, 41 { 0x0000e8, 8, 0x01, 0x00000400 }, 42 { 0x000078, 8, 0x01, 0x00000300 }, 43 { 0x000050, 1, 0x01, 0x00000011 }, 44 { 0x000058, 8, 0x01, 0x00000008 }, 45 { 0x000208, 8, 0x01, 0x00000001 }, 46 { 0x000081, 1, 0x01, 0x00000001 }, 47 { 0x000085, 1, 0x01, 0x00000004 }, 48 { 0x000088, 1, 0x01, 0x00000400 }, 49 { 0x000090, 1, 0x01, 0x00000300 }, 50 { 0x000098, 1, 0x01, 0x00001001 }, 51 { 0x0000e3, 1, 0x01, 0x00000001 }, 52 { 0x0000da, 1, 0x01, 0x00000001 }, 53 { 0x0000f8, 1, 0x01, 0x00000003 }, 54 { 0x0000fa, 1, 0x01, 0x00000001 }, 55 { 0x00009f, 4, 0x01, 0x0000ffff }, 56 { 0x0000b1, 1, 0x01, 0x00000001 }, 57 { 0x0000b2, 40, 0x01, 0x00000000 }, 58 { 0x000210, 8, 0x01, 0x00000040 }, 59 { 0x000218, 8, 0x01, 0x0000c080 }, 60 { 0x0000ad, 1, 0x01, 0x0000013e }, 61 { 0x0000e1, 1, 0x01, 0x00000010 }, 62 { 0x000290, 16, 0x01, 0x00000000 }, 63 { 0x0003b0, 16, 0x01, 0x00000000 }, 64 { 0x0002a0, 16, 0x01, 0x00000000 }, 65 { 0x000420, 16, 0x01, 0x00000000 }, 66 { 0x0002b0, 16, 0x01, 0x00000000 }, 67 { 0x000430, 16, 0x01, 0x00000000 }, 68 { 0x0002c0, 16, 0x01, 0x00000000 }, 69 { 0x0004d0, 16, 0x01, 0x00000000 }, 70 { 0x000720, 16, 0x01, 0x00000000 }, 71 { 0x0008c0, 16, 0x01, 0x00000000 }, 72 { 0x000890, 16, 0x01, 0x00000000 }, 73 { 0x0008e0, 16, 0x01, 0x00000000 }, 74 { 0x0008a0, 16, 0x01, 0x00000000 }, 75 { 0x0008f0, 16, 0x01, 0x00000000 }, 76 { 0x00094c, 1, 0x01, 0x000000ff }, 77 { 0x00094d, 1, 0x01, 0xffffffff }, 78 { 0x00094e, 1, 0x01, 0x00000002 }, 79 { 0x0002ec, 1, 0x01, 0x00000001 }, 80 { 0x000303, 1, 0x01, 0x00000001 }, 81 { 0x0002e6, 1, 0x01, 0x00000001 }, 82 { 0x000466, 1, 0x01, 0x00000052 }, 83 { 0x000301, 1, 0x01, 0x3f800000 }, 84 { 0x000304, 1, 0x01, 0x30201000 }, 85 { 0x000305, 1, 0x01, 0x70605040 }, 86 { 0x000306, 1, 0x01, 0xb8a89888 }, 87 { 0x000307, 1, 0x01, 0xf8e8d8c8 }, 88 { 0x00030a, 1, 0x01, 0x00ffff00 }, 89 { 0x00030b, 1, 0x01, 0x0000001a }, 90 { 0x00030c, 1, 0x01, 0x00000001 }, 91 { 0x000318, 1, 0x01, 0x00000001 }, 92 { 0x000340, 1, 0x01, 0x00000000 }, 93 { 0x000375, 1, 0x01, 0x00000001 }, 94 { 0x000351, 1, 0x01, 0x00000100 }, 95 { 0x00037d, 1, 0x01, 0x00000006 }, 96 { 0x0003a0, 1, 0x01, 0x00000002 }, 97 { 0x0003aa, 1, 0x01, 0x00000001 }, 98 { 0x0003a9, 1, 0x01, 0x00000001 }, 99 { 0x000380, 1, 0x01, 0x00000001 }, 100 { 0x000360, 1, 0x01, 0x00000040 }, 101 { 0x000366, 2, 0x01, 0x00000000 }, 102 { 0x000368, 1, 0x01, 0x00001fff }, 103 { 0x000370, 2, 0x01, 0x00000000 }, 104 { 0x000372, 1, 0x01, 0x003fffff }, 105 { 0x00037a, 1, 0x01, 0x00000012 }, 106 { 0x0005e0, 5, 0x01, 0x00000022 }, 107 { 0x000619, 1, 0x01, 0x00000003 }, 108 { 0x000811, 1, 0x01, 0x00000003 }, 109 { 0x000812, 1, 0x01, 0x00000004 }, 110 { 0x000813, 1, 0x01, 0x00000006 }, 111 { 0x000814, 1, 0x01, 0x00000008 }, 112 { 0x000815, 1, 0x01, 0x0000000b }, 113 { 0x000800, 6, 0x01, 0x00000001 }, 114 { 0x000632, 1, 0x01, 0x00000001 }, 115 { 0x000633, 1, 0x01, 0x00000002 }, 116 { 0x000634, 1, 0x01, 0x00000003 }, 117 { 0x000635, 1, 0x01, 0x00000004 }, 118 { 0x000654, 1, 0x01, 0x3f800000 }, 119 { 0x000657, 1, 0x01, 0x3f800000 }, 120 { 0x000655, 2, 0x01, 0x3f800000 }, 121 { 0x0006cd, 1, 0x01, 0x3f800000 }, 122 { 0x0007f5, 1, 0x01, 0x3f800000 }, 123 { 0x0007dc, 1, 0x01, 0x39291909 }, 124 { 0x0007dd, 1, 0x01, 0x79695949 }, 125 { 0x0007de, 1, 0x01, 0xb9a99989 }, 126 { 0x0007df, 1, 0x01, 0xf9e9d9c9 }, 127 { 0x0007e8, 1, 0x01, 0x00003210 }, 128 { 0x0007e9, 1, 0x01, 0x00007654 }, 129 { 0x0007ea, 1, 0x01, 0x00000098 }, 130 { 0x0007ec, 1, 0x01, 0x39291909 }, 131 { 0x0007ed, 1, 0x01, 0x79695949 }, 132 { 0x0007ee, 1, 0x01, 0xb9a99989 }, 133 { 0x0007ef, 1, 0x01, 0xf9e9d9c9 }, 134 { 0x0007f0, 1, 0x01, 0x00003210 }, 135 { 0x0007f1, 1, 0x01, 0x00007654 }, 136 { 0x0007f2, 1, 0x01, 0x00000098 }, 137 { 0x0005a5, 1, 0x01, 0x00000001 }, 138 { 0x000980, 128, 0x01, 0x00000000 }, 139 { 0x000468, 1, 0x01, 0x00000004 }, 140 { 0x00046c, 1, 0x01, 0x00000001 }, 141 { 0x000470, 96, 0x01, 0x00000000 }, 142 { 0x000510, 16, 0x01, 0x3f800000 }, 143 { 0x000520, 1, 0x01, 0x000002b6 }, 144 { 0x000529, 1, 0x01, 0x00000001 }, 145 { 0x000530, 16, 0x01, 0xffff0000 }, 146 { 0x000585, 1, 0x01, 0x0000003f }, 147 { 0x000576, 1, 0x01, 0x00000003 }, 148 { 0x000586, 1, 0x01, 0x00000040 }, 149 { 0x000582, 2, 0x01, 0x00000080 }, 150 { 0x0005c2, 1, 0x01, 0x00000001 }, 151 { 0x000638, 2, 0x01, 0x00000001 }, 152 { 0x00063a, 1, 0x01, 0x00000002 }, 153 { 0x00063b, 2, 0x01, 0x00000001 }, 154 { 0x00063d, 1, 0x01, 0x00000002 }, 155 { 0x00063e, 1, 0x01, 0x00000001 }, 156 { 0x0008b8, 8, 0x01, 0x00000001 }, 157 { 0x000900, 8, 0x01, 0x00000001 }, 158 { 0x000908, 8, 0x01, 0x00000002 }, 159 { 0x000910, 16, 0x01, 0x00000001 }, 160 { 0x000920, 8, 0x01, 0x00000002 }, 161 { 0x000928, 8, 0x01, 0x00000001 }, 162 { 0x000648, 9, 0x01, 0x00000001 }, 163 { 0x000658, 1, 0x01, 0x0000000f }, 164 { 0x0007ff, 1, 0x01, 0x0000000a }, 165 { 0x00066a, 1, 0x01, 0x40000000 }, 166 { 0x00066b, 1, 0x01, 0x10000000 }, 167 { 0x00066c, 2, 0x01, 0xffff0000 }, 168 { 0x0007af, 2, 0x01, 0x00000008 }, 169 { 0x0007f6, 1, 0x01, 0x00000001 }, 170 { 0x0006b2, 1, 0x01, 0x00000055 }, 171 { 0x0007ad, 1, 0x01, 0x00000003 }, 172 { 0x000937, 1, 0x01, 0x00000001 }, 173 { 0x000971, 1, 0x01, 0x00000008 }, 174 { 0x000972, 1, 0x01, 0x00000040 }, 175 { 0x000973, 1, 0x01, 0x0000012c }, 176 { 0x00097c, 1, 0x01, 0x00000040 }, 177 { 0x000979, 1, 0x01, 0x00000003 }, 178 { 0x000975, 1, 0x01, 0x00000020 }, 179 { 0x000976, 1, 0x01, 0x00000001 }, 180 { 0x000977, 1, 0x01, 0x00000020 }, 181 { 0x000978, 1, 0x01, 0x00000001 }, 182 { 0x000957, 1, 0x01, 0x00000003 }, 183 { 0x00095e, 1, 0x01, 0x20164010 }, 184 { 0x00095f, 1, 0x01, 0x00000020 }, 185 { 0x000683, 1, 0x01, 0x00000006 }, 186 { 0x000685, 1, 0x01, 0x003fffff }, 187 { 0x000687, 1, 0x01, 0x00000c48 }, 188 { 0x0006a0, 1, 0x01, 0x00000005 }, 189 { 0x000840, 1, 0x01, 0x00300008 }, 190 { 0x000841, 1, 0x01, 0x04000080 }, 191 { 0x000842, 1, 0x01, 0x00300008 }, 192 { 0x000843, 1, 0x01, 0x04000080 }, 193 { 0x000818, 8, 0x01, 0x00000000 }, 194 { 0x000848, 16, 0x01, 0x00000000 }, 195 { 0x000738, 1, 0x01, 0x00000000 }, 196 { 0x0006aa, 1, 0x01, 0x00000001 }, 197 { 0x0006ab, 1, 0x01, 0x00000002 }, 198 { 0x0006ac, 1, 0x01, 0x00000080 }, 199 { 0x0006ad, 2, 0x01, 0x00000100 }, 200 { 0x0006b1, 1, 0x01, 0x00000011 }, 201 { 0x0006bb, 1, 0x01, 0x000000cf }, 202 { 0x0006ce, 1, 0x01, 0x2a712488 }, 203 { 0x000739, 1, 0x01, 0x4085c000 }, 204 { 0x00073a, 1, 0x01, 0x00000080 }, 205 { 0x000786, 1, 0x01, 0x80000100 }, 206 { 0x00073c, 1, 0x01, 0x00010100 }, 207 { 0x00073d, 1, 0x01, 0x02800000 }, 208 { 0x000787, 1, 0x01, 0x000000cf }, 209 { 0x00078c, 1, 0x01, 0x00000008 }, 210 { 0x000792, 1, 0x01, 0x00000001 }, 211 { 0x000794, 3, 0x01, 0x00000001 }, 212 { 0x000797, 1, 0x01, 0x000000cf }, 213 { 0x000836, 1, 0x01, 0x00000001 }, 214 { 0x00079a, 1, 0x01, 0x00000002 }, 215 { 0x000833, 1, 0x01, 0x04444480 }, 216 { 0x0007a1, 1, 0x01, 0x00000001 }, 217 { 0x0007a3, 3, 0x01, 0x00000001 }, 218 { 0x000831, 1, 0x01, 0x00000004 }, 219 { 0x00080c, 1, 0x01, 0x00000002 }, 220 { 0x00080d, 2, 0x01, 0x00000100 }, 221 { 0x00080f, 1, 0x01, 0x00000001 }, 222 { 0x000823, 1, 0x01, 0x00000002 }, 223 { 0x000824, 2, 0x01, 0x00000100 }, 224 { 0x000826, 1, 0x01, 0x00000001 }, 225 { 0x00095d, 1, 0x01, 0x00000001 }, 226 { 0x00082b, 1, 0x01, 0x00000004 }, 227 { 0x000942, 1, 0x01, 0x00010001 }, 228 { 0x000943, 1, 0x01, 0x00000001 }, 229 { 0x000944, 1, 0x01, 0x00000022 }, 230 { 0x0007c5, 1, 0x01, 0x00010001 }, 231 { 0x000834, 1, 0x01, 0x00000001 }, 232 { 0x0007c7, 1, 0x01, 0x00000001 }, 233 { 0x00c1b0, 8, 0x01, 0x0000000f }, 234 { 0x00c1b8, 1, 0x01, 0x0fac6881 }, 235 { 0x00c1b9, 1, 0x01, 0x00fac688 }, 236 { 0x01e100, 1, 0x01, 0x00000001 }, 237 { 0x001000, 1, 0x01, 0x00000002 }, 238 { 0x0006aa, 1, 0x01, 0x00000001 }, 239 { 0x0006ad, 2, 0x01, 0x00000100 }, 240 { 0x0006b1, 1, 0x01, 0x00000011 }, 241 { 0x00078c, 1, 0x01, 0x00000008 }, 242 { 0x000792, 1, 0x01, 0x00000001 }, 243 { 0x000794, 3, 0x01, 0x00000001 }, 244 { 0x000797, 1, 0x01, 0x000000cf }, 245 { 0x00079a, 1, 0x01, 0x00000002 }, 246 { 0x000833, 1, 0x01, 0x04444480 }, 247 { 0x0007a1, 1, 0x01, 0x00000001 }, 248 { 0x0007a3, 3, 0x01, 0x00000001 }, 249 { 0x000831, 1, 0x01, 0x00000004 }, 250 { 0x01e100, 1, 0x01, 0x00000001 }, 251 { 0x001000, 1, 0x01, 0x00000014 }, 252 { 0x000351, 1, 0x01, 0x00000100 }, 253 { 0x000957, 1, 0x01, 0x00000003 }, 254 { 0x00095d, 1, 0x01, 0x00000001 }, 255 { 0x00082b, 1, 0x01, 0x00000004 }, 256 { 0x000942, 1, 0x01, 0x00010001 }, 257 { 0x000943, 1, 0x01, 0x00000001 }, 258 { 0x0007c5, 1, 0x01, 0x00010001 }, 259 { 0x000834, 1, 0x01, 0x00000001 }, 260 { 0x0007c7, 1, 0x01, 0x00000001 }, 261 { 0x01e100, 1, 0x01, 0x00000001 }, 262 { 0x001000, 1, 0x01, 0x00000001 }, 263 { 0x00080c, 1, 0x01, 0x00000002 }, 264 { 0x00080d, 2, 0x01, 0x00000100 }, 265 { 0x00080f, 1, 0x01, 0x00000001 }, 266 { 0x000823, 1, 0x01, 0x00000002 }, 267 { 0x000824, 2, 0x01, 0x00000100 }, 268 { 0x000826, 1, 0x01, 0x00000001 }, 269 { 0x01e100, 1, 0x01, 0x00000001 }, 270 {} 271 }; 272 273 const struct gf100_gr_pack 274 gf100_grctx_pack_icmd[] = { 275 { gf100_grctx_init_icmd_0 }, 276 {} 277 }; 278 279 static const struct gf100_gr_init 280 gf100_grctx_init_9097_0[] = { 281 { 0x000800, 8, 0x40, 0x00000000 }, 282 { 0x000804, 8, 0x40, 0x00000000 }, 283 { 0x000808, 8, 0x40, 0x00000400 }, 284 { 0x00080c, 8, 0x40, 0x00000300 }, 285 { 0x000810, 1, 0x04, 0x000000cf }, 286 { 0x000850, 7, 0x40, 0x00000000 }, 287 { 0x000814, 8, 0x40, 0x00000040 }, 288 { 0x000818, 8, 0x40, 0x00000001 }, 289 { 0x00081c, 8, 0x40, 0x00000000 }, 290 { 0x000820, 8, 0x40, 0x00000000 }, 291 { 0x002700, 8, 0x20, 0x00000000 }, 292 { 0x002704, 8, 0x20, 0x00000000 }, 293 { 0x002708, 8, 0x20, 0x00000000 }, 294 { 0x00270c, 8, 0x20, 0x00000000 }, 295 { 0x002710, 8, 0x20, 0x00014000 }, 296 { 0x002714, 8, 0x20, 0x00000040 }, 297 { 0x001c00, 16, 0x10, 0x00000000 }, 298 { 0x001c04, 16, 0x10, 0x00000000 }, 299 { 0x001c08, 16, 0x10, 0x00000000 }, 300 { 0x001c0c, 16, 0x10, 0x00000000 }, 301 { 0x001d00, 16, 0x10, 0x00000000 }, 302 { 0x001d04, 16, 0x10, 0x00000000 }, 303 { 0x001d08, 16, 0x10, 0x00000000 }, 304 { 0x001d0c, 16, 0x10, 0x00000000 }, 305 { 0x001f00, 16, 0x08, 0x00000000 }, 306 { 0x001f04, 16, 0x08, 0x00000000 }, 307 { 0x001f80, 16, 0x08, 0x00000000 }, 308 { 0x001f84, 16, 0x08, 0x00000000 }, 309 { 0x002200, 5, 0x10, 0x00000022 }, 310 { 0x002000, 1, 0x04, 0x00000000 }, 311 { 0x002040, 1, 0x04, 0x00000011 }, 312 { 0x002080, 1, 0x04, 0x00000020 }, 313 { 0x0020c0, 1, 0x04, 0x00000030 }, 314 { 0x002100, 1, 0x04, 0x00000040 }, 315 { 0x002140, 1, 0x04, 0x00000051 }, 316 { 0x00200c, 6, 0x40, 0x00000001 }, 317 { 0x002010, 1, 0x04, 0x00000000 }, 318 { 0x002050, 1, 0x04, 0x00000000 }, 319 { 0x002090, 1, 0x04, 0x00000001 }, 320 { 0x0020d0, 1, 0x04, 0x00000002 }, 321 { 0x002110, 1, 0x04, 0x00000003 }, 322 { 0x002150, 1, 0x04, 0x00000004 }, 323 { 0x000380, 4, 0x20, 0x00000000 }, 324 { 0x000384, 4, 0x20, 0x00000000 }, 325 { 0x000388, 4, 0x20, 0x00000000 }, 326 { 0x00038c, 4, 0x20, 0x00000000 }, 327 { 0x000700, 4, 0x10, 0x00000000 }, 328 { 0x000704, 4, 0x10, 0x00000000 }, 329 { 0x000708, 4, 0x10, 0x00000000 }, 330 { 0x002800, 128, 0x04, 0x00000000 }, 331 { 0x000a00, 16, 0x20, 0x00000000 }, 332 { 0x000a04, 16, 0x20, 0x00000000 }, 333 { 0x000a08, 16, 0x20, 0x00000000 }, 334 { 0x000a0c, 16, 0x20, 0x00000000 }, 335 { 0x000a10, 16, 0x20, 0x00000000 }, 336 { 0x000a14, 16, 0x20, 0x00000000 }, 337 { 0x000c00, 16, 0x10, 0x00000000 }, 338 { 0x000c04, 16, 0x10, 0x00000000 }, 339 { 0x000c08, 16, 0x10, 0x00000000 }, 340 { 0x000c0c, 16, 0x10, 0x3f800000 }, 341 { 0x000d00, 8, 0x08, 0xffff0000 }, 342 { 0x000d04, 8, 0x08, 0xffff0000 }, 343 { 0x000e00, 16, 0x10, 0x00000000 }, 344 { 0x000e04, 16, 0x10, 0xffff0000 }, 345 { 0x000e08, 16, 0x10, 0xffff0000 }, 346 { 0x000d40, 4, 0x08, 0x00000000 }, 347 { 0x000d44, 4, 0x08, 0x00000000 }, 348 { 0x001e00, 8, 0x20, 0x00000001 }, 349 { 0x001e04, 8, 0x20, 0x00000001 }, 350 { 0x001e08, 8, 0x20, 0x00000002 }, 351 { 0x001e0c, 8, 0x20, 0x00000001 }, 352 { 0x001e10, 8, 0x20, 0x00000001 }, 353 { 0x001e14, 8, 0x20, 0x00000002 }, 354 { 0x001e18, 8, 0x20, 0x00000001 }, 355 { 0x003400, 128, 0x04, 0x00000000 }, 356 { 0x00030c, 1, 0x04, 0x00000001 }, 357 { 0x001944, 1, 0x04, 0x00000000 }, 358 { 0x001514, 1, 0x04, 0x00000000 }, 359 { 0x000d68, 1, 0x04, 0x0000ffff }, 360 { 0x00121c, 1, 0x04, 0x0fac6881 }, 361 { 0x000fac, 1, 0x04, 0x00000001 }, 362 { 0x001538, 1, 0x04, 0x00000001 }, 363 { 0x000fe0, 2, 0x04, 0x00000000 }, 364 { 0x000fe8, 1, 0x04, 0x00000014 }, 365 { 0x000fec, 1, 0x04, 0x00000040 }, 366 { 0x000ff0, 1, 0x04, 0x00000000 }, 367 { 0x00179c, 1, 0x04, 0x00000000 }, 368 { 0x001228, 1, 0x04, 0x00000400 }, 369 { 0x00122c, 1, 0x04, 0x00000300 }, 370 { 0x001230, 1, 0x04, 0x00010001 }, 371 { 0x0007f8, 1, 0x04, 0x00000000 }, 372 { 0x0015b4, 1, 0x04, 0x00000001 }, 373 { 0x0015cc, 1, 0x04, 0x00000000 }, 374 { 0x001534, 1, 0x04, 0x00000000 }, 375 { 0x000fb0, 1, 0x04, 0x00000000 }, 376 { 0x0015d0, 1, 0x04, 0x00000000 }, 377 { 0x00153c, 1, 0x04, 0x00000000 }, 378 { 0x0016b4, 1, 0x04, 0x00000003 }, 379 { 0x000fbc, 4, 0x04, 0x0000ffff }, 380 { 0x000df8, 2, 0x04, 0x00000000 }, 381 { 0x001948, 1, 0x04, 0x00000000 }, 382 { 0x001970, 1, 0x04, 0x00000001 }, 383 { 0x00161c, 1, 0x04, 0x000009f0 }, 384 { 0x000dcc, 1, 0x04, 0x00000010 }, 385 { 0x00163c, 1, 0x04, 0x00000000 }, 386 { 0x0015e4, 1, 0x04, 0x00000000 }, 387 { 0x001160, 32, 0x04, 0x25e00040 }, 388 { 0x001880, 32, 0x04, 0x00000000 }, 389 { 0x000f84, 2, 0x04, 0x00000000 }, 390 { 0x0017c8, 2, 0x04, 0x00000000 }, 391 { 0x0017d0, 1, 0x04, 0x000000ff }, 392 { 0x0017d4, 1, 0x04, 0xffffffff }, 393 { 0x0017d8, 1, 0x04, 0x00000002 }, 394 { 0x0017dc, 1, 0x04, 0x00000000 }, 395 { 0x0015f4, 2, 0x04, 0x00000000 }, 396 { 0x001434, 2, 0x04, 0x00000000 }, 397 { 0x000d74, 1, 0x04, 0x00000000 }, 398 { 0x000dec, 1, 0x04, 0x00000001 }, 399 { 0x0013a4, 1, 0x04, 0x00000000 }, 400 { 0x001318, 1, 0x04, 0x00000001 }, 401 { 0x001644, 1, 0x04, 0x00000000 }, 402 { 0x000748, 1, 0x04, 0x00000000 }, 403 { 0x000de8, 1, 0x04, 0x00000000 }, 404 { 0x001648, 1, 0x04, 0x00000000 }, 405 { 0x0012a4, 1, 0x04, 0x00000000 }, 406 { 0x001120, 4, 0x04, 0x00000000 }, 407 { 0x001118, 1, 0x04, 0x00000000 }, 408 { 0x00164c, 1, 0x04, 0x00000000 }, 409 { 0x001658, 1, 0x04, 0x00000000 }, 410 { 0x001910, 1, 0x04, 0x00000290 }, 411 { 0x001518, 1, 0x04, 0x00000000 }, 412 { 0x00165c, 1, 0x04, 0x00000001 }, 413 { 0x001520, 1, 0x04, 0x00000000 }, 414 { 0x001604, 1, 0x04, 0x00000000 }, 415 { 0x001570, 1, 0x04, 0x00000000 }, 416 { 0x0013b0, 2, 0x04, 0x3f800000 }, 417 { 0x00020c, 1, 0x04, 0x00000000 }, 418 { 0x001670, 1, 0x04, 0x30201000 }, 419 { 0x001674, 1, 0x04, 0x70605040 }, 420 { 0x001678, 1, 0x04, 0xb8a89888 }, 421 { 0x00167c, 1, 0x04, 0xf8e8d8c8 }, 422 { 0x00166c, 1, 0x04, 0x00000000 }, 423 { 0x001680, 1, 0x04, 0x00ffff00 }, 424 { 0x0012d0, 1, 0x04, 0x00000003 }, 425 { 0x0012d4, 1, 0x04, 0x00000002 }, 426 { 0x001684, 2, 0x04, 0x00000000 }, 427 { 0x000dac, 2, 0x04, 0x00001b02 }, 428 { 0x000db4, 1, 0x04, 0x00000000 }, 429 { 0x00168c, 1, 0x04, 0x00000000 }, 430 { 0x0015bc, 1, 0x04, 0x00000000 }, 431 { 0x00156c, 1, 0x04, 0x00000000 }, 432 { 0x00187c, 1, 0x04, 0x00000000 }, 433 { 0x001110, 1, 0x04, 0x00000001 }, 434 { 0x000dc0, 3, 0x04, 0x00000000 }, 435 { 0x001234, 1, 0x04, 0x00000000 }, 436 { 0x001690, 1, 0x04, 0x00000000 }, 437 { 0x0012ac, 1, 0x04, 0x00000001 }, 438 { 0x0002c4, 1, 0x04, 0x00000000 }, 439 { 0x000790, 5, 0x04, 0x00000000 }, 440 { 0x00077c, 1, 0x04, 0x00000000 }, 441 { 0x001000, 1, 0x04, 0x00000010 }, 442 { 0x0010fc, 1, 0x04, 0x00000000 }, 443 { 0x001290, 1, 0x04, 0x00000000 }, 444 { 0x000218, 1, 0x04, 0x00000010 }, 445 { 0x0012d8, 1, 0x04, 0x00000000 }, 446 { 0x0012dc, 1, 0x04, 0x00000010 }, 447 { 0x000d94, 1, 0x04, 0x00000001 }, 448 { 0x00155c, 2, 0x04, 0x00000000 }, 449 { 0x001564, 1, 0x04, 0x00001fff }, 450 { 0x001574, 2, 0x04, 0x00000000 }, 451 { 0x00157c, 1, 0x04, 0x003fffff }, 452 { 0x001354, 1, 0x04, 0x00000000 }, 453 { 0x001664, 1, 0x04, 0x00000000 }, 454 { 0x001610, 1, 0x04, 0x00000012 }, 455 { 0x001608, 2, 0x04, 0x00000000 }, 456 { 0x00162c, 1, 0x04, 0x00000003 }, 457 { 0x000210, 1, 0x04, 0x00000000 }, 458 { 0x000320, 1, 0x04, 0x00000000 }, 459 { 0x000324, 6, 0x04, 0x3f800000 }, 460 { 0x000750, 1, 0x04, 0x00000000 }, 461 { 0x000760, 1, 0x04, 0x39291909 }, 462 { 0x000764, 1, 0x04, 0x79695949 }, 463 { 0x000768, 1, 0x04, 0xb9a99989 }, 464 { 0x00076c, 1, 0x04, 0xf9e9d9c9 }, 465 { 0x000770, 1, 0x04, 0x30201000 }, 466 { 0x000774, 1, 0x04, 0x70605040 }, 467 { 0x000778, 1, 0x04, 0x00009080 }, 468 { 0x000780, 1, 0x04, 0x39291909 }, 469 { 0x000784, 1, 0x04, 0x79695949 }, 470 { 0x000788, 1, 0x04, 0xb9a99989 }, 471 { 0x00078c, 1, 0x04, 0xf9e9d9c9 }, 472 { 0x0007d0, 1, 0x04, 0x30201000 }, 473 { 0x0007d4, 1, 0x04, 0x70605040 }, 474 { 0x0007d8, 1, 0x04, 0x00009080 }, 475 { 0x00037c, 1, 0x04, 0x00000001 }, 476 { 0x000740, 2, 0x04, 0x00000000 }, 477 { 0x002600, 1, 0x04, 0x00000000 }, 478 { 0x001918, 1, 0x04, 0x00000000 }, 479 { 0x00191c, 1, 0x04, 0x00000900 }, 480 { 0x001920, 1, 0x04, 0x00000405 }, 481 { 0x001308, 1, 0x04, 0x00000001 }, 482 { 0x001924, 1, 0x04, 0x00000000 }, 483 { 0x0013ac, 1, 0x04, 0x00000000 }, 484 { 0x00192c, 1, 0x04, 0x00000001 }, 485 { 0x00193c, 1, 0x04, 0x00002c1c }, 486 { 0x000d7c, 1, 0x04, 0x00000000 }, 487 { 0x000f8c, 1, 0x04, 0x00000000 }, 488 { 0x0002c0, 1, 0x04, 0x00000001 }, 489 { 0x001510, 1, 0x04, 0x00000000 }, 490 { 0x001940, 1, 0x04, 0x00000000 }, 491 { 0x000ff4, 2, 0x04, 0x00000000 }, 492 { 0x00194c, 2, 0x04, 0x00000000 }, 493 { 0x001968, 1, 0x04, 0x00000000 }, 494 { 0x001590, 1, 0x04, 0x0000003f }, 495 { 0x0007e8, 4, 0x04, 0x00000000 }, 496 { 0x00196c, 1, 0x04, 0x00000011 }, 497 { 0x00197c, 1, 0x04, 0x00000000 }, 498 { 0x000fcc, 2, 0x04, 0x00000000 }, 499 { 0x0002d8, 1, 0x04, 0x00000040 }, 500 { 0x001980, 1, 0x04, 0x00000080 }, 501 { 0x001504, 1, 0x04, 0x00000080 }, 502 { 0x001984, 1, 0x04, 0x00000000 }, 503 { 0x000300, 1, 0x04, 0x00000001 }, 504 { 0x0013a8, 1, 0x04, 0x00000000 }, 505 { 0x0012ec, 1, 0x04, 0x00000000 }, 506 { 0x001310, 1, 0x04, 0x00000000 }, 507 { 0x001314, 1, 0x04, 0x00000001 }, 508 { 0x001380, 1, 0x04, 0x00000000 }, 509 { 0x001384, 4, 0x04, 0x00000001 }, 510 { 0x001394, 1, 0x04, 0x00000000 }, 511 { 0x00139c, 1, 0x04, 0x00000000 }, 512 { 0x001398, 1, 0x04, 0x00000000 }, 513 { 0x001594, 1, 0x04, 0x00000000 }, 514 { 0x001598, 4, 0x04, 0x00000001 }, 515 { 0x000f54, 3, 0x04, 0x00000000 }, 516 { 0x0019bc, 1, 0x04, 0x00000000 }, 517 { 0x000f9c, 2, 0x04, 0x00000000 }, 518 { 0x0012cc, 1, 0x04, 0x00000000 }, 519 { 0x0012e8, 1, 0x04, 0x00000000 }, 520 { 0x00130c, 1, 0x04, 0x00000001 }, 521 { 0x001360, 8, 0x04, 0x00000000 }, 522 { 0x00133c, 2, 0x04, 0x00000001 }, 523 { 0x001344, 1, 0x04, 0x00000002 }, 524 { 0x001348, 2, 0x04, 0x00000001 }, 525 { 0x001350, 1, 0x04, 0x00000002 }, 526 { 0x001358, 1, 0x04, 0x00000001 }, 527 { 0x0012e4, 1, 0x04, 0x00000000 }, 528 { 0x00131c, 4, 0x04, 0x00000000 }, 529 { 0x0019c0, 1, 0x04, 0x00000000 }, 530 { 0x001140, 1, 0x04, 0x00000000 }, 531 { 0x0019c4, 1, 0x04, 0x00000000 }, 532 { 0x0019c8, 1, 0x04, 0x00001500 }, 533 { 0x00135c, 1, 0x04, 0x00000000 }, 534 { 0x000f90, 1, 0x04, 0x00000000 }, 535 { 0x0019e0, 8, 0x04, 0x00000001 }, 536 { 0x0019cc, 1, 0x04, 0x00000001 }, 537 { 0x0015b8, 1, 0x04, 0x00000000 }, 538 { 0x001a00, 1, 0x04, 0x00001111 }, 539 { 0x001a04, 7, 0x04, 0x00000000 }, 540 { 0x000d6c, 2, 0x04, 0xffff0000 }, 541 { 0x0010f8, 1, 0x04, 0x00001010 }, 542 { 0x000d80, 5, 0x04, 0x00000000 }, 543 { 0x000da0, 1, 0x04, 0x00000000 }, 544 { 0x001508, 1, 0x04, 0x80000000 }, 545 { 0x00150c, 1, 0x04, 0x40000000 }, 546 { 0x001668, 1, 0x04, 0x00000000 }, 547 { 0x000318, 2, 0x04, 0x00000008 }, 548 { 0x000d9c, 1, 0x04, 0x00000001 }, 549 { 0x0007dc, 1, 0x04, 0x00000000 }, 550 { 0x00074c, 1, 0x04, 0x00000055 }, 551 { 0x001420, 1, 0x04, 0x00000003 }, 552 { 0x0017bc, 2, 0x04, 0x00000000 }, 553 { 0x0017c4, 1, 0x04, 0x00000001 }, 554 { 0x001008, 1, 0x04, 0x00000008 }, 555 { 0x00100c, 1, 0x04, 0x00000040 }, 556 { 0x001010, 1, 0x04, 0x0000012c }, 557 { 0x000d60, 1, 0x04, 0x00000040 }, 558 { 0x00075c, 1, 0x04, 0x00000003 }, 559 { 0x001018, 1, 0x04, 0x00000020 }, 560 { 0x00101c, 1, 0x04, 0x00000001 }, 561 { 0x001020, 1, 0x04, 0x00000020 }, 562 { 0x001024, 1, 0x04, 0x00000001 }, 563 { 0x001444, 3, 0x04, 0x00000000 }, 564 { 0x000360, 1, 0x04, 0x20164010 }, 565 { 0x000364, 1, 0x04, 0x00000020 }, 566 { 0x000368, 1, 0x04, 0x00000000 }, 567 { 0x000de4, 1, 0x04, 0x00000000 }, 568 { 0x000204, 1, 0x04, 0x00000006 }, 569 { 0x000208, 1, 0x04, 0x00000000 }, 570 { 0x0002cc, 1, 0x04, 0x003fffff }, 571 { 0x0002d0, 1, 0x04, 0x00000c48 }, 572 { 0x001220, 1, 0x04, 0x00000005 }, 573 { 0x000fdc, 1, 0x04, 0x00000000 }, 574 { 0x000f98, 1, 0x04, 0x00300008 }, 575 { 0x001284, 1, 0x04, 0x04000080 }, 576 { 0x001450, 1, 0x04, 0x00300008 }, 577 { 0x001454, 1, 0x04, 0x04000080 }, 578 { 0x000214, 1, 0x04, 0x00000000 }, 579 {} 580 }; 581 582 const struct gf100_gr_init 583 gf100_grctx_init_902d_0[] = { 584 { 0x000200, 1, 0x04, 0x000000cf }, 585 { 0x000204, 1, 0x04, 0x00000001 }, 586 { 0x000208, 1, 0x04, 0x00000020 }, 587 { 0x00020c, 1, 0x04, 0x00000001 }, 588 { 0x000210, 1, 0x04, 0x00000000 }, 589 { 0x000214, 1, 0x04, 0x00000080 }, 590 { 0x000218, 2, 0x04, 0x00000100 }, 591 { 0x000220, 2, 0x04, 0x00000000 }, 592 { 0x000230, 1, 0x04, 0x000000cf }, 593 { 0x000234, 1, 0x04, 0x00000001 }, 594 { 0x000238, 1, 0x04, 0x00000020 }, 595 { 0x00023c, 1, 0x04, 0x00000001 }, 596 { 0x000244, 1, 0x04, 0x00000080 }, 597 { 0x000248, 2, 0x04, 0x00000100 }, 598 {} 599 }; 600 601 const struct gf100_gr_init 602 gf100_grctx_init_9039_0[] = { 603 { 0x00030c, 3, 0x04, 0x00000000 }, 604 { 0x000320, 1, 0x04, 0x00000000 }, 605 { 0x000238, 2, 0x04, 0x00000000 }, 606 { 0x000318, 2, 0x04, 0x00000000 }, 607 {} 608 }; 609 610 const struct gf100_gr_init 611 gf100_grctx_init_90c0_0[] = { 612 { 0x00270c, 8, 0x20, 0x00000000 }, 613 { 0x00030c, 1, 0x04, 0x00000001 }, 614 { 0x001944, 1, 0x04, 0x00000000 }, 615 { 0x000758, 1, 0x04, 0x00000100 }, 616 { 0x0002c4, 1, 0x04, 0x00000000 }, 617 { 0x000790, 5, 0x04, 0x00000000 }, 618 { 0x00077c, 1, 0x04, 0x00000000 }, 619 { 0x000204, 3, 0x04, 0x00000000 }, 620 { 0x000214, 1, 0x04, 0x00000000 }, 621 { 0x00024c, 1, 0x04, 0x00000000 }, 622 { 0x000d94, 1, 0x04, 0x00000001 }, 623 { 0x001608, 2, 0x04, 0x00000000 }, 624 { 0x001664, 1, 0x04, 0x00000000 }, 625 {} 626 }; 627 628 const struct gf100_gr_pack 629 gf100_grctx_pack_mthd[] = { 630 { gf100_grctx_init_9097_0, 0x9097 }, 631 { gf100_grctx_init_902d_0, 0x902d }, 632 { gf100_grctx_init_9039_0, 0x9039 }, 633 { gf100_grctx_init_90c0_0, 0x90c0 }, 634 {} 635 }; 636 637 const struct gf100_gr_init 638 gf100_grctx_init_main_0[] = { 639 { 0x400204, 2, 0x04, 0x00000000 }, 640 {} 641 }; 642 643 const struct gf100_gr_init 644 gf100_grctx_init_fe_0[] = { 645 { 0x404004, 11, 0x04, 0x00000000 }, 646 { 0x404044, 1, 0x04, 0x00000000 }, 647 { 0x404094, 13, 0x04, 0x00000000 }, 648 { 0x4040c8, 1, 0x04, 0xf0000087 }, 649 { 0x4040d0, 6, 0x04, 0x00000000 }, 650 { 0x4040e8, 1, 0x04, 0x00001000 }, 651 { 0x4040f8, 1, 0x04, 0x00000000 }, 652 { 0x404130, 2, 0x04, 0x00000000 }, 653 { 0x404138, 1, 0x04, 0x20000040 }, 654 { 0x404150, 1, 0x04, 0x0000002e }, 655 { 0x404154, 1, 0x04, 0x00000400 }, 656 { 0x404158, 1, 0x04, 0x00000200 }, 657 { 0x404164, 1, 0x04, 0x00000055 }, 658 { 0x404168, 1, 0x04, 0x00000000 }, 659 { 0x404174, 3, 0x04, 0x00000000 }, 660 { 0x404200, 8, 0x04, 0x00000000 }, 661 {} 662 }; 663 664 const struct gf100_gr_init 665 gf100_grctx_init_pri_0[] = { 666 { 0x404404, 14, 0x04, 0x00000000 }, 667 { 0x404460, 2, 0x04, 0x00000000 }, 668 { 0x404468, 1, 0x04, 0x00ffffff }, 669 { 0x40446c, 1, 0x04, 0x00000000 }, 670 { 0x404480, 1, 0x04, 0x00000001 }, 671 { 0x404498, 1, 0x04, 0x00000001 }, 672 {} 673 }; 674 675 const struct gf100_gr_init 676 gf100_grctx_init_memfmt_0[] = { 677 { 0x404604, 1, 0x04, 0x00000015 }, 678 { 0x404608, 1, 0x04, 0x00000000 }, 679 { 0x40460c, 1, 0x04, 0x00002e00 }, 680 { 0x404610, 1, 0x04, 0x00000100 }, 681 { 0x404618, 8, 0x04, 0x00000000 }, 682 { 0x404638, 1, 0x04, 0x00000004 }, 683 { 0x40463c, 8, 0x04, 0x00000000 }, 684 { 0x40465c, 1, 0x04, 0x007f0100 }, 685 { 0x404660, 7, 0x04, 0x00000000 }, 686 { 0x40467c, 1, 0x04, 0x00000002 }, 687 { 0x404680, 8, 0x04, 0x00000000 }, 688 { 0x4046a0, 1, 0x04, 0x007f0080 }, 689 { 0x4046a4, 18, 0x04, 0x00000000 }, 690 { 0x4046f0, 2, 0x04, 0x00000000 }, 691 { 0x404700, 13, 0x04, 0x00000000 }, 692 { 0x404734, 1, 0x04, 0x00000100 }, 693 { 0x404738, 8, 0x04, 0x00000000 }, 694 {} 695 }; 696 697 static const struct gf100_gr_init 698 gf100_grctx_init_ds_0[] = { 699 { 0x405800, 1, 0x04, 0x078000bf }, 700 { 0x405830, 1, 0x04, 0x02180000 }, 701 { 0x405834, 2, 0x04, 0x00000000 }, 702 { 0x405854, 1, 0x04, 0x00000000 }, 703 { 0x405870, 4, 0x04, 0x00000001 }, 704 { 0x405a00, 2, 0x04, 0x00000000 }, 705 { 0x405a18, 1, 0x04, 0x00000000 }, 706 {} 707 }; 708 709 static const struct gf100_gr_init 710 gf100_grctx_init_pd_0[] = { 711 { 0x406020, 1, 0x04, 0x000103c1 }, 712 { 0x406028, 4, 0x04, 0x00000001 }, 713 { 0x4064a8, 1, 0x04, 0x00000000 }, 714 { 0x4064ac, 1, 0x04, 0x00003fff }, 715 { 0x4064b4, 2, 0x04, 0x00000000 }, 716 {} 717 }; 718 719 const struct gf100_gr_init 720 gf100_grctx_init_rstr2d_0[] = { 721 { 0x407804, 1, 0x04, 0x00000023 }, 722 { 0x40780c, 1, 0x04, 0x0a418820 }, 723 { 0x407810, 1, 0x04, 0x062080e6 }, 724 { 0x407814, 1, 0x04, 0x020398a4 }, 725 { 0x407818, 1, 0x04, 0x0e629062 }, 726 { 0x40781c, 1, 0x04, 0x0a418820 }, 727 { 0x407820, 1, 0x04, 0x000000e6 }, 728 { 0x4078bc, 1, 0x04, 0x00000103 }, 729 {} 730 }; 731 732 const struct gf100_gr_init 733 gf100_grctx_init_scc_0[] = { 734 { 0x408000, 2, 0x04, 0x00000000 }, 735 { 0x408008, 1, 0x04, 0x00000018 }, 736 { 0x40800c, 2, 0x04, 0x00000000 }, 737 { 0x408014, 1, 0x04, 0x00000069 }, 738 { 0x408018, 1, 0x04, 0xe100e100 }, 739 { 0x408064, 1, 0x04, 0x00000000 }, 740 {} 741 }; 742 743 static const struct gf100_gr_init 744 gf100_grctx_init_be_0[] = { 745 { 0x408800, 1, 0x04, 0x02802a3c }, 746 { 0x408804, 1, 0x04, 0x00000040 }, 747 { 0x408808, 1, 0x04, 0x0003e00d }, 748 { 0x408900, 1, 0x04, 0x3080b801 }, 749 { 0x408904, 1, 0x04, 0x02000001 }, 750 { 0x408908, 1, 0x04, 0x00c80929 }, 751 { 0x408980, 1, 0x04, 0x0000011d }, 752 {} 753 }; 754 755 const struct gf100_gr_pack 756 gf100_grctx_pack_hub[] = { 757 { gf100_grctx_init_main_0 }, 758 { gf100_grctx_init_fe_0 }, 759 { gf100_grctx_init_pri_0 }, 760 { gf100_grctx_init_memfmt_0 }, 761 { gf100_grctx_init_ds_0 }, 762 { gf100_grctx_init_pd_0 }, 763 { gf100_grctx_init_rstr2d_0 }, 764 { gf100_grctx_init_scc_0 }, 765 { gf100_grctx_init_be_0 }, 766 {} 767 }; 768 769 const struct gf100_gr_init 770 gf100_grctx_init_gpc_unk_0[] = { 771 { 0x418380, 1, 0x04, 0x00000016 }, 772 {} 773 }; 774 775 const struct gf100_gr_init 776 gf100_grctx_init_prop_0[] = { 777 { 0x418400, 1, 0x04, 0x38004e00 }, 778 { 0x418404, 1, 0x04, 0x71e0ffff }, 779 { 0x418408, 1, 0x04, 0x00000000 }, 780 { 0x41840c, 1, 0x04, 0x00001008 }, 781 { 0x418410, 1, 0x04, 0x0fff0fff }, 782 { 0x418414, 1, 0x04, 0x00200fff }, 783 { 0x418450, 6, 0x04, 0x00000000 }, 784 { 0x418468, 1, 0x04, 0x00000001 }, 785 { 0x41846c, 2, 0x04, 0x00000000 }, 786 {} 787 }; 788 789 const struct gf100_gr_init 790 gf100_grctx_init_gpc_unk_1[] = { 791 { 0x418600, 1, 0x04, 0x0000001f }, 792 { 0x418684, 1, 0x04, 0x0000000f }, 793 { 0x418700, 1, 0x04, 0x00000002 }, 794 { 0x418704, 1, 0x04, 0x00000080 }, 795 { 0x418708, 1, 0x04, 0x00000000 }, 796 { 0x41870c, 1, 0x04, 0x07c80000 }, 797 { 0x418710, 1, 0x04, 0x00000000 }, 798 {} 799 }; 800 801 static const struct gf100_gr_init 802 gf100_grctx_init_setup_0[] = { 803 { 0x418800, 1, 0x04, 0x0006860a }, 804 { 0x418808, 3, 0x04, 0x00000000 }, 805 { 0x418828, 1, 0x04, 0x00008442 }, 806 { 0x418830, 1, 0x04, 0x00000001 }, 807 { 0x4188d8, 1, 0x04, 0x00000008 }, 808 { 0x4188e0, 1, 0x04, 0x01000000 }, 809 { 0x4188e8, 5, 0x04, 0x00000000 }, 810 { 0x4188fc, 1, 0x04, 0x00100000 }, 811 {} 812 }; 813 814 const struct gf100_gr_init 815 gf100_grctx_init_zcull_0[] = { 816 { 0x41891c, 1, 0x04, 0x00ff00ff }, 817 { 0x418924, 1, 0x04, 0x00000000 }, 818 { 0x418928, 1, 0x04, 0x00ffff00 }, 819 { 0x41892c, 1, 0x04, 0x0000ff00 }, 820 {} 821 }; 822 823 const struct gf100_gr_init 824 gf100_grctx_init_crstr_0[] = { 825 { 0x418b00, 1, 0x04, 0x00000000 }, 826 { 0x418b08, 1, 0x04, 0x0a418820 }, 827 { 0x418b0c, 1, 0x04, 0x062080e6 }, 828 { 0x418b10, 1, 0x04, 0x020398a4 }, 829 { 0x418b14, 1, 0x04, 0x0e629062 }, 830 { 0x418b18, 1, 0x04, 0x0a418820 }, 831 { 0x418b1c, 1, 0x04, 0x000000e6 }, 832 { 0x418bb8, 1, 0x04, 0x00000103 }, 833 {} 834 }; 835 836 const struct gf100_gr_init 837 gf100_grctx_init_gpm_0[] = { 838 { 0x418c08, 1, 0x04, 0x00000001 }, 839 { 0x418c10, 8, 0x04, 0x00000000 }, 840 { 0x418c80, 1, 0x04, 0x20200004 }, 841 { 0x418c8c, 1, 0x04, 0x00000001 }, 842 {} 843 }; 844 845 const struct gf100_gr_init 846 gf100_grctx_init_gcc_0[] = { 847 { 0x419000, 1, 0x04, 0x00000780 }, 848 { 0x419004, 2, 0x04, 0x00000000 }, 849 { 0x419014, 1, 0x04, 0x00000004 }, 850 {} 851 }; 852 853 const struct gf100_gr_pack 854 gf100_grctx_pack_gpc_0[] = { 855 { gf100_grctx_init_gpc_unk_0 }, 856 { gf100_grctx_init_prop_0 }, 857 { gf100_grctx_init_gpc_unk_1 }, 858 { gf100_grctx_init_setup_0 }, 859 { gf100_grctx_init_zcull_0 }, 860 {} 861 }; 862 863 const struct gf100_gr_pack 864 gf100_grctx_pack_gpc_1[] = { 865 { gf100_grctx_init_crstr_0 }, 866 { gf100_grctx_init_gpm_0 }, 867 { gf100_grctx_init_gcc_0 }, 868 {} 869 }; 870 871 static const struct gf100_gr_init 872 gf100_grctx_init_zcullr_0[] = { 873 { 0x418a00, 3, 0x04, 0x00000000 }, 874 { 0x418a0c, 1, 0x04, 0x00010000 }, 875 { 0x418a10, 3, 0x04, 0x00000000 }, 876 { 0x418a20, 3, 0x04, 0x00000000 }, 877 { 0x418a2c, 1, 0x04, 0x00010000 }, 878 { 0x418a30, 3, 0x04, 0x00000000 }, 879 { 0x418a40, 3, 0x04, 0x00000000 }, 880 { 0x418a4c, 1, 0x04, 0x00010000 }, 881 { 0x418a50, 3, 0x04, 0x00000000 }, 882 { 0x418a60, 3, 0x04, 0x00000000 }, 883 { 0x418a6c, 1, 0x04, 0x00010000 }, 884 { 0x418a70, 3, 0x04, 0x00000000 }, 885 { 0x418a80, 3, 0x04, 0x00000000 }, 886 { 0x418a8c, 1, 0x04, 0x00010000 }, 887 { 0x418a90, 3, 0x04, 0x00000000 }, 888 { 0x418aa0, 3, 0x04, 0x00000000 }, 889 { 0x418aac, 1, 0x04, 0x00010000 }, 890 { 0x418ab0, 3, 0x04, 0x00000000 }, 891 { 0x418ac0, 3, 0x04, 0x00000000 }, 892 { 0x418acc, 1, 0x04, 0x00010000 }, 893 { 0x418ad0, 3, 0x04, 0x00000000 }, 894 { 0x418ae0, 3, 0x04, 0x00000000 }, 895 { 0x418aec, 1, 0x04, 0x00010000 }, 896 { 0x418af0, 3, 0x04, 0x00000000 }, 897 {} 898 }; 899 900 const struct gf100_gr_pack 901 gf100_grctx_pack_zcull[] = { 902 { gf100_grctx_init_zcullr_0 }, 903 {} 904 }; 905 906 const struct gf100_gr_init 907 gf100_grctx_init_pe_0[] = { 908 { 0x419818, 1, 0x04, 0x00000000 }, 909 { 0x41983c, 1, 0x04, 0x00038bc7 }, 910 { 0x419848, 1, 0x04, 0x00000000 }, 911 { 0x419864, 1, 0x04, 0x0000012a }, 912 { 0x419888, 1, 0x04, 0x00000000 }, 913 {} 914 }; 915 916 static const struct gf100_gr_init 917 gf100_grctx_init_tex_0[] = { 918 { 0x419a00, 1, 0x04, 0x000001f0 }, 919 { 0x419a04, 1, 0x04, 0x00000001 }, 920 { 0x419a08, 1, 0x04, 0x00000023 }, 921 { 0x419a0c, 1, 0x04, 0x00020000 }, 922 { 0x419a10, 1, 0x04, 0x00000000 }, 923 { 0x419a14, 1, 0x04, 0x00000200 }, 924 {} 925 }; 926 927 const struct gf100_gr_init 928 gf100_grctx_init_wwdx_0[] = { 929 { 0x419b00, 1, 0x04, 0x0a418820 }, 930 { 0x419b04, 1, 0x04, 0x062080e6 }, 931 { 0x419b08, 1, 0x04, 0x020398a4 }, 932 { 0x419b0c, 1, 0x04, 0x0e629062 }, 933 { 0x419b10, 1, 0x04, 0x0a418820 }, 934 { 0x419b14, 1, 0x04, 0x000000e6 }, 935 { 0x419bd0, 1, 0x04, 0x00900103 }, 936 { 0x419be0, 1, 0x04, 0x00000001 }, 937 { 0x419be4, 1, 0x04, 0x00000000 }, 938 {} 939 }; 940 941 const struct gf100_gr_init 942 gf100_grctx_init_mpc_0[] = { 943 { 0x419c00, 1, 0x04, 0x00000002 }, 944 { 0x419c04, 1, 0x04, 0x00000006 }, 945 { 0x419c08, 1, 0x04, 0x00000002 }, 946 { 0x419c20, 1, 0x04, 0x00000000 }, 947 {} 948 }; 949 950 static const struct gf100_gr_init 951 gf100_grctx_init_l1c_0[] = { 952 { 0x419cb0, 1, 0x04, 0x00060048 }, 953 { 0x419ce8, 1, 0x04, 0x00000000 }, 954 { 0x419cf4, 1, 0x04, 0x00000183 }, 955 {} 956 }; 957 958 const struct gf100_gr_init 959 gf100_grctx_init_tpccs_0[] = { 960 { 0x419d20, 1, 0x04, 0x02180000 }, 961 { 0x419d24, 1, 0x04, 0x00001fff }, 962 {} 963 }; 964 965 static const struct gf100_gr_init 966 gf100_grctx_init_sm_0[] = { 967 { 0x419e04, 3, 0x04, 0x00000000 }, 968 { 0x419e10, 1, 0x04, 0x00000002 }, 969 { 0x419e44, 1, 0x04, 0x001beff2 }, 970 { 0x419e48, 1, 0x04, 0x00000000 }, 971 { 0x419e4c, 1, 0x04, 0x0000000f }, 972 { 0x419e50, 17, 0x04, 0x00000000 }, 973 { 0x419e98, 1, 0x04, 0x00000000 }, 974 { 0x419f50, 2, 0x04, 0x00000000 }, 975 {} 976 }; 977 978 const struct gf100_gr_pack 979 gf100_grctx_pack_tpc[] = { 980 { gf100_grctx_init_pe_0 }, 981 { gf100_grctx_init_tex_0 }, 982 { gf100_grctx_init_wwdx_0 }, 983 { gf100_grctx_init_mpc_0 }, 984 { gf100_grctx_init_l1c_0 }, 985 { gf100_grctx_init_tpccs_0 }, 986 { gf100_grctx_init_sm_0 }, 987 {} 988 }; 989 990 /******************************************************************************* 991 * PGRAPH context implementation 992 ******************************************************************************/ 993 994 void 995 gf100_grctx_patch_wr32(struct gf100_gr_chan *chan, u32 addr, u32 data) 996 { 997 if (unlikely(!chan->mmio)) { 998 nvkm_wr32(chan->gr->base.engine.subdev.device, addr, data); 999 return; 1000 } 1001 1002 nvkm_wo32(chan->mmio, chan->mmio_nr++ * 4, addr); 1003 nvkm_wo32(chan->mmio, chan->mmio_nr++ * 4, data); 1004 } 1005 1006 void 1007 gf100_grctx_generate_r419cb8(struct gf100_gr *gr) 1008 { 1009 struct nvkm_device *device = gr->base.engine.subdev.device; 1010 nvkm_mask(device, 0x419cb8, 0x00007c00, 0x00000000); 1011 } 1012 1013 void 1014 gf100_grctx_generate_bundle(struct gf100_gr_chan *chan, u64 addr, u32 size) 1015 { 1016 gf100_grctx_patch_wr32(chan, 0x408004, addr >> 8); 1017 gf100_grctx_patch_wr32(chan, 0x408008, 0x80000000 | (size >> 8)); 1018 gf100_grctx_patch_wr32(chan, 0x418808, addr >> 8); 1019 gf100_grctx_patch_wr32(chan, 0x41880c, 0x80000000 | (size >> 8)); 1020 } 1021 1022 void 1023 gf100_grctx_generate_pagepool(struct gf100_gr_chan *chan, u64 addr) 1024 { 1025 gf100_grctx_patch_wr32(chan, 0x40800c, addr >> 8); 1026 gf100_grctx_patch_wr32(chan, 0x408010, 0x80000000); 1027 gf100_grctx_patch_wr32(chan, 0x419004, addr >> 8); 1028 gf100_grctx_patch_wr32(chan, 0x419008, 0x00000000); 1029 } 1030 1031 void 1032 gf100_grctx_generate_attrib(struct gf100_gr_chan *chan) 1033 { 1034 struct gf100_gr *gr = chan->gr; 1035 const struct gf100_grctx_func *grctx = gr->func->grctx; 1036 const u32 attrib = grctx->attrib_nr; 1037 int gpc, tpc; 1038 u32 bo = 0; 1039 1040 gf100_grctx_patch_wr32(chan, 0x405830, (attrib << 16)); 1041 1042 for (gpc = 0; gpc < gr->gpc_nr; gpc++) { 1043 for (tpc = 0; tpc < gr->tpc_nr[gpc]; tpc++) { 1044 const u32 o = TPC_UNIT(gpc, tpc, 0x0520); 1045 1046 gf100_grctx_patch_wr32(chan, o, (attrib << 16) | bo); 1047 bo += grctx->attrib_nr_max; 1048 } 1049 } 1050 } 1051 1052 void 1053 gf100_grctx_generate_attrib_cb(struct gf100_gr_chan *chan, u64 addr, u32 size) 1054 { 1055 gf100_grctx_patch_wr32(chan, 0x418810, 0x80000000 | addr >> 12); 1056 gf100_grctx_patch_wr32(chan, 0x419848, 0x10000000 | addr >> 12); 1057 } 1058 1059 u32 1060 gf100_grctx_generate_attrib_cb_size(struct gf100_gr *gr) 1061 { 1062 const struct gf100_grctx_func *grctx = gr->func->grctx; 1063 1064 return 0x20 * (grctx->attrib_nr_max + grctx->alpha_nr_max) * gr->tpc_total; 1065 } 1066 1067 void 1068 gf100_grctx_generate_unkn(struct gf100_gr *gr) 1069 { 1070 } 1071 1072 void 1073 gf100_grctx_generate_r4060a8(struct gf100_gr *gr) 1074 { 1075 struct nvkm_device *device = gr->base.engine.subdev.device; 1076 const u8 gpcmax = nvkm_rd32(device, 0x022430); 1077 const u8 tpcmax = nvkm_rd32(device, 0x022434) * gpcmax; 1078 int i, j, sm = 0; 1079 u32 data; 1080 1081 for (i = 0; i < DIV_ROUND_UP(tpcmax, 4); i++) { 1082 for (data = 0, j = 0; j < 4; j++) { 1083 if (sm < gr->sm_nr) 1084 data |= gr->sm[sm++].gpc << (j * 8); 1085 else 1086 data |= 0x1f << (j * 8); 1087 } 1088 nvkm_wr32(device, 0x4060a8 + (i * 4), data); 1089 } 1090 } 1091 1092 void 1093 gf100_grctx_generate_rop_mapping(struct gf100_gr *gr) 1094 { 1095 struct nvkm_device *device = gr->base.engine.subdev.device; 1096 u32 data[6] = {}, data2[2] = {}; 1097 u8 shift, ntpcv; 1098 int i; 1099 1100 /* Pack tile map into register format. */ 1101 for (i = 0; i < 32; i++) 1102 data[i / 6] |= (gr->tile[i] & 0x07) << ((i % 6) * 5); 1103 1104 /* Magic. */ 1105 shift = 0; 1106 ntpcv = gr->tpc_total; 1107 while (!(ntpcv & (1 << 4))) { 1108 ntpcv <<= 1; 1109 shift++; 1110 } 1111 1112 data2[0] = (ntpcv << 16); 1113 data2[0] |= (shift << 21); 1114 data2[0] |= (((1 << (0 + 5)) % ntpcv) << 24); 1115 for (i = 1; i < 7; i++) 1116 data2[1] |= ((1 << (i + 5)) % ntpcv) << ((i - 1) * 5); 1117 1118 /* GPC_BROADCAST */ 1119 nvkm_wr32(device, 0x418bb8, (gr->tpc_total << 8) | 1120 gr->screen_tile_row_offset); 1121 for (i = 0; i < 6; i++) 1122 nvkm_wr32(device, 0x418b08 + (i * 4), data[i]); 1123 1124 /* GPC_BROADCAST.TP_BROADCAST */ 1125 nvkm_wr32(device, 0x419bd0, (gr->tpc_total << 8) | 1126 gr->screen_tile_row_offset | data2[0]); 1127 nvkm_wr32(device, 0x419be4, data2[1]); 1128 for (i = 0; i < 6; i++) 1129 nvkm_wr32(device, 0x419b00 + (i * 4), data[i]); 1130 1131 /* UNK78xx */ 1132 nvkm_wr32(device, 0x4078bc, (gr->tpc_total << 8) | 1133 gr->screen_tile_row_offset); 1134 for (i = 0; i < 6; i++) 1135 nvkm_wr32(device, 0x40780c + (i * 4), data[i]); 1136 } 1137 1138 void 1139 gf100_grctx_generate_max_ways_evict(struct gf100_gr *gr) 1140 { 1141 struct nvkm_device *device = gr->base.engine.subdev.device; 1142 u32 fbps = nvkm_rd32(device, 0x121c74); 1143 if (fbps == 1) 1144 nvkm_mask(device, 0x17e91c, 0x001f0000, 0x00090000); 1145 } 1146 1147 static const u32 1148 gf100_grctx_alpha_beta_map[17][32] = { 1149 [1] = { 1150 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1151 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1152 }, 1153 [2] = { 1154 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1155 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1156 }, 1157 //XXX: 3 1158 [4] = { 1159 1, 1, 1, 1, 1, 1, 1, 1, 1160 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1161 3, 3, 3, 3, 3, 3, 3, 3, 1162 }, 1163 //XXX: 5 1164 //XXX: 6 1165 [7] = { 1166 1, 1, 1, 1, 1167 2, 2, 2, 2, 2, 2, 1168 3, 3, 3, 3, 3, 3, 1169 4, 4, 4, 4, 4, 4, 1170 5, 5, 5, 5, 5, 5, 1171 6, 6, 6, 6, 1172 }, 1173 [8] = { 1174 1, 1, 1, 1175 2, 2, 2, 2, 2, 1176 3, 3, 3, 3, 3, 1177 4, 4, 4, 4, 4, 4, 1178 5, 5, 5, 5, 5, 1179 6, 6, 6, 6, 6, 1180 7, 7, 7, 1181 }, 1182 //XXX: 9 1183 //XXX: 10 1184 [11] = { 1185 1, 1, 1186 2, 2, 2, 2, 1187 3, 3, 3, 1188 4, 4, 4, 4, 1189 5, 5, 5, 1190 6, 6, 6, 1191 7, 7, 7, 7, 1192 8, 8, 8, 1193 9, 9, 9, 9, 1194 10, 10, 1195 }, 1196 //XXX: 12 1197 //XXX: 13 1198 [14] = { 1199 1, 1, 1200 2, 2, 1201 3, 3, 3, 1202 4, 4, 4, 1203 5, 5, 1204 6, 6, 6, 1205 7, 7, 1206 8, 8, 8, 1207 9, 9, 1208 10, 10, 10, 1209 11, 11, 11, 1210 12, 12, 1211 13, 13, 1212 }, 1213 [15] = { 1214 1, 1, 1215 2, 2, 1216 3, 3, 1217 4, 4, 4, 1218 5, 5, 1219 6, 6, 6, 1220 7, 7, 1221 8, 8, 1222 9, 9, 9, 1223 10, 10, 1224 11, 11, 11, 1225 12, 12, 1226 13, 13, 1227 14, 14, 1228 }, 1229 [16] = { 1230 1, 1, 1231 2, 2, 1232 3, 3, 1233 4, 4, 1234 5, 5, 1235 6, 6, 6, 1236 7, 7, 1237 8, 8, 1238 9, 9, 1239 10, 10, 10, 1240 11, 11, 1241 12, 12, 1242 13, 13, 1243 14, 14, 1244 15, 15, 1245 }, 1246 }; 1247 1248 void 1249 gf100_grctx_generate_alpha_beta_tables(struct gf100_gr *gr) 1250 { 1251 struct nvkm_subdev *subdev = &gr->base.engine.subdev; 1252 struct nvkm_device *device = subdev->device; 1253 int i, gpc; 1254 1255 for (i = 0; i < 32; i++) { 1256 u32 atarget = gf100_grctx_alpha_beta_map[gr->tpc_total][i]; 1257 u32 abits[GPC_MAX] = {}, amask = 0, bmask = 0; 1258 1259 if (!atarget) { 1260 nvkm_warn(subdev, "missing alpha/beta mapping table\n"); 1261 atarget = max_t(u32, gr->tpc_total * i / 32, 1); 1262 } 1263 1264 while (atarget) { 1265 for (gpc = 0; atarget && gpc < gr->gpc_nr; gpc++) { 1266 if (abits[gpc] < gr->tpc_nr[gpc]) { 1267 abits[gpc]++; 1268 atarget--; 1269 } 1270 } 1271 } 1272 1273 for (gpc = 0; gpc < gr->gpc_nr; gpc++) { 1274 u32 bbits = gr->tpc_nr[gpc] - abits[gpc]; 1275 amask |= ((1 << abits[gpc]) - 1) << (gpc * 8); 1276 bmask |= ((1 << bbits) - 1) << abits[gpc] << (gpc * 8); 1277 } 1278 1279 nvkm_wr32(device, 0x406800 + (i * 0x20), amask); 1280 nvkm_wr32(device, 0x406c00 + (i * 0x20), bmask); 1281 } 1282 } 1283 1284 void 1285 gf100_grctx_generate_tpc_nr(struct gf100_gr *gr, int gpc) 1286 { 1287 struct nvkm_device *device = gr->base.engine.subdev.device; 1288 nvkm_wr32(device, GPC_UNIT(gpc, 0x0c08), gr->tpc_nr[gpc]); 1289 nvkm_wr32(device, GPC_UNIT(gpc, 0x0c8c), gr->tpc_nr[gpc]); 1290 } 1291 1292 void 1293 gf100_grctx_generate_sm_id(struct gf100_gr *gr, int gpc, int tpc, int sm) 1294 { 1295 struct nvkm_device *device = gr->base.engine.subdev.device; 1296 nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), sm); 1297 nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x4e8), sm); 1298 nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), sm); 1299 nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), sm); 1300 } 1301 1302 void 1303 gf100_grctx_generate_floorsweep(struct gf100_gr *gr) 1304 { 1305 const struct gf100_grctx_func *func = gr->func->grctx; 1306 int sm; 1307 1308 for (sm = 0; sm < gr->sm_nr; sm++) { 1309 func->sm_id(gr, gr->sm[sm].gpc, gr->sm[sm].tpc, sm); 1310 if (func->tpc_nr) 1311 func->tpc_nr(gr, gr->sm[sm].gpc); 1312 } 1313 1314 gf100_gr_init_num_tpc_per_gpc(gr, false, true); 1315 if (!func->skip_pd_num_tpc_per_gpc) 1316 gf100_gr_init_num_tpc_per_gpc(gr, true, false); 1317 1318 if (func->r4060a8) 1319 func->r4060a8(gr); 1320 1321 func->rop_mapping(gr); 1322 1323 if (func->alpha_beta_tables) 1324 func->alpha_beta_tables(gr); 1325 if (func->max_ways_evict) 1326 func->max_ways_evict(gr); 1327 if (func->dist_skip_table) 1328 func->dist_skip_table(gr); 1329 if (func->r406500) 1330 func->r406500(gr); 1331 if (func->gpc_tpc_nr) 1332 func->gpc_tpc_nr(gr); 1333 if (func->r419f78) 1334 func->r419f78(gr); 1335 if (func->tpc_mask) 1336 func->tpc_mask(gr); 1337 if (func->smid_config) 1338 func->smid_config(gr); 1339 } 1340 1341 void 1342 gf100_grctx_generate_main(struct gf100_gr_chan *chan) 1343 { 1344 struct gf100_gr *gr = chan->gr; 1345 struct nvkm_device *device = gr->base.engine.subdev.device; 1346 const struct gf100_grctx_func *grctx = gr->func->grctx; 1347 u32 idle_timeout; 1348 1349 nvkm_mc_unk260(device, 0); 1350 1351 if (!gr->sw_ctx) { 1352 gf100_gr_mmio(gr, grctx->hub); 1353 gf100_gr_mmio(gr, grctx->gpc_0); 1354 gf100_gr_mmio(gr, grctx->zcull); 1355 gf100_gr_mmio(gr, grctx->gpc_1); 1356 gf100_gr_mmio(gr, grctx->tpc); 1357 gf100_gr_mmio(gr, grctx->ppc); 1358 } else { 1359 gf100_gr_mmio(gr, gr->sw_ctx); 1360 } 1361 1362 gf100_gr_wait_idle(gr); 1363 1364 idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000); 1365 1366 grctx->pagepool(chan, chan->pagepool->addr); 1367 grctx->bundle(chan, chan->bundle_cb->addr, grctx->bundle_size); 1368 grctx->attrib_cb(chan, chan->attrib_cb->addr, grctx->attrib_cb_size(gr)); 1369 grctx->attrib(chan); 1370 if (grctx->patch_ltc) 1371 grctx->patch_ltc(chan); 1372 if (grctx->unknown_size) 1373 grctx->unknown(chan, chan->unknown->addr, grctx->unknown_size); 1374 grctx->unkn(gr); 1375 1376 gf100_grctx_generate_floorsweep(gr); 1377 1378 gf100_gr_wait_idle(gr); 1379 1380 if (grctx->r400088) grctx->r400088(gr, false); 1381 if (gr->bundle) 1382 gf100_gr_icmd(gr, gr->bundle); 1383 else 1384 gf100_gr_icmd(gr, grctx->icmd); 1385 if (grctx->sw_veid_bundle_init) 1386 gf100_gr_icmd(gr, grctx->sw_veid_bundle_init); 1387 if (grctx->r400088) grctx->r400088(gr, true); 1388 1389 nvkm_wr32(device, 0x404154, idle_timeout); 1390 1391 if (gr->method) 1392 gf100_gr_mthd(gr, gr->method); 1393 else 1394 gf100_gr_mthd(gr, grctx->mthd); 1395 nvkm_mc_unk260(device, 1); 1396 1397 if (grctx->r419cb8) 1398 grctx->r419cb8(gr); 1399 if (grctx->r418800) 1400 grctx->r418800(gr); 1401 if (grctx->r419eb0) 1402 grctx->r419eb0(gr); 1403 if (grctx->r419e00) 1404 grctx->r419e00(gr); 1405 if (grctx->r418e94) 1406 grctx->r418e94(gr); 1407 if (grctx->r419a3c) 1408 grctx->r419a3c(gr); 1409 if (grctx->r408840) 1410 grctx->r408840(gr); 1411 if (grctx->r419c0c) 1412 grctx->r419c0c(gr); 1413 } 1414 1415 #define CB_RESERVED 0x80000 1416 1417 int 1418 gf100_grctx_generate(struct gf100_gr *gr, struct gf100_gr_chan *chan, struct nvkm_gpuobj *inst) 1419 { 1420 const struct gf100_grctx_func *grctx = gr->func->grctx; 1421 struct nvkm_subdev *subdev = &gr->base.engine.subdev; 1422 struct nvkm_device *device = subdev->device; 1423 struct nvkm_memory *data = NULL; 1424 struct nvkm_vma *ctx = NULL; 1425 int ret, i; 1426 u64 addr; 1427 1428 /* NV_PGRAPH_FE_PWR_MODE_FORCE_ON. */ 1429 nvkm_wr32(device, 0x404170, 0x00000012); 1430 nvkm_msec(device, 2000, 1431 if (!(nvkm_rd32(device, 0x404170) & 0x00000010)) 1432 break; 1433 ); 1434 1435 if (grctx->unkn88c) 1436 grctx->unkn88c(gr, true); 1437 1438 /* Reset FECS. */ 1439 nvkm_wr32(device, 0x409614, 0x00000070); 1440 nvkm_usec(device, 10, NVKM_DELAY); 1441 nvkm_mask(device, 0x409614, 0x00000700, 0x00000700); 1442 nvkm_usec(device, 10, NVKM_DELAY); 1443 nvkm_rd32(device, 0x409614); 1444 1445 if (grctx->unkn88c) 1446 grctx->unkn88c(gr, false); 1447 1448 /* NV_PGRAPH_FE_PWR_MODE_AUTO. */ 1449 nvkm_wr32(device, 0x404170, 0x00000010); 1450 1451 /* Init SCC RAM. */ 1452 nvkm_wr32(device, 0x40802c, 0x00000001); 1453 1454 /* Allocate memory to store context, and dummy global context buffers. */ 1455 ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 1456 CB_RESERVED + gr->size, 0, true, &data); 1457 if (ret) 1458 goto done; 1459 1460 ret = nvkm_vmm_get(chan->vmm, 0, nvkm_memory_size(data), &ctx); 1461 if (ret) 1462 goto done; 1463 1464 ret = nvkm_memory_map(data, 0, chan->vmm, ctx, NULL, 0); 1465 if (ret) 1466 goto done; 1467 1468 /* Setup context pointer. */ 1469 nvkm_kmap(inst); 1470 nvkm_wo32(inst, 0x0210, lower_32_bits(ctx->addr + CB_RESERVED) | 4); 1471 nvkm_wo32(inst, 0x0214, upper_32_bits(ctx->addr + CB_RESERVED)); 1472 nvkm_done(inst); 1473 1474 /* Make channel current. */ 1475 addr = inst->addr >> 12; 1476 if (gr->firmware) { 1477 ret = gf100_gr_fecs_bind_pointer(gr, 0x80000000 | addr); 1478 if (ret) 1479 goto done_inst; 1480 1481 nvkm_kmap(data); 1482 nvkm_wo32(data, 0x1c, 1); 1483 nvkm_wo32(data, 0x20, 0); 1484 nvkm_wo32(data, 0x28, 0); 1485 nvkm_wo32(data, 0x2c, 0); 1486 nvkm_done(data); 1487 } else { 1488 nvkm_wr32(device, 0x409840, 0x80000000); 1489 nvkm_wr32(device, 0x409500, 0x80000000 | addr); 1490 nvkm_wr32(device, 0x409504, 0x00000001); 1491 nvkm_msec(device, 2000, 1492 if (nvkm_rd32(device, 0x409800) & 0x80000000) 1493 break; 1494 ); 1495 } 1496 1497 grctx->main(chan); 1498 1499 if (!gr->firmware) { 1500 /* Trigger a context unload by unsetting the "next channel valid" bit 1501 * and faking a context switch interrupt. 1502 */ 1503 nvkm_mask(device, 0x409b04, 0x80000000, 0x00000000); 1504 nvkm_wr32(device, 0x409000, 0x00000100); 1505 if (nvkm_msec(device, 2000, 1506 if (!(nvkm_rd32(device, 0x409b00) & 0x80000000)) 1507 break; 1508 ) < 0) { 1509 ret = -EBUSY; 1510 goto done_inst; 1511 } 1512 } else { 1513 ret = gf100_gr_fecs_wfi_golden_save(gr, 0x80000000 | addr); 1514 if (ret) 1515 goto done_inst; 1516 1517 nvkm_mask(device, 0x409b00, 0x80000000, 0x00000000); 1518 } 1519 1520 gr->data = kmalloc(gr->size, GFP_KERNEL); 1521 if (gr->data) { 1522 nvkm_kmap(data); 1523 for (i = 0; i < gr->size; i += 4) 1524 gr->data[i / 4] = nvkm_ro32(data, CB_RESERVED + i); 1525 nvkm_done(data); 1526 ret = 0; 1527 } else { 1528 ret = -ENOMEM; 1529 } 1530 1531 done_inst: 1532 nvkm_kmap(inst); 1533 nvkm_wo32(inst, 0x0210, 0); 1534 nvkm_wo32(inst, 0x0214, 0); 1535 nvkm_done(inst); 1536 done: 1537 nvkm_vmm_put(chan->vmm, &ctx); 1538 nvkm_memory_unref(&data); 1539 return ret; 1540 } 1541 1542 const struct gf100_grctx_func 1543 gf100_grctx = { 1544 .main = gf100_grctx_generate_main, 1545 .unkn = gf100_grctx_generate_unkn, 1546 .hub = gf100_grctx_pack_hub, 1547 .gpc_0 = gf100_grctx_pack_gpc_0, 1548 .gpc_1 = gf100_grctx_pack_gpc_1, 1549 .zcull = gf100_grctx_pack_zcull, 1550 .tpc = gf100_grctx_pack_tpc, 1551 .icmd = gf100_grctx_pack_icmd, 1552 .mthd = gf100_grctx_pack_mthd, 1553 .bundle = gf100_grctx_generate_bundle, 1554 .bundle_size = 0x1800, 1555 .pagepool = gf100_grctx_generate_pagepool, 1556 .pagepool_size = 0x8000, 1557 .attrib_cb_size = gf100_grctx_generate_attrib_cb_size, 1558 .attrib_cb = gf100_grctx_generate_attrib_cb, 1559 .attrib = gf100_grctx_generate_attrib, 1560 .attrib_nr_max = 0x324, 1561 .attrib_nr = 0x218, 1562 .sm_id = gf100_grctx_generate_sm_id, 1563 .tpc_nr = gf100_grctx_generate_tpc_nr, 1564 .r4060a8 = gf100_grctx_generate_r4060a8, 1565 .rop_mapping = gf100_grctx_generate_rop_mapping, 1566 .alpha_beta_tables = gf100_grctx_generate_alpha_beta_tables, 1567 .max_ways_evict = gf100_grctx_generate_max_ways_evict, 1568 .r419cb8 = gf100_grctx_generate_r419cb8, 1569 }; 1570