aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2018-03-30 10:11:34 -0400
committerDaniel Stone <daniels@collabora.com>2018-05-18 09:52:48 -0400
commitbc61c97502e26af1be54022883d14ee0c03379fc (patch)
tree16dc63e8167116e484c04e13fd50977402903f44
parentecb8a947855c9658cd0382f3cab39f91a7ebe86a (diff)
drm/gma500: Move GEM BO to drm_framebuffer
Since drm_framebuffer can now store GEM objects directly, place them there rather than in our own subclass. As this makes the framebuffer create_handle and destroy functions the same as the GEM framebuffer helper, we can reuse those. Signed-off-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Thierry Reding <treding@nvidia.com> Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180330141138.28987-20-daniels@collabora.com
-rw-r--r--drivers/gpu/drm/gma500/accel_2d.c2
-rw-r--r--drivers/gpu/drm/gma500/framebuffer.c62
-rw-r--r--drivers/gpu/drm/gma500/framebuffer.h1
-rw-r--r--drivers/gpu/drm/gma500/gma_display.c10
-rw-r--r--drivers/gpu/drm/gma500/gtt.h2
-rw-r--r--drivers/gpu/drm/gma500/oaktrail_crtc.c3
6 files changed, 20 insertions, 60 deletions
diff --git a/drivers/gpu/drm/gma500/accel_2d.c b/drivers/gpu/drm/gma500/accel_2d.c
index c51d9259c7a7..204c8e452eb7 100644
--- a/drivers/gpu/drm/gma500/accel_2d.c
+++ b/drivers/gpu/drm/gma500/accel_2d.c
@@ -251,7 +251,7 @@ static void psbfb_copyarea_accel(struct fb_info *info,
251 if (!fb) 251 if (!fb)
252 return; 252 return;
253 253
254 offset = psbfb->gtt->offset; 254 offset = to_gtt_range(fb->obj[0])->offset;
255 stride = fb->pitches[0]; 255 stride = fb->pitches[0];
256 256
257 switch (fb->format->depth) { 257 switch (fb->format->depth) {
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
index cb0a2ae916e0..8fa4ef192c1e 100644
--- a/drivers/gpu/drm/gma500/framebuffer.c
+++ b/drivers/gpu/drm/gma500/framebuffer.c
@@ -33,6 +33,7 @@
33#include <drm/drm.h> 33#include <drm/drm.h>
34#include <drm/drm_crtc.h> 34#include <drm/drm_crtc.h>
35#include <drm/drm_fb_helper.h> 35#include <drm/drm_fb_helper.h>
36#include <drm/drm_gem_framebuffer_helper.h>
36 37
37#include "psb_drv.h" 38#include "psb_drv.h"
38#include "psb_intel_reg.h" 39#include "psb_intel_reg.h"
@@ -40,14 +41,9 @@
40#include "framebuffer.h" 41#include "framebuffer.h"
41#include "gtt.h" 42#include "gtt.h"
42 43
43static void psb_user_framebuffer_destroy(struct drm_framebuffer *fb);
44static int psb_user_framebuffer_create_handle(struct drm_framebuffer *fb,
45 struct drm_file *file_priv,
46 unsigned int *handle);
47
48static const struct drm_framebuffer_funcs psb_fb_funcs = { 44static const struct drm_framebuffer_funcs psb_fb_funcs = {
49 .destroy = psb_user_framebuffer_destroy, 45 .destroy = drm_gem_fb_destroy,
50 .create_handle = psb_user_framebuffer_create_handle, 46 .create_handle = drm_gem_fb_create_handle,
51}; 47};
52 48
53#define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16) 49#define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16)
@@ -96,17 +92,18 @@ static int psbfb_pan(struct fb_var_screeninfo *var, struct fb_info *info)
96 struct psb_fbdev *fbdev = info->par; 92 struct psb_fbdev *fbdev = info->par;
97 struct psb_framebuffer *psbfb = &fbdev->pfb; 93 struct psb_framebuffer *psbfb = &fbdev->pfb;
98 struct drm_device *dev = psbfb->base.dev; 94 struct drm_device *dev = psbfb->base.dev;
95 struct gtt_range *gtt = to_gtt_range(psbfb->base.obj[0]);
99 96
100 /* 97 /*
101 * We have to poke our nose in here. The core fb code assumes 98 * We have to poke our nose in here. The core fb code assumes
102 * panning is part of the hardware that can be invoked before 99 * panning is part of the hardware that can be invoked before
103 * the actual fb is mapped. In our case that isn't quite true. 100 * the actual fb is mapped. In our case that isn't quite true.
104 */ 101 */
105 if (psbfb->gtt->npage) { 102 if (gtt->npage) {
106 /* GTT roll shifts in 4K pages, we need to shift the right 103 /* GTT roll shifts in 4K pages, we need to shift the right
107 number of pages */ 104 number of pages */
108 int pages = info->fix.line_length >> 12; 105 int pages = info->fix.line_length >> 12;
109 psb_gtt_roll(dev, psbfb->gtt, var->yoffset * pages); 106 psb_gtt_roll(dev, gtt, var->yoffset * pages);
110 } 107 }
111 return 0; 108 return 0;
112} 109}
@@ -117,13 +114,14 @@ static int psbfb_vm_fault(struct vm_fault *vmf)
117 struct psb_framebuffer *psbfb = vma->vm_private_data; 114 struct psb_framebuffer *psbfb = vma->vm_private_data;
118 struct drm_device *dev = psbfb->base.dev; 115 struct drm_device *dev = psbfb->base.dev;
119 struct drm_psb_private *dev_priv = dev->dev_private; 116 struct drm_psb_private *dev_priv = dev->dev_private;
117 struct gtt_range *gtt = to_gtt_range(psbfb->base.obj[0]);
120 int page_num; 118 int page_num;
121 int i; 119 int i;
122 unsigned long address; 120 unsigned long address;
123 int ret; 121 int ret;
124 unsigned long pfn; 122 unsigned long pfn;
125 unsigned long phys_addr = (unsigned long)dev_priv->stolen_base + 123 unsigned long phys_addr = (unsigned long)dev_priv->stolen_base +
126 psbfb->gtt->offset; 124 gtt->offset;
127 125
128 page_num = vma_pages(vma); 126 page_num = vma_pages(vma);
129 address = vmf->address - (vmf->pgoff << PAGE_SHIFT); 127 address = vmf->address - (vmf->pgoff << PAGE_SHIFT);
@@ -246,7 +244,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
246 return -EINVAL; 244 return -EINVAL;
247 245
248 drm_helper_mode_fill_fb_struct(dev, &fb->base, mode_cmd); 246 drm_helper_mode_fill_fb_struct(dev, &fb->base, mode_cmd);
249 fb->gtt = gt; 247 fb->base.obj[0] = &gt->gem;
250 ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs); 248 ret = drm_framebuffer_init(dev, &fb->base, &psb_fb_funcs);
251 if (ret) { 249 if (ret) {
252 dev_err(dev->dev, "framebuffer init failed: %d\n", ret); 250 dev_err(dev->dev, "framebuffer init failed: %d\n", ret);
@@ -518,8 +516,8 @@ static int psb_fbdev_destroy(struct drm_device *dev, struct psb_fbdev *fbdev)
518 drm_framebuffer_unregister_private(&psbfb->base); 516 drm_framebuffer_unregister_private(&psbfb->base);
519 drm_framebuffer_cleanup(&psbfb->base); 517 drm_framebuffer_cleanup(&psbfb->base);
520 518
521 if (psbfb->gtt) 519 if (psbfb->base.obj[0])
522 drm_gem_object_unreference_unlocked(&psbfb->gtt->gem); 520 drm_gem_object_unreference_unlocked(psbfb->base.obj[0]);
523 return 0; 521 return 0;
524} 522}
525 523
@@ -576,44 +574,6 @@ static void psb_fbdev_fini(struct drm_device *dev)
576 dev_priv->fbdev = NULL; 574 dev_priv->fbdev = NULL;
577} 575}
578 576
579/**
580 * psb_user_framebuffer_create_handle - add hamdle to a framebuffer
581 * @fb: framebuffer
582 * @file_priv: our DRM file
583 * @handle: returned handle
584 *
585 * Our framebuffer object is a GTT range which also contains a GEM
586 * object. We need to turn it into a handle for userspace. GEM will do
587 * the work for us
588 */
589static int psb_user_framebuffer_create_handle(struct drm_framebuffer *fb,
590 struct drm_file *file_priv,
591 unsigned int *handle)
592{
593 struct psb_framebuffer *psbfb = to_psb_fb(fb);
594 struct gtt_range *r = psbfb->gtt;
595 return drm_gem_handle_create(file_priv, &r->gem, handle);
596}
597
598/**
599 * psb_user_framebuffer_destroy - destruct user created fb
600 * @fb: framebuffer
601 *
602 * User framebuffers are backed by GEM objects so all we have to do is
603 * clean up a bit and drop the reference, GEM will handle the fallout
604 */
605static void psb_user_framebuffer_destroy(struct drm_framebuffer *fb)
606{
607 struct psb_framebuffer *psbfb = to_psb_fb(fb);
608 struct gtt_range *r = psbfb->gtt;
609
610 /* Let DRM do its clean up */
611 drm_framebuffer_cleanup(fb);
612 /* We are no longer using the resource in GEM */
613 drm_gem_object_unreference_unlocked(&r->gem);
614 kfree(fb);
615}
616
617static const struct drm_mode_config_funcs psb_mode_funcs = { 577static const struct drm_mode_config_funcs psb_mode_funcs = {
618 .fb_create = psb_user_framebuffer_create, 578 .fb_create = psb_user_framebuffer_create,
619 .output_poll_changed = drm_fb_helper_output_poll_changed, 579 .output_poll_changed = drm_fb_helper_output_poll_changed,
diff --git a/drivers/gpu/drm/gma500/framebuffer.h b/drivers/gpu/drm/gma500/framebuffer.h
index 395f20b07aab..23dc3c5f8f0d 100644
--- a/drivers/gpu/drm/gma500/framebuffer.h
+++ b/drivers/gpu/drm/gma500/framebuffer.h
@@ -31,7 +31,6 @@ struct psb_framebuffer {
31 struct drm_framebuffer base; 31 struct drm_framebuffer base;
32 struct address_space *addr_space; 32 struct address_space *addr_space;
33 struct fb_info *fbdev; 33 struct fb_info *fbdev;
34 struct gtt_range *gtt;
35}; 34};
36 35
37struct psb_fbdev { 36struct psb_fbdev {
diff --git a/drivers/gpu/drm/gma500/gma_display.c b/drivers/gpu/drm/gma500/gma_display.c
index f3c48a2be71b..c8f071c47daf 100644
--- a/drivers/gpu/drm/gma500/gma_display.c
+++ b/drivers/gpu/drm/gma500/gma_display.c
@@ -60,7 +60,7 @@ int gma_pipe_set_base(struct drm_crtc *crtc, int x, int y,
60 struct drm_psb_private *dev_priv = dev->dev_private; 60 struct drm_psb_private *dev_priv = dev->dev_private;
61 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 61 struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
62 struct drm_framebuffer *fb = crtc->primary->fb; 62 struct drm_framebuffer *fb = crtc->primary->fb;
63 struct psb_framebuffer *psbfb = to_psb_fb(fb); 63 struct gtt_range *gtt = to_gtt_range(fb->obj[0]);
64 int pipe = gma_crtc->pipe; 64 int pipe = gma_crtc->pipe;
65 const struct psb_offset *map = &dev_priv->regmap[pipe]; 65 const struct psb_offset *map = &dev_priv->regmap[pipe];
66 unsigned long start, offset; 66 unsigned long start, offset;
@@ -78,10 +78,10 @@ int gma_pipe_set_base(struct drm_crtc *crtc, int x, int y,
78 78
79 /* We are displaying this buffer, make sure it is actually loaded 79 /* We are displaying this buffer, make sure it is actually loaded
80 into the GTT */ 80 into the GTT */
81 ret = psb_gtt_pin(psbfb->gtt); 81 ret = psb_gtt_pin(gtt);
82 if (ret < 0) 82 if (ret < 0)
83 goto gma_pipe_set_base_exit; 83 goto gma_pipe_set_base_exit;
84 start = psbfb->gtt->offset; 84 start = gtt->offset;
85 offset = y * fb->pitches[0] + x * fb->format->cpp[0]; 85 offset = y * fb->pitches[0] + x * fb->format->cpp[0];
86 86
87 REG_WRITE(map->stride, fb->pitches[0]); 87 REG_WRITE(map->stride, fb->pitches[0]);
@@ -129,7 +129,7 @@ int gma_pipe_set_base(struct drm_crtc *crtc, int x, int y,
129gma_pipe_cleaner: 129gma_pipe_cleaner:
130 /* If there was a previous display we can now unpin it */ 130 /* If there was a previous display we can now unpin it */
131 if (old_fb) 131 if (old_fb)
132 psb_gtt_unpin(to_psb_fb(old_fb)->gtt); 132 psb_gtt_unpin(to_gtt_range(old_fb->obj[0]));
133 133
134gma_pipe_set_base_exit: 134gma_pipe_set_base_exit:
135 gma_power_end(dev); 135 gma_power_end(dev);
@@ -491,7 +491,7 @@ void gma_crtc_disable(struct drm_crtc *crtc)
491 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); 491 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
492 492
493 if (crtc->primary->fb) { 493 if (crtc->primary->fb) {
494 gt = to_psb_fb(crtc->primary->fb)->gtt; 494 gt = to_gtt_range(crtc->primary->fb->obj[0]);
495 psb_gtt_unpin(gt); 495 psb_gtt_unpin(gt);
496 } 496 }
497} 497}
diff --git a/drivers/gpu/drm/gma500/gtt.h b/drivers/gpu/drm/gma500/gtt.h
index cdbb350c9d5d..cb0c3a2a1fd4 100644
--- a/drivers/gpu/drm/gma500/gtt.h
+++ b/drivers/gpu/drm/gma500/gtt.h
@@ -53,6 +53,8 @@ struct gtt_range {
53 int roll; /* Roll applied to the GTT entries */ 53 int roll; /* Roll applied to the GTT entries */
54}; 54};
55 55
56#define to_gtt_range(x) container_of(x, struct gtt_range, gem)
57
56extern struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len, 58extern struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len,
57 const char *name, int backed, 59 const char *name, int backed,
58 u32 align); 60 u32 align);
diff --git a/drivers/gpu/drm/gma500/oaktrail_crtc.c b/drivers/gpu/drm/gma500/oaktrail_crtc.c
index 0fff269d3fe6..1b7fd6a9d8a5 100644
--- a/drivers/gpu/drm/gma500/oaktrail_crtc.c
+++ b/drivers/gpu/drm/gma500/oaktrail_crtc.c
@@ -600,7 +600,6 @@ static int oaktrail_pipe_set_base(struct drm_crtc *crtc,
600 struct drm_psb_private *dev_priv = dev->dev_private; 600 struct drm_psb_private *dev_priv = dev->dev_private;
601 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 601 struct gma_crtc *gma_crtc = to_gma_crtc(crtc);
602 struct drm_framebuffer *fb = crtc->primary->fb; 602 struct drm_framebuffer *fb = crtc->primary->fb;
603 struct psb_framebuffer *psbfb = to_psb_fb(fb);
604 int pipe = gma_crtc->pipe; 603 int pipe = gma_crtc->pipe;
605 const struct psb_offset *map = &dev_priv->regmap[pipe]; 604 const struct psb_offset *map = &dev_priv->regmap[pipe];
606 unsigned long start, offset; 605 unsigned long start, offset;
@@ -617,7 +616,7 @@ static int oaktrail_pipe_set_base(struct drm_crtc *crtc,
617 if (!gma_power_begin(dev, true)) 616 if (!gma_power_begin(dev, true))
618 return 0; 617 return 0;
619 618
620 start = psbfb->gtt->offset; 619 start = to_gtt_range(fb->obj[0])->offset;
621 offset = y * fb->pitches[0] + x * fb->format->cpp[0]; 620 offset = y * fb->pitches[0] + x * fb->format->cpp[0];
622 621
623 REG_WRITE(map->stride, fb->pitches[0]); 622 REG_WRITE(map->stride, fb->pitches[0]);