drm/xe: Introduce xe_tile_init_early and use at earlier point in probe
authorMichał Winiarski <michal.winiarski@intel.com>
Tue, 5 Dec 2023 01:32:57 +0000 (02:32 +0100)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:45:10 +0000 (11:45 -0500)
It also merges the GT (which is part of tile) initialization happening
at xe_info_init with allocating other per-tile data structures into a
common helper function.

Signed-off-by: Michał Winiarski <michal.winiarski@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_pci.c
drivers/gpu/drm/xe/xe_tile.c
drivers/gpu/drm/xe/xe_tile.h

index 785bf2e..5e1f73c 100644 (file)
@@ -393,12 +393,6 @@ int xe_device_probe(struct xe_device *xe)
        if (err)
                return err;
 
-       for_each_tile(tile, xe, id) {
-               err = xe_tile_alloc(tile);
-               if (err)
-                       return err;
-       }
-
        err = xe_mmio_init(xe);
        if (err)
                return err;
index 9e35ebf..8725771 100644 (file)
@@ -26,6 +26,7 @@
 #include "xe_pm.h"
 #include "xe_sriov.h"
 #include "xe_step.h"
+#include "xe_tile.h"
 
 enum toggle_d3cold {
        D3COLD_DISABLE,
@@ -623,12 +624,11 @@ static int xe_info_init(struct xe_device *xe,
        xe->info.tile_count = 1 + graphics_desc->max_remote_tiles;
 
        for_each_tile(tile, xe, id) {
-               tile->xe = xe;
-               tile->id = id;
+               int err;
 
-               tile->primary_gt = xe_gt_alloc(tile);
-               if (IS_ERR(tile->primary_gt))
-                       return PTR_ERR(tile->primary_gt);
+               err = xe_tile_init_early(tile, xe, id);
+               if (err)
+                       return err;
 
                gt = tile->primary_gt;
                gt->info.id = xe->info.gt_count++;
index 131752a..c74a4f8 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "xe_device.h"
 #include "xe_ggtt.h"
+#include "xe_gt.h"
 #include "xe_migrate.h"
 #include "xe_sa.h"
 #include "xe_tile.h"
@@ -80,7 +81,7 @@
  *
  * Returns -ENOMEM if allocations fail, otherwise 0.
  */
-int xe_tile_alloc(struct xe_tile *tile)
+static int xe_tile_alloc(struct xe_tile *tile)
 {
        struct drm_device *drm = &tile_to_xe(tile)->drm;
 
@@ -97,6 +98,35 @@ int xe_tile_alloc(struct xe_tile *tile)
        return 0;
 }
 
+/**
+ * xe_tile_init_early - Initialize the tile and primary GT
+ * @tile: Tile to initialize
+ * @xe: Parent Xe device
+ * @id: Tile ID
+ *
+ * Initializes per-tile resources that don't require any interactions with the
+ * hardware or any knowledge about the Graphics/Media IP version.
+ *
+ * Returns: 0 on success, negative error code on error.
+ */
+int xe_tile_init_early(struct xe_tile *tile, struct xe_device *xe, u8 id)
+{
+       int err;
+
+       tile->xe = xe;
+       tile->id = id;
+
+       err = xe_tile_alloc(tile);
+       if (err)
+               return err;
+
+       tile->primary_gt = xe_gt_alloc(tile);
+       if (IS_ERR(tile->primary_gt))
+               return PTR_ERR(tile->primary_gt);
+
+       return 0;
+}
+
 static int tile_ttm_mgr_init(struct xe_tile *tile)
 {
        struct xe_device *xe = tile_to_xe(tile);
index 782c47f..1c9e42a 100644 (file)
@@ -10,7 +10,7 @@
 
 struct xe_tile;
 
-int xe_tile_alloc(struct xe_tile *tile);
+int xe_tile_init_early(struct xe_tile *tile, struct xe_device *xe, u8 id);
 int xe_tile_init_noalloc(struct xe_tile *tile);
 
 void xe_tile_migrate_wait(struct xe_tile *tile);