Commit 4db9a82f authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-intel-fixes-2015-07-23' of git://anongit.freedesktop.org/drm-intel into drm-fixes

arb_timer kernel side fix from Chris.

* tag 'drm-intel-fixes-2015-07-23' of git://anongit.freedesktop.org/drm-intel:
  drm/i915: Use two 32bit reads for select 64bit REG_READ ioctls
parents 762043aa 648a9bc5
...@@ -1274,10 +1274,12 @@ int i915_reg_read_ioctl(struct drm_device *dev, ...@@ -1274,10 +1274,12 @@ int i915_reg_read_ioctl(struct drm_device *dev,
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
struct drm_i915_reg_read *reg = data; struct drm_i915_reg_read *reg = data;
struct register_whitelist const *entry = whitelist; struct register_whitelist const *entry = whitelist;
unsigned size;
u64 offset;
int i, ret = 0; int i, ret = 0;
for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) { for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) {
if (entry->offset == reg->offset && if (entry->offset == (reg->offset & -entry->size) &&
(1 << INTEL_INFO(dev)->gen & entry->gen_bitmask)) (1 << INTEL_INFO(dev)->gen & entry->gen_bitmask))
break; break;
} }
...@@ -1285,23 +1287,33 @@ int i915_reg_read_ioctl(struct drm_device *dev, ...@@ -1285,23 +1287,33 @@ int i915_reg_read_ioctl(struct drm_device *dev,
if (i == ARRAY_SIZE(whitelist)) if (i == ARRAY_SIZE(whitelist))
return -EINVAL; return -EINVAL;
/* We use the low bits to encode extra flags as the register should
* be naturally aligned (and those that are not so aligned merely
* limit the available flags for that register).
*/
offset = entry->offset;
size = entry->size;
size |= reg->offset ^ offset;
intel_runtime_pm_get(dev_priv); intel_runtime_pm_get(dev_priv);
switch (entry->size) { switch (size) {
case 8 | 1:
reg->val = I915_READ64_2x32(offset, offset+4);
break;
case 8: case 8:
reg->val = I915_READ64(reg->offset); reg->val = I915_READ64(offset);
break; break;
case 4: case 4:
reg->val = I915_READ(reg->offset); reg->val = I915_READ(offset);
break; break;
case 2: case 2:
reg->val = I915_READ16(reg->offset); reg->val = I915_READ16(offset);
break; break;
case 1: case 1:
reg->val = I915_READ8(reg->offset); reg->val = I915_READ8(offset);
break; break;
default: default:
MISSING_CASE(entry->size);
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
......
...@@ -1070,6 +1070,14 @@ struct drm_i915_reg_read { ...@@ -1070,6 +1070,14 @@ struct drm_i915_reg_read {
__u64 offset; __u64 offset;
__u64 val; /* Return value */ __u64 val; /* Return value */
}; };
/* Known registers:
*
* Render engine timestamp - 0x2358 + 64bit - gen7+
* - Note this register returns an invalid value if using the default
* single instruction 8byte read, in order to workaround that use
* offset (0x2538 | 1) instead.
*
*/
struct drm_i915_reset_stats { struct drm_i915_reset_stats {
__u32 ctx_id; __u32 ctx_id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment