Re: [PATCH 07/11] drm/gma500: Use fbdev client helpers

2024-05-08 Thread Patrik Jakobsson
On Tue, May 7, 2024 at 2:04 PM Thomas Zimmermann  wrote:
>
> Implement struct drm_client_funcs with the respective helpers and
> remove the custom code from the emulation. The generic helpers are
> equivalent in functionality.
>
> Signed-off-by: Thomas Zimmermann 

Acked-by: Patrik Jakobsson 

> ---
>  drivers/gpu/drm/gma500/fbdev.c | 58 ++
>  1 file changed, 3 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/gpu/drm/gma500/fbdev.c b/drivers/gpu/drm/gma500/fbdev.c
> index 98b44974d42dd..8a6cb47e83f8f 100644
> --- a/drivers/gpu/drm/gma500/fbdev.c
> +++ b/drivers/gpu/drm/gma500/fbdev.c
> @@ -8,7 +8,6 @@
>  #include 
>  #include 
>
> -#include 
>  #include 
>  #include 
>  #include 
> @@ -252,63 +251,12 @@ static const struct drm_fb_helper_funcs 
> psb_fbdev_fb_helper_funcs = {
>  };
>
>  /*
> - * struct drm_client_funcs and setup code
> + * struct drm_client_funcs
>   */
>
> -static void psb_fbdev_client_unregister(struct drm_client_dev *client)
> -{
> -   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
> -
> -   if (fb_helper->info) {
> -   drm_fb_helper_unregister_info(fb_helper);
> -   } else {
> -   drm_fb_helper_unprepare(fb_helper);
> -   drm_client_release(&fb_helper->client);
> -   kfree(fb_helper);
> -   }
> -}
> -
> -static int psb_fbdev_client_restore(struct drm_client_dev *client)
> -{
> -   drm_fb_helper_lastclose(client->dev);
> -
> -   return 0;
> -}
> -
> -static int psb_fbdev_client_hotplug(struct drm_client_dev *client)
> -{
> -   struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
> -   struct drm_device *dev = client->dev;
> -   int ret;
> -
> -   if (dev->fb_helper)
> -   return drm_fb_helper_hotplug_event(dev->fb_helper);
> -
> -   ret = drm_fb_helper_init(dev, fb_helper);
> -   if (ret)
> -   goto err_drm_err;
> -
> -   if (!drm_drv_uses_atomic_modeset(dev))
> -   drm_helper_disable_unused_functions(dev);
> -
> -   ret = drm_fb_helper_initial_config(fb_helper);
> -   if (ret)
> -   goto err_drm_fb_helper_fini;
> -
> -   return 0;
> -
> -err_drm_fb_helper_fini:
> -   drm_fb_helper_fini(fb_helper);
> -err_drm_err:
> -   drm_err(dev, "Failed to setup gma500 fbdev emulation (ret=%d)\n", 
> ret);
> -   return ret;
> -}
> -
>  static const struct drm_client_funcs psb_fbdev_client_funcs = {
> -   .owner  = THIS_MODULE,
> -   .unregister = psb_fbdev_client_unregister,
> -   .restore= psb_fbdev_client_restore,
> -   .hotplug= psb_fbdev_client_hotplug,
> +   .owner = THIS_MODULE,
> +   DRM_FBDEV_HELPER_CLIENT_FUNCS,
>  };
>
>  void psb_fbdev_setup(struct drm_psb_private *dev_priv)
> --
> 2.44.0
>


Re: [PATCH] drm/amdgpu: fix out of bounds write

2021-10-27 Thread Patrik Jakobsson
On Wed, Oct 13, 2021 at 10:41 PM Alex Deucher  wrote:
>
> On Wed, Oct 13, 2021 at 4:04 PM T. Williams  wrote:
> >
>
> The description and s-o-b should go here and the patch seems to be
> mangled.  I've manually applied this.  Please fix up your mailer in
> the future.
>
> Thanks for the fix.

Hi Thelford and Alex

There are several more instances of size being used instead of
wr_buf_size in amdgpu_dm_debugfs.c.

IMO the proper fix here would be to revert
918698d5c2b50433714d2042f55b55b090faa167

-Patrik

>
> Alex
>
>
> > ---
> >  drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c 
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> > index 87daa78a32b8..17f2756a64dc 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> > @@ -263,7 +263,7 @@ static ssize_t dp_link_settings_write(struct file *f, 
> > const char __user *buf,
> > if (!wr_buf)
> > return -ENOSPC;
> >
> > -   if (parse_write_buffer_into_params(wr_buf, size,
> > +   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
> >(long *)param, buf,
> >max_param_num,
> >¶m_nums)) {
> > --
> >
> > Size can be any value and is user controlled resulting in overwriting the 
> > 40 byte array wr_buf with an arbitrary length of data from buf.
> >
> > Signed-off-by: Thelford Williams 


[PATCH] drm/amdgpu: Fix even more out of bound writes from debugfs

2021-10-27 Thread Patrik Jakobsson
CVE-2021-42327 was fixed by:

commit f23750b5b3d98653b31d4469592935ef6364ad67
Author: Thelford Williams 
Date:   Wed Oct 13 16:04:13 2021 -0400

drm/amdgpu: fix out of bounds write

but amdgpu_dm_debugfs.c contains more of the same issue so fix the
remaining ones.

Fixes: 918698d5c2b5 ("drm/amd/display: Return the number of bytes parsed than 
allocated")
Signed-off-by: Patrik Jakobsson 
---
 .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c| 16 
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
index 1a68a674913c..33bdf15febc6 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
@@ -491,7 +491,7 @@ static ssize_t dp_phy_settings_write(struct file *f, const 
char __user *buf,
if (!wr_buf)
return -ENOSPC;
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
   (long *)param, buf,
   max_param_num,
   ¶m_nums)) {
@@ -643,7 +643,7 @@ static ssize_t dp_phy_test_pattern_debugfs_write(struct 
file *f, const char __us
if (!wr_buf)
return -ENOSPC;
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
   (long *)param, buf,
   max_param_num,
   ¶m_nums)) {
@@ -918,7 +918,7 @@ static ssize_t dp_dsc_passthrough_set(struct file *f, const 
char __user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
   ¶m, buf,
   max_param_num,
   ¶m_nums)) {
@@ -1215,7 +1215,7 @@ static ssize_t trigger_hotplug(struct file *f, const char 
__user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
@@ -1400,7 +1400,7 @@ static ssize_t dp_dsc_clock_en_write(struct file *f, 
const char __user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
@@ -1585,7 +1585,7 @@ static ssize_t dp_dsc_slice_width_write(struct file *f, 
const char __user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
@@ -1770,7 +1770,7 @@ static ssize_t dp_dsc_slice_height_write(struct file *f, 
const char __user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
@@ -1948,7 +1948,7 @@ static ssize_t dp_dsc_bits_per_pixel_write(struct file 
*f, const char __user *bu
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
-- 
2.33.0



Re: [PATCH] drm/amdgpu: fix out of bounds write

2021-10-27 Thread Patrik Jakobsson
On Wed, Oct 27, 2021 at 12:08 PM Patrik Jakobsson
 wrote:
>
> On Wed, Oct 13, 2021 at 10:41 PM Alex Deucher  wrote:
> >
> > On Wed, Oct 13, 2021 at 4:04 PM T. Williams  wrote:
> > >
> >
> > The description and s-o-b should go here and the patch seems to be
> > mangled.  I've manually applied this.  Please fix up your mailer in
> > the future.
> >
> > Thanks for the fix.
>
> Hi Thelford and Alex
>
> There are several more instances of size being used instead of
> wr_buf_size in amdgpu_dm_debugfs.c.
>
> IMO the proper fix here would be to revert
> 918698d5c2b50433714d2042f55b55b090faa167

Actually, there's one instance that a revert doesn't cover. Instead I
sent out a patch to fix the remaining ones.

>
> -Patrik
>
> >
> > Alex
> >
> >
> > > ---
> > >  drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c 
> > > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> > > index 87daa78a32b8..17f2756a64dc 100644
> > > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> > > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> > > @@ -263,7 +263,7 @@ static ssize_t dp_link_settings_write(struct file *f, 
> > > const char __user *buf,
> > > if (!wr_buf)
> > > return -ENOSPC;
> > >
> > > -   if (parse_write_buffer_into_params(wr_buf, size,
> > > +   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
> > >(long *)param, buf,
> > >max_param_num,
> > >¶m_nums)) {
> > > --
> > >
> > > Size can be any value and is user controlled resulting in overwriting the 
> > > 40 byte array wr_buf with an arbitrary length of data from buf.
> > >
> > > Signed-off-by: Thelford Williams 


Re: [PATCH] drm/amdgpu: Fix even more out of bound writes from debugfs

2021-10-27 Thread Patrik Jakobsson
On Wed, Oct 27, 2021 at 3:47 PM Harry Wentland  wrote:
>
>
>
> On 2021-10-27 09:03, Patrik Jakobsson wrote:
> > CVE-2021-42327 was fixed by:
> >
> > commit f23750b5b3d98653b31d4469592935ef6364ad67
> > Author: Thelford Williams 
> > Date:   Wed Oct 13 16:04:13 2021 -0400
> >
> > drm/amdgpu: fix out of bounds write
> >
> > but amdgpu_dm_debugfs.c contains more of the same issue so fix the
> > remaining ones.
> >
> > Fixes: 918698d5c2b5 ("drm/amd/display: Return the number of bytes parsed 
> > than allocated")
> > Signed-off-by: Patrik Jakobsson 
> > ---
> >  .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c| 16 
> >  1 file changed, 8 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c 
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> > index 1a68a674913c..33bdf15febc6 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> > @@ -491,7 +491,7 @@ static ssize_t dp_phy_settings_write(struct file *f, 
> > const char __user *buf,
> >   if (!wr_buf)
> >   return -ENOSPC;
> >
> > - if (parse_write_buffer_into_params(wr_buf, size,
> > + if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
> >  (long *)param, buf,
> >  max_param_num,
> >  ¶m_nums)) {
> > @@ -643,7 +643,7 @@ static ssize_t dp_phy_test_pattern_debugfs_write(struct 
> > file *f, const char __us
> >   if (!wr_buf)
> >   return -ENOSPC;
> >
> > - if (parse_write_buffer_into_params(wr_buf, size,
> > + if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
> >  (long *)param, buf,
> >  max_param_num,
> >  ¶m_nums)) {
> > @@ -918,7 +918,7 @@ static ssize_t dp_dsc_passthrough_set(struct file *f, 
> > const char __user *buf,
> >   return -ENOSPC;
> >   }
> >
> > - if (parse_write_buffer_into_params(wr_buf, size,
> > + if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
> >  ¶m, buf,
> >  max_param_num,
> >  ¶m_nums)) {
> > @@ -1215,7 +1215,7 @@ static ssize_t trigger_hotplug(struct file *f, const 
> > char __user *buf,
> >   return -ENOSPC;
> >   }
> >
> > - if (parse_write_buffer_into_params(wr_buf, size,
> > + if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
> >   (long *)param, buf,
> >   max_param_num,
> >   ¶m_nums)) {
> > @@ -1400,7 +1400,7 @@ static ssize_t dp_dsc_clock_en_write(struct file *f, 
> > const char __user *buf,
> >   return -ENOSPC;
> >   }
> >
> > - if (parse_write_buffer_into_params(wr_buf, size,
> > + if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
> >   (long *)param, buf,
> >   max_param_num,
> >   ¶m_nums)) {
> > @@ -1585,7 +1585,7 @@ static ssize_t dp_dsc_slice_width_write(struct file 
> > *f, const char __user *buf,
> >   return -ENOSPC;
> >   }
> >
> > - if (parse_write_buffer_into_params(wr_buf, size,
> > + if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
> >   (long *)param, buf,
> >   max_param_num,
> >   ¶m_nums)) {
> > @@ -1770,7 +1770,7 @@ static ssize_t dp_dsc_slice_height_write(struct file 
> > *f, const char __user *buf,
> >   return -ENOSPC;
> >   }
> >
> > - if (parse_write_buffer_into_params(wr_buf, size,
> > + if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
> >   (long *)param, buf,
> >   max_param_num,
> >   ¶m_nums)) {
> > @@ -1948,7 +1948,7 @@ static ssize_t dp_dsc_bits_per_pixel_write(struct 
> > file *f, const char

[PATCH v2] drm/amdgpu: Fix even more out of bound writes from debugfs

2021-10-27 Thread Patrik Jakobsson
CVE-2021-42327 was fixed by:

commit f23750b5b3d98653b31d4469592935ef6364ad67
Author: Thelford Williams 
Date:   Wed Oct 13 16:04:13 2021 -0400

drm/amdgpu: fix out of bounds write

but amdgpu_dm_debugfs.c contains more of the same issue so fix the
remaining ones.

v2:
* Add missing fix in dp_max_bpc_write (Harry Wentland)

Fixes: 918698d5c2b5 ("drm/amd/display: Return the number of bytes parsed than 
allocated")
Signed-off-by: Patrik Jakobsson 
---
 .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c  | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
index 1a68a674913c..3655663e079b 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
@@ -491,7 +491,7 @@ static ssize_t dp_phy_settings_write(struct file *f, const 
char __user *buf,
if (!wr_buf)
return -ENOSPC;
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
   (long *)param, buf,
   max_param_num,
   ¶m_nums)) {
@@ -643,7 +643,7 @@ static ssize_t dp_phy_test_pattern_debugfs_write(struct 
file *f, const char __us
if (!wr_buf)
return -ENOSPC;
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
   (long *)param, buf,
   max_param_num,
   ¶m_nums)) {
@@ -918,7 +918,7 @@ static ssize_t dp_dsc_passthrough_set(struct file *f, const 
char __user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
   ¶m, buf,
   max_param_num,
   ¶m_nums)) {
@@ -1215,7 +1215,7 @@ static ssize_t trigger_hotplug(struct file *f, const char 
__user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
@@ -1400,7 +1400,7 @@ static ssize_t dp_dsc_clock_en_write(struct file *f, 
const char __user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
@@ -1585,7 +1585,7 @@ static ssize_t dp_dsc_slice_width_write(struct file *f, 
const char __user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
@@ -1770,7 +1770,7 @@ static ssize_t dp_dsc_slice_height_write(struct file *f, 
const char __user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
@@ -1948,7 +1948,7 @@ static ssize_t dp_dsc_bits_per_pixel_write(struct file 
*f, const char __user *bu
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
(long *)param, buf,
max_param_num,
¶m_nums)) {
@@ -2386,7 +2386,7 @@ static ssize_t dp_max_bpc_write(struct file *f, const 
char __user *buf,
return -ENOSPC;
}
 
-   if (parse_write_buffer_into_params(wr_buf, size,
+   if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
   (long *)param, buf,
   max_param_num,
   ¶m_nums)) {
-- 
2.33.0



Re: [PATCH v3 06/22] drm/gma500: Convert to CRTC VBLANK callbacks

2020-01-20 Thread Patrik Jakobsson
On Mon, Jan 20, 2020 at 9:23 AM Thomas Zimmermann  wrote:
>
> VBLANK callbacks in struct drm_driver are deprecated in favor of
> their equivalents in struct drm_crtc_funcs. Convert gma500 over.
>
> Signed-off-by: Thomas Zimmermann 

Looks good. For this patch:

Acked-by: Patrik Jakobsson 

> ---
>  drivers/gpu/drm/gma500/cdv_intel_display.c |  3 +++
>  drivers/gpu/drm/gma500/psb_drv.c   |  4 
>  drivers/gpu/drm/gma500/psb_drv.h   |  6 +++---
>  drivers/gpu/drm/gma500/psb_intel_display.c |  3 +++
>  drivers/gpu/drm/gma500/psb_irq.c   | 12 +---
>  drivers/gpu/drm/gma500/psb_irq.h   |  7 ---
>  6 files changed, 22 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/gma500/cdv_intel_display.c 
> b/drivers/gpu/drm/gma500/cdv_intel_display.c
> index 1ed854f498b7..686385a66167 100644
> --- a/drivers/gpu/drm/gma500/cdv_intel_display.c
> +++ b/drivers/gpu/drm/gma500/cdv_intel_display.c
> @@ -977,6 +977,9 @@ const struct drm_crtc_funcs cdv_intel_crtc_funcs = {
> .set_config = gma_crtc_set_config,
> .destroy = gma_crtc_destroy,
> .page_flip = gma_crtc_page_flip,
> +   .enable_vblank = psb_enable_vblank,
> +   .disable_vblank = psb_disable_vblank,
> +   .get_vblank_counter = psb_get_vblank_counter,
>  };
>
>  const struct gma_clock_funcs cdv_clock_funcs = {
> diff --git a/drivers/gpu/drm/gma500/psb_drv.c 
> b/drivers/gpu/drm/gma500/psb_drv.c
> index 52591416f8fe..36cb292fdebe 100644
> --- a/drivers/gpu/drm/gma500/psb_drv.c
> +++ b/drivers/gpu/drm/gma500/psb_drv.c
> @@ -363,7 +363,6 @@ static int psb_driver_load(struct drm_device *dev, 
> unsigned long flags)
> drm_irq_install(dev, dev->pdev->irq);
>
> dev->max_vblank_count = 0xff; /* only 24 bits of frame count */
> -   dev->driver->get_vblank_counter = psb_get_vblank_counter;
>
> psb_modeset_init(dev);
> psb_fbdev_init(dev);
> @@ -507,9 +506,6 @@ static struct drm_driver driver = {
> .irq_postinstall = psb_irq_postinstall,
> .irq_uninstall = psb_irq_uninstall,
> .irq_handler = psb_irq_handler,
> -   .enable_vblank = psb_enable_vblank,
> -   .disable_vblank = psb_disable_vblank,
> -   .get_vblank_counter = psb_get_vblank_counter,
>
> .gem_free_object = psb_gem_free_object,
> .gem_vm_ops = &psb_gem_vm_ops,
> diff --git a/drivers/gpu/drm/gma500/psb_drv.h 
> b/drivers/gpu/drm/gma500/psb_drv.h
> index 3d4ef3071d45..956926341316 100644
> --- a/drivers/gpu/drm/gma500/psb_drv.h
> +++ b/drivers/gpu/drm/gma500/psb_drv.h
> @@ -681,15 +681,15 @@ extern void psb_irq_turn_off_dpst(struct drm_device 
> *dev);
>  extern void psb_irq_uninstall_islands(struct drm_device *dev, int 
> hw_islands);
>  extern int psb_vblank_wait2(struct drm_device *dev, unsigned int *sequence);
>  extern int psb_vblank_wait(struct drm_device *dev, unsigned int *sequence);
> -extern int psb_enable_vblank(struct drm_device *dev, unsigned int pipe);
> -extern void psb_disable_vblank(struct drm_device *dev, unsigned int pipe);
> +extern int psb_enable_vblank(struct drm_crtc *crtc);
> +extern void psb_disable_vblank(struct drm_crtc *crtc);
>  void
>  psb_enable_pipestat(struct drm_psb_private *dev_priv, int pipe, u32 mask);
>
>  void
>  psb_disable_pipestat(struct drm_psb_private *dev_priv, int pipe, u32 mask);
>
> -extern u32 psb_get_vblank_counter(struct drm_device *dev, unsigned int pipe);
> +extern u32 psb_get_vblank_counter(struct drm_crtc *crtc);
>
>  /* framebuffer.c */
>  extern int psbfb_probed(struct drm_device *dev);
> diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c 
> b/drivers/gpu/drm/gma500/psb_intel_display.c
> index fed3b563e62e..531c5485be17 100644
> --- a/drivers/gpu/drm/gma500/psb_intel_display.c
> +++ b/drivers/gpu/drm/gma500/psb_intel_display.c
> @@ -433,6 +433,9 @@ const struct drm_crtc_funcs psb_intel_crtc_funcs = {
> .set_config = gma_crtc_set_config,
> .destroy = gma_crtc_destroy,
> .page_flip = gma_crtc_page_flip,
> +   .enable_vblank = psb_enable_vblank,
> +   .disable_vblank = psb_disable_vblank,
> +   .get_vblank_counter = psb_get_vblank_counter,
>  };
>
>  const struct gma_clock_funcs psb_clock_funcs = {
> diff --git a/drivers/gpu/drm/gma500/psb_irq.c 
> b/drivers/gpu/drm/gma500/psb_irq.c
> index 91f90016dba9..15eb3770d817 100644
> --- a/drivers/gpu/drm/gma500/psb_irq.c
> +++ b/drivers/gpu/drm/gma500/psb_irq.c
> @@ -506,8 +506,10 @@ int psb_irq_disable_dpst(struct drm_device *dev)
>  /*
>   * It is used to enable VBLANK interrupt
>   */
> -int psb_enable_vblank(struct drm_device *dev, unsigned int pipe)
> +int psb_enable_vbl