[Xorg-driver-geode] [PATCH] Document LXGetLegacyPanelMode(..)

christian.gmeiner at gmail.com christian.gmeiner at gmail.com
Thu Sep 27 13:16:46 PDT 2012


From: root <root at OT.(none)>

It is quite hard to understand all this magic numbers and bits so
add some defined and comments to make it understandable.
All the needed defines are taken from gplvsa_ii source code, which
can be found at coreboot project.

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
---
 src/lx_panel.c |   42 +++++++++++++++++++++++++++++++++++-------
 1 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/src/lx_panel.c b/src/lx_panel.c
index 6b5d4ed..576ad21 100644
--- a/src/lx_panel.c
+++ b/src/lx_panel.c
@@ -39,8 +39,24 @@
 #include "xf86Modes.h"
 #include "geode.h"
 
+
+#define VRC_INDEX                       0xAC1C  // Index register
+#define VRC_DATA                        0xAC1E  // Data register
+#define VR_UNLOCK                       0xFC53  // Virtual register unlock code
+
+#define VRC_VG                          0x02
+
+#define VG_CONFIG                       0x00    // Main configuration register
+#define VG_CFG_DSMASK                   0x0700  // Active display mask bits
+#define VG_CFG_DSCRT                    0x0000  // Active display is CRT
+#define VG_CFG_DSPAN                    0x0100  // Active display is panel
+#define VG_CFG_DSTV                     0x0200  // Active display is TV
+#define VG_CFG_DSSIM                    0x0400  // Simultaneous CRT
+
+#define VG_FP_TYPE                      0x02    // Flat panel type data
+
 #define LX_READ_VG(reg) \
-                (outw(0xAC1C,0xFC53), outw(0xAC1C,0x0200|(reg)), inw(0xAC1E))
+                (outw(VRC_INDEX, VR_UNLOCK), outw(VRC_INDEX, (VRC_VG << 8) | (reg)), inw(VRC_DATA))
 
 /* This is borrowed from xerver/hw/xfree86/modes */
 
@@ -79,12 +95,24 @@ DisplayModeRec lx_panel_modes[] = {
 DisplayModePtr
 LXGetLegacyPanelMode(ScrnInfoPtr pScrni)
 {
-    unsigned short reg = LX_READ_VG(0x00);
-    unsigned char ret = (reg >> 8) & 0x07;
-
-    if ((ret == 1 || ret == 5)) {
-
-        reg = LX_READ_VG(0x02);
+    /* read Active display configuration */
+    unsigned short reg = LX_READ_VG(VG_CONFIG);
+    unsigned char ret = (reg & VG_CFG_DSMASK);
+
+    if ((ret == VG_CFG_DSPAN || ret == (VG_CFG_DSPAN | VG_CFG_DSSIM))) {
+
+        /* read panel resolution
+         *
+         * 0x00: 640x480
+         * 0x01: 800x600
+         * 0x02: 1004x768
+         * 0x03: 1152x864
+         * 0x04: 1280x768
+         * 0x05: reserved
+         * 0x06: reserved
+         * 0x07: reserved
+         */
+        reg = LX_READ_VG(VG_FP_TYPE);
         ret = (reg >> 3) & 0x07;
 
         /* FIXME: 7 is reserved in default. We use this value to support
-- 
1.7.2.5



More information about the Xorg-driver-geode mailing list