aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h4
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c157
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.h23
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_uncore.c31
4 files changed, 189 insertions, 26 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index a778b93f60d2..10580826319e 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -7998,9 +7998,13 @@ enum {
7998#define VLV_GTLC_PW_RENDER_STATUS_MASK (1 << 7) 7998#define VLV_GTLC_PW_RENDER_STATUS_MASK (1 << 7)
7999#define FORCEWAKE_MT _MMIO(0xa188) /* multi-threaded */ 7999#define FORCEWAKE_MT _MMIO(0xa188) /* multi-threaded */
8000#define FORCEWAKE_MEDIA_GEN9 _MMIO(0xa270) 8000#define FORCEWAKE_MEDIA_GEN9 _MMIO(0xa270)
8001#define FORCEWAKE_MEDIA_VDBOX_GEN11(n) _MMIO(0xa540 + (n) * 4)
8002#define FORCEWAKE_MEDIA_VEBOX_GEN11(n) _MMIO(0xa560 + (n) * 4)
8001#define FORCEWAKE_RENDER_GEN9 _MMIO(0xa278) 8003#define FORCEWAKE_RENDER_GEN9 _MMIO(0xa278)
8002#define FORCEWAKE_BLITTER_GEN9 _MMIO(0xa188) 8004#define FORCEWAKE_BLITTER_GEN9 _MMIO(0xa188)
8003#define FORCEWAKE_ACK_MEDIA_GEN9 _MMIO(0x0D88) 8005#define FORCEWAKE_ACK_MEDIA_GEN9 _MMIO(0x0D88)
8006#define FORCEWAKE_ACK_MEDIA_VDBOX_GEN11(n) _MMIO(0x0D50 + (n) * 4)
8007#define FORCEWAKE_ACK_MEDIA_VEBOX_GEN11(n) _MMIO(0x0D70 + (n) * 4)
8004#define FORCEWAKE_ACK_RENDER_GEN9 _MMIO(0x0D84) 8008#define FORCEWAKE_ACK_RENDER_GEN9 _MMIO(0x0D84)
8005#define FORCEWAKE_ACK_BLITTER_GEN9 _MMIO(0x130044) 8009#define FORCEWAKE_ACK_BLITTER_GEN9 _MMIO(0x130044)
8006#define FORCEWAKE_KERNEL BIT(0) 8010#define FORCEWAKE_KERNEL BIT(0)
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 5ae9a62712ca..4df7c2ef8576 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -37,6 +37,12 @@ static const char * const forcewake_domain_names[] = {
37 "render", 37 "render",
38 "blitter", 38 "blitter",
39 "media", 39 "media",
40 "vdbox0",
41 "vdbox1",
42 "vdbox2",
43 "vdbox3",
44 "vebox0",
45 "vebox1",
40}; 46};
41 47
42const char * 48const char *
@@ -774,6 +780,9 @@ void assert_forcewakes_active(struct drm_i915_private *dev_priv,
774/* We give fast paths for the really cool registers */ 780/* We give fast paths for the really cool registers */
775#define NEEDS_FORCE_WAKE(reg) ((reg) < 0x40000) 781#define NEEDS_FORCE_WAKE(reg) ((reg) < 0x40000)
776 782
783#define GEN11_NEEDS_FORCE_WAKE(reg) \
784 ((reg) < 0x40000 || ((reg) >= 0x1c0000 && (reg) < 0x1dc000))
785
777#define __gen6_reg_read_fw_domains(offset) \ 786#define __gen6_reg_read_fw_domains(offset) \
778({ \ 787({ \
779 enum forcewake_domains __fwd; \ 788 enum forcewake_domains __fwd; \
@@ -826,6 +835,14 @@ find_fw_domain(struct drm_i915_private *dev_priv, u32 offset)
826 if (!entry) 835 if (!entry)
827 return 0; 836 return 0;
828 837
838 /*
839 * The list of FW domains depends on the SKU in gen11+ so we
840 * can't determine it statically. We use FORCEWAKE_ALL and
841 * translate it here to the list of available domains.
842 */
843 if (entry->domains == FORCEWAKE_ALL)
844 return dev_priv->uncore.fw_domains;
845
829 WARN(entry->domains & ~dev_priv->uncore.fw_domains, 846 WARN(entry->domains & ~dev_priv->uncore.fw_domains,
830 "Uninitialized forcewake domain(s) 0x%x accessed at 0x%x\n", 847 "Uninitialized forcewake domain(s) 0x%x accessed at 0x%x\n",
831 entry->domains & ~dev_priv->uncore.fw_domains, offset); 848 entry->domains & ~dev_priv->uncore.fw_domains, offset);
@@ -860,6 +877,14 @@ static const struct intel_forcewake_range __vlv_fw_ranges[] = {
860 __fwd; \ 877 __fwd; \
861}) 878})
862 879
880#define __gen11_fwtable_reg_read_fw_domains(offset) \
881({ \
882 enum forcewake_domains __fwd = 0; \
883 if (GEN11_NEEDS_FORCE_WAKE((offset))) \
884 __fwd = find_fw_domain(dev_priv, offset); \
885 __fwd; \
886})
887
863/* *Must* be sorted by offset! See intel_shadow_table_check(). */ 888/* *Must* be sorted by offset! See intel_shadow_table_check(). */
864static const i915_reg_t gen8_shadowed_regs[] = { 889static const i915_reg_t gen8_shadowed_regs[] = {
865 RING_TAIL(RENDER_RING_BASE), /* 0x2000 (base) */ 890 RING_TAIL(RENDER_RING_BASE), /* 0x2000 (base) */
@@ -871,6 +896,20 @@ static const i915_reg_t gen8_shadowed_regs[] = {
871 /* TODO: Other registers are not yet used */ 896 /* TODO: Other registers are not yet used */
872}; 897};
873 898
899static const i915_reg_t gen11_shadowed_regs[] = {
900 RING_TAIL(RENDER_RING_BASE), /* 0x2000 (base) */
901 GEN6_RPNSWREQ, /* 0xA008 */
902 GEN6_RC_VIDEO_FREQ, /* 0xA00C */
903 RING_TAIL(BLT_RING_BASE), /* 0x22000 (base) */
904 RING_TAIL(GEN11_BSD_RING_BASE), /* 0x1C0000 (base) */
905 RING_TAIL(GEN11_BSD2_RING_BASE), /* 0x1C4000 (base) */
906 RING_TAIL(GEN11_VEBOX_RING_BASE), /* 0x1C8000 (base) */
907 RING_TAIL(GEN11_BSD3_RING_BASE), /* 0x1D0000 (base) */
908 RING_TAIL(GEN11_BSD4_RING_BASE), /* 0x1D4000 (base) */
909 RING_TAIL(GEN11_VEBOX2_RING_BASE), /* 0x1D8000 (base) */
910 /* TODO: Other registers are not yet used */
911};
912
874static int mmio_reg_cmp(u32 key, const i915_reg_t *reg) 913static int mmio_reg_cmp(u32 key, const i915_reg_t *reg)
875{ 914{
876 u32 offset = i915_mmio_reg_offset(*reg); 915 u32 offset = i915_mmio_reg_offset(*reg);
@@ -883,14 +922,17 @@ static int mmio_reg_cmp(u32 key, const i915_reg_t *reg)
883 return 0; 922 return 0;
884} 923}
885 924
886static bool is_gen8_shadowed(u32 offset) 925#define __is_genX_shadowed(x) \
887{ 926static bool is_gen##x##_shadowed(u32 offset) \
888 const i915_reg_t *regs = gen8_shadowed_regs; 927{ \
889 928 const i915_reg_t *regs = gen##x##_shadowed_regs; \
890 return BSEARCH(offset, regs, ARRAY_SIZE(gen8_shadowed_regs), 929 return BSEARCH(offset, regs, ARRAY_SIZE(gen##x##_shadowed_regs), \
891 mmio_reg_cmp); 930 mmio_reg_cmp); \
892} 931}
893 932
933__is_genX_shadowed(8)
934__is_genX_shadowed(11)
935
894#define __gen8_reg_write_fw_domains(offset) \ 936#define __gen8_reg_write_fw_domains(offset) \
895({ \ 937({ \
896 enum forcewake_domains __fwd; \ 938 enum forcewake_domains __fwd; \
@@ -929,6 +971,14 @@ static const struct intel_forcewake_range __chv_fw_ranges[] = {
929 __fwd; \ 971 __fwd; \
930}) 972})
931 973
974#define __gen11_fwtable_reg_write_fw_domains(offset) \
975({ \
976 enum forcewake_domains __fwd = 0; \
977 if (GEN11_NEEDS_FORCE_WAKE((offset)) && !is_gen11_shadowed(offset)) \
978 __fwd = find_fw_domain(dev_priv, offset); \
979 __fwd; \
980})
981
932/* *Must* be sorted by offset ranges! See intel_fw_table_check(). */ 982/* *Must* be sorted by offset ranges! See intel_fw_table_check(). */
933static const struct intel_forcewake_range __gen9_fw_ranges[] = { 983static const struct intel_forcewake_range __gen9_fw_ranges[] = {
934 GEN_FW_RANGE(0x0, 0xaff, FORCEWAKE_BLITTER), 984 GEN_FW_RANGE(0x0, 0xaff, FORCEWAKE_BLITTER),
@@ -965,6 +1015,40 @@ static const struct intel_forcewake_range __gen9_fw_ranges[] = {
965 GEN_FW_RANGE(0x30000, 0x3ffff, FORCEWAKE_MEDIA), 1015 GEN_FW_RANGE(0x30000, 0x3ffff, FORCEWAKE_MEDIA),
966}; 1016};
967 1017
1018/* *Must* be sorted by offset ranges! See intel_fw_table_check(). */
1019static const struct intel_forcewake_range __gen11_fw_ranges[] = {
1020 GEN_FW_RANGE(0x0, 0xaff, FORCEWAKE_BLITTER),
1021 GEN_FW_RANGE(0xb00, 0x1fff, 0), /* uncore range */
1022 GEN_FW_RANGE(0x2000, 0x26ff, FORCEWAKE_RENDER),
1023 GEN_FW_RANGE(0x2700, 0x2fff, FORCEWAKE_BLITTER),
1024 GEN_FW_RANGE(0x3000, 0x3fff, FORCEWAKE_RENDER),
1025 GEN_FW_RANGE(0x4000, 0x51ff, FORCEWAKE_BLITTER),
1026 GEN_FW_RANGE(0x5200, 0x7fff, FORCEWAKE_RENDER),
1027 GEN_FW_RANGE(0x8000, 0x813f, FORCEWAKE_BLITTER),
1028 GEN_FW_RANGE(0x8140, 0x815f, FORCEWAKE_RENDER),
1029 GEN_FW_RANGE(0x8160, 0x82ff, FORCEWAKE_BLITTER),
1030 GEN_FW_RANGE(0x8300, 0x84ff, FORCEWAKE_RENDER),
1031 GEN_FW_RANGE(0x8500, 0x8bff, FORCEWAKE_BLITTER),
1032 GEN_FW_RANGE(0x8c00, 0x8cff, FORCEWAKE_RENDER),
1033 GEN_FW_RANGE(0x8d00, 0x93ff, FORCEWAKE_BLITTER),
1034 GEN_FW_RANGE(0x9400, 0x97ff, FORCEWAKE_ALL),
1035 GEN_FW_RANGE(0x9800, 0xafff, FORCEWAKE_BLITTER),
1036 GEN_FW_RANGE(0xb000, 0xb47f, FORCEWAKE_RENDER),
1037 GEN_FW_RANGE(0xb480, 0xdfff, FORCEWAKE_BLITTER),
1038 GEN_FW_RANGE(0xe000, 0xe8ff, FORCEWAKE_RENDER),
1039 GEN_FW_RANGE(0xe900, 0x243ff, FORCEWAKE_BLITTER),
1040 GEN_FW_RANGE(0x24400, 0x247ff, FORCEWAKE_RENDER),
1041 GEN_FW_RANGE(0x24800, 0x3ffff, FORCEWAKE_BLITTER),
1042 GEN_FW_RANGE(0x40000, 0x1bffff, 0),
1043 GEN_FW_RANGE(0x1c0000, 0x1c3fff, FORCEWAKE_MEDIA_VDBOX0),
1044 GEN_FW_RANGE(0x1c4000, 0x1c7fff, FORCEWAKE_MEDIA_VDBOX1),
1045 GEN_FW_RANGE(0x1c8000, 0x1cbfff, FORCEWAKE_MEDIA_VEBOX0),
1046 GEN_FW_RANGE(0x1cc000, 0x1cffff, FORCEWAKE_BLITTER),
1047 GEN_FW_RANGE(0x1d0000, 0x1d3fff, FORCEWAKE_MEDIA_VDBOX2),
1048 GEN_FW_RANGE(0x1d4000, 0x1d7fff, FORCEWAKE_MEDIA_VDBOX3),
1049 GEN_FW_RANGE(0x1d8000, 0x1dbfff, FORCEWAKE_MEDIA_VEBOX1)
1050};
1051
968static void 1052static void
969ilk_dummy_write(struct drm_i915_private *dev_priv) 1053ilk_dummy_write(struct drm_i915_private *dev_priv)
970{ 1054{
@@ -1095,7 +1179,12 @@ func##_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) {
1095} 1179}
1096#define __gen6_read(x) __gen_read(gen6, x) 1180#define __gen6_read(x) __gen_read(gen6, x)
1097#define __fwtable_read(x) __gen_read(fwtable, x) 1181#define __fwtable_read(x) __gen_read(fwtable, x)
1182#define __gen11_fwtable_read(x) __gen_read(gen11_fwtable, x)
1098 1183
1184__gen11_fwtable_read(8)
1185__gen11_fwtable_read(16)
1186__gen11_fwtable_read(32)
1187__gen11_fwtable_read(64)
1099__fwtable_read(8) 1188__fwtable_read(8)
1100__fwtable_read(16) 1189__fwtable_read(16)
1101__fwtable_read(32) 1190__fwtable_read(32)
@@ -1105,6 +1194,7 @@ __gen6_read(16)
1105__gen6_read(32) 1194__gen6_read(32)
1106__gen6_read(64) 1195__gen6_read(64)
1107 1196
1197#undef __gen11_fwtable_read
1108#undef __fwtable_read 1198#undef __fwtable_read
1109#undef __gen6_read 1199#undef __gen6_read
1110#undef GEN6_READ_FOOTER 1200#undef GEN6_READ_FOOTER
@@ -1181,7 +1271,11 @@ func##_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, boo
1181} 1271}
1182#define __gen8_write(x) __gen_write(gen8, x) 1272#define __gen8_write(x) __gen_write(gen8, x)
1183#define __fwtable_write(x) __gen_write(fwtable, x) 1273#define __fwtable_write(x) __gen_write(fwtable, x)
1274#define __gen11_fwtable_write(x) __gen_write(gen11_fwtable, x)
1184 1275
1276__gen11_fwtable_write(8)
1277__gen11_fwtable_write(16)
1278__gen11_fwtable_write(32)
1185__fwtable_write(8) 1279__fwtable_write(8)
1186__fwtable_write(16) 1280__fwtable_write(16)
1187__fwtable_write(32) 1281__fwtable_write(32)
@@ -1192,6 +1286,7 @@ __gen6_write(8)
1192__gen6_write(16) 1286__gen6_write(16)
1193__gen6_write(32) 1287__gen6_write(32)
1194 1288
1289#undef __gen11_fwtable_write
1195#undef __fwtable_write 1290#undef __fwtable_write
1196#undef __gen8_write 1291#undef __gen8_write
1197#undef __gen6_write 1292#undef __gen6_write
@@ -1240,6 +1335,13 @@ static void fw_domain_init(struct drm_i915_private *dev_priv,
1240 BUILD_BUG_ON(FORCEWAKE_RENDER != (1 << FW_DOMAIN_ID_RENDER)); 1335 BUILD_BUG_ON(FORCEWAKE_RENDER != (1 << FW_DOMAIN_ID_RENDER));
1241 BUILD_BUG_ON(FORCEWAKE_BLITTER != (1 << FW_DOMAIN_ID_BLITTER)); 1336 BUILD_BUG_ON(FORCEWAKE_BLITTER != (1 << FW_DOMAIN_ID_BLITTER));
1242 BUILD_BUG_ON(FORCEWAKE_MEDIA != (1 << FW_DOMAIN_ID_MEDIA)); 1337 BUILD_BUG_ON(FORCEWAKE_MEDIA != (1 << FW_DOMAIN_ID_MEDIA));
1338 BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX0 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX0));
1339 BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX1 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX1));
1340 BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX2 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX2));
1341 BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX3 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX3));
1342 BUILD_BUG_ON(FORCEWAKE_MEDIA_VEBOX0 != (1 << FW_DOMAIN_ID_MEDIA_VEBOX0));
1343 BUILD_BUG_ON(FORCEWAKE_MEDIA_VEBOX1 != (1 << FW_DOMAIN_ID_MEDIA_VEBOX1));
1344
1243 1345
1244 d->mask = BIT(domain_id); 1346 d->mask = BIT(domain_id);
1245 1347
@@ -1267,7 +1369,34 @@ static void intel_uncore_fw_domains_init(struct drm_i915_private *dev_priv)
1267 dev_priv->uncore.fw_clear = _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL); 1369 dev_priv->uncore.fw_clear = _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL);
1268 } 1370 }
1269 1371
1270 if (INTEL_GEN(dev_priv) >= 9) { 1372 if (INTEL_GEN(dev_priv) >= 11) {
1373 int i;
1374
1375 dev_priv->uncore.funcs.force_wake_get = fw_domains_get;
1376 dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
1377 fw_domain_init(dev_priv, FW_DOMAIN_ID_RENDER,
1378 FORCEWAKE_RENDER_GEN9,
1379 FORCEWAKE_ACK_RENDER_GEN9);
1380 fw_domain_init(dev_priv, FW_DOMAIN_ID_BLITTER,
1381 FORCEWAKE_BLITTER_GEN9,
1382 FORCEWAKE_ACK_BLITTER_GEN9);
1383 for (i = 0; i < I915_MAX_VCS; i++) {
1384 if (!HAS_ENGINE(dev_priv, _VCS(i)))
1385 continue;
1386
1387 fw_domain_init(dev_priv, FW_DOMAIN_ID_MEDIA_VDBOX0 + i,
1388 FORCEWAKE_MEDIA_VDBOX_GEN11(i),
1389 FORCEWAKE_ACK_MEDIA_VDBOX_GEN11(i));
1390 }
1391 for (i = 0; i < I915_MAX_VECS; i++) {
1392 if (!HAS_ENGINE(dev_priv, _VECS(i)))
1393 continue;
1394
1395 fw_domain_init(dev_priv, FW_DOMAIN_ID_MEDIA_VEBOX0 + i,
1396 FORCEWAKE_MEDIA_VEBOX_GEN11(i),
1397 FORCEWAKE_ACK_MEDIA_VEBOX_GEN11(i));
1398 }
1399 } else if (IS_GEN9(dev_priv) || IS_GEN10(dev_priv)) {
1271 dev_priv->uncore.funcs.force_wake_get = 1400 dev_priv->uncore.funcs.force_wake_get =
1272 fw_domains_get_with_fallback; 1401 fw_domains_get_with_fallback;
1273 dev_priv->uncore.funcs.force_wake_put = fw_domains_put; 1402 dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
@@ -1422,10 +1551,14 @@ void intel_uncore_init(struct drm_i915_private *dev_priv)
1422 ASSIGN_WRITE_MMIO_VFUNCS(dev_priv, gen8); 1551 ASSIGN_WRITE_MMIO_VFUNCS(dev_priv, gen8);
1423 ASSIGN_READ_MMIO_VFUNCS(dev_priv, gen6); 1552 ASSIGN_READ_MMIO_VFUNCS(dev_priv, gen6);
1424 } 1553 }
1425 } else { 1554 } else if (IS_GEN(dev_priv, 9, 10)) {
1426 ASSIGN_FW_DOMAINS_TABLE(__gen9_fw_ranges); 1555 ASSIGN_FW_DOMAINS_TABLE(__gen9_fw_ranges);
1427 ASSIGN_WRITE_MMIO_VFUNCS(dev_priv, fwtable); 1556 ASSIGN_WRITE_MMIO_VFUNCS(dev_priv, fwtable);
1428 ASSIGN_READ_MMIO_VFUNCS(dev_priv, fwtable); 1557 ASSIGN_READ_MMIO_VFUNCS(dev_priv, fwtable);
1558 } else {
1559 ASSIGN_FW_DOMAINS_TABLE(__gen11_fw_ranges);
1560 ASSIGN_WRITE_MMIO_VFUNCS(dev_priv, gen11_fwtable);
1561 ASSIGN_READ_MMIO_VFUNCS(dev_priv, gen11_fwtable);
1429 } 1562 }
1430 1563
1431 iosf_mbi_register_pmic_bus_access_notifier( 1564 iosf_mbi_register_pmic_bus_access_notifier(
@@ -1994,7 +2127,9 @@ intel_uncore_forcewake_for_read(struct drm_i915_private *dev_priv,
1994 u32 offset = i915_mmio_reg_offset(reg); 2127 u32 offset = i915_mmio_reg_offset(reg);
1995 enum forcewake_domains fw_domains; 2128 enum forcewake_domains fw_domains;
1996 2129
1997 if (HAS_FWTABLE(dev_priv)) { 2130 if (INTEL_GEN(dev_priv) >= 11) {
2131 fw_domains = __gen11_fwtable_reg_read_fw_domains(offset);
2132 } else if (HAS_FWTABLE(dev_priv)) {
1998 fw_domains = __fwtable_reg_read_fw_domains(offset); 2133 fw_domains = __fwtable_reg_read_fw_domains(offset);
1999 } else if (INTEL_GEN(dev_priv) >= 6) { 2134 } else if (INTEL_GEN(dev_priv) >= 6) {
2000 fw_domains = __gen6_reg_read_fw_domains(offset); 2135 fw_domains = __gen6_reg_read_fw_domains(offset);
@@ -2015,7 +2150,9 @@ intel_uncore_forcewake_for_write(struct drm_i915_private *dev_priv,
2015 u32 offset = i915_mmio_reg_offset(reg); 2150 u32 offset = i915_mmio_reg_offset(reg);
2016 enum forcewake_domains fw_domains; 2151 enum forcewake_domains fw_domains;
2017 2152
2018 if (HAS_FWTABLE(dev_priv) && !IS_VALLEYVIEW(dev_priv)) { 2153 if (INTEL_GEN(dev_priv) >= 11) {
2154 fw_domains = __gen11_fwtable_reg_write_fw_domains(offset);
2155 } else if (HAS_FWTABLE(dev_priv) && !IS_VALLEYVIEW(dev_priv)) {
2019 fw_domains = __fwtable_reg_write_fw_domains(offset); 2156 fw_domains = __fwtable_reg_write_fw_domains(offset);
2020 } else if (IS_GEN8(dev_priv)) { 2157 } else if (IS_GEN8(dev_priv)) {
2021 fw_domains = __gen8_reg_write_fw_domains(offset); 2158 fw_domains = __gen8_reg_write_fw_domains(offset);
diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h
index 53ef77d0c97c..dfdf444e4bcc 100644
--- a/drivers/gpu/drm/i915/intel_uncore.h
+++ b/drivers/gpu/drm/i915/intel_uncore.h
@@ -37,17 +37,28 @@ enum forcewake_domain_id {
37 FW_DOMAIN_ID_RENDER = 0, 37 FW_DOMAIN_ID_RENDER = 0,
38 FW_DOMAIN_ID_BLITTER, 38 FW_DOMAIN_ID_BLITTER,
39 FW_DOMAIN_ID_MEDIA, 39 FW_DOMAIN_ID_MEDIA,
40 FW_DOMAIN_ID_MEDIA_VDBOX0,
41 FW_DOMAIN_ID_MEDIA_VDBOX1,
42 FW_DOMAIN_ID_MEDIA_VDBOX2,
43 FW_DOMAIN_ID_MEDIA_VDBOX3,
44 FW_DOMAIN_ID_MEDIA_VEBOX0,
45 FW_DOMAIN_ID_MEDIA_VEBOX1,
40 46
41 FW_DOMAIN_ID_COUNT 47 FW_DOMAIN_ID_COUNT
42}; 48};
43 49
44enum forcewake_domains { 50enum forcewake_domains {
45 FORCEWAKE_RENDER = BIT(FW_DOMAIN_ID_RENDER), 51 FORCEWAKE_RENDER = BIT(FW_DOMAIN_ID_RENDER),
46 FORCEWAKE_BLITTER = BIT(FW_DOMAIN_ID_BLITTER), 52 FORCEWAKE_BLITTER = BIT(FW_DOMAIN_ID_BLITTER),
47 FORCEWAKE_MEDIA = BIT(FW_DOMAIN_ID_MEDIA), 53 FORCEWAKE_MEDIA = BIT(FW_DOMAIN_ID_MEDIA),
48 FORCEWAKE_ALL = (FORCEWAKE_RENDER | 54 FORCEWAKE_MEDIA_VDBOX0 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX0),
49 FORCEWAKE_BLITTER | 55 FORCEWAKE_MEDIA_VDBOX1 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX1),
50 FORCEWAKE_MEDIA) 56 FORCEWAKE_MEDIA_VDBOX2 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX2),
57 FORCEWAKE_MEDIA_VDBOX3 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX3),
58 FORCEWAKE_MEDIA_VEBOX0 = BIT(FW_DOMAIN_ID_MEDIA_VEBOX0),
59 FORCEWAKE_MEDIA_VEBOX1 = BIT(FW_DOMAIN_ID_MEDIA_VEBOX1),
60
61 FORCEWAKE_ALL = BIT(FW_DOMAIN_ID_COUNT) - 1
51}; 62};
52 63
53struct intel_uncore_funcs { 64struct intel_uncore_funcs {
diff --git a/drivers/gpu/drm/i915/selftests/intel_uncore.c b/drivers/gpu/drm/i915/selftests/intel_uncore.c
index 2f6367643171..f76f2597df5c 100644
--- a/drivers/gpu/drm/i915/selftests/intel_uncore.c
+++ b/drivers/gpu/drm/i915/selftests/intel_uncore.c
@@ -61,20 +61,30 @@ static int intel_fw_table_check(const struct intel_forcewake_range *ranges,
61 61
62static int intel_shadow_table_check(void) 62static int intel_shadow_table_check(void)
63{ 63{
64 const i915_reg_t *reg = gen8_shadowed_regs; 64 struct {
65 unsigned int i; 65 const i915_reg_t *regs;
66 unsigned int size;
67 } reg_lists[] = {
68 { gen8_shadowed_regs, ARRAY_SIZE(gen8_shadowed_regs) },
69 { gen11_shadowed_regs, ARRAY_SIZE(gen11_shadowed_regs) },
70 };
71 const i915_reg_t *reg;
72 unsigned int i, j;
66 s32 prev; 73 s32 prev;
67 74
68 for (i = 0, prev = -1; i < ARRAY_SIZE(gen8_shadowed_regs); i++, reg++) { 75 for (j = 0; j < ARRAY_SIZE(reg_lists); ++j) {
69 u32 offset = i915_mmio_reg_offset(*reg); 76 reg = reg_lists[j].regs;
77 for (i = 0, prev = -1; i < reg_lists[j].size; i++, reg++) {
78 u32 offset = i915_mmio_reg_offset(*reg);
70 79
71 if (prev >= (s32)offset) { 80 if (prev >= (s32)offset) {
72 pr_err("%s: entry[%d]:(%x) is before previous (%x)\n", 81 pr_err("%s: entry[%d]:(%x) is before previous (%x)\n",
73 __func__, i, offset, prev); 82 __func__, i, offset, prev);
74 return -EINVAL; 83 return -EINVAL;
75 } 84 }
76 85
77 prev = offset; 86 prev = offset;
87 }
78 } 88 }
79 89
80 return 0; 90 return 0;
@@ -90,6 +100,7 @@ int intel_uncore_mock_selftests(void)
90 { __vlv_fw_ranges, ARRAY_SIZE(__vlv_fw_ranges), false }, 100 { __vlv_fw_ranges, ARRAY_SIZE(__vlv_fw_ranges), false },
91 { __chv_fw_ranges, ARRAY_SIZE(__chv_fw_ranges), false }, 101 { __chv_fw_ranges, ARRAY_SIZE(__chv_fw_ranges), false },
92 { __gen9_fw_ranges, ARRAY_SIZE(__gen9_fw_ranges), true }, 102 { __gen9_fw_ranges, ARRAY_SIZE(__gen9_fw_ranges), true },
103 { __gen11_fw_ranges, ARRAY_SIZE(__gen11_fw_ranges), true },
93 }; 104 };
94 int err, i; 105 int err, i;
95 106