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 int 1007 gf100_grctx_mmio_data(struct gf100_grctx *info, u32 size, u32 align, bool priv) 1008 { 1009 if (info->data) { 1010 info->buffer[info->buffer_nr] = round_up(info->addr, align); 1011 info->addr = info->buffer[info->buffer_nr] + size; 1012 info->data->size = size; 1013 info->data->align = align; 1014 info->data->priv = priv; 1015 info->data++; 1016 return info->buffer_nr++; 1017 } 1018 return -1; 1019 } 1020 1021 void 1022 gf100_grctx_mmio_item(struct gf100_grctx *info, u32 addr, u32 data, 1023 int shift, int buffer) 1024 { 1025 struct nvkm_device *device = info->gr->base.engine.subdev.device; 1026 if (info->data) { 1027 if (shift >= 0) { 1028 info->mmio->addr = addr; 1029 info->mmio->data = data; 1030 info->mmio->shift = shift; 1031 info->mmio->buffer = buffer; 1032 if (buffer >= 0) 1033 data |= info->buffer[buffer] >> shift; 1034 info->mmio++; 1035 } else 1036 return; 1037 } else { 1038 if (buffer >= 0) 1039 return; 1040 } 1041 1042 nvkm_wr32(device, addr, data); 1043 } 1044 1045 void 1046 gf100_grctx_generate_r419cb8(struct gf100_gr *gr) 1047 { 1048 struct nvkm_device *device = gr->base.engine.subdev.device; 1049 nvkm_mask(device, 0x419cb8, 0x00007c00, 0x00000000); 1050 } 1051 1052 void 1053 gf100_grctx_generate_bundle(struct gf100_grctx *info) 1054 { 1055 const struct gf100_grctx_func *grctx = info->gr->func->grctx; 1056 const int s = 8; 1057 const int b = mmio_vram(info, grctx->bundle_size, (1 << s), true); 1058 mmio_refn(info, 0x408004, 0x00000000, s, b); 1059 mmio_wr32(info, 0x408008, 0x80000000 | (grctx->bundle_size >> s)); 1060 mmio_refn(info, 0x418808, 0x00000000, s, b); 1061 mmio_wr32(info, 0x41880c, 0x80000000 | (grctx->bundle_size >> s)); 1062 } 1063 1064 void 1065 gf100_grctx_generate_pagepool(struct gf100_gr_chan *chan, u64 addr) 1066 { 1067 gf100_grctx_patch_wr32(chan, 0x40800c, addr >> 8); 1068 gf100_grctx_patch_wr32(chan, 0x408010, 0x80000000); 1069 gf100_grctx_patch_wr32(chan, 0x419004, addr >> 8); 1070 gf100_grctx_patch_wr32(chan, 0x419008, 0x00000000); 1071 } 1072 1073 void 1074 gf100_grctx_generate_attrib(struct gf100_grctx *info) 1075 { 1076 struct gf100_gr *gr = info->gr; 1077 const struct gf100_grctx_func *grctx = gr->func->grctx; 1078 const u32 attrib = grctx->attrib_nr; 1079 const u32 size = 0x20 * (grctx->attrib_nr_max + grctx->alpha_nr_max); 1080 const int s = 12; 1081 const int b = mmio_vram(info, size * gr->tpc_total, (1 << s), false); 1082 int gpc, tpc; 1083 u32 bo = 0; 1084 1085 mmio_refn(info, 0x418810, 0x80000000, s, b); 1086 mmio_refn(info, 0x419848, 0x10000000, s, b); 1087 mmio_wr32(info, 0x405830, (attrib << 16)); 1088 1089 for (gpc = 0; gpc < gr->gpc_nr; gpc++) { 1090 for (tpc = 0; tpc < gr->tpc_nr[gpc]; tpc++) { 1091 const u32 o = TPC_UNIT(gpc, tpc, 0x0520); 1092 mmio_skip(info, o, (attrib << 16) | ++bo); 1093 mmio_wr32(info, o, (attrib << 16) | --bo); 1094 bo += grctx->attrib_nr_max; 1095 } 1096 } 1097 } 1098 1099 void 1100 gf100_grctx_generate_unkn(struct gf100_gr *gr) 1101 { 1102 } 1103 1104 void 1105 gf100_grctx_generate_r4060a8(struct gf100_gr *gr) 1106 { 1107 struct nvkm_device *device = gr->base.engine.subdev.device; 1108 const u8 gpcmax = nvkm_rd32(device, 0x022430); 1109 const u8 tpcmax = nvkm_rd32(device, 0x022434) * gpcmax; 1110 int i, j, sm = 0; 1111 u32 data; 1112 1113 for (i = 0; i < DIV_ROUND_UP(tpcmax, 4); i++) { 1114 for (data = 0, j = 0; j < 4; j++) { 1115 if (sm < gr->sm_nr) 1116 data |= gr->sm[sm++].gpc << (j * 8); 1117 else 1118 data |= 0x1f << (j * 8); 1119 } 1120 nvkm_wr32(device, 0x4060a8 + (i * 4), data); 1121 } 1122 } 1123 1124 void 1125 gf100_grctx_generate_rop_mapping(struct gf100_gr *gr) 1126 { 1127 struct nvkm_device *device = gr->base.engine.subdev.device; 1128 u32 data[6] = {}, data2[2] = {}; 1129 u8 shift, ntpcv; 1130 int i; 1131 1132 /* Pack tile map into register format. */ 1133 for (i = 0; i < 32; i++) 1134 data[i / 6] |= (gr->tile[i] & 0x07) << ((i % 6) * 5); 1135 1136 /* Magic. */ 1137 shift = 0; 1138 ntpcv = gr->tpc_total; 1139 while (!(ntpcv & (1 << 4))) { 1140 ntpcv <<= 1; 1141 shift++; 1142 } 1143 1144 data2[0] = (ntpcv << 16); 1145 data2[0] |= (shift << 21); 1146 data2[0] |= (((1 << (0 + 5)) % ntpcv) << 24); 1147 for (i = 1; i < 7; i++) 1148 data2[1] |= ((1 << (i + 5)) % ntpcv) << ((i - 1) * 5); 1149 1150 /* GPC_BROADCAST */ 1151 nvkm_wr32(device, 0x418bb8, (gr->tpc_total << 8) | 1152 gr->screen_tile_row_offset); 1153 for (i = 0; i < 6; i++) 1154 nvkm_wr32(device, 0x418b08 + (i * 4), data[i]); 1155 1156 /* GPC_BROADCAST.TP_BROADCAST */ 1157 nvkm_wr32(device, 0x419bd0, (gr->tpc_total << 8) | 1158 gr->screen_tile_row_offset | data2[0]); 1159 nvkm_wr32(device, 0x419be4, data2[1]); 1160 for (i = 0; i < 6; i++) 1161 nvkm_wr32(device, 0x419b00 + (i * 4), data[i]); 1162 1163 /* UNK78xx */ 1164 nvkm_wr32(device, 0x4078bc, (gr->tpc_total << 8) | 1165 gr->screen_tile_row_offset); 1166 for (i = 0; i < 6; i++) 1167 nvkm_wr32(device, 0x40780c + (i * 4), data[i]); 1168 } 1169 1170 void 1171 gf100_grctx_generate_max_ways_evict(struct gf100_gr *gr) 1172 { 1173 struct nvkm_device *device = gr->base.engine.subdev.device; 1174 u32 fbps = nvkm_rd32(device, 0x121c74); 1175 if (fbps == 1) 1176 nvkm_mask(device, 0x17e91c, 0x001f0000, 0x00090000); 1177 } 1178 1179 static const u32 1180 gf100_grctx_alpha_beta_map[17][32] = { 1181 [1] = { 1182 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1183 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1184 }, 1185 [2] = { 1186 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1187 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1188 }, 1189 //XXX: 3 1190 [4] = { 1191 1, 1, 1, 1, 1, 1, 1, 1, 1192 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1193 3, 3, 3, 3, 3, 3, 3, 3, 1194 }, 1195 //XXX: 5 1196 //XXX: 6 1197 [7] = { 1198 1, 1, 1, 1, 1199 2, 2, 2, 2, 2, 2, 1200 3, 3, 3, 3, 3, 3, 1201 4, 4, 4, 4, 4, 4, 1202 5, 5, 5, 5, 5, 5, 1203 6, 6, 6, 6, 1204 }, 1205 [8] = { 1206 1, 1, 1, 1207 2, 2, 2, 2, 2, 1208 3, 3, 3, 3, 3, 1209 4, 4, 4, 4, 4, 4, 1210 5, 5, 5, 5, 5, 1211 6, 6, 6, 6, 6, 1212 7, 7, 7, 1213 }, 1214 //XXX: 9 1215 //XXX: 10 1216 [11] = { 1217 1, 1, 1218 2, 2, 2, 2, 1219 3, 3, 3, 1220 4, 4, 4, 4, 1221 5, 5, 5, 1222 6, 6, 6, 1223 7, 7, 7, 7, 1224 8, 8, 8, 1225 9, 9, 9, 9, 1226 10, 10, 1227 }, 1228 //XXX: 12 1229 //XXX: 13 1230 [14] = { 1231 1, 1, 1232 2, 2, 1233 3, 3, 3, 1234 4, 4, 4, 1235 5, 5, 1236 6, 6, 6, 1237 7, 7, 1238 8, 8, 8, 1239 9, 9, 1240 10, 10, 10, 1241 11, 11, 11, 1242 12, 12, 1243 13, 13, 1244 }, 1245 [15] = { 1246 1, 1, 1247 2, 2, 1248 3, 3, 1249 4, 4, 4, 1250 5, 5, 1251 6, 6, 6, 1252 7, 7, 1253 8, 8, 1254 9, 9, 9, 1255 10, 10, 1256 11, 11, 11, 1257 12, 12, 1258 13, 13, 1259 14, 14, 1260 }, 1261 [16] = { 1262 1, 1, 1263 2, 2, 1264 3, 3, 1265 4, 4, 1266 5, 5, 1267 6, 6, 6, 1268 7, 7, 1269 8, 8, 1270 9, 9, 1271 10, 10, 10, 1272 11, 11, 1273 12, 12, 1274 13, 13, 1275 14, 14, 1276 15, 15, 1277 }, 1278 }; 1279 1280 void 1281 gf100_grctx_generate_alpha_beta_tables(struct gf100_gr *gr) 1282 { 1283 struct nvkm_subdev *subdev = &gr->base.engine.subdev; 1284 struct nvkm_device *device = subdev->device; 1285 int i, gpc; 1286 1287 for (i = 0; i < 32; i++) { 1288 u32 atarget = gf100_grctx_alpha_beta_map[gr->tpc_total][i]; 1289 u32 abits[GPC_MAX] = {}, amask = 0, bmask = 0; 1290 1291 if (!atarget) { 1292 nvkm_warn(subdev, "missing alpha/beta mapping table\n"); 1293 atarget = max_t(u32, gr->tpc_total * i / 32, 1); 1294 } 1295 1296 while (atarget) { 1297 for (gpc = 0; atarget && gpc < gr->gpc_nr; gpc++) { 1298 if (abits[gpc] < gr->tpc_nr[gpc]) { 1299 abits[gpc]++; 1300 atarget--; 1301 } 1302 } 1303 } 1304 1305 for (gpc = 0; gpc < gr->gpc_nr; gpc++) { 1306 u32 bbits = gr->tpc_nr[gpc] - abits[gpc]; 1307 amask |= ((1 << abits[gpc]) - 1) << (gpc * 8); 1308 bmask |= ((1 << bbits) - 1) << abits[gpc] << (gpc * 8); 1309 } 1310 1311 nvkm_wr32(device, 0x406800 + (i * 0x20), amask); 1312 nvkm_wr32(device, 0x406c00 + (i * 0x20), bmask); 1313 } 1314 } 1315 1316 void 1317 gf100_grctx_generate_tpc_nr(struct gf100_gr *gr, int gpc) 1318 { 1319 struct nvkm_device *device = gr->base.engine.subdev.device; 1320 nvkm_wr32(device, GPC_UNIT(gpc, 0x0c08), gr->tpc_nr[gpc]); 1321 nvkm_wr32(device, GPC_UNIT(gpc, 0x0c8c), gr->tpc_nr[gpc]); 1322 } 1323 1324 void 1325 gf100_grctx_generate_sm_id(struct gf100_gr *gr, int gpc, int tpc, int sm) 1326 { 1327 struct nvkm_device *device = gr->base.engine.subdev.device; 1328 nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), sm); 1329 nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x4e8), sm); 1330 nvkm_wr32(device, GPC_UNIT(gpc, 0x0c10 + tpc * 4), sm); 1331 nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x088), sm); 1332 } 1333 1334 void 1335 gf100_grctx_generate_floorsweep(struct gf100_gr *gr) 1336 { 1337 const struct gf100_grctx_func *func = gr->func->grctx; 1338 int sm; 1339 1340 for (sm = 0; sm < gr->sm_nr; sm++) { 1341 func->sm_id(gr, gr->sm[sm].gpc, gr->sm[sm].tpc, sm); 1342 if (func->tpc_nr) 1343 func->tpc_nr(gr, gr->sm[sm].gpc); 1344 } 1345 1346 gf100_gr_init_num_tpc_per_gpc(gr, false, true); 1347 if (!func->skip_pd_num_tpc_per_gpc) 1348 gf100_gr_init_num_tpc_per_gpc(gr, true, false); 1349 1350 if (func->r4060a8) 1351 func->r4060a8(gr); 1352 1353 func->rop_mapping(gr); 1354 1355 if (func->alpha_beta_tables) 1356 func->alpha_beta_tables(gr); 1357 if (func->max_ways_evict) 1358 func->max_ways_evict(gr); 1359 if (func->dist_skip_table) 1360 func->dist_skip_table(gr); 1361 if (func->r406500) 1362 func->r406500(gr); 1363 if (func->gpc_tpc_nr) 1364 func->gpc_tpc_nr(gr); 1365 if (func->r419f78) 1366 func->r419f78(gr); 1367 if (func->tpc_mask) 1368 func->tpc_mask(gr); 1369 if (func->smid_config) 1370 func->smid_config(gr); 1371 } 1372 1373 void 1374 gf100_grctx_generate_main(struct gf100_gr_chan *chan, struct gf100_grctx *info) 1375 { 1376 struct gf100_gr *gr = chan->gr; 1377 struct nvkm_device *device = gr->base.engine.subdev.device; 1378 const struct gf100_grctx_func *grctx = gr->func->grctx; 1379 u32 idle_timeout; 1380 1381 nvkm_mc_unk260(device, 0); 1382 1383 if (!gr->sw_ctx) { 1384 gf100_gr_mmio(gr, grctx->hub); 1385 gf100_gr_mmio(gr, grctx->gpc_0); 1386 gf100_gr_mmio(gr, grctx->zcull); 1387 gf100_gr_mmio(gr, grctx->gpc_1); 1388 gf100_gr_mmio(gr, grctx->tpc); 1389 gf100_gr_mmio(gr, grctx->ppc); 1390 } else { 1391 gf100_gr_mmio(gr, gr->sw_ctx); 1392 } 1393 1394 gf100_gr_wait_idle(gr); 1395 1396 idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000); 1397 1398 grctx->pagepool(chan, chan->pagepool->addr); 1399 grctx->bundle(info); 1400 grctx->attrib(info); 1401 if (grctx->patch_ltc) 1402 grctx->patch_ltc(info); 1403 grctx->unkn(gr); 1404 1405 gf100_grctx_generate_floorsweep(gr); 1406 1407 gf100_gr_wait_idle(gr); 1408 1409 if (grctx->r400088) grctx->r400088(gr, false); 1410 if (gr->bundle) 1411 gf100_gr_icmd(gr, gr->bundle); 1412 else 1413 gf100_gr_icmd(gr, grctx->icmd); 1414 if (grctx->sw_veid_bundle_init) 1415 gf100_gr_icmd(gr, grctx->sw_veid_bundle_init); 1416 if (grctx->r400088) grctx->r400088(gr, true); 1417 1418 nvkm_wr32(device, 0x404154, idle_timeout); 1419 1420 if (gr->method) 1421 gf100_gr_mthd(gr, gr->method); 1422 else 1423 gf100_gr_mthd(gr, grctx->mthd); 1424 nvkm_mc_unk260(device, 1); 1425 1426 if (grctx->r419cb8) 1427 grctx->r419cb8(gr); 1428 if (grctx->r418800) 1429 grctx->r418800(gr); 1430 if (grctx->r419eb0) 1431 grctx->r419eb0(gr); 1432 if (grctx->r419e00) 1433 grctx->r419e00(gr); 1434 if (grctx->r418e94) 1435 grctx->r418e94(gr); 1436 if (grctx->r419a3c) 1437 grctx->r419a3c(gr); 1438 if (grctx->r408840) 1439 grctx->r408840(gr); 1440 if (grctx->r419c0c) 1441 grctx->r419c0c(gr); 1442 } 1443 1444 #define CB_RESERVED 0x80000 1445 1446 int 1447 gf100_grctx_generate(struct gf100_gr *gr, struct gf100_gr_chan *chan, struct nvkm_gpuobj *inst) 1448 { 1449 const struct gf100_grctx_func *grctx = gr->func->grctx; 1450 struct nvkm_subdev *subdev = &gr->base.engine.subdev; 1451 struct nvkm_device *device = subdev->device; 1452 struct nvkm_memory *data = NULL; 1453 struct nvkm_vma *ctx = NULL; 1454 struct gf100_grctx info; 1455 int ret, i; 1456 u64 addr; 1457 1458 /* NV_PGRAPH_FE_PWR_MODE_FORCE_ON. */ 1459 nvkm_wr32(device, 0x404170, 0x00000012); 1460 nvkm_msec(device, 2000, 1461 if (!(nvkm_rd32(device, 0x404170) & 0x00000010)) 1462 break; 1463 ); 1464 1465 if (grctx->unkn88c) 1466 grctx->unkn88c(gr, true); 1467 1468 /* Reset FECS. */ 1469 nvkm_wr32(device, 0x409614, 0x00000070); 1470 nvkm_usec(device, 10, NVKM_DELAY); 1471 nvkm_mask(device, 0x409614, 0x00000700, 0x00000700); 1472 nvkm_usec(device, 10, NVKM_DELAY); 1473 nvkm_rd32(device, 0x409614); 1474 1475 if (grctx->unkn88c) 1476 grctx->unkn88c(gr, false); 1477 1478 /* NV_PGRAPH_FE_PWR_MODE_AUTO. */ 1479 nvkm_wr32(device, 0x404170, 0x00000010); 1480 1481 /* Init SCC RAM. */ 1482 nvkm_wr32(device, 0x40802c, 0x00000001); 1483 1484 /* Allocate memory to store context, and dummy global context buffers. */ 1485 ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 1486 CB_RESERVED + gr->size, 0, true, &data); 1487 if (ret) 1488 goto done; 1489 1490 ret = nvkm_vmm_get(chan->vmm, 0, nvkm_memory_size(data), &ctx); 1491 if (ret) 1492 goto done; 1493 1494 ret = nvkm_memory_map(data, 0, chan->vmm, ctx, NULL, 0); 1495 if (ret) 1496 goto done; 1497 1498 /* Setup context pointer. */ 1499 nvkm_kmap(inst); 1500 nvkm_wo32(inst, 0x0210, lower_32_bits(ctx->addr + CB_RESERVED) | 4); 1501 nvkm_wo32(inst, 0x0214, upper_32_bits(ctx->addr + CB_RESERVED)); 1502 nvkm_done(inst); 1503 1504 /* Setup default state for mmio list construction. */ 1505 info.gr = gr; 1506 info.data = gr->mmio_data; 1507 info.mmio = gr->mmio_list; 1508 info.addr = ctx->addr; 1509 info.buffer_nr = 0; 1510 1511 /* Make channel current. */ 1512 addr = inst->addr >> 12; 1513 if (gr->firmware) { 1514 ret = gf100_gr_fecs_bind_pointer(gr, 0x80000000 | addr); 1515 if (ret) 1516 goto done_inst; 1517 1518 nvkm_kmap(data); 1519 nvkm_wo32(data, 0x1c, 1); 1520 nvkm_wo32(data, 0x20, 0); 1521 nvkm_wo32(data, 0x28, 0); 1522 nvkm_wo32(data, 0x2c, 0); 1523 nvkm_done(data); 1524 } else { 1525 nvkm_wr32(device, 0x409840, 0x80000000); 1526 nvkm_wr32(device, 0x409500, 0x80000000 | addr); 1527 nvkm_wr32(device, 0x409504, 0x00000001); 1528 nvkm_msec(device, 2000, 1529 if (nvkm_rd32(device, 0x409800) & 0x80000000) 1530 break; 1531 ); 1532 } 1533 1534 grctx->main(chan, &info); 1535 1536 /* Trigger a context unload by unsetting the "next channel valid" bit 1537 * and faking a context switch interrupt. 1538 */ 1539 nvkm_mask(device, 0x409b04, 0x80000000, 0x00000000); 1540 nvkm_wr32(device, 0x409000, 0x00000100); 1541 if (nvkm_msec(device, 2000, 1542 if (!(nvkm_rd32(device, 0x409b00) & 0x80000000)) 1543 break; 1544 ) < 0) { 1545 ret = -EBUSY; 1546 goto done_inst; 1547 } 1548 1549 gr->data = kmalloc(gr->size, GFP_KERNEL); 1550 if (gr->data) { 1551 nvkm_kmap(data); 1552 for (i = 0; i < gr->size; i += 4) 1553 gr->data[i / 4] = nvkm_ro32(data, CB_RESERVED + i); 1554 nvkm_done(data); 1555 ret = 0; 1556 } else { 1557 ret = -ENOMEM; 1558 } 1559 1560 done_inst: 1561 nvkm_kmap(inst); 1562 nvkm_wo32(inst, 0x0210, 0); 1563 nvkm_wo32(inst, 0x0214, 0); 1564 nvkm_done(inst); 1565 done: 1566 nvkm_vmm_put(chan->vmm, &ctx); 1567 nvkm_memory_unref(&data); 1568 return ret; 1569 } 1570 1571 const struct gf100_grctx_func 1572 gf100_grctx = { 1573 .main = gf100_grctx_generate_main, 1574 .unkn = gf100_grctx_generate_unkn, 1575 .hub = gf100_grctx_pack_hub, 1576 .gpc_0 = gf100_grctx_pack_gpc_0, 1577 .gpc_1 = gf100_grctx_pack_gpc_1, 1578 .zcull = gf100_grctx_pack_zcull, 1579 .tpc = gf100_grctx_pack_tpc, 1580 .icmd = gf100_grctx_pack_icmd, 1581 .mthd = gf100_grctx_pack_mthd, 1582 .bundle = gf100_grctx_generate_bundle, 1583 .bundle_size = 0x1800, 1584 .pagepool = gf100_grctx_generate_pagepool, 1585 .pagepool_size = 0x8000, 1586 .attrib = gf100_grctx_generate_attrib, 1587 .attrib_nr_max = 0x324, 1588 .attrib_nr = 0x218, 1589 .sm_id = gf100_grctx_generate_sm_id, 1590 .tpc_nr = gf100_grctx_generate_tpc_nr, 1591 .r4060a8 = gf100_grctx_generate_r4060a8, 1592 .rop_mapping = gf100_grctx_generate_rop_mapping, 1593 .alpha_beta_tables = gf100_grctx_generate_alpha_beta_tables, 1594 .max_ways_evict = gf100_grctx_generate_max_ways_evict, 1595 .r419cb8 = gf100_grctx_generate_r419cb8, 1596 }; 1597