intelfb: add hw cursor support for i9xx
This adds hw cursor support for the i9xx chipsets. Signed-off-by: Dave Airlie <airlied@linux.ie>
This commit is contained in:
parent
7679f4d692
commit
8bb91f6a2d
|
@ -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 @@
|
||||||
*
|
*
|
||||||
* 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");
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue