aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h3
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c25
-rw-r--r--include/uapi/drm/i915_drm.h6
3 files changed, 22 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index fc586fbd96b5..e4e57a51425e 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -1573,7 +1573,8 @@ enum skl_disp_power_wells {
1573#define RING_NOPID(base) ((base)+0x94) 1573#define RING_NOPID(base) ((base)+0x94)
1574#define RING_IMR(base) ((base)+0xa8) 1574#define RING_IMR(base) ((base)+0xa8)
1575#define RING_HWSTAM(base) ((base)+0x98) 1575#define RING_HWSTAM(base) ((base)+0x98)
1576#define RING_TIMESTAMP(base) ((base)+0x358) 1576#define RING_TIMESTAMP(base) ((base)+0x358)
1577#define RING_TIMESTAMP_UDW(base) ((base)+0x358 + 4)
1577#define TAIL_ADDR 0x001FFFF8 1578#define TAIL_ADDR 0x001FFFF8
1578#define HEAD_WRAP_COUNT 0xFFE00000 1579#define HEAD_WRAP_COUNT 0xFFE00000
1579#define HEAD_WRAP_ONE 0x00200000 1580#define HEAD_WRAP_ONE 0x00200000
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index f0f97b288d0e..03fdfbd3484c 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -1261,12 +1261,14 @@ void intel_uncore_fini(struct drm_device *dev)
1261#define GEN_RANGE(l, h) GENMASK(h, l) 1261#define GEN_RANGE(l, h) GENMASK(h, l)
1262 1262
1263static const struct register_whitelist { 1263static const struct register_whitelist {
1264 uint64_t offset; 1264 uint32_t offset_ldw, offset_udw;
1265 uint32_t size; 1265 uint32_t size;
1266 /* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */ 1266 /* supported gens, 0x10 for 4, 0x30 for 4 and 5, etc. */
1267 uint32_t gen_bitmask; 1267 uint32_t gen_bitmask;
1268} whitelist[] = { 1268} whitelist[] = {
1269 { RING_TIMESTAMP(RENDER_RING_BASE), 8, GEN_RANGE(4, 9) }, 1269 { .offset_ldw = RING_TIMESTAMP(RENDER_RING_BASE),
1270 .offset_udw = RING_TIMESTAMP_UDW(RENDER_RING_BASE),
1271 .size = 8, .gen_bitmask = GEN_RANGE(4, 9) },
1270}; 1272};
1271 1273
1272int i915_reg_read_ioctl(struct drm_device *dev, 1274int i915_reg_read_ioctl(struct drm_device *dev,
@@ -1276,11 +1278,11 @@ int i915_reg_read_ioctl(struct drm_device *dev,
1276 struct drm_i915_reg_read *reg = data; 1278 struct drm_i915_reg_read *reg = data;
1277 struct register_whitelist const *entry = whitelist; 1279 struct register_whitelist const *entry = whitelist;
1278 unsigned size; 1280 unsigned size;
1279 u64 offset; 1281 uint32_t offset_ldw, offset_udw;
1280 int i, ret = 0; 1282 int i, ret = 0;
1281 1283
1282 for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) { 1284 for (i = 0; i < ARRAY_SIZE(whitelist); i++, entry++) {
1283 if (entry->offset == (reg->offset & -entry->size) && 1285 if (entry->offset_ldw == (reg->offset & -entry->size) &&
1284 (1 << INTEL_INFO(dev)->gen & entry->gen_bitmask)) 1286 (1 << INTEL_INFO(dev)->gen & entry->gen_bitmask))
1285 break; 1287 break;
1286 } 1288 }
@@ -1292,27 +1294,28 @@ int i915_reg_read_ioctl(struct drm_device *dev,
1292 * be naturally aligned (and those that are not so aligned merely 1294 * be naturally aligned (and those that are not so aligned merely
1293 * limit the available flags for that register). 1295 * limit the available flags for that register).
1294 */ 1296 */
1295 offset = entry->offset; 1297 offset_ldw = entry->offset_ldw;
1298 offset_udw = entry->offset_udw;
1296 size = entry->size; 1299 size = entry->size;
1297 size |= reg->offset ^ offset; 1300 size |= reg->offset ^ offset_ldw;
1298 1301
1299 intel_runtime_pm_get(dev_priv); 1302 intel_runtime_pm_get(dev_priv);
1300 1303
1301 switch (size) { 1304 switch (size) {
1302 case 8 | 1: 1305 case 8 | 1:
1303 reg->val = I915_READ64_2x32(offset, offset+4); 1306 reg->val = I915_READ64_2x32(offset_ldw, offset_udw);
1304 break; 1307 break;
1305 case 8: 1308 case 8:
1306 reg->val = I915_READ64(offset); 1309 reg->val = I915_READ64(offset_ldw);
1307 break; 1310 break;
1308 case 4: 1311 case 4:
1309 reg->val = I915_READ(offset); 1312 reg->val = I915_READ(offset_ldw);
1310 break; 1313 break;
1311 case 2: 1314 case 2:
1312 reg->val = I915_READ16(offset); 1315 reg->val = I915_READ16(offset_ldw);
1313 break; 1316 break;
1314 case 1: 1317 case 1:
1315 reg->val = I915_READ8(offset); 1318 reg->val = I915_READ8(offset_ldw);
1316 break; 1319 break;
1317 default: 1320 default:
1318 ret = -EINVAL; 1321 ret = -EINVAL;
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index 67cebe6d978f..67ef73a5d6eb 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -1079,6 +1079,12 @@ struct drm_i915_gem_context_destroy {
1079}; 1079};
1080 1080
1081struct drm_i915_reg_read { 1081struct drm_i915_reg_read {
1082 /*
1083 * Register offset.
1084 * For 64bit wide registers where the upper 32bits don't immediately
1085 * follow the lower 32bits, the offset of the lower 32bits must
1086 * be specified
1087 */
1082 __u64 offset; 1088 __u64 offset;
1083 __u64 val; /* Return value */ 1089 __u64 val; /* Return value */
1084}; 1090};