Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bb91f6a authored by Dave Airlie's avatar Dave Airlie
Browse files

intelfb: add hw cursor support for i9xx



This adds hw cursor support for the i9xx chipsets.

Signed-off-by: default avatarDave Airlie <airlied@linux.ie>
parent 7679f4d6
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -284,6 +284,8 @@ struct intelfb_info {
	int pll_index;
	int pll_index;
};
};


#define IS_I9xx(dinfo) (((dinfo)->chipset == INTEL_915G)||(dinfo->chipset == INTEL_915GM)||((dinfo)->chipset == INTEL_945G))

/*** function prototypes ***/
/*** function prototypes ***/


extern int intelfb_var_to_depth(const struct fb_var_screeninfo *var);
extern int intelfb_var_to_depth(const struct fb_var_screeninfo *var);
+8 −4
Original line number Original line Diff line number Diff line
@@ -6,6 +6,7 @@
 *
 *
 * Copyright  2002, 2003 David Dawes <dawes@xfree86.org>
 * Copyright  2002, 2003 David Dawes <dawes@xfree86.org>
 *                   2004 Sylvain Meyer
 *                   2004 Sylvain Meyer
 *                   2006 David Airlie
 *
 *
 * This driver consists of two parts.  The first part (intelfbdrv.c) provides
 * This driver consists of two parts.  The first part (intelfbdrv.c) provides
 * the basic fbdev interfaces, is derived in part from the radeonfb and
 * the basic fbdev interfaces, is derived in part from the radeonfb and
@@ -551,8 +552,6 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
	    (ent->device == PCI_DEVICE_ID_INTEL_945G)) {
	    (ent->device == PCI_DEVICE_ID_INTEL_945G)) {
		aperture_bar = 2;
		aperture_bar = 2;
		mmio_bar = 0;
		mmio_bar = 0;
		/* Disable HW cursor on 9x5G/M (not implemented yet) */
		hwcursor = 0;
	}
	}
	dinfo->aperture.physical = pci_resource_start(pdev, aperture_bar);
	dinfo->aperture.physical = pci_resource_start(pdev, aperture_bar);
	dinfo->aperture.size     = pci_resource_len(pdev, aperture_bar);
	dinfo->aperture.size     = pci_resource_len(pdev, aperture_bar);
@@ -1468,7 +1467,7 @@ static int
intelfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
intelfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
{
{
        struct intelfb_info *dinfo = GET_DINFO(info);
        struct intelfb_info *dinfo = GET_DINFO(info);

	int ret;
#if VERBOSE > 0
#if VERBOSE > 0
	DBG_MSG("intelfb_cursor\n");
	DBG_MSG("intelfb_cursor\n");
#endif
#endif
@@ -1479,7 +1478,12 @@ intelfb_cursor(struct fb_info *info, struct fb_cursor *cursor)
	intelfbhw_cursor_hide(dinfo);
	intelfbhw_cursor_hide(dinfo);


	/* If XFree killed the cursor - restore it */
	/* If XFree killed the cursor - restore it */
	if (INREG(CURSOR_A_BASEADDR) != dinfo->cursor.offset << 12) {
	if (dinfo->mobile || IS_I9xx(dinfo))
	  ret = (INREG(CURSOR_A_BASEADDR) != dinfo->cursor.physical);
	else
	  ret = (INREG(CURSOR_A_BASEADDR) != dinfo->cursor.offset << 12);

	if (ret) {
		u32 fg, bg;
		u32 fg, bg;


		DBG_MSG("the cursor was killed - restore it !!\n");
		DBG_MSG("the cursor was killed - restore it !!\n");
+7 −3
Original line number Original line Diff line number Diff line
@@ -1742,7 +1742,7 @@ intelfbhw_cursor_init(struct intelfb_info *dinfo)
	DBG_MSG("intelfbhw_cursor_init\n");
	DBG_MSG("intelfbhw_cursor_init\n");
#endif
#endif


	if (dinfo->mobile) {
	if (dinfo->mobile || IS_I9xx(dinfo)) {
		if (!dinfo->cursor.physical)
		if (!dinfo->cursor.physical)
			return;
			return;
		tmp = INREG(CURSOR_A_CONTROL);
		tmp = INREG(CURSOR_A_CONTROL);
@@ -1775,7 +1775,7 @@ intelfbhw_cursor_hide(struct intelfb_info *dinfo)
#endif
#endif


	dinfo->cursor_on = 0;
	dinfo->cursor_on = 0;
	if (dinfo->mobile) {
	if (dinfo->mobile || IS_I9xx(dinfo)) {
		if (!dinfo->cursor.physical)
		if (!dinfo->cursor.physical)
			return;
			return;
		tmp = INREG(CURSOR_A_CONTROL);
		tmp = INREG(CURSOR_A_CONTROL);
@@ -1805,7 +1805,7 @@ intelfbhw_cursor_show(struct intelfb_info *dinfo)
	if (dinfo->cursor_blanked)
	if (dinfo->cursor_blanked)
		return;
		return;


	if (dinfo->mobile) {
	if (dinfo->mobile || IS_I9xx(dinfo)) {
		if (!dinfo->cursor.physical)
		if (!dinfo->cursor.physical)
			return;
			return;
		tmp = INREG(CURSOR_A_CONTROL);
		tmp = INREG(CURSOR_A_CONTROL);
@@ -1839,6 +1839,10 @@ intelfbhw_cursor_setpos(struct intelfb_info *dinfo, int x, int y)
	tmp = ((x & CURSOR_POS_MASK) << CURSOR_X_SHIFT) |
	tmp = ((x & CURSOR_POS_MASK) << CURSOR_X_SHIFT) |
	      ((y & CURSOR_POS_MASK) << CURSOR_Y_SHIFT);
	      ((y & CURSOR_POS_MASK) << CURSOR_Y_SHIFT);
	OUTREG(CURSOR_A_POSITION, tmp);
	OUTREG(CURSOR_A_POSITION, tmp);

	if (IS_I9xx(dinfo)) {
		OUTREG(CURSOR_A_BASEADDR, dinfo->cursor.physical);
	}
}
}


void
void