Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: split out i915_reg_read_ioctl() to i915_ioctl.[ch]

Add new files i915_ioctl.[ch] to hold small ioctls that are out of place
everywhere else, and not big enough to warrant a file of their own. For
starters, it's just for i915_reg_read_ioctl() that's a bit high level
for a low level implementation that intel_uncore.[ch] is.

Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220120113346.3214745-1-jani.nikula@intel.com

+111 -74
+2 -1
drivers/gpu/drm/i915/Makefile
··· 32 32 # core driver code 33 33 i915-y += i915_driver.o \ 34 34 i915_config.o \ 35 - i915_irq.o \ 36 35 i915_getparam.o \ 36 + i915_ioctl.o \ 37 + i915_irq.o \ 37 38 i915_mitigations.o \ 38 39 i915_module.o \ 39 40 i915_params.o \
+1
drivers/gpu/drm/i915/i915_driver.c
··· 76 76 #include "i915_drv.h" 77 77 #include "i915_getparam.h" 78 78 #include "i915_ioc32.h" 79 + #include "i915_ioctl.h" 79 80 #include "i915_irq.h" 80 81 #include "i915_memcpy.h" 81 82 #include "i915_perf.h"
-3
drivers/gpu/drm/i915/i915_drv.h
··· 1716 1716 return (struct intel_device_info *)INTEL_INFO(dev_priv); 1717 1717 } 1718 1718 1719 - int i915_reg_read_ioctl(struct drm_device *dev, void *data, 1720 - struct drm_file *file); 1721 - 1722 1719 static inline int intel_hws_csb_write_index(struct drm_i915_private *i915) 1723 1720 { 1724 1721 if (GRAPHICS_VER(i915) >= 11)
+94
drivers/gpu/drm/i915/i915_ioctl.c
··· 1 + // SPDX-License-Identifier: MIT 2 + /* 3 + * Copyright © 2022 Intel Corporation 4 + */ 5 + 6 + #include "gt/intel_engine_regs.h" 7 + 8 + #include "i915_drv.h" 9 + #include "i915_gem.h" 10 + #include "i915_ioctl.h" 11 + #include "i915_reg.h" 12 + #include "intel_runtime_pm.h" 13 + #include "intel_uncore.h" 14 + 15 + /* 16 + * This file is for small ioctl functions that are out of place everywhere else, 17 + * and not big enough to warrant a file of their own. 18 + * 19 + * This is not the dumping ground for random ioctls. 20 + */ 21 + 22 + struct reg_whitelist { 23 + i915_reg_t offset_ldw; 24 + i915_reg_t offset_udw; 25 + u8 min_graphics_ver; 26 + u8 max_graphics_ver; 27 + u8 size; 28 + }; 29 + 30 + static const struct reg_whitelist reg_read_whitelist[] = { 31 + { 32 + .offset_ldw = RING_TIMESTAMP(RENDER_RING_BASE), 33 + .offset_udw = RING_TIMESTAMP_UDW(RENDER_RING_BASE), 34 + .min_graphics_ver = 4, 35 + .max_graphics_ver = 12, 36 + .size = 8 37 + } 38 + }; 39 + 40 + int i915_reg_read_ioctl(struct drm_device *dev, 41 + void *data, struct drm_file *unused) 42 + { 43 + struct drm_i915_private *i915 = to_i915(dev); 44 + struct intel_uncore *uncore = &i915->uncore; 45 + struct drm_i915_reg_read *reg = data; 46 + struct reg_whitelist const *entry; 47 + intel_wakeref_t wakeref; 48 + unsigned int flags; 49 + int remain; 50 + int ret = 0; 51 + 52 + entry = reg_read_whitelist; 53 + remain = ARRAY_SIZE(reg_read_whitelist); 54 + while (remain) { 55 + u32 entry_offset = i915_mmio_reg_offset(entry->offset_ldw); 56 + 57 + GEM_BUG_ON(!is_power_of_2(entry->size)); 58 + GEM_BUG_ON(entry->size > 8); 59 + GEM_BUG_ON(entry_offset & (entry->size - 1)); 60 + 61 + if (IS_GRAPHICS_VER(i915, entry->min_graphics_ver, entry->max_graphics_ver) && 62 + entry_offset == (reg->offset & -entry->size)) 63 + break; 64 + entry++; 65 + remain--; 66 + } 67 + 68 + if (!remain) 69 + return -EINVAL; 70 + 71 + flags = reg->offset & (entry->size - 1); 72 + 73 + with_intel_runtime_pm(&i915->runtime_pm, wakeref) { 74 + if (entry->size == 8 && flags == I915_REG_READ_8B_WA) 75 + reg->val = intel_uncore_read64_2x32(uncore, 76 + entry->offset_ldw, 77 + entry->offset_udw); 78 + else if (entry->size == 8 && flags == 0) 79 + reg->val = intel_uncore_read64(uncore, 80 + entry->offset_ldw); 81 + else if (entry->size == 4 && flags == 0) 82 + reg->val = intel_uncore_read(uncore, entry->offset_ldw); 83 + else if (entry->size == 2 && flags == 0) 84 + reg->val = intel_uncore_read16(uncore, 85 + entry->offset_ldw); 86 + else if (entry->size == 1 && flags == 0) 87 + reg->val = intel_uncore_read8(uncore, 88 + entry->offset_ldw); 89 + else 90 + ret = -EINVAL; 91 + } 92 + 93 + return ret; 94 + }
+14
drivers/gpu/drm/i915/i915_ioctl.h
··· 1 + /* SPDX-License-Identifier: MIT */ 2 + /* 3 + * Copyright © 2022 Intel Corporation 4 + */ 5 + 6 + #ifndef __I915_IOCTL_H__ 7 + #define __I915_IOCTL_H__ 8 + 9 + struct drm_device; 10 + struct drm_file; 11 + 12 + int i915_reg_read_ioctl(struct drm_device *dev, void *data, struct drm_file *file); 13 + 14 + #endif /* __I915_IOCTL_H__ */
-70
drivers/gpu/drm/i915/intel_uncore.c
··· 2265 2265 uncore_mmio_cleanup(uncore); 2266 2266 } 2267 2267 2268 - static const struct reg_whitelist { 2269 - i915_reg_t offset_ldw; 2270 - i915_reg_t offset_udw; 2271 - u8 min_graphics_ver; 2272 - u8 max_graphics_ver; 2273 - u8 size; 2274 - } reg_read_whitelist[] = { { 2275 - .offset_ldw = RING_TIMESTAMP(RENDER_RING_BASE), 2276 - .offset_udw = RING_TIMESTAMP_UDW(RENDER_RING_BASE), 2277 - .min_graphics_ver = 4, 2278 - .max_graphics_ver = 12, 2279 - .size = 8 2280 - } }; 2281 - 2282 - int i915_reg_read_ioctl(struct drm_device *dev, 2283 - void *data, struct drm_file *file) 2284 - { 2285 - struct drm_i915_private *i915 = to_i915(dev); 2286 - struct intel_uncore *uncore = &i915->uncore; 2287 - struct drm_i915_reg_read *reg = data; 2288 - struct reg_whitelist const *entry; 2289 - intel_wakeref_t wakeref; 2290 - unsigned int flags; 2291 - int remain; 2292 - int ret = 0; 2293 - 2294 - entry = reg_read_whitelist; 2295 - remain = ARRAY_SIZE(reg_read_whitelist); 2296 - while (remain) { 2297 - u32 entry_offset = i915_mmio_reg_offset(entry->offset_ldw); 2298 - 2299 - GEM_BUG_ON(!is_power_of_2(entry->size)); 2300 - GEM_BUG_ON(entry->size > 8); 2301 - GEM_BUG_ON(entry_offset & (entry->size - 1)); 2302 - 2303 - if (IS_GRAPHICS_VER(i915, entry->min_graphics_ver, entry->max_graphics_ver) && 2304 - entry_offset == (reg->offset & -entry->size)) 2305 - break; 2306 - entry++; 2307 - remain--; 2308 - } 2309 - 2310 - if (!remain) 2311 - return -EINVAL; 2312 - 2313 - flags = reg->offset & (entry->size - 1); 2314 - 2315 - with_intel_runtime_pm(&i915->runtime_pm, wakeref) { 2316 - if (entry->size == 8 && flags == I915_REG_READ_8B_WA) 2317 - reg->val = intel_uncore_read64_2x32(uncore, 2318 - entry->offset_ldw, 2319 - entry->offset_udw); 2320 - else if (entry->size == 8 && flags == 0) 2321 - reg->val = intel_uncore_read64(uncore, 2322 - entry->offset_ldw); 2323 - else if (entry->size == 4 && flags == 0) 2324 - reg->val = intel_uncore_read(uncore, entry->offset_ldw); 2325 - else if (entry->size == 2 && flags == 0) 2326 - reg->val = intel_uncore_read16(uncore, 2327 - entry->offset_ldw); 2328 - else if (entry->size == 1 && flags == 0) 2329 - reg->val = intel_uncore_read8(uncore, 2330 - entry->offset_ldw); 2331 - else 2332 - ret = -EINVAL; 2333 - } 2334 - 2335 - return ret; 2336 - } 2337 - 2338 2268 /** 2339 2269 * __intel_wait_for_register_fw - wait until register matches expected state 2340 2270 * @uncore: the struct intel_uncore