static int guc_log_map(struct intel_guc_log *log) { struct intel_guc *guc = log_to_guc(log); struct drm_i915_private *dev_priv = guc_to_i915(guc); void *vaddr; int ret; lockdep_assert_held(&log->relay.lock); if (!log->vma) return -ENODEV; mutex_lock(&dev_priv->drm.struct_mutex); ret = i915_gem_object_set_to_wc_domain(log->vma->obj, true); mutex_unlock(&dev_priv->drm.struct_mutex); if (ret) return ret; /* * Create a WC (Uncached for read) vmalloc mapping of log * buffer pages, so that we can directly get the data * (up-to-date) from memory. */ vaddr = i915_gem_object_pin_map(log->vma->obj, I915_MAP_WC); if (IS_ERR(vaddr)) { DRM_ERROR("Couldn't map log buffer pages %d\n", ret); return PTR_ERR(vaddr); } log->relay.buf_addr = vaddr; return 0; }
static int wc_get(struct drm_i915_gem_object *obj, unsigned long offset, u32 *v) { u32 *map; int err; err = i915_gem_object_set_to_wc_domain(obj, false); if (err) return err; map = i915_gem_object_pin_map(obj, I915_MAP_WC); if (IS_ERR(map)) return PTR_ERR(map); *v = map[offset / sizeof(*map)]; i915_gem_object_unpin_map(obj); return 0; }