if (!IS_SRIOV(xe))
                return 0;
 
+       if (IS_SRIOV_PF(xe)) {
+               int err = xe_sriov_pf_init_early(xe);
+
+               if (err)
+                       return err;
+       }
+
        xe_assert(xe, !xe->sriov.wq);
        xe->sriov.wq = alloc_workqueue("xe-sriov-wq", 0, 0);
        if (!xe->sriov.wq)
 
  * Copyright © 2023-2024 Intel Corporation
  */
 
+#include <drm/drm_managed.h>
+
 #include "xe_assert.h"
 #include "xe_device.h"
 #include "xe_module.h"
        return true;
 }
 
+/**
+ * xe_sriov_pf_init_early - Initialize SR-IOV PF specific data.
+ * @xe: the &xe_device to initialize
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int xe_sriov_pf_init_early(struct xe_device *xe)
+{
+       xe_assert(xe, IS_SRIOV_PF(xe));
+
+       return drmm_mutex_init(&xe->drm, &xe->sriov.pf.master_lock);
+}
+
 /**
  * xe_sriov_pf_print_vfs_summary - Print SR-IOV PF information.
  * @xe: the &xe_device to print info from
 
 
 #ifdef CONFIG_PCI_IOV
 bool xe_sriov_pf_readiness(struct xe_device *xe);
+int xe_sriov_pf_init_early(struct xe_device *xe);
 void xe_sriov_pf_print_vfs_summary(struct xe_device *xe, struct drm_printer *p);
 #else
 static inline bool xe_sriov_pf_readiness(struct xe_device *xe)
 {
        return false;
 }
+
+static inline int xe_sriov_pf_init_early(struct xe_device *xe)
+{
+       return 0;
+}
 #endif
 
 #endif
 
 #define _XE_SRIOV_TYPES_H_
 
 #include <linux/build_bug.h>
+#include <linux/mutex.h>
 #include <linux/types.h>
 
 /**
 
        /** @driver_max_vfs: Maximum number of VFs supported by the driver. */
        u16 driver_max_vfs;
+
+       /** @master_lock: protects all VFs configurations across GTs */
+       struct mutex master_lock;
 };
 
 #endif