English/Español
Cómo escribir el código de inicialización de contexto de las tarjetas (fundamentalmente nv4x)
Esta página hace referencia a tarjetas nv4X, pero es posible que el método funcione con otras. Casi toda la información aquí recogida se obtuvo del registro de IRC.
El proceso de obtención del código que incializa el contexto de la tarjeta consta de los siguientes pasos:
obtención de ctx_voodo (palabras mágicas)
localización de las escrituras INSTANCE_WR
obtención de NVXX_GRCTX_SIZE
integración de la nueva inicialización echando un vistazo al código y buscando refugio para hacer pruebas
Obtención de '''ctx_voodoo'''
Existe un ejemplo de ctx_voodo en el archivo nv40_graph.c. Se trata con toda probabilidad de microcódigo utilizado por las tarjetas de Nvidia, y es posible obtenerlo usando MmioTrace. En las trazas interpretadas de mmio (E/S "mapeada" en memoria) se ha de localizar una escritura única en el registro 0x400324, seguida por múltiples escrituras en el registro 0x400328.
Fíjate que la escritura en 0x00400324 es (casi siempre) cero. Es probable que establezca la posición inicial de un registro índice que dirige las escrituras en el registro 0x00400328. Es probable que 0x00400324 incremente su valor de forma automática.
write32 #1 0x00400324 <- 0x00000000 write32 #1 0x00400328 <- 0x00400889 write32 #1 0x00400328 <- 0x00200000 write32 #1 0x00400328 <- 0x0060000a write32 #1 0x00400328 <- 0x00200000 write32 #1 0x00400328 <- 0x00300000 ...
Toma todas las escrituras a 0x00400328 han de guardarse en un vector llamado static uint32_t nvXX_ctx_voodoo[] (XX es el tipo de tarjeta), finalizando el vector con ~0 (0xFFFF).
Localización de las escrituras INSTANCE_WR
No tengo ni idea sobre el significado de estas escrituras, solamente sabemos cómo obtenerlas. Descarga primero [REnouveau] y aplica el parche. Uno de estos podría funcionar en el caso de una tarjeta nv4X, aunque es posible que falle. En este caso habría que hacer uno propio echándole un vistazo a estos de ejemplo. También mira el Irclog a partir de las 19:20h.
Una vez aplicado el parche y ejecutado Renouveau, busca en el archivo card_stdout.txt (o, tal vez, *graph_ctx_dump.txt, si existe) las cadenas GRCTX[0x. Una vez encontradas, ignora los valores nulos (la mayoría valdrán cero) y convierte en bucles las escrituras reiteradas del mismo valor. Con esto ya se tiene la parte INSTANCE_WR !
Graphics context at RAMIN+0x00083340 GRCTX[0x00000000] = 0x00008334 GRCTX[0x00000004] = 0x00000000 GRCTX[0x00000008] = 0x00000000 GRCTX[0x0000000c] = 0x00000000 GRCTX[0x00000010] = 0x00000000 GRCTX[0x00000014] = 0x00000000 GRCTX[0x00000018] = 0x00000000 GRCTX[0x0000001c] = 0x00000000 GRCTX[0x00000020] = 0x00000000 GRCTX[0x00000024] = 0x0000ffff GRCTX[0x00000028] = 0x0000ffff GRCTX[0x0000002c] = 0x00000000 GRCTX[0x00000030] = 0x00000001 GRCTX[0x00000034] = 0x00000000 GRCTX[0x00000038] = 0x00000000 GRCTX[0x0000003c] = 0x00000000
Registro del IRC para la tarjeta nv44 y su parche: http://users.on.net/~darktama/renouveau-dump-nv44-grctx.diff .
19:40 < stillunknown> You say the nv44 method works always?
19:40 < darktama> no, it can still fail in quite a number of ways
19:41 < darktama> stillunknown: it'll fail if renouveau doesn't get assigned channel 2.. or if the context is in a part of instance memory not accesible through the "main" mmio regs
19:41 < mg> Graphics context at RAMIN+0x00409050... *not* a graphics context
19:41 < mg> Graphics context at RAMIN+0x00409050... *not* a graphics context
19:41 < pq> mg, it might or might not crash, look for Xid messages in kernel log
19:43 < mg> anyhow i have xis
19:47 < darktama> yup, got it.. can you add a printf("0x%08x\n", all_regs[0x2220/4]); somewhere please?
19:48 < darktama> just before the "ramfc_offset = " line will do.. doesn't really matter.
19:48 < darktama> the same for all_regs[0x0072000c/4]
19:54 < mg> darktama: all_regs[0x2220/4]: 0x00030002
19:55 < mg> darktama: all_regs[0x0072000c/4]: 0x00005029
19:55 < darktama> mg: ok, nvidia weren't being helpful :) the 0x72000c value looks promising though.. so..
19:56 < darktama> change the "ramfc = " line to "ramfc = &all_regs[(0x00700000 + 0x20000 + (CTX_DUMP_CHANNEL * 128))/4];"
20:00 < mg> ok I got a dump nowSi el archivo card_stdout.txt contiene ... *not* a graphics context, es preciso ajustar el parche. Para ello, mejor pregunta en el IRC.
NV44_GRCTX_SIZE
Es, más o menos, el tamaño de las escrituras INSTANCE_WR... Mientras sea suficientemente grande(256x1024) debería funcionar, aunque si quieres obtener el tamaño correcto, será necesario identificar el inicio de otro grctx y calcular la distancia.
Con esto, debería ser suficiente para crear una nueva inicialización de contexto para tu tarjeta. Si tienes dudas, mira el código fuente (DRM nv40_graph.c y similares), o pregunta en el canal IRC. Siempre son bienvenidos nuevos desarrolladores y el canal es un lugar acogedor y amable.

