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 0b17e758e3f1..93285ec7bfc3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -202,6 +202,7 @@ static const bool __maybe_unused no_system_mem_limit; 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 125aca52e25d..8490a96ee25e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -1151,7 +1151,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). @@ -1188,7 +1192,7 @@ int amdgpu_device_resize_fb_bar(struct amdgpu_device *adev) pci_release_resource(adev->pdev, 0); - 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 == -ENOTSUPP) { dev_info(adev->dev, "BAR resizing not supported."); } else if (r == -ENOSPC) { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index dd2dc992ed13..59f6b95f0875 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -162,6 +162,7 @@ int amdgpu_tmz; int amdgpu_reset_method = -1; /* auto */ int amdgpu_num_kcq = -1; int amdgpu_max_bar_size = -1; +bool amdgpu_override_bar_sizes = false; struct amdgpu_mgpu_info mgpu_info = { .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), @@ -816,6 +817,15 @@ module_param_named(num_kcq, amdgpu_num_kcq, 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