Some cards don't advertise a BAR size which covers all of the VRAM. Mine, a Sapphire RX 5600 XT Pulse, advertises only 256MB, 512MB and 1GB. Despite this, it appears to work fine with the full 6GB visible via an 8GB BAR. v3: changed implementation due to changes in preceding patches. v2: different option controlling this due to a dropped patch. --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 8 ++++++-- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 10 ++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index c0e3e402023e..1bf21231a628 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -195,6 +195,7 @@ static const bool debug_evictions; /* = false */ extern int amdgpu_tmz; extern int amdgpu_reset_method; extern int amdgpu_max_bar_size; +extern bool amdgpu_override_bar_sizes; #ifdef CONFIG_DRM_AMDGPU_SI extern int amdgpu_si_support; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index ce3b8f8fea0c..0f05a75be34e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -954,7 +954,11 @@ int amdgpu_device_resize_fb_bar(struct amdgpu_device *adev) if (!res) return 0; - available_sizes = pci_rebar_get_possible_sizes(adev->pdev, 0); + if (amdgpu_override_bar_sizes) + available_sizes = ~(-1 << rbar_size) & ~0xFF; + else + available_sizes = pci_rebar_get_possible_sizes(adev->pdev, 0); + if (max_size >= 0) { /* Cause larger sizes to be ignored unless that would leave * no advertised sizes (which shouldn't happen). @@ -995,7 +999,7 @@ int amdgpu_device_resize_fb_bar(struct amdgpu_device *adev) rbar_size >= 0; rbar_size = fls(available_sizes & ~(-1 << rbar_size)) - 1 ) { - r = pci_resize_resource(adev->pdev, 0, rbar_size, false); + r = pci_resize_resource(adev->pdev, 0, rbar_size, amdgpu_override_bar_sizes); if (r == 0) { break; } else if (r == -ENOTSUPP) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 74baa8dafa5f..983f80bbe49b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -151,6 +151,7 @@ int amdgpu_force_asic_type = -1; int amdgpu_tmz = 0; int amdgpu_reset_method = -1; /* auto */ int amdgpu_max_bar_size = -1; +bool amdgpu_override_bar_sizes = false; struct amdgpu_mgpu_info mgpu_info = { .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), @@ -774,6 +775,15 @@ module_param_named(reset_method, amdgpu_reset_method, int, 0444); module_param_named(max_bar_size, amdgpu_max_bar_size, int, 0444); MODULE_PARM_DESC(max_bar_size, "Maximum FB BAR size, log2(megabytes) (default = -1, meaning unlimited; minimum is 8 for 256MB)."); +/** + * DOC: amdgpu_override_bar_sizes (int) + * A blunt instrument for ignoring the listed BAR sizes. + * This is intended to handle VBIOSes which list the wrong set of sizes but which aren't recognised as such by the kernel. + * Disabled by default. + */ +module_param_named(override_bar_sizes, amdgpu_override_bar_sizes, bool, 0444); +MODULE_PARM_DESC(override_bar_sizes, "Ignore VBIOS supported BAR sizes, for where the list is wrong. (Disabled by default.)"); + static const struct pci_device_id pciidlist[] = { #ifdef CONFIG_DRM_AMDGPU_SI {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI}, -- 2.20.1 _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx