From patchwork Wed Mar 10 22:45:23 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 84739 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o2AMksSG006706 for ; Wed, 10 Mar 2010 22:47:35 GMT Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9DAF39F698; Wed, 10 Mar 2010 14:46:52 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTP id 14E679F5E6 for ; Wed, 10 Mar 2010 14:46:34 -0800 (PST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 10 Mar 2010 14:44:22 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.49,616,1262592000"; d="scan'208";a="499618744" Received: from unknown (HELO localhost.localdomain) ([10.255.13.214]) by orsmga002.jf.intel.com with ESMTP; 10 Mar 2010 14:45:48 -0800 From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Wed, 10 Mar 2010 22:45:23 +0000 Message-Id: <1268261124-13653-37-git-send-email-chris@chris-wilson.co.uk> X-Mailer: git-send-email 1.7.0 In-Reply-To: <1268261124-13653-1-git-send-email-chris@chris-wilson.co.uk> References: <1268261124-13653-1-git-send-email-chris@chris-wilson.co.uk> Subject: [Intel-gfx] [PATCH 36/37] drm/i915: iomem fixes for GEM interface X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Wed, 10 Mar 2010 22:47:35 +0000 (UTC) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 1dc352b..a676646 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -144,7 +144,7 @@ fast_shmem_read(struct page **pages, char __user *data, int length) { - char __iomem *vaddr; + void *vaddr; int unwritten; vaddr = kmap_atomic(pages[page_base >> PAGE_SHIFT], KM_USER0); @@ -175,7 +175,7 @@ slow_shmem_copy(struct page *dst_page, int src_offset, int length) { - char *dst_vaddr, *src_vaddr; + void *dst_vaddr, *src_vaddr; dst_vaddr = kmap_atomic(dst_page, KM_USER0); if (dst_vaddr == NULL) @@ -203,7 +203,7 @@ slow_shmem_bit17_copy(struct page *gpu_page, int length, int is_read) { - char *gpu_vaddr, *cpu_vaddr; + void *gpu_vaddr, *cpu_vaddr; /* Use the unswizzled path if this page isn't affected. */ if ((page_to_phys(gpu_page) & (1 << 17)) == 0) { @@ -509,12 +509,12 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, */ static inline int -fast_user_write(struct io_mapping *mapping, +fast_user_write(struct io_mapping __iomem *mapping, loff_t page_base, int page_offset, char __user *user_data, int length) { - char *vaddr_atomic; + void __iomem *vaddr_atomic; unsigned long unwritten; vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base); @@ -530,25 +530,22 @@ fast_user_write(struct io_mapping *mapping, * page faults */ -static inline int -slow_kernel_write(struct io_mapping *mapping, +static inline void +slow_kernel_write(struct io_mapping __iomem *mapping, loff_t gtt_base, int gtt_offset, struct page *user_page, int user_offset, int length) { - char *src_vaddr, *dst_vaddr; - unsigned long unwritten; - - dst_vaddr = io_mapping_map_atomic_wc(mapping, gtt_base); - src_vaddr = kmap_atomic(user_page, KM_USER1); - unwritten = __copy_from_user_inatomic_nocache(dst_vaddr + gtt_offset, - src_vaddr + user_offset, - length); - kunmap_atomic(src_vaddr, KM_USER1); - io_mapping_unmap_atomic(dst_vaddr); - if (unwritten) - return -EFAULT; - return 0; + void __iomem *dst_vaddr; + void *src_vaddr; + + dst_vaddr = io_mapping_map_wc(mapping, gtt_base); + src_vaddr = kmap(user_page); + memcpy_toio(dst_vaddr + gtt_offset, + src_vaddr + user_offset, + length); + kunmap(src_vaddr); + io_mapping_unmap(dst_vaddr); } static inline int @@ -557,7 +554,7 @@ fast_shmem_write(struct page **pages, char __user *data, int length) { - char __iomem *vaddr; + void *vaddr; unsigned long unwritten; vaddr = kmap_atomic(pages[page_base >> PAGE_SHIFT], KM_USER0); @@ -721,18 +718,11 @@ i915_gem_gtt_pwrite_slow(struct drm_device *dev, struct drm_gem_object *obj, if ((data_page_offset + page_length) > PAGE_SIZE) page_length = PAGE_SIZE - data_page_offset; - ret = slow_kernel_write(dev_priv->mm.gtt_mapping, - gtt_page_base, gtt_page_offset, - user_pages[data_page_index], - data_page_offset, - page_length); - - /* If we get a fault while copying data, then (presumably) our - * source page isn't available. Return the error and we'll - * retry in the slow path. - */ - if (ret) - goto out_unpin_object; + slow_kernel_write(dev_priv->mm.gtt_mapping, + gtt_page_base, gtt_page_offset, + user_pages[data_page_index], + data_page_offset, + page_length); remain -= page_length; offset += page_length; @@ -3276,7 +3266,6 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj, drm_i915_private_t *dev_priv = dev->dev_private; struct drm_i915_gem_object *obj_priv = obj->driver_private; int i, ret; - void __iomem *reloc_page; bool need_fence; need_fence = entry->flags & EXEC_OBJECT_NEEDS_FENCE && @@ -3321,7 +3310,8 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj, struct drm_gem_object *target_obj; struct drm_i915_gem_object *target_obj_priv; uint32_t reloc_val, reloc_offset; - uint32_t __iomem *reloc_entry; + u32 __iomem *reloc_entry; + void __iomem *reloc_page; target_obj = drm_gem_object_lookup(obj->dev, file_priv, reloc->target_handle); @@ -3451,8 +3441,8 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj, reloc_page = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping, (reloc_offset & ~(PAGE_SIZE - 1))); - reloc_entry = (uint32_t __iomem *)(reloc_page + - (reloc_offset & (PAGE_SIZE - 1))); + reloc_entry = (u32 __iomem *)(reloc_page + + (reloc_offset & (PAGE_SIZE - 1))); reloc_val = target_obj_priv->gtt_offset + reloc->delta; #if WATCH_BUF