configure.ac      |    2 
 src/via_display.c |  244 ++++++++++++++++++++++++++++--------------------------
 src/via_driver.c  |   31 +++++-
 src/via_driver.h  |    2 
 4 files changed, 156 insertions(+), 123 deletions(-)

New commits:
commit 84845494a0793c625253f7fd27245f7d0ff6fd05
Author: Kevin Brace <kevinbr...@gmx.com>
Date:   Fri Apr 3 11:09:14 2020 -0700

    Version bumped to 0.6.223
    
    Signed-off-by: Kevin Brace <kevinbr...@gmx.com>

diff --git a/configure.ac b/configure.ac
index ea0cc47..97bdb4e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
 # Initialize Autoconf
 AC_PREREQ([2.60])
 AC_INIT([xf86-video-openchrome],
-        [0.6.222],
+        [0.6.223],
         
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/openchrome],
         [xf86-video-openchrome])
 
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;
@@ -3487,6 +3548,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)
 {
@@ -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;
commit 819dfa747e73ba125ca0b939429ee28049d3e99a
Author: Kevin Brace <kevinbr...@gmx.com>
Date:   Thu Apr 2 11:04:24 2020 -0700

    Unify IGA1 and IGA2 HI (Hardware Icon) cursor callbacks
    
    Signed-off-by: Kevin Brace <kevinbr...@gmx.com>

diff --git a/src/via_display.c b/src/via_display.c
index 53dbd33..696251f 100644
--- a/src/via_display.c
+++ b/src/via_display.c
@@ -3406,28 +3406,38 @@ iga1_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr 
rotate_pixmap, void *data)
     and in all other bpps the fg and bg are in 8-8-8 RGB format.
 */
 static void
-iga1_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
+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);
 
     if (xf86_config->cursor_fg)
         return;
 
-    /* Don't recolour the image if we don't have to. */
-    if (fg == xf86_config->cursor_fg && bg == xf86_config->cursor_bg)
+    /*
+     * Don't recolour the image if we don't have to.
+     */
+    if ((fg == xf86_config->cursor_fg) &&
+        (bg == xf86_config->cursor_bg)) {
         return;
+    }
 
-    viaIGA1DisplayHI(pScrn, FALSE);
+    if (!iga->index) {
+        viaIGA1DisplayHI(pScrn, FALSE);
+    } else {
+        viaIGA2DisplayHI(pScrn, FALSE);
+    }
 
     xf86_config->cursor_fg = fg;
     xf86_config->cursor_bg = bg;
 }
 
 static void
-iga1_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
+iga_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
+    drmmode_crtc_private_ptr iga = crtc->driver_private;
     unsigned xoff, yoff;
 
     if (x < 0) {
@@ -3444,30 +3454,44 @@ iga1_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, 
int y)
         yoff = 0;
     }
 
-    viaIGA1SetHIDisplayLocation(pScrn, x, xoff, y, yoff);
+    if (!iga->index) {
+        viaIGA1SetHIDisplayLocation(pScrn, x, xoff, y, yoff);
+    } else {
+        viaIGA2SetHIDisplayLocation(pScrn, x, xoff, y, yoff);
+    }
 }
 
 static void
-iga1_crtc_show_cursor(xf86CrtcPtr crtc)
+iga_crtc_show_cursor(xf86CrtcPtr crtc)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
+    drmmode_crtc_private_ptr iga = crtc->driver_private;
 
-    viaIGA1DisplayHI(pScrn, TRUE);
+    if (!iga->index) {
+        viaIGA1DisplayHI(pScrn, TRUE);
+    } else {
+        viaIGA2DisplayHI(pScrn, TRUE);
+    }
 }
 
 static void
-iga1_crtc_hide_cursor(xf86CrtcPtr crtc)
+iga_crtc_hide_cursor(xf86CrtcPtr crtc)
 {
     ScrnInfoPtr pScrn = crtc->scrn;
+    drmmode_crtc_private_ptr iga = crtc->driver_private;
 
-    viaIGA1DisplayHI(pScrn, FALSE);
+    if (!iga->index) {
+        viaIGA1DisplayHI(pScrn, FALSE);
+    } else {
+        viaIGA2DisplayHI(pScrn, FALSE);
+    }
 }
 
 static void
-iga1_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
+iga_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
 {
-    drmmode_crtc_private_ptr iga = crtc->driver_private;
     ScrnInfoPtr pScrn = crtc->scrn;
+    drmmode_crtc_private_ptr iga = crtc->driver_private;
     void *dst;
 
     dst = drm_bo_map(pScrn, iga->cursor_bo);
@@ -3475,8 +3499,13 @@ iga1_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 
*image)
     memcpy(dst, image, iga->cursor_bo->size);
     drm_bo_unmap(pScrn, iga->cursor_bo);
 
-    viaIGA1InitHI(pScrn);
-    viaIGA1SetHIStartingAddress(crtc);
+    if (!iga->index) {
+        viaIGA1InitHI(pScrn);
+        viaIGA1SetHIStartingAddress(crtc);
+    } else {
+        viaIGA2InitHI(pScrn);
+        viaIGA2SetHIStartingAddress(crtc);
+    }
 }
 
 static void
@@ -3500,11 +3529,11 @@ const xf86CrtcFuncsRec iga1_crtc_funcs = {
     .shadow_create          = iga1_crtc_shadow_create,
     .shadow_allocate        = iga1_crtc_shadow_allocate,
     .shadow_destroy         = iga1_crtc_shadow_destroy,
-    .set_cursor_colors      = iga1_crtc_set_cursor_colors,
-    .set_cursor_position    = iga1_crtc_set_cursor_position,
-    .show_cursor            = iga1_crtc_show_cursor,
-    .hide_cursor            = iga1_crtc_hide_cursor,
-    .load_cursor_argb       = iga1_crtc_load_cursor_argb,
+    .set_cursor_colors      = iga_crtc_set_cursor_colors,
+    .set_cursor_position    = iga_crtc_set_cursor_position,
+    .show_cursor            = iga_crtc_show_cursor,
+    .hide_cursor            = iga_crtc_hide_cursor,
+    .load_cursor_argb       = iga_crtc_load_cursor_argb,
 #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2
     .set_origin             = iga1_crtc_set_origin,
 #endif
@@ -3799,98 +3828,6 @@ iga2_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr 
rotate_pixmap, void *data)
 {
 }
 
-/*
-    Set the cursor foreground and background colors.  In 8bpp, fg and
-    bg are indices into the current colormap unless the
-    HARDWARE_CURSOR_TRUECOLOR_AT_8BPP flag is set.  In that case
-    and in all other bpps the fg and bg are in 8-8-8 RGB format.
-*/
-static void
-iga2_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
-{
-    drmmode_crtc_private_ptr iga = crtc->driver_private;
-    ScrnInfoPtr pScrn = crtc->scrn;
-    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-    int height = 64, width = 64, i;
-    CARD32 pixel, *dst;
-
-    if (xf86_config->cursor_fg)
-        return;
-
-    fg |= 0xff000000;
-    bg |= 0xff000000;
-
-    /* Don't recolour the image if we don't have to. */
-    if (fg == xf86_config->cursor_fg && bg == xf86_config->cursor_bg)
-        return;
-
-    viaIGA2DisplayHI(pScrn, FALSE);
-
-    dst = drm_bo_map(pScrn, iga->cursor_bo);
-    for (i = 0; i < width * height; i++, dst++)
-        if ((pixel = *dst))
-            *dst = (pixel == xf86_config->cursor_fg) ? fg : bg;
-    drm_bo_unmap(pScrn, iga->cursor_bo);
-
-    xf86_config->cursor_fg = fg;
-    xf86_config->cursor_bg = bg;
-}
-
-static void
-iga2_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
-{
-    ScrnInfoPtr pScrn = crtc->scrn;
-    unsigned xoff, yoff;
-
-    if (x < 0) {
-        xoff = ((-x) & 0xFE);
-        x = 0;
-    } else {
-        xoff = 0;
-    }
-
-    if (y < 0) {
-        yoff = ((-y) & 0xFE);
-        y = 0;
-    } else {
-        yoff = 0;
-    }
-
-    viaIGA2SetHIDisplayLocation(pScrn, x, xoff, y, yoff);
-}
-
-static void
-iga2_crtc_show_cursor(xf86CrtcPtr crtc)
-{
-    ScrnInfoPtr pScrn = crtc->scrn;
-
-    viaIGA2DisplayHI(pScrn, TRUE);
-}
-
-static void
-iga2_crtc_hide_cursor(xf86CrtcPtr crtc)
-{
-    ScrnInfoPtr pScrn = crtc->scrn;
-
-    viaIGA2DisplayHI(pScrn, FALSE);
-}
-
-static void
-iga2_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
-{
-    drmmode_crtc_private_ptr iga = crtc->driver_private;
-    ScrnInfoPtr pScrn = crtc->scrn;
-    void *dst;
-
-    dst = drm_bo_map(pScrn, iga->cursor_bo);
-    memset(dst, 0x00, iga->cursor_bo->size);
-    memcpy(dst, image, iga->cursor_bo->size);
-    drm_bo_unmap(pScrn, iga->cursor_bo);
-
-    viaIGA2InitHI(pScrn);
-    viaIGA2SetHIStartingAddress(crtc);
-}
-
 const xf86CrtcFuncsRec iga2_crtc_funcs = {
     .dpms                   = iga2_crtc_dpms,
     .save                   = iga2_crtc_save,
@@ -3905,11 +3842,11 @@ const xf86CrtcFuncsRec iga2_crtc_funcs = {
     .shadow_create          = iga2_crtc_shadow_create,
     .shadow_allocate        = iga2_crtc_shadow_allocate,
     .shadow_destroy         = iga2_crtc_shadow_destroy,
-    .set_cursor_colors      = iga2_crtc_set_cursor_colors,
-    .set_cursor_position    = iga2_crtc_set_cursor_position,
-    .show_cursor            = iga2_crtc_show_cursor,
-    .hide_cursor            = iga2_crtc_hide_cursor,
-    .load_cursor_argb       = iga2_crtc_load_cursor_argb,
+    .set_cursor_colors      = iga_crtc_set_cursor_colors,
+    .set_cursor_position    = iga_crtc_set_cursor_position,
+    .show_cursor            = iga_crtc_show_cursor,
+    .hide_cursor            = iga_crtc_hide_cursor,
+    .load_cursor_argb       = iga_crtc_load_cursor_argb,
 #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2
     .set_origin             = iga2_crtc_set_origin,
 #endif
_______________________________________________
openchrome-devel mailing list
openchrome-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/openchrome-devel

Reply via email to