xref: /linux/drivers/gpu/drm/xe/xe_soc_remapper.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2025 Intel Corporation
4  */
5 
6 #include "regs/xe_soc_remapper_regs.h"
7 #include "xe_mmio.h"
8 #include "xe_soc_remapper.h"
9 
10 static void xe_soc_remapper_set_region(struct xe_device *xe, struct xe_reg reg,
11 				       u32 mask, u32 val)
12 {
13 	guard(spinlock_irqsave)(&xe->soc_remapper.lock);
14 	xe_mmio_rmw32(xe_root_tile_mmio(xe), reg, mask, val);
15 }
16 
17 static void xe_soc_remapper_set_telem_region(struct xe_device *xe, u32 index)
18 {
19 	xe_soc_remapper_set_region(xe, SG_REMAP_INDEX1, SG_REMAP_TELEM_MASK,
20 				   REG_FIELD_PREP(SG_REMAP_TELEM_MASK, index));
21 }
22 
23 static void xe_soc_remapper_set_sysctrl_region(struct xe_device *xe, u32 index)
24 {
25 	xe_soc_remapper_set_region(xe, SG_REMAP_INDEX1, SG_REMAP_SYSCTRL_MASK,
26 				   REG_FIELD_PREP(SG_REMAP_SYSCTRL_MASK, index));
27 }
28 
29 /**
30  * xe_soc_remapper_init() - Initialize SoC remapper
31  * @xe: Pointer to xe device.
32  *
33  * Initialize SoC remapper.
34  *
35  * Return: 0 on success, error code on failure
36  */
37 int xe_soc_remapper_init(struct xe_device *xe)
38 {
39 	bool has_soc_remapper = xe->info.has_soc_remapper_telem ||
40 				xe->info.has_soc_remapper_sysctrl;
41 
42 	if (has_soc_remapper)
43 		spin_lock_init(&xe->soc_remapper.lock);
44 
45 	if (xe->info.has_soc_remapper_telem)
46 		xe->soc_remapper.set_telem_region = xe_soc_remapper_set_telem_region;
47 
48 	if (xe->info.has_soc_remapper_sysctrl)
49 		xe->soc_remapper.set_sysctrl_region = xe_soc_remapper_set_sysctrl_region;
50 
51 	return 0;
52 }
53