From c08c5a37b6e7fa17cb859d24283f35a47bbd41ca Mon Sep 17 00:00:00 2001
From: Alexander von Gluck IV <kallisti5@unixzen.com>
Date: Wed, 5 Jan 2022 19:25:31 -0600
Subject: [PATCH] radeon_hd: Fix memory detection on newer cards
Change-Id: Iac1b5870951d2f982002de65453959cfc38e79cc
---
headers/private/graphics/radeon_hd/si_reg.h | 1 +
.../kernel/drivers/graphics/radeon_hd/radeon_hd.cpp | 11 ++++++++---
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/headers/private/graphics/radeon_hd/si_reg.h b/headers/private/graphics/radeon_hd/si_reg.h
index adc6f08c5e..dd5ea7bd87 100644
a
|
b
|
|
218 | 218 | #define SI_MC_VMID(x) ((x) << 25) |
219 | 219 | |
220 | 220 | #define SI_CONFIG_MEMSIZE 0x5428 |
| 221 | #define SI_CONFIG_MEMSIZE_TAHITI 0x0de3 // or 0x378c? |
221 | 222 | |
222 | 223 | #define SI_INTERRUPT_CNTL 0x5468 |
223 | 224 | #define SI_IH_DUMMY_RD_OVERRIDE (1 << 0) |
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 d79e410ee0..2ed7687408 100644
a
|
b
|
radeon_hd_init(radeon_info &info)
|
660 | 660 | mmioMapper.Detach(); |
661 | 661 | |
662 | 662 | // *** Populate frame buffer information |
663 | | if (info.chipsetID >= RADEON_CEDAR) { |
| 663 | if (info.chipsetID == RADEON_TAHITI || info.dceMajor >= 6 && info.dceMinor >= 1) { |
| 664 | // bytes I think? |
| 665 | info.shared_info->graphics_memory_size |
| 666 | = (uint32)(((uint64)read32(info.registers |
| 667 | + SI_CONFIG_MEMSIZE_TAHITI) << 20) / 1024); |
| 668 | } else if (info.chipsetID >= RADEON_CEDAR) { |
664 | 669 | if ((info.chipsetFlags & CHIP_APU) != 0 |
665 | 670 | || (info.chipsetFlags & CHIP_IGP) != 0) { |
666 | 671 | // Evergreen+ fusion in bytes |
667 | 672 | info.shared_info->graphics_memory_size |
668 | | = read32(info.registers + CONFIG_MEMSIZE) / 1024; |
| 673 | = (uint32)((uint64)read32(info.registers + CONFIG_MEMSIZE) / 1024); |
669 | 674 | } else { |
670 | 675 | // Evergreen+ has memory stored in MB |
671 | 676 | info.shared_info->graphics_memory_size |
672 | | = read32(info.registers + CONFIG_MEMSIZE) * 1024; |
| 677 | = (uint32)((uint64)read32(info.registers + CONFIG_MEMSIZE) * 1024); |
673 | 678 | } |
674 | 679 | } else if (info.chipsetID >= RADEON_R600) { |
675 | 680 | // R600-R700 has memory stored in bytes |