aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_drv.h
diff options
context:
space:
mode:
authorZou Nan hai <nanhai.zou@intel.com>2010-11-09 04:17:32 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2010-11-11 12:45:54 -0500
commitcae5852dcaa1139b198e13ebd3aeb7f3c065f875 (patch)
tree7a6789974c1e5d2f76cf21fb6c8fd1df8711c2ab /drivers/gpu/drm/i915/i915_drv.h
parent527f9e907c39f7e88abb57eaa8bccb43c8706a3d (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.h176
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
879extern struct drm_ioctl_desc i915_ioctls[]; 940extern struct drm_ioctl_desc i915_ioctls[];
880extern int i915_max_ioctl; 941extern int i915_max_ioctl;
881extern unsigned int i915_fbpercrtc; 942extern 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
1177static inline u32 i915_read(struct drm_i915_private *dev_priv, u32 reg, int len) 1255static 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 */
1282static 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
1200static inline void 1295static inline void
1201i915_write(struct drm_i915_private *dev_priv, u32 reg, u64 val, int len) 1296i915_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