diff options
author | Daniel Stone <daniels@collabora.com> | 2018-03-30 10:11:34 -0400 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2018-05-18 09:52:48 -0400 |
commit | bc61c97502e26af1be54022883d14ee0c03379fc (patch) | |
tree | 16dc63e8167116e484c04e13fd50977402903f44 | |
parent | ecb8a947855c9658cd0382f3cab39f91a7ebe86a (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.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/gma500/framebuffer.c | 62 | ||||
-rw-r--r-- | drivers/gpu/drm/gma500/framebuffer.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/gma500/gma_display.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/gma500/gtt.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/gma500/oaktrail_crtc.c | 3 |
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 | ||
43 | static void psb_user_framebuffer_destroy(struct drm_framebuffer *fb); | ||
44 | static int psb_user_framebuffer_create_handle(struct drm_framebuffer *fb, | ||
45 | struct drm_file *file_priv, | ||
46 | unsigned int *handle); | ||
47 | |||
48 | static const struct drm_framebuffer_funcs psb_fb_funcs = { | 44 | static 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] = >->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 | */ | ||
589 | static 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 | */ | ||
605 | static 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 | |||
617 | static const struct drm_mode_config_funcs psb_mode_funcs = { | 577 | static 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 | ||
37 | struct psb_fbdev { | 36 | struct 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, | |||
129 | gma_pipe_cleaner: | 129 | gma_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 | ||
134 | gma_pipe_set_base_exit: | 134 | gma_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 | |||
56 | extern struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len, | 58 | extern 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]); |