On Thu, Sep 18, 2025 at 07:41:59PM +0300, Ilpo Järvinen wrote:
On Wed, 17 Sep 2025, Lucas De Marchi wrote:

Now that xe_pci.c calls the rebar directly, it doens't make sense to
keep it in xe_vram.c since it's closer to the PCI initialization than to
the vram. Move it to its own file.

While at it, add a better comment to document the possible values for
the vram_bar_size module parameter.

Signed-off-by: Lucas De Marchi <lucas.demar...@intel.com>
---
 drivers/gpu/drm/xe/Makefile       |   1 +
 drivers/gpu/drm/xe/xe_pci.c       |   3 +-
 drivers/gpu/drm/xe/xe_pci_rebar.c | 125 ++++++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/xe/xe_pci_rebar.h |  13 ++++
 drivers/gpu/drm/xe/xe_vram.c      | 109 ---------------------------------
 drivers/gpu/drm/xe/xe_vram.h      |   1 -
 6 files changed, 141 insertions(+), 111 deletions(-)

diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index 7a065c98a3b85..5a66d7a53d0db 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -95,6 +95,7 @@ xe-y += xe_bb.o \
        xe_observation.o \
        xe_pat.o \
        xe_pci.o \
+       xe_pci_rebar.o \
        xe_pcode.o \
        xe_pm.o \
        xe_preempt_fence.o \
diff --git a/drivers/gpu/drm/xe/xe_pci.c b/drivers/gpu/drm/xe/xe_pci.c
index 1f4120b535137..6cc5e7b6901a8 100644
--- a/drivers/gpu/drm/xe/xe_pci.c
+++ b/drivers/gpu/drm/xe/xe_pci.c
@@ -27,6 +27,7 @@
 #include "xe_macros.h"
 #include "xe_mmio.h"
 #include "xe_module.h"
+#include "xe_pci_rebar.h"
 #include "xe_pci_sriov.h"
 #include "xe_pci_types.h"
 #include "xe_pm.h"
@@ -866,7 +867,7 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
        if (err)
                return err;

-       xe_vram_resize_bar(xe);
+       xe_pci_rebar(xe);

        err = xe_device_probe_early(xe);
        /*
diff --git a/drivers/gpu/drm/xe/xe_pci_rebar.c 
b/drivers/gpu/drm/xe/xe_pci_rebar.c
new file mode 100644
index 0000000000000..e04416630b573
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_pci_rebar.c
@@ -0,0 +1,125 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2025 Intel Corporation
+ */
+
+#include "xe_pci_rebar.h"
+
+#include <linux/pci.h>
+#include <linux/types.h>
+
+#include <drm/drm_print.h>
+
+#include "regs/xe_bars.h"
+#include "xe_device_types.h"
+#include "xe_module.h"
+
+#define BAR_SIZE_SHIFT 20
+
+static void release_bars(struct pci_dev *pdev)
+{
+       int resno;
+
+       for (resno = PCI_STD_RESOURCES; resno < PCI_STD_RESOURCE_END; resno++) {
+               if (pci_resource_len(pdev, resno))
+                       pci_release_resource(pdev, resno);
+       }
+}
+
+static void resize_bar(struct xe_device *xe, int resno, resource_size_t size)
+{
+       struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
+       int bar_size = pci_rebar_bytes_to_size(size);
+       int ret;
+
+       release_bars(pdev);
+
+       ret = pci_resize_resource(pdev, resno, bar_size);
+       if (ret) {
+               drm_info(&xe->drm, "Failed to resize BAR%d to %dM (%pe). Consider 
enabling 'Resizable BAR' support in your BIOS\n",
+                        resno, 1 << bar_size, ERR_PTR(ret));
+               return;
+       }
+
+       drm_info(&xe->drm, "BAR%d resized to %dM\n", resno, 1 << bar_size);
+}
+
+void xe_pci_rebar(struct xe_device *xe)
+{
+       int force_vram_bar_size = xe_modparam.force_vram_bar_size;
+       struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
+       struct pci_bus *root = pdev->bus;
+       resource_size_t current_size;
+       resource_size_t rebar_size;
+       struct resource *root_res;
+       u32 bar_size_mask;
+       u32 pci_cmd;
+       int i;
+
+       /* gather some relevant info */
+       current_size = pci_resource_len(pdev, LMEM_BAR);
+       bar_size_mask = pci_rebar_get_possible_sizes(pdev, LMEM_BAR);
+
+       if (!bar_size_mask)
+               return;
+
+       /*
+        * Handle force_vram_bar_size:
+        * - negative: resize is disabled
+        * - 0: try to resize to maximum possible
+        * - positive: resize to specific value
+        */
+       if (force_vram_bar_size < 0)
+               return;
+
+       if (force_vram_bar_size) {
+               u32 bar_size_bit;
+
+               rebar_size = force_vram_bar_size * (resource_size_t)SZ_1M;
+
+               bar_size_bit = bar_size_mask & 
BIT(pci_rebar_bytes_to_size(rebar_size));
+
+               if (!bar_size_bit) {
+                       drm_info(&xe->drm,
+                                "Requested size: %lluMiB is not supported by rebar 
sizes: 0x%x. Leaving default: %lluMiB\n",
+                                (u64)rebar_size >> 20, bar_size_mask, 
(u64)current_size >> 20);
+                       return;
+               }
+
+               rebar_size = 1ULL << (__fls(bar_size_bit) + BAR_SIZE_SHIFT);
+
+               if (rebar_size == current_size)
+                       return;
+       } else {
+               rebar_size = 1ULL << (__fls(bar_size_mask) + BAR_SIZE_SHIFT);
+
+               /* only resize if larger than current */
+               if (rebar_size <= current_size)
+                       return;
+       }
+
+       drm_info(&xe->drm, "Attempting to resize bar from %lluMiB -> %lluMiB\n",
+                (u64)current_size >> 20, (u64)rebar_size >> 20);

BTW, if you want to do additional cleanups, all these 20 could be replaced
with ilog(SZ_1M) as it makes more obvious where that number comes from.

But this conflicts anyway with my rebar rework series so perhaps this
is not the best time for such cleanup.

agreed. This patch and the others that will come on top should be merged
only after yours. I will mention that in the cover letter of my next
rev.

Lucas De Marchi


--
i.

Reply via email to