summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJonathan Gray <jsg@cvs.openbsd.org>2022-01-27 23:10:03 +0000
committerJonathan Gray <jsg@cvs.openbsd.org>2022-01-27 23:10:03 +0000
commit35e7ca6288992470e34c6b14fa090411cf4db973 (patch)
tree2c08356be2b8ad7330fd833c0f5e84513817848f /sys
parentaf80ffc5c2bee429a20d45bd42b935a1c07c4809 (diff)
drm/amdgpu: fixup bad vram size on gmc v8
From Zongmin Zhou 493b87970061f044c5cf795cfd1d679d114844ed in linux 5.15.y/5.15.17 11544d77e3974924c5a9c8a8320b996a3e9b2f8b in mainline linux
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/pci/drm/amd/amdgpu/gmc_v8_0.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/dev/pci/drm/amd/amdgpu/gmc_v8_0.c b/sys/dev/pci/drm/amd/amdgpu/gmc_v8_0.c
index 339ffd9b691..587206dd388 100644
--- a/sys/dev/pci/drm/amd/amdgpu/gmc_v8_0.c
+++ b/sys/dev/pci/drm/amd/amdgpu/gmc_v8_0.c
@@ -515,10 +515,10 @@ static void gmc_v8_0_mc_program(struct amdgpu_device *adev)
static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
{
int r;
+ u32 tmp;
adev->gmc.vram_width = amdgpu_atombios_get_vram_width(adev);
if (!adev->gmc.vram_width) {
- u32 tmp;
int chansize, numchan;
/* Get VRAM informations */
@@ -562,8 +562,15 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
adev->gmc.vram_width = numchan * chansize;
}
/* size in MB on si */
- adev->gmc.mc_vram_size = RREG32(mmCONFIG_MEMSIZE) * 1024ULL * 1024ULL;
- adev->gmc.real_vram_size = RREG32(mmCONFIG_MEMSIZE) * 1024ULL * 1024ULL;
+ tmp = RREG32(mmCONFIG_MEMSIZE);
+ /* some boards may have garbage in the upper 16 bits */
+ if (tmp & 0xffff0000) {
+ DRM_INFO("Probable bad vram size: 0x%08x\n", tmp);
+ if (tmp & 0xffff)
+ tmp &= 0xffff;
+ }
+ adev->gmc.mc_vram_size = tmp * 1024ULL * 1024ULL;
+ adev->gmc.real_vram_size = adev->gmc.mc_vram_size;
if (!(adev->flags & AMD_IS_APU)) {
r = amdgpu_device_resize_fb_bar(adev);