Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Andres Salomon and committed by
Linus Torvalds
fd967956 61a517a0

+35 -1
+17 -1
drivers/video/geode/display_gx.c
··· 25 25 { 26 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 45 /* Virtual register class = 0x02 */ 30 46 /* VG_MEM_SIZE(512Kb units) = 0x00 */ 31 47
+16
drivers/video/geode/lxfb_ops.c
··· 329 329 { 330 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 348 /* The frame buffer size is reported by a VSM in VSA II */ 333 349 /* Virtual Register Class = 0x02 */ 334 350 /* VG_MEM_SIZE (1MB units) = 0x00 */
+2
include/asm-x86/geode.h
··· 30 30 31 31 /* MSRS */ 32 32 33 + #define MSR_GLIU_P2D_RO0 0x10000029 34 + 33 35 #define MSR_LX_GLD_MSR_CONFIG 0x48002001 34 36 #define MSR_LX_MSR_PADSEL 0x48002011 /* NOT 0x48000011; the data 35 37 * sheet has the wrong value */