Message ID | 20210412090526.30547-8-matthew.auld@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | More DG1 enabling | expand |
On Mon, Apr 12, 2021 at 10:05:14AM +0100, Matthew Auld wrote: > From: Mohammed Khajapasha <mohammed.khajapasha@intel.com> > > use local memory io BAR address for fbdev's fb_mmap() operation on > discrete, fbdev uses the physical address of our framebuffer for its > fb_mmap() fn. > > Signed-off-by: Mohammed Khajapasha <mohammed.khajapasha@intel.com> Sob missing (I didn't check all previous patches), but also I think we should aim more to reuse drm fbdev helpers and retire our owns here. Eventually, long-term, and all that. -Daniel > --- > drivers/gpu/drm/i915/display/intel_fbdev.c | 29 +++++++++++++++++----- > 1 file changed, 23 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c > index ccd00e65a5fe..2b37959da747 100644 > --- a/drivers/gpu/drm/i915/display/intel_fbdev.c > +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c > @@ -41,6 +41,8 @@ > #include <drm/drm_fb_helper.h> > #include <drm/drm_fourcc.h> > > +#include "gem/i915_gem_lmem.h" > + > #include "i915_drv.h" > #include "intel_display_types.h" > #include "intel_fbdev.h" > @@ -178,6 +180,7 @@ static int intelfb_create(struct drm_fb_helper *helper, > unsigned long flags = 0; > bool prealloc = false; > void __iomem *vaddr; > + struct drm_i915_gem_object *obj; > int ret; > > if (intel_fb && > @@ -232,13 +235,27 @@ static int intelfb_create(struct drm_fb_helper *helper, > info->fbops = &intelfb_ops; > > /* setup aperture base/size for vesafb takeover */ > - info->apertures->ranges[0].base = ggtt->gmadr.start; > - info->apertures->ranges[0].size = ggtt->mappable_end; > + obj = intel_fb_obj(&intel_fb->base); > + if (i915_gem_object_is_lmem(obj)) { > + struct intel_memory_region *mem = obj->mm.region; > + > + info->apertures->ranges[0].base = mem->io_start; > + info->apertures->ranges[0].size = mem->total; > + > + /* Use fbdev's framebuffer from lmem for discrete */ > + info->fix.smem_start = > + (unsigned long)(mem->io_start + > + i915_gem_object_get_dma_address(obj, 0)); > + info->fix.smem_len = obj->base.size; > + } else { > + info->apertures->ranges[0].base = ggtt->gmadr.start; > + info->apertures->ranges[0].size = ggtt->mappable_end; > > - /* Our framebuffer is the entirety of fbdev's system memory */ > - info->fix.smem_start = > - (unsigned long)(ggtt->gmadr.start + vma->node.start); > - info->fix.smem_len = vma->node.size; > + /* Our framebuffer is the entirety of fbdev's system memory */ > + info->fix.smem_start = > + (unsigned long)(ggtt->gmadr.start + vma->node.start); > + info->fix.smem_len = vma->node.size; > + } > > vaddr = i915_vma_pin_iomap(vma); > if (IS_ERR(vaddr)) { > -- > 2.26.3 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c index ccd00e65a5fe..2b37959da747 100644 --- a/drivers/gpu/drm/i915/display/intel_fbdev.c +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c @@ -41,6 +41,8 @@ #include <drm/drm_fb_helper.h> #include <drm/drm_fourcc.h> +#include "gem/i915_gem_lmem.h" + #include "i915_drv.h" #include "intel_display_types.h" #include "intel_fbdev.h" @@ -178,6 +180,7 @@ static int intelfb_create(struct drm_fb_helper *helper, unsigned long flags = 0; bool prealloc = false; void __iomem *vaddr; + struct drm_i915_gem_object *obj; int ret; if (intel_fb && @@ -232,13 +235,27 @@ static int intelfb_create(struct drm_fb_helper *helper, info->fbops = &intelfb_ops; /* setup aperture base/size for vesafb takeover */ - info->apertures->ranges[0].base = ggtt->gmadr.start; - info->apertures->ranges[0].size = ggtt->mappable_end; + obj = intel_fb_obj(&intel_fb->base); + if (i915_gem_object_is_lmem(obj)) { + struct intel_memory_region *mem = obj->mm.region; + + info->apertures->ranges[0].base = mem->io_start; + info->apertures->ranges[0].size = mem->total; + + /* Use fbdev's framebuffer from lmem for discrete */ + info->fix.smem_start = + (unsigned long)(mem->io_start + + i915_gem_object_get_dma_address(obj, 0)); + info->fix.smem_len = obj->base.size; + } else { + info->apertures->ranges[0].base = ggtt->gmadr.start; + info->apertures->ranges[0].size = ggtt->mappable_end; - /* Our framebuffer is the entirety of fbdev's system memory */ - info->fix.smem_start = - (unsigned long)(ggtt->gmadr.start + vma->node.start); - info->fix.smem_len = vma->node.size; + /* Our framebuffer is the entirety of fbdev's system memory */ + info->fix.smem_start = + (unsigned long)(ggtt->gmadr.start + vma->node.start); + info->fix.smem_len = vma->node.size; + } vaddr = i915_vma_pin_iomap(vma); if (IS_ERR(vaddr)) {