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