]> err.no Git - linux-2.6/blobdiff - drivers/video/geode/display_gx.c
Merge branches 'at91', 'dyntick', 'ep93xx', 'iop', 'ixp', 'misc', 'orion', 'omap...
[linux-2.6] / drivers / video / geode / display_gx.c
index 3743c8766a08b8c0df5a5962e49813d22bd7804a..e759895bf3d3d19deb02ec6323f7c8ff646b96fc 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/io.h>
 #include <asm/div64.h>
 #include <asm/delay.h>
+#include <asm/geode.h>
 
 #include "gxfb.h"
 
@@ -24,14 +25,30 @@ unsigned int gx_frame_buffer_size(void)
 {
        unsigned int val;
 
-       /* FB size is reported by a virtual register */
+       if (!geode_has_vsa2()) {
+               uint32_t hi, lo;
+
+               /* The number of pages is (PMAX - PMIN)+1 */
+               rdmsr(MSR_GLIU_P2D_RO0, lo, hi);
+
+               /* PMAX */
+               val = ((hi & 0xff) << 12) | ((lo & 0xfff00000) >> 20);
+               /* PMIN */
+               val -= (lo & 0x000fffff);
+               val += 1;
+
+               /* The page size is 4k */
+               return (val << 12);
+       }
+
+       /* FB size can be obtained from the VSA II */
        /* Virtual register class = 0x02 */
        /* VG_MEM_SIZE(512Kb units) = 0x00 */
 
-       outw(0xFC53, 0xAC1C);
-       outw(0x0200, 0xAC1C);
+       outw(VSA_VR_UNLOCK, VSA_VRC_INDEX);
+       outw(VSA_VR_MEM_SIZE, VSA_VRC_INDEX);
 
-       val = (unsigned int)(inw(0xAC1E)) & 0xFFl;
+       val = (unsigned int)(inw(VSA_VRC_DATA)) & 0xFFl;
        return (val << 19);
 }