]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/xe_sysctrl: Add System Controller initialization support
authorAnoop Vijay <anoop.c.vijay@intel.com>
Fri, 27 Mar 2026 13:18:41 +0000 (06:18 -0700)
committerUmesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Mon, 30 Mar 2026 17:06:55 +0000 (10:06 -0700)
Add initialization and cleanup infrastructure for System Controller
subsystem and integrate it into xe device probe path.

During initialization, platform support is checked via has_sysctrl
capability flag and the mailbox region is configured through SoC
remapper interface.

Signed-off-by: Anoop Vijay <anoop.c.vijay@intel.com>
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Link: https://patch.msgid.link/20260327131837.2192929-13-anoop.c.vijay@intel.com
drivers/gpu/drm/xe/Makefile
drivers/gpu/drm/xe/xe_device.c
drivers/gpu/drm/xe/xe_sysctrl.c [new file with mode: 0644]
drivers/gpu/drm/xe/xe_sysctrl.h [new file with mode: 0644]

index dab979287a96e1256cd2097026d53a7fa762e210..800ab80f4b537f34d9f1054a421db41cfdf521a3 100644 (file)
@@ -123,6 +123,7 @@ xe-y += xe_bb.o \
        xe_step.o \
        xe_survivability_mode.o \
        xe_sync.o \
+       xe_sysctrl.o \
        xe_tile.o \
        xe_tile_sysfs.o \
        xe_tlb_inval.o \
index 91327f43a04d414c1a8802d85b8578d644a415c2..4d4d7a35e0893730ce3dfe9f67b4de1acc53833a 100644 (file)
@@ -65,6 +65,7 @@
 #include "xe_survivability_mode.h"
 #include "xe_sriov.h"
 #include "xe_svm.h"
+#include "xe_sysctrl.h"
 #include "xe_tile.h"
 #include "xe_ttm_stolen_mgr.h"
 #include "xe_ttm_sys_mgr.h"
@@ -992,6 +993,10 @@ int xe_device_probe(struct xe_device *xe)
        if (err)
                goto err_unregister_display;
 
+       err = xe_sysctrl_init(xe);
+       if (err)
+               goto err_unregister_display;
+
        err = xe_device_sysfs_init(xe);
        if (err)
                goto err_unregister_display;
diff --git a/drivers/gpu/drm/xe/xe_sysctrl.c b/drivers/gpu/drm/xe/xe_sysctrl.c
new file mode 100644 (file)
index 0000000..f1b3af1
--- /dev/null
@@ -0,0 +1,77 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#include <linux/device.h>
+#include <linux/mutex.h>
+
+#include <drm/drm_managed.h>
+
+#include "regs/xe_sysctrl_regs.h"
+#include "xe_device.h"
+#include "xe_mmio.h"
+#include "xe_soc_remapper.h"
+#include "xe_sysctrl.h"
+#include "xe_sysctrl_mailbox.h"
+#include "xe_sysctrl_types.h"
+
+/**
+ * DOC: System Controller (sysctrl)
+ *
+ * System Controller (sysctrl) is a firmware-managed entity on Intel dGPUs
+ * responsible for selected low-level platform management functions.
+ * Communication between driver and System Controller is performed
+ * via a mailbox interface, enabling command and response exchange.
+ *
+ * This module provides initialization and support code for interacting
+ * with System Controller through the mailbox interface.
+ */
+static void sysctrl_fini(void *arg)
+{
+       struct xe_device *xe = arg;
+
+       xe->soc_remapper.set_sysctrl_region(xe, 0);
+}
+
+/**
+ * xe_sysctrl_init() - Initialize System Controller subsystem
+ * @xe: xe device instance
+ *
+ * Entry point for System Controller initialization, called from xe_device_probe.
+ * This function checks platform support and initializes the system controller.
+ *
+ * Return: 0 on success, error code on failure
+ */
+int xe_sysctrl_init(struct xe_device *xe)
+{
+       struct xe_tile *tile = xe_device_get_root_tile(xe);
+       struct xe_sysctrl *sc = &xe->sc;
+       int ret;
+
+       if (!xe->info.has_soc_remapper_sysctrl)
+               return 0;
+
+       if (!xe->info.has_sysctrl)
+               return 0;
+
+       xe->soc_remapper.set_sysctrl_region(xe, SYSCTRL_MAILBOX_INDEX);
+
+       ret = devm_add_action_or_reset(xe->drm.dev, sysctrl_fini, xe);
+       if (ret)
+               return ret;
+
+       sc->mmio = devm_kzalloc(xe->drm.dev, sizeof(*sc->mmio), GFP_KERNEL);
+       if (!sc->mmio)
+               return -ENOMEM;
+
+       xe_mmio_init(sc->mmio, tile, tile->mmio.regs, tile->mmio.regs_size);
+       sc->mmio->adj_offset = SYSCTRL_BASE;
+       sc->mmio->adj_limit = U32_MAX;
+
+       ret = devm_mutex_init(xe->drm.dev, &sc->cmd_lock);
+       if (ret)
+               return ret;
+
+       return 0;
+}
diff --git a/drivers/gpu/drm/xe/xe_sysctrl.h b/drivers/gpu/drm/xe/xe_sysctrl.h
new file mode 100644 (file)
index 0000000..d5d8735
--- /dev/null
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#ifndef _XE_SYSCTRL_H_
+#define _XE_SYSCTRL_H_
+
+#include <linux/container_of.h>
+
+#include "xe_device_types.h"
+#include "xe_sysctrl_types.h"
+
+static inline struct xe_device *sc_to_xe(struct xe_sysctrl *sc)
+{
+       return container_of(sc, struct xe_device, sc);
+}
+
+int xe_sysctrl_init(struct xe_device *xe);
+
+#endif