diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_uncore.c | 25 | ||||
-rw-r--r-- | include/uapi/drm/i915_drm.h | 6 |
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 | ||
1263 | static const struct register_whitelist { | 1263 | static 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 | ||
1272 | int i915_reg_read_ioctl(struct drm_device *dev, | 1274 | int 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 | ||
1081 | struct drm_i915_reg_read { | 1081 | struct 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 | }; |