@ -1812,6 +1812,7 @@ nvc0_grctx_generate(struct nouveau_channel *chan)
/* calculate first set of magics */
memcpy ( tpnr , priv - > tp_nr , sizeof ( priv - > tp_nr ) ) ;
gpc = - 1 ;
for ( tp = 0 ; tp < priv - > tp_total ; tp + + ) {
do {
gpc = ( gpc + 1 ) % priv - > gpc_nr ;
@ -1861,30 +1862,26 @@ nvc0_grctx_generate(struct nouveau_channel *chan)
if ( 1 ) {
u32 tp_mask = 0 , tp_set = 0 ;
u8 tpnr [ GPC_MAX ] ;
u8 tpnr [ GPC_MAX ] , a , b ;
memcpy ( tpnr , priv - > tp_nr , sizeof ( priv - > tp_nr ) ) ;
for ( gpc = 0 ; gpc < priv - > gpc_nr ; gpc + + )
tp_mask | = ( ( 1 < < priv - > tp_nr [ gpc ] ) - 1 ) < < ( gpc * 8 ) ;
gpc = - 1 ;
for ( i = 0 , gpc = - 1 ; i < 32 ; i + + ) {
int ltp = i * ( priv - > tp_total - 1 ) / 32 ;
do {
gpc = ( gpc + 1 ) % priv - > gpc_nr ;
} while ( ! tpnr [ gpc ] ) ;
tp = priv - > tp_nr [ gpc ] - tpnr [ gpc ] - - ;
for ( i = 0 , gpc = - 1 , b = - 1 ; i < 32 ; i + + ) {
a = ( i * ( priv - > tp_total - 1 ) ) / 32 ;
if ( a ! = b ) {
b = a ;
do {
gpc = ( gpc + 1 ) % priv - > gpc_nr ;
} while ( ! tpnr [ gpc ] ) ;
tp = priv - > tp_nr [ gpc ] - tpnr [ gpc ] - - ;
tp_set | = 1 < < ( ( gpc * 8 ) + tp ) ;
tp_set | = 1 < < ( ( gpc * 8 ) + tp ) ;
}
do {
nv_wr32 ( dev , 0x406800 + ( i * 0x20 ) , tp_set ) ;
tp_set ^ = tp_mask ;
nv_wr32 ( dev , 0x406c00 + ( i * 0x20 ) , tp_set ) ;
tp_set ^ = tp_mask ;
} while ( ltp = = ( + + i * ( priv - > tp_total - 1 ) / 32 ) ) ;
i - - ;
nv_wr32 ( dev , 0x406800 + ( i * 0x20 ) , tp_set ) ;
nv_wr32 ( dev , 0x406c00 + ( i * 0x20 ) , tp_set ^ tp_mask ) ;
}
}