1*f7018c21STomi Valkeinen #include "radeonfb.h" 2*f7018c21STomi Valkeinen 3*f7018c21STomi Valkeinen /* the accelerated functions here are patterned after the 4*f7018c21STomi Valkeinen * "ACCEL_MMIO" ifdef branches in XFree86 5*f7018c21STomi Valkeinen * --dte 6*f7018c21STomi Valkeinen */ 7*f7018c21STomi Valkeinen 8*f7018c21STomi Valkeinen static void radeon_fixup_offset(struct radeonfb_info *rinfo) 9*f7018c21STomi Valkeinen { 10*f7018c21STomi Valkeinen u32 local_base; 11*f7018c21STomi Valkeinen 12*f7018c21STomi Valkeinen /* *** Ugly workaround *** */ 13*f7018c21STomi Valkeinen /* 14*f7018c21STomi Valkeinen * On some platforms, the video memory is mapped at 0 in radeon chip space 15*f7018c21STomi Valkeinen * (like PPCs) by the firmware. X will always move it up so that it's seen 16*f7018c21STomi Valkeinen * by the chip to be at the same address as the PCI BAR. 17*f7018c21STomi Valkeinen * That means that when switching back from X, there is a mismatch between 18*f7018c21STomi Valkeinen * the offsets programmed into the engine. This means that potentially, 19*f7018c21STomi Valkeinen * accel operations done before radeonfb has a chance to re-init the engine 20*f7018c21STomi Valkeinen * will have incorrect offsets, and potentially trash system memory ! 21*f7018c21STomi Valkeinen * 22*f7018c21STomi Valkeinen * The correct fix is for fbcon to never call any accel op before the engine 23*f7018c21STomi Valkeinen * has properly been re-initialized (by a call to set_var), but this is a 24*f7018c21STomi Valkeinen * complex fix. This workaround in the meantime, called before every accel 25*f7018c21STomi Valkeinen * operation, makes sure the offsets are in sync. 26*f7018c21STomi Valkeinen */ 27*f7018c21STomi Valkeinen 28*f7018c21STomi Valkeinen radeon_fifo_wait (1); 29*f7018c21STomi Valkeinen local_base = INREG(MC_FB_LOCATION) << 16; 30*f7018c21STomi Valkeinen if (local_base == rinfo->fb_local_base) 31*f7018c21STomi Valkeinen return; 32*f7018c21STomi Valkeinen 33*f7018c21STomi Valkeinen rinfo->fb_local_base = local_base; 34*f7018c21STomi Valkeinen 35*f7018c21STomi Valkeinen radeon_fifo_wait (3); 36*f7018c21STomi Valkeinen OUTREG(DEFAULT_PITCH_OFFSET, (rinfo->pitch << 0x16) | 37*f7018c21STomi Valkeinen (rinfo->fb_local_base >> 10)); 38*f7018c21STomi Valkeinen OUTREG(DST_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10)); 39*f7018c21STomi Valkeinen OUTREG(SRC_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10)); 40*f7018c21STomi Valkeinen } 41*f7018c21STomi Valkeinen 42*f7018c21STomi Valkeinen static void radeonfb_prim_fillrect(struct radeonfb_info *rinfo, 43*f7018c21STomi Valkeinen const struct fb_fillrect *region) 44*f7018c21STomi Valkeinen { 45*f7018c21STomi Valkeinen radeon_fifo_wait(4); 46*f7018c21STomi Valkeinen 47*f7018c21STomi Valkeinen OUTREG(DP_GUI_MASTER_CNTL, 48*f7018c21STomi Valkeinen rinfo->dp_gui_master_cntl /* contains, like GMC_DST_32BPP */ 49*f7018c21STomi Valkeinen | GMC_BRUSH_SOLID_COLOR 50*f7018c21STomi Valkeinen | ROP3_P); 51*f7018c21STomi Valkeinen if (radeon_get_dstbpp(rinfo->depth) != DST_8BPP) 52*f7018c21STomi Valkeinen OUTREG(DP_BRUSH_FRGD_CLR, rinfo->pseudo_palette[region->color]); 53*f7018c21STomi Valkeinen else 54*f7018c21STomi Valkeinen OUTREG(DP_BRUSH_FRGD_CLR, region->color); 55*f7018c21STomi Valkeinen OUTREG(DP_WRITE_MSK, 0xffffffff); 56*f7018c21STomi Valkeinen OUTREG(DP_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM)); 57*f7018c21STomi Valkeinen 58*f7018c21STomi Valkeinen radeon_fifo_wait(2); 59*f7018c21STomi Valkeinen OUTREG(DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL); 60*f7018c21STomi Valkeinen OUTREG(WAIT_UNTIL, (WAIT_2D_IDLECLEAN | WAIT_DMA_GUI_IDLE)); 61*f7018c21STomi Valkeinen 62*f7018c21STomi Valkeinen radeon_fifo_wait(2); 63*f7018c21STomi Valkeinen OUTREG(DST_Y_X, (region->dy << 16) | region->dx); 64*f7018c21STomi Valkeinen OUTREG(DST_WIDTH_HEIGHT, (region->width << 16) | region->height); 65*f7018c21STomi Valkeinen } 66*f7018c21STomi Valkeinen 67*f7018c21STomi Valkeinen void radeonfb_fillrect(struct fb_info *info, const struct fb_fillrect *region) 68*f7018c21STomi Valkeinen { 69*f7018c21STomi Valkeinen struct radeonfb_info *rinfo = info->par; 70*f7018c21STomi Valkeinen struct fb_fillrect modded; 71*f7018c21STomi Valkeinen int vxres, vyres; 72*f7018c21STomi Valkeinen 73*f7018c21STomi Valkeinen if (info->state != FBINFO_STATE_RUNNING) 74*f7018c21STomi Valkeinen return; 75*f7018c21STomi Valkeinen if (info->flags & FBINFO_HWACCEL_DISABLED) { 76*f7018c21STomi Valkeinen cfb_fillrect(info, region); 77*f7018c21STomi Valkeinen return; 78*f7018c21STomi Valkeinen } 79*f7018c21STomi Valkeinen 80*f7018c21STomi Valkeinen radeon_fixup_offset(rinfo); 81*f7018c21STomi Valkeinen 82*f7018c21STomi Valkeinen vxres = info->var.xres_virtual; 83*f7018c21STomi Valkeinen vyres = info->var.yres_virtual; 84*f7018c21STomi Valkeinen 85*f7018c21STomi Valkeinen memcpy(&modded, region, sizeof(struct fb_fillrect)); 86*f7018c21STomi Valkeinen 87*f7018c21STomi Valkeinen if(!modded.width || !modded.height || 88*f7018c21STomi Valkeinen modded.dx >= vxres || modded.dy >= vyres) 89*f7018c21STomi Valkeinen return; 90*f7018c21STomi Valkeinen 91*f7018c21STomi Valkeinen if(modded.dx + modded.width > vxres) modded.width = vxres - modded.dx; 92*f7018c21STomi Valkeinen if(modded.dy + modded.height > vyres) modded.height = vyres - modded.dy; 93*f7018c21STomi Valkeinen 94*f7018c21STomi Valkeinen radeonfb_prim_fillrect(rinfo, &modded); 95*f7018c21STomi Valkeinen } 96*f7018c21STomi Valkeinen 97*f7018c21STomi Valkeinen static void radeonfb_prim_copyarea(struct radeonfb_info *rinfo, 98*f7018c21STomi Valkeinen const struct fb_copyarea *area) 99*f7018c21STomi Valkeinen { 100*f7018c21STomi Valkeinen int xdir, ydir; 101*f7018c21STomi Valkeinen u32 sx, sy, dx, dy, w, h; 102*f7018c21STomi Valkeinen 103*f7018c21STomi Valkeinen w = area->width; h = area->height; 104*f7018c21STomi Valkeinen dx = area->dx; dy = area->dy; 105*f7018c21STomi Valkeinen sx = area->sx; sy = area->sy; 106*f7018c21STomi Valkeinen xdir = sx - dx; 107*f7018c21STomi Valkeinen ydir = sy - dy; 108*f7018c21STomi Valkeinen 109*f7018c21STomi Valkeinen if ( xdir < 0 ) { sx += w-1; dx += w-1; } 110*f7018c21STomi Valkeinen if ( ydir < 0 ) { sy += h-1; dy += h-1; } 111*f7018c21STomi Valkeinen 112*f7018c21STomi Valkeinen radeon_fifo_wait(3); 113*f7018c21STomi Valkeinen OUTREG(DP_GUI_MASTER_CNTL, 114*f7018c21STomi Valkeinen rinfo->dp_gui_master_cntl /* i.e. GMC_DST_32BPP */ 115*f7018c21STomi Valkeinen | GMC_BRUSH_NONE 116*f7018c21STomi Valkeinen | GMC_SRC_DSTCOLOR 117*f7018c21STomi Valkeinen | ROP3_S 118*f7018c21STomi Valkeinen | DP_SRC_SOURCE_MEMORY ); 119*f7018c21STomi Valkeinen OUTREG(DP_WRITE_MSK, 0xffffffff); 120*f7018c21STomi Valkeinen OUTREG(DP_CNTL, (xdir>=0 ? DST_X_LEFT_TO_RIGHT : 0) 121*f7018c21STomi Valkeinen | (ydir>=0 ? DST_Y_TOP_TO_BOTTOM : 0)); 122*f7018c21STomi Valkeinen 123*f7018c21STomi Valkeinen radeon_fifo_wait(2); 124*f7018c21STomi Valkeinen OUTREG(DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL); 125*f7018c21STomi Valkeinen OUTREG(WAIT_UNTIL, (WAIT_2D_IDLECLEAN | WAIT_DMA_GUI_IDLE)); 126*f7018c21STomi Valkeinen 127*f7018c21STomi Valkeinen radeon_fifo_wait(3); 128*f7018c21STomi Valkeinen OUTREG(SRC_Y_X, (sy << 16) | sx); 129*f7018c21STomi Valkeinen OUTREG(DST_Y_X, (dy << 16) | dx); 130*f7018c21STomi Valkeinen OUTREG(DST_HEIGHT_WIDTH, (h << 16) | w); 131*f7018c21STomi Valkeinen } 132*f7018c21STomi Valkeinen 133*f7018c21STomi Valkeinen 134*f7018c21STomi Valkeinen void radeonfb_copyarea(struct fb_info *info, const struct fb_copyarea *area) 135*f7018c21STomi Valkeinen { 136*f7018c21STomi Valkeinen struct radeonfb_info *rinfo = info->par; 137*f7018c21STomi Valkeinen struct fb_copyarea modded; 138*f7018c21STomi Valkeinen u32 vxres, vyres; 139*f7018c21STomi Valkeinen modded.sx = area->sx; 140*f7018c21STomi Valkeinen modded.sy = area->sy; 141*f7018c21STomi Valkeinen modded.dx = area->dx; 142*f7018c21STomi Valkeinen modded.dy = area->dy; 143*f7018c21STomi Valkeinen modded.width = area->width; 144*f7018c21STomi Valkeinen modded.height = area->height; 145*f7018c21STomi Valkeinen 146*f7018c21STomi Valkeinen if (info->state != FBINFO_STATE_RUNNING) 147*f7018c21STomi Valkeinen return; 148*f7018c21STomi Valkeinen if (info->flags & FBINFO_HWACCEL_DISABLED) { 149*f7018c21STomi Valkeinen cfb_copyarea(info, area); 150*f7018c21STomi Valkeinen return; 151*f7018c21STomi Valkeinen } 152*f7018c21STomi Valkeinen 153*f7018c21STomi Valkeinen radeon_fixup_offset(rinfo); 154*f7018c21STomi Valkeinen 155*f7018c21STomi Valkeinen vxres = info->var.xres_virtual; 156*f7018c21STomi Valkeinen vyres = info->var.yres_virtual; 157*f7018c21STomi Valkeinen 158*f7018c21STomi Valkeinen if(!modded.width || !modded.height || 159*f7018c21STomi Valkeinen modded.sx >= vxres || modded.sy >= vyres || 160*f7018c21STomi Valkeinen modded.dx >= vxres || modded.dy >= vyres) 161*f7018c21STomi Valkeinen return; 162*f7018c21STomi Valkeinen 163*f7018c21STomi Valkeinen if(modded.sx + modded.width > vxres) modded.width = vxres - modded.sx; 164*f7018c21STomi Valkeinen if(modded.dx + modded.width > vxres) modded.width = vxres - modded.dx; 165*f7018c21STomi Valkeinen if(modded.sy + modded.height > vyres) modded.height = vyres - modded.sy; 166*f7018c21STomi Valkeinen if(modded.dy + modded.height > vyres) modded.height = vyres - modded.dy; 167*f7018c21STomi Valkeinen 168*f7018c21STomi Valkeinen radeonfb_prim_copyarea(rinfo, &modded); 169*f7018c21STomi Valkeinen } 170*f7018c21STomi Valkeinen 171*f7018c21STomi Valkeinen void radeonfb_imageblit(struct fb_info *info, const struct fb_image *image) 172*f7018c21STomi Valkeinen { 173*f7018c21STomi Valkeinen struct radeonfb_info *rinfo = info->par; 174*f7018c21STomi Valkeinen 175*f7018c21STomi Valkeinen if (info->state != FBINFO_STATE_RUNNING) 176*f7018c21STomi Valkeinen return; 177*f7018c21STomi Valkeinen radeon_engine_idle(); 178*f7018c21STomi Valkeinen 179*f7018c21STomi Valkeinen cfb_imageblit(info, image); 180*f7018c21STomi Valkeinen } 181*f7018c21STomi Valkeinen 182*f7018c21STomi Valkeinen int radeonfb_sync(struct fb_info *info) 183*f7018c21STomi Valkeinen { 184*f7018c21STomi Valkeinen struct radeonfb_info *rinfo = info->par; 185*f7018c21STomi Valkeinen 186*f7018c21STomi Valkeinen if (info->state != FBINFO_STATE_RUNNING) 187*f7018c21STomi Valkeinen return 0; 188*f7018c21STomi Valkeinen radeon_engine_idle(); 189*f7018c21STomi Valkeinen 190*f7018c21STomi Valkeinen return 0; 191*f7018c21STomi Valkeinen } 192*f7018c21STomi Valkeinen 193*f7018c21STomi Valkeinen void radeonfb_engine_reset(struct radeonfb_info *rinfo) 194*f7018c21STomi Valkeinen { 195*f7018c21STomi Valkeinen u32 clock_cntl_index, mclk_cntl, rbbm_soft_reset; 196*f7018c21STomi Valkeinen u32 host_path_cntl; 197*f7018c21STomi Valkeinen 198*f7018c21STomi Valkeinen radeon_engine_flush (rinfo); 199*f7018c21STomi Valkeinen 200*f7018c21STomi Valkeinen clock_cntl_index = INREG(CLOCK_CNTL_INDEX); 201*f7018c21STomi Valkeinen mclk_cntl = INPLL(MCLK_CNTL); 202*f7018c21STomi Valkeinen 203*f7018c21STomi Valkeinen OUTPLL(MCLK_CNTL, (mclk_cntl | 204*f7018c21STomi Valkeinen FORCEON_MCLKA | 205*f7018c21STomi Valkeinen FORCEON_MCLKB | 206*f7018c21STomi Valkeinen FORCEON_YCLKA | 207*f7018c21STomi Valkeinen FORCEON_YCLKB | 208*f7018c21STomi Valkeinen FORCEON_MC | 209*f7018c21STomi Valkeinen FORCEON_AIC)); 210*f7018c21STomi Valkeinen 211*f7018c21STomi Valkeinen host_path_cntl = INREG(HOST_PATH_CNTL); 212*f7018c21STomi Valkeinen rbbm_soft_reset = INREG(RBBM_SOFT_RESET); 213*f7018c21STomi Valkeinen 214*f7018c21STomi Valkeinen if (IS_R300_VARIANT(rinfo)) { 215*f7018c21STomi Valkeinen u32 tmp; 216*f7018c21STomi Valkeinen 217*f7018c21STomi Valkeinen OUTREG(RBBM_SOFT_RESET, (rbbm_soft_reset | 218*f7018c21STomi Valkeinen SOFT_RESET_CP | 219*f7018c21STomi Valkeinen SOFT_RESET_HI | 220*f7018c21STomi Valkeinen SOFT_RESET_E2)); 221*f7018c21STomi Valkeinen INREG(RBBM_SOFT_RESET); 222*f7018c21STomi Valkeinen OUTREG(RBBM_SOFT_RESET, 0); 223*f7018c21STomi Valkeinen tmp = INREG(RB2D_DSTCACHE_MODE); 224*f7018c21STomi Valkeinen OUTREG(RB2D_DSTCACHE_MODE, tmp | (1 << 17)); /* FIXME */ 225*f7018c21STomi Valkeinen } else { 226*f7018c21STomi Valkeinen OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset | 227*f7018c21STomi Valkeinen SOFT_RESET_CP | 228*f7018c21STomi Valkeinen SOFT_RESET_HI | 229*f7018c21STomi Valkeinen SOFT_RESET_SE | 230*f7018c21STomi Valkeinen SOFT_RESET_RE | 231*f7018c21STomi Valkeinen SOFT_RESET_PP | 232*f7018c21STomi Valkeinen SOFT_RESET_E2 | 233*f7018c21STomi Valkeinen SOFT_RESET_RB); 234*f7018c21STomi Valkeinen INREG(RBBM_SOFT_RESET); 235*f7018c21STomi Valkeinen OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset & (u32) 236*f7018c21STomi Valkeinen ~(SOFT_RESET_CP | 237*f7018c21STomi Valkeinen SOFT_RESET_HI | 238*f7018c21STomi Valkeinen SOFT_RESET_SE | 239*f7018c21STomi Valkeinen SOFT_RESET_RE | 240*f7018c21STomi Valkeinen SOFT_RESET_PP | 241*f7018c21STomi Valkeinen SOFT_RESET_E2 | 242*f7018c21STomi Valkeinen SOFT_RESET_RB)); 243*f7018c21STomi Valkeinen INREG(RBBM_SOFT_RESET); 244*f7018c21STomi Valkeinen } 245*f7018c21STomi Valkeinen 246*f7018c21STomi Valkeinen OUTREG(HOST_PATH_CNTL, host_path_cntl | HDP_SOFT_RESET); 247*f7018c21STomi Valkeinen INREG(HOST_PATH_CNTL); 248*f7018c21STomi Valkeinen OUTREG(HOST_PATH_CNTL, host_path_cntl); 249*f7018c21STomi Valkeinen 250*f7018c21STomi Valkeinen if (!IS_R300_VARIANT(rinfo)) 251*f7018c21STomi Valkeinen OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset); 252*f7018c21STomi Valkeinen 253*f7018c21STomi Valkeinen OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index); 254*f7018c21STomi Valkeinen OUTPLL(MCLK_CNTL, mclk_cntl); 255*f7018c21STomi Valkeinen } 256*f7018c21STomi Valkeinen 257*f7018c21STomi Valkeinen void radeonfb_engine_init (struct radeonfb_info *rinfo) 258*f7018c21STomi Valkeinen { 259*f7018c21STomi Valkeinen unsigned long temp; 260*f7018c21STomi Valkeinen 261*f7018c21STomi Valkeinen /* disable 3D engine */ 262*f7018c21STomi Valkeinen OUTREG(RB3D_CNTL, 0); 263*f7018c21STomi Valkeinen 264*f7018c21STomi Valkeinen radeonfb_engine_reset(rinfo); 265*f7018c21STomi Valkeinen 266*f7018c21STomi Valkeinen radeon_fifo_wait (1); 267*f7018c21STomi Valkeinen if (IS_R300_VARIANT(rinfo)) { 268*f7018c21STomi Valkeinen OUTREG(RB2D_DSTCACHE_MODE, INREG(RB2D_DSTCACHE_MODE) | 269*f7018c21STomi Valkeinen RB2D_DC_AUTOFLUSH_ENABLE | 270*f7018c21STomi Valkeinen RB2D_DC_DC_DISABLE_IGNORE_PE); 271*f7018c21STomi Valkeinen } else { 272*f7018c21STomi Valkeinen /* This needs to be double checked with ATI. Latest X driver 273*f7018c21STomi Valkeinen * completely "forgets" to set this register on < r3xx, and 274*f7018c21STomi Valkeinen * we used to just write 0 there... I'll keep the 0 and update 275*f7018c21STomi Valkeinen * that when we have sorted things out on X side. 276*f7018c21STomi Valkeinen */ 277*f7018c21STomi Valkeinen OUTREG(RB2D_DSTCACHE_MODE, 0); 278*f7018c21STomi Valkeinen } 279*f7018c21STomi Valkeinen 280*f7018c21STomi Valkeinen radeon_fifo_wait (3); 281*f7018c21STomi Valkeinen /* We re-read MC_FB_LOCATION from card as it can have been 282*f7018c21STomi Valkeinen * modified by XFree drivers (ouch !) 283*f7018c21STomi Valkeinen */ 284*f7018c21STomi Valkeinen rinfo->fb_local_base = INREG(MC_FB_LOCATION) << 16; 285*f7018c21STomi Valkeinen 286*f7018c21STomi Valkeinen OUTREG(DEFAULT_PITCH_OFFSET, (rinfo->pitch << 0x16) | 287*f7018c21STomi Valkeinen (rinfo->fb_local_base >> 10)); 288*f7018c21STomi Valkeinen OUTREG(DST_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10)); 289*f7018c21STomi Valkeinen OUTREG(SRC_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10)); 290*f7018c21STomi Valkeinen 291*f7018c21STomi Valkeinen radeon_fifo_wait (1); 292*f7018c21STomi Valkeinen #if defined(__BIG_ENDIAN) 293*f7018c21STomi Valkeinen OUTREGP(DP_DATATYPE, HOST_BIG_ENDIAN_EN, ~HOST_BIG_ENDIAN_EN); 294*f7018c21STomi Valkeinen #else 295*f7018c21STomi Valkeinen OUTREGP(DP_DATATYPE, 0, ~HOST_BIG_ENDIAN_EN); 296*f7018c21STomi Valkeinen #endif 297*f7018c21STomi Valkeinen radeon_fifo_wait (2); 298*f7018c21STomi Valkeinen OUTREG(DEFAULT_SC_TOP_LEFT, 0); 299*f7018c21STomi Valkeinen OUTREG(DEFAULT_SC_BOTTOM_RIGHT, (DEFAULT_SC_RIGHT_MAX | 300*f7018c21STomi Valkeinen DEFAULT_SC_BOTTOM_MAX)); 301*f7018c21STomi Valkeinen 302*f7018c21STomi Valkeinen temp = radeon_get_dstbpp(rinfo->depth); 303*f7018c21STomi Valkeinen rinfo->dp_gui_master_cntl = ((temp << 8) | GMC_CLR_CMP_CNTL_DIS); 304*f7018c21STomi Valkeinen 305*f7018c21STomi Valkeinen radeon_fifo_wait (1); 306*f7018c21STomi Valkeinen OUTREG(DP_GUI_MASTER_CNTL, (rinfo->dp_gui_master_cntl | 307*f7018c21STomi Valkeinen GMC_BRUSH_SOLID_COLOR | 308*f7018c21STomi Valkeinen GMC_SRC_DATATYPE_COLOR)); 309*f7018c21STomi Valkeinen 310*f7018c21STomi Valkeinen radeon_fifo_wait (7); 311*f7018c21STomi Valkeinen 312*f7018c21STomi Valkeinen /* clear line drawing regs */ 313*f7018c21STomi Valkeinen OUTREG(DST_LINE_START, 0); 314*f7018c21STomi Valkeinen OUTREG(DST_LINE_END, 0); 315*f7018c21STomi Valkeinen 316*f7018c21STomi Valkeinen /* set brush color regs */ 317*f7018c21STomi Valkeinen OUTREG(DP_BRUSH_FRGD_CLR, 0xffffffff); 318*f7018c21STomi Valkeinen OUTREG(DP_BRUSH_BKGD_CLR, 0x00000000); 319*f7018c21STomi Valkeinen 320*f7018c21STomi Valkeinen /* set source color regs */ 321*f7018c21STomi Valkeinen OUTREG(DP_SRC_FRGD_CLR, 0xffffffff); 322*f7018c21STomi Valkeinen OUTREG(DP_SRC_BKGD_CLR, 0x00000000); 323*f7018c21STomi Valkeinen 324*f7018c21STomi Valkeinen /* default write mask */ 325*f7018c21STomi Valkeinen OUTREG(DP_WRITE_MSK, 0xffffffff); 326*f7018c21STomi Valkeinen 327*f7018c21STomi Valkeinen radeon_engine_idle (); 328*f7018c21STomi Valkeinen } 329