From f1973028671b8b2fe2730841655a5c10583b575f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 9 May 2006 01:00:58 +0000 Subject: [PATCH] The size of the stolen memory for the graphics chip is now read out of the host bridge. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17381 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../graphics/intel_extreme/intel_extreme.h | 20 ++++++++++++ .../graphics/intel_extreme/intel_extreme.cpp | 32 +++++++++++++++---- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/headers/private/graphics/intel_extreme/intel_extreme.h b/headers/private/graphics/intel_extreme/intel_extreme.h index d4f9e0ba7c..62d8fa6f15 100644 --- a/headers/private/graphics/intel_extreme/intel_extreme.h +++ b/headers/private/graphics/intel_extreme/intel_extreme.h @@ -139,6 +139,26 @@ struct intel_free_graphics_memory { //---------------------------------------------------------- // Register definitions, taken from X driver +// PCI bridge memory management +#define INTEL_GRAPHICS_MEMORY_CONTROL 0x52 +#define STOLEN_MEMORY_MASK 0x70 + +// models i830 and up +#define i830_LOCAL_MEMORY_ONLY 0x10 +#define i830_STOLEN_512K 0x20 +#define i830_STOLEN_1M 0x30 +#define i830_STOLEN_8M 0x40 + +// models i855 and up +#define i855_STOLEN_MEMORY_1M 0x10 +#define i855_STOLEN_MEMORY_4M 0x20 +#define i855_STOLEN_MEMORY_8M 0x30 +#define i855_STOLEN_MEMORY_16M 0x40 +#define i855_STOLEN_MEMORY_32M 0x50 +#define i855_STOLEN_MEMORY_48M 0x60 +#define i855_STOLEN_MEMORY_64M 0x70 + + #define INTEL_PAGE_TABLE_CONTROL 0x02020 #define INTEL_PAGE_TABLE_ERROR 0x02024 #define INTEL_HARDWARE_STATUS_PAGE 0x02080 diff --git a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp index c453c6a6ee..8fab6c5ea5 100644 --- a/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp +++ b/src/add-ons/kernel/drivers/graphics/intel_extreme/intel_extreme.cpp @@ -18,10 +18,6 @@ #include #include -// ToDo: do this correctly -extern "C" void write_isa_io(uchar bus, uchar port, uchar offset); -extern "C" uchar read_isa_io(uchar bus, uchar port, uchar offset); - class PhysicalMemoryMapper { public: @@ -99,8 +95,32 @@ intel_extreme_init(intel_info &info) // get chipset info - // TODO: read this out of the PCI configuration of the PCI bridge - size_t memorySize = 8 * 1024 * 1024; + // read stolen memory from the PCI configuration of the PCI bridge + uint16 memoryConfig = gPCI->read_pci_config(0, 0, 0, INTEL_GRAPHICS_MEMORY_CONTROL, 2); + size_t memorySize = 1024 * 1024; + + // TODO: this doesn't work like this on anything older than i855 + switch (memoryConfig & STOLEN_MEMORY_MASK) { + case i855_STOLEN_MEMORY_4M: + memorySize *= 4; + break; + case i855_STOLEN_MEMORY_8M: + memorySize *= 8; + break; + case i855_STOLEN_MEMORY_16M: + memorySize *= 16; + break; + case i855_STOLEN_MEMORY_32M: + memorySize *= 32; + break; + case i855_STOLEN_MEMORY_48M: + memorySize *= 48; + break; + case i855_STOLEN_MEMORY_64M: + memorySize *= 64; + break; + } + dprintf("detected %ld MB of stolen memory\n", memorySize / 1024 / 1024); // map frame buffer, try to map it write combined