xref: /linux/drivers/gpu/drm/xe/xe_sysctrl.c (revision 1f95f618182b5c99d46378141e0fb84f09bf914b)
15ea3f0dcSAnoop Vijay // SPDX-License-Identifier: MIT
25ea3f0dcSAnoop Vijay /*
35ea3f0dcSAnoop Vijay  * Copyright © 2026 Intel Corporation
45ea3f0dcSAnoop Vijay  */
55ea3f0dcSAnoop Vijay 
65ea3f0dcSAnoop Vijay #include <linux/device.h>
75ea3f0dcSAnoop Vijay #include <linux/mutex.h>
85ea3f0dcSAnoop Vijay 
95ea3f0dcSAnoop Vijay #include <drm/drm_managed.h>
105ea3f0dcSAnoop Vijay 
115ea3f0dcSAnoop Vijay #include "regs/xe_sysctrl_regs.h"
125ea3f0dcSAnoop Vijay #include "xe_device.h"
135ea3f0dcSAnoop Vijay #include "xe_mmio.h"
145ea3f0dcSAnoop Vijay #include "xe_soc_remapper.h"
155ea3f0dcSAnoop Vijay #include "xe_sysctrl.h"
165ea3f0dcSAnoop Vijay #include "xe_sysctrl_mailbox.h"
175ea3f0dcSAnoop Vijay #include "xe_sysctrl_types.h"
185ea3f0dcSAnoop Vijay 
195ea3f0dcSAnoop Vijay /**
205ea3f0dcSAnoop Vijay  * DOC: System Controller (sysctrl)
215ea3f0dcSAnoop Vijay  *
225ea3f0dcSAnoop Vijay  * System Controller (sysctrl) is a firmware-managed entity on Intel dGPUs
235ea3f0dcSAnoop Vijay  * responsible for selected low-level platform management functions.
245ea3f0dcSAnoop Vijay  * Communication between driver and System Controller is performed
255ea3f0dcSAnoop Vijay  * via a mailbox interface, enabling command and response exchange.
265ea3f0dcSAnoop Vijay  *
275ea3f0dcSAnoop Vijay  * This module provides initialization and support code for interacting
285ea3f0dcSAnoop Vijay  * with System Controller through the mailbox interface.
295ea3f0dcSAnoop Vijay  */
305ea3f0dcSAnoop Vijay static void sysctrl_fini(void *arg)
315ea3f0dcSAnoop Vijay {
325ea3f0dcSAnoop Vijay 	struct xe_device *xe = arg;
335ea3f0dcSAnoop Vijay 
345ea3f0dcSAnoop Vijay 	xe->soc_remapper.set_sysctrl_region(xe, 0);
355ea3f0dcSAnoop Vijay }
365ea3f0dcSAnoop Vijay 
375ea3f0dcSAnoop Vijay /**
385ea3f0dcSAnoop Vijay  * xe_sysctrl_init() - Initialize System Controller subsystem
395ea3f0dcSAnoop Vijay  * @xe: xe device instance
405ea3f0dcSAnoop Vijay  *
415ea3f0dcSAnoop Vijay  * Entry point for System Controller initialization, called from xe_device_probe.
425ea3f0dcSAnoop Vijay  * This function checks platform support and initializes the system controller.
435ea3f0dcSAnoop Vijay  *
445ea3f0dcSAnoop Vijay  * Return: 0 on success, error code on failure
455ea3f0dcSAnoop Vijay  */
465ea3f0dcSAnoop Vijay int xe_sysctrl_init(struct xe_device *xe)
475ea3f0dcSAnoop Vijay {
485ea3f0dcSAnoop Vijay 	struct xe_tile *tile = xe_device_get_root_tile(xe);
495ea3f0dcSAnoop Vijay 	struct xe_sysctrl *sc = &xe->sc;
505ea3f0dcSAnoop Vijay 	int ret;
515ea3f0dcSAnoop Vijay 
525ea3f0dcSAnoop Vijay 	if (!xe->info.has_soc_remapper_sysctrl)
535ea3f0dcSAnoop Vijay 		return 0;
545ea3f0dcSAnoop Vijay 
555ea3f0dcSAnoop Vijay 	if (!xe->info.has_sysctrl)
565ea3f0dcSAnoop Vijay 		return 0;
575ea3f0dcSAnoop Vijay 
585ea3f0dcSAnoop Vijay 	xe->soc_remapper.set_sysctrl_region(xe, SYSCTRL_MAILBOX_INDEX);
595ea3f0dcSAnoop Vijay 
605ea3f0dcSAnoop Vijay 	ret = devm_add_action_or_reset(xe->drm.dev, sysctrl_fini, xe);
615ea3f0dcSAnoop Vijay 	if (ret)
625ea3f0dcSAnoop Vijay 		return ret;
635ea3f0dcSAnoop Vijay 
645ea3f0dcSAnoop Vijay 	sc->mmio = devm_kzalloc(xe->drm.dev, sizeof(*sc->mmio), GFP_KERNEL);
655ea3f0dcSAnoop Vijay 	if (!sc->mmio)
665ea3f0dcSAnoop Vijay 		return -ENOMEM;
675ea3f0dcSAnoop Vijay 
685ea3f0dcSAnoop Vijay 	xe_mmio_init(sc->mmio, tile, tile->mmio.regs, tile->mmio.regs_size);
695ea3f0dcSAnoop Vijay 	sc->mmio->adj_offset = SYSCTRL_BASE;
705ea3f0dcSAnoop Vijay 	sc->mmio->adj_limit = U32_MAX;
715ea3f0dcSAnoop Vijay 
725ea3f0dcSAnoop Vijay 	ret = devm_mutex_init(xe->drm.dev, &sc->cmd_lock);
735ea3f0dcSAnoop Vijay 	if (ret)
745ea3f0dcSAnoop Vijay 		return ret;
755ea3f0dcSAnoop Vijay 
76*1f95f618SAnoop Vijay 	xe_sysctrl_mailbox_init(sc);
77*1f95f618SAnoop Vijay 
785ea3f0dcSAnoop Vijay 	return 0;
795ea3f0dcSAnoop Vijay }
80