From ff39db099b9ca6c8feee68101a2269345b7bd798 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 11 May 2008 00:10:16 -0700 Subject: [GEM] Make pread/pwrite manage memory domains. No luck with movnti though. pread and pwrite must update the memory domains to ensure consistency with the GPU. At some point, it should be possible to avoid clflush through this path, but that isn't working for me. --- linux-core/drm_gem.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'linux-core/drm_gem.c') diff --git a/linux-core/drm_gem.c b/linux-core/drm_gem.c index 6c462921..14cf7e47 100644 --- a/linux-core/drm_gem.c +++ b/linux-core/drm_gem.c @@ -266,6 +266,7 @@ drm_gem_pread_ioctl(struct drm_device *dev, void *data, struct drm_gem_object *obj; ssize_t read; loff_t offset; + int ret; if (!(dev->driver->driver_features & DRIVER_GEM)) return -ENODEV; @@ -274,6 +275,15 @@ drm_gem_pread_ioctl(struct drm_device *dev, void *data, if (obj == NULL) return -EINVAL; + if (dev->driver->gem_set_domain) { + ret = dev->driver->gem_set_domain (obj, + DRM_GEM_DOMAIN_CPU, + 0); + if (ret) { + drm_gem_object_unreference(obj); + return ret; + } + } offset = args->offset; read = vfs_read(obj->filp, (char __user *)(uintptr_t)args->data_ptr, @@ -343,6 +353,7 @@ drm_gem_pwrite_ioctl(struct drm_device *dev, void *data, struct drm_gem_object *obj; ssize_t written; loff_t offset; + int ret; if (!(dev->driver->driver_features & DRIVER_GEM)) return -ENODEV; @@ -351,11 +362,21 @@ drm_gem_pwrite_ioctl(struct drm_device *dev, void *data, if (obj == NULL) return -EINVAL; + if (dev->driver->gem_set_domain) { + ret = dev->driver->gem_set_domain (obj, + DRM_GEM_DOMAIN_CPU, + 0); + if (ret) { + drm_gem_object_unreference(obj); + return ret; + } + } offset = args->offset; written = vfs_write(obj->filp, (char __user *)(uintptr_t) args->data_ptr, args->size, &offset); + if (written != args->size) { drm_gem_object_unreference(obj); if (written < 0) @@ -364,6 +385,11 @@ drm_gem_pwrite_ioctl(struct drm_device *dev, void *data, return -EINVAL; } + if (dev->driver->gem_flush_pwrite) + dev->driver->gem_flush_pwrite(obj, + args->offset, + args->size); + drm_gem_object_unreference(obj); return 0; -- cgit v1.2.3