summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKevin Brace <kevinbrace@gmx.com>2020-04-03 11:09:14 -0700
committerKevin Brace <kevinbrace@gmx.com>2020-04-03 11:09:14 -0700
commit84845494a0793c625253f7fd27245f7d0ff6fd05 (patch)
tree8f0f64c09e21169fafc4727960fba41dbcec7613 /src
parent819dfa747e73ba125ca0b939429ee28049d3e99a (diff)
Version bumped to 0.6.223
Signed-off-by: Kevin Brace <kevinbrace@gmx.com>
Diffstat (limited to 'src')
-rw-r--r--src/via_display.c77
-rw-r--r--src/via_driver.c31
-rw-r--r--src/via_driver.h2
3 files changed, 103 insertions, 7 deletions
diff --git a/src/via_display.c b/src/via_display.c
index 696251f..a26965e 100644
--- a/src/via_display.c
+++ b/src/via_display.c
@@ -175,6 +175,66 @@ viaIGA1SetGamma(ScrnInfoPtr pScrn, CARD8 gammaCorrection)
"Exiting viaIGA1SetGamma.\n"));
}
+/*
+ * This function displays or hides hardware cursor (HC).
+ */
+static void
+viaDisplayHC(ScrnInfoPtr pScrn, Bool hcStatus)
+{
+ VIAPtr pVia = VIAPTR(pScrn);
+ uint32_t temp;
+
+ temp = VIAGETREG(VIA_REG_CURSOR_MODE);
+ temp &= 0xFFFFFFFE;
+ temp |= hcStatus ? 0x00000001 : 0x00000000;
+
+ /*
+ * 64x64 hardware cursor
+ */
+ temp &= 0xFFFFFFFD;
+
+ /*
+ * 32x32 hardware cursor
+ */
+// temp |= 0x00000002;
+
+ /* VIA_REG_CURSOR_MODE[0] - Hardware Cursor Enable */
+ VIASETREG(VIA_REG_CURSOR_MODE, temp);
+}
+
+static void
+viaSetHCStartingAddress(xf86CrtcPtr crtc)
+{
+ drmmode_crtc_private_ptr iga = crtc->driver_private;
+ ScrnInfoPtr pScrn = crtc->scrn;
+ VIAPtr pVia = VIAPTR(pScrn);
+ uint32_t temp;
+
+ temp = VIAGETREG(VIA_REG_CURSOR_MODE);
+ temp &= 0xFC0000FF;
+ temp |= iga->cursor_bo->offset;
+
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "offset: %lx\n", iga->cursor_bo->offset);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "temp: %x\n", temp);
+ /*
+ * VIA_REG_CURSOR_MODE[25:8] - Hardware Cursor Base Address
+ */
+ VIASETREG(VIA_REG_CURSOR_MODE, temp);
+}
+
+static void
+viaSetHCLocation(ScrnInfoPtr pScrn,
+ int x, unsigned int xoff,
+ int y, unsigned int yoff)
+{
+ VIAPtr pVia = VIAPTR(pScrn);
+
+ VIASETREG(VIA_REG_CURSOR_POS, ((x << 16) | (y & 0x07ff)));
+ VIASETREG(VIA_REG_CURSOR_ORG, ((xoff << 16) | (yoff & 0x07ff)));
+}
+
static void
viaIGA1InitHI(ScrnInfoPtr pScrn)
{
@@ -3411,6 +3471,7 @@ iga_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
ScrnInfoPtr pScrn = crtc->scrn;
drmmode_crtc_private_ptr iga = crtc->driver_private;
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
+ VIAPtr pVia = VIAPTR(pScrn);
if (xf86_config->cursor_fg)
return;
@@ -3488,6 +3549,20 @@ iga_crtc_hide_cursor(xf86CrtcPtr crtc)
}
static void
+iga_crtc_load_cursor_image(xf86CrtcPtr crtc, CARD8 *image)
+{
+ drmmode_crtc_private_ptr iga = crtc->driver_private;
+ ScrnInfoPtr pScrn = crtc->scrn;
+ void *dst;
+
+ dst = drm_bo_map(pScrn, iga->cursor_bo);
+ memcpy(dst, image, iga->cursor_bo->size);
+ drm_bo_unmap(pScrn, iga->cursor_bo);
+
+ viaSetHCStartingAddress(crtc);
+}
+
+static void
iga_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
{
ScrnInfoPtr pScrn = crtc->scrn;
@@ -3533,6 +3608,7 @@ const xf86CrtcFuncsRec iga1_crtc_funcs = {
.set_cursor_position = iga_crtc_set_cursor_position,
.show_cursor = iga_crtc_show_cursor,
.hide_cursor = iga_crtc_hide_cursor,
+ .load_cursor_image = iga_crtc_load_cursor_image,
.load_cursor_argb = iga_crtc_load_cursor_argb,
#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2
.set_origin = iga1_crtc_set_origin,
@@ -3846,6 +3922,7 @@ const xf86CrtcFuncsRec iga2_crtc_funcs = {
.set_cursor_position = iga_crtc_set_cursor_position,
.show_cursor = iga_crtc_show_cursor,
.hide_cursor = iga_crtc_hide_cursor,
+ .load_cursor_image = iga_crtc_load_cursor_image,
.load_cursor_argb = iga_crtc_load_cursor_argb,
#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2
.set_origin = iga2_crtc_set_origin,
diff --git a/src/via_driver.c b/src/via_driver.c
index 55e40e6..034b34c 100644
--- a/src/via_driver.c
+++ b/src/via_driver.c
@@ -1533,13 +1533,30 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL)
if (pVia->drmmode.hwcursor) {
xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
- cursorWidth = cursorHeight = 64;
- flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
- HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
- HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
- HARDWARE_CURSOR_ARGB;
- cursorSize = (cursorWidth * cursorHeight) * (32 / 8);
- alignment = 1024;
+ switch (pVia->Chipset) {
+ case VIA_CLE266:
+ case VIA_KM400:
+ case VIA_P4M800PRO:
+ cursorWidth = cursorHeight = 64;
+ flags = HARDWARE_CURSOR_INVERT_MASK |
+ HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
+ HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
+ HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
+ HARDWARE_CURSOR_BIT_ORDER_MSBFIRST;
+ cursorSize = ((cursorWidth * cursorHeight) / 8) * 2;
+ alignment = 1024;
+ pVia->useHardwareCursor = TRUE;
+ break;
+ default:
+ cursorWidth = cursorHeight = 64;
+ flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK |
+ HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
+ HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
+ HARDWARE_CURSOR_ARGB;
+ cursorSize = (cursorWidth * cursorHeight) * (32 / 8);
+ alignment = 1024;
+ break;
+ }
/*
* Set cursor location in frame buffer.
diff --git a/src/via_driver.h b/src/via_driver.h
index 011ede7..a443454 100644
--- a/src/via_driver.h
+++ b/src/via_driver.h
@@ -328,6 +328,8 @@ typedef struct _VIA {
void *displayMap;
CARD32 displayOffset;
+ Bool useHardwareCursor;
+
#ifdef HAVE_DEBUG
Bool disableXvBWCheck;
Bool DumpVGAROM;