diff options
author | Zou Nan hai <nanhai.zou@intel.com> | 2010-11-09 04:17:32 -0500 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-11-11 12:45:54 -0500 |
commit | cae5852dcaa1139b198e13ebd3aeb7f3c065f875 (patch) | |
tree | 7a6789974c1e5d2f76cf21fb6c8fd1df8711c2ab /drivers/gpu/drm/i915/i915_drv.h | |
parent | 527f9e907c39f7e88abb57eaa8bccb43c8706a3d (diff) |
drm/i915/ringbuffer: set FORCE_WAKE bit before reading ring register
Before reading ring register, set FORCE_WAKE bit to prevent GT core
power down to low power state, otherwise we may read stale values.
Signed-off-by: Zou Nan hai <nanhai.zou@intel.com>
[ickle: added a udelay which seemed to do the trick on my SNB]
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.h')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 176 |
1 files changed, 95 insertions, 81 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 30d7a7bc6f2e..ecf12f9de1e0 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -876,6 +876,67 @@ enum intel_chip_family { | |||
876 | CHIP_I965 = 0x08, | 876 | CHIP_I965 = 0x08, |
877 | }; | 877 | }; |
878 | 878 | ||
879 | #define INTEL_INFO(dev) (((struct drm_i915_private *) (dev)->dev_private)->info) | ||
880 | |||
881 | #define IS_I830(dev) ((dev)->pci_device == 0x3577) | ||
882 | #define IS_845G(dev) ((dev)->pci_device == 0x2562) | ||
883 | #define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x) | ||
884 | #define IS_I865G(dev) ((dev)->pci_device == 0x2572) | ||
885 | #define IS_I915G(dev) (INTEL_INFO(dev)->is_i915g) | ||
886 | #define IS_I915GM(dev) ((dev)->pci_device == 0x2592) | ||
887 | #define IS_I945G(dev) ((dev)->pci_device == 0x2772) | ||
888 | #define IS_I945GM(dev) (INTEL_INFO(dev)->is_i945gm) | ||
889 | #define IS_BROADWATER(dev) (INTEL_INFO(dev)->is_broadwater) | ||
890 | #define IS_CRESTLINE(dev) (INTEL_INFO(dev)->is_crestline) | ||
891 | #define IS_GM45(dev) ((dev)->pci_device == 0x2A42) | ||
892 | #define IS_G4X(dev) (INTEL_INFO(dev)->is_g4x) | ||
893 | #define IS_PINEVIEW_G(dev) ((dev)->pci_device == 0xa001) | ||
894 | #define IS_PINEVIEW_M(dev) ((dev)->pci_device == 0xa011) | ||
895 | #define IS_PINEVIEW(dev) (INTEL_INFO(dev)->is_pineview) | ||
896 | #define IS_G33(dev) (INTEL_INFO(dev)->is_g33) | ||
897 | #define IS_IRONLAKE_D(dev) ((dev)->pci_device == 0x0042) | ||
898 | #define IS_IRONLAKE_M(dev) ((dev)->pci_device == 0x0046) | ||
899 | #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) | ||
900 | |||
901 | #define IS_GEN2(dev) (INTEL_INFO(dev)->gen == 2) | ||
902 | #define IS_GEN3(dev) (INTEL_INFO(dev)->gen == 3) | ||
903 | #define IS_GEN4(dev) (INTEL_INFO(dev)->gen == 4) | ||
904 | #define IS_GEN5(dev) (INTEL_INFO(dev)->gen == 5) | ||
905 | #define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6) | ||
906 | |||
907 | #define HAS_BSD(dev) (INTEL_INFO(dev)->has_bsd_ring) | ||
908 | #define HAS_BLT(dev) (INTEL_INFO(dev)->has_blt_ring) | ||
909 | #define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws) | ||
910 | |||
911 | #define HAS_OVERLAY(dev) (INTEL_INFO(dev)->has_overlay) | ||
912 | #define OVERLAY_NEEDS_PHYSICAL(dev) (INTEL_INFO(dev)->overlay_needs_physical) | ||
913 | |||
914 | /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte | ||
915 | * rows, which changed the alignment requirements and fence programming. | ||
916 | */ | ||
917 | #define HAS_128_BYTE_Y_TILING(dev) (!IS_GEN2(dev) && !(IS_I915G(dev) || \ | ||
918 | IS_I915GM(dev))) | ||
919 | #define SUPPORTS_DIGITAL_OUTPUTS(dev) (!IS_GEN2(dev) && !IS_PINEVIEW(dev)) | ||
920 | #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_GEN5(dev)) | ||
921 | #define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_GEN5(dev)) | ||
922 | #define SUPPORTS_EDP(dev) (IS_IRONLAKE_M(dev)) | ||
923 | #define SUPPORTS_TV(dev) (INTEL_INFO(dev)->supports_tv) | ||
924 | #define I915_HAS_HOTPLUG(dev) (INTEL_INFO(dev)->has_hotplug) | ||
925 | /* dsparb controlled by hw only */ | ||
926 | #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) | ||
927 | |||
928 | #define HAS_FW_BLC(dev) (INTEL_INFO(dev)->gen > 2) | ||
929 | #define HAS_PIPE_CXSR(dev) (INTEL_INFO(dev)->has_pipe_cxsr) | ||
930 | #define I915_HAS_FBC(dev) (INTEL_INFO(dev)->has_fbc) | ||
931 | #define I915_HAS_RC6(dev) (INTEL_INFO(dev)->has_rc6) | ||
932 | |||
933 | #define HAS_PCH_SPLIT(dev) (IS_GEN5(dev) || IS_GEN6(dev)) | ||
934 | #define HAS_PIPE_CONTROL(dev) (IS_GEN5(dev) || IS_GEN6(dev)) | ||
935 | |||
936 | #define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type) | ||
937 | #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) | ||
938 | #define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX) | ||
939 | |||
879 | extern struct drm_ioctl_desc i915_ioctls[]; | 940 | extern struct drm_ioctl_desc i915_ioctls[]; |
880 | extern int i915_max_ioctl; | 941 | extern int i915_max_ioctl; |
881 | extern unsigned int i915_fbpercrtc; | 942 | extern unsigned int i915_fbpercrtc; |
@@ -1174,6 +1235,23 @@ extern void intel_overlay_print_error_state(struct seq_file *m, struct intel_ove | |||
1174 | LOCK_TEST_WITH_RETURN(dev, file_priv); \ | 1235 | LOCK_TEST_WITH_RETURN(dev, file_priv); \ |
1175 | } while (0) | 1236 | } while (0) |
1176 | 1237 | ||
1238 | #define I915_READ(reg) i915_read(dev_priv, (reg), 4) | ||
1239 | #define I915_WRITE(reg, val) i915_write(dev_priv, (reg), (val), 4) | ||
1240 | #define I915_READ16(reg) i915_read(dev_priv, (reg), 2) | ||
1241 | #define I915_WRITE16(reg, val) i915_write(dev_priv, (reg), (val), 2) | ||
1242 | #define I915_READ8(reg) i915_read(dev_priv, (reg), 1) | ||
1243 | #define I915_WRITE8(reg, val) i915_write(dev_priv, (reg), (val), 1) | ||
1244 | #define I915_WRITE64(reg, val) i915_write(dev_priv, (reg), (val), 8) | ||
1245 | #define I915_READ64(reg) i915_read(dev_priv, (reg), 8) | ||
1246 | |||
1247 | #define I915_READ_NOTRACE(reg) readl(dev_priv->regs + (reg)) | ||
1248 | #define I915_WRITE_NOTRACE(reg, val) writel(val, dev_priv->regs + (reg)) | ||
1249 | #define I915_READ16_NOTRACE(reg) readw(dev_priv->regs + (reg)) | ||
1250 | #define I915_WRITE16_NOTRACE(reg, val) writew(val, dev_priv->regs + (reg)) | ||
1251 | |||
1252 | #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) | ||
1253 | #define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) | ||
1254 | |||
1177 | static inline u32 i915_read(struct drm_i915_private *dev_priv, u32 reg, int len) | 1255 | static inline u32 i915_read(struct drm_i915_private *dev_priv, u32 reg, int len) |
1178 | { | 1256 | { |
1179 | u64 val = 0; | 1257 | u64 val = 0; |
@@ -1197,6 +1275,23 @@ static inline u32 i915_read(struct drm_i915_private *dev_priv, u32 reg, int len) | |||
1197 | return val; | 1275 | return val; |
1198 | } | 1276 | } |
1199 | 1277 | ||
1278 | /* On SNB platform, before reading ring registers forcewake bit | ||
1279 | * must be set to prevent GT core from power down and stale values being | ||
1280 | * returned. | ||
1281 | */ | ||
1282 | static inline u32 i915_safe_read(struct drm_i915_private *dev_priv, u32 reg) | ||
1283 | { | ||
1284 | if (IS_GEN6(dev_priv->dev)) { | ||
1285 | I915_WRITE_NOTRACE(FORCEWAKE, 1); | ||
1286 | POSTING_READ(FORCEWAKE); | ||
1287 | /* XXX How long do we really need to wait here? | ||
1288 | * Will different registers/engines require different periods? | ||
1289 | */ | ||
1290 | udelay(100); | ||
1291 | } | ||
1292 | return I915_READ(reg); | ||
1293 | } | ||
1294 | |||
1200 | static inline void | 1295 | static inline void |
1201 | i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) | 1296 | i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) |
1202 | { | 1297 | { |
@@ -1218,24 +1313,6 @@ i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) | |||
1218 | } | 1313 | } |
1219 | } | 1314 | } |
1220 | 1315 | ||
1221 | #define I915_READ(reg) i915_read(dev_priv, (reg), 4) | ||
1222 | #define I915_WRITE(reg, val) i915_write(dev_priv, (reg), (val), 4) | ||
1223 | #define I915_READ16(reg) i915_read(dev_priv, (reg), 2) | ||
1224 | #define I915_WRITE16(reg, val) i915_write(dev_priv, (reg), (val), 2) | ||
1225 | #define I915_READ8(reg) i915_read(dev_priv, (reg), 1) | ||
1226 | #define I915_WRITE8(reg, val) i915_write(dev_priv, (reg), (val), 1) | ||
1227 | #define I915_WRITE64(reg, val) i915_write(dev_priv, (reg), (val), 8) | ||
1228 | #define I915_READ64(reg) i915_read(dev_priv, (reg), 8) | ||
1229 | |||
1230 | #define I915_READ_NOTRACE(reg) readl(dev_priv->regs + (reg)) | ||
1231 | #define I915_WRITE_NOTRACE(reg, val) writel(val, dev_priv->regs + (reg)) | ||
1232 | #define I915_READ16_NOTRACE(reg) readw(dev_priv->regs + (reg)) | ||
1233 | #define I915_WRITE16_NOTRACE(reg, val) writew(val, dev_priv->regs + (reg)) | ||
1234 | |||
1235 | #define POSTING_READ(reg) (void)I915_READ_NOTRACE(reg) | ||
1236 | #define POSTING_READ16(reg) (void)I915_READ16_NOTRACE(reg) | ||
1237 | |||
1238 | |||
1239 | #define BEGIN_LP_RING(n) \ | 1316 | #define BEGIN_LP_RING(n) \ |
1240 | intel_ring_begin(&dev_priv->render_ring, (n)) | 1317 | intel_ring_begin(&dev_priv->render_ring, (n)) |
1241 | 1318 | ||
@@ -1266,67 +1343,4 @@ i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) | |||
1266 | #define I915_GEM_HWS_INDEX 0x20 | 1343 | #define I915_GEM_HWS_INDEX 0x20 |
1267 | #define I915_BREADCRUMB_INDEX 0x21 | 1344 | #define I915_BREADCRUMB_INDEX 0x21 |
1268 | 1345 | ||
1269 | #define INTEL_INFO(dev) (((struct drm_i915_private *) (dev)->dev_private)->info) | ||
1270 | |||
1271 | #define IS_I830(dev) ((dev)->pci_device == 0x3577) | ||
1272 | #define IS_845G(dev) ((dev)->pci_device == 0x2562) | ||
1273 | #define IS_I85X(dev) (INTEL_INFO(dev)->is_i85x) | ||
1274 | #define IS_I865G(dev) ((dev)->pci_device == 0x2572) | ||
1275 | #define IS_I915G(dev) (INTEL_INFO(dev)->is_i915g) | ||
1276 | #define IS_I915GM(dev) ((dev)->pci_device == 0x2592) | ||
1277 | #define IS_I945G(dev) ((dev)->pci_device == 0x2772) | ||
1278 | #define IS_I945GM(dev) (INTEL_INFO(dev)->is_i945gm) | ||
1279 | #define IS_BROADWATER(dev) (INTEL_INFO(dev)->is_broadwater) | ||
1280 | #define IS_CRESTLINE(dev) (INTEL_INFO(dev)->is_crestline) | ||
1281 | #define IS_GM45(dev) ((dev)->pci_device == 0x2A42) | ||
1282 | #define IS_G4X(dev) (INTEL_INFO(dev)->is_g4x) | ||
1283 | #define IS_PINEVIEW_G(dev) ((dev)->pci_device == 0xa001) | ||
1284 | #define IS_PINEVIEW_M(dev) ((dev)->pci_device == 0xa011) | ||
1285 | #define IS_PINEVIEW(dev) (INTEL_INFO(dev)->is_pineview) | ||
1286 | #define IS_G33(dev) (INTEL_INFO(dev)->is_g33) | ||
1287 | #define IS_IRONLAKE_D(dev) ((dev)->pci_device == 0x0042) | ||
1288 | #define IS_IRONLAKE_M(dev) ((dev)->pci_device == 0x0046) | ||
1289 | #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) | ||
1290 | |||
1291 | #define IS_GEN2(dev) (INTEL_INFO(dev)->gen == 2) | ||
1292 | #define IS_GEN3(dev) (INTEL_INFO(dev)->gen == 3) | ||
1293 | #define IS_GEN4(dev) (INTEL_INFO(dev)->gen == 4) | ||
1294 | #define IS_GEN5(dev) (INTEL_INFO(dev)->gen == 5) | ||
1295 | #define IS_GEN6(dev) (INTEL_INFO(dev)->gen == 6) | ||
1296 | |||
1297 | #define HAS_BSD(dev) (INTEL_INFO(dev)->has_bsd_ring) | ||
1298 | #define HAS_BLT(dev) (INTEL_INFO(dev)->has_blt_ring) | ||
1299 | #define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws) | ||
1300 | |||
1301 | #define HAS_OVERLAY(dev) (INTEL_INFO(dev)->has_overlay) | ||
1302 | #define OVERLAY_NEEDS_PHYSICAL(dev) (INTEL_INFO(dev)->overlay_needs_physical) | ||
1303 | |||
1304 | /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte | ||
1305 | * rows, which changed the alignment requirements and fence programming. | ||
1306 | */ | ||
1307 | #define HAS_128_BYTE_Y_TILING(dev) (!IS_GEN2(dev) && !(IS_I915G(dev) || \ | ||
1308 | IS_I915GM(dev))) | ||
1309 | #define SUPPORTS_DIGITAL_OUTPUTS(dev) (!IS_GEN2(dev) && !IS_PINEVIEW(dev)) | ||
1310 | #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_GEN5(dev)) | ||
1311 | #define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_GEN5(dev)) | ||
1312 | #define SUPPORTS_EDP(dev) (IS_IRONLAKE_M(dev)) | ||
1313 | #define SUPPORTS_TV(dev) (INTEL_INFO(dev)->supports_tv) | ||
1314 | #define I915_HAS_HOTPLUG(dev) (INTEL_INFO(dev)->has_hotplug) | ||
1315 | /* dsparb controlled by hw only */ | ||
1316 | #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IRONLAKE(dev)) | ||
1317 | |||
1318 | #define HAS_FW_BLC(dev) (INTEL_INFO(dev)->gen > 2) | ||
1319 | #define HAS_PIPE_CXSR(dev) (INTEL_INFO(dev)->has_pipe_cxsr) | ||
1320 | #define I915_HAS_FBC(dev) (INTEL_INFO(dev)->has_fbc) | ||
1321 | #define I915_HAS_RC6(dev) (INTEL_INFO(dev)->has_rc6) | ||
1322 | |||
1323 | #define HAS_PCH_SPLIT(dev) (IS_GEN5(dev) || IS_GEN6(dev)) | ||
1324 | #define HAS_PIPE_CONTROL(dev) (IS_GEN5(dev) || IS_GEN6(dev)) | ||
1325 | |||
1326 | #define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type) | ||
1327 | #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) | ||
1328 | #define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX) | ||
1329 | |||
1330 | #define PRIMARY_RINGBUFFER_SIZE (128*1024) | ||
1331 | |||
1332 | #endif | 1346 | #endif |