static ULONG InstalledMemoryMb = 0;
static ULONG AvailableMemoryMb = 0;
+extern PVOID FrameBuffer;
+extern ULONG FrameBufferSize;
#define TEST_SIZE 0x200
#define TEST_PATTERN1 0xAA
SIZE_T Size,
TYPE_OF_MEMORY MemoryType);
+extern VOID
+ReserveMemory(
+ PFREELDR_MEMORY_DESCRIPTOR MemoryMap,
+ ULONG_PTR BaseAddress,
+ SIZE_T Size,
+ TYPE_OF_MEMORY MemoryType,
+ PCHAR Usage);
+
extern ULONG
PcMemFinalizeMemoryMap(
PFREELDR_MEMORY_DESCRIPTOR MemoryMap);
WRITE_PORT_ULONG((ULONG*) 0xcf8, CONFIG_CMD(0, 0, 0x84));
WRITE_PORT_ULONG((ULONG*) 0xcfc, InstalledMemoryMb * 1024 * 1024 - 1);
- /* 4 MB video framebuffer is reserved later using XboxMemReserveMemory() */
AvailableMemoryMb = InstalledMemoryMb;
}
AvailableMemoryMb * 1024 * 1024,
LoaderFree);
- /* Video memory */
- SetMemory(XboxMemoryMap,
- AvailableMemoryMb * 1024 * 1024,
- (InstalledMemoryMb - AvailableMemoryMb) * 1024 * 1024,
- LoaderFirmwarePermanent);
-
- *MemoryMapSize = PcMemFinalizeMemoryMap(XboxMemoryMap);
- return XboxMemoryMap;
-}
-
-PVOID
-XboxMemReserveMemory(ULONG MbToReserve)
-{
- /* This function is used to reserve video framebuffer in XboxVideoInit() */
-
- if (InstalledMemoryMb == 0)
- {
- /* Hmm, seems we're not initialized yet */
- XboxMemInit();
- }
-
- if (MbToReserve > AvailableMemoryMb)
+ if (FrameBufferSize != 0)
{
- /* Can't satisfy the request */
- return NULL;
+ /* Video memory */
+ ReserveMemory(XboxMemoryMap,
+ (ULONG_PTR)FrameBuffer,
+ FrameBufferSize,
+ LoaderFirmwarePermanent,
+ "Video memory");
}
- AvailableMemoryMb -= MbToReserve;
-
- /* Top of available memory points to the space just reserved */
- return (PVOID)(AvailableMemoryMb * 1024 * 1024);
+ *MemoryMapSize = PcMemFinalizeMemoryMap(XboxMemoryMap);
+ return XboxMemoryMap;
}
/* EOF */
DBG_DEFAULT_CHANNEL(UI);
-static PVOID FrameBuffer;
+PVOID FrameBuffer;
+ULONG FrameBufferSize;
static ULONG ScreenWidth;
static ULONG ScreenHeight;
static ULONG BytesPerPixel;
{
ULONG AvMode;
- FrameBuffer = (PVOID)((ULONG) XboxMemReserveMemory(FB_SIZE_MB) | 0xf0000000);
+ /* Reuse framebuffer that was set up by firmware */
+ FrameBuffer = (PVOID)*((PULONG) 0xfd600800);
+ /* Verify that framebuffer address is page-aligned */
+ ASSERT((ULONG_PTR)FrameBuffer % PAGE_SIZE == 0);
+ /* FIXME: obtain fb size from firmware somehow (Cromwell reserves high 4 MB of RAM) */
+ FrameBufferSize = 4 * 1024 * 1024;
+
+ /* FIXME: don't use SMBus, obtain current video resolution directly from NV2A */
if (I2CTransmitByteGetReturn(0x10, 0x04, &AvMode))
{
if (1 == AvMode) /* HDTV */
Delta = (ScreenWidth * BytesPerPixel + 3) & ~ 0x3;
XboxVideoClearScreenColor(MAKE_COLOR(0, 0, 0), TRUE);
-
- /* Tell the nVidia controller about the framebuffer */
- *((PULONG) 0xfd600800) = (ULONG) FrameBuffer;
}
VIDEODISPLAYMODE