[PATCH 6/8] amdgpu: allow overriding of the GPU's list of supported BAR sizes (v3)
Darren Salt
devspam at moreofthesa.me.uk
Sun Dec 13 22:53:21 UTC 2020
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
More information about the amd-gfx
mailing list