Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: Move the power domain->well mappings to intel_display_power_map.c

Move the list of platform specific power domain -> power well
definitions to intel_display_power_map.c. While at it group the
platforms' power domain macros with the corresponding power well lists
and keep all the power domain lists in the same order (matching the enum
order).

No functional changes.

v2:
- s/intel_display_power_internal.h/intel_display_power_map.h/ (Jani)
- Simplify intel_cleanup_power_wells().
- Don't move intel_display_power_domain_str().
v3:
- Rename intel_init/cleanup_power_wells() to
intel_display_power_map_init/cleanup().
- Add documentation to intel_display_power_map_init/cleanup().

Cc: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Jouni Högander <jouni.hogander@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220414210657.1785773-3-imre.deak@intel.com

+2168 -2257
+1
drivers/gpu/drm/i915/Makefile
··· 213 213 display/intel_cursor.o \ 214 214 display/intel_display.o \ 215 215 display/intel_display_power.o \ 216 + display/intel_display_power_map.o \ 216 217 display/intel_display_power_well.o \ 217 218 display/intel_dmc.o \ 218 219 display/intel_dpio_phy.o \
+3 -2257
drivers/gpu/drm/i915/display/intel_display_power.c
··· 11 11 #include "intel_combo_phy.h" 12 12 #include "intel_de.h" 13 13 #include "intel_display_power.h" 14 + #include "intel_display_power_map.h" 14 15 #include "intel_display_power_well.h" 15 16 #include "intel_display_types.h" 16 17 #include "intel_dmc.h" ··· 849 848 } 850 849 } 851 850 852 - #define I830_PIPES_POWER_DOMAINS ( \ 853 - BIT_ULL(POWER_DOMAIN_PIPE_A) | \ 854 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 855 - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 856 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 857 - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 858 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 859 - BIT_ULL(POWER_DOMAIN_INIT)) 860 - 861 - #define VLV_DISPLAY_POWER_DOMAINS ( \ 862 - BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \ 863 - BIT_ULL(POWER_DOMAIN_PIPE_A) | \ 864 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 865 - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 866 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 867 - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 868 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 869 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 870 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 871 - BIT_ULL(POWER_DOMAIN_PORT_DSI) | \ 872 - BIT_ULL(POWER_DOMAIN_PORT_CRT) | \ 873 - BIT_ULL(POWER_DOMAIN_VGA) | \ 874 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 875 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 876 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 877 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 878 - BIT_ULL(POWER_DOMAIN_GMBUS) | \ 879 - BIT_ULL(POWER_DOMAIN_INIT)) 880 - 881 - #define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \ 882 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 883 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 884 - BIT_ULL(POWER_DOMAIN_PORT_CRT) | \ 885 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 886 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 887 - BIT_ULL(POWER_DOMAIN_INIT)) 888 - 889 - #define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \ 890 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 891 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 892 - BIT_ULL(POWER_DOMAIN_INIT)) 893 - 894 - #define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \ 895 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 896 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 897 - BIT_ULL(POWER_DOMAIN_INIT)) 898 - 899 - #define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \ 900 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 901 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 902 - BIT_ULL(POWER_DOMAIN_INIT)) 903 - 904 - #define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \ 905 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 906 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 907 - BIT_ULL(POWER_DOMAIN_INIT)) 908 - 909 - #define CHV_DISPLAY_POWER_DOMAINS ( \ 910 - BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \ 911 - BIT_ULL(POWER_DOMAIN_PIPE_A) | \ 912 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 913 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 914 - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 915 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 916 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 917 - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 918 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 919 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 920 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 921 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 922 - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 923 - BIT_ULL(POWER_DOMAIN_PORT_DSI) | \ 924 - BIT_ULL(POWER_DOMAIN_VGA) | \ 925 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 926 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 927 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 928 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 929 - BIT_ULL(POWER_DOMAIN_AUX_D) | \ 930 - BIT_ULL(POWER_DOMAIN_GMBUS) | \ 931 - BIT_ULL(POWER_DOMAIN_INIT)) 932 - 933 - #define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \ 934 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 935 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 936 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 937 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 938 - BIT_ULL(POWER_DOMAIN_INIT)) 939 - 940 - #define CHV_DPIO_CMN_D_POWER_DOMAINS ( \ 941 - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 942 - BIT_ULL(POWER_DOMAIN_AUX_D) | \ 943 - BIT_ULL(POWER_DOMAIN_INIT)) 944 - 945 - #define HSW_DISPLAY_POWER_DOMAINS ( \ 946 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 947 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 948 - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 949 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 950 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 951 - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 952 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 953 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 954 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 955 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 956 - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 957 - BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \ 958 - BIT_ULL(POWER_DOMAIN_VGA) | \ 959 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 960 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 961 - BIT_ULL(POWER_DOMAIN_INIT)) 962 - 963 - #define BDW_DISPLAY_POWER_DOMAINS ( \ 964 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 965 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 966 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 967 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 968 - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 969 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 970 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 971 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 972 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 973 - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 974 - BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \ 975 - BIT_ULL(POWER_DOMAIN_VGA) | \ 976 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 977 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 978 - BIT_ULL(POWER_DOMAIN_INIT)) 979 - 980 - #define SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \ 981 - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 982 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 983 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 984 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 985 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 986 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 987 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 988 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 989 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 990 - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 991 - BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \ 992 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 993 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 994 - BIT_ULL(POWER_DOMAIN_AUX_D) | \ 995 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 996 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 997 - BIT_ULL(POWER_DOMAIN_VGA) | \ 998 - BIT_ULL(POWER_DOMAIN_INIT)) 999 - #define SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS ( \ 1000 - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO) | \ 1001 - BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO) | \ 1002 - BIT_ULL(POWER_DOMAIN_INIT)) 1003 - #define SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS ( \ 1004 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO) | \ 1005 - BIT_ULL(POWER_DOMAIN_INIT)) 1006 - #define SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS ( \ 1007 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO) | \ 1008 - BIT_ULL(POWER_DOMAIN_INIT)) 1009 - #define SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS ( \ 1010 - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO) | \ 1011 - BIT_ULL(POWER_DOMAIN_INIT)) 1012 - #define SKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1013 - SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ 1014 - BIT_ULL(POWER_DOMAIN_GT_IRQ) | \ 1015 - BIT_ULL(POWER_DOMAIN_MODESET) | \ 1016 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1017 - BIT_ULL(POWER_DOMAIN_INIT)) 1018 - 1019 - #define BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \ 1020 - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 1021 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1022 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1023 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 1024 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 1025 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1026 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 1027 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 1028 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 1029 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1030 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1031 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1032 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1033 - BIT_ULL(POWER_DOMAIN_VGA) | \ 1034 - BIT_ULL(POWER_DOMAIN_INIT)) 1035 - #define BXT_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1036 - BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ 1037 - BIT_ULL(POWER_DOMAIN_GT_IRQ) | \ 1038 - BIT_ULL(POWER_DOMAIN_MODESET) | \ 1039 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1040 - BIT_ULL(POWER_DOMAIN_GMBUS) | \ 1041 - BIT_ULL(POWER_DOMAIN_INIT)) 1042 - #define BXT_DPIO_CMN_A_POWER_DOMAINS ( \ 1043 - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \ 1044 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1045 - BIT_ULL(POWER_DOMAIN_INIT)) 1046 - #define BXT_DPIO_CMN_BC_POWER_DOMAINS ( \ 1047 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 1048 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 1049 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1050 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1051 - BIT_ULL(POWER_DOMAIN_INIT)) 1052 - 1053 - #define GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \ 1054 - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 1055 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1056 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1057 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 1058 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 1059 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1060 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 1061 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 1062 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 1063 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1064 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1065 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1066 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1067 - BIT_ULL(POWER_DOMAIN_VGA) | \ 1068 - BIT_ULL(POWER_DOMAIN_INIT)) 1069 - #define GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS ( \ 1070 - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO)) 1071 - #define GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS ( \ 1072 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO)) 1073 - #define GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS ( \ 1074 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO)) 1075 - #define GLK_DPIO_CMN_A_POWER_DOMAINS ( \ 1076 - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \ 1077 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1078 - BIT_ULL(POWER_DOMAIN_INIT)) 1079 - #define GLK_DPIO_CMN_B_POWER_DOMAINS ( \ 1080 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 1081 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1082 - BIT_ULL(POWER_DOMAIN_INIT)) 1083 - #define GLK_DPIO_CMN_C_POWER_DOMAINS ( \ 1084 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 1085 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1086 - BIT_ULL(POWER_DOMAIN_INIT)) 1087 - #define GLK_DISPLAY_AUX_A_POWER_DOMAINS ( \ 1088 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1089 - BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \ 1090 - BIT_ULL(POWER_DOMAIN_INIT)) 1091 - #define GLK_DISPLAY_AUX_B_POWER_DOMAINS ( \ 1092 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1093 - BIT_ULL(POWER_DOMAIN_INIT)) 1094 - #define GLK_DISPLAY_AUX_C_POWER_DOMAINS ( \ 1095 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1096 - BIT_ULL(POWER_DOMAIN_INIT)) 1097 - #define GLK_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1098 - GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ 1099 - BIT_ULL(POWER_DOMAIN_GT_IRQ) | \ 1100 - BIT_ULL(POWER_DOMAIN_MODESET) | \ 1101 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1102 - BIT_ULL(POWER_DOMAIN_GMBUS) | \ 1103 - BIT_ULL(POWER_DOMAIN_INIT)) 1104 - 1105 - /* 1106 - * ICL PW_0/PG_0 domains (HW/DMC control): 1107 - * - PCI 1108 - * - clocks except port PLL 1109 - * - central power except FBC 1110 - * - shared functions except pipe interrupts, pipe MBUS, DBUF registers 1111 - * ICL PW_1/PG_1 domains (HW/DMC control): 1112 - * - DBUF function 1113 - * - PIPE_A and its planes, except VGA 1114 - * - transcoder EDP + PSR 1115 - * - transcoder DSI 1116 - * - DDI_A 1117 - * - FBC 1118 - */ 1119 - #define ICL_PW_4_POWER_DOMAINS ( \ 1120 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 1121 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 1122 - BIT_ULL(POWER_DOMAIN_INIT)) 1123 - /* VDSC/joining */ 1124 - #define ICL_PW_3_POWER_DOMAINS ( \ 1125 - ICL_PW_4_POWER_DOMAINS | \ 1126 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1127 - BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 1128 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1129 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 1130 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1131 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 1132 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 1133 - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 1134 - BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \ 1135 - BIT_ULL(POWER_DOMAIN_PORT_DDI_F_LANES) | \ 1136 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1137 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1138 - BIT_ULL(POWER_DOMAIN_AUX_D) | \ 1139 - BIT_ULL(POWER_DOMAIN_AUX_E) | \ 1140 - BIT_ULL(POWER_DOMAIN_AUX_F) | \ 1141 - BIT_ULL(POWER_DOMAIN_AUX_C_TBT) | \ 1142 - BIT_ULL(POWER_DOMAIN_AUX_D_TBT) | \ 1143 - BIT_ULL(POWER_DOMAIN_AUX_E_TBT) | \ 1144 - BIT_ULL(POWER_DOMAIN_AUX_F_TBT) | \ 1145 - BIT_ULL(POWER_DOMAIN_VGA) | \ 1146 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1147 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1148 - BIT_ULL(POWER_DOMAIN_INIT)) 1149 - /* 1150 - * - transcoder WD 1151 - * - KVMR (HW control) 1152 - */ 1153 - #define ICL_PW_2_POWER_DOMAINS ( \ 1154 - ICL_PW_3_POWER_DOMAINS | \ 1155 - BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \ 1156 - BIT_ULL(POWER_DOMAIN_INIT)) 1157 - /* 1158 - * - KVMR (HW control) 1159 - */ 1160 - #define ICL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1161 - ICL_PW_2_POWER_DOMAINS | \ 1162 - BIT_ULL(POWER_DOMAIN_MODESET) | \ 1163 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1164 - BIT_ULL(POWER_DOMAIN_DC_OFF) | \ 1165 - BIT_ULL(POWER_DOMAIN_INIT)) 1166 - 1167 - #define ICL_DDI_IO_A_POWER_DOMAINS ( \ 1168 - BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO)) 1169 - #define ICL_DDI_IO_B_POWER_DOMAINS ( \ 1170 - BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO)) 1171 - #define ICL_DDI_IO_C_POWER_DOMAINS ( \ 1172 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO)) 1173 - #define ICL_DDI_IO_D_POWER_DOMAINS ( \ 1174 - BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO)) 1175 - #define ICL_DDI_IO_E_POWER_DOMAINS ( \ 1176 - BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO)) 1177 - #define ICL_DDI_IO_F_POWER_DOMAINS ( \ 1178 - BIT_ULL(POWER_DOMAIN_PORT_DDI_F_IO)) 1179 - 1180 - #define ICL_AUX_A_IO_POWER_DOMAINS ( \ 1181 - BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \ 1182 - BIT_ULL(POWER_DOMAIN_AUX_A)) 1183 - #define ICL_AUX_B_IO_POWER_DOMAINS ( \ 1184 - BIT_ULL(POWER_DOMAIN_AUX_B)) 1185 - #define ICL_AUX_C_TC1_IO_POWER_DOMAINS ( \ 1186 - BIT_ULL(POWER_DOMAIN_AUX_C)) 1187 - #define ICL_AUX_D_TC2_IO_POWER_DOMAINS ( \ 1188 - BIT_ULL(POWER_DOMAIN_AUX_D)) 1189 - #define ICL_AUX_E_TC3_IO_POWER_DOMAINS ( \ 1190 - BIT_ULL(POWER_DOMAIN_AUX_E)) 1191 - #define ICL_AUX_F_TC4_IO_POWER_DOMAINS ( \ 1192 - BIT_ULL(POWER_DOMAIN_AUX_F)) 1193 - #define ICL_AUX_C_TBT1_IO_POWER_DOMAINS ( \ 1194 - BIT_ULL(POWER_DOMAIN_AUX_C_TBT)) 1195 - #define ICL_AUX_D_TBT2_IO_POWER_DOMAINS ( \ 1196 - BIT_ULL(POWER_DOMAIN_AUX_D_TBT)) 1197 - #define ICL_AUX_E_TBT3_IO_POWER_DOMAINS ( \ 1198 - BIT_ULL(POWER_DOMAIN_AUX_E_TBT)) 1199 - #define ICL_AUX_F_TBT4_IO_POWER_DOMAINS ( \ 1200 - BIT_ULL(POWER_DOMAIN_AUX_F_TBT)) 1201 - 1202 - #define TGL_PW_5_POWER_DOMAINS ( \ 1203 - BIT_ULL(POWER_DOMAIN_PIPE_D) | \ 1204 - BIT_ULL(POWER_DOMAIN_TRANSCODER_D) | \ 1205 - BIT_ULL(POWER_DOMAIN_PIPE_D_PANEL_FITTER) | \ 1206 - BIT_ULL(POWER_DOMAIN_INIT)) 1207 - 1208 - #define TGL_PW_4_POWER_DOMAINS ( \ 1209 - TGL_PW_5_POWER_DOMAINS | \ 1210 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 1211 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 1212 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 1213 - BIT_ULL(POWER_DOMAIN_INIT)) 1214 - 1215 - #define TGL_PW_3_POWER_DOMAINS ( \ 1216 - TGL_PW_4_POWER_DOMAINS | \ 1217 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1218 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1219 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1220 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \ 1221 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \ 1222 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC3) | \ 1223 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC4) | \ 1224 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC5) | \ 1225 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC6) | \ 1226 - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 1227 - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1228 - BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \ 1229 - BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \ 1230 - BIT_ULL(POWER_DOMAIN_AUX_USBC5) | \ 1231 - BIT_ULL(POWER_DOMAIN_AUX_USBC6) | \ 1232 - BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \ 1233 - BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \ 1234 - BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \ 1235 - BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \ 1236 - BIT_ULL(POWER_DOMAIN_AUX_TBT5) | \ 1237 - BIT_ULL(POWER_DOMAIN_AUX_TBT6) | \ 1238 - BIT_ULL(POWER_DOMAIN_VGA) | \ 1239 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1240 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1241 - BIT_ULL(POWER_DOMAIN_INIT)) 1242 - 1243 - #define TGL_PW_2_POWER_DOMAINS ( \ 1244 - TGL_PW_3_POWER_DOMAINS | \ 1245 - BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \ 1246 - BIT_ULL(POWER_DOMAIN_INIT)) 1247 - 1248 - #define TGL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1249 - TGL_PW_3_POWER_DOMAINS | \ 1250 - BIT_ULL(POWER_DOMAIN_MODESET) | \ 1251 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1252 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1253 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1254 - BIT_ULL(POWER_DOMAIN_INIT)) 1255 - 1256 - #define TGL_DDI_IO_TC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC1) 1257 - #define TGL_DDI_IO_TC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC2) 1258 - #define TGL_DDI_IO_TC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC3) 1259 - #define TGL_DDI_IO_TC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC4) 1260 - #define TGL_DDI_IO_TC5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC5) 1261 - #define TGL_DDI_IO_TC6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC6) 1262 - 1263 - #define TGL_AUX_A_IO_POWER_DOMAINS ( \ 1264 - BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \ 1265 - BIT_ULL(POWER_DOMAIN_AUX_A)) 1266 - #define TGL_AUX_B_IO_POWER_DOMAINS ( \ 1267 - BIT_ULL(POWER_DOMAIN_AUX_B)) 1268 - #define TGL_AUX_C_IO_POWER_DOMAINS ( \ 1269 - BIT_ULL(POWER_DOMAIN_AUX_C)) 1270 - 1271 - #define TGL_AUX_IO_USBC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC1) 1272 - #define TGL_AUX_IO_USBC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC2) 1273 - #define TGL_AUX_IO_USBC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC3) 1274 - #define TGL_AUX_IO_USBC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC4) 1275 - #define TGL_AUX_IO_USBC5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC5) 1276 - #define TGL_AUX_IO_USBC6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC6) 1277 - 1278 - #define TGL_AUX_IO_TBT1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT1) 1279 - #define TGL_AUX_IO_TBT2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT2) 1280 - #define TGL_AUX_IO_TBT3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT3) 1281 - #define TGL_AUX_IO_TBT4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT4) 1282 - #define TGL_AUX_IO_TBT5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT5) 1283 - #define TGL_AUX_IO_TBT6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT6) 1284 - 1285 - #define TGL_TC_COLD_OFF_POWER_DOMAINS ( \ 1286 - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 1287 - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1288 - BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \ 1289 - BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \ 1290 - BIT_ULL(POWER_DOMAIN_AUX_USBC5) | \ 1291 - BIT_ULL(POWER_DOMAIN_AUX_USBC6) | \ 1292 - BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \ 1293 - BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \ 1294 - BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \ 1295 - BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \ 1296 - BIT_ULL(POWER_DOMAIN_AUX_TBT5) | \ 1297 - BIT_ULL(POWER_DOMAIN_AUX_TBT6) | \ 1298 - BIT_ULL(POWER_DOMAIN_TC_COLD_OFF)) 1299 - 1300 - #define RKL_PW_4_POWER_DOMAINS ( \ 1301 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 1302 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 1303 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 1304 - BIT_ULL(POWER_DOMAIN_INIT)) 1305 - 1306 - #define RKL_PW_3_POWER_DOMAINS ( \ 1307 - RKL_PW_4_POWER_DOMAINS | \ 1308 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1309 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1310 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1311 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1312 - BIT_ULL(POWER_DOMAIN_VGA) | \ 1313 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1314 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \ 1315 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \ 1316 - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 1317 - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1318 - BIT_ULL(POWER_DOMAIN_INIT)) 1319 - 1320 - /* 1321 - * There is no PW_2/PG_2 on RKL. 1322 - * 1323 - * RKL PW_1/PG_1 domains (under HW/DMC control): 1324 - * - DBUF function (note: registers are in PW0) 1325 - * - PIPE_A and its planes and VDSC/joining, except VGA 1326 - * - transcoder A 1327 - * - DDI_A and DDI_B 1328 - * - FBC 1329 - * 1330 - * RKL PW_0/PG_0 domains (under HW/DMC control): 1331 - * - PCI 1332 - * - clocks except port PLL 1333 - * - shared functions: 1334 - * * interrupts except pipe interrupts 1335 - * * MBus except PIPE_MBUS_DBOX_CTL 1336 - * * DBUF registers 1337 - * - central power except FBC 1338 - * - top-level GTC (DDI-level GTC is in the well associated with the DDI) 1339 - */ 1340 - 1341 - #define RKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1342 - RKL_PW_3_POWER_DOMAINS | \ 1343 - BIT_ULL(POWER_DOMAIN_MODESET) | \ 1344 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1345 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1346 - BIT_ULL(POWER_DOMAIN_INIT)) 1347 - 1348 - /* 1349 - * DG1 onwards Audio MMIO/VERBS lies in PG0 power well. 1350 - */ 1351 - #define DG1_PW_3_POWER_DOMAINS ( \ 1352 - TGL_PW_4_POWER_DOMAINS | \ 1353 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1354 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1355 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1356 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \ 1357 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \ 1358 - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 1359 - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1360 - BIT_ULL(POWER_DOMAIN_VGA) | \ 1361 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1362 - BIT_ULL(POWER_DOMAIN_INIT)) 1363 - 1364 - #define DG1_PW_2_POWER_DOMAINS ( \ 1365 - DG1_PW_3_POWER_DOMAINS | \ 1366 - BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \ 1367 - BIT_ULL(POWER_DOMAIN_INIT)) 1368 - 1369 - #define DG1_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1370 - DG1_PW_3_POWER_DOMAINS | \ 1371 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1372 - BIT_ULL(POWER_DOMAIN_MODESET) | \ 1373 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1374 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1375 - BIT_ULL(POWER_DOMAIN_INIT)) 1376 - 1377 - /* 1378 - * XE_LPD Power Domains 1379 - * 1380 - * Previous platforms required that PG(n-1) be enabled before PG(n). That 1381 - * dependency chain turns into a dependency tree on XE_LPD: 1382 - * 1383 - * PG0 1384 - * | 1385 - * --PG1-- 1386 - * / \ 1387 - * PGA --PG2-- 1388 - * / | \ 1389 - * PGB PGC PGD 1390 - * 1391 - * Power wells must be enabled from top to bottom and disabled from bottom 1392 - * to top. This allows pipes to be power gated independently. 1393 - */ 1394 - 1395 - #define XELPD_PW_D_POWER_DOMAINS ( \ 1396 - BIT_ULL(POWER_DOMAIN_PIPE_D) | \ 1397 - BIT_ULL(POWER_DOMAIN_PIPE_D_PANEL_FITTER) | \ 1398 - BIT_ULL(POWER_DOMAIN_TRANSCODER_D) | \ 1399 - BIT_ULL(POWER_DOMAIN_INIT)) 1400 - 1401 - #define XELPD_PW_C_POWER_DOMAINS ( \ 1402 - BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 1403 - BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 1404 - BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 1405 - BIT_ULL(POWER_DOMAIN_INIT)) 1406 - 1407 - #define XELPD_PW_B_POWER_DOMAINS ( \ 1408 - BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1409 - BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1410 - BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1411 - BIT_ULL(POWER_DOMAIN_INIT)) 1412 - 1413 - #define XELPD_PW_A_POWER_DOMAINS ( \ 1414 - BIT_ULL(POWER_DOMAIN_PIPE_A) | \ 1415 - BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 1416 - BIT_ULL(POWER_DOMAIN_INIT)) 1417 - 1418 - #define XELPD_PW_2_POWER_DOMAINS ( \ 1419 - XELPD_PW_B_POWER_DOMAINS | \ 1420 - XELPD_PW_C_POWER_DOMAINS | \ 1421 - XELPD_PW_D_POWER_DOMAINS | \ 1422 - BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1423 - BIT_ULL(POWER_DOMAIN_VGA) | \ 1424 - BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 1425 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_D_XELPD) | \ 1426 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_E_XELPD) | \ 1427 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \ 1428 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \ 1429 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC3) | \ 1430 - BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC4) | \ 1431 - BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1432 - BIT_ULL(POWER_DOMAIN_AUX_D_XELPD) | \ 1433 - BIT_ULL(POWER_DOMAIN_AUX_E_XELPD) | \ 1434 - BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 1435 - BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1436 - BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \ 1437 - BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \ 1438 - BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \ 1439 - BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \ 1440 - BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \ 1441 - BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \ 1442 - BIT_ULL(POWER_DOMAIN_INIT)) 1443 - 1444 - /* 1445 - * XELPD PW_1/PG_1 domains (under HW/DMC control): 1446 - * - DBUF function (registers are in PW0) 1447 - * - Transcoder A 1448 - * - DDI_A and DDI_B 1449 - * 1450 - * XELPD PW_0/PW_1 domains (under HW/DMC control): 1451 - * - PCI 1452 - * - Clocks except port PLL 1453 - * - Shared functions: 1454 - * * interrupts except pipe interrupts 1455 - * * MBus except PIPE_MBUS_DBOX_CTL 1456 - * * DBUF registers 1457 - * - Central power except FBC 1458 - * - Top-level GTC (DDI-level GTC is in the well associated with the DDI) 1459 - */ 1460 - 1461 - #define XELPD_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1462 - XELPD_PW_2_POWER_DOMAINS | \ 1463 - BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1464 - BIT_ULL(POWER_DOMAIN_MODESET) | \ 1465 - BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1466 - BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1467 - BIT_ULL(POWER_DOMAIN_PORT_DSI) | \ 1468 - BIT_ULL(POWER_DOMAIN_INIT)) 1469 - 1470 - #define XELPD_AUX_IO_D_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_D_XELPD) 1471 - #define XELPD_AUX_IO_E_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_E_XELPD) 1472 - #define XELPD_AUX_IO_USBC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC1) 1473 - #define XELPD_AUX_IO_USBC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC2) 1474 - #define XELPD_AUX_IO_USBC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC3) 1475 - #define XELPD_AUX_IO_USBC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC4) 1476 - 1477 - #define XELPD_AUX_IO_TBT1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT1) 1478 - #define XELPD_AUX_IO_TBT2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT2) 1479 - #define XELPD_AUX_IO_TBT3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT3) 1480 - #define XELPD_AUX_IO_TBT4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT4) 1481 - 1482 - #define XELPD_DDI_IO_D_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_D_XELPD) 1483 - #define XELPD_DDI_IO_E_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_E_XELPD) 1484 - #define XELPD_DDI_IO_TC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC1) 1485 - #define XELPD_DDI_IO_TC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC2) 1486 - #define XELPD_DDI_IO_TC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC3) 1487 - #define XELPD_DDI_IO_TC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC4) 1488 - 1489 - static const struct i915_power_well_desc i9xx_always_on_power_well[] = { 1490 - { 1491 - .name = "always-on", 1492 - .always_on = true, 1493 - .domains = POWER_DOMAIN_MASK, 1494 - .ops = &i9xx_always_on_power_well_ops, 1495 - .id = DISP_PW_ID_NONE, 1496 - }, 1497 - }; 1498 - 1499 - static const struct i915_power_well_desc i830_power_wells[] = { 1500 - { 1501 - .name = "always-on", 1502 - .always_on = true, 1503 - .domains = POWER_DOMAIN_MASK, 1504 - .ops = &i9xx_always_on_power_well_ops, 1505 - .id = DISP_PW_ID_NONE, 1506 - }, 1507 - { 1508 - .name = "pipes", 1509 - .domains = I830_PIPES_POWER_DOMAINS, 1510 - .ops = &i830_pipes_power_well_ops, 1511 - .id = DISP_PW_ID_NONE, 1512 - }, 1513 - }; 1514 - 1515 - static const struct i915_power_well_desc hsw_power_wells[] = { 1516 - { 1517 - .name = "always-on", 1518 - .always_on = true, 1519 - .domains = POWER_DOMAIN_MASK, 1520 - .ops = &i9xx_always_on_power_well_ops, 1521 - .id = DISP_PW_ID_NONE, 1522 - }, 1523 - { 1524 - .name = "display", 1525 - .domains = HSW_DISPLAY_POWER_DOMAINS, 1526 - .ops = &hsw_power_well_ops, 1527 - .id = HSW_DISP_PW_GLOBAL, 1528 - { 1529 - .hsw.idx = HSW_PW_CTL_IDX_GLOBAL, 1530 - .hsw.has_vga = true, 1531 - }, 1532 - }, 1533 - }; 1534 - 1535 - static const struct i915_power_well_desc bdw_power_wells[] = { 1536 - { 1537 - .name = "always-on", 1538 - .always_on = true, 1539 - .domains = POWER_DOMAIN_MASK, 1540 - .ops = &i9xx_always_on_power_well_ops, 1541 - .id = DISP_PW_ID_NONE, 1542 - }, 1543 - { 1544 - .name = "display", 1545 - .domains = BDW_DISPLAY_POWER_DOMAINS, 1546 - .ops = &hsw_power_well_ops, 1547 - .id = HSW_DISP_PW_GLOBAL, 1548 - { 1549 - .hsw.idx = HSW_PW_CTL_IDX_GLOBAL, 1550 - .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C), 1551 - .hsw.has_vga = true, 1552 - }, 1553 - }, 1554 - }; 1555 - 1556 - static const struct i915_power_well_desc vlv_power_wells[] = { 1557 - { 1558 - .name = "always-on", 1559 - .always_on = true, 1560 - .domains = POWER_DOMAIN_MASK, 1561 - .ops = &i9xx_always_on_power_well_ops, 1562 - .id = DISP_PW_ID_NONE, 1563 - }, 1564 - { 1565 - .name = "display", 1566 - .domains = VLV_DISPLAY_POWER_DOMAINS, 1567 - .ops = &vlv_display_power_well_ops, 1568 - .id = VLV_DISP_PW_DISP2D, 1569 - { 1570 - .vlv.idx = PUNIT_PWGT_IDX_DISP2D, 1571 - }, 1572 - }, 1573 - { 1574 - .name = "dpio-tx-b-01", 1575 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 1576 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 1577 - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 1578 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 1579 - .ops = &vlv_dpio_power_well_ops, 1580 - .id = DISP_PW_ID_NONE, 1581 - { 1582 - .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_01, 1583 - }, 1584 - }, 1585 - { 1586 - .name = "dpio-tx-b-23", 1587 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 1588 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 1589 - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 1590 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 1591 - .ops = &vlv_dpio_power_well_ops, 1592 - .id = DISP_PW_ID_NONE, 1593 - { 1594 - .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_23, 1595 - }, 1596 - }, 1597 - { 1598 - .name = "dpio-tx-c-01", 1599 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 1600 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 1601 - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 1602 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 1603 - .ops = &vlv_dpio_power_well_ops, 1604 - .id = DISP_PW_ID_NONE, 1605 - { 1606 - .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_01, 1607 - }, 1608 - }, 1609 - { 1610 - .name = "dpio-tx-c-23", 1611 - .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 1612 - VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 1613 - VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 1614 - VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 1615 - .ops = &vlv_dpio_power_well_ops, 1616 - .id = DISP_PW_ID_NONE, 1617 - { 1618 - .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_23, 1619 - }, 1620 - }, 1621 - { 1622 - .name = "dpio-common", 1623 - .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS, 1624 - .ops = &vlv_dpio_cmn_power_well_ops, 1625 - .id = VLV_DISP_PW_DPIO_CMN_BC, 1626 - { 1627 - .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC, 1628 - }, 1629 - }, 1630 - }; 1631 - 1632 - static const struct i915_power_well_desc chv_power_wells[] = { 1633 - { 1634 - .name = "always-on", 1635 - .always_on = true, 1636 - .domains = POWER_DOMAIN_MASK, 1637 - .ops = &i9xx_always_on_power_well_ops, 1638 - .id = DISP_PW_ID_NONE, 1639 - }, 1640 - { 1641 - .name = "display", 1642 - /* 1643 - * Pipe A power well is the new disp2d well. Pipe B and C 1644 - * power wells don't actually exist. Pipe A power well is 1645 - * required for any pipe to work. 1646 - */ 1647 - .domains = CHV_DISPLAY_POWER_DOMAINS, 1648 - .ops = &chv_pipe_power_well_ops, 1649 - .id = DISP_PW_ID_NONE, 1650 - }, 1651 - { 1652 - .name = "dpio-common-bc", 1653 - .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS, 1654 - .ops = &chv_dpio_cmn_power_well_ops, 1655 - .id = VLV_DISP_PW_DPIO_CMN_BC, 1656 - { 1657 - .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC, 1658 - }, 1659 - }, 1660 - { 1661 - .name = "dpio-common-d", 1662 - .domains = CHV_DPIO_CMN_D_POWER_DOMAINS, 1663 - .ops = &chv_dpio_cmn_power_well_ops, 1664 - .id = CHV_DISP_PW_DPIO_CMN_D, 1665 - { 1666 - .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_D, 1667 - }, 1668 - }, 1669 - }; 1670 - 1671 - static const struct i915_power_well_desc skl_power_wells[] = { 1672 - { 1673 - .name = "always-on", 1674 - .always_on = true, 1675 - .domains = POWER_DOMAIN_MASK, 1676 - .ops = &i9xx_always_on_power_well_ops, 1677 - .id = DISP_PW_ID_NONE, 1678 - }, 1679 - { 1680 - .name = "power well 1", 1681 - /* Handled by the DMC firmware */ 1682 - .always_on = true, 1683 - .domains = 0, 1684 - .ops = &hsw_power_well_ops, 1685 - .id = SKL_DISP_PW_1, 1686 - { 1687 - .hsw.idx = SKL_PW_CTL_IDX_PW_1, 1688 - .hsw.has_fuses = true, 1689 - }, 1690 - }, 1691 - { 1692 - .name = "MISC IO power well", 1693 - /* Handled by the DMC firmware */ 1694 - .always_on = true, 1695 - .domains = 0, 1696 - .ops = &hsw_power_well_ops, 1697 - .id = SKL_DISP_PW_MISC_IO, 1698 - { 1699 - .hsw.idx = SKL_PW_CTL_IDX_MISC_IO, 1700 - }, 1701 - }, 1702 - { 1703 - .name = "DC off", 1704 - .domains = SKL_DISPLAY_DC_OFF_POWER_DOMAINS, 1705 - .ops = &gen9_dc_off_power_well_ops, 1706 - .id = SKL_DISP_DC_OFF, 1707 - }, 1708 - { 1709 - .name = "power well 2", 1710 - .domains = SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS, 1711 - .ops = &hsw_power_well_ops, 1712 - .id = SKL_DISP_PW_2, 1713 - { 1714 - .hsw.idx = SKL_PW_CTL_IDX_PW_2, 1715 - .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C), 1716 - .hsw.has_vga = true, 1717 - .hsw.has_fuses = true, 1718 - }, 1719 - }, 1720 - { 1721 - .name = "DDI A/E IO power well", 1722 - .domains = SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS, 1723 - .ops = &hsw_power_well_ops, 1724 - .id = DISP_PW_ID_NONE, 1725 - { 1726 - .hsw.idx = SKL_PW_CTL_IDX_DDI_A_E, 1727 - }, 1728 - }, 1729 - { 1730 - .name = "DDI B IO power well", 1731 - .domains = SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS, 1732 - .ops = &hsw_power_well_ops, 1733 - .id = DISP_PW_ID_NONE, 1734 - { 1735 - .hsw.idx = SKL_PW_CTL_IDX_DDI_B, 1736 - }, 1737 - }, 1738 - { 1739 - .name = "DDI C IO power well", 1740 - .domains = SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS, 1741 - .ops = &hsw_power_well_ops, 1742 - .id = DISP_PW_ID_NONE, 1743 - { 1744 - .hsw.idx = SKL_PW_CTL_IDX_DDI_C, 1745 - }, 1746 - }, 1747 - { 1748 - .name = "DDI D IO power well", 1749 - .domains = SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS, 1750 - .ops = &hsw_power_well_ops, 1751 - .id = DISP_PW_ID_NONE, 1752 - { 1753 - .hsw.idx = SKL_PW_CTL_IDX_DDI_D, 1754 - }, 1755 - }, 1756 - }; 1757 - 1758 - static const struct i915_power_well_desc bxt_power_wells[] = { 1759 - { 1760 - .name = "always-on", 1761 - .always_on = true, 1762 - .domains = POWER_DOMAIN_MASK, 1763 - .ops = &i9xx_always_on_power_well_ops, 1764 - .id = DISP_PW_ID_NONE, 1765 - }, 1766 - { 1767 - .name = "power well 1", 1768 - /* Handled by the DMC firmware */ 1769 - .always_on = true, 1770 - .domains = 0, 1771 - .ops = &hsw_power_well_ops, 1772 - .id = SKL_DISP_PW_1, 1773 - { 1774 - .hsw.idx = SKL_PW_CTL_IDX_PW_1, 1775 - .hsw.has_fuses = true, 1776 - }, 1777 - }, 1778 - { 1779 - .name = "DC off", 1780 - .domains = BXT_DISPLAY_DC_OFF_POWER_DOMAINS, 1781 - .ops = &gen9_dc_off_power_well_ops, 1782 - .id = SKL_DISP_DC_OFF, 1783 - }, 1784 - { 1785 - .name = "power well 2", 1786 - .domains = BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS, 1787 - .ops = &hsw_power_well_ops, 1788 - .id = SKL_DISP_PW_2, 1789 - { 1790 - .hsw.idx = SKL_PW_CTL_IDX_PW_2, 1791 - .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C), 1792 - .hsw.has_vga = true, 1793 - .hsw.has_fuses = true, 1794 - }, 1795 - }, 1796 - { 1797 - .name = "dpio-common-a", 1798 - .domains = BXT_DPIO_CMN_A_POWER_DOMAINS, 1799 - .ops = &bxt_dpio_cmn_power_well_ops, 1800 - .id = BXT_DISP_PW_DPIO_CMN_A, 1801 - { 1802 - .bxt.phy = DPIO_PHY1, 1803 - }, 1804 - }, 1805 - { 1806 - .name = "dpio-common-bc", 1807 - .domains = BXT_DPIO_CMN_BC_POWER_DOMAINS, 1808 - .ops = &bxt_dpio_cmn_power_well_ops, 1809 - .id = VLV_DISP_PW_DPIO_CMN_BC, 1810 - { 1811 - .bxt.phy = DPIO_PHY0, 1812 - }, 1813 - }, 1814 - }; 1815 - 1816 - static const struct i915_power_well_desc glk_power_wells[] = { 1817 - { 1818 - .name = "always-on", 1819 - .always_on = true, 1820 - .domains = POWER_DOMAIN_MASK, 1821 - .ops = &i9xx_always_on_power_well_ops, 1822 - .id = DISP_PW_ID_NONE, 1823 - }, 1824 - { 1825 - .name = "power well 1", 1826 - /* Handled by the DMC firmware */ 1827 - .always_on = true, 1828 - .domains = 0, 1829 - .ops = &hsw_power_well_ops, 1830 - .id = SKL_DISP_PW_1, 1831 - { 1832 - .hsw.idx = SKL_PW_CTL_IDX_PW_1, 1833 - .hsw.has_fuses = true, 1834 - }, 1835 - }, 1836 - { 1837 - .name = "DC off", 1838 - .domains = GLK_DISPLAY_DC_OFF_POWER_DOMAINS, 1839 - .ops = &gen9_dc_off_power_well_ops, 1840 - .id = SKL_DISP_DC_OFF, 1841 - }, 1842 - { 1843 - .name = "power well 2", 1844 - .domains = GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS, 1845 - .ops = &hsw_power_well_ops, 1846 - .id = SKL_DISP_PW_2, 1847 - { 1848 - .hsw.idx = SKL_PW_CTL_IDX_PW_2, 1849 - .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C), 1850 - .hsw.has_vga = true, 1851 - .hsw.has_fuses = true, 1852 - }, 1853 - }, 1854 - { 1855 - .name = "dpio-common-a", 1856 - .domains = GLK_DPIO_CMN_A_POWER_DOMAINS, 1857 - .ops = &bxt_dpio_cmn_power_well_ops, 1858 - .id = BXT_DISP_PW_DPIO_CMN_A, 1859 - { 1860 - .bxt.phy = DPIO_PHY1, 1861 - }, 1862 - }, 1863 - { 1864 - .name = "dpio-common-b", 1865 - .domains = GLK_DPIO_CMN_B_POWER_DOMAINS, 1866 - .ops = &bxt_dpio_cmn_power_well_ops, 1867 - .id = VLV_DISP_PW_DPIO_CMN_BC, 1868 - { 1869 - .bxt.phy = DPIO_PHY0, 1870 - }, 1871 - }, 1872 - { 1873 - .name = "dpio-common-c", 1874 - .domains = GLK_DPIO_CMN_C_POWER_DOMAINS, 1875 - .ops = &bxt_dpio_cmn_power_well_ops, 1876 - .id = GLK_DISP_PW_DPIO_CMN_C, 1877 - { 1878 - .bxt.phy = DPIO_PHY2, 1879 - }, 1880 - }, 1881 - { 1882 - .name = "AUX A", 1883 - .domains = GLK_DISPLAY_AUX_A_POWER_DOMAINS, 1884 - .ops = &hsw_power_well_ops, 1885 - .id = DISP_PW_ID_NONE, 1886 - { 1887 - .hsw.idx = GLK_PW_CTL_IDX_AUX_A, 1888 - }, 1889 - }, 1890 - { 1891 - .name = "AUX B", 1892 - .domains = GLK_DISPLAY_AUX_B_POWER_DOMAINS, 1893 - .ops = &hsw_power_well_ops, 1894 - .id = DISP_PW_ID_NONE, 1895 - { 1896 - .hsw.idx = GLK_PW_CTL_IDX_AUX_B, 1897 - }, 1898 - }, 1899 - { 1900 - .name = "AUX C", 1901 - .domains = GLK_DISPLAY_AUX_C_POWER_DOMAINS, 1902 - .ops = &hsw_power_well_ops, 1903 - .id = DISP_PW_ID_NONE, 1904 - { 1905 - .hsw.idx = GLK_PW_CTL_IDX_AUX_C, 1906 - }, 1907 - }, 1908 - { 1909 - .name = "DDI A IO power well", 1910 - .domains = GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS, 1911 - .ops = &hsw_power_well_ops, 1912 - .id = DISP_PW_ID_NONE, 1913 - { 1914 - .hsw.idx = GLK_PW_CTL_IDX_DDI_A, 1915 - }, 1916 - }, 1917 - { 1918 - .name = "DDI B IO power well", 1919 - .domains = GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS, 1920 - .ops = &hsw_power_well_ops, 1921 - .id = DISP_PW_ID_NONE, 1922 - { 1923 - .hsw.idx = SKL_PW_CTL_IDX_DDI_B, 1924 - }, 1925 - }, 1926 - { 1927 - .name = "DDI C IO power well", 1928 - .domains = GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS, 1929 - .ops = &hsw_power_well_ops, 1930 - .id = DISP_PW_ID_NONE, 1931 - { 1932 - .hsw.idx = SKL_PW_CTL_IDX_DDI_C, 1933 - }, 1934 - }, 1935 - }; 1936 - 1937 - static const struct i915_power_well_desc icl_power_wells[] = { 1938 - { 1939 - .name = "always-on", 1940 - .always_on = true, 1941 - .domains = POWER_DOMAIN_MASK, 1942 - .ops = &i9xx_always_on_power_well_ops, 1943 - .id = DISP_PW_ID_NONE, 1944 - }, 1945 - { 1946 - .name = "power well 1", 1947 - /* Handled by the DMC firmware */ 1948 - .always_on = true, 1949 - .domains = 0, 1950 - .ops = &hsw_power_well_ops, 1951 - .id = SKL_DISP_PW_1, 1952 - { 1953 - .hsw.idx = ICL_PW_CTL_IDX_PW_1, 1954 - .hsw.has_fuses = true, 1955 - }, 1956 - }, 1957 - { 1958 - .name = "DC off", 1959 - .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS, 1960 - .ops = &gen9_dc_off_power_well_ops, 1961 - .id = SKL_DISP_DC_OFF, 1962 - }, 1963 - { 1964 - .name = "power well 2", 1965 - .domains = ICL_PW_2_POWER_DOMAINS, 1966 - .ops = &hsw_power_well_ops, 1967 - .id = SKL_DISP_PW_2, 1968 - { 1969 - .hsw.idx = ICL_PW_CTL_IDX_PW_2, 1970 - .hsw.has_fuses = true, 1971 - }, 1972 - }, 1973 - { 1974 - .name = "power well 3", 1975 - .domains = ICL_PW_3_POWER_DOMAINS, 1976 - .ops = &hsw_power_well_ops, 1977 - .id = ICL_DISP_PW_3, 1978 - { 1979 - .hsw.idx = ICL_PW_CTL_IDX_PW_3, 1980 - .hsw.irq_pipe_mask = BIT(PIPE_B), 1981 - .hsw.has_vga = true, 1982 - .hsw.has_fuses = true, 1983 - }, 1984 - }, 1985 - { 1986 - .name = "DDI A IO", 1987 - .domains = ICL_DDI_IO_A_POWER_DOMAINS, 1988 - .ops = &icl_ddi_power_well_ops, 1989 - .id = DISP_PW_ID_NONE, 1990 - { 1991 - .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 1992 - }, 1993 - }, 1994 - { 1995 - .name = "DDI B IO", 1996 - .domains = ICL_DDI_IO_B_POWER_DOMAINS, 1997 - .ops = &icl_ddi_power_well_ops, 1998 - .id = DISP_PW_ID_NONE, 1999 - { 2000 - .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 2001 - }, 2002 - }, 2003 - { 2004 - .name = "DDI C IO", 2005 - .domains = ICL_DDI_IO_C_POWER_DOMAINS, 2006 - .ops = &icl_ddi_power_well_ops, 2007 - .id = DISP_PW_ID_NONE, 2008 - { 2009 - .hsw.idx = ICL_PW_CTL_IDX_DDI_C, 2010 - }, 2011 - }, 2012 - { 2013 - .name = "DDI D IO", 2014 - .domains = ICL_DDI_IO_D_POWER_DOMAINS, 2015 - .ops = &icl_ddi_power_well_ops, 2016 - .id = DISP_PW_ID_NONE, 2017 - { 2018 - .hsw.idx = ICL_PW_CTL_IDX_DDI_D, 2019 - }, 2020 - }, 2021 - { 2022 - .name = "DDI E IO", 2023 - .domains = ICL_DDI_IO_E_POWER_DOMAINS, 2024 - .ops = &icl_ddi_power_well_ops, 2025 - .id = DISP_PW_ID_NONE, 2026 - { 2027 - .hsw.idx = ICL_PW_CTL_IDX_DDI_E, 2028 - }, 2029 - }, 2030 - { 2031 - .name = "DDI F IO", 2032 - .domains = ICL_DDI_IO_F_POWER_DOMAINS, 2033 - .ops = &icl_ddi_power_well_ops, 2034 - .id = DISP_PW_ID_NONE, 2035 - { 2036 - .hsw.idx = ICL_PW_CTL_IDX_DDI_F, 2037 - }, 2038 - }, 2039 - { 2040 - .name = "AUX A", 2041 - .domains = ICL_AUX_A_IO_POWER_DOMAINS, 2042 - .ops = &icl_aux_power_well_ops, 2043 - .id = DISP_PW_ID_NONE, 2044 - { 2045 - .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 2046 - }, 2047 - }, 2048 - { 2049 - .name = "AUX B", 2050 - .domains = ICL_AUX_B_IO_POWER_DOMAINS, 2051 - .ops = &icl_aux_power_well_ops, 2052 - .id = DISP_PW_ID_NONE, 2053 - { 2054 - .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 2055 - }, 2056 - }, 2057 - { 2058 - .name = "AUX C TC1", 2059 - .domains = ICL_AUX_C_TC1_IO_POWER_DOMAINS, 2060 - .ops = &icl_aux_power_well_ops, 2061 - .id = DISP_PW_ID_NONE, 2062 - { 2063 - .hsw.idx = ICL_PW_CTL_IDX_AUX_C, 2064 - .hsw.is_tc_tbt = false, 2065 - }, 2066 - }, 2067 - { 2068 - .name = "AUX D TC2", 2069 - .domains = ICL_AUX_D_TC2_IO_POWER_DOMAINS, 2070 - .ops = &icl_aux_power_well_ops, 2071 - .id = DISP_PW_ID_NONE, 2072 - { 2073 - .hsw.idx = ICL_PW_CTL_IDX_AUX_D, 2074 - .hsw.is_tc_tbt = false, 2075 - }, 2076 - }, 2077 - { 2078 - .name = "AUX E TC3", 2079 - .domains = ICL_AUX_E_TC3_IO_POWER_DOMAINS, 2080 - .ops = &icl_aux_power_well_ops, 2081 - .id = DISP_PW_ID_NONE, 2082 - { 2083 - .hsw.idx = ICL_PW_CTL_IDX_AUX_E, 2084 - .hsw.is_tc_tbt = false, 2085 - }, 2086 - }, 2087 - { 2088 - .name = "AUX F TC4", 2089 - .domains = ICL_AUX_F_TC4_IO_POWER_DOMAINS, 2090 - .ops = &icl_aux_power_well_ops, 2091 - .id = DISP_PW_ID_NONE, 2092 - { 2093 - .hsw.idx = ICL_PW_CTL_IDX_AUX_F, 2094 - .hsw.is_tc_tbt = false, 2095 - }, 2096 - }, 2097 - { 2098 - .name = "AUX C TBT1", 2099 - .domains = ICL_AUX_C_TBT1_IO_POWER_DOMAINS, 2100 - .ops = &icl_aux_power_well_ops, 2101 - .id = DISP_PW_ID_NONE, 2102 - { 2103 - .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1, 2104 - .hsw.is_tc_tbt = true, 2105 - }, 2106 - }, 2107 - { 2108 - .name = "AUX D TBT2", 2109 - .domains = ICL_AUX_D_TBT2_IO_POWER_DOMAINS, 2110 - .ops = &icl_aux_power_well_ops, 2111 - .id = DISP_PW_ID_NONE, 2112 - { 2113 - .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2, 2114 - .hsw.is_tc_tbt = true, 2115 - }, 2116 - }, 2117 - { 2118 - .name = "AUX E TBT3", 2119 - .domains = ICL_AUX_E_TBT3_IO_POWER_DOMAINS, 2120 - .ops = &icl_aux_power_well_ops, 2121 - .id = DISP_PW_ID_NONE, 2122 - { 2123 - .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3, 2124 - .hsw.is_tc_tbt = true, 2125 - }, 2126 - }, 2127 - { 2128 - .name = "AUX F TBT4", 2129 - .domains = ICL_AUX_F_TBT4_IO_POWER_DOMAINS, 2130 - .ops = &icl_aux_power_well_ops, 2131 - .id = DISP_PW_ID_NONE, 2132 - { 2133 - .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4, 2134 - .hsw.is_tc_tbt = true, 2135 - }, 2136 - }, 2137 - { 2138 - .name = "power well 4", 2139 - .domains = ICL_PW_4_POWER_DOMAINS, 2140 - .ops = &hsw_power_well_ops, 2141 - .id = DISP_PW_ID_NONE, 2142 - { 2143 - .hsw.idx = ICL_PW_CTL_IDX_PW_4, 2144 - .hsw.has_fuses = true, 2145 - .hsw.irq_pipe_mask = BIT(PIPE_C), 2146 - }, 2147 - }, 2148 - }; 2149 - 2150 - static const struct i915_power_well_desc tgl_power_wells[] = { 2151 - { 2152 - .name = "always-on", 2153 - .always_on = true, 2154 - .domains = POWER_DOMAIN_MASK, 2155 - .ops = &i9xx_always_on_power_well_ops, 2156 - .id = DISP_PW_ID_NONE, 2157 - }, 2158 - { 2159 - .name = "power well 1", 2160 - /* Handled by the DMC firmware */ 2161 - .always_on = true, 2162 - .domains = 0, 2163 - .ops = &hsw_power_well_ops, 2164 - .id = SKL_DISP_PW_1, 2165 - { 2166 - .hsw.idx = ICL_PW_CTL_IDX_PW_1, 2167 - .hsw.has_fuses = true, 2168 - }, 2169 - }, 2170 - { 2171 - .name = "DC off", 2172 - .domains = TGL_DISPLAY_DC_OFF_POWER_DOMAINS, 2173 - .ops = &gen9_dc_off_power_well_ops, 2174 - .id = SKL_DISP_DC_OFF, 2175 - }, 2176 - { 2177 - .name = "power well 2", 2178 - .domains = TGL_PW_2_POWER_DOMAINS, 2179 - .ops = &hsw_power_well_ops, 2180 - .id = SKL_DISP_PW_2, 2181 - { 2182 - .hsw.idx = ICL_PW_CTL_IDX_PW_2, 2183 - .hsw.has_fuses = true, 2184 - }, 2185 - }, 2186 - { 2187 - .name = "power well 3", 2188 - .domains = TGL_PW_3_POWER_DOMAINS, 2189 - .ops = &hsw_power_well_ops, 2190 - .id = ICL_DISP_PW_3, 2191 - { 2192 - .hsw.idx = ICL_PW_CTL_IDX_PW_3, 2193 - .hsw.irq_pipe_mask = BIT(PIPE_B), 2194 - .hsw.has_vga = true, 2195 - .hsw.has_fuses = true, 2196 - }, 2197 - }, 2198 - { 2199 - .name = "DDI A IO", 2200 - .domains = ICL_DDI_IO_A_POWER_DOMAINS, 2201 - .ops = &icl_ddi_power_well_ops, 2202 - .id = DISP_PW_ID_NONE, 2203 - { 2204 - .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 2205 - } 2206 - }, 2207 - { 2208 - .name = "DDI B IO", 2209 - .domains = ICL_DDI_IO_B_POWER_DOMAINS, 2210 - .ops = &icl_ddi_power_well_ops, 2211 - .id = DISP_PW_ID_NONE, 2212 - { 2213 - .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 2214 - } 2215 - }, 2216 - { 2217 - .name = "DDI C IO", 2218 - .domains = ICL_DDI_IO_C_POWER_DOMAINS, 2219 - .ops = &icl_ddi_power_well_ops, 2220 - .id = DISP_PW_ID_NONE, 2221 - { 2222 - .hsw.idx = ICL_PW_CTL_IDX_DDI_C, 2223 - } 2224 - }, 2225 - { 2226 - .name = "DDI IO TC1", 2227 - .domains = TGL_DDI_IO_TC1_POWER_DOMAINS, 2228 - .ops = &icl_ddi_power_well_ops, 2229 - .id = DISP_PW_ID_NONE, 2230 - { 2231 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1, 2232 - }, 2233 - }, 2234 - { 2235 - .name = "DDI IO TC2", 2236 - .domains = TGL_DDI_IO_TC2_POWER_DOMAINS, 2237 - .ops = &icl_ddi_power_well_ops, 2238 - .id = DISP_PW_ID_NONE, 2239 - { 2240 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2, 2241 - }, 2242 - }, 2243 - { 2244 - .name = "DDI IO TC3", 2245 - .domains = TGL_DDI_IO_TC3_POWER_DOMAINS, 2246 - .ops = &icl_ddi_power_well_ops, 2247 - .id = DISP_PW_ID_NONE, 2248 - { 2249 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3, 2250 - }, 2251 - }, 2252 - { 2253 - .name = "DDI IO TC4", 2254 - .domains = TGL_DDI_IO_TC4_POWER_DOMAINS, 2255 - .ops = &icl_ddi_power_well_ops, 2256 - .id = DISP_PW_ID_NONE, 2257 - { 2258 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4, 2259 - }, 2260 - }, 2261 - { 2262 - .name = "DDI IO TC5", 2263 - .domains = TGL_DDI_IO_TC5_POWER_DOMAINS, 2264 - .ops = &icl_ddi_power_well_ops, 2265 - .id = DISP_PW_ID_NONE, 2266 - { 2267 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC5, 2268 - }, 2269 - }, 2270 - { 2271 - .name = "DDI IO TC6", 2272 - .domains = TGL_DDI_IO_TC6_POWER_DOMAINS, 2273 - .ops = &icl_ddi_power_well_ops, 2274 - .id = DISP_PW_ID_NONE, 2275 - { 2276 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC6, 2277 - }, 2278 - }, 2279 - { 2280 - .name = "TC cold off", 2281 - .domains = TGL_TC_COLD_OFF_POWER_DOMAINS, 2282 - .ops = &tgl_tc_cold_off_ops, 2283 - .id = TGL_DISP_PW_TC_COLD_OFF, 2284 - }, 2285 - { 2286 - .name = "AUX A", 2287 - .domains = TGL_AUX_A_IO_POWER_DOMAINS, 2288 - .ops = &icl_aux_power_well_ops, 2289 - .id = DISP_PW_ID_NONE, 2290 - { 2291 - .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 2292 - }, 2293 - }, 2294 - { 2295 - .name = "AUX B", 2296 - .domains = TGL_AUX_B_IO_POWER_DOMAINS, 2297 - .ops = &icl_aux_power_well_ops, 2298 - .id = DISP_PW_ID_NONE, 2299 - { 2300 - .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 2301 - }, 2302 - }, 2303 - { 2304 - .name = "AUX C", 2305 - .domains = TGL_AUX_C_IO_POWER_DOMAINS, 2306 - .ops = &icl_aux_power_well_ops, 2307 - .id = DISP_PW_ID_NONE, 2308 - { 2309 - .hsw.idx = ICL_PW_CTL_IDX_AUX_C, 2310 - }, 2311 - }, 2312 - { 2313 - .name = "AUX USBC1", 2314 - .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS, 2315 - .ops = &icl_aux_power_well_ops, 2316 - .id = DISP_PW_ID_NONE, 2317 - { 2318 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1, 2319 - .hsw.is_tc_tbt = false, 2320 - }, 2321 - }, 2322 - { 2323 - .name = "AUX USBC2", 2324 - .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS, 2325 - .ops = &icl_aux_power_well_ops, 2326 - .id = DISP_PW_ID_NONE, 2327 - { 2328 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2, 2329 - .hsw.is_tc_tbt = false, 2330 - }, 2331 - }, 2332 - { 2333 - .name = "AUX USBC3", 2334 - .domains = TGL_AUX_IO_USBC3_POWER_DOMAINS, 2335 - .ops = &icl_aux_power_well_ops, 2336 - .id = DISP_PW_ID_NONE, 2337 - { 2338 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3, 2339 - .hsw.is_tc_tbt = false, 2340 - }, 2341 - }, 2342 - { 2343 - .name = "AUX USBC4", 2344 - .domains = TGL_AUX_IO_USBC4_POWER_DOMAINS, 2345 - .ops = &icl_aux_power_well_ops, 2346 - .id = DISP_PW_ID_NONE, 2347 - { 2348 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4, 2349 - .hsw.is_tc_tbt = false, 2350 - }, 2351 - }, 2352 - { 2353 - .name = "AUX USBC5", 2354 - .domains = TGL_AUX_IO_USBC5_POWER_DOMAINS, 2355 - .ops = &icl_aux_power_well_ops, 2356 - .id = DISP_PW_ID_NONE, 2357 - { 2358 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC5, 2359 - .hsw.is_tc_tbt = false, 2360 - }, 2361 - }, 2362 - { 2363 - .name = "AUX USBC6", 2364 - .domains = TGL_AUX_IO_USBC6_POWER_DOMAINS, 2365 - .ops = &icl_aux_power_well_ops, 2366 - .id = DISP_PW_ID_NONE, 2367 - { 2368 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC6, 2369 - .hsw.is_tc_tbt = false, 2370 - }, 2371 - }, 2372 - { 2373 - .name = "AUX TBT1", 2374 - .domains = TGL_AUX_IO_TBT1_POWER_DOMAINS, 2375 - .ops = &icl_aux_power_well_ops, 2376 - .id = DISP_PW_ID_NONE, 2377 - { 2378 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1, 2379 - .hsw.is_tc_tbt = true, 2380 - }, 2381 - }, 2382 - { 2383 - .name = "AUX TBT2", 2384 - .domains = TGL_AUX_IO_TBT2_POWER_DOMAINS, 2385 - .ops = &icl_aux_power_well_ops, 2386 - .id = DISP_PW_ID_NONE, 2387 - { 2388 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2, 2389 - .hsw.is_tc_tbt = true, 2390 - }, 2391 - }, 2392 - { 2393 - .name = "AUX TBT3", 2394 - .domains = TGL_AUX_IO_TBT3_POWER_DOMAINS, 2395 - .ops = &icl_aux_power_well_ops, 2396 - .id = DISP_PW_ID_NONE, 2397 - { 2398 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3, 2399 - .hsw.is_tc_tbt = true, 2400 - }, 2401 - }, 2402 - { 2403 - .name = "AUX TBT4", 2404 - .domains = TGL_AUX_IO_TBT4_POWER_DOMAINS, 2405 - .ops = &icl_aux_power_well_ops, 2406 - .id = DISP_PW_ID_NONE, 2407 - { 2408 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4, 2409 - .hsw.is_tc_tbt = true, 2410 - }, 2411 - }, 2412 - { 2413 - .name = "AUX TBT5", 2414 - .domains = TGL_AUX_IO_TBT5_POWER_DOMAINS, 2415 - .ops = &icl_aux_power_well_ops, 2416 - .id = DISP_PW_ID_NONE, 2417 - { 2418 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT5, 2419 - .hsw.is_tc_tbt = true, 2420 - }, 2421 - }, 2422 - { 2423 - .name = "AUX TBT6", 2424 - .domains = TGL_AUX_IO_TBT6_POWER_DOMAINS, 2425 - .ops = &icl_aux_power_well_ops, 2426 - .id = DISP_PW_ID_NONE, 2427 - { 2428 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT6, 2429 - .hsw.is_tc_tbt = true, 2430 - }, 2431 - }, 2432 - { 2433 - .name = "power well 4", 2434 - .domains = TGL_PW_4_POWER_DOMAINS, 2435 - .ops = &hsw_power_well_ops, 2436 - .id = DISP_PW_ID_NONE, 2437 - { 2438 - .hsw.idx = ICL_PW_CTL_IDX_PW_4, 2439 - .hsw.has_fuses = true, 2440 - .hsw.irq_pipe_mask = BIT(PIPE_C), 2441 - } 2442 - }, 2443 - { 2444 - .name = "power well 5", 2445 - .domains = TGL_PW_5_POWER_DOMAINS, 2446 - .ops = &hsw_power_well_ops, 2447 - .id = DISP_PW_ID_NONE, 2448 - { 2449 - .hsw.idx = TGL_PW_CTL_IDX_PW_5, 2450 - .hsw.has_fuses = true, 2451 - .hsw.irq_pipe_mask = BIT(PIPE_D), 2452 - }, 2453 - }, 2454 - }; 2455 - 2456 - static const struct i915_power_well_desc rkl_power_wells[] = { 2457 - { 2458 - .name = "always-on", 2459 - .always_on = true, 2460 - .domains = POWER_DOMAIN_MASK, 2461 - .ops = &i9xx_always_on_power_well_ops, 2462 - .id = DISP_PW_ID_NONE, 2463 - }, 2464 - { 2465 - .name = "power well 1", 2466 - /* Handled by the DMC firmware */ 2467 - .always_on = true, 2468 - .domains = 0, 2469 - .ops = &hsw_power_well_ops, 2470 - .id = SKL_DISP_PW_1, 2471 - { 2472 - .hsw.idx = ICL_PW_CTL_IDX_PW_1, 2473 - .hsw.has_fuses = true, 2474 - }, 2475 - }, 2476 - { 2477 - .name = "DC off", 2478 - .domains = RKL_DISPLAY_DC_OFF_POWER_DOMAINS, 2479 - .ops = &gen9_dc_off_power_well_ops, 2480 - .id = SKL_DISP_DC_OFF, 2481 - }, 2482 - { 2483 - .name = "power well 3", 2484 - .domains = RKL_PW_3_POWER_DOMAINS, 2485 - .ops = &hsw_power_well_ops, 2486 - .id = ICL_DISP_PW_3, 2487 - { 2488 - .hsw.idx = ICL_PW_CTL_IDX_PW_3, 2489 - .hsw.irq_pipe_mask = BIT(PIPE_B), 2490 - .hsw.has_vga = true, 2491 - .hsw.has_fuses = true, 2492 - }, 2493 - }, 2494 - { 2495 - .name = "power well 4", 2496 - .domains = RKL_PW_4_POWER_DOMAINS, 2497 - .ops = &hsw_power_well_ops, 2498 - .id = DISP_PW_ID_NONE, 2499 - { 2500 - .hsw.idx = ICL_PW_CTL_IDX_PW_4, 2501 - .hsw.has_fuses = true, 2502 - .hsw.irq_pipe_mask = BIT(PIPE_C), 2503 - } 2504 - }, 2505 - { 2506 - .name = "DDI A IO", 2507 - .domains = ICL_DDI_IO_A_POWER_DOMAINS, 2508 - .ops = &icl_ddi_power_well_ops, 2509 - .id = DISP_PW_ID_NONE, 2510 - { 2511 - .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 2512 - } 2513 - }, 2514 - { 2515 - .name = "DDI B IO", 2516 - .domains = ICL_DDI_IO_B_POWER_DOMAINS, 2517 - .ops = &icl_ddi_power_well_ops, 2518 - .id = DISP_PW_ID_NONE, 2519 - { 2520 - .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 2521 - } 2522 - }, 2523 - { 2524 - .name = "DDI IO TC1", 2525 - .domains = TGL_DDI_IO_TC1_POWER_DOMAINS, 2526 - .ops = &icl_ddi_power_well_ops, 2527 - .id = DISP_PW_ID_NONE, 2528 - { 2529 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1, 2530 - }, 2531 - }, 2532 - { 2533 - .name = "DDI IO TC2", 2534 - .domains = TGL_DDI_IO_TC2_POWER_DOMAINS, 2535 - .ops = &icl_ddi_power_well_ops, 2536 - .id = DISP_PW_ID_NONE, 2537 - { 2538 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2, 2539 - }, 2540 - }, 2541 - { 2542 - .name = "AUX A", 2543 - .domains = ICL_AUX_A_IO_POWER_DOMAINS, 2544 - .ops = &icl_aux_power_well_ops, 2545 - .id = DISP_PW_ID_NONE, 2546 - { 2547 - .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 2548 - }, 2549 - }, 2550 - { 2551 - .name = "AUX B", 2552 - .domains = ICL_AUX_B_IO_POWER_DOMAINS, 2553 - .ops = &icl_aux_power_well_ops, 2554 - .id = DISP_PW_ID_NONE, 2555 - { 2556 - .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 2557 - }, 2558 - }, 2559 - { 2560 - .name = "AUX USBC1", 2561 - .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS, 2562 - .ops = &icl_aux_power_well_ops, 2563 - .id = DISP_PW_ID_NONE, 2564 - { 2565 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1, 2566 - }, 2567 - }, 2568 - { 2569 - .name = "AUX USBC2", 2570 - .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS, 2571 - .ops = &icl_aux_power_well_ops, 2572 - .id = DISP_PW_ID_NONE, 2573 - { 2574 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2, 2575 - }, 2576 - }, 2577 - }; 2578 - 2579 - static const struct i915_power_well_desc dg1_power_wells[] = { 2580 - { 2581 - .name = "always-on", 2582 - .always_on = true, 2583 - .domains = POWER_DOMAIN_MASK, 2584 - .ops = &i9xx_always_on_power_well_ops, 2585 - .id = DISP_PW_ID_NONE, 2586 - }, 2587 - { 2588 - .name = "power well 1", 2589 - /* Handled by the DMC firmware */ 2590 - .always_on = true, 2591 - .domains = 0, 2592 - .ops = &hsw_power_well_ops, 2593 - .id = SKL_DISP_PW_1, 2594 - { 2595 - .hsw.idx = ICL_PW_CTL_IDX_PW_1, 2596 - .hsw.has_fuses = true, 2597 - }, 2598 - }, 2599 - { 2600 - .name = "DC off", 2601 - .domains = DG1_DISPLAY_DC_OFF_POWER_DOMAINS, 2602 - .ops = &gen9_dc_off_power_well_ops, 2603 - .id = SKL_DISP_DC_OFF, 2604 - }, 2605 - { 2606 - .name = "power well 2", 2607 - .domains = DG1_PW_2_POWER_DOMAINS, 2608 - .ops = &hsw_power_well_ops, 2609 - .id = SKL_DISP_PW_2, 2610 - { 2611 - .hsw.idx = ICL_PW_CTL_IDX_PW_2, 2612 - .hsw.has_fuses = true, 2613 - }, 2614 - }, 2615 - { 2616 - .name = "power well 3", 2617 - .domains = DG1_PW_3_POWER_DOMAINS, 2618 - .ops = &hsw_power_well_ops, 2619 - .id = ICL_DISP_PW_3, 2620 - { 2621 - .hsw.idx = ICL_PW_CTL_IDX_PW_3, 2622 - .hsw.irq_pipe_mask = BIT(PIPE_B), 2623 - .hsw.has_vga = true, 2624 - .hsw.has_fuses = true, 2625 - }, 2626 - }, 2627 - { 2628 - .name = "DDI A IO", 2629 - .domains = ICL_DDI_IO_A_POWER_DOMAINS, 2630 - .ops = &icl_ddi_power_well_ops, 2631 - .id = DISP_PW_ID_NONE, 2632 - { 2633 - .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 2634 - } 2635 - }, 2636 - { 2637 - .name = "DDI B IO", 2638 - .domains = ICL_DDI_IO_B_POWER_DOMAINS, 2639 - .ops = &icl_ddi_power_well_ops, 2640 - .id = DISP_PW_ID_NONE, 2641 - { 2642 - .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 2643 - } 2644 - }, 2645 - { 2646 - .name = "DDI IO TC1", 2647 - .domains = TGL_DDI_IO_TC1_POWER_DOMAINS, 2648 - .ops = &icl_ddi_power_well_ops, 2649 - .id = DISP_PW_ID_NONE, 2650 - { 2651 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1, 2652 - }, 2653 - }, 2654 - { 2655 - .name = "DDI IO TC2", 2656 - .domains = TGL_DDI_IO_TC2_POWER_DOMAINS, 2657 - .ops = &icl_ddi_power_well_ops, 2658 - .id = DISP_PW_ID_NONE, 2659 - { 2660 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2, 2661 - }, 2662 - }, 2663 - { 2664 - .name = "AUX A", 2665 - .domains = TGL_AUX_A_IO_POWER_DOMAINS, 2666 - .ops = &icl_aux_power_well_ops, 2667 - .id = DISP_PW_ID_NONE, 2668 - { 2669 - .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 2670 - }, 2671 - }, 2672 - { 2673 - .name = "AUX B", 2674 - .domains = TGL_AUX_B_IO_POWER_DOMAINS, 2675 - .ops = &icl_aux_power_well_ops, 2676 - .id = DISP_PW_ID_NONE, 2677 - { 2678 - .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 2679 - }, 2680 - }, 2681 - { 2682 - .name = "AUX USBC1", 2683 - .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS, 2684 - .ops = &icl_aux_power_well_ops, 2685 - .id = DISP_PW_ID_NONE, 2686 - { 2687 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1, 2688 - .hsw.is_tc_tbt = false, 2689 - }, 2690 - }, 2691 - { 2692 - .name = "AUX USBC2", 2693 - .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS, 2694 - .ops = &icl_aux_power_well_ops, 2695 - .id = DISP_PW_ID_NONE, 2696 - { 2697 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2, 2698 - .hsw.is_tc_tbt = false, 2699 - }, 2700 - }, 2701 - { 2702 - .name = "power well 4", 2703 - .domains = TGL_PW_4_POWER_DOMAINS, 2704 - .ops = &hsw_power_well_ops, 2705 - .id = DISP_PW_ID_NONE, 2706 - { 2707 - .hsw.idx = ICL_PW_CTL_IDX_PW_4, 2708 - .hsw.has_fuses = true, 2709 - .hsw.irq_pipe_mask = BIT(PIPE_C), 2710 - } 2711 - }, 2712 - { 2713 - .name = "power well 5", 2714 - .domains = TGL_PW_5_POWER_DOMAINS, 2715 - .ops = &hsw_power_well_ops, 2716 - .id = DISP_PW_ID_NONE, 2717 - { 2718 - .hsw.idx = TGL_PW_CTL_IDX_PW_5, 2719 - .hsw.has_fuses = true, 2720 - .hsw.irq_pipe_mask = BIT(PIPE_D), 2721 - }, 2722 - }, 2723 - }; 2724 - 2725 - static const struct i915_power_well_desc xelpd_power_wells[] = { 2726 - { 2727 - .name = "always-on", 2728 - .always_on = true, 2729 - .domains = POWER_DOMAIN_MASK, 2730 - .ops = &i9xx_always_on_power_well_ops, 2731 - .id = DISP_PW_ID_NONE, 2732 - }, 2733 - { 2734 - .name = "power well 1", 2735 - /* Handled by the DMC firmware */ 2736 - .always_on = true, 2737 - .domains = 0, 2738 - .ops = &hsw_power_well_ops, 2739 - .id = SKL_DISP_PW_1, 2740 - { 2741 - .hsw.idx = ICL_PW_CTL_IDX_PW_1, 2742 - .hsw.has_fuses = true, 2743 - }, 2744 - }, 2745 - { 2746 - .name = "DC off", 2747 - .domains = XELPD_DISPLAY_DC_OFF_POWER_DOMAINS, 2748 - .ops = &gen9_dc_off_power_well_ops, 2749 - .id = SKL_DISP_DC_OFF, 2750 - }, 2751 - { 2752 - .name = "power well 2", 2753 - .domains = XELPD_PW_2_POWER_DOMAINS, 2754 - .ops = &hsw_power_well_ops, 2755 - .id = SKL_DISP_PW_2, 2756 - { 2757 - .hsw.idx = ICL_PW_CTL_IDX_PW_2, 2758 - .hsw.has_vga = true, 2759 - .hsw.has_fuses = true, 2760 - }, 2761 - }, 2762 - { 2763 - .name = "power well A", 2764 - .domains = XELPD_PW_A_POWER_DOMAINS, 2765 - .ops = &hsw_power_well_ops, 2766 - .id = DISP_PW_ID_NONE, 2767 - { 2768 - .hsw.idx = XELPD_PW_CTL_IDX_PW_A, 2769 - .hsw.irq_pipe_mask = BIT(PIPE_A), 2770 - .hsw.has_fuses = true, 2771 - }, 2772 - }, 2773 - { 2774 - .name = "power well B", 2775 - .domains = XELPD_PW_B_POWER_DOMAINS, 2776 - .ops = &hsw_power_well_ops, 2777 - .id = DISP_PW_ID_NONE, 2778 - { 2779 - .hsw.idx = XELPD_PW_CTL_IDX_PW_B, 2780 - .hsw.irq_pipe_mask = BIT(PIPE_B), 2781 - .hsw.has_fuses = true, 2782 - }, 2783 - }, 2784 - { 2785 - .name = "power well C", 2786 - .domains = XELPD_PW_C_POWER_DOMAINS, 2787 - .ops = &hsw_power_well_ops, 2788 - .id = DISP_PW_ID_NONE, 2789 - { 2790 - .hsw.idx = XELPD_PW_CTL_IDX_PW_C, 2791 - .hsw.irq_pipe_mask = BIT(PIPE_C), 2792 - .hsw.has_fuses = true, 2793 - }, 2794 - }, 2795 - { 2796 - .name = "power well D", 2797 - .domains = XELPD_PW_D_POWER_DOMAINS, 2798 - .ops = &hsw_power_well_ops, 2799 - .id = DISP_PW_ID_NONE, 2800 - { 2801 - .hsw.idx = XELPD_PW_CTL_IDX_PW_D, 2802 - .hsw.irq_pipe_mask = BIT(PIPE_D), 2803 - .hsw.has_fuses = true, 2804 - }, 2805 - }, 2806 - { 2807 - .name = "DDI A IO", 2808 - .domains = ICL_DDI_IO_A_POWER_DOMAINS, 2809 - .ops = &icl_ddi_power_well_ops, 2810 - .id = DISP_PW_ID_NONE, 2811 - { 2812 - .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 2813 - } 2814 - }, 2815 - { 2816 - .name = "DDI B IO", 2817 - .domains = ICL_DDI_IO_B_POWER_DOMAINS, 2818 - .ops = &icl_ddi_power_well_ops, 2819 - .id = DISP_PW_ID_NONE, 2820 - { 2821 - .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 2822 - } 2823 - }, 2824 - { 2825 - .name = "DDI C IO", 2826 - .domains = ICL_DDI_IO_C_POWER_DOMAINS, 2827 - .ops = &icl_ddi_power_well_ops, 2828 - .id = DISP_PW_ID_NONE, 2829 - { 2830 - .hsw.idx = ICL_PW_CTL_IDX_DDI_C, 2831 - } 2832 - }, 2833 - { 2834 - .name = "DDI IO D_XELPD", 2835 - .domains = XELPD_DDI_IO_D_XELPD_POWER_DOMAINS, 2836 - .ops = &icl_ddi_power_well_ops, 2837 - .id = DISP_PW_ID_NONE, 2838 - { 2839 - .hsw.idx = XELPD_PW_CTL_IDX_DDI_D, 2840 - } 2841 - }, 2842 - { 2843 - .name = "DDI IO E_XELPD", 2844 - .domains = XELPD_DDI_IO_E_XELPD_POWER_DOMAINS, 2845 - .ops = &icl_ddi_power_well_ops, 2846 - .id = DISP_PW_ID_NONE, 2847 - { 2848 - .hsw.idx = XELPD_PW_CTL_IDX_DDI_E, 2849 - } 2850 - }, 2851 - { 2852 - .name = "DDI IO TC1", 2853 - .domains = XELPD_DDI_IO_TC1_POWER_DOMAINS, 2854 - .ops = &icl_ddi_power_well_ops, 2855 - .id = DISP_PW_ID_NONE, 2856 - { 2857 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1, 2858 - } 2859 - }, 2860 - { 2861 - .name = "DDI IO TC2", 2862 - .domains = XELPD_DDI_IO_TC2_POWER_DOMAINS, 2863 - .ops = &icl_ddi_power_well_ops, 2864 - .id = DISP_PW_ID_NONE, 2865 - { 2866 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2, 2867 - } 2868 - }, 2869 - { 2870 - .name = "DDI IO TC3", 2871 - .domains = XELPD_DDI_IO_TC3_POWER_DOMAINS, 2872 - .ops = &icl_ddi_power_well_ops, 2873 - .id = DISP_PW_ID_NONE, 2874 - { 2875 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3, 2876 - } 2877 - }, 2878 - { 2879 - .name = "DDI IO TC4", 2880 - .domains = XELPD_DDI_IO_TC4_POWER_DOMAINS, 2881 - .ops = &icl_ddi_power_well_ops, 2882 - .id = DISP_PW_ID_NONE, 2883 - { 2884 - .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4, 2885 - } 2886 - }, 2887 - { 2888 - .name = "AUX A", 2889 - .domains = ICL_AUX_A_IO_POWER_DOMAINS, 2890 - .ops = &icl_aux_power_well_ops, 2891 - .id = DISP_PW_ID_NONE, 2892 - { 2893 - .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 2894 - .hsw.fixed_enable_delay = 600, 2895 - }, 2896 - }, 2897 - { 2898 - .name = "AUX B", 2899 - .domains = ICL_AUX_B_IO_POWER_DOMAINS, 2900 - .ops = &icl_aux_power_well_ops, 2901 - .id = DISP_PW_ID_NONE, 2902 - { 2903 - .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 2904 - .hsw.fixed_enable_delay = 600, 2905 - }, 2906 - }, 2907 - { 2908 - .name = "AUX C", 2909 - .domains = TGL_AUX_C_IO_POWER_DOMAINS, 2910 - .ops = &icl_aux_power_well_ops, 2911 - .id = DISP_PW_ID_NONE, 2912 - { 2913 - .hsw.idx = ICL_PW_CTL_IDX_AUX_C, 2914 - .hsw.fixed_enable_delay = 600, 2915 - }, 2916 - }, 2917 - { 2918 - .name = "AUX D_XELPD", 2919 - .domains = XELPD_AUX_IO_D_XELPD_POWER_DOMAINS, 2920 - .ops = &icl_aux_power_well_ops, 2921 - .id = DISP_PW_ID_NONE, 2922 - { 2923 - .hsw.idx = XELPD_PW_CTL_IDX_AUX_D, 2924 - .hsw.fixed_enable_delay = 600, 2925 - }, 2926 - }, 2927 - { 2928 - .name = "AUX E_XELPD", 2929 - .domains = XELPD_AUX_IO_E_XELPD_POWER_DOMAINS, 2930 - .ops = &icl_aux_power_well_ops, 2931 - .id = DISP_PW_ID_NONE, 2932 - { 2933 - .hsw.idx = XELPD_PW_CTL_IDX_AUX_E, 2934 - }, 2935 - }, 2936 - { 2937 - .name = "AUX USBC1", 2938 - .domains = XELPD_AUX_IO_USBC1_POWER_DOMAINS, 2939 - .ops = &icl_aux_power_well_ops, 2940 - .id = DISP_PW_ID_NONE, 2941 - { 2942 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1, 2943 - .hsw.fixed_enable_delay = 600, 2944 - }, 2945 - }, 2946 - { 2947 - .name = "AUX USBC2", 2948 - .domains = XELPD_AUX_IO_USBC2_POWER_DOMAINS, 2949 - .ops = &icl_aux_power_well_ops, 2950 - .id = DISP_PW_ID_NONE, 2951 - { 2952 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2, 2953 - }, 2954 - }, 2955 - { 2956 - .name = "AUX USBC3", 2957 - .domains = XELPD_AUX_IO_USBC3_POWER_DOMAINS, 2958 - .ops = &icl_aux_power_well_ops, 2959 - .id = DISP_PW_ID_NONE, 2960 - { 2961 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3, 2962 - }, 2963 - }, 2964 - { 2965 - .name = "AUX USBC4", 2966 - .domains = XELPD_AUX_IO_USBC4_POWER_DOMAINS, 2967 - .ops = &icl_aux_power_well_ops, 2968 - .id = DISP_PW_ID_NONE, 2969 - { 2970 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4, 2971 - }, 2972 - }, 2973 - { 2974 - .name = "AUX TBT1", 2975 - .domains = XELPD_AUX_IO_TBT1_POWER_DOMAINS, 2976 - .ops = &icl_aux_power_well_ops, 2977 - .id = DISP_PW_ID_NONE, 2978 - { 2979 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1, 2980 - .hsw.is_tc_tbt = true, 2981 - }, 2982 - }, 2983 - { 2984 - .name = "AUX TBT2", 2985 - .domains = XELPD_AUX_IO_TBT2_POWER_DOMAINS, 2986 - .ops = &icl_aux_power_well_ops, 2987 - .id = DISP_PW_ID_NONE, 2988 - { 2989 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2, 2990 - .hsw.is_tc_tbt = true, 2991 - }, 2992 - }, 2993 - { 2994 - .name = "AUX TBT3", 2995 - .domains = XELPD_AUX_IO_TBT3_POWER_DOMAINS, 2996 - .ops = &icl_aux_power_well_ops, 2997 - .id = DISP_PW_ID_NONE, 2998 - { 2999 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3, 3000 - .hsw.is_tc_tbt = true, 3001 - }, 3002 - }, 3003 - { 3004 - .name = "AUX TBT4", 3005 - .domains = XELPD_AUX_IO_TBT4_POWER_DOMAINS, 3006 - .ops = &icl_aux_power_well_ops, 3007 - .id = DISP_PW_ID_NONE, 3008 - { 3009 - .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4, 3010 - .hsw.is_tc_tbt = true, 3011 - }, 3012 - }, 3013 - }; 3014 - 3015 851 static int 3016 852 sanitize_disable_power_well_option(const struct drm_i915_private *dev_priv, 3017 853 int disable_power_well) ··· 927 3089 return mask; 928 3090 } 929 3091 930 - static int 931 - __set_power_wells(struct i915_power_domains *power_domains, 932 - const struct i915_power_well_desc *power_well_descs, 933 - int power_well_descs_sz, u64 skip_mask) 934 - { 935 - struct drm_i915_private *i915 = container_of(power_domains, 936 - struct drm_i915_private, 937 - power_domains); 938 - u64 power_well_ids = 0; 939 - int power_well_count = 0; 940 - int i, plt_idx = 0; 941 - 942 - for (i = 0; i < power_well_descs_sz; i++) 943 - if (!(BIT_ULL(power_well_descs[i].id) & skip_mask)) 944 - power_well_count++; 945 - 946 - power_domains->power_well_count = power_well_count; 947 - power_domains->power_wells = 948 - kcalloc(power_well_count, 949 - sizeof(*power_domains->power_wells), 950 - GFP_KERNEL); 951 - if (!power_domains->power_wells) 952 - return -ENOMEM; 953 - 954 - for (i = 0; i < power_well_descs_sz; i++) { 955 - enum i915_power_well_id id = power_well_descs[i].id; 956 - 957 - if (BIT_ULL(id) & skip_mask) 958 - continue; 959 - 960 - power_domains->power_wells[plt_idx++].desc = 961 - &power_well_descs[i]; 962 - 963 - if (id == DISP_PW_ID_NONE) 964 - continue; 965 - 966 - drm_WARN_ON(&i915->drm, id >= sizeof(power_well_ids) * 8); 967 - drm_WARN_ON(&i915->drm, power_well_ids & BIT_ULL(id)); 968 - power_well_ids |= BIT_ULL(id); 969 - } 970 - 971 - return 0; 972 - } 973 - 974 - #define set_power_wells_mask(power_domains, __power_well_descs, skip_mask) \ 975 - __set_power_wells(power_domains, __power_well_descs, \ 976 - ARRAY_SIZE(__power_well_descs), skip_mask) 977 - 978 - #define set_power_wells(power_domains, __power_well_descs) \ 979 - set_power_wells_mask(power_domains, __power_well_descs, 0) 980 - 981 3092 /** 982 3093 * intel_power_domains_init - initializes the power domain structures 983 3094 * @dev_priv: i915 device instance ··· 937 3150 int intel_power_domains_init(struct drm_i915_private *dev_priv) 938 3151 { 939 3152 struct i915_power_domains *power_domains = &dev_priv->power_domains; 940 - int err; 941 3153 942 3154 dev_priv->params.disable_power_well = 943 3155 sanitize_disable_power_well_option(dev_priv, ··· 954 3168 INIT_DELAYED_WORK(&power_domains->async_put_work, 955 3169 intel_display_power_put_async_work); 956 3170 957 - /* 958 - * The enabling order will be from lower to higher indexed wells, 959 - * the disabling order is reversed. 960 - */ 961 - if (!HAS_DISPLAY(dev_priv)) { 962 - power_domains->power_well_count = 0; 963 - err = 0; 964 - } else if (DISPLAY_VER(dev_priv) >= 13) { 965 - err = set_power_wells(power_domains, xelpd_power_wells); 966 - } else if (IS_DG1(dev_priv)) { 967 - err = set_power_wells(power_domains, dg1_power_wells); 968 - } else if (IS_ALDERLAKE_S(dev_priv)) { 969 - err = set_power_wells_mask(power_domains, tgl_power_wells, 970 - BIT_ULL(TGL_DISP_PW_TC_COLD_OFF)); 971 - } else if (IS_ROCKETLAKE(dev_priv)) { 972 - err = set_power_wells(power_domains, rkl_power_wells); 973 - } else if (DISPLAY_VER(dev_priv) == 12) { 974 - err = set_power_wells(power_domains, tgl_power_wells); 975 - } else if (DISPLAY_VER(dev_priv) == 11) { 976 - err = set_power_wells(power_domains, icl_power_wells); 977 - } else if (IS_GEMINILAKE(dev_priv)) { 978 - err = set_power_wells(power_domains, glk_power_wells); 979 - } else if (IS_BROXTON(dev_priv)) { 980 - err = set_power_wells(power_domains, bxt_power_wells); 981 - } else if (DISPLAY_VER(dev_priv) == 9) { 982 - err = set_power_wells(power_domains, skl_power_wells); 983 - } else if (IS_CHERRYVIEW(dev_priv)) { 984 - err = set_power_wells(power_domains, chv_power_wells); 985 - } else if (IS_BROADWELL(dev_priv)) { 986 - err = set_power_wells(power_domains, bdw_power_wells); 987 - } else if (IS_HASWELL(dev_priv)) { 988 - err = set_power_wells(power_domains, hsw_power_wells); 989 - } else if (IS_VALLEYVIEW(dev_priv)) { 990 - err = set_power_wells(power_domains, vlv_power_wells); 991 - } else if (IS_I830(dev_priv)) { 992 - err = set_power_wells(power_domains, i830_power_wells); 993 - } else { 994 - err = set_power_wells(power_domains, i9xx_always_on_power_well); 995 - } 996 - 997 - return err; 3171 + return intel_display_power_map_init(power_domains); 998 3172 } 999 3173 1000 3174 /** ··· 965 3219 */ 966 3220 void intel_power_domains_cleanup(struct drm_i915_private *dev_priv) 967 3221 { 968 - kfree(dev_priv->power_domains.power_wells); 3222 + intel_display_power_map_cleanup(&dev_priv->power_domains); 969 3223 } 970 3224 971 3225 static void intel_power_domains_sync_hw(struct drm_i915_private *dev_priv)
+2150
drivers/gpu/drm/i915/display/intel_display_power_map.c
··· 1 + // SPDX-License-Identifier: MIT 2 + /* 3 + * Copyright © 2022 Intel Corporation 4 + */ 5 + 6 + #include "i915_drv.h" 7 + #include "i915_reg.h" 8 + 9 + #include "vlv_sideband_reg.h" 10 + 11 + #include "intel_display_power_map.h" 12 + #include "intel_display_power_well.h" 13 + 14 + #define POWER_DOMAIN_MASK (GENMASK_ULL(POWER_DOMAIN_NUM - 1, 0)) 15 + 16 + static const struct i915_power_well_desc i9xx_always_on_power_well[] = { 17 + { 18 + .name = "always-on", 19 + .domains = POWER_DOMAIN_MASK, 20 + .ops = &i9xx_always_on_power_well_ops, 21 + .always_on = true, 22 + .id = DISP_PW_ID_NONE, 23 + }, 24 + }; 25 + 26 + #define I830_PIPES_POWER_DOMAINS ( \ 27 + BIT_ULL(POWER_DOMAIN_PIPE_A) | \ 28 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 29 + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 30 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 31 + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 32 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 33 + BIT_ULL(POWER_DOMAIN_INIT)) 34 + 35 + static const struct i915_power_well_desc i830_power_wells[] = { 36 + { 37 + .name = "always-on", 38 + .domains = POWER_DOMAIN_MASK, 39 + .ops = &i9xx_always_on_power_well_ops, 40 + .always_on = true, 41 + .id = DISP_PW_ID_NONE, 42 + }, { 43 + .name = "pipes", 44 + .domains = I830_PIPES_POWER_DOMAINS, 45 + .ops = &i830_pipes_power_well_ops, 46 + .id = DISP_PW_ID_NONE, 47 + }, 48 + }; 49 + 50 + #define HSW_DISPLAY_POWER_DOMAINS ( \ 51 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 52 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 53 + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 54 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 55 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 56 + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 57 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 58 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 59 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 60 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 61 + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 62 + BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \ 63 + BIT_ULL(POWER_DOMAIN_VGA) | \ 64 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 65 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 66 + BIT_ULL(POWER_DOMAIN_INIT)) 67 + 68 + static const struct i915_power_well_desc hsw_power_wells[] = { 69 + { 70 + .name = "always-on", 71 + .domains = POWER_DOMAIN_MASK, 72 + .ops = &i9xx_always_on_power_well_ops, 73 + .always_on = true, 74 + .id = DISP_PW_ID_NONE, 75 + }, { 76 + .name = "display", 77 + .domains = HSW_DISPLAY_POWER_DOMAINS, 78 + .ops = &hsw_power_well_ops, 79 + .id = HSW_DISP_PW_GLOBAL, 80 + { 81 + .hsw.idx = HSW_PW_CTL_IDX_GLOBAL, 82 + .hsw.has_vga = true, 83 + }, 84 + }, 85 + }; 86 + 87 + #define BDW_DISPLAY_POWER_DOMAINS ( \ 88 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 89 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 90 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 91 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 92 + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 93 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 94 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 95 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 96 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 97 + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 98 + BIT_ULL(POWER_DOMAIN_PORT_CRT) | /* DDI E */ \ 99 + BIT_ULL(POWER_DOMAIN_VGA) | \ 100 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 101 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 102 + BIT_ULL(POWER_DOMAIN_INIT)) 103 + 104 + static const struct i915_power_well_desc bdw_power_wells[] = { 105 + { 106 + .name = "always-on", 107 + .domains = POWER_DOMAIN_MASK, 108 + .ops = &i9xx_always_on_power_well_ops, 109 + .always_on = true, 110 + .id = DISP_PW_ID_NONE, 111 + }, { 112 + .name = "display", 113 + .domains = BDW_DISPLAY_POWER_DOMAINS, 114 + .ops = &hsw_power_well_ops, 115 + .id = HSW_DISP_PW_GLOBAL, 116 + { 117 + .hsw.idx = HSW_PW_CTL_IDX_GLOBAL, 118 + .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C), 119 + .hsw.has_vga = true, 120 + }, 121 + }, 122 + }; 123 + 124 + #define VLV_DISPLAY_POWER_DOMAINS ( \ 125 + BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \ 126 + BIT_ULL(POWER_DOMAIN_PIPE_A) | \ 127 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 128 + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 129 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 130 + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 131 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 132 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 133 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 134 + BIT_ULL(POWER_DOMAIN_PORT_DSI) | \ 135 + BIT_ULL(POWER_DOMAIN_PORT_CRT) | \ 136 + BIT_ULL(POWER_DOMAIN_VGA) | \ 137 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 138 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 139 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 140 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 141 + BIT_ULL(POWER_DOMAIN_GMBUS) | \ 142 + BIT_ULL(POWER_DOMAIN_INIT)) 143 + 144 + #define VLV_DPIO_CMN_BC_POWER_DOMAINS ( \ 145 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 146 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 147 + BIT_ULL(POWER_DOMAIN_PORT_CRT) | \ 148 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 149 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 150 + BIT_ULL(POWER_DOMAIN_INIT)) 151 + 152 + #define VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS ( \ 153 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 154 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 155 + BIT_ULL(POWER_DOMAIN_INIT)) 156 + 157 + #define VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS ( \ 158 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 159 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 160 + BIT_ULL(POWER_DOMAIN_INIT)) 161 + 162 + #define VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS ( \ 163 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 164 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 165 + BIT_ULL(POWER_DOMAIN_INIT)) 166 + 167 + #define VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS ( \ 168 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 169 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 170 + BIT_ULL(POWER_DOMAIN_INIT)) 171 + 172 + static const struct i915_power_well_desc vlv_power_wells[] = { 173 + { 174 + .name = "always-on", 175 + .domains = POWER_DOMAIN_MASK, 176 + .ops = &i9xx_always_on_power_well_ops, 177 + .always_on = true, 178 + .id = DISP_PW_ID_NONE, 179 + }, { 180 + .name = "display", 181 + .domains = VLV_DISPLAY_POWER_DOMAINS, 182 + .ops = &vlv_display_power_well_ops, 183 + .id = VLV_DISP_PW_DISP2D, 184 + { 185 + .vlv.idx = PUNIT_PWGT_IDX_DISP2D, 186 + }, 187 + }, { 188 + .name = "dpio-tx-b-01", 189 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 190 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 191 + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 192 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 193 + .ops = &vlv_dpio_power_well_ops, 194 + .id = DISP_PW_ID_NONE, 195 + { 196 + .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_01, 197 + }, 198 + }, { 199 + .name = "dpio-tx-b-23", 200 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 201 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 202 + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 203 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 204 + .ops = &vlv_dpio_power_well_ops, 205 + .id = DISP_PW_ID_NONE, 206 + { 207 + .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_B_LANES_23, 208 + }, 209 + }, { 210 + .name = "dpio-tx-c-01", 211 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 212 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 213 + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 214 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 215 + .ops = &vlv_dpio_power_well_ops, 216 + .id = DISP_PW_ID_NONE, 217 + { 218 + .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_01, 219 + }, 220 + }, { 221 + .name = "dpio-tx-c-23", 222 + .domains = VLV_DPIO_TX_B_LANES_01_POWER_DOMAINS | 223 + VLV_DPIO_TX_B_LANES_23_POWER_DOMAINS | 224 + VLV_DPIO_TX_C_LANES_01_POWER_DOMAINS | 225 + VLV_DPIO_TX_C_LANES_23_POWER_DOMAINS, 226 + .ops = &vlv_dpio_power_well_ops, 227 + .id = DISP_PW_ID_NONE, 228 + { 229 + .vlv.idx = PUNIT_PWGT_IDX_DPIO_TX_C_LANES_23, 230 + }, 231 + }, { 232 + .name = "dpio-common", 233 + .domains = VLV_DPIO_CMN_BC_POWER_DOMAINS, 234 + .ops = &vlv_dpio_cmn_power_well_ops, 235 + .id = VLV_DISP_PW_DPIO_CMN_BC, 236 + { 237 + .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC, 238 + }, 239 + }, 240 + }; 241 + 242 + #define CHV_DISPLAY_POWER_DOMAINS ( \ 243 + BIT_ULL(POWER_DOMAIN_DISPLAY_CORE) | \ 244 + BIT_ULL(POWER_DOMAIN_PIPE_A) | \ 245 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 246 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 247 + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 248 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 249 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 250 + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 251 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 252 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 253 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 254 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 255 + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 256 + BIT_ULL(POWER_DOMAIN_PORT_DSI) | \ 257 + BIT_ULL(POWER_DOMAIN_VGA) | \ 258 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 259 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 260 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 261 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 262 + BIT_ULL(POWER_DOMAIN_AUX_D) | \ 263 + BIT_ULL(POWER_DOMAIN_GMBUS) | \ 264 + BIT_ULL(POWER_DOMAIN_INIT)) 265 + 266 + #define CHV_DPIO_CMN_BC_POWER_DOMAINS ( \ 267 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 268 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 269 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 270 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 271 + BIT_ULL(POWER_DOMAIN_INIT)) 272 + 273 + #define CHV_DPIO_CMN_D_POWER_DOMAINS ( \ 274 + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 275 + BIT_ULL(POWER_DOMAIN_AUX_D) | \ 276 + BIT_ULL(POWER_DOMAIN_INIT)) 277 + 278 + static const struct i915_power_well_desc chv_power_wells[] = { 279 + { 280 + .name = "always-on", 281 + .domains = POWER_DOMAIN_MASK, 282 + .ops = &i9xx_always_on_power_well_ops, 283 + .always_on = true, 284 + .id = DISP_PW_ID_NONE, 285 + }, { 286 + .name = "display", 287 + /* 288 + * Pipe A power well is the new disp2d well. Pipe B and C 289 + * power wells don't actually exist. Pipe A power well is 290 + * required for any pipe to work. 291 + */ 292 + .domains = CHV_DISPLAY_POWER_DOMAINS, 293 + .ops = &chv_pipe_power_well_ops, 294 + .id = DISP_PW_ID_NONE, 295 + }, { 296 + .name = "dpio-common-bc", 297 + .domains = CHV_DPIO_CMN_BC_POWER_DOMAINS, 298 + .ops = &chv_dpio_cmn_power_well_ops, 299 + .id = VLV_DISP_PW_DPIO_CMN_BC, 300 + { 301 + .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_BC, 302 + }, 303 + }, { 304 + .name = "dpio-common-d", 305 + .domains = CHV_DPIO_CMN_D_POWER_DOMAINS, 306 + .ops = &chv_dpio_cmn_power_well_ops, 307 + .id = CHV_DISP_PW_DPIO_CMN_D, 308 + { 309 + .vlv.idx = PUNIT_PWGT_IDX_DPIO_CMN_D, 310 + }, 311 + }, 312 + }; 313 + 314 + #define SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \ 315 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 316 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 317 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 318 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 319 + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 320 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 321 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 322 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 323 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 324 + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 325 + BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \ 326 + BIT_ULL(POWER_DOMAIN_VGA) | \ 327 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 328 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 329 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 330 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 331 + BIT_ULL(POWER_DOMAIN_AUX_D) | \ 332 + BIT_ULL(POWER_DOMAIN_INIT)) 333 + 334 + #define SKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 335 + SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ 336 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 337 + BIT_ULL(POWER_DOMAIN_MODESET) | \ 338 + BIT_ULL(POWER_DOMAIN_GT_IRQ) | \ 339 + BIT_ULL(POWER_DOMAIN_INIT)) 340 + 341 + #define SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS ( \ 342 + BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO) | \ 343 + BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO) | \ 344 + BIT_ULL(POWER_DOMAIN_INIT)) 345 + 346 + #define SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS ( \ 347 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO) | \ 348 + BIT_ULL(POWER_DOMAIN_INIT)) 349 + 350 + #define SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS ( \ 351 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO) | \ 352 + BIT_ULL(POWER_DOMAIN_INIT)) 353 + 354 + #define SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS ( \ 355 + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO) | \ 356 + BIT_ULL(POWER_DOMAIN_INIT)) 357 + 358 + static const struct i915_power_well_desc skl_power_wells[] = { 359 + { 360 + .name = "always-on", 361 + .domains = POWER_DOMAIN_MASK, 362 + .ops = &i9xx_always_on_power_well_ops, 363 + .always_on = true, 364 + .id = DISP_PW_ID_NONE, 365 + }, { 366 + .name = "power well 1", 367 + /* Handled by the DMC firmware */ 368 + .domains = 0, 369 + .ops = &hsw_power_well_ops, 370 + .always_on = true, 371 + .id = SKL_DISP_PW_1, 372 + { 373 + .hsw.idx = SKL_PW_CTL_IDX_PW_1, 374 + .hsw.has_fuses = true, 375 + }, 376 + }, { 377 + .name = "MISC IO power well", 378 + /* Handled by the DMC firmware */ 379 + .domains = 0, 380 + .ops = &hsw_power_well_ops, 381 + .always_on = true, 382 + .id = SKL_DISP_PW_MISC_IO, 383 + { 384 + .hsw.idx = SKL_PW_CTL_IDX_MISC_IO, 385 + }, 386 + }, { 387 + .name = "DC off", 388 + .domains = SKL_DISPLAY_DC_OFF_POWER_DOMAINS, 389 + .ops = &gen9_dc_off_power_well_ops, 390 + .id = SKL_DISP_DC_OFF, 391 + }, { 392 + .name = "power well 2", 393 + .domains = SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS, 394 + .ops = &hsw_power_well_ops, 395 + .id = SKL_DISP_PW_2, 396 + { 397 + .hsw.idx = SKL_PW_CTL_IDX_PW_2, 398 + .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C), 399 + .hsw.has_vga = true, 400 + .hsw.has_fuses = true, 401 + }, 402 + }, { 403 + .name = "DDI A/E IO power well", 404 + .domains = SKL_DISPLAY_DDI_IO_A_E_POWER_DOMAINS, 405 + .ops = &hsw_power_well_ops, 406 + .id = DISP_PW_ID_NONE, 407 + { 408 + .hsw.idx = SKL_PW_CTL_IDX_DDI_A_E, 409 + }, 410 + }, { 411 + .name = "DDI B IO power well", 412 + .domains = SKL_DISPLAY_DDI_IO_B_POWER_DOMAINS, 413 + .ops = &hsw_power_well_ops, 414 + .id = DISP_PW_ID_NONE, 415 + { 416 + .hsw.idx = SKL_PW_CTL_IDX_DDI_B, 417 + }, 418 + }, { 419 + .name = "DDI C IO power well", 420 + .domains = SKL_DISPLAY_DDI_IO_C_POWER_DOMAINS, 421 + .ops = &hsw_power_well_ops, 422 + .id = DISP_PW_ID_NONE, 423 + { 424 + .hsw.idx = SKL_PW_CTL_IDX_DDI_C, 425 + }, 426 + }, { 427 + .name = "DDI D IO power well", 428 + .domains = SKL_DISPLAY_DDI_IO_D_POWER_DOMAINS, 429 + .ops = &hsw_power_well_ops, 430 + .id = DISP_PW_ID_NONE, 431 + { 432 + .hsw.idx = SKL_PW_CTL_IDX_DDI_D, 433 + }, 434 + }, 435 + }; 436 + 437 + #define BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \ 438 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 439 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 440 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 441 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 442 + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 443 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 444 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 445 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 446 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 447 + BIT_ULL(POWER_DOMAIN_VGA) | \ 448 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 449 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 450 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 451 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 452 + BIT_ULL(POWER_DOMAIN_INIT)) 453 + 454 + #define BXT_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 455 + BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ 456 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 457 + BIT_ULL(POWER_DOMAIN_GMBUS) | \ 458 + BIT_ULL(POWER_DOMAIN_MODESET) | \ 459 + BIT_ULL(POWER_DOMAIN_GT_IRQ) | \ 460 + BIT_ULL(POWER_DOMAIN_INIT)) 461 + 462 + #define BXT_DPIO_CMN_A_POWER_DOMAINS ( \ 463 + BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \ 464 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 465 + BIT_ULL(POWER_DOMAIN_INIT)) 466 + 467 + #define BXT_DPIO_CMN_BC_POWER_DOMAINS ( \ 468 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 469 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 470 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 471 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 472 + BIT_ULL(POWER_DOMAIN_INIT)) 473 + 474 + static const struct i915_power_well_desc bxt_power_wells[] = { 475 + { 476 + .name = "always-on", 477 + .domains = POWER_DOMAIN_MASK, 478 + .ops = &i9xx_always_on_power_well_ops, 479 + .always_on = true, 480 + .id = DISP_PW_ID_NONE, 481 + }, { 482 + .name = "power well 1", 483 + /* Handled by the DMC firmware */ 484 + .domains = 0, 485 + .ops = &hsw_power_well_ops, 486 + .always_on = true, 487 + .id = SKL_DISP_PW_1, 488 + { 489 + .hsw.idx = SKL_PW_CTL_IDX_PW_1, 490 + .hsw.has_fuses = true, 491 + }, 492 + }, { 493 + .name = "DC off", 494 + .domains = BXT_DISPLAY_DC_OFF_POWER_DOMAINS, 495 + .ops = &gen9_dc_off_power_well_ops, 496 + .id = SKL_DISP_DC_OFF, 497 + }, { 498 + .name = "power well 2", 499 + .domains = BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS, 500 + .ops = &hsw_power_well_ops, 501 + .id = SKL_DISP_PW_2, 502 + { 503 + .hsw.idx = SKL_PW_CTL_IDX_PW_2, 504 + .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C), 505 + .hsw.has_vga = true, 506 + .hsw.has_fuses = true, 507 + }, 508 + }, { 509 + .name = "dpio-common-a", 510 + .domains = BXT_DPIO_CMN_A_POWER_DOMAINS, 511 + .ops = &bxt_dpio_cmn_power_well_ops, 512 + .id = BXT_DISP_PW_DPIO_CMN_A, 513 + { 514 + .bxt.phy = DPIO_PHY1, 515 + }, 516 + }, { 517 + .name = "dpio-common-bc", 518 + .domains = BXT_DPIO_CMN_BC_POWER_DOMAINS, 519 + .ops = &bxt_dpio_cmn_power_well_ops, 520 + .id = VLV_DISP_PW_DPIO_CMN_BC, 521 + { 522 + .bxt.phy = DPIO_PHY0, 523 + }, 524 + }, 525 + }; 526 + 527 + #define GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS ( \ 528 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 529 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 530 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 531 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 532 + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 533 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 534 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 535 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 536 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 537 + BIT_ULL(POWER_DOMAIN_VGA) | \ 538 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 539 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 540 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 541 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 542 + BIT_ULL(POWER_DOMAIN_INIT)) 543 + 544 + #define GLK_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 545 + GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS | \ 546 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 547 + BIT_ULL(POWER_DOMAIN_GMBUS) | \ 548 + BIT_ULL(POWER_DOMAIN_MODESET) | \ 549 + BIT_ULL(POWER_DOMAIN_GT_IRQ) | \ 550 + BIT_ULL(POWER_DOMAIN_INIT)) 551 + 552 + #define GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO) 553 + #define GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO) 554 + #define GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO) 555 + 556 + #define GLK_DPIO_CMN_A_POWER_DOMAINS ( \ 557 + BIT_ULL(POWER_DOMAIN_PORT_DDI_A_LANES) | \ 558 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 559 + BIT_ULL(POWER_DOMAIN_INIT)) 560 + 561 + #define GLK_DPIO_CMN_B_POWER_DOMAINS ( \ 562 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 563 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 564 + BIT_ULL(POWER_DOMAIN_INIT)) 565 + 566 + #define GLK_DPIO_CMN_C_POWER_DOMAINS ( \ 567 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 568 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 569 + BIT_ULL(POWER_DOMAIN_INIT)) 570 + 571 + #define GLK_DISPLAY_AUX_A_POWER_DOMAINS ( \ 572 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 573 + BIT_ULL(POWER_DOMAIN_AUX_IO_A) | \ 574 + BIT_ULL(POWER_DOMAIN_INIT)) 575 + 576 + #define GLK_DISPLAY_AUX_B_POWER_DOMAINS ( \ 577 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 578 + BIT_ULL(POWER_DOMAIN_INIT)) 579 + 580 + #define GLK_DISPLAY_AUX_C_POWER_DOMAINS ( \ 581 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 582 + BIT_ULL(POWER_DOMAIN_INIT)) 583 + 584 + static const struct i915_power_well_desc glk_power_wells[] = { 585 + { 586 + .name = "always-on", 587 + .domains = POWER_DOMAIN_MASK, 588 + .ops = &i9xx_always_on_power_well_ops, 589 + .always_on = true, 590 + .id = DISP_PW_ID_NONE, 591 + }, { 592 + .name = "power well 1", 593 + /* Handled by the DMC firmware */ 594 + .domains = 0, 595 + .ops = &hsw_power_well_ops, 596 + .always_on = true, 597 + .id = SKL_DISP_PW_1, 598 + { 599 + .hsw.idx = SKL_PW_CTL_IDX_PW_1, 600 + .hsw.has_fuses = true, 601 + }, 602 + }, { 603 + .name = "DC off", 604 + .domains = GLK_DISPLAY_DC_OFF_POWER_DOMAINS, 605 + .ops = &gen9_dc_off_power_well_ops, 606 + .id = SKL_DISP_DC_OFF, 607 + }, { 608 + .name = "power well 2", 609 + .domains = GLK_DISPLAY_POWERWELL_2_POWER_DOMAINS, 610 + .ops = &hsw_power_well_ops, 611 + .id = SKL_DISP_PW_2, 612 + { 613 + .hsw.idx = SKL_PW_CTL_IDX_PW_2, 614 + .hsw.irq_pipe_mask = BIT(PIPE_B) | BIT(PIPE_C), 615 + .hsw.has_vga = true, 616 + .hsw.has_fuses = true, 617 + }, 618 + }, { 619 + .name = "dpio-common-a", 620 + .domains = GLK_DPIO_CMN_A_POWER_DOMAINS, 621 + .ops = &bxt_dpio_cmn_power_well_ops, 622 + .id = BXT_DISP_PW_DPIO_CMN_A, 623 + { 624 + .bxt.phy = DPIO_PHY1, 625 + }, 626 + }, { 627 + .name = "dpio-common-b", 628 + .domains = GLK_DPIO_CMN_B_POWER_DOMAINS, 629 + .ops = &bxt_dpio_cmn_power_well_ops, 630 + .id = VLV_DISP_PW_DPIO_CMN_BC, 631 + { 632 + .bxt.phy = DPIO_PHY0, 633 + }, 634 + }, { 635 + .name = "dpio-common-c", 636 + .domains = GLK_DPIO_CMN_C_POWER_DOMAINS, 637 + .ops = &bxt_dpio_cmn_power_well_ops, 638 + .id = GLK_DISP_PW_DPIO_CMN_C, 639 + { 640 + .bxt.phy = DPIO_PHY2, 641 + }, 642 + }, { 643 + .name = "AUX A", 644 + .domains = GLK_DISPLAY_AUX_A_POWER_DOMAINS, 645 + .ops = &hsw_power_well_ops, 646 + .id = DISP_PW_ID_NONE, 647 + { 648 + .hsw.idx = GLK_PW_CTL_IDX_AUX_A, 649 + }, 650 + }, { 651 + .name = "AUX B", 652 + .domains = GLK_DISPLAY_AUX_B_POWER_DOMAINS, 653 + .ops = &hsw_power_well_ops, 654 + .id = DISP_PW_ID_NONE, 655 + { 656 + .hsw.idx = GLK_PW_CTL_IDX_AUX_B, 657 + }, 658 + }, { 659 + .name = "AUX C", 660 + .domains = GLK_DISPLAY_AUX_C_POWER_DOMAINS, 661 + .ops = &hsw_power_well_ops, 662 + .id = DISP_PW_ID_NONE, 663 + { 664 + .hsw.idx = GLK_PW_CTL_IDX_AUX_C, 665 + }, 666 + }, { 667 + .name = "DDI A IO power well", 668 + .domains = GLK_DISPLAY_DDI_IO_A_POWER_DOMAINS, 669 + .ops = &hsw_power_well_ops, 670 + .id = DISP_PW_ID_NONE, 671 + { 672 + .hsw.idx = GLK_PW_CTL_IDX_DDI_A, 673 + }, 674 + }, { 675 + .name = "DDI B IO power well", 676 + .domains = GLK_DISPLAY_DDI_IO_B_POWER_DOMAINS, 677 + .ops = &hsw_power_well_ops, 678 + .id = DISP_PW_ID_NONE, 679 + { 680 + .hsw.idx = SKL_PW_CTL_IDX_DDI_B, 681 + }, 682 + }, { 683 + .name = "DDI C IO power well", 684 + .domains = GLK_DISPLAY_DDI_IO_C_POWER_DOMAINS, 685 + .ops = &hsw_power_well_ops, 686 + .id = DISP_PW_ID_NONE, 687 + { 688 + .hsw.idx = SKL_PW_CTL_IDX_DDI_C, 689 + }, 690 + }, 691 + }; 692 + 693 + /* 694 + * ICL PW_0/PG_0 domains (HW/DMC control): 695 + * - PCI 696 + * - clocks except port PLL 697 + * - central power except FBC 698 + * - shared functions except pipe interrupts, pipe MBUS, DBUF registers 699 + * ICL PW_1/PG_1 domains (HW/DMC control): 700 + * - DBUF function 701 + * - PIPE_A and its planes, except VGA 702 + * - transcoder EDP + PSR 703 + * - transcoder DSI 704 + * - DDI_A 705 + * - FBC 706 + */ 707 + #define ICL_PW_4_POWER_DOMAINS ( \ 708 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 709 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 710 + BIT_ULL(POWER_DOMAIN_INIT)) 711 + /* VDSC/joining */ 712 + 713 + #define ICL_PW_3_POWER_DOMAINS ( \ 714 + ICL_PW_4_POWER_DOMAINS | \ 715 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 716 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 717 + BIT_ULL(POWER_DOMAIN_TRANSCODER_A) | \ 718 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 719 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 720 + BIT_ULL(POWER_DOMAIN_PORT_DDI_B_LANES) | \ 721 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 722 + BIT_ULL(POWER_DOMAIN_PORT_DDI_D_LANES) | \ 723 + BIT_ULL(POWER_DOMAIN_PORT_DDI_E_LANES) | \ 724 + BIT_ULL(POWER_DOMAIN_PORT_DDI_F_LANES) | \ 725 + BIT_ULL(POWER_DOMAIN_VGA) | \ 726 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 727 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 728 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 729 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 730 + BIT_ULL(POWER_DOMAIN_AUX_D) | \ 731 + BIT_ULL(POWER_DOMAIN_AUX_E) | \ 732 + BIT_ULL(POWER_DOMAIN_AUX_F) | \ 733 + BIT_ULL(POWER_DOMAIN_AUX_C_TBT) | \ 734 + BIT_ULL(POWER_DOMAIN_AUX_D_TBT) | \ 735 + BIT_ULL(POWER_DOMAIN_AUX_E_TBT) | \ 736 + BIT_ULL(POWER_DOMAIN_AUX_F_TBT) | \ 737 + BIT_ULL(POWER_DOMAIN_INIT)) 738 + /* 739 + * - transcoder WD 740 + * - KVMR (HW control) 741 + */ 742 + 743 + #define ICL_PW_2_POWER_DOMAINS ( \ 744 + ICL_PW_3_POWER_DOMAINS | \ 745 + BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \ 746 + BIT_ULL(POWER_DOMAIN_INIT)) 747 + /* 748 + * - KVMR (HW control) 749 + */ 750 + 751 + #define ICL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 752 + ICL_PW_2_POWER_DOMAINS | \ 753 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 754 + BIT_ULL(POWER_DOMAIN_MODESET) | \ 755 + BIT_ULL(POWER_DOMAIN_DC_OFF) | \ 756 + BIT_ULL(POWER_DOMAIN_INIT)) 757 + 758 + #define ICL_DDI_IO_A_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_A_IO) 759 + #define ICL_DDI_IO_B_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_B_IO) 760 + #define ICL_DDI_IO_C_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_C_IO) 761 + #define ICL_DDI_IO_D_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_D_IO) 762 + #define ICL_DDI_IO_E_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_E_IO) 763 + #define ICL_DDI_IO_F_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_F_IO) 764 + 765 + #define ICL_AUX_A_IO_POWER_DOMAINS ( \ 766 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 767 + BIT_ULL(POWER_DOMAIN_AUX_IO_A)) 768 + 769 + #define ICL_AUX_B_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_B) 770 + #define ICL_AUX_C_TC1_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_C) 771 + #define ICL_AUX_D_TC2_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_D) 772 + #define ICL_AUX_E_TC3_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_E) 773 + #define ICL_AUX_F_TC4_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_F) 774 + #define ICL_AUX_C_TBT1_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_C_TBT) 775 + #define ICL_AUX_D_TBT2_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_D_TBT) 776 + #define ICL_AUX_E_TBT3_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_E_TBT) 777 + #define ICL_AUX_F_TBT4_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_F_TBT) 778 + 779 + static const struct i915_power_well_desc icl_power_wells[] = { 780 + { 781 + .name = "always-on", 782 + .domains = POWER_DOMAIN_MASK, 783 + .ops = &i9xx_always_on_power_well_ops, 784 + .always_on = true, 785 + .id = DISP_PW_ID_NONE, 786 + }, { 787 + .name = "power well 1", 788 + /* Handled by the DMC firmware */ 789 + .domains = 0, 790 + .ops = &hsw_power_well_ops, 791 + .always_on = true, 792 + .id = SKL_DISP_PW_1, 793 + { 794 + .hsw.idx = ICL_PW_CTL_IDX_PW_1, 795 + .hsw.has_fuses = true, 796 + }, 797 + }, { 798 + .name = "DC off", 799 + .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS, 800 + .ops = &gen9_dc_off_power_well_ops, 801 + .id = SKL_DISP_DC_OFF, 802 + }, { 803 + .name = "power well 2", 804 + .domains = ICL_PW_2_POWER_DOMAINS, 805 + .ops = &hsw_power_well_ops, 806 + .id = SKL_DISP_PW_2, 807 + { 808 + .hsw.idx = ICL_PW_CTL_IDX_PW_2, 809 + .hsw.has_fuses = true, 810 + }, 811 + }, { 812 + .name = "power well 3", 813 + .domains = ICL_PW_3_POWER_DOMAINS, 814 + .ops = &hsw_power_well_ops, 815 + .id = ICL_DISP_PW_3, 816 + { 817 + .hsw.idx = ICL_PW_CTL_IDX_PW_3, 818 + .hsw.irq_pipe_mask = BIT(PIPE_B), 819 + .hsw.has_vga = true, 820 + .hsw.has_fuses = true, 821 + }, 822 + }, { 823 + .name = "DDI A IO", 824 + .domains = ICL_DDI_IO_A_POWER_DOMAINS, 825 + .ops = &icl_ddi_power_well_ops, 826 + .id = DISP_PW_ID_NONE, 827 + { 828 + .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 829 + }, 830 + }, { 831 + .name = "DDI B IO", 832 + .domains = ICL_DDI_IO_B_POWER_DOMAINS, 833 + .ops = &icl_ddi_power_well_ops, 834 + .id = DISP_PW_ID_NONE, 835 + { 836 + .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 837 + }, 838 + }, { 839 + .name = "DDI C IO", 840 + .domains = ICL_DDI_IO_C_POWER_DOMAINS, 841 + .ops = &icl_ddi_power_well_ops, 842 + .id = DISP_PW_ID_NONE, 843 + { 844 + .hsw.idx = ICL_PW_CTL_IDX_DDI_C, 845 + }, 846 + }, { 847 + .name = "DDI D IO", 848 + .domains = ICL_DDI_IO_D_POWER_DOMAINS, 849 + .ops = &icl_ddi_power_well_ops, 850 + .id = DISP_PW_ID_NONE, 851 + { 852 + .hsw.idx = ICL_PW_CTL_IDX_DDI_D, 853 + }, 854 + }, { 855 + .name = "DDI E IO", 856 + .domains = ICL_DDI_IO_E_POWER_DOMAINS, 857 + .ops = &icl_ddi_power_well_ops, 858 + .id = DISP_PW_ID_NONE, 859 + { 860 + .hsw.idx = ICL_PW_CTL_IDX_DDI_E, 861 + }, 862 + }, { 863 + .name = "DDI F IO", 864 + .domains = ICL_DDI_IO_F_POWER_DOMAINS, 865 + .ops = &icl_ddi_power_well_ops, 866 + .id = DISP_PW_ID_NONE, 867 + { 868 + .hsw.idx = ICL_PW_CTL_IDX_DDI_F, 869 + }, 870 + }, { 871 + .name = "AUX A", 872 + .domains = ICL_AUX_A_IO_POWER_DOMAINS, 873 + .ops = &icl_aux_power_well_ops, 874 + .id = DISP_PW_ID_NONE, 875 + { 876 + .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 877 + }, 878 + }, { 879 + .name = "AUX B", 880 + .domains = ICL_AUX_B_IO_POWER_DOMAINS, 881 + .ops = &icl_aux_power_well_ops, 882 + .id = DISP_PW_ID_NONE, 883 + { 884 + .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 885 + }, 886 + }, { 887 + .name = "AUX C TC1", 888 + .domains = ICL_AUX_C_TC1_IO_POWER_DOMAINS, 889 + .ops = &icl_aux_power_well_ops, 890 + .id = DISP_PW_ID_NONE, 891 + { 892 + .hsw.idx = ICL_PW_CTL_IDX_AUX_C, 893 + .hsw.is_tc_tbt = false, 894 + }, 895 + }, { 896 + .name = "AUX D TC2", 897 + .domains = ICL_AUX_D_TC2_IO_POWER_DOMAINS, 898 + .ops = &icl_aux_power_well_ops, 899 + .id = DISP_PW_ID_NONE, 900 + { 901 + .hsw.idx = ICL_PW_CTL_IDX_AUX_D, 902 + .hsw.is_tc_tbt = false, 903 + }, 904 + }, { 905 + .name = "AUX E TC3", 906 + .domains = ICL_AUX_E_TC3_IO_POWER_DOMAINS, 907 + .ops = &icl_aux_power_well_ops, 908 + .id = DISP_PW_ID_NONE, 909 + { 910 + .hsw.idx = ICL_PW_CTL_IDX_AUX_E, 911 + .hsw.is_tc_tbt = false, 912 + }, 913 + }, { 914 + .name = "AUX F TC4", 915 + .domains = ICL_AUX_F_TC4_IO_POWER_DOMAINS, 916 + .ops = &icl_aux_power_well_ops, 917 + .id = DISP_PW_ID_NONE, 918 + { 919 + .hsw.idx = ICL_PW_CTL_IDX_AUX_F, 920 + .hsw.is_tc_tbt = false, 921 + }, 922 + }, { 923 + .name = "AUX C TBT1", 924 + .domains = ICL_AUX_C_TBT1_IO_POWER_DOMAINS, 925 + .ops = &icl_aux_power_well_ops, 926 + .id = DISP_PW_ID_NONE, 927 + { 928 + .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1, 929 + .hsw.is_tc_tbt = true, 930 + }, 931 + }, { 932 + .name = "AUX D TBT2", 933 + .domains = ICL_AUX_D_TBT2_IO_POWER_DOMAINS, 934 + .ops = &icl_aux_power_well_ops, 935 + .id = DISP_PW_ID_NONE, 936 + { 937 + .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2, 938 + .hsw.is_tc_tbt = true, 939 + }, 940 + }, { 941 + .name = "AUX E TBT3", 942 + .domains = ICL_AUX_E_TBT3_IO_POWER_DOMAINS, 943 + .ops = &icl_aux_power_well_ops, 944 + .id = DISP_PW_ID_NONE, 945 + { 946 + .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3, 947 + .hsw.is_tc_tbt = true, 948 + }, 949 + }, { 950 + .name = "AUX F TBT4", 951 + .domains = ICL_AUX_F_TBT4_IO_POWER_DOMAINS, 952 + .ops = &icl_aux_power_well_ops, 953 + .id = DISP_PW_ID_NONE, 954 + { 955 + .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4, 956 + .hsw.is_tc_tbt = true, 957 + }, 958 + }, { 959 + .name = "power well 4", 960 + .domains = ICL_PW_4_POWER_DOMAINS, 961 + .ops = &hsw_power_well_ops, 962 + .id = DISP_PW_ID_NONE, 963 + { 964 + .hsw.idx = ICL_PW_CTL_IDX_PW_4, 965 + .hsw.has_fuses = true, 966 + .hsw.irq_pipe_mask = BIT(PIPE_C), 967 + }, 968 + }, 969 + }; 970 + 971 + #define TGL_PW_5_POWER_DOMAINS ( \ 972 + BIT_ULL(POWER_DOMAIN_PIPE_D) | \ 973 + BIT_ULL(POWER_DOMAIN_PIPE_D_PANEL_FITTER) | \ 974 + BIT_ULL(POWER_DOMAIN_TRANSCODER_D) | \ 975 + BIT_ULL(POWER_DOMAIN_INIT)) 976 + 977 + #define TGL_PW_4_POWER_DOMAINS ( \ 978 + TGL_PW_5_POWER_DOMAINS | \ 979 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 980 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 981 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 982 + BIT_ULL(POWER_DOMAIN_INIT)) 983 + 984 + #define TGL_PW_3_POWER_DOMAINS ( \ 985 + TGL_PW_4_POWER_DOMAINS | \ 986 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 987 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 988 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 989 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \ 990 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \ 991 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC3) | \ 992 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC4) | \ 993 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC5) | \ 994 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC6) | \ 995 + BIT_ULL(POWER_DOMAIN_VGA) | \ 996 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 997 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 998 + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 999 + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1000 + BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \ 1001 + BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \ 1002 + BIT_ULL(POWER_DOMAIN_AUX_USBC5) | \ 1003 + BIT_ULL(POWER_DOMAIN_AUX_USBC6) | \ 1004 + BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \ 1005 + BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \ 1006 + BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \ 1007 + BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \ 1008 + BIT_ULL(POWER_DOMAIN_AUX_TBT5) | \ 1009 + BIT_ULL(POWER_DOMAIN_AUX_TBT6) | \ 1010 + BIT_ULL(POWER_DOMAIN_INIT)) 1011 + 1012 + #define TGL_PW_2_POWER_DOMAINS ( \ 1013 + TGL_PW_3_POWER_DOMAINS | \ 1014 + BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \ 1015 + BIT_ULL(POWER_DOMAIN_INIT)) 1016 + 1017 + #define TGL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1018 + TGL_PW_3_POWER_DOMAINS | \ 1019 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1020 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1021 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1022 + BIT_ULL(POWER_DOMAIN_MODESET) | \ 1023 + BIT_ULL(POWER_DOMAIN_INIT)) 1024 + 1025 + #define TGL_DDI_IO_TC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC1) 1026 + #define TGL_DDI_IO_TC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC2) 1027 + #define TGL_DDI_IO_TC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC3) 1028 + #define TGL_DDI_IO_TC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC4) 1029 + #define TGL_DDI_IO_TC5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC5) 1030 + #define TGL_DDI_IO_TC6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC6) 1031 + 1032 + #define TGL_AUX_A_IO_POWER_DOMAINS ( \ 1033 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1034 + BIT_ULL(POWER_DOMAIN_AUX_IO_A)) 1035 + #define TGL_AUX_B_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_B) 1036 + #define TGL_AUX_C_IO_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_C) 1037 + 1038 + #define TGL_AUX_IO_USBC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC1) 1039 + #define TGL_AUX_IO_USBC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC2) 1040 + #define TGL_AUX_IO_USBC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC3) 1041 + #define TGL_AUX_IO_USBC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC4) 1042 + #define TGL_AUX_IO_USBC5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC5) 1043 + #define TGL_AUX_IO_USBC6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC6) 1044 + 1045 + #define TGL_AUX_IO_TBT1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT1) 1046 + #define TGL_AUX_IO_TBT2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT2) 1047 + #define TGL_AUX_IO_TBT3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT3) 1048 + #define TGL_AUX_IO_TBT4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT4) 1049 + #define TGL_AUX_IO_TBT5_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT5) 1050 + #define TGL_AUX_IO_TBT6_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT6) 1051 + 1052 + #define TGL_TC_COLD_OFF_POWER_DOMAINS ( \ 1053 + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 1054 + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1055 + BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \ 1056 + BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \ 1057 + BIT_ULL(POWER_DOMAIN_AUX_USBC5) | \ 1058 + BIT_ULL(POWER_DOMAIN_AUX_USBC6) | \ 1059 + BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \ 1060 + BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \ 1061 + BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \ 1062 + BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \ 1063 + BIT_ULL(POWER_DOMAIN_AUX_TBT5) | \ 1064 + BIT_ULL(POWER_DOMAIN_AUX_TBT6) | \ 1065 + BIT_ULL(POWER_DOMAIN_TC_COLD_OFF)) 1066 + 1067 + static const struct i915_power_well_desc tgl_power_wells[] = { 1068 + { 1069 + .name = "always-on", 1070 + .domains = POWER_DOMAIN_MASK, 1071 + .ops = &i9xx_always_on_power_well_ops, 1072 + .always_on = true, 1073 + .id = DISP_PW_ID_NONE, 1074 + }, { 1075 + .name = "power well 1", 1076 + /* Handled by the DMC firmware */ 1077 + .domains = 0, 1078 + .ops = &hsw_power_well_ops, 1079 + .always_on = true, 1080 + .id = SKL_DISP_PW_1, 1081 + { 1082 + .hsw.idx = ICL_PW_CTL_IDX_PW_1, 1083 + .hsw.has_fuses = true, 1084 + }, 1085 + }, { 1086 + .name = "DC off", 1087 + .domains = TGL_DISPLAY_DC_OFF_POWER_DOMAINS, 1088 + .ops = &gen9_dc_off_power_well_ops, 1089 + .id = SKL_DISP_DC_OFF, 1090 + }, { 1091 + .name = "power well 2", 1092 + .domains = TGL_PW_2_POWER_DOMAINS, 1093 + .ops = &hsw_power_well_ops, 1094 + .id = SKL_DISP_PW_2, 1095 + { 1096 + .hsw.idx = ICL_PW_CTL_IDX_PW_2, 1097 + .hsw.has_fuses = true, 1098 + }, 1099 + }, { 1100 + .name = "power well 3", 1101 + .domains = TGL_PW_3_POWER_DOMAINS, 1102 + .ops = &hsw_power_well_ops, 1103 + .id = ICL_DISP_PW_3, 1104 + { 1105 + .hsw.idx = ICL_PW_CTL_IDX_PW_3, 1106 + .hsw.irq_pipe_mask = BIT(PIPE_B), 1107 + .hsw.has_vga = true, 1108 + .hsw.has_fuses = true, 1109 + }, 1110 + }, { 1111 + .name = "DDI A IO", 1112 + .domains = ICL_DDI_IO_A_POWER_DOMAINS, 1113 + .ops = &icl_ddi_power_well_ops, 1114 + .id = DISP_PW_ID_NONE, 1115 + { 1116 + .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 1117 + } 1118 + }, { 1119 + .name = "DDI B IO", 1120 + .domains = ICL_DDI_IO_B_POWER_DOMAINS, 1121 + .ops = &icl_ddi_power_well_ops, 1122 + .id = DISP_PW_ID_NONE, 1123 + { 1124 + .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 1125 + } 1126 + }, { 1127 + .name = "DDI C IO", 1128 + .domains = ICL_DDI_IO_C_POWER_DOMAINS, 1129 + .ops = &icl_ddi_power_well_ops, 1130 + .id = DISP_PW_ID_NONE, 1131 + { 1132 + .hsw.idx = ICL_PW_CTL_IDX_DDI_C, 1133 + } 1134 + }, { 1135 + .name = "DDI IO TC1", 1136 + .domains = TGL_DDI_IO_TC1_POWER_DOMAINS, 1137 + .ops = &icl_ddi_power_well_ops, 1138 + .id = DISP_PW_ID_NONE, 1139 + { 1140 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1, 1141 + }, 1142 + }, { 1143 + .name = "DDI IO TC2", 1144 + .domains = TGL_DDI_IO_TC2_POWER_DOMAINS, 1145 + .ops = &icl_ddi_power_well_ops, 1146 + .id = DISP_PW_ID_NONE, 1147 + { 1148 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2, 1149 + }, 1150 + }, { 1151 + .name = "DDI IO TC3", 1152 + .domains = TGL_DDI_IO_TC3_POWER_DOMAINS, 1153 + .ops = &icl_ddi_power_well_ops, 1154 + .id = DISP_PW_ID_NONE, 1155 + { 1156 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3, 1157 + }, 1158 + }, { 1159 + .name = "DDI IO TC4", 1160 + .domains = TGL_DDI_IO_TC4_POWER_DOMAINS, 1161 + .ops = &icl_ddi_power_well_ops, 1162 + .id = DISP_PW_ID_NONE, 1163 + { 1164 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4, 1165 + }, 1166 + }, { 1167 + .name = "DDI IO TC5", 1168 + .domains = TGL_DDI_IO_TC5_POWER_DOMAINS, 1169 + .ops = &icl_ddi_power_well_ops, 1170 + .id = DISP_PW_ID_NONE, 1171 + { 1172 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC5, 1173 + }, 1174 + }, { 1175 + .name = "DDI IO TC6", 1176 + .domains = TGL_DDI_IO_TC6_POWER_DOMAINS, 1177 + .ops = &icl_ddi_power_well_ops, 1178 + .id = DISP_PW_ID_NONE, 1179 + { 1180 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC6, 1181 + }, 1182 + }, { 1183 + .name = "TC cold off", 1184 + .domains = TGL_TC_COLD_OFF_POWER_DOMAINS, 1185 + .ops = &tgl_tc_cold_off_ops, 1186 + .id = TGL_DISP_PW_TC_COLD_OFF, 1187 + }, { 1188 + .name = "AUX A", 1189 + .domains = TGL_AUX_A_IO_POWER_DOMAINS, 1190 + .ops = &icl_aux_power_well_ops, 1191 + .id = DISP_PW_ID_NONE, 1192 + { 1193 + .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 1194 + }, 1195 + }, { 1196 + .name = "AUX B", 1197 + .domains = TGL_AUX_B_IO_POWER_DOMAINS, 1198 + .ops = &icl_aux_power_well_ops, 1199 + .id = DISP_PW_ID_NONE, 1200 + { 1201 + .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 1202 + }, 1203 + }, { 1204 + .name = "AUX C", 1205 + .domains = TGL_AUX_C_IO_POWER_DOMAINS, 1206 + .ops = &icl_aux_power_well_ops, 1207 + .id = DISP_PW_ID_NONE, 1208 + { 1209 + .hsw.idx = ICL_PW_CTL_IDX_AUX_C, 1210 + }, 1211 + }, { 1212 + .name = "AUX USBC1", 1213 + .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS, 1214 + .ops = &icl_aux_power_well_ops, 1215 + .id = DISP_PW_ID_NONE, 1216 + { 1217 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1, 1218 + .hsw.is_tc_tbt = false, 1219 + }, 1220 + }, { 1221 + .name = "AUX USBC2", 1222 + .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS, 1223 + .ops = &icl_aux_power_well_ops, 1224 + .id = DISP_PW_ID_NONE, 1225 + { 1226 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2, 1227 + .hsw.is_tc_tbt = false, 1228 + }, 1229 + }, { 1230 + .name = "AUX USBC3", 1231 + .domains = TGL_AUX_IO_USBC3_POWER_DOMAINS, 1232 + .ops = &icl_aux_power_well_ops, 1233 + .id = DISP_PW_ID_NONE, 1234 + { 1235 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3, 1236 + .hsw.is_tc_tbt = false, 1237 + }, 1238 + }, { 1239 + .name = "AUX USBC4", 1240 + .domains = TGL_AUX_IO_USBC4_POWER_DOMAINS, 1241 + .ops = &icl_aux_power_well_ops, 1242 + .id = DISP_PW_ID_NONE, 1243 + { 1244 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4, 1245 + .hsw.is_tc_tbt = false, 1246 + }, 1247 + }, { 1248 + .name = "AUX USBC5", 1249 + .domains = TGL_AUX_IO_USBC5_POWER_DOMAINS, 1250 + .ops = &icl_aux_power_well_ops, 1251 + .id = DISP_PW_ID_NONE, 1252 + { 1253 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC5, 1254 + .hsw.is_tc_tbt = false, 1255 + }, 1256 + }, { 1257 + .name = "AUX USBC6", 1258 + .domains = TGL_AUX_IO_USBC6_POWER_DOMAINS, 1259 + .ops = &icl_aux_power_well_ops, 1260 + .id = DISP_PW_ID_NONE, 1261 + { 1262 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC6, 1263 + .hsw.is_tc_tbt = false, 1264 + }, 1265 + }, { 1266 + .name = "AUX TBT1", 1267 + .domains = TGL_AUX_IO_TBT1_POWER_DOMAINS, 1268 + .ops = &icl_aux_power_well_ops, 1269 + .id = DISP_PW_ID_NONE, 1270 + { 1271 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1, 1272 + .hsw.is_tc_tbt = true, 1273 + }, 1274 + }, { 1275 + .name = "AUX TBT2", 1276 + .domains = TGL_AUX_IO_TBT2_POWER_DOMAINS, 1277 + .ops = &icl_aux_power_well_ops, 1278 + .id = DISP_PW_ID_NONE, 1279 + { 1280 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2, 1281 + .hsw.is_tc_tbt = true, 1282 + }, 1283 + }, { 1284 + .name = "AUX TBT3", 1285 + .domains = TGL_AUX_IO_TBT3_POWER_DOMAINS, 1286 + .ops = &icl_aux_power_well_ops, 1287 + .id = DISP_PW_ID_NONE, 1288 + { 1289 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3, 1290 + .hsw.is_tc_tbt = true, 1291 + }, 1292 + }, { 1293 + .name = "AUX TBT4", 1294 + .domains = TGL_AUX_IO_TBT4_POWER_DOMAINS, 1295 + .ops = &icl_aux_power_well_ops, 1296 + .id = DISP_PW_ID_NONE, 1297 + { 1298 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4, 1299 + .hsw.is_tc_tbt = true, 1300 + }, 1301 + }, { 1302 + .name = "AUX TBT5", 1303 + .domains = TGL_AUX_IO_TBT5_POWER_DOMAINS, 1304 + .ops = &icl_aux_power_well_ops, 1305 + .id = DISP_PW_ID_NONE, 1306 + { 1307 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT5, 1308 + .hsw.is_tc_tbt = true, 1309 + }, 1310 + }, { 1311 + .name = "AUX TBT6", 1312 + .domains = TGL_AUX_IO_TBT6_POWER_DOMAINS, 1313 + .ops = &icl_aux_power_well_ops, 1314 + .id = DISP_PW_ID_NONE, 1315 + { 1316 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT6, 1317 + .hsw.is_tc_tbt = true, 1318 + }, 1319 + }, { 1320 + .name = "power well 4", 1321 + .domains = TGL_PW_4_POWER_DOMAINS, 1322 + .ops = &hsw_power_well_ops, 1323 + .id = DISP_PW_ID_NONE, 1324 + { 1325 + .hsw.idx = ICL_PW_CTL_IDX_PW_4, 1326 + .hsw.has_fuses = true, 1327 + .hsw.irq_pipe_mask = BIT(PIPE_C), 1328 + } 1329 + }, { 1330 + .name = "power well 5", 1331 + .domains = TGL_PW_5_POWER_DOMAINS, 1332 + .ops = &hsw_power_well_ops, 1333 + .id = DISP_PW_ID_NONE, 1334 + { 1335 + .hsw.idx = TGL_PW_CTL_IDX_PW_5, 1336 + .hsw.has_fuses = true, 1337 + .hsw.irq_pipe_mask = BIT(PIPE_D), 1338 + }, 1339 + }, 1340 + }; 1341 + 1342 + #define RKL_PW_4_POWER_DOMAINS ( \ 1343 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 1344 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 1345 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 1346 + BIT_ULL(POWER_DOMAIN_INIT)) 1347 + 1348 + #define RKL_PW_3_POWER_DOMAINS ( \ 1349 + RKL_PW_4_POWER_DOMAINS | \ 1350 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1351 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1352 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1353 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \ 1354 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \ 1355 + BIT_ULL(POWER_DOMAIN_VGA) | \ 1356 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1357 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1358 + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 1359 + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1360 + BIT_ULL(POWER_DOMAIN_INIT)) 1361 + 1362 + /* 1363 + * There is no PW_2/PG_2 on RKL. 1364 + * 1365 + * RKL PW_1/PG_1 domains (under HW/DMC control): 1366 + * - DBUF function (note: registers are in PW0) 1367 + * - PIPE_A and its planes and VDSC/joining, except VGA 1368 + * - transcoder A 1369 + * - DDI_A and DDI_B 1370 + * - FBC 1371 + * 1372 + * RKL PW_0/PG_0 domains (under HW/DMC control): 1373 + * - PCI 1374 + * - clocks except port PLL 1375 + * - shared functions: 1376 + * * interrupts except pipe interrupts 1377 + * * MBus except PIPE_MBUS_DBOX_CTL 1378 + * * DBUF registers 1379 + * - central power except FBC 1380 + * - top-level GTC (DDI-level GTC is in the well associated with the DDI) 1381 + */ 1382 + 1383 + #define RKL_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1384 + RKL_PW_3_POWER_DOMAINS | \ 1385 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1386 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1387 + BIT_ULL(POWER_DOMAIN_MODESET) | \ 1388 + BIT_ULL(POWER_DOMAIN_INIT)) 1389 + 1390 + static const struct i915_power_well_desc rkl_power_wells[] = { 1391 + { 1392 + .name = "always-on", 1393 + .domains = POWER_DOMAIN_MASK, 1394 + .ops = &i9xx_always_on_power_well_ops, 1395 + .always_on = true, 1396 + .id = DISP_PW_ID_NONE, 1397 + }, { 1398 + .name = "power well 1", 1399 + /* Handled by the DMC firmware */ 1400 + .domains = 0, 1401 + .ops = &hsw_power_well_ops, 1402 + .always_on = true, 1403 + .id = SKL_DISP_PW_1, 1404 + { 1405 + .hsw.idx = ICL_PW_CTL_IDX_PW_1, 1406 + .hsw.has_fuses = true, 1407 + }, 1408 + }, { 1409 + .name = "DC off", 1410 + .domains = RKL_DISPLAY_DC_OFF_POWER_DOMAINS, 1411 + .ops = &gen9_dc_off_power_well_ops, 1412 + .id = SKL_DISP_DC_OFF, 1413 + }, { 1414 + .name = "power well 3", 1415 + .domains = RKL_PW_3_POWER_DOMAINS, 1416 + .ops = &hsw_power_well_ops, 1417 + .id = ICL_DISP_PW_3, 1418 + { 1419 + .hsw.idx = ICL_PW_CTL_IDX_PW_3, 1420 + .hsw.irq_pipe_mask = BIT(PIPE_B), 1421 + .hsw.has_vga = true, 1422 + .hsw.has_fuses = true, 1423 + }, 1424 + }, { 1425 + .name = "power well 4", 1426 + .domains = RKL_PW_4_POWER_DOMAINS, 1427 + .ops = &hsw_power_well_ops, 1428 + .id = DISP_PW_ID_NONE, 1429 + { 1430 + .hsw.idx = ICL_PW_CTL_IDX_PW_4, 1431 + .hsw.has_fuses = true, 1432 + .hsw.irq_pipe_mask = BIT(PIPE_C), 1433 + } 1434 + }, { 1435 + .name = "DDI A IO", 1436 + .domains = ICL_DDI_IO_A_POWER_DOMAINS, 1437 + .ops = &icl_ddi_power_well_ops, 1438 + .id = DISP_PW_ID_NONE, 1439 + { 1440 + .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 1441 + } 1442 + }, { 1443 + .name = "DDI B IO", 1444 + .domains = ICL_DDI_IO_B_POWER_DOMAINS, 1445 + .ops = &icl_ddi_power_well_ops, 1446 + .id = DISP_PW_ID_NONE, 1447 + { 1448 + .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 1449 + } 1450 + }, { 1451 + .name = "DDI IO TC1", 1452 + .domains = TGL_DDI_IO_TC1_POWER_DOMAINS, 1453 + .ops = &icl_ddi_power_well_ops, 1454 + .id = DISP_PW_ID_NONE, 1455 + { 1456 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1, 1457 + }, 1458 + }, { 1459 + .name = "DDI IO TC2", 1460 + .domains = TGL_DDI_IO_TC2_POWER_DOMAINS, 1461 + .ops = &icl_ddi_power_well_ops, 1462 + .id = DISP_PW_ID_NONE, 1463 + { 1464 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2, 1465 + }, 1466 + }, { 1467 + .name = "AUX A", 1468 + .domains = ICL_AUX_A_IO_POWER_DOMAINS, 1469 + .ops = &icl_aux_power_well_ops, 1470 + .id = DISP_PW_ID_NONE, 1471 + { 1472 + .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 1473 + }, 1474 + }, { 1475 + .name = "AUX B", 1476 + .domains = ICL_AUX_B_IO_POWER_DOMAINS, 1477 + .ops = &icl_aux_power_well_ops, 1478 + .id = DISP_PW_ID_NONE, 1479 + { 1480 + .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 1481 + }, 1482 + }, { 1483 + .name = "AUX USBC1", 1484 + .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS, 1485 + .ops = &icl_aux_power_well_ops, 1486 + .id = DISP_PW_ID_NONE, 1487 + { 1488 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1, 1489 + }, 1490 + }, { 1491 + .name = "AUX USBC2", 1492 + .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS, 1493 + .ops = &icl_aux_power_well_ops, 1494 + .id = DISP_PW_ID_NONE, 1495 + { 1496 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2, 1497 + }, 1498 + }, 1499 + }; 1500 + 1501 + /* 1502 + * DG1 onwards Audio MMIO/VERBS lies in PG0 power well. 1503 + */ 1504 + #define DG1_PW_3_POWER_DOMAINS ( \ 1505 + TGL_PW_4_POWER_DOMAINS | \ 1506 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1507 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1508 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1509 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \ 1510 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \ 1511 + BIT_ULL(POWER_DOMAIN_VGA) | \ 1512 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1513 + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 1514 + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1515 + BIT_ULL(POWER_DOMAIN_INIT)) 1516 + 1517 + #define DG1_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1518 + DG1_PW_3_POWER_DOMAINS | \ 1519 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1520 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1521 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1522 + BIT_ULL(POWER_DOMAIN_MODESET) | \ 1523 + BIT_ULL(POWER_DOMAIN_INIT)) 1524 + 1525 + #define DG1_PW_2_POWER_DOMAINS ( \ 1526 + DG1_PW_3_POWER_DOMAINS | \ 1527 + BIT_ULL(POWER_DOMAIN_TRANSCODER_VDSC_PW2) | \ 1528 + BIT_ULL(POWER_DOMAIN_INIT)) 1529 + 1530 + static const struct i915_power_well_desc dg1_power_wells[] = { 1531 + { 1532 + .name = "always-on", 1533 + .domains = POWER_DOMAIN_MASK, 1534 + .ops = &i9xx_always_on_power_well_ops, 1535 + .always_on = true, 1536 + .id = DISP_PW_ID_NONE, 1537 + }, { 1538 + .name = "power well 1", 1539 + /* Handled by the DMC firmware */ 1540 + .domains = 0, 1541 + .ops = &hsw_power_well_ops, 1542 + .always_on = true, 1543 + .id = SKL_DISP_PW_1, 1544 + { 1545 + .hsw.idx = ICL_PW_CTL_IDX_PW_1, 1546 + .hsw.has_fuses = true, 1547 + }, 1548 + }, { 1549 + .name = "DC off", 1550 + .domains = DG1_DISPLAY_DC_OFF_POWER_DOMAINS, 1551 + .ops = &gen9_dc_off_power_well_ops, 1552 + .id = SKL_DISP_DC_OFF, 1553 + }, { 1554 + .name = "power well 2", 1555 + .domains = DG1_PW_2_POWER_DOMAINS, 1556 + .ops = &hsw_power_well_ops, 1557 + .id = SKL_DISP_PW_2, 1558 + { 1559 + .hsw.idx = ICL_PW_CTL_IDX_PW_2, 1560 + .hsw.has_fuses = true, 1561 + }, 1562 + }, { 1563 + .name = "power well 3", 1564 + .domains = DG1_PW_3_POWER_DOMAINS, 1565 + .ops = &hsw_power_well_ops, 1566 + .id = ICL_DISP_PW_3, 1567 + { 1568 + .hsw.idx = ICL_PW_CTL_IDX_PW_3, 1569 + .hsw.irq_pipe_mask = BIT(PIPE_B), 1570 + .hsw.has_vga = true, 1571 + .hsw.has_fuses = true, 1572 + }, 1573 + }, { 1574 + .name = "DDI A IO", 1575 + .domains = ICL_DDI_IO_A_POWER_DOMAINS, 1576 + .ops = &icl_ddi_power_well_ops, 1577 + .id = DISP_PW_ID_NONE, 1578 + { 1579 + .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 1580 + } 1581 + }, { 1582 + .name = "DDI B IO", 1583 + .domains = ICL_DDI_IO_B_POWER_DOMAINS, 1584 + .ops = &icl_ddi_power_well_ops, 1585 + .id = DISP_PW_ID_NONE, 1586 + { 1587 + .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 1588 + } 1589 + }, { 1590 + .name = "DDI IO TC1", 1591 + .domains = TGL_DDI_IO_TC1_POWER_DOMAINS, 1592 + .ops = &icl_ddi_power_well_ops, 1593 + .id = DISP_PW_ID_NONE, 1594 + { 1595 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1, 1596 + }, 1597 + }, { 1598 + .name = "DDI IO TC2", 1599 + .domains = TGL_DDI_IO_TC2_POWER_DOMAINS, 1600 + .ops = &icl_ddi_power_well_ops, 1601 + .id = DISP_PW_ID_NONE, 1602 + { 1603 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2, 1604 + }, 1605 + }, { 1606 + .name = "AUX A", 1607 + .domains = TGL_AUX_A_IO_POWER_DOMAINS, 1608 + .ops = &icl_aux_power_well_ops, 1609 + .id = DISP_PW_ID_NONE, 1610 + { 1611 + .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 1612 + }, 1613 + }, { 1614 + .name = "AUX B", 1615 + .domains = TGL_AUX_B_IO_POWER_DOMAINS, 1616 + .ops = &icl_aux_power_well_ops, 1617 + .id = DISP_PW_ID_NONE, 1618 + { 1619 + .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 1620 + }, 1621 + }, { 1622 + .name = "AUX USBC1", 1623 + .domains = TGL_AUX_IO_USBC1_POWER_DOMAINS, 1624 + .ops = &icl_aux_power_well_ops, 1625 + .id = DISP_PW_ID_NONE, 1626 + { 1627 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1, 1628 + .hsw.is_tc_tbt = false, 1629 + }, 1630 + }, { 1631 + .name = "AUX USBC2", 1632 + .domains = TGL_AUX_IO_USBC2_POWER_DOMAINS, 1633 + .ops = &icl_aux_power_well_ops, 1634 + .id = DISP_PW_ID_NONE, 1635 + { 1636 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2, 1637 + .hsw.is_tc_tbt = false, 1638 + }, 1639 + }, { 1640 + .name = "power well 4", 1641 + .domains = TGL_PW_4_POWER_DOMAINS, 1642 + .ops = &hsw_power_well_ops, 1643 + .id = DISP_PW_ID_NONE, 1644 + { 1645 + .hsw.idx = ICL_PW_CTL_IDX_PW_4, 1646 + .hsw.has_fuses = true, 1647 + .hsw.irq_pipe_mask = BIT(PIPE_C), 1648 + } 1649 + }, { 1650 + .name = "power well 5", 1651 + .domains = TGL_PW_5_POWER_DOMAINS, 1652 + .ops = &hsw_power_well_ops, 1653 + .id = DISP_PW_ID_NONE, 1654 + { 1655 + .hsw.idx = TGL_PW_CTL_IDX_PW_5, 1656 + .hsw.has_fuses = true, 1657 + .hsw.irq_pipe_mask = BIT(PIPE_D), 1658 + }, 1659 + }, 1660 + }; 1661 + 1662 + /* 1663 + * XE_LPD Power Domains 1664 + * 1665 + * Previous platforms required that PG(n-1) be enabled before PG(n). That 1666 + * dependency chain turns into a dependency tree on XE_LPD: 1667 + * 1668 + * PG0 1669 + * | 1670 + * --PG1-- 1671 + * / \ 1672 + * PGA --PG2-- 1673 + * / | \ 1674 + * PGB PGC PGD 1675 + * 1676 + * Power wells must be enabled from top to bottom and disabled from bottom 1677 + * to top. This allows pipes to be power gated independently. 1678 + */ 1679 + 1680 + #define XELPD_PW_D_POWER_DOMAINS ( \ 1681 + BIT_ULL(POWER_DOMAIN_PIPE_D) | \ 1682 + BIT_ULL(POWER_DOMAIN_PIPE_D_PANEL_FITTER) | \ 1683 + BIT_ULL(POWER_DOMAIN_TRANSCODER_D) | \ 1684 + BIT_ULL(POWER_DOMAIN_INIT)) 1685 + 1686 + #define XELPD_PW_C_POWER_DOMAINS ( \ 1687 + BIT_ULL(POWER_DOMAIN_PIPE_C) | \ 1688 + BIT_ULL(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \ 1689 + BIT_ULL(POWER_DOMAIN_TRANSCODER_C) | \ 1690 + BIT_ULL(POWER_DOMAIN_INIT)) 1691 + 1692 + #define XELPD_PW_B_POWER_DOMAINS ( \ 1693 + BIT_ULL(POWER_DOMAIN_PIPE_B) | \ 1694 + BIT_ULL(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \ 1695 + BIT_ULL(POWER_DOMAIN_TRANSCODER_B) | \ 1696 + BIT_ULL(POWER_DOMAIN_INIT)) 1697 + 1698 + #define XELPD_PW_A_POWER_DOMAINS ( \ 1699 + BIT_ULL(POWER_DOMAIN_PIPE_A) | \ 1700 + BIT_ULL(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \ 1701 + BIT_ULL(POWER_DOMAIN_INIT)) 1702 + 1703 + #define XELPD_PW_2_POWER_DOMAINS ( \ 1704 + XELPD_PW_B_POWER_DOMAINS | \ 1705 + XELPD_PW_C_POWER_DOMAINS | \ 1706 + XELPD_PW_D_POWER_DOMAINS | \ 1707 + BIT_ULL(POWER_DOMAIN_PORT_DDI_C_LANES) | \ 1708 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_D_XELPD) | \ 1709 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_E_XELPD) | \ 1710 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC1) | \ 1711 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC2) | \ 1712 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC3) | \ 1713 + BIT_ULL(POWER_DOMAIN_PORT_DDI_LANES_TC4) | \ 1714 + BIT_ULL(POWER_DOMAIN_VGA) | \ 1715 + BIT_ULL(POWER_DOMAIN_AUDIO_PLAYBACK) | \ 1716 + BIT_ULL(POWER_DOMAIN_AUX_C) | \ 1717 + BIT_ULL(POWER_DOMAIN_AUX_D_XELPD) | \ 1718 + BIT_ULL(POWER_DOMAIN_AUX_E_XELPD) | \ 1719 + BIT_ULL(POWER_DOMAIN_AUX_USBC1) | \ 1720 + BIT_ULL(POWER_DOMAIN_AUX_USBC2) | \ 1721 + BIT_ULL(POWER_DOMAIN_AUX_USBC3) | \ 1722 + BIT_ULL(POWER_DOMAIN_AUX_USBC4) | \ 1723 + BIT_ULL(POWER_DOMAIN_AUX_TBT1) | \ 1724 + BIT_ULL(POWER_DOMAIN_AUX_TBT2) | \ 1725 + BIT_ULL(POWER_DOMAIN_AUX_TBT3) | \ 1726 + BIT_ULL(POWER_DOMAIN_AUX_TBT4) | \ 1727 + BIT_ULL(POWER_DOMAIN_INIT)) 1728 + 1729 + /* 1730 + * XELPD PW_1/PG_1 domains (under HW/DMC control): 1731 + * - DBUF function (registers are in PW0) 1732 + * - Transcoder A 1733 + * - DDI_A and DDI_B 1734 + * 1735 + * XELPD PW_0/PW_1 domains (under HW/DMC control): 1736 + * - PCI 1737 + * - Clocks except port PLL 1738 + * - Shared functions: 1739 + * * interrupts except pipe interrupts 1740 + * * MBus except PIPE_MBUS_DBOX_CTL 1741 + * * DBUF registers 1742 + * - Central power except FBC 1743 + * - Top-level GTC (DDI-level GTC is in the well associated with the DDI) 1744 + */ 1745 + 1746 + #define XELPD_DISPLAY_DC_OFF_POWER_DOMAINS ( \ 1747 + XELPD_PW_2_POWER_DOMAINS | \ 1748 + BIT_ULL(POWER_DOMAIN_PORT_DSI) | \ 1749 + BIT_ULL(POWER_DOMAIN_AUDIO_MMIO) | \ 1750 + BIT_ULL(POWER_DOMAIN_AUX_A) | \ 1751 + BIT_ULL(POWER_DOMAIN_AUX_B) | \ 1752 + BIT_ULL(POWER_DOMAIN_MODESET) | \ 1753 + BIT_ULL(POWER_DOMAIN_INIT)) 1754 + 1755 + #define XELPD_AUX_IO_D_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_D_XELPD) 1756 + #define XELPD_AUX_IO_E_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_E_XELPD) 1757 + #define XELPD_AUX_IO_USBC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC1) 1758 + #define XELPD_AUX_IO_USBC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC2) 1759 + #define XELPD_AUX_IO_USBC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC3) 1760 + #define XELPD_AUX_IO_USBC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_USBC4) 1761 + 1762 + #define XELPD_AUX_IO_TBT1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT1) 1763 + #define XELPD_AUX_IO_TBT2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT2) 1764 + #define XELPD_AUX_IO_TBT3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT3) 1765 + #define XELPD_AUX_IO_TBT4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_AUX_TBT4) 1766 + 1767 + #define XELPD_DDI_IO_D_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_D_XELPD) 1768 + #define XELPD_DDI_IO_E_XELPD_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_E_XELPD) 1769 + #define XELPD_DDI_IO_TC1_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC1) 1770 + #define XELPD_DDI_IO_TC2_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC2) 1771 + #define XELPD_DDI_IO_TC3_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC3) 1772 + #define XELPD_DDI_IO_TC4_POWER_DOMAINS BIT_ULL(POWER_DOMAIN_PORT_DDI_IO_TC4) 1773 + 1774 + static const struct i915_power_well_desc xelpd_power_wells[] = { 1775 + { 1776 + .name = "always-on", 1777 + .domains = POWER_DOMAIN_MASK, 1778 + .ops = &i9xx_always_on_power_well_ops, 1779 + .always_on = true, 1780 + .id = DISP_PW_ID_NONE, 1781 + }, { 1782 + .name = "power well 1", 1783 + /* Handled by the DMC firmware */ 1784 + .domains = 0, 1785 + .ops = &hsw_power_well_ops, 1786 + .always_on = true, 1787 + .id = SKL_DISP_PW_1, 1788 + { 1789 + .hsw.idx = ICL_PW_CTL_IDX_PW_1, 1790 + .hsw.has_fuses = true, 1791 + }, 1792 + }, { 1793 + .name = "DC off", 1794 + .domains = XELPD_DISPLAY_DC_OFF_POWER_DOMAINS, 1795 + .ops = &gen9_dc_off_power_well_ops, 1796 + .id = SKL_DISP_DC_OFF, 1797 + }, { 1798 + .name = "power well 2", 1799 + .domains = XELPD_PW_2_POWER_DOMAINS, 1800 + .ops = &hsw_power_well_ops, 1801 + .id = SKL_DISP_PW_2, 1802 + { 1803 + .hsw.idx = ICL_PW_CTL_IDX_PW_2, 1804 + .hsw.has_vga = true, 1805 + .hsw.has_fuses = true, 1806 + }, 1807 + }, { 1808 + .name = "power well A", 1809 + .domains = XELPD_PW_A_POWER_DOMAINS, 1810 + .ops = &hsw_power_well_ops, 1811 + .id = DISP_PW_ID_NONE, 1812 + { 1813 + .hsw.idx = XELPD_PW_CTL_IDX_PW_A, 1814 + .hsw.irq_pipe_mask = BIT(PIPE_A), 1815 + .hsw.has_fuses = true, 1816 + }, 1817 + }, { 1818 + .name = "power well B", 1819 + .domains = XELPD_PW_B_POWER_DOMAINS, 1820 + .ops = &hsw_power_well_ops, 1821 + .id = DISP_PW_ID_NONE, 1822 + { 1823 + .hsw.idx = XELPD_PW_CTL_IDX_PW_B, 1824 + .hsw.irq_pipe_mask = BIT(PIPE_B), 1825 + .hsw.has_fuses = true, 1826 + }, 1827 + }, { 1828 + .name = "power well C", 1829 + .domains = XELPD_PW_C_POWER_DOMAINS, 1830 + .ops = &hsw_power_well_ops, 1831 + .id = DISP_PW_ID_NONE, 1832 + { 1833 + .hsw.idx = XELPD_PW_CTL_IDX_PW_C, 1834 + .hsw.irq_pipe_mask = BIT(PIPE_C), 1835 + .hsw.has_fuses = true, 1836 + }, 1837 + }, { 1838 + .name = "power well D", 1839 + .domains = XELPD_PW_D_POWER_DOMAINS, 1840 + .ops = &hsw_power_well_ops, 1841 + .id = DISP_PW_ID_NONE, 1842 + { 1843 + .hsw.idx = XELPD_PW_CTL_IDX_PW_D, 1844 + .hsw.irq_pipe_mask = BIT(PIPE_D), 1845 + .hsw.has_fuses = true, 1846 + }, 1847 + }, { 1848 + .name = "DDI A IO", 1849 + .domains = ICL_DDI_IO_A_POWER_DOMAINS, 1850 + .ops = &icl_ddi_power_well_ops, 1851 + .id = DISP_PW_ID_NONE, 1852 + { 1853 + .hsw.idx = ICL_PW_CTL_IDX_DDI_A, 1854 + } 1855 + }, { 1856 + .name = "DDI B IO", 1857 + .domains = ICL_DDI_IO_B_POWER_DOMAINS, 1858 + .ops = &icl_ddi_power_well_ops, 1859 + .id = DISP_PW_ID_NONE, 1860 + { 1861 + .hsw.idx = ICL_PW_CTL_IDX_DDI_B, 1862 + } 1863 + }, { 1864 + .name = "DDI C IO", 1865 + .domains = ICL_DDI_IO_C_POWER_DOMAINS, 1866 + .ops = &icl_ddi_power_well_ops, 1867 + .id = DISP_PW_ID_NONE, 1868 + { 1869 + .hsw.idx = ICL_PW_CTL_IDX_DDI_C, 1870 + } 1871 + }, { 1872 + .name = "DDI IO D_XELPD", 1873 + .domains = XELPD_DDI_IO_D_XELPD_POWER_DOMAINS, 1874 + .ops = &icl_ddi_power_well_ops, 1875 + .id = DISP_PW_ID_NONE, 1876 + { 1877 + .hsw.idx = XELPD_PW_CTL_IDX_DDI_D, 1878 + } 1879 + }, { 1880 + .name = "DDI IO E_XELPD", 1881 + .domains = XELPD_DDI_IO_E_XELPD_POWER_DOMAINS, 1882 + .ops = &icl_ddi_power_well_ops, 1883 + .id = DISP_PW_ID_NONE, 1884 + { 1885 + .hsw.idx = XELPD_PW_CTL_IDX_DDI_E, 1886 + } 1887 + }, { 1888 + .name = "DDI IO TC1", 1889 + .domains = XELPD_DDI_IO_TC1_POWER_DOMAINS, 1890 + .ops = &icl_ddi_power_well_ops, 1891 + .id = DISP_PW_ID_NONE, 1892 + { 1893 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC1, 1894 + } 1895 + }, { 1896 + .name = "DDI IO TC2", 1897 + .domains = XELPD_DDI_IO_TC2_POWER_DOMAINS, 1898 + .ops = &icl_ddi_power_well_ops, 1899 + .id = DISP_PW_ID_NONE, 1900 + { 1901 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC2, 1902 + } 1903 + }, { 1904 + .name = "DDI IO TC3", 1905 + .domains = XELPD_DDI_IO_TC3_POWER_DOMAINS, 1906 + .ops = &icl_ddi_power_well_ops, 1907 + .id = DISP_PW_ID_NONE, 1908 + { 1909 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC3, 1910 + } 1911 + }, { 1912 + .name = "DDI IO TC4", 1913 + .domains = XELPD_DDI_IO_TC4_POWER_DOMAINS, 1914 + .ops = &icl_ddi_power_well_ops, 1915 + .id = DISP_PW_ID_NONE, 1916 + { 1917 + .hsw.idx = TGL_PW_CTL_IDX_DDI_TC4, 1918 + } 1919 + }, { 1920 + .name = "AUX A", 1921 + .domains = ICL_AUX_A_IO_POWER_DOMAINS, 1922 + .ops = &icl_aux_power_well_ops, 1923 + .id = DISP_PW_ID_NONE, 1924 + { 1925 + .hsw.idx = ICL_PW_CTL_IDX_AUX_A, 1926 + .hsw.fixed_enable_delay = 600, 1927 + }, 1928 + }, { 1929 + .name = "AUX B", 1930 + .domains = ICL_AUX_B_IO_POWER_DOMAINS, 1931 + .ops = &icl_aux_power_well_ops, 1932 + .id = DISP_PW_ID_NONE, 1933 + { 1934 + .hsw.idx = ICL_PW_CTL_IDX_AUX_B, 1935 + .hsw.fixed_enable_delay = 600, 1936 + }, 1937 + }, { 1938 + .name = "AUX C", 1939 + .domains = TGL_AUX_C_IO_POWER_DOMAINS, 1940 + .ops = &icl_aux_power_well_ops, 1941 + .id = DISP_PW_ID_NONE, 1942 + { 1943 + .hsw.idx = ICL_PW_CTL_IDX_AUX_C, 1944 + .hsw.fixed_enable_delay = 600, 1945 + }, 1946 + }, { 1947 + .name = "AUX D_XELPD", 1948 + .domains = XELPD_AUX_IO_D_XELPD_POWER_DOMAINS, 1949 + .ops = &icl_aux_power_well_ops, 1950 + .id = DISP_PW_ID_NONE, 1951 + { 1952 + .hsw.idx = XELPD_PW_CTL_IDX_AUX_D, 1953 + .hsw.fixed_enable_delay = 600, 1954 + }, 1955 + }, { 1956 + .name = "AUX E_XELPD", 1957 + .domains = XELPD_AUX_IO_E_XELPD_POWER_DOMAINS, 1958 + .ops = &icl_aux_power_well_ops, 1959 + .id = DISP_PW_ID_NONE, 1960 + { 1961 + .hsw.idx = XELPD_PW_CTL_IDX_AUX_E, 1962 + }, 1963 + }, { 1964 + .name = "AUX USBC1", 1965 + .domains = XELPD_AUX_IO_USBC1_POWER_DOMAINS, 1966 + .ops = &icl_aux_power_well_ops, 1967 + .id = DISP_PW_ID_NONE, 1968 + { 1969 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC1, 1970 + .hsw.fixed_enable_delay = 600, 1971 + }, 1972 + }, { 1973 + .name = "AUX USBC2", 1974 + .domains = XELPD_AUX_IO_USBC2_POWER_DOMAINS, 1975 + .ops = &icl_aux_power_well_ops, 1976 + .id = DISP_PW_ID_NONE, 1977 + { 1978 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC2, 1979 + }, 1980 + }, { 1981 + .name = "AUX USBC3", 1982 + .domains = XELPD_AUX_IO_USBC3_POWER_DOMAINS, 1983 + .ops = &icl_aux_power_well_ops, 1984 + .id = DISP_PW_ID_NONE, 1985 + { 1986 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC3, 1987 + }, 1988 + }, { 1989 + .name = "AUX USBC4", 1990 + .domains = XELPD_AUX_IO_USBC4_POWER_DOMAINS, 1991 + .ops = &icl_aux_power_well_ops, 1992 + .id = DISP_PW_ID_NONE, 1993 + { 1994 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TC4, 1995 + }, 1996 + }, { 1997 + .name = "AUX TBT1", 1998 + .domains = XELPD_AUX_IO_TBT1_POWER_DOMAINS, 1999 + .ops = &icl_aux_power_well_ops, 2000 + .id = DISP_PW_ID_NONE, 2001 + { 2002 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT1, 2003 + .hsw.is_tc_tbt = true, 2004 + }, 2005 + }, { 2006 + .name = "AUX TBT2", 2007 + .domains = XELPD_AUX_IO_TBT2_POWER_DOMAINS, 2008 + .ops = &icl_aux_power_well_ops, 2009 + .id = DISP_PW_ID_NONE, 2010 + { 2011 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT2, 2012 + .hsw.is_tc_tbt = true, 2013 + }, 2014 + }, { 2015 + .name = "AUX TBT3", 2016 + .domains = XELPD_AUX_IO_TBT3_POWER_DOMAINS, 2017 + .ops = &icl_aux_power_well_ops, 2018 + .id = DISP_PW_ID_NONE, 2019 + { 2020 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT3, 2021 + .hsw.is_tc_tbt = true, 2022 + }, 2023 + }, { 2024 + .name = "AUX TBT4", 2025 + .domains = XELPD_AUX_IO_TBT4_POWER_DOMAINS, 2026 + .ops = &icl_aux_power_well_ops, 2027 + .id = DISP_PW_ID_NONE, 2028 + { 2029 + .hsw.idx = TGL_PW_CTL_IDX_AUX_TBT4, 2030 + .hsw.is_tc_tbt = true, 2031 + }, 2032 + }, 2033 + }; 2034 + 2035 + static int 2036 + __set_power_wells(struct i915_power_domains *power_domains, 2037 + const struct i915_power_well_desc *power_well_descs, 2038 + int power_well_descs_sz, u64 skip_mask) 2039 + { 2040 + struct drm_i915_private *i915 = container_of(power_domains, 2041 + struct drm_i915_private, 2042 + power_domains); 2043 + u64 power_well_ids = 0; 2044 + int power_well_count = 0; 2045 + int i, plt_idx = 0; 2046 + 2047 + for (i = 0; i < power_well_descs_sz; i++) 2048 + if (!(BIT_ULL(power_well_descs[i].id) & skip_mask)) 2049 + power_well_count++; 2050 + 2051 + power_domains->power_well_count = power_well_count; 2052 + power_domains->power_wells = 2053 + kcalloc(power_well_count, 2054 + sizeof(*power_domains->power_wells), 2055 + GFP_KERNEL); 2056 + if (!power_domains->power_wells) 2057 + return -ENOMEM; 2058 + 2059 + for (i = 0; i < power_well_descs_sz; i++) { 2060 + enum i915_power_well_id id = power_well_descs[i].id; 2061 + 2062 + if (BIT_ULL(id) & skip_mask) 2063 + continue; 2064 + 2065 + power_domains->power_wells[plt_idx++].desc = 2066 + &power_well_descs[i]; 2067 + 2068 + if (id == DISP_PW_ID_NONE) 2069 + continue; 2070 + 2071 + drm_WARN_ON(&i915->drm, id >= sizeof(power_well_ids) * 8); 2072 + drm_WARN_ON(&i915->drm, power_well_ids & BIT_ULL(id)); 2073 + power_well_ids |= BIT_ULL(id); 2074 + } 2075 + 2076 + return 0; 2077 + } 2078 + 2079 + #define set_power_wells_mask(power_domains, __power_well_descs, skip_mask) \ 2080 + __set_power_wells(power_domains, __power_well_descs, \ 2081 + ARRAY_SIZE(__power_well_descs), skip_mask) 2082 + 2083 + #define set_power_wells(power_domains, __power_well_descs) \ 2084 + set_power_wells_mask(power_domains, __power_well_descs, 0) 2085 + 2086 + /** 2087 + * intel_display_power_map_init - initialize power domain -> power well mappings 2088 + * @power_domains: power domain state 2089 + * 2090 + * Creates all the power wells for the current platform, initializes the 2091 + * dynamic state for them and initializes the mapping of each power well to 2092 + * all the power domains the power well belongs to. 2093 + */ 2094 + int intel_display_power_map_init(struct i915_power_domains *power_domains) 2095 + { 2096 + struct drm_i915_private *i915 = container_of(power_domains, 2097 + struct drm_i915_private, 2098 + power_domains); 2099 + /* 2100 + * The enabling order will be from lower to higher indexed wells, 2101 + * the disabling order is reversed. 2102 + */ 2103 + if (!HAS_DISPLAY(i915)) { 2104 + power_domains->power_well_count = 0; 2105 + return 0; 2106 + } 2107 + 2108 + if (DISPLAY_VER(i915) >= 13) 2109 + return set_power_wells(power_domains, xelpd_power_wells); 2110 + else if (IS_DG1(i915)) 2111 + return set_power_wells(power_domains, dg1_power_wells); 2112 + else if (IS_ALDERLAKE_S(i915)) 2113 + return set_power_wells_mask(power_domains, tgl_power_wells, 2114 + BIT_ULL(TGL_DISP_PW_TC_COLD_OFF)); 2115 + else if (IS_ROCKETLAKE(i915)) 2116 + return set_power_wells(power_domains, rkl_power_wells); 2117 + else if (DISPLAY_VER(i915) == 12) 2118 + return set_power_wells(power_domains, tgl_power_wells); 2119 + else if (DISPLAY_VER(i915) == 11) 2120 + return set_power_wells(power_domains, icl_power_wells); 2121 + else if (IS_GEMINILAKE(i915)) 2122 + return set_power_wells(power_domains, glk_power_wells); 2123 + else if (IS_BROXTON(i915)) 2124 + return set_power_wells(power_domains, bxt_power_wells); 2125 + else if (DISPLAY_VER(i915) == 9) 2126 + return set_power_wells(power_domains, skl_power_wells); 2127 + else if (IS_CHERRYVIEW(i915)) 2128 + return set_power_wells(power_domains, chv_power_wells); 2129 + else if (IS_BROADWELL(i915)) 2130 + return set_power_wells(power_domains, bdw_power_wells); 2131 + else if (IS_HASWELL(i915)) 2132 + return set_power_wells(power_domains, hsw_power_wells); 2133 + else if (IS_VALLEYVIEW(i915)) 2134 + return set_power_wells(power_domains, vlv_power_wells); 2135 + else if (IS_I830(i915)) 2136 + return set_power_wells(power_domains, i830_power_wells); 2137 + else 2138 + return set_power_wells(power_domains, i9xx_always_on_power_well); 2139 + } 2140 + 2141 + /** 2142 + * intel_display_power_map_cleanup - clean up power domain -> power well mappings 2143 + * @power_domains: power domain state 2144 + * 2145 + * Cleans up all the state that was initialized by intel_display_power_map_init(). 2146 + */ 2147 + void intel_display_power_map_cleanup(struct i915_power_domains *power_domains) 2148 + { 2149 + kfree(power_domains->power_wells); 2150 + }
+14
drivers/gpu/drm/i915/display/intel_display_power_map.h
··· 1 + /* SPDX-License-Identifier: MIT */ 2 + /* 3 + * Copyright © 2022 Intel Corporation 4 + */ 5 + 6 + #ifndef __INTEL_DISPLAY_POWER_MAP_H__ 7 + #define __INTEL_DISPLAY_POWER_MAP_H__ 8 + 9 + struct i915_power_domains; 10 + 11 + int intel_display_power_map_init(struct i915_power_domains *power_domains); 12 + void intel_display_power_map_cleanup(struct i915_power_domains *power_domains); 13 + 14 + #endif