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

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
...@@ -284,6 +284,8 @@ struct intelfb_info { ...@@ -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);
......
...@@ -6,6 +6,7 @@ ...@@ -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) ...@@ -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 ...@@ -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) ...@@ -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");
......
...@@ -1742,7 +1742,7 @@ intelfbhw_cursor_init(struct intelfb_info *dinfo) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment