diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_uncore.c | 157 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_uncore.h | 23 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/selftests/intel_uncore.c | 31 |
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 | ||
42 | const char * | 48 | const 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(). */ |
864 | static const i915_reg_t gen8_shadowed_regs[] = { | 889 | static 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 | ||
899 | static 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 | |||
874 | static int mmio_reg_cmp(u32 key, const i915_reg_t *reg) | 913 | static 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 | ||
886 | static bool is_gen8_shadowed(u32 offset) | 925 | #define __is_genX_shadowed(x) \ |
887 | { | 926 | static 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(). */ |
933 | static const struct intel_forcewake_range __gen9_fw_ranges[] = { | 983 | static 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(). */ | ||
1019 | static 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 | |||
968 | static void | 1052 | static void |
969 | ilk_dummy_write(struct drm_i915_private *dev_priv) | 1053 | ilk_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 | ||
44 | enum forcewake_domains { | 50 | enum 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 | ||
53 | struct intel_uncore_funcs { | 64 | struct 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 | ||
62 | static int intel_shadow_table_check(void) | 62 | static 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 | ||