Message ID | 1377101451-10437-1-git-send-email-rafael.barbalho@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Aug 21, 2013 at 05:10:51PM +0100, rafael.barbalho@intel.com wrote: > From: Rafael Barbalho <rafael.barbalho@intel.com> > > As the relocate entry function was getting a bit too big I've moved > the code that used to use either the cpu or the gtt to for the > relocation into two separate functions. > > Signed-off-by: Rafael Barbalho <rafael.barbalho@intel.com> Queued for -next, thanks for the patch. Note that you're mailer added a stupid "may be confidential legal disclaimer", which is bullocks since you're sending this to the world. And a bunch of companies have policies to immediately delete such mails since they're not the explicit recipient. I've dropped the disclaimer so that people can read your patch, but you need to fix this ;-) Separate mail accound recommended. -Daniel > --- > drivers/gpu/drm/i915/i915_gem_execbuffer.c | 88 ++++++++++++++++++------------ > 1 file changed, 54 insertions(+), 34 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c > index 9b3b5f8..fa82396 100644 > --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c > +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c > @@ -208,6 +208,56 @@ static inline int use_cpu_reloc(struct drm_i915_gem_object *obj) > } > > static int > +relocate_entry_cpu(struct drm_i915_gem_object *obj, > + struct drm_i915_gem_relocation_entry *reloc) > +{ > + uint32_t page_offset = offset_in_page(reloc->offset); > + char *vaddr; > + int ret = -EINVAL; > + > + ret = i915_gem_object_set_to_cpu_domain(obj, 1); > + if (ret) > + return ret; > + > + vaddr = kmap_atomic(i915_gem_object_get_page(obj, > + reloc->offset >> PAGE_SHIFT)); > + *(uint32_t *)(vaddr + page_offset) = reloc->delta; > + kunmap_atomic(vaddr); > + > + return 0; > +} > + > +static int > +relocate_entry_gtt(struct drm_i915_gem_object *obj, > + struct drm_i915_gem_relocation_entry *reloc) > +{ > + struct drm_device *dev = obj->base.dev; > + struct drm_i915_private *dev_priv = dev->dev_private; > + uint32_t __iomem *reloc_entry; > + void __iomem *reloc_page; > + int ret = -EINVAL; > + > + ret = i915_gem_object_set_to_gtt_domain(obj, true); > + if (ret) > + return ret; > + > + ret = i915_gem_object_put_fence(obj); > + if (ret) > + return ret; > + > + /* Map the page containing the relocation we're going to perform. */ > + reloc->offset += i915_gem_obj_ggtt_offset(obj); > + reloc_page = io_mapping_map_atomic_wc(dev_priv->gtt.mappable, > + reloc->offset & PAGE_MASK); > + reloc_entry = (uint32_t __iomem *) > + (reloc_page + offset_in_page(reloc->offset)); > + iowrite32(reloc->delta, reloc_entry); > + io_mapping_unmap_atomic(reloc_page); > + > + return 0; > +} > + > +static int > i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj, > struct eb_vmas *eb, > struct drm_i915_gem_relocation_entry *reloc, > @@ -293,40 +343,10 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj, > return -EFAULT; > > reloc->delta += target_offset; > - if (use_cpu_reloc(obj)) { > - uint32_t page_offset = offset_in_page(reloc->offset); > - char *vaddr; > - > - ret = i915_gem_object_set_to_cpu_domain(obj, 1); > - if (ret) > - return ret; > - > - vaddr = kmap_atomic(i915_gem_object_get_page(obj, > - reloc->offset >> PAGE_SHIFT)); > - *(uint32_t *)(vaddr + page_offset) = reloc->delta; > - kunmap_atomic(vaddr); > - } else { > - struct drm_i915_private *dev_priv = dev->dev_private; > - uint32_t __iomem *reloc_entry; > - void __iomem *reloc_page; > - > - ret = i915_gem_object_set_to_gtt_domain(obj, true); > - if (ret) > - return ret; > - > - ret = i915_gem_object_put_fence(obj); > - if (ret) > - return ret; > - > - /* Map the page containing the relocation we're going to perform. */ > - reloc->offset += i915_gem_obj_ggtt_offset(obj); > - reloc_page = io_mapping_map_atomic_wc(dev_priv->gtt.mappable, > - reloc->offset & PAGE_MASK); > - reloc_entry = (uint32_t __iomem *) > - (reloc_page + offset_in_page(reloc->offset)); > - iowrite32(reloc->delta, reloc_entry); > - io_mapping_unmap_atomic(reloc_page); > - } > + if (use_cpu_reloc(obj)) > + ret = relocate_entry_cpu(obj, reloc); > + else > + ret = relocate_entry_gtt(obj, reloc); > > /* and update the user's relocation entry */ > reloc->presumed_offset = target_offset; > -- > 1.8.3.4
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 9b3b5f8..fa82396 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -208,6 +208,56 @@ static inline int use_cpu_reloc(struct drm_i915_gem_object *obj) } static int +relocate_entry_cpu(struct drm_i915_gem_object *obj, + struct drm_i915_gem_relocation_entry *reloc) +{ + uint32_t page_offset = offset_in_page(reloc->offset); + char *vaddr; + int ret = -EINVAL; + + ret = i915_gem_object_set_to_cpu_domain(obj, 1); + if (ret) + return ret; + + vaddr = kmap_atomic(i915_gem_object_get_page(obj, + reloc->offset >> PAGE_SHIFT)); + *(uint32_t *)(vaddr + page_offset) = reloc->delta; + kunmap_atomic(vaddr); + + return 0; +} + +static int +relocate_entry_gtt(struct drm_i915_gem_object *obj, + struct drm_i915_gem_relocation_entry *reloc) +{ + struct drm_device *dev = obj->base.dev; + struct drm_i915_private *dev_priv = dev->dev_private; + uint32_t __iomem *reloc_entry; + void __iomem *reloc_page; + int ret = -EINVAL; + + ret = i915_gem_object_set_to_gtt_domain(obj, true); + if (ret) + return ret; + + ret = i915_gem_object_put_fence(obj); + if (ret) + return ret; + + /* Map the page containing the relocation we're going to perform. */ + reloc->offset += i915_gem_obj_ggtt_offset(obj); + reloc_page = io_mapping_map_atomic_wc(dev_priv->gtt.mappable, + reloc->offset & PAGE_MASK); + reloc_entry = (uint32_t __iomem *) + (reloc_page + offset_in_page(reloc->offset)); + iowrite32(reloc->delta, reloc_entry); + io_mapping_unmap_atomic(reloc_page); + + return 0; +} + +static int i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj, struct eb_vmas *eb, struct drm_i915_gem_relocation_entry *reloc, @@ -293,40 +343,10 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj, return -EFAULT; reloc->delta += target_offset; - if (use_cpu_reloc(obj)) { - uint32_t page_offset = offset_in_page(reloc->offset); - char *vaddr; - - ret = i915_gem_object_set_to_cpu_domain(obj, 1); - if (ret) - return ret; - - vaddr = kmap_atomic(i915_gem_object_get_page(obj, - reloc->offset >> PAGE_SHIFT)); - *(uint32_t *)(vaddr + page_offset) = reloc->delta; - kunmap_atomic(vaddr); - } else { - struct drm_i915_private *dev_priv = dev->dev_private; - uint32_t __iomem *reloc_entry; - void __iomem *reloc_page; - - ret = i915_gem_object_set_to_gtt_domain(obj, true); - if (ret) - return ret; - - ret = i915_gem_object_put_fence(obj); - if (ret) - return ret; - - /* Map the page containing the relocation we're going to perform. */ - reloc->offset += i915_gem_obj_ggtt_offset(obj); - reloc_page = io_mapping_map_atomic_wc(dev_priv->gtt.mappable, - reloc->offset & PAGE_MASK); - reloc_entry = (uint32_t __iomem *) - (reloc_page + offset_in_page(reloc->offset)); - iowrite32(reloc->delta, reloc_entry); - io_mapping_unmap_atomic(reloc_page); - } + if (use_cpu_reloc(obj)) + ret = relocate_entry_cpu(obj, reloc); + else + ret = relocate_entry_gtt(obj, reloc); /* and update the user's relocation entry */ reloc->presumed_offset = target_offset;