diff --git a/headers/private/graphics/radeon_hd/radeon_hd.h b/headers/private/graphics/radeon_hd/radeon_hd.h index 06cecceffd..bd290b7a07 100644 --- a/headers/private/graphics/radeon_hd/radeon_hd.h +++ b/headers/private/graphics/radeon_hd/radeon_hd.h @@ -76,6 +76,7 @@ struct radeon_shared_info { uint8* graphics_memory; addr_t physical_graphics_memory; uint32 graphics_memory_size; + uint32 graphics_aperture_size; bool has_edid; edid1_info edid_info; @@ -145,6 +146,9 @@ struct radeon_free_graphics_memory { uint32 buffer_base; }; +// registers +#define R6XX_CONFIG_APER_SIZE 0x5430 // r600> +#define OLD_CONFIG_APER_SIZE 0x0108 // mode_list_area = create_display_modes("radeon HD modes", gInfo->shared_info->has_edid ? &gInfo->shared_info->edid_info : NULL, NULL, 0, kRadeonHDSpaces, diff --git a/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp b/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp index b5b5a1dae8..5e1cdbd3a8 100644 --- a/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp +++ b/src/add-ons/kernel/drivers/graphics/radeon_hd/radeon_hd.cpp @@ -109,19 +109,31 @@ radeon_hd_init(radeon_info &info) info.shared_info->has_edid = false; } - // Populate graphics_memory_size with graphics memory size in KB + // Populate graphics_memory/aperture_size with KB if (info.shared_info->device_chipset >= RADEON_R800) { // R800+ has memory stored in MB info.shared_info->graphics_memory_size = read32(info.registers + R6XX_CONFIG_MEMSIZE) << 10; + info.shared_info->graphics_aperture_size + = read32(info.registers + R6XX_CONFIG_APER_SIZE) << 10; } else { // R600-R700 has memory stored in bytes info.shared_info->graphics_memory_size = read32(info.registers + R6XX_CONFIG_MEMSIZE) >> 10; + info.shared_info->graphics_aperture_size + = read32(info.registers + R6XX_CONFIG_APER_SIZE) >> 10; } TRACE("card(%ld): found %ld MB memory on card.\n", info.id, - info.shared_info->graphics_memory_size / 1024); + info.shared_info->graphics_memory_size >> 10); + TRACE("card(%ld): found %ld MB aperture on card.\n", info.id, + info.shared_info->graphics_aperture_size >> 10); + + // if there are more then 512MB memory on the card, only map + // the aperture size to prevent overflow of gart + if (info.shared_info->graphics_memory_size > 524288) + info.shared_info->graphics_memory_size + = info.shared_info->graphics_aperture_size; TRACE("card(%ld): %s completed successfully!\n", info.id, __func__); return B_OK;