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