drivers/video/fbdev/sis/sis_accel.c

Source file repositories/reference/linux-study-clean/drivers/video/fbdev/sis/sis_accel.c

File Facts

System
Linux kernel
Corpus path
drivers/video/fbdev/sis/sis_accel.c
Extension
.c
Size
11474 bytes
Lines
411
Domain
Driver Families
Bucket
drivers/video
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if((src_y >= 2048) || (dst_y >= 2048)) {
			srcbase = ivideo->video_linelength * mymin;
			dstbase = ivideo->video_linelength * mymin;
			src_y -= mymin;
			dst_y -= mymin;
		}
	} else {
		if(src_y >= 2048) {
			srcbase = ivideo->video_linelength * src_y;
			src_y = 0;
		}
		if(dst_y >= 2048) {
			dstbase = ivideo->video_linelength * dst_y;
			dst_y = 0;
		}
	}

	srcbase += ivideo->video_offset;
	dstbase += ivideo->video_offset;

	SiS310SetupSRCBase(srcbase);
	SiS310SetupDSTBase(dstbase);
	SiS310SetupRect(width, height)
	SiS310SetupSRCXY(src_x, src_y)
	SiS310SetupDSTXY(dst_x, dst_y)
	SiS310DoCMD
}

static void
SiS310SetupForSolidFill(struct sis_video_info *ivideo, u32 color, int rop)
{
	SiS310SetupPATFG(color)
	SiS310SetupDSTRect(ivideo->video_linelength, 0x0fff)
	SiS310SetupDSTColorDepth(ivideo->DstColor);
	SiS310SetupROP(sisPatALUConv[rop])
	SiS310SetupCMDFlag(PATFG | ivideo->SiS310_AccelDepth)
}

static void
SiS310SubsequentSolidFillRect(struct sis_video_info *ivideo, int x, int y, int w, int h)
{
	u32 dstbase = 0;

	if(y >= 2048) {
		dstbase = ivideo->video_linelength * y;
		y = 0;
	}
	dstbase += ivideo->video_offset;
	SiS310SetupDSTBase(dstbase)
	SiS310SetupDSTXY(x,y)
	SiS310SetupRect(w,h)
	SiS310SetupCMDFlag(BITBLT)
	SiS310DoCMD
}
#endif

/* --------------------------------------------------------------------- */

/* The exported routines */

int sisfb_initaccel(struct sis_video_info *ivideo)
{
#ifdef SISFB_USE_SPINLOCKS
	spin_lock_init(&ivideo->lockaccel);
#endif
	return 0;
}

void sisfb_syncaccel(struct sis_video_info *ivideo)
{
	if(ivideo->sisvga_engine == SIS_300_VGA) {
#ifdef CONFIG_FB_SIS_300
		SiS300Sync(ivideo);
#endif
	} else {
#ifdef CONFIG_FB_SIS_315
		SiS310Sync(ivideo);
#endif
	}
}

int fbcon_sis_sync(struct fb_info *info)
{
	struct sis_video_info *ivideo = (struct sis_video_info *)info->par;
	CRITFLAGS

	if((!ivideo->accel) || (!ivideo->engineok))
		return 0;

	CRITBEGIN

Annotation

Implementation Notes