[PATCH] drm/i915: fb_mmap callback
Nirmoy Das
nirmoy.das at intel.com
Fri Feb 24 12:06:31 UTC 2023
Signed-off-by: Nirmoy Das <nirmoy.das at intel.com>
---
drivers/gpu/drm/i915/display/intel_fbdev.c | 21 ++++++++++--
drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c | 22 ++----------
drivers/gpu/drm/i915/gem/i915_gem_mman.c | 39 ++++++++++++++++++++++
drivers/gpu/drm/i915/gem/i915_gem_mman.h | 2 ++
4 files changed, 61 insertions(+), 23 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
index 3659350061a7..4f529bd3621b 100644
--- a/drivers/gpu/drm/i915/display/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
@@ -40,8 +40,10 @@
#include <drm/drm_crtc.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_fourcc.h>
+#include <drm/drm_gem_framebuffer_helper.h>
#include "gem/i915_gem_lmem.h"
+#include "gem/i915_gem_mman.h"
#include "i915_drv.h"
#include "intel_display_types.h"
@@ -120,6 +122,18 @@ static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
return ret;
}
+#define to_intel_fbdev(x) container_of(x, struct intel_fbdev, helper)
+static int intel_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+ struct intel_fbdev *fbdev = to_intel_fbdev(info->par);
+ struct drm_gem_object *bo = drm_gem_fb_get_obj(&fbdev->fb->base, 0);
+ struct drm_i915_gem_object *obj = to_intel_bo(bo);
+
+ vma->vm_page_prot =
+ pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
+
+ return i915_gem_object_mmap_fb(obj, vma, info->fix.smem_start, info->fix.smem_len);
+}
static const struct fb_ops intelfb_ops = {
.owner = THIS_MODULE,
DRM_FB_HELPER_DEFAULT_OPS,
@@ -131,6 +145,7 @@ static const struct fb_ops intelfb_ops = {
.fb_imageblit = drm_fb_helper_cfb_imageblit,
.fb_pan_display = intel_fbdev_pan_display,
.fb_blank = intel_fbdev_blank,
+ .fb_mmap = intel_fbdev_mmap,
};
static int intelfb_alloc(struct drm_fb_helper *helper,
@@ -199,7 +214,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
struct drm_device *dev = helper->dev;
struct drm_i915_private *dev_priv = to_i915(dev);
struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
- struct i915_ggtt *ggtt = to_gt(dev_priv)->ggtt;
+ struct i915_ggtt *ggtt = to_gt(dev_priv)->ggtt;
const struct i915_gtt_view view = {
.type = I915_GTT_VIEW_NORMAL,
};
@@ -278,8 +293,8 @@ static int intelfb_create(struct drm_fb_helper *helper,
info->fix.smem_len = obj->base.size;
} else {
/* Our framebuffer is the entirety of fbdev's system memory */
- info->fix.smem_start =
- (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma));
+ info->fix.smem_start =
+ (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma));
info->fix.smem_len = vma->size;
}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
index fd556a076d05..33c5b11393f8 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
@@ -12,6 +12,7 @@
#include <asm/smp.h>
#include "gem/i915_gem_dmabuf.h"
+#include "gem/i915_gem_mman.h"
#include "i915_drv.h"
#include "i915_gem_object.h"
#include "i915_scatterlist.h"
@@ -94,27 +95,8 @@ static void i915_gem_dmabuf_vunmap(struct dma_buf *dma_buf,
static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma)
{
struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
- struct drm_i915_private *i915 = to_i915(obj->base.dev);
- int ret;
-
- dma_resv_assert_held(dma_buf->resv);
-
- if (obj->base.size < vma->vm_end - vma->vm_start)
- return -EINVAL;
-
- if (HAS_LMEM(i915))
- return drm_gem_prime_mmap(&obj->base, vma);
- if (!obj->base.filp)
- return -ENODEV;
-
- ret = call_mmap(obj->base.filp, vma);
- if (ret)
- return ret;
-
- vma_set_file(vma, obj->base.filp);
-
- return 0;
+ return i915_gem_object_mmap(obj, vma);
}
static int i915_gem_begin_cpu_access(struct dma_buf *dma_buf, enum dma_data_direction direction)
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
index 2aac6bf78740..90b1c14c8205 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
@@ -11,6 +11,8 @@
#include <drm/drm_cache.h>
+#include "gem/i915_gem_lmem.h"
+
#include "gt/intel_gt.h"
#include "gt/intel_gt_requests.h"
@@ -1043,6 +1045,43 @@ int i915_gem_mmap(struct file *filp, struct vm_area_struct *vma)
return 0;
}
+int i915_gem_object_mmap(struct drm_i915_gem_object *obj, struct vm_area_struct *vma)
+{
+ int ret;
+
+ if (obj->base.size < vma->vm_end - vma->vm_start)
+ return -EINVAL;
+
+ /*
+ * FIXME: Add support for stolen objects.
+ * We could use vm_iomap_memory as an interim solution
+ * which would then function exactly like the existing fb_mmap
+ * support.
+ */
+ if (i915_gem_object_is_lmem(obj) || obj->stolen)
+ return drm_gem_prime_mmap(&obj->base, vma);
+
+ if (obj->base.filp) {
+ ret = call_mmap(obj->base.filp, vma);
+ if (ret)
+ return ret;
+
+ vma_set_file(vma, obj->base.filp);
+ return 0;
+ }
+
+ return -ENODEV;
+}
+
+int i915_gem_object_mmap_fb(struct drm_i915_gem_object *obj, struct vm_area_struct *vma, unsigned long start, unsigned long len)
+{
+ struct intel_memory_region *mr = READ_ONCE(obj->mm.region);
+
+ if (mr && mr->type != INTEL_MEMORY_STOLEN_SYSTEM)
+ return i915_gem_object_mmap(obj, vma);
+ printk("i915_gem_object_mmap_fb Doing vm iomap\n");
+ return vm_iomap_memory(vma, start, len);
+}
#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
#include "selftests/i915_gem_mman.c"
#endif
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.h b/drivers/gpu/drm/i915/gem/i915_gem_mman.h
index 1fa91b3033b3..4b4e1e14d4da 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_mman.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.h
@@ -30,4 +30,6 @@ void i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object *obj);
void i915_gem_object_runtime_pm_release_mmap_offset(struct drm_i915_gem_object *obj);
void i915_gem_object_release_mmap_offset(struct drm_i915_gem_object *obj);
+int i915_gem_object_mmap(struct drm_i915_gem_object *obj, struct vm_area_struct *vma);
+int i915_gem_object_mmap_fb(struct drm_i915_gem_object *obj, struct vm_area_struct *vma, unsigned long start, unsigned long len);
#endif
--
2.39.0
More information about the Intel-gfx-trybot
mailing list