aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndres Salomon <dilinger@queued.net>2008-04-28 05:15:30 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-04-28 11:58:40 -0400
commitfd96795630428ceca775bd1effc5bf41a9fe5272 (patch)
treed14276ebf1ff907711e56e2742e15b594ebd166e
parent61a517a063abf659cbf61df11f8e2131fdafccec (diff)
gxfb/lxfb: detect framebuffer size using an MSR if VSA2 isn't available
If there's no VSA2 (ie, if we're using tinybios or OpenFirmware), use the GLIU's P2D Range Offset Descriptor to determine how much memory we have available for the framebuffer. Originally based on a patch by Jordan Crouse. Tested with OpenFirmware; Pascal informs me that tinybios has a stub that fills in P2D_RO0. Signed-off-by: Andres Salomon <dilinger@debian.org> Cc: Jordan Crouse <jordan.crouse@amd.com> Cc: "Antonino A. Daplas" <adaplas@pol.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/video/geode/display_gx.c18
-rw-r--r--drivers/video/geode/lxfb_ops.c16
-rw-r--r--include/asm-x86/geode.h2
3 files changed, 35 insertions, 1 deletions
diff --git a/drivers/video/geode/display_gx.c b/drivers/video/geode/display_gx.c
index 1e82ecc367dd..e759895bf3d3 100644
--- a/drivers/video/geode/display_gx.c
+++ b/drivers/video/geode/display_gx.c
@@ -25,7 +25,23 @@ unsigned int gx_frame_buffer_size(void)
25{ 25{
26 unsigned int val; 26 unsigned int val;
27 27
28 /* FB size is reported by a virtual register */ 28 if (!geode_has_vsa2()) {
29 uint32_t hi, lo;
30
31 /* The number of pages is (PMAX - PMIN)+1 */
32 rdmsr(MSR_GLIU_P2D_RO0, lo, hi);
33
34 /* PMAX */
35 val = ((hi & 0xff) << 12) | ((lo & 0xfff00000) >> 20);
36 /* PMIN */
37 val -= (lo & 0x000fffff);
38 val += 1;
39
40 /* The page size is 4k */
41 return (val << 12);
42 }
43
44 /* FB size can be obtained from the VSA II */
29 /* Virtual register class = 0x02 */ 45 /* Virtual register class = 0x02 */
30 /* VG_MEM_SIZE(512Kb units) = 0x00 */ 46 /* VG_MEM_SIZE(512Kb units) = 0x00 */
31 47
diff --git a/drivers/video/geode/lxfb_ops.c b/drivers/video/geode/lxfb_ops.c
index e42e12489f6d..cd9d4cc26954 100644
--- a/drivers/video/geode/lxfb_ops.c
+++ b/drivers/video/geode/lxfb_ops.c
@@ -329,6 +329,22 @@ unsigned int lx_framebuffer_size(void)
329{ 329{
330 unsigned int val; 330 unsigned int val;
331 331
332 if (!geode_has_vsa2()) {
333 uint32_t hi, lo;
334
335 /* The number of pages is (PMAX - PMIN)+1 */
336 rdmsr(MSR_GLIU_P2D_RO0, lo, hi);
337
338 /* PMAX */
339 val = ((hi & 0xff) << 12) | ((lo & 0xfff00000) >> 20);
340 /* PMIN */
341 val -= (lo & 0x000fffff);
342 val += 1;
343
344 /* The page size is 4k */
345 return (val << 12);
346 }
347
332 /* The frame buffer size is reported by a VSM in VSA II */ 348 /* The frame buffer size is reported by a VSM in VSA II */
333 /* Virtual Register Class = 0x02 */ 349 /* Virtual Register Class = 0x02 */
334 /* VG_MEM_SIZE (1MB units) = 0x00 */ 350 /* VG_MEM_SIZE (1MB units) = 0x00 */
diff --git a/include/asm-x86/geode.h b/include/asm-x86/geode.h
index 4fb2f62e277b..7154dc4de951 100644
--- a/include/asm-x86/geode.h
+++ b/include/asm-x86/geode.h
@@ -30,6 +30,8 @@ extern int geode_get_dev_base(unsigned int dev);
30 30
31/* MSRS */ 31/* MSRS */
32 32
33#define MSR_GLIU_P2D_RO0 0x10000029
34
33#define MSR_LX_GLD_MSR_CONFIG 0x48002001 35#define MSR_LX_GLD_MSR_CONFIG 0x48002001
34#define MSR_LX_MSR_PADSEL 0x48002011 /* NOT 0x48000011; the data 36#define MSR_LX_MSR_PADSEL 0x48002011 /* NOT 0x48000011; the data
35 * sheet has the wrong value */ 37 * sheet has the wrong value */