xref: /linux/drivers/gpu/drm/i915/display/intel_mchbar.c (revision d1dc0c08e25172819c0490791f48490a6c43b58e)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2026 Intel Corporation
4  */
5 
6 #include <linux/minmax.h>
7 
8 #include <drm/drm_print.h>
9 
10 #include "intel_de.h"
11 #include "intel_display_core.h"
12 #include "intel_mchbar.h"
13 
14 static bool has_mchbar_mirror(struct intel_display *display)
15 {
16 	return DISPLAY_VER(display) < 14;
17 }
18 
19 static u32 mchbar_mirror_base(struct intel_display *display)
20 {
21 	if (DISPLAY_VER(display) >= 6)
22 		return MCHBAR_MIRROR_BASE_SNB;
23 	else
24 		return MCHBAR_MIRROR_BASE;
25 }
26 
27 static u32 mchbar_mirror_end(struct intel_display *display)
28 {
29 	if (DISPLAY_VER(display) >= 12 && !display->platform.rocketlake)
30 		return MCHBAR_MIRROR_END_TGL;
31 	else if (DISPLAY_VER(display) >= 11)
32 		return MCHBAR_MIRROR_END_ICL_RKL;
33 	else if (DISPLAY_VER(display) >= 6)
34 		return MCHBAR_MIRROR_END_SNB;
35 	else
36 		return MCHBAR_MIRROR_END;
37 }
38 
39 static u32 mchbar_mirror_len(struct intel_display *display)
40 {
41 	return mchbar_mirror_end(display) - mchbar_mirror_base(display) + 1;
42 }
43 
44 static bool is_mchbar_reg(struct intel_display *display, intel_reg_t reg)
45 {
46 	return has_mchbar_mirror(display) &&
47 		in_range32(intel_reg_offset(reg),
48 			   mchbar_mirror_base(display),
49 			   mchbar_mirror_len(display));
50 }
51 
52 static void assert_is_mchbar_reg(struct intel_display *display, intel_reg_t reg)
53 {
54 	drm_WARN(display->drm, !is_mchbar_reg(display, reg),
55 		 "Reading non-MCHBAR register 0x%x\n",
56 		 intel_reg_offset(reg));
57 }
58 
59 u16 intel_mchbar_read16(struct intel_display *display, intel_reg_t reg)
60 {
61 	assert_is_mchbar_reg(display, reg);
62 
63 	return intel_de_read16(display, reg);
64 }
65 
66 u32 intel_mchbar_read(struct intel_display *display, intel_reg_t reg)
67 {
68 	assert_is_mchbar_reg(display, reg);
69 
70 	return intel_de_read(display, reg);
71 }
72 
73 u64 intel_mchbar_read64_2x32(struct intel_display *display, intel_reg_t reg)
74 {
75 	assert_is_mchbar_reg(display, reg);
76 
77 	return intel_de_read64_2x32(display, reg);
78 }
79