162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include "radeonfb.h"
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci/* the accelerated functions here are patterned after the
562306a36Sopenharmony_ci * "ACCEL_MMIO" ifdef branches in XFree86
662306a36Sopenharmony_ci * --dte
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistatic void radeon_fixup_offset(struct radeonfb_info *rinfo)
1062306a36Sopenharmony_ci{
1162306a36Sopenharmony_ci	u32 local_base;
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci	/* *** Ugly workaround *** */
1462306a36Sopenharmony_ci	/*
1562306a36Sopenharmony_ci	 * On some platforms, the video memory is mapped at 0 in radeon chip space
1662306a36Sopenharmony_ci	 * (like PPCs) by the firmware. X will always move it up so that it's seen
1762306a36Sopenharmony_ci	 * by the chip to be at the same address as the PCI BAR.
1862306a36Sopenharmony_ci	 * That means that when switching back from X, there is a mismatch between
1962306a36Sopenharmony_ci	 * the offsets programmed into the engine. This means that potentially,
2062306a36Sopenharmony_ci	 * accel operations done before radeonfb has a chance to re-init the engine
2162306a36Sopenharmony_ci	 * will have incorrect offsets, and potentially trash system memory !
2262306a36Sopenharmony_ci	 *
2362306a36Sopenharmony_ci	 * The correct fix is for fbcon to never call any accel op before the engine
2462306a36Sopenharmony_ci	 * has properly been re-initialized (by a call to set_var), but this is a
2562306a36Sopenharmony_ci	 * complex fix. This workaround in the meantime, called before every accel
2662306a36Sopenharmony_ci	 * operation, makes sure the offsets are in sync.
2762306a36Sopenharmony_ci	 */
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	radeon_fifo_wait (1);
3062306a36Sopenharmony_ci	local_base = INREG(MC_FB_LOCATION) << 16;
3162306a36Sopenharmony_ci	if (local_base == rinfo->fb_local_base)
3262306a36Sopenharmony_ci		return;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	rinfo->fb_local_base = local_base;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	radeon_fifo_wait (3);
3762306a36Sopenharmony_ci	OUTREG(DEFAULT_PITCH_OFFSET, (rinfo->pitch << 0x16) |
3862306a36Sopenharmony_ci				     (rinfo->fb_local_base >> 10));
3962306a36Sopenharmony_ci	OUTREG(DST_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10));
4062306a36Sopenharmony_ci	OUTREG(SRC_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10));
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic void radeonfb_prim_fillrect(struct radeonfb_info *rinfo,
4462306a36Sopenharmony_ci				   const struct fb_fillrect *region)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	radeon_fifo_wait(4);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	OUTREG(DP_GUI_MASTER_CNTL,
4962306a36Sopenharmony_ci		rinfo->dp_gui_master_cntl  /* contains, like GMC_DST_32BPP */
5062306a36Sopenharmony_ci                | GMC_BRUSH_SOLID_COLOR
5162306a36Sopenharmony_ci                | ROP3_P);
5262306a36Sopenharmony_ci	if (radeon_get_dstbpp(rinfo->depth) != DST_8BPP)
5362306a36Sopenharmony_ci		OUTREG(DP_BRUSH_FRGD_CLR, rinfo->pseudo_palette[region->color]);
5462306a36Sopenharmony_ci	else
5562306a36Sopenharmony_ci		OUTREG(DP_BRUSH_FRGD_CLR, region->color);
5662306a36Sopenharmony_ci	OUTREG(DP_WRITE_MSK, 0xffffffff);
5762306a36Sopenharmony_ci	OUTREG(DP_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM));
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	radeon_fifo_wait(2);
6062306a36Sopenharmony_ci	OUTREG(DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL);
6162306a36Sopenharmony_ci	OUTREG(WAIT_UNTIL, (WAIT_2D_IDLECLEAN | WAIT_DMA_GUI_IDLE));
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	radeon_fifo_wait(2);
6462306a36Sopenharmony_ci	OUTREG(DST_Y_X, (region->dy << 16) | region->dx);
6562306a36Sopenharmony_ci	OUTREG(DST_WIDTH_HEIGHT, (region->width << 16) | region->height);
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_civoid radeonfb_fillrect(struct fb_info *info, const struct fb_fillrect *region)
6962306a36Sopenharmony_ci{
7062306a36Sopenharmony_ci	struct radeonfb_info *rinfo = info->par;
7162306a36Sopenharmony_ci	struct fb_fillrect modded;
7262306a36Sopenharmony_ci	int vxres, vyres;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	if (info->state != FBINFO_STATE_RUNNING)
7562306a36Sopenharmony_ci		return;
7662306a36Sopenharmony_ci	if (info->flags & FBINFO_HWACCEL_DISABLED) {
7762306a36Sopenharmony_ci		cfb_fillrect(info, region);
7862306a36Sopenharmony_ci		return;
7962306a36Sopenharmony_ci	}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	radeon_fixup_offset(rinfo);
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	vxres = info->var.xres_virtual;
8462306a36Sopenharmony_ci	vyres = info->var.yres_virtual;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	memcpy(&modded, region, sizeof(struct fb_fillrect));
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	if(!modded.width || !modded.height ||
8962306a36Sopenharmony_ci	   modded.dx >= vxres || modded.dy >= vyres)
9062306a36Sopenharmony_ci		return;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	if(modded.dx + modded.width  > vxres) modded.width  = vxres - modded.dx;
9362306a36Sopenharmony_ci	if(modded.dy + modded.height > vyres) modded.height = vyres - modded.dy;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	radeonfb_prim_fillrect(rinfo, &modded);
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic void radeonfb_prim_copyarea(struct radeonfb_info *rinfo,
9962306a36Sopenharmony_ci				   const struct fb_copyarea *area)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	int xdir, ydir;
10262306a36Sopenharmony_ci	u32 sx, sy, dx, dy, w, h;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	w = area->width; h = area->height;
10562306a36Sopenharmony_ci	dx = area->dx; dy = area->dy;
10662306a36Sopenharmony_ci	sx = area->sx; sy = area->sy;
10762306a36Sopenharmony_ci	xdir = sx - dx;
10862306a36Sopenharmony_ci	ydir = sy - dy;
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	if ( xdir < 0 ) { sx += w-1; dx += w-1; }
11162306a36Sopenharmony_ci	if ( ydir < 0 ) { sy += h-1; dy += h-1; }
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	radeon_fifo_wait(3);
11462306a36Sopenharmony_ci	OUTREG(DP_GUI_MASTER_CNTL,
11562306a36Sopenharmony_ci		rinfo->dp_gui_master_cntl /* i.e. GMC_DST_32BPP */
11662306a36Sopenharmony_ci		| GMC_BRUSH_NONE
11762306a36Sopenharmony_ci		| GMC_SRC_DSTCOLOR
11862306a36Sopenharmony_ci		| ROP3_S
11962306a36Sopenharmony_ci		| DP_SRC_SOURCE_MEMORY );
12062306a36Sopenharmony_ci	OUTREG(DP_WRITE_MSK, 0xffffffff);
12162306a36Sopenharmony_ci	OUTREG(DP_CNTL, (xdir>=0 ? DST_X_LEFT_TO_RIGHT : 0)
12262306a36Sopenharmony_ci			| (ydir>=0 ? DST_Y_TOP_TO_BOTTOM : 0));
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	radeon_fifo_wait(2);
12562306a36Sopenharmony_ci	OUTREG(DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL);
12662306a36Sopenharmony_ci	OUTREG(WAIT_UNTIL, (WAIT_2D_IDLECLEAN | WAIT_DMA_GUI_IDLE));
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	radeon_fifo_wait(3);
12962306a36Sopenharmony_ci	OUTREG(SRC_Y_X, (sy << 16) | sx);
13062306a36Sopenharmony_ci	OUTREG(DST_Y_X, (dy << 16) | dx);
13162306a36Sopenharmony_ci	OUTREG(DST_HEIGHT_WIDTH, (h << 16) | w);
13262306a36Sopenharmony_ci}
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_civoid radeonfb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
13662306a36Sopenharmony_ci{
13762306a36Sopenharmony_ci	struct radeonfb_info *rinfo = info->par;
13862306a36Sopenharmony_ci	struct fb_copyarea modded;
13962306a36Sopenharmony_ci	u32 vxres, vyres;
14062306a36Sopenharmony_ci	modded.sx = area->sx;
14162306a36Sopenharmony_ci	modded.sy = area->sy;
14262306a36Sopenharmony_ci	modded.dx = area->dx;
14362306a36Sopenharmony_ci	modded.dy = area->dy;
14462306a36Sopenharmony_ci	modded.width  = area->width;
14562306a36Sopenharmony_ci	modded.height = area->height;
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	if (info->state != FBINFO_STATE_RUNNING)
14862306a36Sopenharmony_ci		return;
14962306a36Sopenharmony_ci	if (info->flags & FBINFO_HWACCEL_DISABLED) {
15062306a36Sopenharmony_ci		cfb_copyarea(info, area);
15162306a36Sopenharmony_ci		return;
15262306a36Sopenharmony_ci	}
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	radeon_fixup_offset(rinfo);
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	vxres = info->var.xres_virtual;
15762306a36Sopenharmony_ci	vyres = info->var.yres_virtual;
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	if(!modded.width || !modded.height ||
16062306a36Sopenharmony_ci	   modded.sx >= vxres || modded.sy >= vyres ||
16162306a36Sopenharmony_ci	   modded.dx >= vxres || modded.dy >= vyres)
16262306a36Sopenharmony_ci		return;
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	if(modded.sx + modded.width > vxres)  modded.width = vxres - modded.sx;
16562306a36Sopenharmony_ci	if(modded.dx + modded.width > vxres)  modded.width = vxres - modded.dx;
16662306a36Sopenharmony_ci	if(modded.sy + modded.height > vyres) modded.height = vyres - modded.sy;
16762306a36Sopenharmony_ci	if(modded.dy + modded.height > vyres) modded.height = vyres - modded.dy;
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	radeonfb_prim_copyarea(rinfo, &modded);
17062306a36Sopenharmony_ci}
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_civoid radeonfb_imageblit(struct fb_info *info, const struct fb_image *image)
17362306a36Sopenharmony_ci{
17462306a36Sopenharmony_ci	struct radeonfb_info *rinfo = info->par;
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	if (info->state != FBINFO_STATE_RUNNING)
17762306a36Sopenharmony_ci		return;
17862306a36Sopenharmony_ci	radeon_engine_idle();
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	cfb_imageblit(info, image);
18162306a36Sopenharmony_ci}
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ciint radeonfb_sync(struct fb_info *info)
18462306a36Sopenharmony_ci{
18562306a36Sopenharmony_ci	struct radeonfb_info *rinfo = info->par;
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	if (info->state != FBINFO_STATE_RUNNING)
18862306a36Sopenharmony_ci		return 0;
18962306a36Sopenharmony_ci	radeon_engine_idle();
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci	return 0;
19262306a36Sopenharmony_ci}
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_civoid radeonfb_engine_reset(struct radeonfb_info *rinfo)
19562306a36Sopenharmony_ci{
19662306a36Sopenharmony_ci	u32 clock_cntl_index, mclk_cntl, rbbm_soft_reset;
19762306a36Sopenharmony_ci	u32 host_path_cntl;
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	radeon_engine_flush (rinfo);
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	clock_cntl_index = INREG(CLOCK_CNTL_INDEX);
20262306a36Sopenharmony_ci	mclk_cntl = INPLL(MCLK_CNTL);
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	OUTPLL(MCLK_CNTL, (mclk_cntl |
20562306a36Sopenharmony_ci			   FORCEON_MCLKA |
20662306a36Sopenharmony_ci			   FORCEON_MCLKB |
20762306a36Sopenharmony_ci			   FORCEON_YCLKA |
20862306a36Sopenharmony_ci			   FORCEON_YCLKB |
20962306a36Sopenharmony_ci			   FORCEON_MC |
21062306a36Sopenharmony_ci			   FORCEON_AIC));
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci	host_path_cntl = INREG(HOST_PATH_CNTL);
21362306a36Sopenharmony_ci	rbbm_soft_reset = INREG(RBBM_SOFT_RESET);
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	if (IS_R300_VARIANT(rinfo)) {
21662306a36Sopenharmony_ci		u32 tmp;
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci		OUTREG(RBBM_SOFT_RESET, (rbbm_soft_reset |
21962306a36Sopenharmony_ci					 SOFT_RESET_CP |
22062306a36Sopenharmony_ci					 SOFT_RESET_HI |
22162306a36Sopenharmony_ci					 SOFT_RESET_E2));
22262306a36Sopenharmony_ci		INREG(RBBM_SOFT_RESET);
22362306a36Sopenharmony_ci		OUTREG(RBBM_SOFT_RESET, 0);
22462306a36Sopenharmony_ci		tmp = INREG(RB2D_DSTCACHE_MODE);
22562306a36Sopenharmony_ci		OUTREG(RB2D_DSTCACHE_MODE, tmp | (1 << 17)); /* FIXME */
22662306a36Sopenharmony_ci	} else {
22762306a36Sopenharmony_ci		OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset |
22862306a36Sopenharmony_ci					SOFT_RESET_CP |
22962306a36Sopenharmony_ci					SOFT_RESET_HI |
23062306a36Sopenharmony_ci					SOFT_RESET_SE |
23162306a36Sopenharmony_ci					SOFT_RESET_RE |
23262306a36Sopenharmony_ci					SOFT_RESET_PP |
23362306a36Sopenharmony_ci					SOFT_RESET_E2 |
23462306a36Sopenharmony_ci					SOFT_RESET_RB);
23562306a36Sopenharmony_ci		INREG(RBBM_SOFT_RESET);
23662306a36Sopenharmony_ci		OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset & (u32)
23762306a36Sopenharmony_ci					~(SOFT_RESET_CP |
23862306a36Sopenharmony_ci					  SOFT_RESET_HI |
23962306a36Sopenharmony_ci					  SOFT_RESET_SE |
24062306a36Sopenharmony_ci					  SOFT_RESET_RE |
24162306a36Sopenharmony_ci					  SOFT_RESET_PP |
24262306a36Sopenharmony_ci					  SOFT_RESET_E2 |
24362306a36Sopenharmony_ci					  SOFT_RESET_RB));
24462306a36Sopenharmony_ci		INREG(RBBM_SOFT_RESET);
24562306a36Sopenharmony_ci	}
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	OUTREG(HOST_PATH_CNTL, host_path_cntl | HDP_SOFT_RESET);
24862306a36Sopenharmony_ci	INREG(HOST_PATH_CNTL);
24962306a36Sopenharmony_ci	OUTREG(HOST_PATH_CNTL, host_path_cntl);
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci	if (!IS_R300_VARIANT(rinfo))
25262306a36Sopenharmony_ci		OUTREG(RBBM_SOFT_RESET, rbbm_soft_reset);
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	OUTREG(CLOCK_CNTL_INDEX, clock_cntl_index);
25562306a36Sopenharmony_ci	OUTPLL(MCLK_CNTL, mclk_cntl);
25662306a36Sopenharmony_ci}
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_civoid radeonfb_engine_init (struct radeonfb_info *rinfo)
25962306a36Sopenharmony_ci{
26062306a36Sopenharmony_ci	unsigned long temp;
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	/* disable 3D engine */
26362306a36Sopenharmony_ci	OUTREG(RB3D_CNTL, 0);
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	radeonfb_engine_reset(rinfo);
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	radeon_fifo_wait (1);
26862306a36Sopenharmony_ci	if (IS_R300_VARIANT(rinfo)) {
26962306a36Sopenharmony_ci		OUTREG(RB2D_DSTCACHE_MODE, INREG(RB2D_DSTCACHE_MODE) |
27062306a36Sopenharmony_ci		       RB2D_DC_AUTOFLUSH_ENABLE |
27162306a36Sopenharmony_ci		       RB2D_DC_DC_DISABLE_IGNORE_PE);
27262306a36Sopenharmony_ci	} else {
27362306a36Sopenharmony_ci		/* This needs to be double checked with ATI. Latest X driver
27462306a36Sopenharmony_ci		 * completely "forgets" to set this register on < r3xx, and
27562306a36Sopenharmony_ci		 * we used to just write 0 there... I'll keep the 0 and update
27662306a36Sopenharmony_ci		 * that when we have sorted things out on X side.
27762306a36Sopenharmony_ci		 */
27862306a36Sopenharmony_ci		OUTREG(RB2D_DSTCACHE_MODE, 0);
27962306a36Sopenharmony_ci	}
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci	radeon_fifo_wait (3);
28262306a36Sopenharmony_ci	/* We re-read MC_FB_LOCATION from card as it can have been
28362306a36Sopenharmony_ci	 * modified by XFree drivers (ouch !)
28462306a36Sopenharmony_ci	 */
28562306a36Sopenharmony_ci	rinfo->fb_local_base = INREG(MC_FB_LOCATION) << 16;
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci	OUTREG(DEFAULT_PITCH_OFFSET, (rinfo->pitch << 0x16) |
28862306a36Sopenharmony_ci				     (rinfo->fb_local_base >> 10));
28962306a36Sopenharmony_ci	OUTREG(DST_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10));
29062306a36Sopenharmony_ci	OUTREG(SRC_PITCH_OFFSET, (rinfo->pitch << 0x16) | (rinfo->fb_local_base >> 10));
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	radeon_fifo_wait (1);
29362306a36Sopenharmony_ci#if defined(__BIG_ENDIAN)
29462306a36Sopenharmony_ci	OUTREGP(DP_DATATYPE, HOST_BIG_ENDIAN_EN, ~HOST_BIG_ENDIAN_EN);
29562306a36Sopenharmony_ci#else
29662306a36Sopenharmony_ci	OUTREGP(DP_DATATYPE, 0, ~HOST_BIG_ENDIAN_EN);
29762306a36Sopenharmony_ci#endif
29862306a36Sopenharmony_ci	radeon_fifo_wait (2);
29962306a36Sopenharmony_ci	OUTREG(DEFAULT_SC_TOP_LEFT, 0);
30062306a36Sopenharmony_ci	OUTREG(DEFAULT_SC_BOTTOM_RIGHT, (DEFAULT_SC_RIGHT_MAX |
30162306a36Sopenharmony_ci					 DEFAULT_SC_BOTTOM_MAX));
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci	temp = radeon_get_dstbpp(rinfo->depth);
30462306a36Sopenharmony_ci	rinfo->dp_gui_master_cntl = ((temp << 8) | GMC_CLR_CMP_CNTL_DIS);
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	radeon_fifo_wait (1);
30762306a36Sopenharmony_ci	OUTREG(DP_GUI_MASTER_CNTL, (rinfo->dp_gui_master_cntl |
30862306a36Sopenharmony_ci				    GMC_BRUSH_SOLID_COLOR |
30962306a36Sopenharmony_ci				    GMC_SRC_DATATYPE_COLOR));
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	radeon_fifo_wait (7);
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci	/* clear line drawing regs */
31462306a36Sopenharmony_ci	OUTREG(DST_LINE_START, 0);
31562306a36Sopenharmony_ci	OUTREG(DST_LINE_END, 0);
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	/* set brush color regs */
31862306a36Sopenharmony_ci	OUTREG(DP_BRUSH_FRGD_CLR, 0xffffffff);
31962306a36Sopenharmony_ci	OUTREG(DP_BRUSH_BKGD_CLR, 0x00000000);
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci	/* set source color regs */
32262306a36Sopenharmony_ci	OUTREG(DP_SRC_FRGD_CLR, 0xffffffff);
32362306a36Sopenharmony_ci	OUTREG(DP_SRC_BKGD_CLR, 0x00000000);
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	/* default write mask */
32662306a36Sopenharmony_ci	OUTREG(DP_WRITE_MSK, 0xffffffff);
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci	radeon_engine_idle ();
32962306a36Sopenharmony_ci}
330