Commit fd967956 authored by Andres Salomon's avatar Andres Salomon Committed by Linus Torvalds

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: default avatarAndres Salomon <dilinger@debian.org>
Cc: Jordan Crouse <jordan.crouse@amd.com>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 61a517a0
...@@ -25,7 +25,23 @@ unsigned int gx_frame_buffer_size(void) ...@@ -25,7 +25,23 @@ unsigned int gx_frame_buffer_size(void)
{ {
unsigned int val; 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 */ /* Virtual register class = 0x02 */
/* VG_MEM_SIZE(512Kb units) = 0x00 */ /* VG_MEM_SIZE(512Kb units) = 0x00 */
......
...@@ -329,6 +329,22 @@ unsigned int lx_framebuffer_size(void) ...@@ -329,6 +329,22 @@ unsigned int lx_framebuffer_size(void)
{ {
unsigned int val; unsigned int val;
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);
}
/* The frame buffer size is reported by a VSM in VSA II */ /* The frame buffer size is reported by a VSM in VSA II */
/* Virtual Register Class = 0x02 */ /* Virtual Register Class = 0x02 */
/* VG_MEM_SIZE (1MB units) = 0x00 */ /* VG_MEM_SIZE (1MB units) = 0x00 */
......
...@@ -30,6 +30,8 @@ extern int geode_get_dev_base(unsigned int dev); ...@@ -30,6 +30,8 @@ extern int geode_get_dev_base(unsigned int dev);
/* MSRS */ /* MSRS */
#define MSR_GLIU_P2D_RO0 0x10000029
#define MSR_LX_GLD_MSR_CONFIG 0x48002001 #define MSR_LX_GLD_MSR_CONFIG 0x48002001
#define MSR_LX_MSR_PADSEL 0x48002011 /* NOT 0x48000011; the data #define MSR_LX_MSR_PADSEL 0x48002011 /* NOT 0x48000011; the data
* sheet has the wrong value */ * sheet has the wrong value */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment