Re: [PATCH V2] MAINTAINERS: Add entry for VKMS

2018-10-31 Thread Haneen Mohammed
On Mon, Oct 22, 2018 at 08:31:42AM -0400, Sean Paul wrote:
> On Sun, Oct 21, 2018 at 10:27:01PM -0300, Rodrigo Siqueira wrote:
> > Add maintainers and reviewers for VKMS driver
> > 
> > Signed-off-by: Rodrigo Siqueira 
> 
> Acked-by: Sean Paul 
> 

Reviewed-by: Haneen Mohammed 

> > ---
> > Changes in v2:
> >   - Insert the section in alphabetical order
> > 
> >  MAINTAINERS | 10 ++
> >  1 file changed, 10 insertions(+)
> > 
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 39c3f6682ace..56572f0968ce 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -4733,6 +4733,16 @@ S:   Odd Fixes
> >  F: drivers/gpu/drm/udl/
> >  T: git git://anongit.freedesktop.org/drm/drm-misc
> >  
> > +DRM DRIVER FOR VIRTUAL KERNEL MODESETTING (VKMS)
> > +M: Rodrigo Siqueira 
> > +R: Haneen Mohammed 
> > +R: Daniel Vetter 
> > +T: git git://anongit.freedesktop.org/drm/drm-misc
> > +S: Maintained
> > +L: dri-devel@lists.freedesktop.org
> > +F: drivers/gpu/drm/vkms/
> > +F: Documentation/gpu/vkms.rst
> > +
> >  DRM DRIVER FOR VMWARE VIRTUAL GPU
> >  M: "VMware Graphics" 
> >  M: Sinclair Yeh 
> > -- 
> > 2.19.1
> > 
> 
> -- 
> Sean Paul, Software Engineer, Google / Chromium OS
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] drm/vkms: Add kerneldoc entry

2018-09-12 Thread Haneen Mohammed
On Tue, Sep 11, 2018 at 08:06:31PM +0200, Daniel Vetter wrote:
> On Fri, Sep 07, 2018 at 08:41:36PM +0300, Haneen Mohammed wrote:
> > Add an initial kerneldoc entry for vkms with a todo list.
> > 
> > Signed-off-by: Haneen Mohammed 
> > ---
> >  Documentation/gpu/drivers.rst   |  1 +
> >  Documentation/gpu/todo.rst  | 12 
> >  Documentation/gpu/vkms.rst  | 21 +
> >  drivers/gpu/drm/vkms/vkms_drv.c |  9 +
> >  4 files changed, 31 insertions(+), 12 deletions(-)
> >  create mode 100644 Documentation/gpu/vkms.rst
> > 
> > diff --git a/Documentation/gpu/drivers.rst b/Documentation/gpu/drivers.rst
> > index 65be325bf282..7d2d3875ff1a 100644
> > --- a/Documentation/gpu/drivers.rst
> > +++ b/Documentation/gpu/drivers.rst
> > @@ -13,6 +13,7 @@ GPU Driver Documentation
> > tve200
> > v3d
> > vc4
> > +   vkms
> > bridge/dw-hdmi
> > xen-front
> >  
> > diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
> > index a7c150d6b63f..f8dfa603e89f 100644
> > --- a/Documentation/gpu/todo.rst
> > +++ b/Documentation/gpu/todo.rst
> > @@ -398,18 +398,6 @@ the non-i915 specific modeset tests.
> >  
> >  Contact: Daniel Vetter
> >  
> > -Create a virtual KMS driver for testing (vkms)
> > ---
> > -
> > -With all the latest helpers it should be fairly simple to create a virtual 
> > KMS
> > -driver useful for testing, or for running X or similar on headless machines
> > -(to be able to still use the GPU). This would be similar to vgem, but 
> > aimed at
> > -the modeset side.
> > -
> > -Once the basics are there there's tons of possibilities to extend it.
> > -
> > -Contact: Daniel Vetter
> 
> I've changed this to instead point at the vkms todo list, so we still have
> an entry for this here. And then applied your patch.
> 
> Cursor patches also applied now, thanks.
> 
> Aside: Do you have any plans to continue working on this, i.e. in need of
> commit rights?
> 
> Cheers, Daniel

Thanks!

I still have two patches I didn't submit (suspend/resume, and another that 
checks
if work_struct is queued before calling flush_work()).
I can volunteer to review future patches to vkms, but unfortunately I don't 
think I'd
be at capacity to add new features to vkms anymore.

Thank you so much for all your help!

Haneen

> > -
> >  Driver Specific
> >  ===
> >  
> > diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
> > new file mode 100644
> > index ..58bce5f4ec0a
> > --- /dev/null
> > +++ b/Documentation/gpu/vkms.rst
> > @@ -0,0 +1,21 @@
> > +==
> > + drm/vkms Virtual Kernel Modesetting
> > +==
> > +
> > +.. kernel-doc:: drivers/gpu/drm/vkms/vkms_drv.c
> > +   :doc: vkms (Virtual Kernel Modesetting)
> > +
> > +TODO
> > +
> > +
> > +CRC API
> > +---
> > +
> > +- Optimize CRC computation ``compute_crc()`` and plane blending ``blend()``
> > +
> > +- Use the alpha value to blend vaddr_src with vaddr_dst instead of
> > +  overwriting it in ``blend()``.
> > +
> > +- Add igt test to check cleared alpha value for XRGB plane format.
> > +
> > +- Add igt test to check extreme alpha values i.e. fully opaque and fully 
> > transparent (intermediate values are affected by hw-specific rounding 
> > modes).
> > diff --git a/drivers/gpu/drm/vkms/vkms_drv.c 
> > b/drivers/gpu/drm/vkms/vkms_drv.c
> > index 7ce9a76fb940..73cd11845973 100644
> > --- a/drivers/gpu/drm/vkms/vkms_drv.c
> > +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> > @@ -5,6 +5,15 @@
> >   * (at your option) any later version.
> >   */
> >  
> > +/**
> > + * DOC: vkms (Virtual Kernel Modesetting)
> > + *
> > + * vkms is a software-only model of a kms driver that is useful for 
> > testing,
> > + * or for running X (or similar) on headless machines and be able to still
> > + * use the GPU. vkms aims to enable a virtual display without the need for
> > + * a hardware display capability.
> > + */
> > +
> >  #include 
> >  #include 
> >  #include 
> > -- 
> > 2.17.1
> > 
> 
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] drm/vkms: Add kerneldoc entry

2018-09-10 Thread Haneen Mohammed
Add an initial kerneldoc entry for vkms with a todo list.

Signed-off-by: Haneen Mohammed 
---
 Documentation/gpu/drivers.rst   |  1 +
 Documentation/gpu/todo.rst  | 12 
 Documentation/gpu/vkms.rst  | 21 +
 drivers/gpu/drm/vkms/vkms_drv.c |  9 +
 4 files changed, 31 insertions(+), 12 deletions(-)
 create mode 100644 Documentation/gpu/vkms.rst

diff --git a/Documentation/gpu/drivers.rst b/Documentation/gpu/drivers.rst
index 65be325bf282..7d2d3875ff1a 100644
--- a/Documentation/gpu/drivers.rst
+++ b/Documentation/gpu/drivers.rst
@@ -13,6 +13,7 @@ GPU Driver Documentation
tve200
v3d
vc4
+   vkms
bridge/dw-hdmi
xen-front
 
diff --git a/Documentation/gpu/todo.rst b/Documentation/gpu/todo.rst
index a7c150d6b63f..f8dfa603e89f 100644
--- a/Documentation/gpu/todo.rst
+++ b/Documentation/gpu/todo.rst
@@ -398,18 +398,6 @@ the non-i915 specific modeset tests.
 
 Contact: Daniel Vetter
 
-Create a virtual KMS driver for testing (vkms)
---
-
-With all the latest helpers it should be fairly simple to create a virtual KMS
-driver useful for testing, or for running X or similar on headless machines
-(to be able to still use the GPU). This would be similar to vgem, but aimed at
-the modeset side.
-
-Once the basics are there there's tons of possibilities to extend it.
-
-Contact: Daniel Vetter
-
 Driver Specific
 ===
 
diff --git a/Documentation/gpu/vkms.rst b/Documentation/gpu/vkms.rst
new file mode 100644
index ..58bce5f4ec0a
--- /dev/null
+++ b/Documentation/gpu/vkms.rst
@@ -0,0 +1,21 @@
+==
+ drm/vkms Virtual Kernel Modesetting
+==
+
+.. kernel-doc:: drivers/gpu/drm/vkms/vkms_drv.c
+   :doc: vkms (Virtual Kernel Modesetting)
+
+TODO
+
+
+CRC API
+---
+
+- Optimize CRC computation ``compute_crc()`` and plane blending ``blend()``
+
+- Use the alpha value to blend vaddr_src with vaddr_dst instead of
+  overwriting it in ``blend()``.
+
+- Add igt test to check cleared alpha value for XRGB plane format.
+
+- Add igt test to check extreme alpha values i.e. fully opaque and fully 
transparent (intermediate values are affected by hw-specific rounding modes).
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index 7ce9a76fb940..73cd11845973 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -5,6 +5,15 @@
  * (at your option) any later version.
  */
 
+/**
+ * DOC: vkms (Virtual Kernel Modesetting)
+ *
+ * vkms is a software-only model of a kms driver that is useful for testing,
+ * or for running X (or similar) on headless machines and be able to still
+ * use the GPU. vkms aims to enable a virtual display without the need for
+ * a hardware display capability.
+ */
+
 #include 
 #include 
 #include 
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 2/3] drm/vkms: Compute CRC with Cursor Plane

2018-09-06 Thread Haneen Mohammed
This patch compute CRC for output frame with cursor and primary plane.
Blend cursor with primary plane and compute CRC on the resulted frame.

This currently passes cursor-size-change, and cursor-64x64-[onscreen,
offscreen, sliding, random, dpms, rapid-movement] from igt
kms_cursor_crc tests.

Signed-off-by: Haneen Mohammed 
---
v2:
- clear alpha channel before computing crc for XRGB

 drivers/gpu/drm/vkms/vkms_crc.c   | 154 +-
 drivers/gpu/drm/vkms/vkms_drv.h   |   5 +-
 drivers/gpu/drm/vkms/vkms_plane.c |  10 +-
 3 files changed, 143 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
index 68db42f15086..0a2745646dfa 100644
--- a/drivers/gpu/drm/vkms/vkms_crc.c
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -1,36 +1,143 @@
 // SPDX-License-Identifier: GPL-2.0
 #include "vkms_drv.h"
 #include 
+#include 
+#include 
 #include 
 
-static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
+/**
+ * compute_crc - Compute CRC value on output frame
+ *
+ * @vaddr_out: address to final framebuffer
+ * @crc_out: framebuffer's metadata
+ *
+ * returns CRC value computed using crc32 on the visible portion of
+ * the final framebuffer at vaddr_out
+ */
+static uint32_t compute_crc(void *vaddr_out, struct vkms_crc_data *crc_out)
+{
+   int i, j, src_offset;
+   int x_src = crc_out->src.x1 >> 16;
+   int y_src = crc_out->src.y1 >> 16;
+   int h_src = drm_rect_height(_out->src) >> 16;
+   int w_src = drm_rect_width(_out->src) >> 16;
+   u32 crc = 0;
+
+   for (i = y_src; i < y_src + h_src; ++i) {
+   for (j = x_src; j < x_src + w_src; ++j) {
+   src_offset = crc_out->offset
++ (i * crc_out->pitch)
++ (j * crc_out->cpp);
+   /* XRGB format ignores Alpha channel */
+   memset(vaddr_out + src_offset + 24, 0,  8);
+   crc = crc32_le(crc, vaddr_out + src_offset,
+  sizeof(u32));
+   }
+   }
+
+   return crc;
+}
+
+/**
+ * blend - belnd value at vaddr_src with value at vaddr_dst
+ * @vaddr_dst: destination address
+ * @vaddr_src: source address
+ * @crc_dst: destination framebuffer's metadata
+ * @crc_src: source framebuffer's metadata
+ *
+ * Blend value at vaddr_src with value at vaddr_dst.
+ * Currently, this function write value at vaddr_src on value
+ * at vaddr_dst using buffer's metadata to locate the new values
+ * from vaddr_src and their distenation at vaddr_dst.
+ *
+ * Todo: Use the alpha value to blend vaddr_src with vaddr_dst
+ *  instead of overwriting it.
+ */
+static void blend(void *vaddr_dst, void *vaddr_src,
+ struct vkms_crc_data *crc_dst,
+ struct vkms_crc_data *crc_src)
 {
-   struct drm_framebuffer *fb = _data->fb;
+   int i, j, j_dst, i_dst;
+   int offset_src, offset_dst;
+
+   int x_src = crc_src->src.x1 >> 16;
+   int y_src = crc_src->src.y1 >> 16;
+
+   int x_dst = crc_src->dst.x1;
+   int y_dst = crc_src->dst.y1;
+   int h_dst = drm_rect_height(_src->dst);
+   int w_dst = drm_rect_width(_src->dst);
+
+   int y_limit = y_src + h_dst;
+   int x_limit = x_src + w_dst;
+
+   for (i = y_src, i_dst = y_dst; i < y_limit; ++i) {
+   for (j = x_src, j_dst = x_dst; j < x_limit; ++j) {
+   offset_dst = crc_dst->offset
++ (i_dst * crc_dst->pitch)
++ (j_dst++ * crc_dst->cpp);
+   offset_src = crc_src->offset
++ (i * crc_src->pitch)
++ (j * crc_src->cpp);
+
+   memcpy(vaddr_dst + offset_dst,
+  vaddr_src + offset_src, sizeof(u32));
+   }
+   i_dst++;
+   }
+}
+
+static void compose_cursor(struct vkms_crc_data *cursor_crc,
+  struct vkms_crc_data *primary_crc, void *vaddr_out)
+{
+   struct drm_gem_object *cursor_obj;
+   struct vkms_gem_object *cursor_vkms_obj;
+
+   cursor_obj = drm_gem_fb_get_obj(_crc->fb, 0);
+   cursor_vkms_obj = drm_gem_to_vkms_gem(cursor_obj);
+
+   mutex_lock(_vkms_obj->pages_lock);
+   if (!cursor_vkms_obj->vaddr) {
+   DRM_WARN("cursor plane vaddr is NULL");
+   goto out;
+   }
+
+   blend(vaddr_out, cursor_vkms_obj->vaddr, primary_crc, cursor_crc);
+
+out:
+   mutex_unlock(_vkms_obj->pages_lock);
+}
+
+static uint32_t _vkms_get_crc(struct vkms_crc_data *primary_crc,
+ struct vkms_crc_data *cursor_crc)
+{
+   struct drm_framebuffer *fb = _crc-

Re: [PATCH v2] drm/vkms: Fix race condition around accessing frame number

2018-09-06 Thread Haneen Mohammed
On Wed, Sep 05, 2018 at 04:03:26PM +0200, Daniel Vetter wrote:
> On Tue, Sep 04, 2018 at 12:18:17AM +0300, Haneen Mohammed wrote:
> > crtc_state is accessed by both vblank_handle() and the ordered
> > work_struct handle vkms_crc_work_handle() to retrieve and or update
> > the frame number for computed CRC.
> > 
> > Since work_struct can fail, add frame_end to account for missing frame
> > numbers.
> > 
> > Use (frame_[start/end]) for synchronization between hrtimer callback
> > and ordered work_struct handle.
> > 
> > This patch passes the following subtests from igt kms_pipe_crc_basic test:
> > bad-source, read-crc-pipe-A, read-crc-pipe-A-frame-sequence,
> > nonblocking-crc-pipe-A, nonblocking-crc-pipe-A-frame-sequence
> > 
> > Signed-off-by: Haneen Mohammed 
> > ---
> > v2:
> > - use u64 with spinlock instead of atomic_t
> > - add out label for common exit routine @vkms_crc_work_handle()
> 
> Yup I think that looks good, thanks for your patch. Applied.
> 
> btw, do you still plan to type up a vkms.rst for documentation, so that we
> could put a few of the todo items there? Or should I do that? Next
> outreachy round starts soon, we need to get this ready.
> -Daniel
> 

I did prepare a patch for vkms.rst but since most of the todos I've so far are
related to the cursor patch, I planed to send it after I submit the
cursor patch. I'll send both out by the end of today.

> > 
> >  drivers/gpu/drm/vkms/vkms_crc.c  | 36 ++--
> >  drivers/gpu/drm/vkms/vkms_crtc.c | 16 --
> >  drivers/gpu/drm/vkms/vkms_drv.h  |  8 +--
> >  3 files changed, 54 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/vkms/vkms_crc.c 
> > b/drivers/gpu/drm/vkms/vkms_crc.c
> > index ed47d67cecd6..68db42f15086 100644
> > --- a/drivers/gpu/drm/vkms/vkms_crc.c
> > +++ b/drivers/gpu/drm/vkms/vkms_crc.c
> > @@ -34,6 +34,15 @@ static uint32_t _vkms_get_crc(struct vkms_crc_data 
> > *crc_data)
> > return crc;
> >  }
> >  
> > +/**
> > + * vkms_crc_work_handle - ordered work_struct to compute CRC
> > + *
> > + * @work: work_struct
> > + *
> > + * Work handler for computing CRCs. work_struct scheduled in
> > + * an ordered workqueue that's periodically scheduled to run by
> > + * _vblank_handle() and flushed at vkms_atomic_crtc_destroy_state().
> > + */
> >  void vkms_crc_work_handle(struct work_struct *work)
> >  {
> > struct vkms_crtc_state *crtc_state = container_of(work,
> > @@ -45,8 +54,18 @@ void vkms_crc_work_handle(struct work_struct *work)
> > output);
> > struct vkms_crc_data *primary_crc = NULL;
> > struct drm_plane *plane;
> > -
> > u32 crc32 = 0;
> > +   u64 frame_start, frame_end;
> > +   unsigned long flags;
> > +
> > +   spin_lock_irqsave(>state_lock, flags);
> > +   frame_start = crtc_state->frame_start;
> > +   frame_end = crtc_state->frame_end;
> > +   spin_unlock_irqrestore(>state_lock, flags);
> > +
> > +   /* _vblank_handle() hasn't updated frame_start yet */
> > +   if (!frame_start || frame_start == frame_end)
> > +   goto out;
> >  
> > drm_for_each_plane(plane, >drm) {
> > struct vkms_plane_state *vplane_state;
> > @@ -67,7 +86,20 @@ void vkms_crc_work_handle(struct work_struct *work)
> > if (primary_crc)
> > crc32 = _vkms_get_crc(primary_crc);
> >  
> > -   drm_crtc_add_crc_entry(crtc, true, crtc_state->n_frame, );
> > +   frame_end = drm_crtc_accurate_vblank_count(crtc);
> > +
> > +   /* queue_work can fail to schedule crc_work; add crc for
> > +* missing frames
> > +*/
> > +   while (frame_start <= frame_end)
> > +   drm_crtc_add_crc_entry(crtc, true, frame_start++, );
> > +
> > +out:
> > +   /* to avoid using the same value for frame number again */
> > +   spin_lock_irqsave(>state_lock, flags);
> > +   crtc_state->frame_end = frame_end;
> > +   crtc_state->frame_start = 0;
> > +   spin_unlock_irqrestore(>state_lock, flags);
> >  }
> >  
> >  static int vkms_crc_parse_source(const char *src_name, bool *enabled)
> > diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c 
> > b/drivers/gpu/drm/vkms/vkms_crtc.c
> > index 9d0b1a325a78..177bbcb38306 100644
> > --- a/drivers/gpu/drm/vkms/vkms_crtc.c
> > +++ b/drivers/gpu/drm/vkms/vkms_crtc.c
> > @@ -22,8 +22,19 @@ static void _vblank_handle(struct vkms_output *output)
> > 

[PATCH v2 1/3] drm/vkms: Add cursor plane support

2018-09-06 Thread Haneen Mohammed
Add cursor plane support and update vkms_plane_atomic_check to enable
positioning cursor plane.

Signed-off-by: Haneen Mohammed 
---
v2:
- nothing

 drivers/gpu/drm/vkms/vkms_drv.h| 11 +++---
 drivers/gpu/drm/vkms/vkms_output.c | 16 ---
 drivers/gpu/drm/vkms/vkms_plane.c  | 33 +-
 3 files changed, 44 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 80af6d3a65e7..b5ed90a8f19c 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -7,8 +7,8 @@
 #include 
 #include 
 
-#define XRES_MIN32
-#define YRES_MIN32
+#define XRES_MIN20
+#define YRES_MIN20
 
 #define XRES_DEF  1024
 #define YRES_DEF   768
@@ -20,6 +20,10 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
 
+static const u32 vkms_cursor_formats[] = {
+   DRM_FORMAT_ARGB,
+};
+
 struct vkms_crc_data {
struct drm_rect src;
struct drm_framebuffer fb;
@@ -104,7 +108,8 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, 
unsigned int pipe,
 
 int vkms_output_init(struct vkms_device *vkmsdev);
 
-struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev);
+struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
+ enum drm_plane_type type);
 
 /* Gem stuff */
 struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
diff --git a/drivers/gpu/drm/vkms/vkms_output.c 
b/drivers/gpu/drm/vkms/vkms_output.c
index 901012cb1af1..19f9ffcbf9eb 100644
--- a/drivers/gpu/drm/vkms/vkms_output.c
+++ b/drivers/gpu/drm/vkms/vkms_output.c
@@ -49,14 +49,20 @@ int vkms_output_init(struct vkms_device *vkmsdev)
struct drm_connector *connector = >connector;
struct drm_encoder *encoder = >encoder;
struct drm_crtc *crtc = >crtc;
-   struct drm_plane *primary;
+   struct drm_plane *primary, *cursor = NULL;
int ret;
 
-   primary = vkms_plane_init(vkmsdev);
+   primary = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY);
if (IS_ERR(primary))
return PTR_ERR(primary);
 
-   ret = vkms_crtc_init(dev, crtc, primary, NULL);
+   cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR);
+   if (IS_ERR(cursor)) {
+   ret = PTR_ERR(cursor);
+   goto err_cursor;
+   }
+
+   ret = vkms_crtc_init(dev, crtc, primary, cursor);
if (ret)
goto err_crtc;
 
@@ -106,6 +112,10 @@ int vkms_output_init(struct vkms_device *vkmsdev)
drm_crtc_cleanup(crtc);
 
 err_crtc:
+   drm_plane_cleanup(cursor);
+
+err_cursor:
drm_plane_cleanup(primary);
+
return ret;
 }
diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index c91661631c76..428247d403dc 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -81,8 +81,8 @@ static const struct drm_plane_funcs vkms_plane_funcs = {
.atomic_destroy_state   = vkms_plane_destroy_state,
 };
 
-static void vkms_primary_plane_update(struct drm_plane *plane,
- struct drm_plane_state *old_state)
+static void vkms_plane_atomic_update(struct drm_plane *plane,
+struct drm_plane_state *old_state)
 {
struct vkms_plane_state *vkms_plane_state;
struct vkms_crc_data *crc_data;
@@ -101,6 +101,7 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
   struct drm_plane_state *state)
 {
struct drm_crtc_state *crtc_state;
+   bool can_position = false;
int ret;
 
if (!state->fb | !state->crtc)
@@ -110,15 +111,18 @@ static int vkms_plane_atomic_check(struct drm_plane 
*plane,
if (IS_ERR(crtc_state))
return PTR_ERR(crtc_state);
 
+   if (plane->type == DRM_PLANE_TYPE_CURSOR)
+   can_position = true;
+
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
  DRM_PLANE_HELPER_NO_SCALING,
  DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ can_position, true);
if (ret != 0)
return ret;
 
/* for now primary plane must be visible and full screen */
-   if (!state->visible)
+   if (!state->visible && !can_position)
return -EINVAL;
 
return 0;
@@ -156,15 +160,17 @@ static void vkms_cleanup_fb(struct drm_plane *plane,
 }
 
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
-   .atomic_update  = vkms_primary_plane_update,
+   .atomic_update  = vkms_plane_atomic_update,
.atomic_check   = vkms_plane_atomic_check,
.prepare_fb = vkms

[PATCH v2 0/3] Compute CRC with cursor plane support

2018-09-06 Thread Haneen Mohammed
This patchset adds cursor plane support and compute CRC for output frame
with cursor and primary plane.

changes in v2:
- clear alpha channel before computing crc for XRGB plane format
- add module option 'enable_cursor' to enable/disable cursor support

Haneen Mohammed (3):
  drm/vkms: Add cursor plane support
  drm/vkms: Compute CRC with Cursor Plane
  drm/vkms: Enable/Disable cursor support with module option

 drivers/gpu/drm/vkms/vkms_crc.c| 154 -
 drivers/gpu/drm/vkms/vkms_drv.c|   4 +
 drivers/gpu/drm/vkms/vkms_drv.h|  18 +++-
 drivers/gpu/drm/vkms/vkms_output.c |  19 +++-
 drivers/gpu/drm/vkms/vkms_plane.c  |  43 +---
 5 files changed, 196 insertions(+), 42 deletions(-)

-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 3/3] drm/vkms: Enable/Disable cursor support with module option

2018-09-06 Thread Haneen Mohammed
Cursor support is not complete yet. Add module option 'enable_cursor'
to enable/disable cursor support which is used for testing currently.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_drv.c|  4 
 drivers/gpu/drm/vkms/vkms_drv.h|  2 ++
 drivers/gpu/drm/vkms/vkms_output.c | 13 -
 3 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index bd9d4b2389bd..2d49ad31ad0b 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -21,6 +21,10 @@
 
 static struct vkms_device *vkms_device;
 
+bool enable_cursor;
+module_param_named(enable_cursor, enable_cursor, bool, 0444);
+MODULE_PARM_DESC(enable_cursor, "Enable/Disable cursor support");
+
 static const struct file_operations vkms_driver_fops = {
.owner  = THIS_MODULE,
.open   = drm_open,
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index c9723c069ebf..1c93990693e3 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -16,6 +16,8 @@
 #define XRES_MAX  8192
 #define YRES_MAX  8192
 
+extern bool enable_cursor;
+
 static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
diff --git a/drivers/gpu/drm/vkms/vkms_output.c 
b/drivers/gpu/drm/vkms/vkms_output.c
index 19f9ffcbf9eb..271a0eb9042c 100644
--- a/drivers/gpu/drm/vkms/vkms_output.c
+++ b/drivers/gpu/drm/vkms/vkms_output.c
@@ -56,10 +56,12 @@ int vkms_output_init(struct vkms_device *vkmsdev)
if (IS_ERR(primary))
return PTR_ERR(primary);
 
-   cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR);
-   if (IS_ERR(cursor)) {
-   ret = PTR_ERR(cursor);
-   goto err_cursor;
+   if (enable_cursor) {
+   cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR);
+   if (IS_ERR(cursor)) {
+   ret = PTR_ERR(cursor);
+   goto err_cursor;
+   }
}
 
ret = vkms_crtc_init(dev, crtc, primary, cursor);
@@ -112,7 +114,8 @@ int vkms_output_init(struct vkms_device *vkmsdev)
drm_crtc_cleanup(crtc);
 
 err_crtc:
-   drm_plane_cleanup(cursor);
+   if (enable_cursor)
+   drm_plane_cleanup(cursor);
 
 err_cursor:
drm_plane_cleanup(primary);
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2] drm/vkms: Fix race condition around accessing frame number

2018-09-04 Thread Haneen Mohammed
crtc_state is accessed by both vblank_handle() and the ordered
work_struct handle vkms_crc_work_handle() to retrieve and or update
the frame number for computed CRC.

Since work_struct can fail, add frame_end to account for missing frame
numbers.

Use (frame_[start/end]) for synchronization between hrtimer callback
and ordered work_struct handle.

This patch passes the following subtests from igt kms_pipe_crc_basic test:
bad-source, read-crc-pipe-A, read-crc-pipe-A-frame-sequence,
nonblocking-crc-pipe-A, nonblocking-crc-pipe-A-frame-sequence

Signed-off-by: Haneen Mohammed 
---
v2:
- use u64 with spinlock instead of atomic_t
- add out label for common exit routine @vkms_crc_work_handle()

 drivers/gpu/drm/vkms/vkms_crc.c  | 36 ++--
 drivers/gpu/drm/vkms/vkms_crtc.c | 16 --
 drivers/gpu/drm/vkms/vkms_drv.h  |  8 +--
 3 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
index ed47d67cecd6..68db42f15086 100644
--- a/drivers/gpu/drm/vkms/vkms_crc.c
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -34,6 +34,15 @@ static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
return crc;
 }
 
+/**
+ * vkms_crc_work_handle - ordered work_struct to compute CRC
+ *
+ * @work: work_struct
+ *
+ * Work handler for computing CRCs. work_struct scheduled in
+ * an ordered workqueue that's periodically scheduled to run by
+ * _vblank_handle() and flushed at vkms_atomic_crtc_destroy_state().
+ */
 void vkms_crc_work_handle(struct work_struct *work)
 {
struct vkms_crtc_state *crtc_state = container_of(work,
@@ -45,8 +54,18 @@ void vkms_crc_work_handle(struct work_struct *work)
output);
struct vkms_crc_data *primary_crc = NULL;
struct drm_plane *plane;
-
u32 crc32 = 0;
+   u64 frame_start, frame_end;
+   unsigned long flags;
+
+   spin_lock_irqsave(>state_lock, flags);
+   frame_start = crtc_state->frame_start;
+   frame_end = crtc_state->frame_end;
+   spin_unlock_irqrestore(>state_lock, flags);
+
+   /* _vblank_handle() hasn't updated frame_start yet */
+   if (!frame_start || frame_start == frame_end)
+   goto out;
 
drm_for_each_plane(plane, >drm) {
struct vkms_plane_state *vplane_state;
@@ -67,7 +86,20 @@ void vkms_crc_work_handle(struct work_struct *work)
if (primary_crc)
crc32 = _vkms_get_crc(primary_crc);
 
-   drm_crtc_add_crc_entry(crtc, true, crtc_state->n_frame, );
+   frame_end = drm_crtc_accurate_vblank_count(crtc);
+
+   /* queue_work can fail to schedule crc_work; add crc for
+* missing frames
+*/
+   while (frame_start <= frame_end)
+   drm_crtc_add_crc_entry(crtc, true, frame_start++, );
+
+out:
+   /* to avoid using the same value for frame number again */
+   spin_lock_irqsave(>state_lock, flags);
+   crtc_state->frame_end = frame_end;
+   crtc_state->frame_start = 0;
+   spin_unlock_irqrestore(>state_lock, flags);
 }
 
 static int vkms_crc_parse_source(const char *src_name, bool *enabled)
diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 9d0b1a325a78..177bbcb38306 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -22,8 +22,19 @@ static void _vblank_handle(struct vkms_output *output)
DRM_ERROR("vkms failure on handling vblank");
 
if (state && output->crc_enabled) {
-   state->n_frame = drm_crtc_accurate_vblank_count(crtc);
-   queue_work(output->crc_workq, >crc_work);
+   u64 frame = drm_crtc_accurate_vblank_count(crtc);
+
+   /* update frame_start only if a queued vkms_crc_work_handle()
+* has read the data
+*/
+   spin_lock(>state_lock);
+   if (!state->frame_start)
+   state->frame_start = frame;
+   spin_unlock(>state_lock);
+
+   ret = queue_work(output->crc_workq, >crc_work);
+   if (!ret)
+   DRM_WARN("failed to queue vkms_crc_work_handle");
}
 
spin_unlock(>lock);
@@ -211,6 +222,7 @@ int vkms_crtc_init(struct drm_device *dev, struct drm_crtc 
*crtc,
drm_crtc_helper_add(crtc, _crtc_helper_funcs);
 
spin_lock_init(_out->lock);
+   spin_lock_init(_out->state_lock);
 
vkms_out->crc_workq = alloc_ordered_workqueue("vkms_crc_workq", 0);
 
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 2017a2ccc43d..80af6d3a65e7 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -39,12 +39,14 @@ struct vkms_plane_state {
  * vkms_crtc_state - Driver specific CRTC stat

Re: [PATCH] drm/vkms: Fix race condition around accessing frame number

2018-09-02 Thread Haneen Mohammed
On Fri, Aug 31, 2018 at 10:41:40AM +0200, Daniel Vetter wrote:
> On Fri, Aug 24, 2018 at 02:16:34AM +0300, Haneen Mohammed wrote:
> > crtc_state is accessed by both vblank_handle() and the ordered
> > work_struct handle vkms_crc_work_handle() to retrieve and or update
> > the frame number for computed CRC.
> > 
> > Since work_struct can fail, add frame_end to account for missing frame
> > numbers.
> > 
> > use atomic_t witth appropriate flags for synchronization between hrtimer
> > callback and ordered work_struct handle since spinlock can't be used
> > with work_struct handle and mutex can't be used with hrtimer callback.
> > 
> > This patch passes the following subtests from igt kms_pipe_crc_basic test:
> > bad-source, read-crc-pipe-A, read-crc-pipe-A-frame-sequence,
> > nonblocking-crc-pipe-A, nonblocking-crc-pipe-A-frame-sequence
> > 
> > Signed-off-by: Haneen Mohammed 
> 
> So atomic_t is probably the greatest trap in the linux kernel. It sounds
> like the right thing, but in 99% of all case you want to use it it isn't.
> The trouble is that atomic_t is _very_ unordered, the only thing it
> guarantees is that atomic_t transactions to the _same_ variable are
> consistent. But anything else can be reordered at will.
> 
> This is very confusing since the new C++ atomic standards has fully
> ordered atomics as the default, and you expressedly need to ask for the
> weakly ordered ones. In linux you need to sprinkle epic amounts of
> smb_barrier* and similar things around them to make atomic_t behave like a
> "normal" C++ atomic type.
> 
> tldr; atomic_t is good for special refcounting needs, when the normal
> refcount_t doesn't cut it. Not much else.
> 
> What usually should be done:
> - Use normal u64 (to match the vblank counter size) instead of atomic_t
>   here.
> - Make sure all access is protect by an appropriate spinlock.
> 

I see, thanks for the explanation!

hm would the patch be fine if I just switch atomic_t to u64 without
using spinlock? since that won't be possible with the work_struct.

Thanks,
Haneen

> > ---
> >  drivers/gpu/drm/vkms/vkms_crc.c  | 33 ++--
> >  drivers/gpu/drm/vkms/vkms_crtc.c | 13 +++--
> >  drivers/gpu/drm/vkms/vkms_drv.h  |  6 --
> >  3 files changed, 46 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/vkms/vkms_crc.c 
> > b/drivers/gpu/drm/vkms/vkms_crc.c
> > index ed47d67cecd6..4a1ba5b7886a 100644
> > --- a/drivers/gpu/drm/vkms/vkms_crc.c
> > +++ b/drivers/gpu/drm/vkms/vkms_crc.c
> > @@ -34,6 +34,15 @@ static uint32_t _vkms_get_crc(struct vkms_crc_data 
> > *crc_data)
> > return crc;
> >  }
> >  
> > +/**
> > + * vkms_crc_work_handle - ordered work_struct to compute CRC
> > + *
> > + * @work: work_struct
> > + *
> > + * Work handler for computing CRCs. work_struct scheduled in
> > + * an ordered workqueue that's periodically scheduled to run by
> > + * _vblank_handle() and flushed at vkms_atomic_crtc_destroy_state().
> > + */
> >  void vkms_crc_work_handle(struct work_struct *work)
> >  {
> > struct vkms_crtc_state *crtc_state = container_of(work,
> > @@ -45,8 +54,18 @@ void vkms_crc_work_handle(struct work_struct *work)
> > output);
> > struct vkms_crc_data *primary_crc = NULL;
> > struct drm_plane *plane;
> > -
> > u32 crc32 = 0;
> > +   u32 frame_start, frame_end;
> > +
> > +   frame_start = atomic_read(_state->frame_start);
> > +   frame_end = atomic_read(_state->frame_end);
> > +   /* _vblank_handle() hasn't updated frame_start yet */
> > +   if (!frame_start) {
> 
> I think if we go with u64 we can ignore the issues for wrap-arround, since
> that will simply never happen. But a comment would be good.
> 
> Aside from the atomic_t issue I think this looks good.
> -Daniel
> 
> > +   return;
> > +   } else if (frame_start == frame_end) {
> > +   atomic_set(_state->frame_start, 0);
> > +   return;
> > +   }
> >  
> > drm_for_each_plane(plane, >drm) {
> > struct vkms_plane_state *vplane_state;
> > @@ -67,7 +86,17 @@ void vkms_crc_work_handle(struct work_struct *work)
> > if (primary_crc)
> > crc32 = _vkms_get_crc(primary_crc);
> >  
> > -   drm_crtc_add_crc_entry(crtc, true, crtc_state->n_frame, );
> > +   frame_end = drm_crtc_accurate_vblank_count(crtc);
> > +
> > +   /* queue_work can fail to schedule crc_work; add crc for
> > +* missing fra

[PATCH] drm/vkms: Fix race condition around accessing frame number

2018-08-24 Thread Haneen Mohammed
crtc_state is accessed by both vblank_handle() and the ordered
work_struct handle vkms_crc_work_handle() to retrieve and or update
the frame number for computed CRC.

Since work_struct can fail, add frame_end to account for missing frame
numbers.

use atomic_t witth appropriate flags for synchronization between hrtimer
callback and ordered work_struct handle since spinlock can't be used
with work_struct handle and mutex can't be used with hrtimer callback.

This patch passes the following subtests from igt kms_pipe_crc_basic test:
bad-source, read-crc-pipe-A, read-crc-pipe-A-frame-sequence,
nonblocking-crc-pipe-A, nonblocking-crc-pipe-A-frame-sequence

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_crc.c  | 33 ++--
 drivers/gpu/drm/vkms/vkms_crtc.c | 13 +++--
 drivers/gpu/drm/vkms/vkms_drv.h  |  6 --
 3 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
index ed47d67cecd6..4a1ba5b7886a 100644
--- a/drivers/gpu/drm/vkms/vkms_crc.c
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -34,6 +34,15 @@ static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
return crc;
 }
 
+/**
+ * vkms_crc_work_handle - ordered work_struct to compute CRC
+ *
+ * @work: work_struct
+ *
+ * Work handler for computing CRCs. work_struct scheduled in
+ * an ordered workqueue that's periodically scheduled to run by
+ * _vblank_handle() and flushed at vkms_atomic_crtc_destroy_state().
+ */
 void vkms_crc_work_handle(struct work_struct *work)
 {
struct vkms_crtc_state *crtc_state = container_of(work,
@@ -45,8 +54,18 @@ void vkms_crc_work_handle(struct work_struct *work)
output);
struct vkms_crc_data *primary_crc = NULL;
struct drm_plane *plane;
-
u32 crc32 = 0;
+   u32 frame_start, frame_end;
+
+   frame_start = atomic_read(_state->frame_start);
+   frame_end = atomic_read(_state->frame_end);
+   /* _vblank_handle() hasn't updated frame_start yet */
+   if (!frame_start) {
+   return;
+   } else if (frame_start == frame_end) {
+   atomic_set(_state->frame_start, 0);
+   return;
+   }
 
drm_for_each_plane(plane, >drm) {
struct vkms_plane_state *vplane_state;
@@ -67,7 +86,17 @@ void vkms_crc_work_handle(struct work_struct *work)
if (primary_crc)
crc32 = _vkms_get_crc(primary_crc);
 
-   drm_crtc_add_crc_entry(crtc, true, crtc_state->n_frame, );
+   frame_end = drm_crtc_accurate_vblank_count(crtc);
+
+   /* queue_work can fail to schedule crc_work; add crc for
+* missing frames
+*/
+   while (frame_start <= frame_end)
+   drm_crtc_add_crc_entry(crtc, true, frame_start++, );
+
+   /* to avoid using the same value again */
+   atomic_set(_state->frame_end, frame_end);
+   atomic_set(_state->frame_start, 0);
 }
 
 static int vkms_crc_parse_source(const char *src_name, bool *enabled)
diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 9d0b1a325a78..a170677acd46 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -22,8 +22,17 @@ static void _vblank_handle(struct vkms_output *output)
DRM_ERROR("vkms failure on handling vblank");
 
if (state && output->crc_enabled) {
-   state->n_frame = drm_crtc_accurate_vblank_count(crtc);
-   queue_work(output->crc_workq, >crc_work);
+   u32 frame = drm_crtc_accurate_vblank_count(crtc);
+
+   /* update frame_start only if a queued vkms_crc_work_handle has
+* read the data
+*/
+   if (!atomic_read(>frame_start))
+   atomic_set(>frame_start, frame);
+
+   ret = queue_work(output->crc_workq, >crc_work);
+   if (!ret)
+   DRM_WARN("failed to queue vkms_crc_work_handle");
}
 
spin_unlock(>lock);
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 2017a2ccc43d..4a3956a0549e 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -39,12 +39,14 @@ struct vkms_plane_state {
  * vkms_crtc_state - Driver specific CRTC state
  * @base: base CRTC state
  * @crc_work: work struct to compute and add CRC entries
- * @n_frame: frame number for computed CRC
+ * @n_frame_start: start frame number for computed CRC
+ * @n_frame_end: end frame number for computed CRC
  */
 struct vkms_crtc_state {
struct drm_crtc_state base;
struct work_struct crc_work;
-   unsigned int n_frame;
+   atomic_t frame_start;
+   atomic_t frame_end;
 };
 
 struct vkms_output {
-- 
2.17.1

___
dri-d

Re: [PATCH 2/2] drm/vkms: Compute CRC with Cursor Plane

2018-08-16 Thread Haneen Mohammed
On Tue, Aug 14, 2018 at 09:52:33PM +0200, Daniel Vetter wrote:
> On Tue, Aug 14, 2018 at 9:03 PM, Haneen Mohammed
>  wrote:
> > On Tue, Aug 14, 2018 at 10:21:29AM +0200, Daniel Vetter wrote:
> >> On Mon, Aug 13, 2018 at 11:04:11PM +0300, Haneen Mohammed wrote:
> >> > On Wed, Aug 08, 2018 at 10:23:27AM +0200, Daniel Vetter wrote:
> >> > > On Wed, Aug 08, 2018 at 06:53:17AM +0300, Haneen Mohammed wrote:
> >> > > > On Tue, Aug 07, 2018 at 06:33:36PM +0200, Daniel Vetter wrote:
> >> > > > > On Mon, Aug 06, 2018 at 06:58:29AM +0300, Haneen Mohammed wrote:
> >> > > > > > This patch compute CRC for output frame with cursor and primary 
> >> > > > > > plane.
> >> > > > > > Blend cursor with primary plane and compute CRC on the resulted 
> >> > > > > > frame.
> >> > > > > >
> >> > > > > > Signed-off-by: Haneen Mohammed 
> >> > > > >
> >> > > > > Nice!
> >> > > > >
> >> > > > > I assume with this you're passing all the crc based cursor tests 
> >> > > > > in igt?
> >> > > > > If so, please mention this in the commit message, so that there's 
> >> > > > > a record
> >> > > > > of the testing done on this.
> >> > > > >
> >> > > >
> >> > > > Sure, I'll update the commit message.
> >> > > > Is there any other change I should add/fix to this patchset?
> >> > > >
> >> > > > > One fairly huge gap we iirc have in our cursor testing is that 
> >> > > > > there's not
> >> > > > > much (if any?) alpha blending coverage. We kinda need that to make 
> >> > > > > sure
> >> > > > > this all works correctly. The usual trick is to only check the 
> >> > > > > extreme
> >> > > > > alpha values, i.e. fully opaque and fully transparent, since 
> >> > > > > intermediate
> >> > > > > values are affected by hw-specific rounding modes.
> >> > > > > > ---
> >> > > > > >  drivers/gpu/drm/vkms/vkms_crc.c   | 149 
> >> > > > > > +-
> >> > > > > >  drivers/gpu/drm/vkms/vkms_drv.h   |   5 +-
> >> > > > > >  drivers/gpu/drm/vkms/vkms_plane.c |  10 +-
> >> > > > > >  3 files changed, 137 insertions(+), 27 deletions(-)
> >> > > > > >
> >> > > > > > diff --git a/drivers/gpu/drm/vkms/vkms_crc.c 
> >> > > > > > b/drivers/gpu/drm/vkms/vkms_crc.c
> >> > > > > > index 37d717f38e3c..4853a739ae5a 100644
> >> > > > > > --- a/drivers/gpu/drm/vkms/vkms_crc.c
> >> > > > > > +++ b/drivers/gpu/drm/vkms/vkms_crc.c
> >> > > > > > @@ -1,36 +1,137 @@
> >> > > > > >  // SPDX-License-Identifier: GPL-2.0
> >> > > > > >  #include "vkms_drv.h"
> >> > > > > >  #include 
> >> > > > > > +#include 
> >> > > > > > +#include 
> >> > > > > >  #include 
> >> > > > > >
> >> > > > > > -static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
> >> > > > > > +/**
> >> > > > > > + * compute_crc - Compute CRC value on output frame
> >> > > > > > + *
> >> > > > > > + * @vaddr_out: address to final framebuffer
> >> > > > > > + * @crc_out: framebuffer's metadata
> >> > > > > > + *
> >> > > > > > + * returns CRC value computed using crc32 on the visible 
> >> > > > > > portion of
> >> > > > > > + * the final framebuffer at vaddr_out
> >> > > > > > + */
> >> > > > > > +static uint32_t compute_crc(void *vaddr_out, struct 
> >> > > > > > vkms_crc_data *crc_out)
> >> > > > > >  {
> >> > > > > > -   struct drm_framebuffer *fb = _data->fb;
> >> > > > > > +   int i, src_offset;
> >> > > > > > +   int x_src = crc_out->src.x1 >> 16;
> >> > > > > > +   int y_src = crc_out->src.y

Re: [PATCH 2/2] drm/vkms: Compute CRC with Cursor Plane

2018-08-15 Thread Haneen Mohammed
On Tue, Aug 14, 2018 at 09:52:33PM +0200, Daniel Vetter wrote:
> On Tue, Aug 14, 2018 at 9:03 PM, Haneen Mohammed
>  wrote:
> > On Tue, Aug 14, 2018 at 10:21:29AM +0200, Daniel Vetter wrote:
> >> On Mon, Aug 13, 2018 at 11:04:11PM +0300, Haneen Mohammed wrote:
> >> > On Wed, Aug 08, 2018 at 10:23:27AM +0200, Daniel Vetter wrote:
> >> > > On Wed, Aug 08, 2018 at 06:53:17AM +0300, Haneen Mohammed wrote:
> >> > > > On Tue, Aug 07, 2018 at 06:33:36PM +0200, Daniel Vetter wrote:
> >> > > > > On Mon, Aug 06, 2018 at 06:58:29AM +0300, Haneen Mohammed wrote:
> >> > > > > > This patch compute CRC for output frame with cursor and primary 
> >> > > > > > plane.
> >> > > > > > Blend cursor with primary plane and compute CRC on the resulted 
> >> > > > > > frame.
> >> > > > > >
> >> > > > > > Signed-off-by: Haneen Mohammed 
> >> > > > >
> >> > > > > Nice!
> >> > > > >
> >> > > > > I assume with this you're passing all the crc based cursor tests 
> >> > > > > in igt?
> >> > > > > If so, please mention this in the commit message, so that there's 
> >> > > > > a record
> >> > > > > of the testing done on this.
> >> > > > >
> >> > > >
> >> > > > Sure, I'll update the commit message.
> >> > > > Is there any other change I should add/fix to this patchset?
> >> > > >
> >> > > > > One fairly huge gap we iirc have in our cursor testing is that 
> >> > > > > there's not
> >> > > > > much (if any?) alpha blending coverage. We kinda need that to make 
> >> > > > > sure
> >> > > > > this all works correctly. The usual trick is to only check the 
> >> > > > > extreme
> >> > > > > alpha values, i.e. fully opaque and fully transparent, since 
> >> > > > > intermediate
> >> > > > > values are affected by hw-specific rounding modes.
> >> > > > > > ---
> >> > > > > >  drivers/gpu/drm/vkms/vkms_crc.c   | 149 
> >> > > > > > +-
> >> > > > > >  drivers/gpu/drm/vkms/vkms_drv.h   |   5 +-
> >> > > > > >  drivers/gpu/drm/vkms/vkms_plane.c |  10 +-
> >> > > > > >  3 files changed, 137 insertions(+), 27 deletions(-)
> >> > > > > >
> >> > > > > > diff --git a/drivers/gpu/drm/vkms/vkms_crc.c 
> >> > > > > > b/drivers/gpu/drm/vkms/vkms_crc.c
> >> > > > > > index 37d717f38e3c..4853a739ae5a 100644
> >> > > > > > --- a/drivers/gpu/drm/vkms/vkms_crc.c
> >> > > > > > +++ b/drivers/gpu/drm/vkms/vkms_crc.c
> >> > > > > > @@ -1,36 +1,137 @@
> >> > > > > >  // SPDX-License-Identifier: GPL-2.0
> >> > > > > >  #include "vkms_drv.h"
> >> > > > > >  #include 
> >> > > > > > +#include 
> >> > > > > > +#include 
> >> > > > > >  #include 
> >> > > > > >
> >> > > > > > -static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
> >> > > > > > +/**
> >> > > > > > + * compute_crc - Compute CRC value on output frame
> >> > > > > > + *
> >> > > > > > + * @vaddr_out: address to final framebuffer
> >> > > > > > + * @crc_out: framebuffer's metadata
> >> > > > > > + *
> >> > > > > > + * returns CRC value computed using crc32 on the visible 
> >> > > > > > portion of
> >> > > > > > + * the final framebuffer at vaddr_out
> >> > > > > > + */
> >> > > > > > +static uint32_t compute_crc(void *vaddr_out, struct 
> >> > > > > > vkms_crc_data *crc_out)
> >> > > > > >  {
> >> > > > > > -   struct drm_framebuffer *fb = _data->fb;
> >> > > > > > +   int i, src_offset;
> >> > > > > > +   int x_src = crc_out->src.x1 >> 16;
> >> > > > > > +   int y_src = crc_out->

Re: [PATCH 2/2] drm/vkms: Compute CRC with Cursor Plane

2018-08-15 Thread Haneen Mohammed
On Tue, Aug 14, 2018 at 10:21:29AM +0200, Daniel Vetter wrote:
> On Mon, Aug 13, 2018 at 11:04:11PM +0300, Haneen Mohammed wrote:
> > On Wed, Aug 08, 2018 at 10:23:27AM +0200, Daniel Vetter wrote:
> > > On Wed, Aug 08, 2018 at 06:53:17AM +0300, Haneen Mohammed wrote:
> > > > On Tue, Aug 07, 2018 at 06:33:36PM +0200, Daniel Vetter wrote:
> > > > > On Mon, Aug 06, 2018 at 06:58:29AM +0300, Haneen Mohammed wrote:
> > > > > > This patch compute CRC for output frame with cursor and primary 
> > > > > > plane.
> > > > > > Blend cursor with primary plane and compute CRC on the resulted 
> > > > > > frame.
> > > > > > 
> > > > > > Signed-off-by: Haneen Mohammed 
> > > > > 
> > > > > Nice!
> > > > > 
> > > > > I assume with this you're passing all the crc based cursor tests in 
> > > > > igt?
> > > > > If so, please mention this in the commit message, so that there's a 
> > > > > record
> > > > > of the testing done on this.
> > > > > 
> > > > 
> > > > Sure, I'll update the commit message.
> > > > Is there any other change I should add/fix to this patchset?
> > > > 
> > > > > One fairly huge gap we iirc have in our cursor testing is that 
> > > > > there's not
> > > > > much (if any?) alpha blending coverage. We kinda need that to make 
> > > > > sure
> > > > > this all works correctly. The usual trick is to only check the extreme
> > > > > alpha values, i.e. fully opaque and fully transparent, since 
> > > > > intermediate
> > > > > values are affected by hw-specific rounding modes.
> > > > > > ---
> > > > > >  drivers/gpu/drm/vkms/vkms_crc.c   | 149 
> > > > > > +-
> > > > > >  drivers/gpu/drm/vkms/vkms_drv.h   |   5 +-
> > > > > >  drivers/gpu/drm/vkms/vkms_plane.c |  10 +-
> > > > > >  3 files changed, 137 insertions(+), 27 deletions(-)
> > > > > > 
> > > > > > diff --git a/drivers/gpu/drm/vkms/vkms_crc.c 
> > > > > > b/drivers/gpu/drm/vkms/vkms_crc.c
> > > > > > index 37d717f38e3c..4853a739ae5a 100644
> > > > > > --- a/drivers/gpu/drm/vkms/vkms_crc.c
> > > > > > +++ b/drivers/gpu/drm/vkms/vkms_crc.c
> > > > > > @@ -1,36 +1,137 @@
> > > > > >  // SPDX-License-Identifier: GPL-2.0
> > > > > >  #include "vkms_drv.h"
> > > > > >  #include 
> > > > > > +#include 
> > > > > > +#include 
> > > > > >  #include 
> > > > > >  
> > > > > > -static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
> > > > > > +/**
> > > > > > + * compute_crc - Compute CRC value on output frame
> > > > > > + *
> > > > > > + * @vaddr_out: address to final framebuffer
> > > > > > + * @crc_out: framebuffer's metadata
> > > > > > + *
> > > > > > + * returns CRC value computed using crc32 on the visible portion of
> > > > > > + * the final framebuffer at vaddr_out
> > > > > > + */
> > > > > > +static uint32_t compute_crc(void *vaddr_out, struct vkms_crc_data 
> > > > > > *crc_out)
> > > > > >  {
> > > > > > -   struct drm_framebuffer *fb = _data->fb;
> > > > > > +   int i, src_offset;
> > > > > > +   int x_src = crc_out->src.x1 >> 16;
> > > > > > +   int y_src = crc_out->src.y1 >> 16;
> > > > > > +   int h_src = drm_rect_height(_out->src) >> 16;
> > > > > > +   int w_src = drm_rect_width(_out->src) >> 16;
> > > > > > +   int size_byte = w_src * crc_out->cpp;
> > > > > > +   u32 crc = 0;
> > > > > > +
> > > > > > +   for (i = y_src; i < y_src + h_src; i++) {
> > > > > > +   src_offset = crc_out->offset
> > > > > > ++ (i * crc_out->pitch)
> > > > > > ++ (x_src * crc_out->cpp);
> > > > > > +   crc = crc32_le(crc, vaddr_out + src_offset, size_byte);
> > > > > > +   }
> > > > >

Re: [PATCH 2/2] drm/vkms: Compute CRC with Cursor Plane

2018-08-14 Thread Haneen Mohammed
On Wed, Aug 08, 2018 at 10:23:27AM +0200, Daniel Vetter wrote:
> On Wed, Aug 08, 2018 at 06:53:17AM +0300, Haneen Mohammed wrote:
> > On Tue, Aug 07, 2018 at 06:33:36PM +0200, Daniel Vetter wrote:
> > > On Mon, Aug 06, 2018 at 06:58:29AM +0300, Haneen Mohammed wrote:
> > > > This patch compute CRC for output frame with cursor and primary plane.
> > > > Blend cursor with primary plane and compute CRC on the resulted frame.
> > > > 
> > > > Signed-off-by: Haneen Mohammed 
> > > 
> > > Nice!
> > > 
> > > I assume with this you're passing all the crc based cursor tests in igt?
> > > If so, please mention this in the commit message, so that there's a record
> > > of the testing done on this.
> > > 
> > 
> > Sure, I'll update the commit message.
> > Is there any other change I should add/fix to this patchset?
> > 
> > > One fairly huge gap we iirc have in our cursor testing is that there's not
> > > much (if any?) alpha blending coverage. We kinda need that to make sure
> > > this all works correctly. The usual trick is to only check the extreme
> > > alpha values, i.e. fully opaque and fully transparent, since intermediate
> > > values are affected by hw-specific rounding modes.
> > > > ---
> > > >  drivers/gpu/drm/vkms/vkms_crc.c   | 149 +-
> > > >  drivers/gpu/drm/vkms/vkms_drv.h   |   5 +-
> > > >  drivers/gpu/drm/vkms/vkms_plane.c |  10 +-
> > > >  3 files changed, 137 insertions(+), 27 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/vkms/vkms_crc.c 
> > > > b/drivers/gpu/drm/vkms/vkms_crc.c
> > > > index 37d717f38e3c..4853a739ae5a 100644
> > > > --- a/drivers/gpu/drm/vkms/vkms_crc.c
> > > > +++ b/drivers/gpu/drm/vkms/vkms_crc.c
> > > > @@ -1,36 +1,137 @@
> > > >  // SPDX-License-Identifier: GPL-2.0
> > > >  #include "vkms_drv.h"
> > > >  #include 
> > > > +#include 
> > > > +#include 
> > > >  #include 
> > > >  
> > > > -static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
> > > > +/**
> > > > + * compute_crc - Compute CRC value on output frame
> > > > + *
> > > > + * @vaddr_out: address to final framebuffer
> > > > + * @crc_out: framebuffer's metadata
> > > > + *
> > > > + * returns CRC value computed using crc32 on the visible portion of
> > > > + * the final framebuffer at vaddr_out
> > > > + */
> > > > +static uint32_t compute_crc(void *vaddr_out, struct vkms_crc_data 
> > > > *crc_out)
> > > >  {
> > > > -   struct drm_framebuffer *fb = _data->fb;
> > > > +   int i, src_offset;
> > > > +   int x_src = crc_out->src.x1 >> 16;
> > > > +   int y_src = crc_out->src.y1 >> 16;
> > > > +   int h_src = drm_rect_height(_out->src) >> 16;
> > > > +   int w_src = drm_rect_width(_out->src) >> 16;
> > > > +   int size_byte = w_src * crc_out->cpp;
> > > > +   u32 crc = 0;
> > > > +
> > > > +   for (i = y_src; i < y_src + h_src; i++) {
> > > > +   src_offset = crc_out->offset
> > > > ++ (i * crc_out->pitch)
> > > > ++ (x_src * crc_out->cpp);
> > > > +   crc = crc32_le(crc, vaddr_out + src_offset, size_byte);
> > > > +   }
> > > > +
> > > > +   return crc;
> > > > +}
> > > > +

Hey Daniel, 

When I change the above function "compute_crc" to compute the CRC for
each pixel so we can clear the Alpha value before computing the CRC as bellow,
the test "nonblocking-crc-pipe-A-frame-sequence" sometimes failes and
sometimes passes. Should I still continue with the change, or leave it
as it is?

- vkms_crc.c -
for (i = y_src; i < y_src + h_src; ++i) {
for (j = x_src; j < x_src + w_src; ++j) {
src_offset = crc_out->offset
 + (i * crc_out->pitch)
 + (j * crc_out->cpp);
memset(vaddr_out + src_offset + 24, 0,  8);
crc = crc32_le(crc, vaddr_out + src_offset, 
sizeof(u32));
}
}
- vkms_crc.c -

Thank you,
Haneen

&g

Re: [PATCH] drm/vkms: Fix vmap_count increment position

2018-08-11 Thread Haneen Mohammed
On Wed, Aug 01, 2018 at 12:08:07PM +0300, Haneen Mohammed wrote:
> Move vmap_count out of the conditional statement since it needs
> to be updated for every successful call to vkms_gem_vmap.
> 
> Signed-off-by: Haneen Mohammed 
> ---
>  drivers/gpu/drm/vkms/vkms_gem.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c
> index a52e88338c05..5c51dfde7c1e 100644
> --- a/drivers/gpu/drm/vkms/vkms_gem.c
> +++ b/drivers/gpu/drm/vkms/vkms_gem.c
> @@ -240,10 +240,9 @@ int vkms_gem_vmap(struct drm_gem_object *obj)
>   vkms_obj->vaddr = vmap(pages, n_pages, VM_MAP, PAGE_KERNEL);
>   if (!vkms_obj->vaddr)
>   goto err_vmap;
> -
> - vkms_obj->vmap_count++;
>   }
>  
> + vkms_obj->vmap_count++;
>   goto out;
>  
>  err_vmap:
> -- 
> 2.17.1
> 

Hi Sean,

This is a fix to bb112b14af8d ("drm/vkms: Add functions to map/unmap GEM
backing storage"), should I add this to the commit message?

Thank you,
Haneen
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 2/2] drm/vkms: Compute CRC with Cursor Plane

2018-08-11 Thread Haneen Mohammed
On Tue, Aug 07, 2018 at 06:33:36PM +0200, Daniel Vetter wrote:
> On Mon, Aug 06, 2018 at 06:58:29AM +0300, Haneen Mohammed wrote:
> > This patch compute CRC for output frame with cursor and primary plane.
> > Blend cursor with primary plane and compute CRC on the resulted frame.
> > 
> > Signed-off-by: Haneen Mohammed 
> 
> Nice!
> 
> I assume with this you're passing all the crc based cursor tests in igt?
> If so, please mention this in the commit message, so that there's a record
> of the testing done on this.
> 

Sure, I'll update the commit message.
Is there any other change I should add/fix to this patchset?

> One fairly huge gap we iirc have in our cursor testing is that there's not
> much (if any?) alpha blending coverage. We kinda need that to make sure
> this all works correctly. The usual trick is to only check the extreme
> alpha values, i.e. fully opaque and fully transparent, since intermediate
> values are affected by hw-specific rounding modes.
> > ---
> >  drivers/gpu/drm/vkms/vkms_crc.c   | 149 +-
> >  drivers/gpu/drm/vkms/vkms_drv.h   |   5 +-
> >  drivers/gpu/drm/vkms/vkms_plane.c |  10 +-
> >  3 files changed, 137 insertions(+), 27 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/vkms/vkms_crc.c 
> > b/drivers/gpu/drm/vkms/vkms_crc.c
> > index 37d717f38e3c..4853a739ae5a 100644
> > --- a/drivers/gpu/drm/vkms/vkms_crc.c
> > +++ b/drivers/gpu/drm/vkms/vkms_crc.c
> > @@ -1,36 +1,137 @@
> >  // SPDX-License-Identifier: GPL-2.0
> >  #include "vkms_drv.h"
> >  #include 
> > +#include 
> > +#include 
> >  #include 
> >  
> > -static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
> > +/**
> > + * compute_crc - Compute CRC value on output frame
> > + *
> > + * @vaddr_out: address to final framebuffer
> > + * @crc_out: framebuffer's metadata
> > + *
> > + * returns CRC value computed using crc32 on the visible portion of
> > + * the final framebuffer at vaddr_out
> > + */
> > +static uint32_t compute_crc(void *vaddr_out, struct vkms_crc_data *crc_out)
> >  {
> > -   struct drm_framebuffer *fb = _data->fb;
> > +   int i, src_offset;
> > +   int x_src = crc_out->src.x1 >> 16;
> > +   int y_src = crc_out->src.y1 >> 16;
> > +   int h_src = drm_rect_height(_out->src) >> 16;
> > +   int w_src = drm_rect_width(_out->src) >> 16;
> > +   int size_byte = w_src * crc_out->cpp;
> > +   u32 crc = 0;
> > +
> > +   for (i = y_src; i < y_src + h_src; i++) {
> > +   src_offset = crc_out->offset
> > ++ (i * crc_out->pitch)
> > ++ (x_src * crc_out->cpp);
> > +   crc = crc32_le(crc, vaddr_out + src_offset, size_byte);
> > +   }
> > +
> > +   return crc;
> > +}
> > +
> > +/**
> > + * blend - belnd value at vaddr_src with value at vaddr_dst
> > + * @vaddr_dst: destination address
> > + * @vaddr_src: source address
> > + * @crc_dst: destination framebuffer's metadata
> > + * @crc_src: source framebuffer's metadata
> > + *
> > + * Blend value at vaddr_src with value at vaddr_dst.
> > + * Currently, this function write value at vaddr_src on value
> > + * at vaddr_dst using buffer's metadata to locate the new values
> > + * from vaddr_src and their distenation at vaddr_dst.
> > + *
> > + * Todo: Use the alpha value to blend vaddr_src with vaddr_dst
> > + *  instead of overwriting it.
> 
> Another todo: We must clear the alpha channel in the result after
> blending. This also applies to the primary plane, where the XRGB for the
> pixel format mandates that we entirely ignore the alpha channel.
> 
> This is also something we should probably have an igt testcase for.
> 
> Since there's a few open ends: How many weeks are left in your outreachy
> internship? We need to make sure that at least all the issues are covered
> in a vkms todo file. Would be great to add that in
> Documentation/gpu/vkms.rst, like we have for other drivers.
> -Daniel
> 

I've one more week! I can use this week to prepare the todo file and
finalize this patch?

Thank you,
Haneen

> > + */
> > +static void blend(void *vaddr_dst, void *vaddr_src,
> > + struct vkms_crc_data *crc_dst,
> > + struct vkms_crc_data *crc_src)
> > +{
> > +   int i, j, j_dst, i_dst;
> > +   int offset_src, offset_dst;
> > +
> > +   int x_src = crc_src->src.x1 >> 16;
> > +   int y_src = crc_src->src.y1 >&g

[PATCH] drm/vkms: Release pages_lock before return

2018-08-06 Thread Haneen Mohammed
Release pages_lock before return when vkms_obj->vaddr is NULL.
This patch fixes: 6c234fe37c57 ("drm/vkms: Implement CRC debugfs API").

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_crc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
index 9b909221943f..37d717f38e3c 100644
--- a/drivers/gpu/drm/vkms/vkms_crc.c
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -22,14 +22,15 @@ static uint32_t _vkms_get_crc(struct vkms_crc_data 
*crc_data)
mutex_lock(_obj->pages_lock);
vaddr = vkms_obj->vaddr;
if (WARN_ON(!vaddr))
-   return crc;
+   goto out;
 
for (i = y; i < y + height; i++) {
src_offset = fb->offsets[0] + (i * fb->pitches[0]) + (x * cpp);
crc = crc32_le(crc, vaddr + src_offset, size_byte);
}
-   mutex_unlock(_obj->pages_lock);
 
+out:
+   mutex_unlock(_obj->pages_lock);
return crc;
 }
 
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 0/2] Compute CRC with cursor plane support

2018-08-06 Thread Haneen Mohammed
This patchset add support for cursor plane and compute CRC for output
frame with cursor and primary planes.

This currently passes cursor-size-change, onscreen, offscreen, sliding,
random, dpms, and rapid-movement igt tests with 64x64 cursor.

Haneen Mohammed (2):
  drm/vkms: Add cursor plane support
  drm/vkms: Compute CRC with Cursor Plane

 drivers/gpu/drm/vkms/vkms_crc.c| 149 -
 drivers/gpu/drm/vkms/vkms_drv.h|  16 +++-
 drivers/gpu/drm/vkms/vkms_output.c |  16 +++-
 drivers/gpu/drm/vkms/vkms_plane.c  |  43 ++---
 4 files changed, 181 insertions(+), 43 deletions(-)

-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 2/2] drm/vkms: Compute CRC with Cursor Plane

2018-08-06 Thread Haneen Mohammed
This patch compute CRC for output frame with cursor and primary plane.
Blend cursor with primary plane and compute CRC on the resulted frame.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_crc.c   | 149 +-
 drivers/gpu/drm/vkms/vkms_drv.h   |   5 +-
 drivers/gpu/drm/vkms/vkms_plane.c |  10 +-
 3 files changed, 137 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
index 37d717f38e3c..4853a739ae5a 100644
--- a/drivers/gpu/drm/vkms/vkms_crc.c
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -1,36 +1,137 @@
 // SPDX-License-Identifier: GPL-2.0
 #include "vkms_drv.h"
 #include 
+#include 
+#include 
 #include 
 
-static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
+/**
+ * compute_crc - Compute CRC value on output frame
+ *
+ * @vaddr_out: address to final framebuffer
+ * @crc_out: framebuffer's metadata
+ *
+ * returns CRC value computed using crc32 on the visible portion of
+ * the final framebuffer at vaddr_out
+ */
+static uint32_t compute_crc(void *vaddr_out, struct vkms_crc_data *crc_out)
 {
-   struct drm_framebuffer *fb = _data->fb;
+   int i, src_offset;
+   int x_src = crc_out->src.x1 >> 16;
+   int y_src = crc_out->src.y1 >> 16;
+   int h_src = drm_rect_height(_out->src) >> 16;
+   int w_src = drm_rect_width(_out->src) >> 16;
+   int size_byte = w_src * crc_out->cpp;
+   u32 crc = 0;
+
+   for (i = y_src; i < y_src + h_src; i++) {
+   src_offset = crc_out->offset
++ (i * crc_out->pitch)
++ (x_src * crc_out->cpp);
+   crc = crc32_le(crc, vaddr_out + src_offset, size_byte);
+   }
+
+   return crc;
+}
+
+/**
+ * blend - belnd value at vaddr_src with value at vaddr_dst
+ * @vaddr_dst: destination address
+ * @vaddr_src: source address
+ * @crc_dst: destination framebuffer's metadata
+ * @crc_src: source framebuffer's metadata
+ *
+ * Blend value at vaddr_src with value at vaddr_dst.
+ * Currently, this function write value at vaddr_src on value
+ * at vaddr_dst using buffer's metadata to locate the new values
+ * from vaddr_src and their distenation at vaddr_dst.
+ *
+ * Todo: Use the alpha value to blend vaddr_src with vaddr_dst
+ *  instead of overwriting it.
+ */
+static void blend(void *vaddr_dst, void *vaddr_src,
+ struct vkms_crc_data *crc_dst,
+ struct vkms_crc_data *crc_src)
+{
+   int i, j, j_dst, i_dst;
+   int offset_src, offset_dst;
+
+   int x_src = crc_src->src.x1 >> 16;
+   int y_src = crc_src->src.y1 >> 16;
+
+   int x_dst = crc_src->dst.x1;
+   int y_dst = crc_src->dst.y1;
+   int h_dst = drm_rect_height(_src->dst);
+   int w_dst = drm_rect_width(_src->dst);
+
+   int y_limit = y_src + h_dst;
+   int x_limit = x_src + w_dst;
+
+   for (i = y_src, i_dst = y_dst; i < y_limit; ++i) {
+   for (j = x_src, j_dst = x_dst; j < x_limit; ++j) {
+   offset_dst = crc_dst->offset
++ (i_dst * crc_dst->pitch)
++ (j_dst++ * crc_dst->cpp);
+   offset_src = crc_src->offset
++ (i * crc_src->pitch)
++ (j * crc_src->cpp);
+
+   memcpy(vaddr_dst + offset_dst,
+  vaddr_src + offset_src, sizeof(u32));
+   }
+   i_dst++;
+   }
+}
+
+static void compose_cursor(struct vkms_crc_data *cursor_crc,
+  struct vkms_crc_data *primary_crc, void *vaddr_out)
+{
+   struct drm_gem_object *cursor_obj;
+   struct vkms_gem_object *cursor_vkms_obj;
+
+   cursor_obj = drm_gem_fb_get_obj(_crc->fb, 0);
+   cursor_vkms_obj = drm_gem_to_vkms_gem(cursor_obj);
+
+   mutex_lock(_vkms_obj->pages_lock);
+   if (WARN_ON(!cursor_vkms_obj->vaddr))
+   goto out;
+
+   blend(vaddr_out, cursor_vkms_obj->vaddr, primary_crc, cursor_crc);
+
+out:
+   mutex_unlock(_vkms_obj->pages_lock);
+}
+
+static uint32_t _vkms_get_crc(struct vkms_crc_data *primary_crc,
+ struct vkms_crc_data *cursor_crc)
+{
+   struct drm_framebuffer *fb = _crc->fb;
struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
+   void *vaddr_out = kzalloc(vkms_obj->gem.size, GFP_KERNEL);
u32 crc = 0;
-   int i = 0;
-   unsigned int x = crc_data->src.x1 >> 16;
-   unsigned int y = crc_data->src.y1 >> 16;
-   unsigned int height = drm_rect_height(_data->src) >> 16;
-   unsigned int width = drm_rect_width(_data->src) >> 1

Re: [PATCH v2 2/2] drm/vkms: Implement CRC debugfs API

2018-08-06 Thread Haneen Mohammed
On Fri, Aug 03, 2018 at 12:53:36PM -0400, Sean Paul wrote:
> On Thu, Aug 02, 2018 at 04:10:26AM +0300, Haneen Mohammed wrote:
> > This patch implement the necessary functions to compute and add CRCs
> > entries:
> > 
> > - Implement the set_crc_source() callback.
> > - Compute CRC using crc32 on the visible part of the framebuffer.
> > - Use ordered workqueue per output to compute and add CRC at the end
> >   of a vblank.
> > - Use appropriate synchronization methods since the CRC computation must
> >   be atomic wrt the generated vblank event for a given atomic update, by
> >   using spinlock across atomic_begin/atomic_flush to wrap the event
> >   handling code completely and match the flip event with the CRC.
> > 
> > Since vkms_crc_work_handle() can sleep, spinlock can't be acquired
> > while accessing vkms_output->primary_crc to compute CRC.
> > To make sure the data is updated and released without conflict with
> > the vkms_crc_work_handle(), the work_struct is flushed @crtc_destroy
> > and the data is updated before scheduling the work handle again, as
> > follow:
> > 
> > * CRC data update:
> > 1- store vkms_crc_data {fb, src} per plane_state
> > 2- @plane_duplicate_state -> allocate vkms_crc_data
> > 3- during atomic commit (@atomic_update) ->
> > a) copy {fb, src} to plane_state->crc_data
> > b) get reference to fb,
> > 3- @plane_destroy_state -> a) if (fb refcount) remove reference to fb
> >b) deallocate crc_data
> > 
> > * Atomic Commit:
> > 1- vkms_plane_atomic_check
> > 2- vkms_prepare_fb -> vmap vkms_gem_obj->vaddr
> > 3- atomic_begin -> hold crc spinlock
> > 4- atomic_plane_update -> a) update vkms_output->primary_crc
> >   b) get reference to fb
> > 5- atomic_flush -> a) send vblank event while holding event_lock
> >b) release crc spinlock
> > 
> > * hrtimer regular callback:
> > 1- hold crc spinlock
> > 2- drm_crtc_handle_vblank()
> > 3- queue vkms_crc_work_handle
> > 4- release crc spinlock
> > 
> > * cleanup:
> > 1- @cleanup_fb ->vunmap vkms_gem_obj->vaddr
> > 2- @crtc_destroy -> flush work struct
> > 3- @plane_destroy -> a) if (fb refcount) remove reference to fb
> >  b) deallocate crc_data
> > 
> > Signed-off-by: Haneen Mohammed 
> 
> Ok, everything looks good to me (aside from the "vblamk" typo, which we can
> fixup on apply).
> 
> I'll wait for Gustavo to respond to the other thread and then we'll go from
> there.
> 
> Reviewed-by: Sean Paul 
> 
> Thanks!
> 
> Sean
> 

Thank you! I'm sorry I've failed to notice that I didnt release pages_lock when
vkms_obj->vaddr is NULL in vkms_get_crc(). I'll send a patch to fix that 
immediately.

> > ---
> > Changes in v2: 
> > - remove vkms_crc_data for primary plane from vkms_output
> >   and access it from vkms_plane_state instead.
> > - flush crc_workq in vkms_set_crc_source before changing out->enabled
> >   value.
> > 
> >  drivers/gpu/drm/vkms/Makefile |  2 +-
> >  drivers/gpu/drm/vkms/vkms_crc.c   | 95 +++
> >  drivers/gpu/drm/vkms/vkms_crtc.c  | 56 +++---
> >  drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
> >  drivers/gpu/drm/vkms/vkms_drv.h   | 21 +++
> >  drivers/gpu/drm/vkms/vkms_plane.c | 30 ++
> >  6 files changed, 196 insertions(+), 9 deletions(-)
> >  create mode 100644 drivers/gpu/drm/vkms/vkms_crc.c
> > 
> > diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
> > index 986297da51bf..37966914f70b 100644
> > --- a/drivers/gpu/drm/vkms/Makefile
> > +++ b/drivers/gpu/drm/vkms/Makefile
> > @@ -1,3 +1,3 @@
> > -vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o
> > +vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o 
> > vkms_crc.o
> >  
> >  obj-$(CONFIG_DRM_VKMS) += vkms.o
> > diff --git a/drivers/gpu/drm/vkms/vkms_crc.c 
> > b/drivers/gpu/drm/vkms/vkms_crc.c
> > new file mode 100644
> > index ..9b909221943f
> > --- /dev/null
> > +++ b/drivers/gpu/drm/vkms/vkms_crc.c
> > @@ -0,0 +1,95 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +#include "vkms_drv.h"
> > +#include 
> > +#include 
> > +
> > +static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
> > +{
> > +   struct drm_framebuffer *fb = _data->fb;
> > +   struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(

[PATCH 1/2] drm/vkms: Add cursor plane support

2018-08-06 Thread Haneen Mohammed
Add cursor plane support and update vkms_plane_atomic_check to enable
positioning cursor plane.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_drv.h| 11 +++---
 drivers/gpu/drm/vkms/vkms_output.c | 16 ---
 drivers/gpu/drm/vkms/vkms_plane.c  | 33 +-
 3 files changed, 44 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index f156c930366a..36e524f791fe 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -7,8 +7,8 @@
 #include 
 #include 
 
-#define XRES_MIN32
-#define YRES_MIN32
+#define XRES_MIN20
+#define YRES_MIN20
 
 #define XRES_DEF  1024
 #define YRES_DEF   768
@@ -20,6 +20,10 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
 
+static const u32 vkms_cursor_formats[] = {
+   DRM_FORMAT_ARGB,
+};
+
 struct vkms_crc_data {
struct drm_rect src;
struct drm_framebuffer fb;
@@ -100,7 +104,8 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, 
unsigned int pipe,
 
 int vkms_output_init(struct vkms_device *vkmsdev);
 
-struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev);
+struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
+ enum drm_plane_type type);
 
 /* Gem stuff */
 struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
diff --git a/drivers/gpu/drm/vkms/vkms_output.c 
b/drivers/gpu/drm/vkms/vkms_output.c
index 901012cb1af1..7cf2867c93f8 100644
--- a/drivers/gpu/drm/vkms/vkms_output.c
+++ b/drivers/gpu/drm/vkms/vkms_output.c
@@ -49,14 +49,20 @@ int vkms_output_init(struct vkms_device *vkmsdev)
struct drm_connector *connector = >connector;
struct drm_encoder *encoder = >encoder;
struct drm_crtc *crtc = >crtc;
-   struct drm_plane *primary;
+   struct drm_plane *primary, *cursor;
int ret;
 
-   primary = vkms_plane_init(vkmsdev);
+   primary = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_PRIMARY);
if (IS_ERR(primary))
return PTR_ERR(primary);
 
-   ret = vkms_crtc_init(dev, crtc, primary, NULL);
+   cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR);
+   if (IS_ERR(cursor)) {
+   ret = PTR_ERR(cursor);
+   goto err_cursor;
+   }
+
+   ret = vkms_crtc_init(dev, crtc, primary, cursor);
if (ret)
goto err_crtc;
 
@@ -106,6 +112,10 @@ int vkms_output_init(struct vkms_device *vkmsdev)
drm_crtc_cleanup(crtc);
 
 err_crtc:
+   drm_plane_cleanup(cursor);
+
+err_cursor:
drm_plane_cleanup(primary);
+
return ret;
 }
diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index c91661631c76..428247d403dc 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -81,8 +81,8 @@ static const struct drm_plane_funcs vkms_plane_funcs = {
.atomic_destroy_state   = vkms_plane_destroy_state,
 };
 
-static void vkms_primary_plane_update(struct drm_plane *plane,
- struct drm_plane_state *old_state)
+static void vkms_plane_atomic_update(struct drm_plane *plane,
+struct drm_plane_state *old_state)
 {
struct vkms_plane_state *vkms_plane_state;
struct vkms_crc_data *crc_data;
@@ -101,6 +101,7 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
   struct drm_plane_state *state)
 {
struct drm_crtc_state *crtc_state;
+   bool can_position = false;
int ret;
 
if (!state->fb | !state->crtc)
@@ -110,15 +111,18 @@ static int vkms_plane_atomic_check(struct drm_plane 
*plane,
if (IS_ERR(crtc_state))
return PTR_ERR(crtc_state);
 
+   if (plane->type == DRM_PLANE_TYPE_CURSOR)
+   can_position = true;
+
ret = drm_atomic_helper_check_plane_state(state, crtc_state,
  DRM_PLANE_HELPER_NO_SCALING,
  DRM_PLANE_HELPER_NO_SCALING,
- false, true);
+ can_position, true);
if (ret != 0)
return ret;
 
/* for now primary plane must be visible and full screen */
-   if (!state->visible)
+   if (!state->visible && !can_position)
return -EINVAL;
 
return 0;
@@ -156,15 +160,17 @@ static void vkms_cleanup_fb(struct drm_plane *plane,
 }
 
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
-   .atomic_update  = vkms_primary_plane_update,
+   .atomic_update  = vkms_plane_atomic_update,
.atomic_check   = vkms_plane_atomic_check,
.prepare_fb = vkms_prepare_fb,
.cleanup_

[PATCH v2 0/2] drm/vkms: Add CRC support

2018-08-02 Thread Haneen Mohammed
This patchset implement CRC debugfs API and add functions needed to compute
and add CRCs entries.

Haneen Mohammed (2):
  drm/vkms: Subclass plane state
  drm/vkms: Implement CRC debugfs API

 drivers/gpu/drm/vkms/Makefile |  2 +-
 drivers/gpu/drm/vkms/vkms_crc.c   | 95 +++
 drivers/gpu/drm/vkms/vkms_crtc.c  | 56 +++---
 drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
 drivers/gpu/drm/vkms/vkms_drv.h   | 32 +++
 drivers/gpu/drm/vkms/vkms_plane.c | 77 -
 6 files changed, 251 insertions(+), 12 deletions(-)
 create mode 100644 drivers/gpu/drm/vkms/vkms_crc.c

-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 1/2] drm/vkms: Subclass plane state

2018-08-02 Thread Haneen Mohammed
Subclass plane state struct to enable storing driver's private
state. This patch only adds the base drm_plane_state struct and
the atomic functions that handle it.

Signed-off-by: Haneen Mohammed 
Reviewed-by: Sean Paul 
---
 drivers/gpu/drm/vkms/vkms_drv.h   | 11 
 drivers/gpu/drm/vkms/vkms_plane.c | 47 +--
 2 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 75e52d61e65d..a1b206643c10 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -20,6 +20,14 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
 
+/**
+ * vkms_plane_state - Driver specific plane state
+ * @base: base plane state
+ */
+struct vkms_plane_state {
+   struct drm_plane_state base;
+};
+
 /**
  * vkms_crtc_state - Driver specific CRTC state
  * @base: base CRTC state
@@ -63,6 +71,9 @@ struct vkms_gem_object {
 #define to_vkms_crtc_state(target)\
container_of(target, struct vkms_crtc_state, base)
 
+#define to_vkms_plane_state(target)\
+   container_of(target, struct vkms_plane_state, base)
+
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
   struct drm_plane *primary, struct drm_plane *cursor);
diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index 8191940844e5..70fca22bc51b 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -12,13 +12,54 @@
 #include 
 #include 
 
+static struct drm_plane_state *
+vkms_plane_duplicate_state(struct drm_plane *plane)
+{
+   struct vkms_plane_state *vkms_state;
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state)
+   return NULL;
+
+   __drm_atomic_helper_plane_duplicate_state(plane,
+ _state->base);
+
+   return _state->base;
+}
+
+static void vkms_plane_destroy_state(struct drm_plane *plane,
+struct drm_plane_state *old_state)
+{
+   struct vkms_plane_state *vkms_state = to_vkms_plane_state(old_state);
+
+   __drm_atomic_helper_plane_destroy_state(old_state);
+   kfree(vkms_state);
+}
+
+static void vkms_plane_reset(struct drm_plane *plane)
+{
+   struct vkms_plane_state *vkms_state;
+
+   if (plane->state)
+   vkms_plane_destroy_state(plane, plane->state);
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state) {
+   DRM_ERROR("Cannot allocate vkms_plane_state\n");
+   return;
+   }
+
+   plane->state = _state->base;
+   plane->state->plane = plane;
+}
+
 static const struct drm_plane_funcs vkms_plane_funcs = {
.update_plane   = drm_atomic_helper_update_plane,
.disable_plane  = drm_atomic_helper_disable_plane,
.destroy= drm_plane_cleanup,
-   .reset  = drm_atomic_helper_plane_reset,
-   .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
-   .atomic_destroy_state   = drm_atomic_helper_plane_destroy_state,
+   .reset  = vkms_plane_reset,
+   .atomic_duplicate_state = vkms_plane_duplicate_state,
+   .atomic_destroy_state   = vkms_plane_destroy_state,
 };
 
 static void vkms_primary_plane_update(struct drm_plane *plane,
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 2/2] drm/vkms: Implement CRC debugfs API

2018-08-02 Thread Haneen Mohammed
This patch implement the necessary functions to compute and add CRCs
entries:

- Implement the set_crc_source() callback.
- Compute CRC using crc32 on the visible part of the framebuffer.
- Use ordered workqueue per output to compute and add CRC at the end
  of a vblank.
- Use appropriate synchronization methods since the CRC computation must
  be atomic wrt the generated vblank event for a given atomic update, by
  using spinlock across atomic_begin/atomic_flush to wrap the event
  handling code completely and match the flip event with the CRC.

Since vkms_crc_work_handle() can sleep, spinlock can't be acquired
while accessing vkms_output->primary_crc to compute CRC.
To make sure the data is updated and released without conflict with
the vkms_crc_work_handle(), the work_struct is flushed @crtc_destroy
and the data is updated before scheduling the work handle again, as
follow:

* CRC data update:
1- store vkms_crc_data {fb, src} per plane_state
2- @plane_duplicate_state -> allocate vkms_crc_data
3- during atomic commit (@atomic_update) ->
a) copy {fb, src} to plane_state->crc_data
b) get reference to fb,
3- @plane_destroy_state -> a) if (fb refcount) remove reference to fb
   b) deallocate crc_data

* Atomic Commit:
1- vkms_plane_atomic_check
2- vkms_prepare_fb -> vmap vkms_gem_obj->vaddr
3- atomic_begin -> hold crc spinlock
4- atomic_plane_update -> a) update vkms_output->primary_crc
  b) get reference to fb
5- atomic_flush -> a) send vblank event while holding event_lock
   b) release crc spinlock

* hrtimer regular callback:
1- hold crc spinlock
2- drm_crtc_handle_vblank()
3- queue vkms_crc_work_handle
4- release crc spinlock

* cleanup:
1- @cleanup_fb ->vunmap vkms_gem_obj->vaddr
2- @crtc_destroy -> flush work struct
3- @plane_destroy -> a) if (fb refcount) remove reference to fb
     b) deallocate crc_data

Signed-off-by: Haneen Mohammed 
---
Changes in v2: 
- remove vkms_crc_data for primary plane from vkms_output
  and access it from vkms_plane_state instead.
- flush crc_workq in vkms_set_crc_source before changing out->enabled
  value.

 drivers/gpu/drm/vkms/Makefile |  2 +-
 drivers/gpu/drm/vkms/vkms_crc.c   | 95 +++
 drivers/gpu/drm/vkms/vkms_crtc.c  | 56 +++---
 drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
 drivers/gpu/drm/vkms/vkms_drv.h   | 21 +++
 drivers/gpu/drm/vkms/vkms_plane.c | 30 ++
 6 files changed, 196 insertions(+), 9 deletions(-)
 create mode 100644 drivers/gpu/drm/vkms/vkms_crc.c

diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
index 986297da51bf..37966914f70b 100644
--- a/drivers/gpu/drm/vkms/Makefile
+++ b/drivers/gpu/drm/vkms/Makefile
@@ -1,3 +1,3 @@
-vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o
+vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o 
vkms_crc.o
 
 obj-$(CONFIG_DRM_VKMS) += vkms.o
diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
new file mode 100644
index ..9b909221943f
--- /dev/null
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "vkms_drv.h"
+#include 
+#include 
+
+static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
+{
+   struct drm_framebuffer *fb = _data->fb;
+   struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
+   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
+   u32 crc = 0;
+   int i = 0;
+   unsigned int x = crc_data->src.x1 >> 16;
+   unsigned int y = crc_data->src.y1 >> 16;
+   unsigned int height = drm_rect_height(_data->src) >> 16;
+   unsigned int width = drm_rect_width(_data->src) >> 16;
+   unsigned int cpp = fb->format->cpp[0];
+   unsigned int src_offset;
+   unsigned int size_byte = width * cpp;
+   void *vaddr;
+
+   mutex_lock(_obj->pages_lock);
+   vaddr = vkms_obj->vaddr;
+   if (WARN_ON(!vaddr))
+   return crc;
+
+   for (i = y; i < y + height; i++) {
+   src_offset = fb->offsets[0] + (i * fb->pitches[0]) + (x * cpp);
+   crc = crc32_le(crc, vaddr + src_offset, size_byte);
+   }
+   mutex_unlock(_obj->pages_lock);
+
+   return crc;
+}
+
+void vkms_crc_work_handle(struct work_struct *work)
+{
+   struct vkms_crtc_state *crtc_state = container_of(work,
+   struct vkms_crtc_state,
+   crc_work);
+   struct drm_crtc *crtc = crtc_state->base.crtc;
+   struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
+   struct vkms_device *vdev = container_of(out, struct vkms_device,
+   output);
+   struct vkms_crc_

[PATCH] drm/vkms: Fix vmap_count increment position

2018-08-02 Thread Haneen Mohammed
Move vmap_count out of the conditional statement since it needs
to be updated for every successful call to vkms_gem_vmap.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_gem.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c
index a52e88338c05..5c51dfde7c1e 100644
--- a/drivers/gpu/drm/vkms/vkms_gem.c
+++ b/drivers/gpu/drm/vkms/vkms_gem.c
@@ -240,10 +240,9 @@ int vkms_gem_vmap(struct drm_gem_object *obj)
vkms_obj->vaddr = vmap(pages, n_pages, VM_MAP, PAGE_KERNEL);
if (!vkms_obj->vaddr)
goto err_vmap;
-
-   vkms_obj->vmap_count++;
}
 
+   vkms_obj->vmap_count++;
goto out;
 
 err_vmap:
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 5/5] drm/vkms: Implement CRC debugfs API

2018-07-30 Thread Haneen Mohammed
On Wed, Jul 18, 2018 at 02:44:18PM -0400, Sean Paul wrote:
> On Wed, Jul 18, 2018 at 07:24:34PM +0300, Haneen Mohammed wrote:
> > First, just so you have the complete view, this is the missing part in this 
> > patch:
> > -- vkms_crc.c
> > static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
> > {
> > struct drm_framebuffer *fb = _data->fb;
> > struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
> > struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
> > u32 crc = 0;
> > int i = 0;
> > unsigned int x = crc_data->src.x1 >> 16;
> > unsigned int y = crc_data->src.y1 >> 16;
> > unsigned int height = drm_rect_height(_data->src) >> 16;
> > unsigned int width = drm_rect_width(_data->src) >> 16;
> > unsigned int cpp = fb->format->cpp[0];
> > unsigned int src_offset;
> > unsigned int size_byte = width * cpp;
> > void *vaddr = vkms_obj->vaddr;
> > 
> > if (WARN_ON(!vaddr))
> > return crc;
> > 
> > for (i = y; i < y + height; i++) {
> > src_offset = fb->offsets[0] + (i * fb->pitches[0]) + (x * cpp);
> > crc = crc32_le(crc, vaddr + src_offset, size_byte);
> > }
> > 
> > return crc;
> > }
> > 
> > void vkms_crc_work_handle(struct work_struct *work)
> > {
> > struct vkms_crtc_state *crtc_state = container_of(work,
> > struct vkms_crtc_state,
> > crc_work);
> > struct drm_crtc *crtc = crtc_state->base.crtc;
> > struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
> > 
> > if (crtc_state && out->crc_enabled) {
> > u32 crc32 = _vkms_get_crc(_state->data);
> > unsigned int n_frame = crtc_state->n_frame;
> > 
> > drm_crtc_add_crc_entry(crtc, true, n_frame, );
> > }
> > }
> > 
> > int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name,
> > size_t *values_cnt)
> > {
> > struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
> > 
> > if (!src_name) {
> > out->crc_enabled = false;
> > } else if (strcmp(src_name, "auto") == 0) {
> > out->crc_enabled = true;
> > } else {
> > out->crc_enabled = false;
> > return -EINVAL;
> > }
> > 
> > *values_cnt = 1;
> > 
> > return 0;
> > }
> > --- end vkms_crc.c
> 
> /snip
> 
> > > > > > > +static void vkms_crtc_atomic_begin(struct drm_crtc *crtc,
> > > > > > > +struct drm_crtc_state 
> > > > > > > *old_crtc_state)
> > > > > > > +{
> > > > > > > + struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
> > > > > > > +
> > > > > > > + spin_lock_irq(_output->lock);
> > > > > > 
> > > > > > Hmm, you can't lock across atomic_begin/flush. What is this 
> > > > > > protecting against?
> > > > > > 
> > > > > 
> > > > > I did this per Daniel recommendation:
> > > > > 1- spin_lock_irq -> vkms_crtc_atomic_begin
> > > > > 2- update vkms_crc_data and get ref to fb -> vkms_primary_plane_update
> > > > > 3- spin_unlock_irq after vblank event -> vkms_crtc_atomic_flush
> > > > 
> > > > I think I'm interpreting his mail a little differently. The point of the
> > > > spinlock is to protect the pointer to the crc_data in vkms_crtc (right 
> > > > now it's
> > > > not a pointer, but it should be).
> > > > 
> > > > So I think you need to do the following:
> > > > - Change crc_data to a pointer
> > > > - In plane_update, allocate new memory to hold crc_data and, under the 
> > > > spinlock,
> > > >   update the crc_data to point to the new memory (add a WARN_ON if the 
> > > > pointer
> > > >   is NULL)
> > > > - In the hrtimer, while holding the spinlock, take the pointer from 
> > > > crc_data
> > > >   into a local variable and clear the crtc->crc_data pointer
> > > > - Pass the pointer (from the local variable) to the crc_worker
> > > > 
> > 
> > The problem wit

[PATCH 1/2] drm/vkms: Subclass plane state

2018-07-28 Thread Haneen Mohammed
Subclass plane state struct to enable storing driver's private
state. This patch only adds the base drm_plane_state struct and
the atomic functions that handle it.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_drv.h   | 10 +++
 drivers/gpu/drm/vkms/vkms_plane.c | 47 +--
 2 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 75e52d61e65d..aa2632ff5f06 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -20,6 +20,13 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
 
+/* vkms_plane_state - Driver specific plane state
+ * @base: base plane state
+ */
+struct vkms_plane_state {
+   struct drm_plane_state base;
+};
+
 /**
  * vkms_crtc_state - Driver specific CRTC state
  * @base: base CRTC state
@@ -63,6 +70,9 @@ struct vkms_gem_object {
 #define to_vkms_crtc_state(target)\
container_of(target, struct vkms_crtc_state, base)
 
+#define to_vkms_plane_state(target)\
+   container_of(target, struct vkms_plane_state, base)
+
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
   struct drm_plane *primary, struct drm_plane *cursor);
diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index 8191940844e5..70fca22bc51b 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -12,13 +12,54 @@
 #include 
 #include 
 
+static struct drm_plane_state *
+vkms_plane_duplicate_state(struct drm_plane *plane)
+{
+   struct vkms_plane_state *vkms_state;
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state)
+   return NULL;
+
+   __drm_atomic_helper_plane_duplicate_state(plane,
+ _state->base);
+
+   return _state->base;
+}
+
+static void vkms_plane_destroy_state(struct drm_plane *plane,
+struct drm_plane_state *old_state)
+{
+   struct vkms_plane_state *vkms_state = to_vkms_plane_state(old_state);
+
+   __drm_atomic_helper_plane_destroy_state(old_state);
+   kfree(vkms_state);
+}
+
+static void vkms_plane_reset(struct drm_plane *plane)
+{
+   struct vkms_plane_state *vkms_state;
+
+   if (plane->state)
+   vkms_plane_destroy_state(plane, plane->state);
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state) {
+   DRM_ERROR("Cannot allocate vkms_plane_state\n");
+   return;
+   }
+
+   plane->state = _state->base;
+   plane->state->plane = plane;
+}
+
 static const struct drm_plane_funcs vkms_plane_funcs = {
.update_plane   = drm_atomic_helper_update_plane,
.disable_plane  = drm_atomic_helper_disable_plane,
.destroy= drm_plane_cleanup,
-   .reset  = drm_atomic_helper_plane_reset,
-   .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
-   .atomic_destroy_state   = drm_atomic_helper_plane_destroy_state,
+   .reset  = vkms_plane_reset,
+   .atomic_duplicate_state = vkms_plane_duplicate_state,
+   .atomic_destroy_state   = vkms_plane_destroy_state,
 };
 
 static void vkms_primary_plane_update(struct drm_plane *plane,
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 2/2] drm/vkms: Implement CRC debugfs API

2018-07-28 Thread Haneen Mohammed
This patch implement the necessary functions to compute and add CRCs
entries:

- Implement the set_crc_source() callback.
- Compute CRC using crc32 on the visible part of the framebuffer.
- Use ordered workqueue per output to compute and add CRC at the end
  of a vblank.
- Use appropriate synchronization methods since the CRC computation must
  be atomic wrt the generated vblank event for a given atomic update, by
  using spinlock across atomic_begin/atomic_flush to wrap the event
  handling code completely and match the flip event with the CRC.

Since vkms_crc_work_handle() can sleep, spinlock can't be acquired
while accessing vkms_output->primary_crc to compute CRC.
To make sure the data is updated and released without conflict with
the vkms_crc_work_handle(), the work_struct is flushed @crtc_destroy
and the data is updated before scheduling the work handle again, as
follow:

* CRC data update:
1- store vkms_crc_data {fb, src} per plane_state
2- @plane_duplicate_state -> allocate vkms_crc_data
3- during atomic commit (@atomic_update) ->
a) copy {fb, src} to plane_state->crc_data
b) get reference to fb,
3- @plane_destroy_state -> a) if (fb refcount) remove reference to fb
   b) deallocate crc_data

* Atomic Commit:
1- vkms_plane_atomic_check
2- vkms_prepare_fb -> vmap vkms_gem_obj->vaddr
3- atomic_begin -> hold crc spinlock
4- atomic_plane_update -> a) update vkms_output->primary_crc
  b) get reference to fb
5- atomic_flush -> a) send vblank event while holding event_lock
   b) release crc spinlock

* hrtimer regular callback:
1- hold crc spinlock
2- drm_crtc_handle_vblank()
3- queue vkms_crc_work_handle
4- release crc spinlock

* cleanup:
1- @cleanup_fb ->vunmap vkms_gem_obj->vaddr
2- @crtc_destroy -> flush work struct
3- @plane_destroy -> a) if (fb refcount) remove reference to fb
     b) deallocate crc_data

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/Makefile |  2 +-
 drivers/gpu/drm/vkms/vkms_crc.c   | 75 +++
 drivers/gpu/drm/vkms/vkms_crtc.c  | 56 +++
 drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
 drivers/gpu/drm/vkms/vkms_drv.h   | 22 +
 drivers/gpu/drm/vkms/vkms_plane.c | 44 ++
 6 files changed, 191 insertions(+), 9 deletions(-)
 create mode 100644 drivers/gpu/drm/vkms/vkms_crc.c

diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
index 986297da51bf..37966914f70b 100644
--- a/drivers/gpu/drm/vkms/Makefile
+++ b/drivers/gpu/drm/vkms/Makefile
@@ -1,3 +1,3 @@
-vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o
+vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o 
vkms_crc.o
 
 obj-$(CONFIG_DRM_VKMS) += vkms.o
diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
new file mode 100644
index ..d4f94ac932a7
--- /dev/null
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -0,0 +1,75 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "vkms_drv.h"
+#include 
+#include 
+
+static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
+{
+   struct drm_framebuffer *fb = _data->fb;
+   struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
+   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
+   u32 crc = 0;
+   int i = 0;
+   unsigned int x = crc_data->src.x1 >> 16;
+   unsigned int y = crc_data->src.y1 >> 16;
+   unsigned int height = drm_rect_height(_data->src) >> 16;
+   unsigned int width = drm_rect_width(_data->src) >> 16;
+   unsigned int cpp = fb->format->cpp[0];
+   unsigned int src_offset;
+   unsigned int size_byte = width * cpp;
+   void *vaddr;
+
+   mutex_lock(_obj->pages_lock);
+   vaddr = vkms_obj->vaddr;
+   if (WARN_ON(!vaddr))
+   return crc;
+
+   for (i = y; i < y + height; i++) {
+   src_offset = fb->offsets[0] + (i * fb->pitches[0]) + (x * cpp);
+   crc = crc32_le(crc, vaddr + src_offset, size_byte);
+   }
+   mutex_unlock(_obj->pages_lock);
+
+   return crc;
+}
+
+void vkms_crc_work_handle(struct work_struct *work)
+{
+   struct vkms_crtc_state *crtc_state = container_of(work,
+   struct vkms_crtc_state,
+   crc_work);
+   struct drm_crtc *crtc = crtc_state->base.crtc;
+   struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
+
+   if (crtc_state && out->crc_enabled) {
+   unsigned int n_frame = crtc_state->n_frame;
+   u32 crc32 = 0;
+
+   if (out->primary_crc)
+   crc32 = _vkms_get_crc(out->primary_crc);
+
+   drm_crtc_add_crc_entry(crtc, true, n_frame, );
+   }
+}
+
+i

[PATCH 0/2] drm/vkms: Add CRC support

2018-07-28 Thread Haneen Mohammed
This patchset implement CRC debugfs API and add functions needed to compute 
and add CRCs entries.


Haneen Mohammed (2):
  drm/vkms: Subclass plane state
  drm/vkms: Implement CRC debugfs API

 drivers/gpu/drm/vkms/Makefile |  2 +-
 drivers/gpu/drm/vkms/vkms_crc.c   | 75 +
 drivers/gpu/drm/vkms/vkms_crtc.c  | 56 ---
 drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
 drivers/gpu/drm/vkms/vkms_drv.h   | 32 +++
 drivers/gpu/drm/vkms/vkms_plane.c | 91 ++-
 6 files changed, 245 insertions(+), 12 deletions(-)
 create mode 100644 drivers/gpu/drm/vkms/vkms_crc.c

-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v4 3/4] drm/vkms: Add atomic_helper_check_plane_state

2018-07-25 Thread Haneen Mohammed
Call atomic_helper_check_plane_state to clip plane coordinates.

Signed-off-by: Haneen Mohammed 
Reviewed-by: Sean Paul 
---
Changes in v2:
- check for plane_state->visible since we can't handle a disabled
  primary plane yet.

 drivers/gpu/drm/vkms/vkms_plane.c | 29 +
 1 file changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index 5611e7cf5fc9..8191940844e5 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -8,6 +8,7 @@
 
 #include "vkms_drv.h"
 #include 
+#include 
 #include 
 #include 
 
@@ -25,6 +26,33 @@ static void vkms_primary_plane_update(struct drm_plane 
*plane,
 {
 }
 
+static int vkms_plane_atomic_check(struct drm_plane *plane,
+  struct drm_plane_state *state)
+{
+   struct drm_crtc_state *crtc_state;
+   int ret;
+
+   if (!state->fb | !state->crtc)
+   return 0;
+
+   crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc);
+   if (IS_ERR(crtc_state))
+   return PTR_ERR(crtc_state);
+
+   ret = drm_atomic_helper_check_plane_state(state, crtc_state,
+ DRM_PLANE_HELPER_NO_SCALING,
+ DRM_PLANE_HELPER_NO_SCALING,
+ false, true);
+   if (ret != 0)
+   return ret;
+
+   /* for now primary plane must be visible and full screen */
+   if (!state->visible)
+   return -EINVAL;
+
+   return 0;
+}
+
 static int vkms_prepare_fb(struct drm_plane *plane,
   struct drm_plane_state *state)
 {
@@ -58,6 +86,7 @@ static void vkms_cleanup_fb(struct drm_plane *plane,
 
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
.atomic_update  = vkms_primary_plane_update,
+   .atomic_check   = vkms_plane_atomic_check,
.prepare_fb = vkms_prepare_fb,
.cleanup_fb = vkms_cleanup_fb,
 };
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v4 4/4] drm/vkms: subclass CRTC state

2018-07-25 Thread Haneen Mohammed
Subclass CRTC state struct to enable storing driver's private
state. This patch only adds the base drm_crtc_state struct and
the atomic functions that handle it.

Signed-off-by: Haneen Mohammed 
Reviewed-by: Daniel Vetter 
Reviewed-by: Sean Paul 
---
 drivers/gpu/drm/vkms/vkms_crtc.c | 53 ++--
 drivers/gpu/drm/vkms/vkms_drv.h  | 11 +++
 2 files changed, 61 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 875fca662ac0..26babb85ca77 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -64,13 +64,60 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, 
unsigned int pipe,
return true;
 }
 
+static void vkms_atomic_crtc_reset(struct drm_crtc *crtc)
+{
+   struct vkms_crtc_state *vkms_state = NULL;
+
+   if (crtc->state) {
+   vkms_state = to_vkms_crtc_state(crtc->state);
+   __drm_atomic_helper_crtc_destroy_state(crtc->state);
+   kfree(vkms_state);
+   crtc->state = NULL;
+   }
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state)
+   return;
+
+   crtc->state = _state->base;
+   crtc->state->crtc = crtc;
+}
+
+static struct drm_crtc_state *
+vkms_atomic_crtc_duplicate_state(struct drm_crtc *crtc)
+{
+   struct vkms_crtc_state *vkms_state;
+
+   if (WARN_ON(!crtc->state))
+   return NULL;
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state)
+   return NULL;
+
+   __drm_atomic_helper_crtc_duplicate_state(crtc, _state->base);
+
+   return _state->base;
+}
+
+static void vkms_atomic_crtc_destroy_state(struct drm_crtc *crtc,
+  struct drm_crtc_state *state)
+{
+   struct vkms_crtc_state *vkms_state;
+
+   vkms_state = to_vkms_crtc_state(state);
+
+   __drm_atomic_helper_crtc_destroy_state(state);
+   kfree(vkms_state);
+}
+
 static const struct drm_crtc_funcs vkms_crtc_funcs = {
.set_config = drm_atomic_helper_set_config,
.destroy= drm_crtc_cleanup,
.page_flip  = drm_atomic_helper_page_flip,
-   .reset  = drm_atomic_helper_crtc_reset,
-   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
-   .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
+   .reset  = vkms_atomic_crtc_reset,
+   .atomic_duplicate_state = vkms_atomic_crtc_duplicate_state,
+   .atomic_destroy_state   = vkms_atomic_crtc_destroy_state,
.enable_vblank  = vkms_enable_vblank,
.disable_vblank = vkms_disable_vblank,
 };
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 47048f707566..75e52d61e65d 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -20,6 +20,14 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
 
+/**
+ * vkms_crtc_state - Driver specific CRTC state
+ * @base: base CRTC state
+ */
+struct vkms_crtc_state {
+   struct drm_crtc_state base;
+};
+
 struct vkms_output {
struct drm_crtc crtc;
struct drm_encoder encoder;
@@ -52,6 +60,9 @@ struct vkms_gem_object {
 #define drm_gem_to_vkms_gem(target)\
container_of(target, struct vkms_gem_object, gem)
 
+#define to_vkms_crtc_state(target)\
+   container_of(target, struct vkms_crtc_state, base)
+
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
   struct drm_plane *primary, struct drm_plane *cursor);
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v4 2/4] drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks

2018-07-25 Thread Haneen Mohammed
This patch map/unmap GEM backing memory to kernel address space
in prepare/cleanup_fb respectively and cache the virtual address
for later use.

Signed-off-by: Haneen Mohammed 
---
Changes in v2:
- use vkms_gem_vunmap
Changes in v3:
- return error number instead of vkms_obj->vaddr
Changes in v4:
- print return value from vkms_gem_vmap

 drivers/gpu/drm/vkms/vkms_plane.c | 34 +++
 1 file changed, 34 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index 9f75b1e2c1c4..5611e7cf5fc9 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -9,6 +9,7 @@
 #include "vkms_drv.h"
 #include 
 #include 
+#include 
 
 static const struct drm_plane_funcs vkms_plane_funcs = {
.update_plane   = drm_atomic_helper_update_plane,
@@ -24,8 +25,41 @@ static void vkms_primary_plane_update(struct drm_plane 
*plane,
 {
 }
 
+static int vkms_prepare_fb(struct drm_plane *plane,
+  struct drm_plane_state *state)
+{
+   struct drm_gem_object *gem_obj;
+   struct vkms_gem_object *vkms_obj;
+   int ret;
+
+   if (!state->fb)
+   return 0;
+
+   gem_obj = drm_gem_fb_get_obj(state->fb, 0);
+   vkms_obj = drm_gem_to_vkms_gem(gem_obj);
+   ret = vkms_gem_vmap(gem_obj);
+   if (ret)
+   DRM_ERROR("vmap failed: %d\n", ret);
+
+   return drm_gem_fb_prepare_fb(plane, state);
+}
+
+static void vkms_cleanup_fb(struct drm_plane *plane,
+   struct drm_plane_state *old_state)
+{
+   struct drm_gem_object *gem_obj;
+
+   if (!old_state->fb)
+   return;
+
+   gem_obj = drm_gem_fb_get_obj(old_state->fb, 0);
+   vkms_gem_vunmap(gem_obj);
+}
+
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
.atomic_update  = vkms_primary_plane_update,
+   .prepare_fb = vkms_prepare_fb,
+   .cleanup_fb = vkms_cleanup_fb,
 };
 
 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev)
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v4 1/4] drm/vkms: Add functions to map/unmap GEM backing storage

2018-07-25 Thread Haneen Mohammed
This patch add the necessary functions to map/unmap GEM
backing memory to the kernel's virtual address space.

Signed-off-by: Haneen Mohammed 
---
Changes in v2:
- add vkms_gem_vunmap
- use vmap_count to guard against multiple prepare_fb calls on the same fb
Changes in v3:
- change vkms_gem_vmap to retrun int
- cleanup if vmap failed
- increment vmap_count after successful vmap
Changes in v4:
- add err_vmap label
- use out label instead of fail and remove 2 redundant lines

 drivers/gpu/drm/vkms/vkms_drv.h |  9 
 drivers/gpu/drm/vkms/vkms_gem.c | 79 -
 2 files changed, 87 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 07be29f2dc44..47048f707566 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -39,6 +39,8 @@ struct vkms_gem_object {
struct drm_gem_object gem;
struct mutex pages_lock; /* Page lock used in page fault handler */
struct page **pages;
+   unsigned int vmap_count;
+   void *vaddr;
 };
 
 #define drm_crtc_to_vkms_output(target) \
@@ -47,6 +49,9 @@ struct vkms_gem_object {
 #define drm_device_to_vkms_device(target) \
container_of(target, struct vkms_device, drm)
 
+#define drm_gem_to_vkms_gem(target)\
+   container_of(target, struct vkms_gem_object, gem)
+
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
   struct drm_plane *primary, struct drm_plane *cursor);
@@ -75,4 +80,8 @@ int vkms_dumb_map(struct drm_file *file, struct drm_device 
*dev,
 
 void vkms_gem_free_object(struct drm_gem_object *obj);
 
+int vkms_gem_vmap(struct drm_gem_object *obj);
+
+void vkms_gem_vunmap(struct drm_gem_object *obj);
+
 #endif /* _VKMS_DRV_H_ */
diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c
index c7e38368602b..a52e88338c05 100644
--- a/drivers/gpu/drm/vkms/vkms_gem.c
+++ b/drivers/gpu/drm/vkms/vkms_gem.c
@@ -37,7 +37,9 @@ void vkms_gem_free_object(struct drm_gem_object *obj)
struct vkms_gem_object *gem = container_of(obj, struct vkms_gem_object,
   gem);
 
-   kvfree(gem->pages);
+   WARN_ON(gem->pages);
+   WARN_ON(gem->vaddr);
+
mutex_destroy(>pages_lock);
drm_gem_object_release(obj);
kfree(gem);
@@ -177,3 +179,78 @@ int vkms_dumb_map(struct drm_file *file, struct drm_device 
*dev,
 
return ret;
 }
+
+static struct page **_get_pages(struct vkms_gem_object *vkms_obj)
+{
+   struct drm_gem_object *gem_obj = _obj->gem;
+
+   if (!vkms_obj->pages) {
+   struct page **pages = drm_gem_get_pages(gem_obj);
+
+   if (IS_ERR(pages))
+   return pages;
+
+   if (cmpxchg(_obj->pages, NULL, pages))
+   drm_gem_put_pages(gem_obj, pages, false, true);
+   }
+
+   return vkms_obj->pages;
+}
+
+void vkms_gem_vunmap(struct drm_gem_object *obj)
+{
+   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(obj);
+
+   mutex_lock(_obj->pages_lock);
+   if (vkms_obj->vmap_count < 1) {
+   WARN_ON(vkms_obj->vaddr);
+   WARN_ON(vkms_obj->pages);
+   mutex_unlock(_obj->pages_lock);
+   return;
+   }
+
+   vkms_obj->vmap_count--;
+
+   if (vkms_obj->vmap_count == 0) {
+   vunmap(vkms_obj->vaddr);
+   vkms_obj->vaddr = NULL;
+   drm_gem_put_pages(obj, vkms_obj->pages, false, true);
+   vkms_obj->pages = NULL;
+   }
+
+   mutex_unlock(_obj->pages_lock);
+}
+
+int vkms_gem_vmap(struct drm_gem_object *obj)
+{
+   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(obj);
+   int ret = 0;
+
+   mutex_lock(_obj->pages_lock);
+
+   if (!vkms_obj->vaddr) {
+   unsigned int n_pages = obj->size >> PAGE_SHIFT;
+   struct page **pages = _get_pages(vkms_obj);
+
+   if (IS_ERR(pages)) {
+   ret = PTR_ERR(pages);
+   goto out;
+   }
+
+   vkms_obj->vaddr = vmap(pages, n_pages, VM_MAP, PAGE_KERNEL);
+   if (!vkms_obj->vaddr)
+   goto err_vmap;
+
+   vkms_obj->vmap_count++;
+   }
+
+   goto out;
+
+err_vmap:
+   ret = -ENOMEM;
+   drm_gem_put_pages(obj, vkms_obj->pages, false, true);
+   vkms_obj->pages = NULL;
+out:
+   mutex_unlock(_obj->pages_lock);
+   return ret;
+}
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v4 0/4] Add infrastructure needed for CRC support

2018-07-25 Thread Haneen Mohammed
This patchset add the necessary infrastructure needed later for CRC
support.

1. add functions to map buffers to kernel address space.
2. map/unmap buffers in the prepare/cleanup_fb hooks.
3. clip plane coordinates.
4. subclass CRTC state.

changes in v4:
- drop patch 5 "drm/vkms: Implement CRC debugfs API" from this patchset
since it needs further work.

Haneen Mohammed (4):
  drm/vkms: Add functions to map/unmap GEM backing storage
  drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks
  drm/vkms: Add atomic_helper_check_plane_state
  drm/vkms: subclass CRTC state

 drivers/gpu/drm/vkms/vkms_crtc.c  | 53 +++--
 drivers/gpu/drm/vkms/vkms_drv.h   | 20 
 drivers/gpu/drm/vkms/vkms_gem.c   | 79 ++-
 drivers/gpu/drm/vkms/vkms_plane.c | 63 
 4 files changed, 211 insertions(+), 4 deletions(-)

-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 3/5] drm/vkms: Add atomic_helper_check_plane_state

2018-07-19 Thread Haneen Mohammed
Call atomic_helper_check_plane_state to clip plane coordinates.

Signed-off-by: Haneen Mohammed 
Reviewed-by: Sean Paul 
---
Changes in v2:
- check for plane_state->visible since we can't handle a disabled
  primary plane yet.

 drivers/gpu/drm/vkms/vkms_plane.c | 29 +
 1 file changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index aa6cde34710c..5b7c5d59f103 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -8,6 +8,7 @@
 
 #include "vkms_drv.h"
 #include 
+#include 
 #include 
 #include 
 
@@ -25,6 +26,33 @@ static void vkms_primary_plane_update(struct drm_plane 
*plane,
 {
 }
 
+static int vkms_plane_atomic_check(struct drm_plane *plane,
+  struct drm_plane_state *state)
+{
+   struct drm_crtc_state *crtc_state;
+   int ret;
+
+   if (!state->fb | !state->crtc)
+   return 0;
+
+   crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc);
+   if (IS_ERR(crtc_state))
+   return PTR_ERR(crtc_state);
+
+   ret = drm_atomic_helper_check_plane_state(state, crtc_state,
+ DRM_PLANE_HELPER_NO_SCALING,
+ DRM_PLANE_HELPER_NO_SCALING,
+ false, true);
+   if (ret != 0)
+   return ret;
+
+   /* for now primary plane must be visible and full screen */
+   if (!state->visible)
+   return -EINVAL;
+
+   return 0;
+}
+
 static int vkms_prepare_fb(struct drm_plane *plane,
   struct drm_plane_state *state)
 {
@@ -59,6 +87,7 @@ static void vkms_cleanup_fb(struct drm_plane *plane,
 
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
.atomic_update  = vkms_primary_plane_update,
+   .atomic_check   = vkms_plane_atomic_check,
.prepare_fb = vkms_prepare_fb,
.cleanup_fb = vkms_cleanup_fb,
 };
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 5/5] drm/vkms: Implement CRC debugfs API

2018-07-19 Thread Haneen Mohammed
First, just so you have the complete view, this is the missing part in this 
patch:
-- vkms_crc.c
static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
{
struct drm_framebuffer *fb = _data->fb;
struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
u32 crc = 0;
int i = 0;
unsigned int x = crc_data->src.x1 >> 16;
unsigned int y = crc_data->src.y1 >> 16;
unsigned int height = drm_rect_height(_data->src) >> 16;
unsigned int width = drm_rect_width(_data->src) >> 16;
unsigned int cpp = fb->format->cpp[0];
unsigned int src_offset;
unsigned int size_byte = width * cpp;
void *vaddr = vkms_obj->vaddr;

if (WARN_ON(!vaddr))
return crc;

for (i = y; i < y + height; i++) {
src_offset = fb->offsets[0] + (i * fb->pitches[0]) + (x * cpp);
crc = crc32_le(crc, vaddr + src_offset, size_byte);
}

return crc;
}

void vkms_crc_work_handle(struct work_struct *work)
{
struct vkms_crtc_state *crtc_state = container_of(work,
struct vkms_crtc_state,
crc_work);
struct drm_crtc *crtc = crtc_state->base.crtc;
struct vkms_output *out = drm_crtc_to_vkms_output(crtc);

if (crtc_state && out->crc_enabled) {
u32 crc32 = _vkms_get_crc(_state->data);
unsigned int n_frame = crtc_state->n_frame;

drm_crtc_add_crc_entry(crtc, true, n_frame, );
}
}

int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name,
size_t *values_cnt)
{
struct vkms_output *out = drm_crtc_to_vkms_output(crtc);

if (!src_name) {
out->crc_enabled = false;
} else if (strcmp(src_name, "auto") == 0) {
out->crc_enabled = true;
} else {
out->crc_enabled = false;
return -EINVAL;
}

*values_cnt = 1;

return 0;
}
--- end vkms_crc.c

On Tue, Jul 17, 2018 at 05:05:03PM -0400, Sean Paul wrote:
> On Tue, Jul 17, 2018 at 04:43:16PM -0400, Sean Paul wrote:
> > On Tue, Jul 17, 2018 at 02:52:20AM +0300, Haneen Mohammed wrote:
> > > On Mon, Jul 16, 2018 at 02:22:56PM -0400, Sean Paul wrote:
> > > > On Sat, Jul 14, 2018 at 03:23:32PM +0300, Haneen Mohammed wrote:
> > > > > Implement the set_crc_source() callback.
> > > > > Compute CRC using crc32 on the visible part of the framebuffer.
> > > > > Use ordered workqueue to compute and add CRC at the end of a vblank.
> > > > > 
> > > > > Use appropriate synchronization methods since the crc computation must
> > > > > be atomic wrt the generated vblank event for a given atomic update,
> > > > > 
> > > > > Signed-off-by: Haneen Mohammed 
> > > > 
> > > > Hey Haneen,
> > > > Thanks for revising this patch set. Things are looking good across the 
> > > > series,
> > > > just a few more comments :-)
> > > > 
> > > 
> > > Thank you so much for the review! 
> > > 
> > > > > ---
> > > > > Changes in v2:
> > > > > - Include this patch in this patchset.
> > > > > 
> > > > >  drivers/gpu/drm/vkms/Makefile |  2 +-
> > > > >  drivers/gpu/drm/vkms/vkms_crtc.c  | 60 
> > > > > ++-
> > > > >  drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
> > > > >  drivers/gpu/drm/vkms/vkms_drv.h   | 21 +++
> > > > >  drivers/gpu/drm/vkms/vkms_plane.c | 10 ++
> > > > >  5 files changed, 85 insertions(+), 9 deletions(-)
> > > > > 
> > > > > diff --git a/drivers/gpu/drm/vkms/Makefile 
> > > > > b/drivers/gpu/drm/vkms/Makefile
> > > > > index 986297da51bf..37966914f70b 100644
> > > > > --- a/drivers/gpu/drm/vkms/Makefile
> > > > > +++ b/drivers/gpu/drm/vkms/Makefile
> > > > > @@ -1,3 +1,3 @@
> > > > > -vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o 
> > > > > vkms_gem.o
> > > > > +vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o 
> > > > > vkms_gem.o vkms_crc.o
> > > > >  
> > > > >  obj-$(CONFIG_DRM_VKMS) += vkms.o
> > > > > diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c 
> > > > > b/drivers/gpu/drm/vkms

[PATCH v3 5/5] drm/vkms: Implement CRC debugfs API

2018-07-19 Thread Haneen Mohammed
Implement the set_crc_source() callback.
Compute CRC using crc32 on the visible part of the framebuffer.
Use ordered workqueue to compute and add CRC at the end of a vblank.

Use appropriate synchronization methods since the CRC computation must
be atomic wrt the generated vblank event for a given atomic update, by
using spinlock across atomic_begin and atomic_flush to wrap the event
handling code completely and match the flip event with the CRC.

Signed-off-by: Haneen Mohammed 
---
Changes in v3:
- flush work item instead of workqueue
- include missing vkms_crc.c file

 drivers/gpu/drm/vkms/Makefile |  2 +-
 drivers/gpu/drm/vkms/vkms_crc.c   | 66 +++
 drivers/gpu/drm/vkms/vkms_crtc.c  | 58 ++-
 drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
 drivers/gpu/drm/vkms/vkms_drv.h   | 21 ++
 drivers/gpu/drm/vkms/vkms_plane.c | 10 +
 6 files changed, 148 insertions(+), 10 deletions(-)
 create mode 100644 drivers/gpu/drm/vkms/vkms_crc.c

diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
index 986297da51bf..37966914f70b 100644
--- a/drivers/gpu/drm/vkms/Makefile
+++ b/drivers/gpu/drm/vkms/Makefile
@@ -1,3 +1,3 @@
-vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o
+vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o 
vkms_crc.o
 
 obj-$(CONFIG_DRM_VKMS) += vkms.o
diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
new file mode 100644
index ..9e8bb5c7fc80
--- /dev/null
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "vkms_drv.h"
+#include 
+#include 
+
+static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
+{
+   struct drm_framebuffer *fb = _data->fb;
+   struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
+   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
+   u32 crc = 0;
+   int i = 0;
+   unsigned int x = crc_data->src.x1 >> 16;
+   unsigned int y = crc_data->src.y1 >> 16;
+   unsigned int height = drm_rect_height(_data->src) >> 16;
+   unsigned int width = drm_rect_width(_data->src) >> 16;
+   unsigned int cpp = fb->format->cpp[0];
+   unsigned int src_offset;
+   unsigned int size_byte = width * cpp;
+   void *vaddr = vkms_obj->vaddr;
+
+   if (WARN_ON(!vaddr))
+   return crc;
+
+   for (i = y; i < y + height; i++) {
+   src_offset = fb->offsets[0] + (i * fb->pitches[0]) + (x * cpp);
+   crc = crc32_le(crc, vaddr + src_offset, size_byte);
+   }
+
+   return crc;
+}
+
+void vkms_crc_work_handle(struct work_struct *work)
+{
+   struct vkms_crtc_state *crtc_state = container_of(work,
+   struct vkms_crtc_state,
+   crc_work);
+   struct drm_crtc *crtc = crtc_state->base.crtc;
+   struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
+
+   if (crtc_state && out->crc_enabled) {
+   u32 crc32 = _vkms_get_crc(_state->data);
+   unsigned int n_frame = crtc_state->n_frame;
+
+   drm_crtc_add_crc_entry(crtc, true, n_frame, );
+   }
+}
+
+int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name,
+   size_t *values_cnt)
+{
+   struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
+
+   if (!src_name) {
+   out->crc_enabled = false;
+   } else if (strcmp(src_name, "auto") == 0) {
+   out->crc_enabled = true;
+   } else {
+   out->crc_enabled = false;
+   return -EINVAL;
+   }
+
+   *values_cnt = 1;
+
+   return 0;
+}
diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 26babb85ca77..a7b39627b581 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -10,17 +10,32 @@
 #include 
 #include 
 
-static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
+static void _vblank_handle(struct vkms_output *output)
 {
-   struct vkms_output *output = container_of(timer, struct vkms_output,
- vblank_hrtimer);
struct drm_crtc *crtc = >crtc;
-   int ret_overrun;
+   struct vkms_crtc_state *state = to_vkms_crtc_state(crtc->state);
bool ret;
 
+   spin_lock(>lock);
ret = drm_crtc_handle_vblank(crtc);
if (!ret)
-   DRM_ERROR("vkms failure on handling vblank");
+   DRM_ERROR("vkms failure on handling vblank\n");
+
+   if (state && output->crc_enabled) {
+   state->n_frame = drm_crtc_accurate_vblank_count(crtc);
+   queue_work(output->crc_workq, >crc_work);

Re: [PATCH v2 5/5] drm/vkms: Implement CRC debugfs API

2018-07-19 Thread Haneen Mohammed
On Wed, Jul 18, 2018 at 02:44:18PM -0400, Sean Paul wrote:
> On Wed, Jul 18, 2018 at 07:24:34PM +0300, Haneen Mohammed wrote:
> > First, just so you have the complete view, this is the missing part in this 
> > patch:
> > -- vkms_crc.c
> > static uint32_t _vkms_get_crc(struct vkms_crc_data *crc_data)
> > {
> > struct drm_framebuffer *fb = _data->fb;
> > struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
> > struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(gem_obj);
> > u32 crc = 0;
> > int i = 0;
> > unsigned int x = crc_data->src.x1 >> 16;
> > unsigned int y = crc_data->src.y1 >> 16;
> > unsigned int height = drm_rect_height(_data->src) >> 16;
> > unsigned int width = drm_rect_width(_data->src) >> 16;
> > unsigned int cpp = fb->format->cpp[0];
> > unsigned int src_offset;
> > unsigned int size_byte = width * cpp;
> > void *vaddr = vkms_obj->vaddr;
> > 
> > if (WARN_ON(!vaddr))
> > return crc;
> > 
> > for (i = y; i < y + height; i++) {
> > src_offset = fb->offsets[0] + (i * fb->pitches[0]) + (x * cpp);
> > crc = crc32_le(crc, vaddr + src_offset, size_byte);
> > }
> > 
> > return crc;
> > }
> > 
> > void vkms_crc_work_handle(struct work_struct *work)
> > {
> > struct vkms_crtc_state *crtc_state = container_of(work,
> > struct vkms_crtc_state,
> > crc_work);
> > struct drm_crtc *crtc = crtc_state->base.crtc;
> > struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
> > 
> > if (crtc_state && out->crc_enabled) {
> > u32 crc32 = _vkms_get_crc(_state->data);
> > unsigned int n_frame = crtc_state->n_frame;
> > 
> > drm_crtc_add_crc_entry(crtc, true, n_frame, );
> > }
> > }
> > 
> > int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name,
> > size_t *values_cnt)
> > {
> > struct vkms_output *out = drm_crtc_to_vkms_output(crtc);
> > 
> > if (!src_name) {
> > out->crc_enabled = false;
> > } else if (strcmp(src_name, "auto") == 0) {
> > out->crc_enabled = true;
> > } else {
> > out->crc_enabled = false;
> > return -EINVAL;
> > }
> > 
> > *values_cnt = 1;
> > 
> > return 0;
> > }
> > --- end vkms_crc.c
> 
> /snip
> 
> > > > > > > +static void vkms_crtc_atomic_begin(struct drm_crtc *crtc,
> > > > > > > +struct drm_crtc_state 
> > > > > > > *old_crtc_state)
> > > > > > > +{
> > > > > > > + struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
> > > > > > > +
> > > > > > > + spin_lock_irq(_output->lock);
> > > > > > 
> > > > > > Hmm, you can't lock across atomic_begin/flush. What is this 
> > > > > > protecting against?
> > > > > > 
> > > > > 
> > > > > I did this per Daniel recommendation:
> > > > > 1- spin_lock_irq -> vkms_crtc_atomic_begin
> > > > > 2- update vkms_crc_data and get ref to fb -> vkms_primary_plane_update
> > > > > 3- spin_unlock_irq after vblank event -> vkms_crtc_atomic_flush
> > > > 
> > > > I think I'm interpreting his mail a little differently. The point of the
> > > > spinlock is to protect the pointer to the crc_data in vkms_crtc (right 
> > > > now it's
> > > > not a pointer, but it should be).
> > > > 
> > > > So I think you need to do the following:
> > > > - Change crc_data to a pointer
> > > > - In plane_update, allocate new memory to hold crc_data and, under the 
> > > > spinlock,
> > > >   update the crc_data to point to the new memory (add a WARN_ON if the 
> > > > pointer
> > > >   is NULL)
> > > > - In the hrtimer, while holding the spinlock, take the pointer from 
> > > > crc_data
> > > >   into a local variable and clear the crtc->crc_data pointer
> > > > - Pass the pointer (from the local variable) to the crc_worker
> > > > 
> > 
> > The problem wit

[PATCH v3 2/5] drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks

2018-07-19 Thread Haneen Mohammed
This patch map/unmap GEM backing memory to kernel address space
in prepare/cleanup_fb respectively and cache the virtual address
for later use.

Signed-off-by: Haneen Mohammed 
---
Changes in v2:
- use vkms_gem_vunmap

Changes in v3:
- return error number instead of vkms_obj->vaddr

 drivers/gpu/drm/vkms/vkms_plane.c | 35 +++
 1 file changed, 35 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index 9f75b1e2c1c4..aa6cde34710c 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -9,6 +9,7 @@
 #include "vkms_drv.h"
 #include 
 #include 
+#include 
 
 static const struct drm_plane_funcs vkms_plane_funcs = {
.update_plane   = drm_atomic_helper_update_plane,
@@ -24,8 +25,42 @@ static void vkms_primary_plane_update(struct drm_plane 
*plane,
 {
 }
 
+static int vkms_prepare_fb(struct drm_plane *plane,
+  struct drm_plane_state *state)
+{
+   struct drm_gem_object *gem_obj;
+   struct vkms_gem_object *vkms_obj;
+   int ret;
+
+   if (!state->fb)
+   return 0;
+
+   gem_obj = drm_gem_fb_get_obj(state->fb, 0);
+   vkms_obj = drm_gem_to_vkms_gem(gem_obj);
+   ret = vkms_gem_vmap(gem_obj);
+
+   if (ret)
+   DRM_ERROR("vmap failed\n");
+
+   return drm_gem_fb_prepare_fb(plane, state);
+}
+
+static void vkms_cleanup_fb(struct drm_plane *plane,
+   struct drm_plane_state *old_state)
+{
+   struct drm_gem_object *gem_obj;
+
+   if (!old_state->fb)
+   return;
+
+   gem_obj = drm_gem_fb_get_obj(old_state->fb, 0);
+   vkms_gem_vunmap(gem_obj);
+}
+
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
.atomic_update  = vkms_primary_plane_update,
+   .prepare_fb = vkms_prepare_fb,
+   .cleanup_fb = vkms_cleanup_fb,
 };
 
 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev)
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 4/5] drm/vkms: subclass CRTC state

2018-07-19 Thread Haneen Mohammed
Subclass CRTC state struct to enable storing driver's private
state. This patch only adds the base drm_crtc_state struct and
the atomic functions that handle it.

Signed-off-by: Haneen Mohammed 
Reviewed-by: Daniel Vetter 
Reviewed-by: Sean Paul 
---
 drivers/gpu/drm/vkms/vkms_crtc.c | 53 ++--
 drivers/gpu/drm/vkms/vkms_drv.h  | 11 +++
 2 files changed, 61 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 875fca662ac0..26babb85ca77 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -64,13 +64,60 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, 
unsigned int pipe,
return true;
 }
 
+static void vkms_atomic_crtc_reset(struct drm_crtc *crtc)
+{
+   struct vkms_crtc_state *vkms_state = NULL;
+
+   if (crtc->state) {
+   vkms_state = to_vkms_crtc_state(crtc->state);
+   __drm_atomic_helper_crtc_destroy_state(crtc->state);
+   kfree(vkms_state);
+   crtc->state = NULL;
+   }
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state)
+   return;
+
+   crtc->state = _state->base;
+   crtc->state->crtc = crtc;
+}
+
+static struct drm_crtc_state *
+vkms_atomic_crtc_duplicate_state(struct drm_crtc *crtc)
+{
+   struct vkms_crtc_state *vkms_state;
+
+   if (WARN_ON(!crtc->state))
+   return NULL;
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state)
+   return NULL;
+
+   __drm_atomic_helper_crtc_duplicate_state(crtc, _state->base);
+
+   return _state->base;
+}
+
+static void vkms_atomic_crtc_destroy_state(struct drm_crtc *crtc,
+  struct drm_crtc_state *state)
+{
+   struct vkms_crtc_state *vkms_state;
+
+   vkms_state = to_vkms_crtc_state(state);
+
+   __drm_atomic_helper_crtc_destroy_state(state);
+   kfree(vkms_state);
+}
+
 static const struct drm_crtc_funcs vkms_crtc_funcs = {
.set_config = drm_atomic_helper_set_config,
.destroy= drm_crtc_cleanup,
.page_flip  = drm_atomic_helper_page_flip,
-   .reset  = drm_atomic_helper_crtc_reset,
-   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
-   .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
+   .reset  = vkms_atomic_crtc_reset,
+   .atomic_duplicate_state = vkms_atomic_crtc_duplicate_state,
+   .atomic_destroy_state   = vkms_atomic_crtc_destroy_state,
.enable_vblank  = vkms_enable_vblank,
.disable_vblank = vkms_disable_vblank,
 };
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 47048f707566..75e52d61e65d 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -20,6 +20,14 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
 
+/**
+ * vkms_crtc_state - Driver specific CRTC state
+ * @base: base CRTC state
+ */
+struct vkms_crtc_state {
+   struct drm_crtc_state base;
+};
+
 struct vkms_output {
struct drm_crtc crtc;
struct drm_encoder encoder;
@@ -52,6 +60,9 @@ struct vkms_gem_object {
 #define drm_gem_to_vkms_gem(target)\
container_of(target, struct vkms_gem_object, gem)
 
+#define to_vkms_crtc_state(target)\
+   container_of(target, struct vkms_crtc_state, base)
+
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
   struct drm_plane *primary, struct drm_plane *cursor);
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 0/5] Implement CRC and Add necessary infrastructure

2018-07-19 Thread Haneen Mohammed
This patchset implement CRC debugfs API and add the necessary
infrastructure required to enable to compute and add CRCs entries.

1. add functions to map/unmap buffers to kernel address space.
2. map/unmap buffers in the prepare/cleanup_fb hooks.
3. compute crc using crc32 on the visible portion of the buffer with
appropriate synchronization methods.

Haneen Mohammed (5):
  drm/vkms: Add functions to map/unmap GEM backing storage
  drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks
  drm/vkms: Add atomic_helper_check_plane_state
  drm/vkms: subclass CRTC state
  drm/vkms: Implement CRC debugfs API

 drivers/gpu/drm/vkms/Makefile |   2 +-
 drivers/gpu/drm/vkms/vkms_crc.c   |  66 ++
 drivers/gpu/drm/vkms/vkms_crtc.c  | 109 +++---
 drivers/gpu/drm/vkms/vkms_drv.c   |   1 +
 drivers/gpu/drm/vkms/vkms_drv.h   |  41 +++
 drivers/gpu/drm/vkms/vkms_gem.c   |  80 +-
 drivers/gpu/drm/vkms/vkms_plane.c |  74 
 7 files changed, 360 insertions(+), 13 deletions(-)
 create mode 100644 drivers/gpu/drm/vkms/vkms_crc.c

-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 1/5] drm/vkms: Add functions to map/unmap GEM backing storage

2018-07-19 Thread Haneen Mohammed
This patch add the necessary functions to map/unmap GEM
backing memory to the kernel's virtual address space.

Signed-off-by: Haneen Mohammed 
---
Changes in v2:
- add vkms_gem_vunmap
- use vmap_count to guard against multiple prepare_fb calls on the same
  fb
Changes in v3:
- change vkms_gem_vmap to retrun int
- cleanup if vmap failed
- increment vmap_count after successful vmap

 drivers/gpu/drm/vkms/vkms_drv.h |  9 
 drivers/gpu/drm/vkms/vkms_gem.c | 80 -
 2 files changed, 88 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 07be29f2dc44..47048f707566 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -39,6 +39,8 @@ struct vkms_gem_object {
struct drm_gem_object gem;
struct mutex pages_lock; /* Page lock used in page fault handler */
struct page **pages;
+   unsigned int vmap_count;
+   void *vaddr;
 };
 
 #define drm_crtc_to_vkms_output(target) \
@@ -47,6 +49,9 @@ struct vkms_gem_object {
 #define drm_device_to_vkms_device(target) \
container_of(target, struct vkms_device, drm)
 
+#define drm_gem_to_vkms_gem(target)\
+   container_of(target, struct vkms_gem_object, gem)
+
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
   struct drm_plane *primary, struct drm_plane *cursor);
@@ -75,4 +80,8 @@ int vkms_dumb_map(struct drm_file *file, struct drm_device 
*dev,
 
 void vkms_gem_free_object(struct drm_gem_object *obj);
 
+int vkms_gem_vmap(struct drm_gem_object *obj);
+
+void vkms_gem_vunmap(struct drm_gem_object *obj);
+
 #endif /* _VKMS_DRV_H_ */
diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c
index c7e38368602b..2e55c906d9b2 100644
--- a/drivers/gpu/drm/vkms/vkms_gem.c
+++ b/drivers/gpu/drm/vkms/vkms_gem.c
@@ -37,7 +37,9 @@ void vkms_gem_free_object(struct drm_gem_object *obj)
struct vkms_gem_object *gem = container_of(obj, struct vkms_gem_object,
   gem);
 
-   kvfree(gem->pages);
+   WARN_ON(gem->pages);
+   WARN_ON(gem->vaddr);
+
mutex_destroy(>pages_lock);
drm_gem_object_release(obj);
kfree(gem);
@@ -177,3 +179,79 @@ int vkms_dumb_map(struct drm_file *file, struct drm_device 
*dev,
 
return ret;
 }
+
+static struct page **_get_pages(struct vkms_gem_object *vkms_obj)
+{
+   struct drm_gem_object *gem_obj = _obj->gem;
+
+   if (!vkms_obj->pages) {
+   struct page **pages = drm_gem_get_pages(gem_obj);
+
+   if (IS_ERR(pages))
+   return pages;
+
+   if (cmpxchg(_obj->pages, NULL, pages))
+   drm_gem_put_pages(gem_obj, pages, false, true);
+   }
+
+   return vkms_obj->pages;
+}
+
+void vkms_gem_vunmap(struct drm_gem_object *obj)
+{
+   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(obj);
+
+   mutex_lock(_obj->pages_lock);
+   if (vkms_obj->vmap_count < 1) {
+   WARN_ON(vkms_obj->vaddr);
+   WARN_ON(vkms_obj->pages);
+   mutex_unlock(_obj->pages_lock);
+   return;
+   }
+
+   vkms_obj->vmap_count--;
+
+   if (vkms_obj->vmap_count == 0) {
+   vunmap(vkms_obj->vaddr);
+   vkms_obj->vaddr = NULL;
+   drm_gem_put_pages(obj, vkms_obj->pages, false, true);
+   vkms_obj->pages = NULL;
+   }
+
+   mutex_unlock(_obj->pages_lock);
+}
+
+int vkms_gem_vmap(struct drm_gem_object *obj)
+{
+   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(obj);
+   int ret = 0;
+
+   mutex_lock(_obj->pages_lock);
+
+   if (!vkms_obj->vaddr) {
+   unsigned int n_pages = obj->size >> PAGE_SHIFT;
+   struct page **pages = _get_pages(vkms_obj);
+
+   if (IS_ERR(pages)) {
+   ret = PTR_ERR(pages);
+   goto fail;
+   }
+
+   vkms_obj->vaddr = vmap(pages, n_pages, VM_MAP, PAGE_KERNEL);
+   if (!vkms_obj->vaddr) {
+   ret = -ENOMEM;
+   drm_gem_put_pages(obj, vkms_obj->pages, false, true);
+   vkms_obj->pages = NULL;
+   goto fail;
+   }
+
+   vkms_obj->vmap_count++;
+   }
+
+   mutex_unlock(_obj->pages_lock);
+   return 0;
+
+fail:
+   mutex_unlock(_obj->pages_lock);
+   return ret;
+}
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 5/5] drm/vkms: Implement CRC debugfs API

2018-07-17 Thread Haneen Mohammed
On Mon, Jul 16, 2018 at 02:22:56PM -0400, Sean Paul wrote:
> On Sat, Jul 14, 2018 at 03:23:32PM +0300, Haneen Mohammed wrote:
> > Implement the set_crc_source() callback.
> > Compute CRC using crc32 on the visible part of the framebuffer.
> > Use ordered workqueue to compute and add CRC at the end of a vblank.
> > 
> > Use appropriate synchronization methods since the crc computation must
> > be atomic wrt the generated vblank event for a given atomic update,
> > 
> > Signed-off-by: Haneen Mohammed 
> 
> Hey Haneen,
> Thanks for revising this patch set. Things are looking good across the series,
> just a few more comments :-)
> 

Thank you so much for the review! 

> > ---
> > Changes in v2:
> > - Include this patch in this patchset.
> > 
> >  drivers/gpu/drm/vkms/Makefile |  2 +-
> >  drivers/gpu/drm/vkms/vkms_crtc.c  | 60 ++-
> >  drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
> >  drivers/gpu/drm/vkms/vkms_drv.h   | 21 +++
> >  drivers/gpu/drm/vkms/vkms_plane.c | 10 ++
> >  5 files changed, 85 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
> > index 986297da51bf..37966914f70b 100644
> > --- a/drivers/gpu/drm/vkms/Makefile
> > +++ b/drivers/gpu/drm/vkms/Makefile
> > @@ -1,3 +1,3 @@
> > -vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o
> > +vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o 
> > vkms_crc.o
> >  
> >  obj-$(CONFIG_DRM_VKMS) += vkms.o
> > diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c 
> > b/drivers/gpu/drm/vkms/vkms_crtc.c
> > index 26babb85ca77..f3a674db33b8 100644
> > --- a/drivers/gpu/drm/vkms/vkms_crtc.c
> > +++ b/drivers/gpu/drm/vkms/vkms_crtc.c
> > @@ -10,18 +10,36 @@
> >  #include 
> >  #include 
> >  
> > -static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
> > +static void _vblank_handle(struct vkms_output *output)
> >  {
> > -   struct vkms_output *output = container_of(timer, struct vkms_output,
> > - vblank_hrtimer);
> > struct drm_crtc *crtc = >crtc;
> > -   int ret_overrun;
> > +   struct vkms_crtc_state *state = to_vkms_crtc_state(crtc->state);
> > bool ret;
> >  
> > +   int crc_enabled = 0;
> > +
> > +   spin_lock(>lock);
> > +   crc_enabled = output->crc_enabled;
> 
> Aside from the implicit bool -> int cast, I don't think you need this local 
> var,
> just use output->crc_enabled directly below.
> 
> > ret = drm_crtc_handle_vblank(crtc);
> > if (!ret)
> > DRM_ERROR("vkms failure on handling vblank");
> 
> This would be more useful with the error code printed.
> 

I think this only returns false on failure. Also I've noticed most of the usage 
of
drm_crtc_handle_vblank don't check the return value, should I do the
same as well and drop ret and error message?

> >  
> > +   if (state && crc_enabled) {
> > +   state->n_frame = drm_crtc_accurate_vblank_count(crtc);
> > +   queue_work(output->crc_workq, >crc_work);
> > +   }
> > +
> > +   spin_unlock(>lock);
> > +}
> > +
> > +static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
> > +{
> > +   struct vkms_output *output = container_of(timer, struct vkms_output,
> > + vblank_hrtimer);
> > +   int ret_overrun;
> > +
> > +   _vblank_handle(output);
> > +
> > ret_overrun = hrtimer_forward_now(>vblank_hrtimer,
> >   output->period_ns);
> >  
> > @@ -97,6 +115,8 @@ vkms_atomic_crtc_duplicate_state(struct drm_crtc *crtc)
> >  
> > __drm_atomic_helper_crtc_duplicate_state(crtc, _state->base);
> >  
> > +   INIT_WORK(_state->crc_work, vkms_crc_work_handle);
> > +
> > return _state->base;
> >  }
> >  
> > @@ -104,11 +124,18 @@ static void vkms_atomic_crtc_destroy_state(struct 
> > drm_crtc *crtc,
> >struct drm_crtc_state *state)
> >  {
> > struct vkms_crtc_state *vkms_state;
> > +   struct vkms_output *vkms_out = drm_crtc_to_vkms_output(crtc);
> >  
> > vkms_state = to_vkms_crtc_state(state);
> >  
> > __drm_atomic_helper_crtc_destroy_state(state);
> > -   kfree(vkms_state);
> > +
> > +   if (vkms_state) {
> > +   flus

[PATCH v2 2/5] drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks

2018-07-15 Thread Haneen Mohammed
This patch map/unmap GEM backing memory to kernel address space
in prepare/cleanup_fb respectively and cache the virtual address
for later use.

Signed-off-by: Haneen Mohammed 
---
Changes in v2:
- use vkms_gem_vunmap

 drivers/gpu/drm/vkms/vkms_plane.c | 36 ++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index 9f75b1e2c1c4..877483984897 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -7,8 +7,9 @@
  */
 
 #include "vkms_drv.h"
-#include 
 #include 
+#include 
+#include 
 
 static const struct drm_plane_funcs vkms_plane_funcs = {
.update_plane   = drm_atomic_helper_update_plane,
@@ -24,8 +25,41 @@ static void vkms_primary_plane_update(struct drm_plane 
*plane,
 {
 }
 
+static int vkms_prepare_fb(struct drm_plane *plane,
+  struct drm_plane_state *state)
+{
+   struct drm_gem_object *gem_obj;
+   struct vkms_gem_object *vkms_obj;
+
+   if (!state->fb)
+   return 0;
+
+   gem_obj = drm_gem_fb_get_obj(state->fb, 0);
+   vkms_obj = drm_gem_to_vkms_gem(gem_obj);
+   vkms_obj->vaddr = vkms_gem_vmap(gem_obj);
+
+   if (!vkms_obj->vaddr)
+   DRM_ERROR("vmap failed\n");
+
+   return drm_gem_fb_prepare_fb(plane, state);
+}
+
+static void vkms_cleanup_fb(struct drm_plane *plane,
+   struct drm_plane_state *old_state)
+{
+   struct drm_gem_object *gem_obj;
+
+   if (!old_state->fb)
+   return;
+
+   gem_obj = drm_gem_fb_get_obj(old_state->fb, 0);
+   vkms_gem_vunmap(gem_obj);
+}
+
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
.atomic_update  = vkms_primary_plane_update,
+   .prepare_fb = vkms_prepare_fb,
+   .cleanup_fb = vkms_cleanup_fb,
 };
 
 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev)
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 0/5] Implement CRC and Add necessary infrastructure

2018-07-15 Thread Haneen Mohammed
This patchset implement CRC debugfs API and add the necessary
infrastructure required to enable to compute and add CRCs entries.

1. add functions to map/unmap buffers to kernel address space.
2. map/unmap buffers in the prepare/cleanup_fb hooks.
3. compute crc using crc32 on the visible portion of the buffer with
appropriate synchronization methods.

Haneen Mohammed (5):
  drm/vkms: Add functions to map/unmap GEM backing storage
  drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks
  drm/vkms: Add atomic_helper_check_plane_state
  drm/vkms: subclass CRTC state
  drm/vkms: Implement CRC debugfs API

 drivers/gpu/drm/vkms/Makefile |   2 +-
 drivers/gpu/drm/vkms/vkms_crtc.c  | 111 +++---
 drivers/gpu/drm/vkms/vkms_drv.c   |   1 +
 drivers/gpu/drm/vkms/vkms_drv.h   |  41 +++
 drivers/gpu/drm/vkms/vkms_gem.c   |  73 +++-
 drivers/gpu/drm/vkms/vkms_plane.c |  75 +++-
 6 files changed, 290 insertions(+), 13 deletions(-)

-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 5/5] drm/vkms: Implement CRC debugfs API

2018-07-15 Thread Haneen Mohammed
Implement the set_crc_source() callback.
Compute CRC using crc32 on the visible part of the framebuffer.
Use ordered workqueue to compute and add CRC at the end of a vblank.

Use appropriate synchronization methods since the crc computation must
be atomic wrt the generated vblank event for a given atomic update,

Signed-off-by: Haneen Mohammed 
---
Changes in v2:
- Include this patch in this patchset.

 drivers/gpu/drm/vkms/Makefile |  2 +-
 drivers/gpu/drm/vkms/vkms_crtc.c  | 60 ++-
 drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
 drivers/gpu/drm/vkms/vkms_drv.h   | 21 +++
 drivers/gpu/drm/vkms/vkms_plane.c | 10 ++
 5 files changed, 85 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
index 986297da51bf..37966914f70b 100644
--- a/drivers/gpu/drm/vkms/Makefile
+++ b/drivers/gpu/drm/vkms/Makefile
@@ -1,3 +1,3 @@
-vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o
+vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o 
vkms_crc.o
 
 obj-$(CONFIG_DRM_VKMS) += vkms.o
diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 26babb85ca77..f3a674db33b8 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -10,18 +10,36 @@
 #include 
 #include 
 
-static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
+static void _vblank_handle(struct vkms_output *output)
 {
-   struct vkms_output *output = container_of(timer, struct vkms_output,
- vblank_hrtimer);
struct drm_crtc *crtc = >crtc;
-   int ret_overrun;
+   struct vkms_crtc_state *state = to_vkms_crtc_state(crtc->state);
bool ret;
 
+   int crc_enabled = 0;
+
+   spin_lock(>lock);
+   crc_enabled = output->crc_enabled;
ret = drm_crtc_handle_vblank(crtc);
if (!ret)
DRM_ERROR("vkms failure on handling vblank");
 
+   if (state && crc_enabled) {
+   state->n_frame = drm_crtc_accurate_vblank_count(crtc);
+   queue_work(output->crc_workq, >crc_work);
+   }
+
+   spin_unlock(>lock);
+}
+
+static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
+{
+   struct vkms_output *output = container_of(timer, struct vkms_output,
+ vblank_hrtimer);
+   int ret_overrun;
+
+   _vblank_handle(output);
+
ret_overrun = hrtimer_forward_now(>vblank_hrtimer,
  output->period_ns);
 
@@ -97,6 +115,8 @@ vkms_atomic_crtc_duplicate_state(struct drm_crtc *crtc)
 
__drm_atomic_helper_crtc_duplicate_state(crtc, _state->base);
 
+   INIT_WORK(_state->crc_work, vkms_crc_work_handle);
+
return _state->base;
 }
 
@@ -104,11 +124,18 @@ static void vkms_atomic_crtc_destroy_state(struct 
drm_crtc *crtc,
   struct drm_crtc_state *state)
 {
struct vkms_crtc_state *vkms_state;
+   struct vkms_output *vkms_out = drm_crtc_to_vkms_output(crtc);
 
vkms_state = to_vkms_crtc_state(state);
 
__drm_atomic_helper_crtc_destroy_state(state);
-   kfree(vkms_state);
+
+   if (vkms_state) {
+   flush_workqueue(vkms_out->crc_workq);
+   drm_framebuffer_put(_state->data.fb);
+   memset(_state->data, 0, sizeof(struct vkms_crc_data));
+   kfree(vkms_state);
+   }
 }
 
 static const struct drm_crtc_funcs vkms_crtc_funcs = {
@@ -120,6 +147,7 @@ static const struct drm_crtc_funcs vkms_crtc_funcs = {
.atomic_destroy_state   = vkms_atomic_crtc_destroy_state,
.enable_vblank  = vkms_enable_vblank,
.disable_vblank = vkms_disable_vblank,
+   .set_crc_source = vkms_set_crc_source,
 };
 
 static void vkms_crtc_atomic_enable(struct drm_crtc *crtc,
@@ -134,26 +162,37 @@ static void vkms_crtc_atomic_disable(struct drm_crtc 
*crtc,
drm_crtc_vblank_off(crtc);
 }
 
+static void vkms_crtc_atomic_begin(struct drm_crtc *crtc,
+  struct drm_crtc_state *old_crtc_state)
+{
+   struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
+
+   spin_lock_irq(_output->lock);
+}
+
 static void vkms_crtc_atomic_flush(struct drm_crtc *crtc,
   struct drm_crtc_state *old_crtc_state)
 {
-   unsigned long flags;
+   struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc);
 
if (crtc->state->event) {
-   spin_lock_irqsave(>dev->event_lock, flags);
+   spin_lock(>dev->event_lock);
 
if (drm_crtc_vblank_get(crtc) != 0)
drm_crtc_send_vblank_event(crtc, crtc->state->event);
else
drm_c

[PATCH v2 4/5] drm/vkms: subclass CRTC state

2018-07-15 Thread Haneen Mohammed
Subclass CRTC state struct to enable storing driver's private
state. This patch only adds the base drm_crtc_state struct and
the atomic functions that handle it.

Signed-off-by: Haneen Mohammed 
Reviewed-by: Daniel Vetter 
---
 drivers/gpu/drm/vkms/vkms_crtc.c | 53 ++--
 drivers/gpu/drm/vkms/vkms_drv.h  | 11 +++
 2 files changed, 61 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 875fca662ac0..26babb85ca77 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -64,13 +64,60 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, 
unsigned int pipe,
return true;
 }
 
+static void vkms_atomic_crtc_reset(struct drm_crtc *crtc)
+{
+   struct vkms_crtc_state *vkms_state = NULL;
+
+   if (crtc->state) {
+   vkms_state = to_vkms_crtc_state(crtc->state);
+   __drm_atomic_helper_crtc_destroy_state(crtc->state);
+   kfree(vkms_state);
+   crtc->state = NULL;
+   }
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state)
+   return;
+
+   crtc->state = _state->base;
+   crtc->state->crtc = crtc;
+}
+
+static struct drm_crtc_state *
+vkms_atomic_crtc_duplicate_state(struct drm_crtc *crtc)
+{
+   struct vkms_crtc_state *vkms_state;
+
+   if (WARN_ON(!crtc->state))
+   return NULL;
+
+   vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL);
+   if (!vkms_state)
+   return NULL;
+
+   __drm_atomic_helper_crtc_duplicate_state(crtc, _state->base);
+
+   return _state->base;
+}
+
+static void vkms_atomic_crtc_destroy_state(struct drm_crtc *crtc,
+  struct drm_crtc_state *state)
+{
+   struct vkms_crtc_state *vkms_state;
+
+   vkms_state = to_vkms_crtc_state(state);
+
+   __drm_atomic_helper_crtc_destroy_state(state);
+   kfree(vkms_state);
+}
+
 static const struct drm_crtc_funcs vkms_crtc_funcs = {
.set_config = drm_atomic_helper_set_config,
.destroy= drm_crtc_cleanup,
.page_flip  = drm_atomic_helper_page_flip,
-   .reset  = drm_atomic_helper_crtc_reset,
-   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
-   .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
+   .reset  = vkms_atomic_crtc_reset,
+   .atomic_duplicate_state = vkms_atomic_crtc_duplicate_state,
+   .atomic_destroy_state   = vkms_atomic_crtc_destroy_state,
.enable_vblank  = vkms_enable_vblank,
.disable_vblank = vkms_disable_vblank,
 };
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 855e1ea8bc35..bf811d0ec349 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -20,6 +20,14 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
 
+/**
+ * vkms_crtc_state - Driver specific CRTC state
+ * @base: base CRTC state
+ */
+struct vkms_crtc_state {
+   struct drm_crtc_state base;
+};
+
 struct vkms_output {
struct drm_crtc crtc;
struct drm_encoder encoder;
@@ -52,6 +60,9 @@ struct vkms_gem_object {
 #define drm_gem_to_vkms_gem(target)\
container_of(target, struct vkms_gem_object, gem)
 
+#define to_vkms_crtc_state(target)\
+   container_of(target, struct vkms_crtc_state, base)
+
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
   struct drm_plane *primary, struct drm_plane *cursor);
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 3/5] drm/vkms: Add atomic_helper_check_plane_state

2018-07-15 Thread Haneen Mohammed
Call atomic_helper_check_plane_state to clip plane coordinates.

Signed-off-by: Haneen Mohammed 
---
Changes in v2:
- check for plane_state->visible since we can't handle a disabled
  primary plane yet.

 drivers/gpu/drm/vkms/vkms_plane.c | 29 +
 1 file changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index 877483984897..aaf7c35faed6 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -7,6 +7,7 @@
  */
 
 #include "vkms_drv.h"
+#include 
 #include 
 #include 
 #include 
@@ -25,6 +26,33 @@ static void vkms_primary_plane_update(struct drm_plane 
*plane,
 {
 }
 
+static int vkms_plane_atomic_check(struct drm_plane *plane,
+  struct drm_plane_state *state)
+{
+   struct drm_crtc_state *crtc_state;
+   int ret;
+
+   if (!state->fb | !state->crtc)
+   return 0;
+
+   crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc);
+   if (IS_ERR(crtc_state))
+   return PTR_ERR(crtc_state);
+
+   ret = drm_atomic_helper_check_plane_state(state, crtc_state,
+ DRM_PLANE_HELPER_NO_SCALING,
+ DRM_PLANE_HELPER_NO_SCALING,
+ false, true);
+   if (ret != 0)
+   return ret;
+
+   /* for now primary plane must be visible and full screen */
+   if (!state->visible)
+   return -EINVAL;
+
+   return 0;
+}
+
 static int vkms_prepare_fb(struct drm_plane *plane,
   struct drm_plane_state *state)
 {
@@ -58,6 +86,7 @@ static void vkms_cleanup_fb(struct drm_plane *plane,
 
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
.atomic_update  = vkms_primary_plane_update,
+   .atomic_check   = vkms_plane_atomic_check,
.prepare_fb = vkms_prepare_fb,
.cleanup_fb = vkms_cleanup_fb,
 };
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 1/5] drm/vkms: Add functions to map/unmap GEM backing storage

2018-07-15 Thread Haneen Mohammed
This patch add the necessary functions to map/unmap GEM
backing memory to the kernel's virtual address space.

Signed-off-by: Haneen Mohammed 
---
Changes in v2:
- add vkms_gem_vunmap
- use vmap_count to guard against multiple prepare_fb calls on the same
  fb

 drivers/gpu/drm/vkms/vkms_drv.h |  9 
 drivers/gpu/drm/vkms/vkms_gem.c | 73 -
 2 files changed, 81 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 07be29f2dc44..855e1ea8bc35 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -39,6 +39,8 @@ struct vkms_gem_object {
struct drm_gem_object gem;
struct mutex pages_lock; /* Page lock used in page fault handler */
struct page **pages;
+   unsigned int vmap_count;
+   void *vaddr;
 };
 
 #define drm_crtc_to_vkms_output(target) \
@@ -47,6 +49,9 @@ struct vkms_gem_object {
 #define drm_device_to_vkms_device(target) \
container_of(target, struct vkms_device, drm)
 
+#define drm_gem_to_vkms_gem(target)\
+   container_of(target, struct vkms_gem_object, gem)
+
 /* CRTC */
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
   struct drm_plane *primary, struct drm_plane *cursor);
@@ -75,4 +80,8 @@ int vkms_dumb_map(struct drm_file *file, struct drm_device 
*dev,
 
 void vkms_gem_free_object(struct drm_gem_object *obj);
 
+void *vkms_gem_vmap(struct drm_gem_object *obj);
+
+void vkms_gem_vunmap(struct drm_gem_object *obj);
+
 #endif /* _VKMS_DRV_H_ */
diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c
index c7e38368602b..3f574e761b0f 100644
--- a/drivers/gpu/drm/vkms/vkms_gem.c
+++ b/drivers/gpu/drm/vkms/vkms_gem.c
@@ -37,7 +37,9 @@ void vkms_gem_free_object(struct drm_gem_object *obj)
struct vkms_gem_object *gem = container_of(obj, struct vkms_gem_object,
   gem);
 
-   kvfree(gem->pages);
+   WARN_ON(gem->pages);
+   WARN_ON(gem->vaddr);
+
mutex_destroy(>pages_lock);
drm_gem_object_release(obj);
kfree(gem);
@@ -177,3 +179,72 @@ int vkms_dumb_map(struct drm_file *file, struct drm_device 
*dev,
 
return ret;
 }
+
+static struct page **_get_pages(struct vkms_gem_object *vkms_obj)
+{
+   struct drm_gem_object *gem_obj = _obj->gem;
+
+   if (!vkms_obj->pages) {
+   struct page **pages = drm_gem_get_pages(gem_obj);
+
+   if (IS_ERR(pages))
+   return pages;
+
+   if (cmpxchg(_obj->pages, NULL, pages))
+   drm_gem_put_pages(gem_obj, pages, false, true);
+   }
+
+   return vkms_obj->pages;
+}
+
+void vkms_gem_vunmap(struct drm_gem_object *obj)
+{
+   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(obj);
+
+   mutex_lock(_obj->pages_lock);
+   WARN_ON(vkms_obj->vmap_count < 1);
+   vkms_obj->vmap_count--;
+
+   if (vkms_obj->vmap_count == 0) {
+   vunmap(vkms_obj->vaddr);
+   vkms_obj->vaddr = NULL;
+   drm_gem_put_pages(obj, vkms_obj->pages, false, true);
+   vkms_obj->pages = NULL;
+   }
+
+   mutex_unlock(_obj->pages_lock);
+}
+
+void *vkms_gem_vmap(struct drm_gem_object *obj)
+{
+   struct vkms_gem_object *vkms_obj = drm_gem_to_vkms_gem(obj);
+
+   int ret = 0;
+
+   mutex_lock(_obj->pages_lock);
+   vkms_obj->vmap_count++;
+
+   if (!vkms_obj->vaddr) {
+   unsigned int n_pages = obj->size >> PAGE_SHIFT;
+   struct page **pages = _get_pages(vkms_obj);
+
+   if (IS_ERR(pages)) {
+   ret = PTR_ERR(pages);
+   goto fail;
+   }
+
+   vkms_obj->vaddr = vmap(pages, n_pages, VM_MAP, PAGE_KERNEL);
+   if (!vkms_obj->vaddr) {
+   ret = -ENOMEM;
+   goto fail;
+   }
+   }
+
+   mutex_unlock(_obj->pages_lock);
+   return vkms_obj->vaddr;
+
+fail:
+   vkms_obj->vmap_count--;
+   mutex_unlock(_obj->pages_lock);
+   return ERR_PTR(ret);
+}
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 4/4] drm/vkms: subclass CRTC state

2018-07-11 Thread Haneen Mohammed
On Tue, Jul 10, 2018 at 10:10:46AM +0200, Daniel Vetter wrote:
> On Mon, Jul 09, 2018 at 06:48:36PM +0300, Haneen Mohammed wrote:
> > Subclass CRTC state struct to enable storing driver's private
> > state. This patch only adds the base drm_crtc_state struct and
> > the atomic functions that handle it.
> > 
> > Signed-off-by: Haneen Mohammed 
> 
> Reviewed-by: Daniel Vetter 
> 
> > ---
> >  drivers/gpu/drm/vkms/vkms_crtc.c | 55 ++--
> >  drivers/gpu/drm/vkms/vkms_drv.h  |  8 +
> >  2 files changed, 60 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c 
> > b/drivers/gpu/drm/vkms/vkms_crtc.c
> > index 84cc05506b09..56206437647d 100644
> > --- a/drivers/gpu/drm/vkms/vkms_crtc.c
> > +++ b/drivers/gpu/drm/vkms/vkms_crtc.c
> > @@ -10,13 +10,62 @@
> >  #include 
> >  #include 
> >  
> > +static void vkms_crtc_reset(struct drm_crtc *crtc)
> > +{
> > +   struct vkms_crtc_state *state = NULL;
> > +
> > +   if (crtc->state) {
> > +   state = container_of(crtc->state, struct vkms_crtc_state,
> > +base);
> > +   __drm_atomic_helper_crtc_destroy_state(crtc->state);
> > +   kfree(state);
> > +   crtc->state = NULL;
> > +   }
> > +
> > +   state = kzalloc(sizeof(*state), GFP_KERNEL);
> 
> Hm, using kzalloc here is a good idea instead of kmalloc like in the
> default functions. Care to write a patch for drm_atomic_helper to replace
> all the kmalloc with kzalloc?
> 

Sure, I will work on that and on your other comments. 

Thank you so much!
Haneen

> Thanks, Daniel
> 
> > +   if (!state)
> > +   return;
> > +
> > +   crtc->state = >base;
> > +   crtc->state->crtc = crtc;
> > +}
> > +
> > +static struct drm_crtc_state *
> > +vkms_crtc_duplicate_state(struct drm_crtc *crtc)
> > +{
> > +   struct vkms_crtc_state *state;
> > +
> > +   if (WARN_ON(!crtc->state))
> > +   return NULL;
> > +
> > +   state = kzalloc(sizeof(*state), GFP_KERNEL);
> > +   if (!state)
> > +   return NULL;
> > +
> > +   __drm_atomic_helper_crtc_duplicate_state(crtc, >base);
> > +
> > +   return >base;
> > +}
> > +
> > +static void vkms_crtc_destroy_state(struct drm_crtc *crtc,
> > +   struct drm_crtc_state *state)
> > +{
> > +   struct vkms_crtc_state *vkms_state;
> > +
> > +   vkms_state = container_of(state, struct vkms_crtc_state, base);
> > +
> > +   __drm_atomic_helper_crtc_destroy_state(state);
> > +   kfree(vkms_state);
> > +}
> > +
> >  static const struct drm_crtc_funcs vkms_crtc_funcs = {
> > .set_config = drm_atomic_helper_set_config,
> > .destroy= drm_crtc_cleanup,
> > .page_flip  = drm_atomic_helper_page_flip,
> > -   .reset  = drm_atomic_helper_crtc_reset,
> > -   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
> > -   .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
> > +
> > +   .reset  = vkms_crtc_reset,
> > +   .atomic_duplicate_state = vkms_crtc_duplicate_state,
> > +   .atomic_destroy_state   = vkms_crtc_destroy_state,
> >  };
> >  
> >  static int vkms_crtc_atomic_check(struct drm_crtc *crtc,
> > diff --git a/drivers/gpu/drm/vkms/vkms_drv.h 
> > b/drivers/gpu/drm/vkms/vkms_drv.h
> > index d339a8108d85..61e367d32308 100644
> > --- a/drivers/gpu/drm/vkms/vkms_drv.h
> > +++ b/drivers/gpu/drm/vkms/vkms_drv.h
> > @@ -19,6 +19,14 @@ static const u32 vkms_formats[] = {
> > DRM_FORMAT_XRGB,
> >  };
> >  
> > +/**
> > + * vkms_crtc_state - Driver specific CRTC state
> > + * @base: base CRTC state
> > + */
> > +struct vkms_crtc_state {
> > +   struct drm_crtc_state base;
> > +};
> > +
> >  struct vkms_output {
> > struct drm_crtc crtc;
> > struct drm_encoder encoder;
> > -- 
> > 2.17.1
> > 
> 
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 1/4] drm/vkms: Add functions to map GEM backing storage

2018-07-11 Thread Haneen Mohammed
On Tue, Jul 10, 2018 at 09:12:36AM +0100, Chris Wilson wrote:
> Quoting Haneen Mohammed (2018-07-09 16:44:26)
> > +struct page **get_pages(struct vkms_gem_object *vkms_obj)
> > +{
> > +   struct drm_gem_object *gem_obj = _obj->gem;
> > +   struct page **pages = vkms_obj->pages;
> > +
> > +   if (!pages) {
> > +   mutex_lock(_obj->pages_lock);
> > +   pages = drm_gem_get_pages(gem_obj);
> > +   if (IS_ERR(pages)) {
> > +   mutex_unlock(_obj->pages_lock);
> > +   return pages;
> > +   }
> > +
> > +   vkms_obj->pages = pages;
> > +   mutex_unlock(_obj->pages_lock);
> 
> You have a race here with two callers setting pages. Trivially you fix
> it by checking if (!pages) again inside the lock, but the lock is
> superfluous in this case:
>   if (!vkms_obj->pages) {
>   srtuct pages **pages;
> 
>   pages = drm_gem_get_pages(gem_obj);
>   if (IS_ERR(pages))
>   return pages;
>   
>   if (cmpxchg(_obj->pages, NULL, pages))
>   put_pages(pages);
> 
>   /* barrier() is implied */
>   }
> 
>   return vkms_obj->pages;
> -Chris

Thank you for the feedback!

- Haneen
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 3/4] drm/vkms: Add atomic_helper_check_plane_state

2018-07-10 Thread Haneen Mohammed
Call atomic_helper_check_plane_state to clip plane coordinates.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_plane.c | 18 --
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index f464eb0e05dd..bf37aebac0fb 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -7,9 +7,10 @@
  */
 
 #include "vkms_drv.h"
-#include 
+#include 
 #include 
 #include 
+#include 
 
 static const struct drm_plane_funcs vkms_plane_funcs = {
.update_plane   = drm_atomic_helper_update_plane,
@@ -23,7 +24,20 @@ static const struct drm_plane_funcs vkms_plane_funcs = {
 static int vkms_plane_atomic_check(struct drm_plane *plane,
   struct drm_plane_state *state)
 {
-   return 0;
+   struct drm_crtc_state *crtc_state;
+
+   if (!state->fb || !state->crtc)
+   return 0;
+
+   crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc);
+
+   if (IS_ERR(crtc_state))
+   return PTR_ERR(crtc_state);
+
+   return drm_atomic_helper_check_plane_state(state, crtc_state,
+  DRM_PLANE_HELPER_NO_SCALING,
+  DRM_PLANE_HELPER_NO_SCALING,
+  false, true);
 }
 
 static void vkms_primary_plane_update(struct drm_plane *plane,
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 1/4] drm/vkms: Add functions to map GEM backing storage

2018-07-10 Thread Haneen Mohammed
This patch add the necessary functions to map GEM
backing memory into the kernel's virtual address space.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_drv.c |  2 ++
 drivers/gpu/drm/vkms/vkms_drv.h |  5 
 drivers/gpu/drm/vkms/vkms_gem.c | 50 +
 3 files changed, 57 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index fe93f8c17997..e48c8eeb495a 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -52,9 +52,11 @@ static struct drm_driver vkms_driver = {
.driver_features= DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_GEM,
.release= vkms_release,
.fops   = _driver_fops,
+
.dumb_create= vkms_dumb_create,
.dumb_map_offset= vkms_dumb_map,
.gem_vm_ops = _gem_vm_ops,
+   .gem_free_object_unlocked = vkms_gem_free_object,
 
.name   = DRIVER_NAME,
.desc   = DRIVER_DESC,
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 76f1720f81a5..d339a8108d85 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -35,6 +35,7 @@ struct vkms_gem_object {
struct drm_gem_object gem;
struct mutex pages_lock; /* Page lock used in page fault handler */
struct page **pages;
+   void *vaddr;
 };
 
 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
@@ -58,4 +59,8 @@ int vkms_dumb_create(struct drm_file *file, struct drm_device 
*dev,
 int vkms_dumb_map(struct drm_file *file, struct drm_device *dev,
  u32 handle, u64 *offset);
 
+void vkms_gem_free_object(struct drm_gem_object *obj);
+
+void *vkms_gem_vmap(struct drm_gem_object *obj);
+
 #endif /* _VKMS_DRV_H_ */
diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c
index 9f820f56b9e0..249855dded63 100644
--- a/drivers/gpu/drm/vkms/vkms_gem.c
+++ b/drivers/gpu/drm/vkms/vkms_gem.c
@@ -166,3 +166,53 @@ int vkms_dumb_map(struct drm_file *file, struct drm_device 
*dev,
 
return ret;
 }
+
+void vkms_gem_free_object(struct drm_gem_object *obj)
+{
+   struct vkms_gem_object *vkms_obj = container_of(obj,
+   struct vkms_gem_object,
+   gem);
+   kvfree(vkms_obj->pages);
+   mutex_destroy(_obj->pages_lock);
+   drm_gem_object_release(obj);
+   kfree(vkms_obj);
+}
+
+struct page **get_pages(struct vkms_gem_object *vkms_obj)
+{
+   struct drm_gem_object *gem_obj = _obj->gem;
+   struct page **pages = vkms_obj->pages;
+
+   if (!pages) {
+   mutex_lock(_obj->pages_lock);
+   pages = drm_gem_get_pages(gem_obj);
+   if (IS_ERR(pages)) {
+   mutex_unlock(_obj->pages_lock);
+   return pages;
+   }
+
+   vkms_obj->pages = pages;
+   mutex_unlock(_obj->pages_lock);
+   }
+
+   return pages;
+}
+
+void *vkms_gem_vmap(struct drm_gem_object *obj)
+{
+   void *vaddr = NULL;
+   struct vkms_gem_object *vkms_obj = container_of(obj,
+   struct vkms_gem_object,
+   gem);
+   unsigned int n_pages = obj->size >> PAGE_SHIFT;
+   struct page **pages = get_pages(vkms_obj);
+
+   if (IS_ERR(pages)) {
+   DRM_INFO("pages allocation failed %ld\n", PTR_ERR(pages));
+   return vaddr;
+   }
+
+   vaddr = vmap(pages, n_pages, VM_MAP, PAGE_KERNEL);
+
+   return vaddr;
+}
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 4/4] drm/vkms: subclass CRTC state

2018-07-10 Thread Haneen Mohammed
Subclass CRTC state struct to enable storing driver's private
state. This patch only adds the base drm_crtc_state struct and
the atomic functions that handle it.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_crtc.c | 55 ++--
 drivers/gpu/drm/vkms/vkms_drv.h  |  8 +
 2 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 84cc05506b09..56206437647d 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -10,13 +10,62 @@
 #include 
 #include 
 
+static void vkms_crtc_reset(struct drm_crtc *crtc)
+{
+   struct vkms_crtc_state *state = NULL;
+
+   if (crtc->state) {
+   state = container_of(crtc->state, struct vkms_crtc_state,
+base);
+   __drm_atomic_helper_crtc_destroy_state(crtc->state);
+   kfree(state);
+   crtc->state = NULL;
+   }
+
+   state = kzalloc(sizeof(*state), GFP_KERNEL);
+   if (!state)
+   return;
+
+   crtc->state = >base;
+   crtc->state->crtc = crtc;
+}
+
+static struct drm_crtc_state *
+vkms_crtc_duplicate_state(struct drm_crtc *crtc)
+{
+   struct vkms_crtc_state *state;
+
+   if (WARN_ON(!crtc->state))
+   return NULL;
+
+   state = kzalloc(sizeof(*state), GFP_KERNEL);
+   if (!state)
+   return NULL;
+
+   __drm_atomic_helper_crtc_duplicate_state(crtc, >base);
+
+   return >base;
+}
+
+static void vkms_crtc_destroy_state(struct drm_crtc *crtc,
+   struct drm_crtc_state *state)
+{
+   struct vkms_crtc_state *vkms_state;
+
+   vkms_state = container_of(state, struct vkms_crtc_state, base);
+
+   __drm_atomic_helper_crtc_destroy_state(state);
+   kfree(vkms_state);
+}
+
 static const struct drm_crtc_funcs vkms_crtc_funcs = {
.set_config = drm_atomic_helper_set_config,
.destroy= drm_crtc_cleanup,
.page_flip  = drm_atomic_helper_page_flip,
-   .reset  = drm_atomic_helper_crtc_reset,
-   .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
-   .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
+
+   .reset  = vkms_crtc_reset,
+   .atomic_duplicate_state = vkms_crtc_duplicate_state,
+   .atomic_destroy_state   = vkms_crtc_destroy_state,
 };
 
 static int vkms_crtc_atomic_check(struct drm_crtc *crtc,
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index d339a8108d85..61e367d32308 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -19,6 +19,14 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
 
+/**
+ * vkms_crtc_state - Driver specific CRTC state
+ * @base: base CRTC state
+ */
+struct vkms_crtc_state {
+   struct drm_crtc_state base;
+};
+
 struct vkms_output {
struct drm_crtc crtc;
struct drm_encoder encoder;
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 2/4] drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks

2018-07-10 Thread Haneen Mohammed
This patch map/unmap GEM backing memory to kernel address space
in prepare/cleanup_fb respectively and cache the virtual address
for later use.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_plane.c | 41 +++
 1 file changed, 41 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index f7f63143f6d0..f464eb0e05dd 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -9,6 +9,7 @@
 #include "vkms_drv.h"
 #include 
 #include 
+#include 
 
 static const struct drm_plane_funcs vkms_plane_funcs = {
.update_plane   = drm_atomic_helper_update_plane,
@@ -30,9 +31,49 @@ static void vkms_primary_plane_update(struct drm_plane 
*plane,
 {
 }
 
+static int vkms_prepare_fb(struct drm_plane *plane,
+  struct drm_plane_state *state)
+{
+   struct drm_gem_object *gem_obj;
+   struct vkms_gem_object *vkms_obj;
+
+   if (!state->fb)
+   return 0;
+
+   gem_obj = drm_gem_fb_get_obj(state->fb, 0);
+   vkms_obj = container_of(gem_obj, struct vkms_gem_object, gem);
+   vkms_obj->vaddr = vkms_gem_vmap(gem_obj);
+
+   if (!vkms_obj->vaddr)
+   DRM_INFO("vmap failed\n");
+
+   return drm_gem_fb_prepare_fb(plane, state);
+}
+
+static void vkms_cleanup_fb(struct drm_plane *plane,
+   struct drm_plane_state *old_state)
+{
+   struct drm_gem_object *gem_obj;
+   struct vkms_gem_object *vkms_obj;
+
+   if (!old_state->fb)
+   return;
+
+   gem_obj = drm_gem_fb_get_obj(old_state->fb, 0);
+   vkms_obj = container_of(gem_obj, struct vkms_gem_object, gem);
+
+   if (vkms_obj && vkms_obj->pages) {
+   vunmap(vkms_obj->vaddr);
+   drm_gem_put_pages(gem_obj, vkms_obj->pages, false, true);
+   vkms_obj->pages = NULL;
+   }
+}
+
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
.atomic_check   = vkms_plane_atomic_check,
.atomic_update  = vkms_primary_plane_update,
+   .prepare_fb = vkms_prepare_fb,
+   .cleanup_fb = vkms_cleanup_fb,
 };
 
 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev)
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 0/4] Add infrastructure needed for CRC support

2018-07-10 Thread Haneen Mohammed
This patchset add the necessary infrastructure needed later for CRC
support.

1. add functions to map buffers to kernel address space.
2. map/unmap buffers in the prepare/cleanup_fb hooks.
3. clip plane coordinates.
4. subclass CRTC state.

Note:
This patchset was built on top of the following patchset:
subject: [PATCH V2 0/5] drm/vkms: Updates to meet basic kms_flip requirements
link: https://lists.freedesktop.org/archives/dri-devel/2018-June/180823.html

Haneen Mohammed (4):
  drm/vkms: Add functions to map GEM backing storage
  drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks
  drm/vkms: Add atomic_helper_check_plane_state
  drm/vkms: subclass CRTC state

 drivers/gpu/drm/vkms/vkms_crtc.c  | 55 ++--
 drivers/gpu/drm/vkms/vkms_drv.c   |  2 ++
 drivers/gpu/drm/vkms/vkms_drv.h   | 13 +++
 drivers/gpu/drm/vkms/vkms_gem.c   | 50 ++
 drivers/gpu/drm/vkms/vkms_plane.c | 59 +--
 5 files changed, 174 insertions(+), 5 deletions(-)

-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH V2 1/5] drm/vkms: Add dumb operations

2018-07-06 Thread Haneen Mohammed
On Thu, Jun 21, 2018 at 09:16:13AM -0300, Rodrigo Siqueira wrote:
> VKMS currently does not handle dumb data, and as a consequence, it does
> not provide mechanisms for handling gem. This commit adds the necessary
> support for gem object/handler and the dumb functions.
> 
> Signed-off-by: Rodrigo Siqueira 
> ---

This looks good to me except with missing gem_free_object_unlocked callback,
which causes warning: Memory manager not clean during takedown. 

Maybe it will be easier if we add this in another patch instead of creating v3 
of
this patchset?

>  drivers/gpu/drm/vkms/Makefile   |   2 +-
>  drivers/gpu/drm/vkms/vkms_drv.c |   9 ++
>  drivers/gpu/drm/vkms/vkms_drv.h |  21 
>  drivers/gpu/drm/vkms/vkms_gem.c | 168 
>  4 files changed, 199 insertions(+), 1 deletion(-)
>  create mode 100644 drivers/gpu/drm/vkms/vkms_gem.c
> 
> diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
> index 3f774a6a9c58..986297da51bf 100644
> --- a/drivers/gpu/drm/vkms/Makefile
> +++ b/drivers/gpu/drm/vkms/Makefile
> @@ -1,3 +1,3 @@
> -vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o
> +vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o vkms_gem.o
>  
>  obj-$(CONFIG_DRM_VKMS) += vkms.o
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> index 740a4cbfed91..638bab9083b5 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.c
> +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> @@ -37,6 +37,12 @@ static const struct file_operations vkms_driver_fops = {
>   .release= drm_release,
>  };
>  
> +static const struct vm_operations_struct vkms_gem_vm_ops = {
> + .fault = vkms_gem_fault,
> + .open = drm_gem_vm_open,
> + .close = drm_gem_vm_close,
> +};
> +
>  static void vkms_release(struct drm_device *dev)
>  {
>   struct vkms_device *vkms = container_of(dev, struct vkms_device, drm);
> @@ -50,6 +56,9 @@ static struct drm_driver vkms_driver = {
>   .driver_features= DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_GEM,
>   .release= vkms_release,
>   .fops   = _driver_fops,
> + .dumb_create= vkms_dumb_create,
> + .dumb_map_offset= vkms_dumb_map,
> + .gem_vm_ops = _gem_vm_ops,
>  
>   .name   = DRIVER_NAME,
>   .desc   = DRIVER_DESC,
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
> index b0f9d2e61a42..54bb3dd2b2c1 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.h
> +++ b/drivers/gpu/drm/vkms/vkms_drv.h
> @@ -3,6 +3,7 @@
>  
>  #include 
>  #include 
> +#include 
>  #include 
>  
>  static const u32 vkms_formats[] = {
> @@ -21,6 +22,12 @@ struct vkms_device {
>   struct vkms_output output;
>  };
>  
> +struct vkms_gem_object {
> + struct drm_gem_object gem;
> + struct mutex pages_lock; /* Page lock used in page fault handler */
> + struct page **pages;
> +};
> +
>  int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
>  struct drm_plane *primary, struct drm_plane *cursor);
>  
> @@ -28,4 +35,18 @@ int vkms_output_init(struct vkms_device *vkmsdev);
>  
>  struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev);
>  
> +/* Gem stuff */
> +struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
> +struct drm_file *file,
> +u32 *handle,
> +u64 size);
> +
> +int vkms_gem_fault(struct vm_fault *vmf);
> +
> +int vkms_dumb_create(struct drm_file *file, struct drm_device *dev,
> +  struct drm_mode_create_dumb *args);
> +
> +int vkms_dumb_map(struct drm_file *file, struct drm_device *dev,
> +   u32 handle, u64 *offset);
> +
>  #endif /* _VKMS_DRV_H_ */
> diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c
> new file mode 100644
> index ..9f820f56b9e0
> --- /dev/null
> +++ b/drivers/gpu/drm/vkms/vkms_gem.c
> @@ -0,0 +1,168 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +
> +#include 
> +
> +#include "vkms_drv.h"
> +
> +static struct vkms_gem_object *__vkms_gem_create(struct drm_device *dev,
> +  u64 size)
> +{
> + struct vkms_gem_object *obj;
> + int ret;
> +
> + obj = kzalloc(sizeof(*obj), GFP_KERNEL);
> + if (!obj)
> + return ERR_PTR(-ENOMEM);
> +
> + size = roundup(size, PAGE_SIZE);
> + ret = drm_gem_object_init(dev, >gem, size);
> + if (ret) {
> + kfree(obj);
> + return ERR_PTR(ret);
> + }
> +
> + mutex_init(>pages_lock);
> +
> + return obj;
> +}
> +
> 

Re: [RFC 3/3] drm/vkms: Implement CRC debugfs API

2018-06-29 Thread Haneen Mohammed
On Thu, Jun 28, 2018 at 01:40:08PM +0200, Daniel Vetter wrote:
> On Thu, Jun 28, 2018 at 10:07 AM, Daniel Vetter  wrote:
> > On Thu, Jun 28, 2018 at 12:24:35AM +0300, Haneen Mohammed wrote:
> >> Implement the .set_crc_source() callback.
> >> Compute CRC using crc32 on the visible part of the framebuffer.
> >> Use work_struct to compute and add CRC at the end of a vblank.
> >>
> >> Signed-off-by: Haneen Mohammed 
> >
> > Ok locking review. I still don't have a clear idea how to best fix this,
> > but oh well.
> >
> >> ---
> >>  drivers/gpu/drm/vkms/vkms_crtc.c | 76 
> >>  drivers/gpu/drm/vkms/vkms_drv.h  | 16 +++
> >>  2 files changed, 92 insertions(+)
> >>
> >> diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c 
> >> b/drivers/gpu/drm/vkms/vkms_crtc.c
> >> index 73aae129c37d..d78934b76e33 100644
> >> --- a/drivers/gpu/drm/vkms/vkms_crtc.c
> >> +++ b/drivers/gpu/drm/vkms/vkms_crtc.c
> >> @@ -7,8 +7,78 @@
> >>   */
> >>
> >>  #include "vkms_drv.h"
> >> +#include 
> >>  #include 
> >>  #include 
> >> +#include 
> >> +
> >> +uint32_t _vkms_get_crc(struct drm_framebuffer *fb)
> >> +{
> >> + struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
> >> + struct vkms_gem_object *vkms_obj = container_of(gem_obj,
> >> + struct 
> >> vkms_gem_object,
> >> + gem);
> >> + u32 crc = 0;
> >> + int i = 0;
> >> + struct drm_plane_state *state = vkms_obj->plane_state;
> >
> > vkms_obj->plane_state is the first locking issue: You store the pointer
> > without any locks or synchronization, which means the crc worker here
> > could access is while it's being changed, resulting in an inconsistent
> > crc. Note that the compiler/cpu is allowed to read a pointer multiple
> > times if it's not protected by locking/barriers, so all kinds of funny
> > stuff can happen here.
> >
> > Second issue is that the memory you're pointing to isn't owned by the crc
> > subsystem, but by the atomic commit worker. That could release the memory
> > (and it might get reused for something else meanwhile) before the crc
> > worker here is done with it.
> >
> >> + unsigned int x = state->src.x1 >> 16;
> >> + unsigned int y = state->src.y1 >> 16;
> >> + unsigned int height = drm_rect_height(>src) >> 16;
> >> + unsigned int width = drm_rect_width(>src) >> 16;
> >> + unsigned int cpp = fb->format->cpp[0];
> >> + unsigned int src_offset;
> >> + unsigned int size_byte = width * cpp;
> >> + void *vaddr = vkms_obj->vaddr;
> >> +
> >> + if (WARN_ON(!vaddr))
> >> + return crc;
> >> +
> >> + for (i = y; i < y + height; i++) {
> >> + src_offset = fb->offsets[0] + (i * fb->pitches[0]) + (x * 
> >> cpp);
> >> + crc = crc32_le(crc, vaddr + src_offset, size_byte);
> >> + }
> >> +
> >> + return crc;
> >> +}
> >> +
> >> +void vkms_crc_work_handle(struct work_struct *work)
> >> +{
> >> + struct vkms_crtc_state *crtc_state = container_of(work,
> >> +  struct vkms_crtc_state,
> >> +  crc_workq);
> >> + struct drm_crtc *crtc = crtc_state->crtc;
> >> + struct drm_framebuffer *fb = (crtc->primary ? crtc->primary->fb : 
> >> NULL);
> >
> > The drm_plane->fb pointer has similar issues: No locking (the only thing
> > that's really allowed to change this is the atomic commit worker for
> > atomic drivers, nothing else), so same issues with inconsistent data and
> > using possibly freed memory.
> >
> > On top Ville has a patch series to set drm_plane->fb == NULL for all
> > atomic drivers - it's really a leftover from the pre-atomic age and
> > doesn't fit for atomic.
> 
> Ville just said that he pushed all that. Are you sure that you're on
> latest drm-tip? On latest drm-tip primary->fb should be always NULL
> for an atomic driver like vkms ... If you're not on latest drm-tip
> probably good idea to rebase everything.
> -Daniel
> 

Ok I will work on that, thank you so much! 

I did update my branch recently but then tha

[RFC 1/3] drm/vkms: Add functions to map GEM backing storage

2018-06-28 Thread Haneen Mohammed
This patch add the necessary functions to map GEM backing memory
into the kernel's virtual address space.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_drv.c |  1 +
 drivers/gpu/drm/vkms/vkms_drv.h |  5 
 drivers/gpu/drm/vkms/vkms_gem.c | 50 +
 3 files changed, 56 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
index c56d66d9ec56..8ab53958e4b9 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.c
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -55,6 +55,7 @@ static struct drm_driver vkms_driver = {
.dumb_create= vkms_dumb_create,
.dumb_map_offset= vkms_dumb_map,
.gem_vm_ops = _gem_vm_ops,
+   .gem_free_object_unlocked = vkms_gem_free_object,
 
.name   = DRIVER_NAME,
.desc   = DRIVER_DESC,
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index f115e7d1ae03..d6cb8824cee2 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -41,6 +41,7 @@ struct vkms_gem_object {
struct drm_gem_object gem;
struct mutex pages_lock; /* Page lock used in page fault handler */
struct page **pages;
+   void *vaddr;
 };
 
 #define drm_crtc_to_vkms_output(target) \
@@ -67,4 +68,8 @@ int vkms_dumb_create(struct drm_file *file, struct drm_device 
*dev,
 int vkms_dumb_map(struct drm_file *file, struct drm_device *dev,
  u32 handle, u64 *offset);
 
+void vkms_gem_free_object(struct drm_gem_object *obj);
+
+void *vkms_gem_vmap(struct drm_gem_object *obj);
+
 #endif /* _VKMS_DRV_H_ */
diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c
index 9f820f56b9e0..249855dded63 100644
--- a/drivers/gpu/drm/vkms/vkms_gem.c
+++ b/drivers/gpu/drm/vkms/vkms_gem.c
@@ -166,3 +166,53 @@ int vkms_dumb_map(struct drm_file *file, struct drm_device 
*dev,
 
return ret;
 }
+
+void vkms_gem_free_object(struct drm_gem_object *obj)
+{
+   struct vkms_gem_object *vkms_obj = container_of(obj,
+   struct vkms_gem_object,
+   gem);
+   kvfree(vkms_obj->pages);
+   mutex_destroy(_obj->pages_lock);
+   drm_gem_object_release(obj);
+   kfree(vkms_obj);
+}
+
+struct page **get_pages(struct vkms_gem_object *vkms_obj)
+{
+   struct drm_gem_object *gem_obj = _obj->gem;
+   struct page **pages = vkms_obj->pages;
+
+   if (!pages) {
+   mutex_lock(_obj->pages_lock);
+   pages = drm_gem_get_pages(gem_obj);
+   if (IS_ERR(pages)) {
+   mutex_unlock(_obj->pages_lock);
+   return pages;
+   }
+
+   vkms_obj->pages = pages;
+   mutex_unlock(_obj->pages_lock);
+   }
+
+   return pages;
+}
+
+void *vkms_gem_vmap(struct drm_gem_object *obj)
+{
+   void *vaddr = NULL;
+   struct vkms_gem_object *vkms_obj = container_of(obj,
+   struct vkms_gem_object,
+   gem);
+   unsigned int n_pages = obj->size >> PAGE_SHIFT;
+   struct page **pages = get_pages(vkms_obj);
+
+   if (IS_ERR(pages)) {
+   DRM_INFO("pages allocation failed %ld\n", PTR_ERR(pages));
+   return vaddr;
+   }
+
+   vaddr = vmap(pages, n_pages, VM_MAP, PAGE_KERNEL);
+
+   return vaddr;
+}
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[RFC 3/3] drm/vkms: Implement CRC debugfs API

2018-06-28 Thread Haneen Mohammed
Implement the .set_crc_source() callback.
Compute CRC using crc32 on the visible part of the framebuffer.
Use work_struct to compute and add CRC at the end of a vblank.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_crtc.c | 76 
 drivers/gpu/drm/vkms/vkms_drv.h  | 16 +++
 2 files changed, 92 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c
index 73aae129c37d..d78934b76e33 100644
--- a/drivers/gpu/drm/vkms/vkms_crtc.c
+++ b/drivers/gpu/drm/vkms/vkms_crtc.c
@@ -7,8 +7,78 @@
  */
 
 #include "vkms_drv.h"
+#include 
 #include 
 #include 
+#include 
+
+uint32_t _vkms_get_crc(struct drm_framebuffer *fb)
+{
+   struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
+   struct vkms_gem_object *vkms_obj = container_of(gem_obj,
+   struct vkms_gem_object,
+   gem);
+   u32 crc = 0;
+   int i = 0;
+   struct drm_plane_state *state = vkms_obj->plane_state;
+   unsigned int x = state->src.x1 >> 16;
+   unsigned int y = state->src.y1 >> 16;
+   unsigned int height = drm_rect_height(>src) >> 16;
+   unsigned int width = drm_rect_width(>src) >> 16;
+   unsigned int cpp = fb->format->cpp[0];
+   unsigned int src_offset;
+   unsigned int size_byte = width * cpp;
+   void *vaddr = vkms_obj->vaddr;
+
+   if (WARN_ON(!vaddr))
+   return crc;
+
+   for (i = y; i < y + height; i++) {
+   src_offset = fb->offsets[0] + (i * fb->pitches[0]) + (x * cpp);
+   crc = crc32_le(crc, vaddr + src_offset, size_byte);
+   }
+
+   return crc;
+}
+
+void vkms_crc_work_handle(struct work_struct *work)
+{
+   struct vkms_crtc_state *crtc_state = container_of(work,
+struct vkms_crtc_state,
+crc_workq);
+   struct drm_crtc *crtc = crtc_state->crtc;
+   struct drm_framebuffer *fb = (crtc->primary ? crtc->primary->fb : NULL);
+
+   if (crtc_state->crc_enabled && fb) {
+   u32 crc32 = _vkms_get_crc(fb);
+   unsigned int n_frame = drm_crtc_accurate_vblank_count(crtc);
+
+   drm_crtc_add_crc_entry(crtc, true, n_frame, );
+   }
+}
+
+static int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name,
+  size_t *values_cnt)
+{
+   struct drm_device *dev = crtc->dev;
+   struct vkms_device *vkms_dev = container_of(dev,
+   struct vkms_device,
+   drm);
+   struct vkms_crtc_state *crtc_state = _dev->output.crtc_state;
+
+   if (!src_name) {
+   crtc_state->crc_enabled = false;
+   } else if (strcmp(src_name, "auto") == 0) {
+   crtc_state->crc_enabled = true;
+   } else {
+   crtc_state->crc_enabled = false;
+   return -EINVAL;
+   }
+
+   *values_cnt = 1;
+
+   return 0;
+}
 
 static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer)
 {
@@ -23,6 +93,8 @@ static enum hrtimer_restart vkms_vblank_simulate(struct 
hrtimer *timer)
if (!ret)
DRM_ERROR("vkms failure on handling vblank");
 
+   vkms_crc_work_handle(>crtc_state.crc_workq);
+
spin_lock_irqsave(>dev->event_lock, flags);
if (output->event) {
drm_crtc_send_vblank_event(crtc, output->event);
@@ -46,6 +118,9 @@ static int vkms_enable_vblank(struct drm_crtc *crtc)
out->period_ns = ktime_set(0, DEFAULT_VBLANK_NS);
hrtimer_start(>vblank_hrtimer, out->period_ns, HRTIMER_MODE_ABS);
 
+   out->crtc_state.crtc = crtc;
+   INIT_WORK(>crtc_state.crc_workq, vkms_crc_work_handle);
+
return 0;
 }
 
@@ -65,6 +140,7 @@ static const struct drm_crtc_funcs vkms_crtc_funcs = {
.atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
.enable_vblank  = vkms_enable_vblank,
.disable_vblank = vkms_disable_vblank,
+   .set_crc_source = vkms_set_crc_source,
 };
 
 static int vkms_crtc_atomic_check(struct drm_crtc *crtc,
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 300e6a05d473..4a1458731dd7 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -22,6 +22,18 @@ static const u32 vkms_formats[] = {
DRM_FORMAT_XRGB,
 };
 
+/**
+ * struct vkms_crtc_state
+ * @crtc: backpointer to the CRTC
+ * @crc_workq: worker that captures CRCs for each frame
+ * @crc_enabled: flag to test if crc is enabled
+ */
+struct vkms_crtc_state {
+   struct drm_crtc *crtc;
+   struct wo

[RFC 2/3] drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks

2018-06-28 Thread Haneen Mohammed
This patch checks plane state and use prepare/cleanup_fb
to map/unmap GEM backing memory to kernel address space.

Signed-off-by: Haneen Mohammed 
---
 drivers/gpu/drm/vkms/vkms_drv.h   |  1 +
 drivers/gpu/drm/vkms/vkms_plane.c | 50 +++
 2 files changed, 51 insertions(+)

diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index d6cb8824cee2..300e6a05d473 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -42,6 +42,7 @@ struct vkms_gem_object {
struct mutex pages_lock; /* Page lock used in page fault handler */
struct page **pages;
void *vaddr;
+   struct drm_plane_state *plane_state;
 };
 
 #define drm_crtc_to_vkms_output(target) \
diff --git a/drivers/gpu/drm/vkms/vkms_plane.c 
b/drivers/gpu/drm/vkms/vkms_plane.c
index f7f63143f6d0..c717f2a41c1d 100644
--- a/drivers/gpu/drm/vkms/vkms_plane.c
+++ b/drivers/gpu/drm/vkms/vkms_plane.c
@@ -9,6 +9,7 @@
 #include "vkms_drv.h"
 #include 
 #include 
+#include 
 
 static const struct drm_plane_funcs vkms_plane_funcs = {
.update_plane   = drm_atomic_helper_update_plane,
@@ -22,6 +23,14 @@ static const struct drm_plane_funcs vkms_plane_funcs = {
 static int vkms_plane_atomic_check(struct drm_plane *plane,
   struct drm_plane_state *state)
 {
+   if (!state->crtc)
+   return 0;
+
+   drm_atomic_helper_check_plane_state(state, state->crtc->state,
+   DRM_PLANE_HELPER_NO_SCALING,
+   DRM_PLANE_HELPER_NO_SCALING,
+   false, // false for primary planes
+   true);
return 0;
 }
 
@@ -30,9 +39,50 @@ static void vkms_primary_plane_update(struct drm_plane 
*plane,
 {
 }
 
+static int vkms_prepare_fb(struct drm_plane *plane,
+  struct drm_plane_state *state)
+{
+   struct drm_gem_object *gem_obj;
+   struct vkms_gem_object *vkms_obj;
+
+   if (!state->fb)
+   return 0;
+
+   gem_obj = drm_gem_fb_get_obj(state->fb, 0);
+   vkms_obj = container_of(gem_obj, struct vkms_gem_object, gem);
+   vkms_obj->plane_state = state;
+   vkms_obj->vaddr = vkms_gem_vmap(gem_obj);
+
+   if (!vkms_obj->vaddr)
+   DRM_INFO("vmap failed\n");
+
+   return drm_gem_fb_prepare_fb(plane, state);
+}
+
+static void vkms_cleanup_fb(struct drm_plane *plane,
+   struct drm_plane_state *state)
+{
+   struct drm_gem_object *gem_obj;
+   struct vkms_gem_object *vkms_obj;
+
+   if (!state->fb)
+   return;
+
+   gem_obj = drm_gem_fb_get_obj(state->fb, 0);
+   vkms_obj = container_of(gem_obj, struct vkms_gem_object, gem);
+
+   if (vkms_obj && vkms_obj->pages) {
+   vunmap(vkms_obj->vaddr);
+   drm_gem_put_pages(gem_obj, vkms_obj->pages, false, true);
+   vkms_obj->pages = NULL;
+   }
+}
+
 static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
.atomic_check   = vkms_plane_atomic_check,
.atomic_update  = vkms_primary_plane_update,
+   .prepare_fb = vkms_prepare_fb,
+   .cleanup_fb = vkms_cleanup_fb,
 };
 
 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev)
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[RFC 0/3] Add infrastructure for CRC support

2018-06-28 Thread Haneen Mohammed
This patchset add the necessary infrastructure required to enable to
compute and add CRCs entries.

1. add functions to map buffers to kernel address space.
2. map/unmap buffers in the prepare/cleanup_fb hooks.
3. compute crc using crc32 on the visible portion of the buffer.

Note:
This patchset was built on top of the following patch:
subject: "drm/vkms: Add vblank events simulated by hrtimers"
link: https://lists.freedesktop.org/archives/dri-devel/2018-June/181060.html

Haneen Mohammed (3):
  drm/vkms: Add functions to map GEM backing storage
  drm/vkms: map/unmap buffers in [prepare/cleanup]_fb hooks
  drm/vkms: Implement CRC debugfs API

 drivers/gpu/drm/vkms/vkms_crtc.c  | 76 +++
 drivers/gpu/drm/vkms/vkms_drv.c   |  1 +
 drivers/gpu/drm/vkms/vkms_drv.h   | 22 +
 drivers/gpu/drm/vkms/vkms_gem.c   | 50 
 drivers/gpu/drm/vkms/vkms_plane.c | 50 
 5 files changed, 199 insertions(+)

-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3] drm: Add checks for NULL drm_connector_helper_funcs

2018-06-01 Thread Haneen Mohammed
This patch add checks for NULL drm_connector_helper_funcs
pointers before derefrencing the variable to avoid NULL pointer
dereference and make the helper function optional in the following
cases:

1) when using drm_helper_probe_single_connector_modes for fill_modes
callback in the drm_connector_funcs.
2) using drm_atomic_helper_check for atomic_check callbacks in the
drm_mode_config_funcs.

The dependency is as follow:

drm_connector_funcs:
* fill_modes = drm_helper_probe_single_connector_modes
b) drm_helper_probe_detect

drm_mode_config_func:
* atomic_check = drm_atomic_helper_check
a) drm_atomic_helper_check_modeset
a) handle_conflicting_encoders
c) update_connector_routing

Signed-off-by: Haneen Mohammed 
---
Changes in v3:
- add checks for drm_connector_helper_funcs only since plane/crtc 
  helper funcs are necessary for a functional driver

Changes in v2:
- add the least amount of checks to make the helpers optional for vkms

 drivers/gpu/drm/drm_atomic_helper.c | 10 +-
 drivers/gpu/drm/drm_probe_helper.c  |  5 +++--
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
b/drivers/gpu/drm/drm_atomic_helper.c
index 2a7ceca82b9e..065e7fe1f979 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -112,9 +112,9 @@ static int handle_conflicting_encoders(struct 
drm_atomic_state *state,
if (!new_conn_state->crtc)
continue;
 
-   if (funcs->atomic_best_encoder)
+   if (funcs && funcs->atomic_best_encoder)
new_encoder = funcs->atomic_best_encoder(connector, 
new_conn_state);
-   else if (funcs->best_encoder)
+   else if (funcs && funcs->best_encoder)
new_encoder = funcs->best_encoder(connector);
else
new_encoder = drm_atomic_helper_best_encoder(connector);
@@ -308,10 +308,10 @@ update_connector_routing(struct drm_atomic_state *state,
 
funcs = connector->helper_private;
 
-   if (funcs->atomic_best_encoder)
+   if (funcs && funcs->atomic_best_encoder)
new_encoder = funcs->atomic_best_encoder(connector,
 new_connector_state);
-   else if (funcs->best_encoder)
+   else if (funcs && funcs->best_encoder)
new_encoder = funcs->best_encoder(connector);
else
new_encoder = drm_atomic_helper_best_encoder(connector);
@@ -639,7 +639,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
new_crtc_state->connectors_changed = true;
}
 
-   if (funcs->atomic_check)
+   if (funcs && funcs->atomic_check)
ret = funcs->atomic_check(connector, 
new_connector_state);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/drm_probe_helper.c 
b/drivers/gpu/drm/drm_probe_helper.c
index 527743394150..2fea54d16ebb 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -320,7 +320,7 @@ drm_helper_probe_detect(struct drm_connector *connector,
if (ret)
return ret;
 
-   if (funcs->detect_ctx)
+   if (funcs && funcs->detect_ctx)
return funcs->detect_ctx(connector, ctx, force);
else if (connector->funcs->detect)
return connector->funcs->detect(connector, force);
@@ -480,7 +480,8 @@ int drm_helper_probe_single_connector_modes(struct 
drm_connector *connector,
goto prune;
}
 
-   count = (*connector_funcs->get_modes)(connector);
+   if (connector_funcs && connector_funcs->get_modes)
+   count = (*connector_funcs->get_modes)(connector);
 
if (count == 0 && connector->status == connector_status_connected)
count = drm_add_modes_noedid(connector, 1024, 768);
-- 
2.17.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH] drm: Add checks for NULL drm_*_helper_funcs

2018-05-30 Thread Haneen Mohammed
On Tue, May 29, 2018 at 10:03:53AM +0200, Daniel Vetter wrote:
> On Fri, May 25, 2018 at 05:20:08AM +0300, Haneen Mohammed wrote:
> > This patch add checks for NULL drm_[connector/crtc/plane]_helper_funcs
> > pointers before derefrencing the variable to avoid NULL pointer
> > dereference and make the helper functions as optional as possible.
> > 
> > Signed-off-by: Haneen Mohammed 
> 
> I started reviewing this, and then realized it's a bit a can of worms.
> E.g. connector->funcs->detect shouldn't be there, it's a helper callback
> really (but placed in the wrong function table). So connector->funcs isn't
> optional, but connector->funcs->detect maybe should be optional.
> 
> So I'm not sure anymore whether doing this holesale is a good idea. Do we
> still need this for vkms? If yes, then a more focused patch to just make
> the things optional that vkms does not (yet) provide might be better.
> Including an explanation of what exactly blows up in vkms.
> 

hm only for running the igt tests & modetest in libdrm. 

It was easier to add check for all the funcs, but I will check again the
least amount of checks needed for vkms.

Thank you!
Haneen

> Thanks, Daniel
> > ---
> >  drivers/gpu/drm/drm_atomic_helper.c | 42 +++--
> >  drivers/gpu/drm/drm_probe_helper.c  | 11 
> >  2 files changed, 28 insertions(+), 25 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
> > b/drivers/gpu/drm/drm_atomic_helper.c
> > index c35654591c12..52092deb741d 100644
> > --- a/drivers/gpu/drm/drm_atomic_helper.c
> > +++ b/drivers/gpu/drm/drm_atomic_helper.c
> > @@ -112,9 +112,9 @@ static int handle_conflicting_encoders(struct 
> > drm_atomic_state *state,
> > if (!new_conn_state->crtc)
> > continue;
> >  
> > -   if (funcs->atomic_best_encoder)
> > +   if (funcs && funcs->atomic_best_encoder)
> > new_encoder = funcs->atomic_best_encoder(connector, 
> > new_conn_state);
> > -   else if (funcs->best_encoder)
> > +   else if (funcs && funcs->best_encoder)
> > new_encoder = funcs->best_encoder(connector);
> > else
> > new_encoder = drm_atomic_helper_best_encoder(connector);
> > @@ -308,10 +308,10 @@ update_connector_routing(struct drm_atomic_state 
> > *state,
> >  
> > funcs = connector->helper_private;
> >  
> > -   if (funcs->atomic_best_encoder)
> > +   if (funcs && funcs->atomic_best_encoder)
> > new_encoder = funcs->atomic_best_encoder(connector,
> >  new_connector_state);
> > -   else if (funcs->best_encoder)
> > +   else if (funcs && funcs->best_encoder)
> > new_encoder = funcs->best_encoder(connector);
> > else
> > new_encoder = drm_atomic_helper_best_encoder(connector);
> > @@ -438,7 +438,7 @@ mode_fixup(struct drm_atomic_state *state)
> > continue;
> >  
> > funcs = crtc->helper_private;
> > -   if (!funcs->mode_fixup)
> > +   if (!funcs || !funcs->mode_fixup)
> > continue;
> >  
> > ret = funcs->mode_fixup(crtc, _crtc_state->mode,
> > @@ -639,7 +639,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
> > new_crtc_state->connectors_changed = true;
> > }
> >  
> > -   if (funcs->atomic_check)
> > +   if (funcs && funcs->atomic_check)
> > ret = funcs->atomic_check(connector, 
> > new_connector_state);
> > if (ret)
> > return ret;
> > @@ -681,7 +681,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
> > if (connectors_mask & BIT(i))
> > continue;
> >  
> > -   if (funcs->atomic_check)
> > +   if (funcs && funcs->atomic_check)
> > ret = funcs->atomic_check(connector, 
> > new_connector_state);
> > if (ret)
> > return ret;
> > @@ -972,14 +972,16 @@ disable_outputs(struct drm_device *dev, struct 
> > drm_atomic_state *old_state)
> >  
> >  
> > /* Right function depends upon target state. */
> > -   if (new_crtc_state->enable && funcs->prepa

[PATCH v2] drm: Add checks for NULL drm_*_helper_funcs

2018-05-30 Thread Haneen Mohammed
This patch add checks for NULL drm_[connector/crtc/plane]_helper_funcs
pointers before derefrencing the variable to avoid NULL pointer
dereference and make the helper functions optional in the following
cases:

1) when using drm_helper_probe_single_connector_modes for fill_modes
callback in the drm_connector_funcs.
2) using drm_atomic_helper_[check/commit] for atomic_[check/commit]
callbacks in the drm_mode_config_funcs.

The dependency is as follow:

drm_connector_funcs:
* fill_modes = drm_helper_probe_single_connector_modes
b) drm_helper_probe_detect -> drm_connector_helper_funcs

drm_mode_config_funcs:
* atomic_check = drm_atomic_helper_check
a) drm_atomic_helper_check_modeset -> drm_connector helper_funcs
a) handle_conflicting_encoders -> drm_connector_helper_funcs
b) mode_fixup -> drm_crtc_helper_funcs
c) update_connector_routing -> drm_connectot_helper_funcs

* atomic_commit = drm_atomic_helper_commit
a) drm_atomic_helper_prepare_planes -> drm_plane_helper_funcs
b) drm_atomic_helper_cleanup_planes -> drm_plane_helper_funcs

Signed-off-by: Haneen Mohammed 
---
Chanes in v2:
- add the least amount of checks to make the helpers optional for vkms

 drivers/gpu/drm/drm_atomic_helper.c | 16 
 drivers/gpu/drm/drm_probe_helper.c  |  5 +++--
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
b/drivers/gpu/drm/drm_atomic_helper.c
index 2a7ceca82b9e..ff3684c4a83c 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -112,9 +112,9 @@ static int handle_conflicting_encoders(struct 
drm_atomic_state *state,
if (!new_conn_state->crtc)
continue;
 
-   if (funcs->atomic_best_encoder)
+   if (funcs && funcs->atomic_best_encoder)
new_encoder = funcs->atomic_best_encoder(connector, 
new_conn_state);
-   else if (funcs->best_encoder)
+   else if (funcs && funcs->best_encoder)
new_encoder = funcs->best_encoder(connector);
else
new_encoder = drm_atomic_helper_best_encoder(connector);
@@ -308,10 +308,10 @@ update_connector_routing(struct drm_atomic_state *state,
 
funcs = connector->helper_private;
 
-   if (funcs->atomic_best_encoder)
+   if (funcs && funcs->atomic_best_encoder)
new_encoder = funcs->atomic_best_encoder(connector,
 new_connector_state);
-   else if (funcs->best_encoder)
+   else if (funcs && funcs->best_encoder)
new_encoder = funcs->best_encoder(connector);
else
new_encoder = drm_atomic_helper_best_encoder(connector);
@@ -438,7 +438,7 @@ mode_fixup(struct drm_atomic_state *state)
continue;
 
funcs = crtc->helper_private;
-   if (!funcs->mode_fixup)
+   if (!funcs || !funcs->mode_fixup)
continue;
 
ret = funcs->mode_fixup(crtc, _crtc_state->mode,
@@ -639,7 +639,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
new_crtc_state->connectors_changed = true;
}
 
-   if (funcs->atomic_check)
+   if (funcs && funcs->atomic_check)
ret = funcs->atomic_check(connector, 
new_connector_state);
if (ret)
return ret;
@@ -2117,7 +2117,7 @@ int drm_atomic_helper_prepare_planes(struct drm_device 
*dev,
 
funcs = plane->helper_private;
 
-   if (funcs->prepare_fb) {
+   if (funcs && funcs->prepare_fb) {
ret = funcs->prepare_fb(plane, new_plane_state);
if (ret)
goto fail;
@@ -2412,7 +2412,7 @@ void drm_atomic_helper_cleanup_planes(struct drm_device 
*dev,
 
funcs = plane->helper_private;
 
-   if (funcs->cleanup_fb)
+   if (funcs && funcs->cleanup_fb)
funcs->cleanup_fb(plane, plane_state);
}
 }
diff --git a/drivers/gpu/drm/drm_probe_helper.c 
b/drivers/gpu/drm/drm_probe_helper.c
index 527743394150..2fea54d16ebb 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -320,7 +320,7 @@ drm_helper_probe_detect(struct drm_connector *connector,
if (ret)
return ret;
 
-   if (funcs->detect_ctx)
+   if (funcs && funcs->detect_ctx)
return funcs->detect_ctx(connector, ctx, force);
else if (connector->funcs->detect)
return co

[PATCH] drm: Add checks for NULL drm_*_helper_funcs

2018-05-25 Thread Haneen Mohammed
This patch add checks for NULL drm_[connector/crtc/plane]_helper_funcs
pointers before derefrencing the variable to avoid NULL pointer
dereference and make the helper functions as optional as possible.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 drivers/gpu/drm/drm_atomic_helper.c | 42 +++--
 drivers/gpu/drm/drm_probe_helper.c  | 11 
 2 files changed, 28 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/drm_atomic_helper.c 
b/drivers/gpu/drm/drm_atomic_helper.c
index c35654591c12..52092deb741d 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -112,9 +112,9 @@ static int handle_conflicting_encoders(struct 
drm_atomic_state *state,
if (!new_conn_state->crtc)
continue;
 
-   if (funcs->atomic_best_encoder)
+   if (funcs && funcs->atomic_best_encoder)
new_encoder = funcs->atomic_best_encoder(connector, 
new_conn_state);
-   else if (funcs->best_encoder)
+   else if (funcs && funcs->best_encoder)
new_encoder = funcs->best_encoder(connector);
else
new_encoder = drm_atomic_helper_best_encoder(connector);
@@ -308,10 +308,10 @@ update_connector_routing(struct drm_atomic_state *state,
 
funcs = connector->helper_private;
 
-   if (funcs->atomic_best_encoder)
+   if (funcs && funcs->atomic_best_encoder)
new_encoder = funcs->atomic_best_encoder(connector,
 new_connector_state);
-   else if (funcs->best_encoder)
+   else if (funcs && funcs->best_encoder)
new_encoder = funcs->best_encoder(connector);
else
new_encoder = drm_atomic_helper_best_encoder(connector);
@@ -438,7 +438,7 @@ mode_fixup(struct drm_atomic_state *state)
continue;
 
funcs = crtc->helper_private;
-   if (!funcs->mode_fixup)
+   if (!funcs || !funcs->mode_fixup)
continue;
 
ret = funcs->mode_fixup(crtc, _crtc_state->mode,
@@ -639,7 +639,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
new_crtc_state->connectors_changed = true;
}
 
-   if (funcs->atomic_check)
+   if (funcs && funcs->atomic_check)
ret = funcs->atomic_check(connector, 
new_connector_state);
if (ret)
return ret;
@@ -681,7 +681,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
if (connectors_mask & BIT(i))
continue;
 
-   if (funcs->atomic_check)
+   if (funcs && funcs->atomic_check)
ret = funcs->atomic_check(connector, 
new_connector_state);
if (ret)
return ret;
@@ -972,14 +972,16 @@ disable_outputs(struct drm_device *dev, struct 
drm_atomic_state *old_state)
 
 
/* Right function depends upon target state. */
-   if (new_crtc_state->enable && funcs->prepare)
-   funcs->prepare(crtc);
-   else if (funcs->atomic_disable)
-   funcs->atomic_disable(crtc, old_crtc_state);
-   else if (funcs->disable)
-   funcs->disable(crtc);
-   else
-   funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
+   if (funcs) {
+   if (new_crtc_state->enable && funcs->prepare)
+   funcs->prepare(crtc);
+   else if (funcs->atomic_disable)
+   funcs->atomic_disable(crtc, old_crtc_state);
+   else if (funcs->disable)
+   funcs->disable(crtc);
+   else
+   funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
+   }
 
if (!(dev->irq_enabled && dev->num_crtcs))
continue;
@@ -1093,7 +1095,7 @@ crtc_set_mode(struct drm_device *dev, struct 
drm_atomic_state *old_state)
 
funcs = crtc->helper_private;
 
-   if (new_crtc_state->enable && funcs->mode_set_nofb) {
+   if (new_crtc_state->enable && funcs && funcs->mode_set_nofb) {
DRM_DEBUG_ATOMIC("modeset on [CRTC:%d:%s]\n",
 crtc->base.id, crtc->name);
 
@@ -1197,7 +1199,7 @@ void drm_atomic_helper_commit_modeset_enables(struct 
drm_device *dev,
 
  

[PATCH] drm: Add checks for atomic_[duplicate/destroy]_state with atomic drivers

2018-05-25 Thread Haneen Mohammed
This patch add checks for atomic_[duplicate/destroy]_state of
drm_[connector/crtc/plane]_funcs for atomic drivers in the relevant
drm_*_init functions since these callback are mandatory for atomic drivers.

Update the kerneldoc comments for those callbacks.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 drivers/gpu/drm/drm_connector.c | 4 
 drivers/gpu/drm/drm_crtc.c  | 4 
 drivers/gpu/drm/drm_plane.c | 4 
 include/drm/drm_connector.h | 4 
 include/drm/drm_crtc.h  | 4 
 include/drm/drm_plane.h | 4 
 6 files changed, 24 insertions(+)

diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index b3cde897cd80..ab291f4f339a 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -195,6 +195,10 @@ int drm_connector_init(struct drm_device *dev,
struct ida *connector_ida =
_connector_enum_list[connector_type].ida;
 
+   WARN_ON(drm_drv_uses_atomic_modeset(dev) &&
+   (!funcs->atomic_destroy_state ||
+!funcs->atomic_duplicate_state));
+
ret = __drm_mode_object_add(dev, >base,
DRM_MODE_OBJECT_CONNECTOR,
false, drm_connector_free);
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 03583887cfec..d1933c5f2524 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -286,6 +286,10 @@ int drm_crtc_init_with_planes(struct drm_device *dev, 
struct drm_crtc *crtc,
if (WARN_ON(config->num_crtc >= 32))
return -EINVAL;
 
+   WARN_ON(drm_drv_uses_atomic_modeset(dev) &&
+   (!funcs->atomic_destroy_state ||
+!funcs->atomic_duplicate_state));
+
crtc->dev = dev;
crtc->funcs = funcs;
 
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
index 6d2a6e428a3e..e0efb06eec31 100644
--- a/drivers/gpu/drm/drm_plane.c
+++ b/drivers/gpu/drm/drm_plane.c
@@ -177,6 +177,10 @@ int drm_universal_plane_init(struct drm_device *dev, 
struct drm_plane *plane,
if (WARN_ON(config->num_total_plane >= 32))
return -EINVAL;
 
+   WARN_ON(drm_drv_uses_atomic_modeset(dev) &&
+   (!funcs->atomic_destroy_state ||
+!funcs->atomic_duplicate_state));
+
ret = drm_mode_object_add(dev, >base, DRM_MODE_OBJECT_PLANE);
if (ret)
return ret;
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 675cc3f8cf85..65b6c86ecd50 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -608,6 +608,8 @@ struct drm_connector_funcs {
 * cleaned up by calling the @atomic_destroy_state hook in this
 * structure.
 *
+* This callback is mandatory for atomic drivers.
+*
 * Atomic drivers which don't subclass  drm_connector_state 
should use
 * drm_atomic_helper_connector_duplicate_state(). Drivers that subclass 
the
 * state structure to extend it with driver-private state should use
@@ -634,6 +636,8 @@ struct drm_connector_funcs {
 *
 * Destroy a state duplicated with @atomic_duplicate_state and release
 * or unreference all resources it references
+*
+* This callback is mandatory for atomic drivers.
 */
void (*atomic_destroy_state)(struct drm_connector *connector,
 struct drm_connector_state *state);
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index a2d81d2907a9..26511d6775d7 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -503,6 +503,8 @@ struct drm_crtc_funcs {
 * cleaned up by calling the @atomic_destroy_state hook in this
 * structure.
 *
+* This callback is mandatory for atomic drivers.
+*
 * Atomic drivers which don't subclass  drm_crtc_state should use
 * drm_atomic_helper_crtc_duplicate_state(). Drivers that subclass the
 * state structure to extend it with driver-private state should use
@@ -529,6 +531,8 @@ struct drm_crtc_funcs {
 *
 * Destroy a state duplicated with @atomic_duplicate_state and release
 * or unreference all resources it references
+*
+* This callback is mandatory for atomic drivers.
 */
void (*atomic_destroy_state)(struct drm_crtc *crtc,
 struct drm_crtc_state *state);
diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h
index f7bf4a48b1c3..d6d68b466649 100644
--- a/include/drm/drm_plane.h
+++ b/include/drm/drm_plane.h
@@ -277,6 +277,8 @@ struct drm_plane_funcs {
 * cleaned up by calling the @atomic_destroy_state hook in this
 * structure.
 *
+* This callback is mandatory for a

Re: [PATCH v2 2/3] drm/vkms: Add basic CRTC initialization

2018-05-24 Thread Haneen Mohammed
On Wed, May 23, 2018 at 10:53:33AM +0200, Daniel Vetter wrote:
> On Sun, May 20, 2018 at 09:22:31AM +0300, Haneen Mohammed wrote:
> > On Wed, May 16, 2018 at 08:56:21PM -0300, Rodrigo Siqueira wrote:
> > > This commit adds the essential infrastructure for around CRTCs which
> > > is composed of: a new data struct for output data information, a
> > > function for creating planes, and a simple encoder attached to the
> > > connector. Finally, due to the introduction of a new initialization
> > > function, connectors were moved from vkms_drv.c to vkms_display.c.
> > > 
> > > Signed-off-by: Rodrigo Siqueira <rodrigosiqueiram...@gmail.com>
> > > ---
> > >  drivers/gpu/drm/vkms/Makefile  |  2 +-
> > >  drivers/gpu/drm/vkms/vkms_crtc.c   | 35 
> > >  drivers/gpu/drm/vkms/vkms_drv.c| 60 ++--
> > >  drivers/gpu/drm/vkms/vkms_drv.h| 24 +++-
> > >  drivers/gpu/drm/vkms/vkms_output.c | 91 ++
> > >  drivers/gpu/drm/vkms/vkms_plane.c  | 46 +++
> > >  6 files changed, 211 insertions(+), 47 deletions(-)
> > >  create mode 100644 drivers/gpu/drm/vkms/vkms_crtc.c
> > >  create mode 100644 drivers/gpu/drm/vkms/vkms_output.c
> > >  create mode 100644 drivers/gpu/drm/vkms/vkms_plane.c
> > > 
> > > diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
> > > index 2aef948d3a34..3f774a6a9c58 100644
> > > --- a/drivers/gpu/drm/vkms/Makefile
> > > +++ b/drivers/gpu/drm/vkms/Makefile
> > > @@ -1,3 +1,3 @@
> > > -vkms-y := vkms_drv.o
> > > +vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o
> > >  
> > >  obj-$(CONFIG_DRM_VKMS) += vkms.o
> > > diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c 
> > > b/drivers/gpu/drm/vkms/vkms_crtc.c
> > > new file mode 100644
> > > index ..bf76cd39ece7
> > > --- /dev/null
> > > +++ b/drivers/gpu/drm/vkms/vkms_crtc.c
> > > @@ -0,0 +1,35 @@
> > > +// SPDX-License-Identifier: GPL-2.0
> > > +/*
> > > + * This program is free software; you can redistribute it and/or modify
> > > + * it under the terms of the GNU General Public License as published by
> > > + * the Free Software Foundation; either version 2 of the License, or
> > > + * (at your option) any later version.
> > > + */
> > > +
> > > +#include "vkms_drv.h"
> > > +#include 
> > > +#include 
> > > +
> > > +static const struct drm_crtc_funcs vkms_crtc_funcs = {
> > > + .set_config = drm_atomic_helper_set_config,
> > > + .destroy= drm_crtc_cleanup,
> > > + .page_flip  = drm_atomic_helper_page_flip,
> > > + .reset  = drm_atomic_helper_crtc_reset,
> > > + .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
> > > + .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
> > > +};
> > > +
> > > +int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
> > > +struct drm_plane *primary, struct drm_plane *cursor)
> > > +{
> > > + int ret;
> > > +
> > 
> > Just as a follow up, I have noticed that vkms breaks when inspecting
> > its state in the debugfs, also when running igt tests with kms and core
> > filters, and adding the following fixed that issue:
> > 
> > 1) a drm_crtc_helper_funcs with dummy atomic_check.
> 
> We're trying to make callbacks as optional as possible, this was probably
> just an oversight. Can you try to find the place where this is called, and
> add suitable checks for NULL _funcs pointer?
> 
> Thanks, Daniel

Sure, I'll look for that.

> > 
> > > + ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
> > > + _crtc_funcs, NULL);
> > > + if (ret) {
> > > + DRM_ERROR("Failed to init CRTC\n");
> > > + return ret;
> > > + }
> > > +
> > > + return ret;
> > > +}
> > > diff --git a/drivers/gpu/drm/vkms/vkms_drv.c 
> > > b/drivers/gpu/drm/vkms/vkms_drv.c
> > > index aec3f180f96d..070613e32934 100644
> > > --- a/drivers/gpu/drm/vkms/vkms_drv.c
> > > +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> > > @@ -6,7 +6,6 @@
> > >   */
> > >  
> > >  #include 
> > > -#include 
> > >  #include 
> > >  #include 
> > >  #include 
> > > @@ 

Re: [PATCH V3 0/3] Expanding the basic vkms features

2018-05-24 Thread Haneen Mohammed
On Wed, May 23, 2018 at 11:15:18AM +0200, Daniel Vetter wrote:
> On Mon, May 21, 2018 at 10:04:23PM -0300, Rodrigo Siqueira wrote:
> > This series of patches add a centralized initialization mechanism, a
> > single CRTC with a plane, an encoder, and extra module information. 
> > 
> > Changes in v2:
> >  - Remove unused definitions
> >  - Improve file names
> >  - Improve code separation
> >  - Remove unnecessary formats
> 
> Oops, I merged v2 already. I think we need follow-up patches.
>  
> > Changes in v3:
> >  - Adds drm_crtc_helper_funcs with a simple atomic_check
> 
> Sorry for the late comment on v2, but I think we need to figure out why
> this goes boom first. It imo shouldn't.
> 
> >  - Adds extra hooks for drm_connector_funcs hooks (reset,
> >atomic_duplicate_state, atomic_destroy_state)
> 
> Hm, reset shouldn't be required. Why do you need it?
> 

I've checked the code, and I think the memory for [plane/connector/crtc]
states that are used later in duplicate/destroy are allocated in 
drm_atomic_helper_*_reset. 
Otherwise checking /sys/kernel/debug/dri/0/state or running the igt
tests causes null pointer dereference error.

> Wrt duplicate/destroy state, those are mandatory. I think it'd be good to
> have checks for those in the drm_*_init functions, but only for atomic
> drivers. You can use drm_drv_uses_atomic_modeset() and WARN_ON(). There's
> a bunch of examples already for checking for this stuff, see e.g.
> dma_fence_init().
>
> >  - Adds drm_connector_helper_funcs
> >  - Adds drm_plane_helper_funcs
> 
> Same here, would be good to add WARN_ON to the relevant _init() functions
> to make sure all the mandatory stuff is there to begin with.
> 
> Since Rodrigo has typed the fixes to vkms already, could you Haneen look
> into adding these checks to the core drm core?
>

Sure, I'll work on that.

> Thanks, Daniel
> 
> >  - Changes in the commit messages
> > 
> > Rodrigo Siqueira (3):
> >   drm/vkms: Add mode_config initialization
> >   drm/vkms: Add basic CRTC initialization
> >   drm/vkms: Add extra information about vkms
> > 
> >  drivers/gpu/drm/Kconfig|   8 +-
> >  drivers/gpu/drm/vkms/Makefile  |   2 +-
> >  drivers/gpu/drm/vkms/vkms_crtc.c   |  47 
> >  drivers/gpu/drm/vkms/vkms_drv.c|  55 +-
> >  drivers/gpu/drm/vkms/vkms_drv.h|  33 +++-
> >  drivers/gpu/drm/vkms/vkms_output.c | 118 +
> >  drivers/gpu/drm/vkms/vkms_plane.c  |  62 +++
> >  7 files changed, 285 insertions(+), 40 deletions(-)
> >  create mode 100644 drivers/gpu/drm/vkms/vkms_crtc.c
> >  create mode 100644 drivers/gpu/drm/vkms/vkms_output.c
> >  create mode 100644 drivers/gpu/drm/vkms/vkms_plane.c
> > 
> > -- 
> > 2.17.0
> > 
> 
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH V4 0/3] Expanding the basic vkms features

2018-05-23 Thread Haneen Mohammed
On Tue, May 22, 2018 at 09:16:11AM -0300, Rodrigo Siqueira wrote:
> This series of patches add a centralized initialization mechanism, a
> single CRTC with a plane, an encoder, and extra module information. 
> 
> Changes in v2:
>  - Remove unused definitions
>  - Improve file names
>  - Improve code separation
>  - Remove unnecessary formats
> 
> Changes in v3:
>  - Adds drm_crtc_helper_funcs with a simple atomic_check
>  - Adds extra hooks for drm_connector_funcs hooks (reset,
>atomic_duplicate_state, atomic_destroy_state)
>  - Adds drm_connector_helper_funcs
>  - Adds drm_plane_helper_funcs
>  - Changes in the commit messages
> 
> Changes in v4:
>  - Associate plane helper with plane
> 
> Rodrigo Siqueira (3):
>   drm/vkms: Add mode_config initialization
>   drm/vkms: Add basic CRTC initialization
>   drm/vkms: Add extra information about vkms
> 
>  drivers/gpu/drm/Kconfig|   8 +-
>  drivers/gpu/drm/vkms/Makefile  |   2 +-
>  drivers/gpu/drm/vkms/vkms_crtc.c   |  47 
>  drivers/gpu/drm/vkms/vkms_drv.c|  55 +-
>  drivers/gpu/drm/vkms/vkms_drv.h|  33 +++-
>  drivers/gpu/drm/vkms/vkms_output.c | 118 +
>  drivers/gpu/drm/vkms/vkms_plane.c  |  64 
>  7 files changed, 287 insertions(+), 40 deletions(-)
>  create mode 100644 drivers/gpu/drm/vkms/vkms_crtc.c
>  create mode 100644 drivers/gpu/drm/vkms/vkms_output.c
>  create mode 100644 drivers/gpu/drm/vkms/vkms_plane.c
> 
> -- 
> 2.17.0
> 

Reviewed-by: Haneen Mohammed <hamohammed...@gmail.com>

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH V3 2/3] drm/vkms: Add basic CRTC initialization

2018-05-22 Thread Haneen Mohammed
On Mon, May 21, 2018 at 10:06:40PM -0300, Rodrigo Siqueira wrote:
> This commit appends the essential CRTCs infrastructure for VKMS. CRTCs
> demands other elements to work correctly, in this sense, this patch adds
> a new data struct that centralizes the data structures related to the
> output, simple planes management, and single encoder attached to the
> connector.
> 
> Signed-off-by: Rodrigo Siqueira 
> ---
>  drivers/gpu/drm/vkms/Makefile  |   2 +-
>  drivers/gpu/drm/vkms/vkms_crtc.c   |  47 
>  drivers/gpu/drm/vkms/vkms_drv.c|  66 +---
>  drivers/gpu/drm/vkms/vkms_drv.h|  33 +++-
>  drivers/gpu/drm/vkms/vkms_output.c | 118 +
>  drivers/gpu/drm/vkms/vkms_plane.c  |  62 +++
>  6 files changed, 275 insertions(+), 53 deletions(-)
>  create mode 100644 drivers/gpu/drm/vkms/vkms_crtc.c
>  create mode 100644 drivers/gpu/drm/vkms/vkms_output.c
>  create mode 100644 drivers/gpu/drm/vkms/vkms_plane.c
> 
> diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
> index 2aef948d3a34..3f774a6a9c58 100644
> --- a/drivers/gpu/drm/vkms/Makefile
> +++ b/drivers/gpu/drm/vkms/Makefile
> @@ -1,3 +1,3 @@
> -vkms-y := vkms_drv.o
> +vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o
>  
>  obj-$(CONFIG_DRM_VKMS) += vkms.o
> diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c 
> b/drivers/gpu/drm/vkms/vkms_crtc.c
> new file mode 100644
> index ..4ec1424ed8b8
> --- /dev/null
> +++ b/drivers/gpu/drm/vkms/vkms_crtc.c
> @@ -0,0 +1,47 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +
> +#include "vkms_drv.h"
> +#include 
> +#include 
> +
> +static const struct drm_crtc_funcs vkms_crtc_funcs = {
> + .set_config = drm_atomic_helper_set_config,
> + .destroy= drm_crtc_cleanup,
> + .page_flip  = drm_atomic_helper_page_flip,
> + .reset  = drm_atomic_helper_crtc_reset,
> + .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
> + .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
> +};
> +
> +static int vkms_crtc_atomic_check(struct drm_crtc *crtc,
> +   struct drm_crtc_state *state)
> +{
> + return 0;
> +}
> +
> +static const struct drm_crtc_helper_funcs vkms_crtc_helper_funcs = {
> + .atomic_check  = vkms_crtc_atomic_check,
> +};
> +
> +int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
> +struct drm_plane *primary, struct drm_plane *cursor)
> +{
> + int ret;
> +
> + ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
> + _crtc_funcs, NULL);
> + if (ret) {
> + DRM_ERROR("Failed to init CRTC\n");
> + return ret;
> + }
> +
> + drm_crtc_helper_add(crtc, _crtc_helper_funcs);
> +
> + return ret;
> +}
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> index aec3f180f96d..eae5f1f293d0 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.c
> +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> @@ -6,7 +6,6 @@
>   */
>  
>  #include 
> -#include 
>  #include 
>  #include 
>  #include 
> @@ -18,12 +17,6 @@
>  #define DRIVER_MAJOR 1
>  #define DRIVER_MINOR 0
>  
> -#define XRES_MIN32
> -#define YRES_MIN32
> -
> -#define XRES_MAX  8192
> -#define YRES_MAX  8192
> -
>  static struct vkms_device *vkms_device;
>  
>  static const struct file_operations vkms_driver_fops = {
> @@ -59,25 +52,24 @@ static struct drm_driver vkms_driver = {
>   .minor  = DRIVER_MINOR,
>  };
>  
> -static const u32 vkms_formats[] = {
> - DRM_FORMAT_XRGB,
> +static const struct drm_mode_config_funcs vkms_mode_funcs = {
> + .atomic_check = drm_atomic_helper_check,
> + .atomic_commit = drm_atomic_helper_commit,
>  };
>  
> -static void vkms_connector_destroy(struct drm_connector *connector)
> +static int vkms_modeset_init(struct vkms_device *vkmsdev)
>  {
> - drm_connector_unregister(connector);
> - drm_connector_cleanup(connector);
> -}
> + struct drm_device *dev = >drm;
>  
> -static const struct drm_connector_funcs vkms_connector_funcs = {
> - .fill_modes = drm_helper_probe_single_connector_modes,
> - .destroy = vkms_connector_destroy,
> -};
> + drm_mode_config_init(dev);
> + dev->mode_config.funcs = _mode_funcs;
> + dev->mode_config.min_width = XRES_MIN;
> + dev->mode_config.min_height = YRES_MIN;
> + dev->mode_config.max_width = XRES_MAX;
> + dev->mode_config.max_height = YRES_MAX;
>  
> -static const struct drm_mode_config_funcs vkms_mode_funcs = {
> - .atomic_check = drm_atomic_helper_check,
> -

Re: [PATCH v2 2/3] drm/vkms: Add basic CRTC initialization

2018-05-21 Thread Haneen Mohammed
On Sun, May 20, 2018 at 11:28:37AM -0300, Rodrigo Siqueira wrote:
> Hi Haneen,
> 
> Thanks for the feedback :)
> 
> On 05/20, Haneen Mohammed wrote:
> > On Wed, May 16, 2018 at 08:56:21PM -0300, Rodrigo Siqueira wrote:
> > > This commit adds the essential infrastructure for around CRTCs which
> > > is composed of: a new data struct for output data information, a
> > > function for creating planes, and a simple encoder attached to the
> > > connector. Finally, due to the introduction of a new initialization
> > > function, connectors were moved from vkms_drv.c to vkms_display.c.
> > > 
> > > Signed-off-by: Rodrigo Siqueira <rodrigosiqueiram...@gmail.com>
> > > ---
> > >  drivers/gpu/drm/vkms/Makefile  |  2 +-
> > >  drivers/gpu/drm/vkms/vkms_crtc.c   | 35 
> > >  drivers/gpu/drm/vkms/vkms_drv.c| 60 ++--
> > >  drivers/gpu/drm/vkms/vkms_drv.h| 24 +++-
> > >  drivers/gpu/drm/vkms/vkms_output.c | 91 ++
> > >  drivers/gpu/drm/vkms/vkms_plane.c  | 46 +++
> > >  6 files changed, 211 insertions(+), 47 deletions(-)
> > >  create mode 100644 drivers/gpu/drm/vkms/vkms_crtc.c
> > >  create mode 100644 drivers/gpu/drm/vkms/vkms_output.c
> > >  create mode 100644 drivers/gpu/drm/vkms/vkms_plane.c
> > > 
> > > diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
> > > index 2aef948d3a34..3f774a6a9c58 100644
> > > --- a/drivers/gpu/drm/vkms/Makefile
> > > +++ b/drivers/gpu/drm/vkms/Makefile
> > > @@ -1,3 +1,3 @@
> > > -vkms-y := vkms_drv.o
> > > +vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o
> > >  
> > >  obj-$(CONFIG_DRM_VKMS) += vkms.o
> > > diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c 
> > > b/drivers/gpu/drm/vkms/vkms_crtc.c
> > > new file mode 100644
> > > index ..bf76cd39ece7
> > > --- /dev/null
> > > +++ b/drivers/gpu/drm/vkms/vkms_crtc.c
> > > @@ -0,0 +1,35 @@
> > > +// SPDX-License-Identifier: GPL-2.0
> > > +/*
> > > + * This program is free software; you can redistribute it and/or modify
> > > + * it under the terms of the GNU General Public License as published by
> > > + * the Free Software Foundation; either version 2 of the License, or
> > > + * (at your option) any later version.
> > > + */
> > > +
> > > +#include "vkms_drv.h"
> > > +#include 
> > > +#include 
> > > +
> > > +static const struct drm_crtc_funcs vkms_crtc_funcs = {
> > > + .set_config = drm_atomic_helper_set_config,
> > > + .destroy= drm_crtc_cleanup,
> > > + .page_flip  = drm_atomic_helper_page_flip,
> > > + .reset  = drm_atomic_helper_crtc_reset,
> > > + .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
> > > + .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
> > > +};
> > > +
> > > +int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
> > > +struct drm_plane *primary, struct drm_plane *cursor)
> > > +{
> > > + int ret;
> > > +
> > 
> > Just as a follow up, I have noticed that vkms breaks when inspecting
> > its state in the debugfs, also when running igt tests with kms and core
> > filters, and adding the following fixed that issue:
> 
> Could you explain me how you tested the state with debugfs?
> 
> I will add the fixes suggested in your comments.
> 
> Thanks
>  

I just tried to read this file: /sys/kernel/debug/dri/0/state, which
then caused a null pointer dereference error.

> > 1) a drm_crtc_helper_funcs with dummy atomic_check.
> > 
> > > + ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
> > > + _crtc_funcs, NULL);
> > > + if (ret) {
> > > + DRM_ERROR("Failed to init CRTC\n");
> > > + return ret;
> > > + }
> > > +
> > > + return ret;
> > > +}
> > > diff --git a/drivers/gpu/drm/vkms/vkms_drv.c 
> > > b/drivers/gpu/drm/vkms/vkms_drv.c
> > > index aec3f180f96d..070613e32934 100644
> > > --- a/drivers/gpu/drm/vkms/vkms_drv.c
> > > +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> > > @@ -6,7 +6,6 @@
> > >   */
> > >  
> > >  #include 
> > > -#include 
> > >  #include 
> > >  #include 
> > >  #include 
> >

Re: [PATCH v2 2/3] drm/vkms: Add basic CRTC initialization

2018-05-21 Thread Haneen Mohammed
On Wed, May 16, 2018 at 08:56:21PM -0300, Rodrigo Siqueira wrote:
> This commit adds the essential infrastructure for around CRTCs which
> is composed of: a new data struct for output data information, a
> function for creating planes, and a simple encoder attached to the
> connector. Finally, due to the introduction of a new initialization
> function, connectors were moved from vkms_drv.c to vkms_display.c.
> 
> Signed-off-by: Rodrigo Siqueira 
> ---
>  drivers/gpu/drm/vkms/Makefile  |  2 +-
>  drivers/gpu/drm/vkms/vkms_crtc.c   | 35 
>  drivers/gpu/drm/vkms/vkms_drv.c| 60 ++--
>  drivers/gpu/drm/vkms/vkms_drv.h| 24 +++-
>  drivers/gpu/drm/vkms/vkms_output.c | 91 ++
>  drivers/gpu/drm/vkms/vkms_plane.c  | 46 +++
>  6 files changed, 211 insertions(+), 47 deletions(-)
>  create mode 100644 drivers/gpu/drm/vkms/vkms_crtc.c
>  create mode 100644 drivers/gpu/drm/vkms/vkms_output.c
>  create mode 100644 drivers/gpu/drm/vkms/vkms_plane.c
> 
> diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
> index 2aef948d3a34..3f774a6a9c58 100644
> --- a/drivers/gpu/drm/vkms/Makefile
> +++ b/drivers/gpu/drm/vkms/Makefile
> @@ -1,3 +1,3 @@
> -vkms-y := vkms_drv.o
> +vkms-y := vkms_drv.o vkms_plane.o vkms_output.o vkms_crtc.o
>  
>  obj-$(CONFIG_DRM_VKMS) += vkms.o
> diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c 
> b/drivers/gpu/drm/vkms/vkms_crtc.c
> new file mode 100644
> index ..bf76cd39ece7
> --- /dev/null
> +++ b/drivers/gpu/drm/vkms/vkms_crtc.c
> @@ -0,0 +1,35 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +
> +#include "vkms_drv.h"
> +#include 
> +#include 
> +
> +static const struct drm_crtc_funcs vkms_crtc_funcs = {
> + .set_config = drm_atomic_helper_set_config,
> + .destroy= drm_crtc_cleanup,
> + .page_flip  = drm_atomic_helper_page_flip,
> + .reset  = drm_atomic_helper_crtc_reset,
> + .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
> + .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
> +};
> +
> +int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
> +struct drm_plane *primary, struct drm_plane *cursor)
> +{
> + int ret;
> +

Just as a follow up, I have noticed that vkms breaks when inspecting
its state in the debugfs, also when running igt tests with kms and core
filters, and adding the following fixed that issue:

1) a drm_crtc_helper_funcs with dummy atomic_check.

> + ret = drm_crtc_init_with_planes(dev, crtc, primary, cursor,
> + _crtc_funcs, NULL);
> + if (ret) {
> + DRM_ERROR("Failed to init CRTC\n");
> + return ret;
> + }
> +
> + return ret;
> +}
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> index aec3f180f96d..070613e32934 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.c
> +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> @@ -6,7 +6,6 @@
>   */
>  
>  #include 
> -#include 
>  #include 
>  #include 
>  #include 
> @@ -59,25 +58,24 @@ static struct drm_driver vkms_driver = {
>   .minor  = DRIVER_MINOR,
>  };
>  
> -static const u32 vkms_formats[] = {
> - DRM_FORMAT_XRGB,
> +static const struct drm_mode_config_funcs vkms_mode_funcs = {
> + .atomic_check = drm_atomic_helper_check,
> + .atomic_commit = drm_atomic_helper_commit,
>  };
>  
> -static void vkms_connector_destroy(struct drm_connector *connector)
> +static int vkms_modeset_init(struct vkms_device *vkmsdev)
>  {
> - drm_connector_unregister(connector);
> - drm_connector_cleanup(connector);
> -}
> + struct drm_device *dev = >drm;
>  
> -static const struct drm_connector_funcs vkms_connector_funcs = {
> - .fill_modes = drm_helper_probe_single_connector_modes,
> - .destroy = vkms_connector_destroy,
> -};
> + drm_mode_config_init(dev);
> + dev->mode_config.funcs = _mode_funcs;
> + dev->mode_config.min_width = XRES_MIN;
> + dev->mode_config.min_height = YRES_MIN;
> + dev->mode_config.max_width = XRES_MAX;
> + dev->mode_config.max_height = YRES_MAX;
>  
> -static const struct drm_mode_config_funcs vkms_mode_funcs = {
> - .atomic_check = drm_atomic_helper_check,
> - .atomic_commit = drm_atomic_helper_commit,
> -};
> + return vkms_output_init(vkmsdev);
> +}
>  
>  static int __init vkms_init(void)
>  {
> @@ -98,48 +96,24 @@ static int __init vkms_init(void)
>   goto out_fini;
>   }
>  
> - drm_mode_config_init(_device->drm);
> - vkms_device->drm.mode_config.funcs = _mode_funcs;
> -

Re: [PATCH v2 0/3] Expanding the basic vkms features

2018-05-18 Thread Haneen Mohammed
On Wed, May 16, 2018 at 08:55:06PM -0300, Rodrigo Siqueira wrote:
> This series of patches add a centralized initialization mechanism, a
> single CRTC with a plane, an encoder, and extra module information. 
> 
> Changes in v2:
>  - Remove unused definitions
>  - Improve file names
>  - Improve code separation
>  - Remove unnecessary formats
> 
> Rodrigo Siqueira (3):
>   drm/vkms: Add mode_config initialization
>   drm/vkms: Add basic CRTC initialization
>   drm/vkms: Add extra information about vkms
> 
>  drivers/gpu/drm/Kconfig|  8 ++-
>  drivers/gpu/drm/vkms/Makefile  |  2 +-
>  drivers/gpu/drm/vkms/vkms_crtc.c   | 35 
>  drivers/gpu/drm/vkms/vkms_drv.c| 61 +---
>  drivers/gpu/drm/vkms/vkms_drv.h| 24 +++-
>  drivers/gpu/drm/vkms/vkms_output.c | 91 ++
>  drivers/gpu/drm/vkms/vkms_plane.c  | 46 +++
>  7 files changed, 227 insertions(+), 40 deletions(-)
>  create mode 100644 drivers/gpu/drm/vkms/vkms_crtc.c
>  create mode 100644 drivers/gpu/drm/vkms/vkms_output.c
>  create mode 100644 drivers/gpu/drm/vkms/vkms_plane.c
> 
> -- 
> 2.17.0

with my limited knowledge on DRM, these looks good to me.

Reviewed-by: Haneen Mohammed <hamohammed.sa@gmail>
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [RFC PATCH] drm/vkms: vkms_driver can be static

2018-05-16 Thread Haneen Mohammed
On Tue, May 15, 2018 at 07:30:52PM +0800, kbuild test robot wrote:
> 
> Fixes: 58d8108f080c ("drm/vkms: Introduce basic VKMS driver")
> Signed-off-by: Fengguang Wu 
> ---
>  vkms_drv.c |2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> index b1df08e..35517b09 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.c
> +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> @@ -40,7 +40,7 @@ static void vkms_release(struct drm_device *dev)
>   drm_dev_fini(>drm);
>  }
>  
> -struct drm_driver vkms_driver = {
> +static struct drm_driver vkms_driver = {
>   .driver_features= DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_GEM,
>   .release= vkms_release,
>   .fops   = _driver_fops,

Looks good to me.

- Haneen
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH] drm/vkms: Introduce basic VKMS driver

2018-05-15 Thread Haneen Mohammed
This patch introduces Virtual Kernel Mode-Setting (VKMS) driver. It
creates a very basic kms driver with 1 crtc/encoder/connector/plane.

VKMS driver would be useful for testing, or for running X (or similar)
on headless machines and be able to still use the GPU. Thus it enables
a virtual display without the need for hardware display capability.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 drivers/gpu/drm/Kconfig |   6 ++
 drivers/gpu/drm/Makefile|   1 +
 drivers/gpu/drm/vkms/Makefile   |   3 +
 drivers/gpu/drm/vkms/vkms_drv.c | 146 
 drivers/gpu/drm/vkms/vkms_drv.h |  13 +++
 5 files changed, 169 insertions(+)
 create mode 100644 drivers/gpu/drm/vkms/Makefile
 create mode 100644 drivers/gpu/drm/vkms/vkms_drv.c
 create mode 100644 drivers/gpu/drm/vkms/vkms_drv.h

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 2a72d2feb76d..7db3d82cbb27 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -213,6 +213,12 @@ config DRM_VGEM
  as used by Mesa's software renderer for enhanced performance.
  If M is selected the module will be called vgem.
 
+config DRM_VKMS
+   tristate "Virtual KMS"
+   depends on DRM
+   help
+ Choose this option to get a virtual kernal mode-setting driver.
+ If M is selected the module will be called vkms.
 
 source "drivers/gpu/drm/exynos/Kconfig"
 
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index ef9f3dab287f..8873d4769116 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -69,6 +69,7 @@ obj-$(CONFIG_DRM_SAVAGE)+= savage/
 obj-$(CONFIG_DRM_VMWGFX)+= vmwgfx/
 obj-$(CONFIG_DRM_VIA)  +=via/
 obj-$(CONFIG_DRM_VGEM) += vgem/
+obj-$(CONFIG_DRM_VKMS) += vkms/
 obj-$(CONFIG_DRM_NOUVEAU) +=nouveau/
 obj-$(CONFIG_DRM_EXYNOS) +=exynos/
 obj-$(CONFIG_DRM_ROCKCHIP) +=rockchip/
diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile
new file mode 100644
index ..2aef948d3a34
--- /dev/null
+++ b/drivers/gpu/drm/vkms/Makefile
@@ -0,0 +1,3 @@
+vkms-y := vkms_drv.o
+
+obj-$(CONFIG_DRM_VKMS) += vkms.o
diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
new file mode 100644
index ..b1df08ed23a0
--- /dev/null
+++ b/drivers/gpu/drm/vkms/vkms_drv.c
@@ -0,0 +1,146 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include "vkms_drv.h"
+
+#define DRIVER_NAME"vkms"
+#define DRIVER_DESC"Virtual Kernel Mode Setting"
+#define DRIVER_DATE"20180514"
+#define DRIVER_MAJOR   1
+#define DRIVER_MINOR   0
+
+static struct vkms_device *vkms_device;
+
+static const struct file_operations vkms_driver_fops = {
+   .owner  = THIS_MODULE,
+   .open   = drm_open,
+   .mmap   = drm_gem_mmap,
+   .unlocked_ioctl = drm_ioctl,
+   .compat_ioctl   = drm_compat_ioctl,
+   .poll   = drm_poll,
+   .read   = drm_read,
+   .llseek = no_llseek,
+   .release= drm_release,
+};
+
+static void vkms_release(struct drm_device *dev)
+{
+   struct vkms_device *vkms = container_of(dev, struct vkms_device, drm);
+
+   platform_device_unregister(vkms->platform);
+   drm_mode_config_cleanup(>drm);
+   drm_dev_fini(>drm);
+}
+
+struct drm_driver vkms_driver = {
+   .driver_features= DRIVER_MODESET | DRIVER_ATOMIC | DRIVER_GEM,
+   .release= vkms_release,
+   .fops   = _driver_fops,
+
+   .name   = DRIVER_NAME,
+   .desc   = DRIVER_DESC,
+   .date   = DRIVER_DATE,
+   .major  = DRIVER_MAJOR,
+   .minor  = DRIVER_MINOR,
+};
+
+static const u32 vkms_formats[] = {
+   DRM_FORMAT_XRGB,
+};
+
+static void vkms_connector_destroy(struct drm_connector *connector)
+{
+   drm_connector_unregister(connector);
+   drm_connector_cleanup(connector);
+}
+
+static const struct drm_connector_funcs vkms_connector_funcs = {
+   .fill_modes = drm_helper_probe_single_connector_modes,
+   .destroy = vkms_connector_destroy,
+};
+
+static int __init vkms_init(void)
+{
+   int ret;
+
+   vkms_device = kzalloc(sizeof(*vkms_device), GFP_KERNEL);
+   if (!vkms_device)
+   return -ENOMEM;
+
+   ret = drm_dev_init(_device->drm, _driver, NULL);
+   if (ret)
+   goto out_free;
+
+   vkms_device->platform =
+   platform_device_register_simple(DRIVER_NAME, -1, NULL, 0);
+   if (IS_ERR(vkms_device->platform)) {

[PATCH] drm: Match sysfs name in link removal to link creation

2018-05-11 Thread Haneen Mohammed
This patch matches the sysfs name used in the unlinking with the
linking function. Otherwise, remove_compat_control_link() fails to remove
sysfs created by create_compat_control_link() in drm_dev_register().

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 drivers/gpu/drm/drm_drv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index a1b9338736e3..c2c21d839727 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -716,7 +716,7 @@ static void remove_compat_control_link(struct drm_device 
*dev)
if (!minor)
return;
 
-   name = kasprintf(GFP_KERNEL, "controlD%d", minor->index);
+   name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64);
if (!name)
return;
 
-- 
2.17.0

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH DRM] drm/zte: Replace include drmP.h with drm_print.h

2018-03-22 Thread Haneen Mohammed
Remove drmP.h as it is not needed anymore since nothing it defines is
used in these files and use drm_print.h instead as these files are using
the debug macros defined there.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 drivers/gpu/drm/zte/zx_drm_drv.c | 2 +-
 drivers/gpu/drm/zte/zx_hdmi.c| 2 +-
 drivers/gpu/drm/zte/zx_plane.c   | 2 +-
 drivers/gpu/drm/zte/zx_tvenc.c   | 2 +-
 drivers/gpu/drm/zte/zx_vga.c | 2 +-
 drivers/gpu/drm/zte/zx_vou.c | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/zte/zx_drm_drv.c b/drivers/gpu/drm/zte/zx_drm_drv.c
index 6f4205e8..f375cb0 100644
--- a/drivers/gpu/drm/zte/zx_drm_drv.c
+++ b/drivers/gpu/drm/zte/zx_drm_drv.c
@@ -24,7 +24,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 
 #include "zx_drm_drv.h"
 #include "zx_vou.h"
diff --git a/drivers/gpu/drm/zte/zx_hdmi.c b/drivers/gpu/drm/zte/zx_hdmi.c
index 13ea90f..4cc9ebd 100644
--- a/drivers/gpu/drm/zte/zx_hdmi.c
+++ b/drivers/gpu/drm/zte/zx_hdmi.c
@@ -23,7 +23,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 
 #include 
 
diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c
index 68fd2e2..a99 100644
--- a/drivers/gpu/drm/zte/zx_plane.c
+++ b/drivers/gpu/drm/zte/zx_plane.c
@@ -14,7 +14,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 
 #include "zx_common_regs.h"
 #include "zx_drm_drv.h"
diff --git a/drivers/gpu/drm/zte/zx_tvenc.c b/drivers/gpu/drm/zte/zx_tvenc.c
index 0de1a71..355b7fb 100644
--- a/drivers/gpu/drm/zte/zx_tvenc.c
+++ b/drivers/gpu/drm/zte/zx_tvenc.c
@@ -15,7 +15,7 @@
 
 #include 
 #include 
-#include 
+#include 
 
 #include "zx_drm_drv.h"
 #include "zx_tvenc_regs.h"
diff --git a/drivers/gpu/drm/zte/zx_vga.c b/drivers/gpu/drm/zte/zx_vga.c
index 3e7e33c..9d18e8a 100644
--- a/drivers/gpu/drm/zte/zx_vga.c
+++ b/drivers/gpu/drm/zte/zx_vga.c
@@ -14,7 +14,7 @@
 
 #include 
 #include 
-#include 
+#include 
 
 #include "zx_drm_drv.h"
 #include "zx_vga_regs.h"
diff --git a/drivers/gpu/drm/zte/zx_vou.c b/drivers/gpu/drm/zte/zx_vou.c
index 7491813..7f49c1f 100644
--- a/drivers/gpu/drm/zte/zx_vou.c
+++ b/drivers/gpu/drm/zte/zx_vou.c
@@ -21,7 +21,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 
 #include "zx_common_regs.h"
 #include "zx_drm_drv.h"
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH DRM] drm: Remove drm_property_{un/reference}_blob aliases

2018-03-22 Thread Haneen Mohammed
This patch remove the compatibility aliases
drm_property_{reference/unreference}_blob of
drm_property_blob_{get/put} since all callers have been converted to the
prefered _{get/put}.

Remove the helpers from the semantic patch drm-get-put-cocci.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 include/drm/drm_property.h   | 26 --
 scripts/coccinelle/api/drm-get-put.cocci | 10 --
 2 files changed, 36 deletions(-)

diff --git a/include/drm/drm_property.h b/include/drm/drm_property.h
index 8a522b4..08d5dbb 100644
--- a/include/drm/drm_property.h
+++ b/include/drm/drm_property.h
@@ -279,32 +279,6 @@ struct drm_property_blob *drm_property_blob_get(struct 
drm_property_blob *blob);
 void drm_property_blob_put(struct drm_property_blob *blob);
 
 /**
- * drm_property_reference_blob - acquire a blob property reference
- * @blob: DRM blob property
- *
- * This is a compatibility alias for drm_property_blob_get() and should not be
- * used by new code.
- */
-static inline struct drm_property_blob *
-drm_property_reference_blob(struct drm_property_blob *blob)
-{
-   return drm_property_blob_get(blob);
-}
-
-/**
- * drm_property_unreference_blob - release a blob property reference
- * @blob: DRM blob property
- *
- * This is a compatibility alias for drm_property_blob_put() and should not be
- * used by new code.
- */
-static inline void
-drm_property_unreference_blob(struct drm_property_blob *blob)
-{
-   drm_property_blob_put(blob);
-}
-
-/**
  * drm_property_find - find property object
  * @dev: DRM device
  * @file_priv: drm file to check for lease against.
diff --git a/scripts/coccinelle/api/drm-get-put.cocci 
b/scripts/coccinelle/api/drm-get-put.cocci
index ceb71ea..3a09c97 100644
--- a/scripts/coccinelle/api/drm-get-put.cocci
+++ b/scripts/coccinelle/api/drm-get-put.cocci
@@ -40,12 +40,6 @@ expression object;
 - drm_gem_object_unreference_unlocked(object)
 + drm_gem_object_put_unlocked(object)
 |
-- drm_property_reference_blob(object)
-+ drm_property_blob_get(object)
-|
-- drm_property_unreference_blob(object)
-+ drm_property_blob_put(object)
-|
 - drm_dev_unref(object)
 + drm_dev_put(object)
 )
@@ -72,10 +66,6 @@ __drm_gem_object_unreference(object)
 |
 drm_gem_object_unreference_unlocked(object)
 |
-drm_property_unreference_blob@p(object)
-|
-drm_property_reference_blob@p(object)
-|
 drm_dev_unref@p(object)
 )
 
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH DRM] drm: remove drm_mode_object_{un/reference} aliases

2018-03-22 Thread Haneen Mohammed
This patch remove the compatibility aliases
drm_mode_object_{reference/unreference} of drm_mode_object_{get/put}
since all callers have been converted to the prefered _{get/put}.

Remove the helpers from the semantic patch drm-get-put-cocci.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 include/drm/drm_mode_object.h| 24 
 scripts/coccinelle/api/drm-get-put.cocci | 10 --
 2 files changed, 34 deletions(-)

diff --git a/include/drm/drm_mode_object.h b/include/drm/drm_mode_object.h
index 7ba3913..c34a3e8 100644
--- a/include/drm/drm_mode_object.h
+++ b/include/drm/drm_mode_object.h
@@ -120,30 +120,6 @@ struct drm_mode_object *drm_mode_object_find(struct 
drm_device *dev,
 void drm_mode_object_get(struct drm_mode_object *obj);
 void drm_mode_object_put(struct drm_mode_object *obj);
 
-/**
- * drm_mode_object_reference - acquire a mode object reference
- * @obj: DRM mode object
- *
- * This is a compatibility alias for drm_mode_object_get() and should not be
- * used by new code.
- */
-static inline void drm_mode_object_reference(struct drm_mode_object *obj)
-{
-   drm_mode_object_get(obj);
-}
-
-/**
- * drm_mode_object_unreference - release a mode object reference
- * @obj: DRM mode object
- *
- * This is a compatibility alias for drm_mode_object_put() and should not be
- * used by new code.
- */
-static inline void drm_mode_object_unreference(struct drm_mode_object *obj)
-{
-   drm_mode_object_put(obj);
-}
-
 int drm_object_property_set_value(struct drm_mode_object *obj,
  struct drm_property *property,
  uint64_t val);
diff --git a/scripts/coccinelle/api/drm-get-put.cocci 
b/scripts/coccinelle/api/drm-get-put.cocci
index 91fceb8..ceb71ea 100644
--- a/scripts/coccinelle/api/drm-get-put.cocci
+++ b/scripts/coccinelle/api/drm-get-put.cocci
@@ -16,12 +16,6 @@ expression object;
 @@
 
 (
-- drm_mode_object_reference(object)
-+ drm_mode_object_get(object)
-|
-- drm_mode_object_unreference(object)
-+ drm_mode_object_put(object)
-|
 - drm_connector_reference(object)
 + drm_connector_get(object)
 |
@@ -62,10 +56,6 @@ position p;
 @@
 
 (
-drm_mode_object_unreference@p(object)
-|
-drm_mode_object_reference@p(object)
-|
 drm_connector_unreference@p(object)
 |
 drm_connector_reference@p(object)
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH DRM] drm: Introduce drm_global_item_{get/put}()

2018-03-14 Thread Haneen Mohammed
For consistency with other reference counting APIs in the kernel,
introduce drm_global_item_{get/put} functions instead of
drm_global_item_{ref/unref}.

Compatibility aliases are added to keep existing code working.

The semantic patch scripts/coccinelle/api/drm-get-put.cocci has been
extended to account for the new helpers.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 drivers/gpu/drm/drm_global.c | 43 +++-
 include/drm/drm_global.h |  2 ++
 scripts/coccinelle/api/drm-get-put.cocci | 10 
 3 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_global.c b/drivers/gpu/drm/drm_global.c
index b2dc21e..76cf948 100644
--- a/drivers/gpu/drm/drm_global.c
+++ b/drivers/gpu/drm/drm_global.c
@@ -64,7 +64,7 @@ void drm_global_release(void)
 }
 
 /**
- * drm_global_item_ref - Initialize and acquire reference to memory
+ * drm_global_item_get - Initialize and acquire reference to memory
  * object
  * @ref: Object for initialization
  *
@@ -75,7 +75,7 @@ void drm_global_release(void)
  * Returns:
  * Zero on success, non-zero otherwise.
  */
-int drm_global_item_ref(struct drm_global_reference *ref)
+int drm_global_item_get(struct drm_global_reference *ref)
 {
int ret = 0;
struct drm_global_item *item = [ref->global_type];
@@ -107,10 +107,10 @@ int drm_global_item_ref(struct drm_global_reference *ref)
mutex_unlock(>mutex);
return ret;
 }
-EXPORT_SYMBOL(drm_global_item_ref);
+EXPORT_SYMBOL(drm_global_item_get);
 
 /**
- * drm_global_item_unref - Drop reference to memory
+ * drm_global_item_put - Drop reference to memory
  * object
  * @ref: Object being removed
  *
@@ -120,7 +120,7 @@ EXPORT_SYMBOL(drm_global_item_ref);
  *
  */
 
-void drm_global_item_unref(struct drm_global_reference *ref)
+void drm_global_item_put(struct drm_global_reference *ref)
 {
struct drm_global_item *item = [ref->global_type];
 
@@ -133,5 +133,36 @@ void drm_global_item_unref(struct drm_global_reference 
*ref)
}
mutex_unlock(>mutex);
 }
-EXPORT_SYMBOL(drm_global_item_unref);
+EXPORT_SYMBOL(drm_global_item_put);
 
+/**
+ * drm_global_item_ref - Initialize and acquire reference to memory
+ * object
+ * @ref: Object for initialization
+ *
+ * This is a compatibility alias for drm_global_item_get() and should
+ * not be used by new code.
+ *
+ * Returns:
+ * Zero on success, non-zero otherwise.
+ */
+int drm_global_item_ref(struct drm_global_reference *ref)
+{
+   return drm_global_item_get(ref);
+}
+EXPORT_SYMBOL(drm_global_item_ref);
+
+/**
+ * drm_global_item_unref - Drop reference to memory
+ * object
+ * @ref: Object being removed
+ *
+ * This is a compatibility alias for drm_global_item_get() and should not
+ * be used by new code.
+ */
+
+void drm_global_item_unref(struct drm_global_reference *ref)
+{
+   drm_global_item_put(ref);
+}
+EXPORT_SYMBOL(drm_global_item_unref);
diff --git a/include/drm/drm_global.h b/include/drm/drm_global.h
index 3a83060..5eb6f0c 100644
--- a/include/drm/drm_global.h
+++ b/include/drm/drm_global.h
@@ -47,6 +47,8 @@ struct drm_global_reference {
 
 void drm_global_init(void);
 void drm_global_release(void);
+int drm_global_item_get(struct drm_global_reference *ref);
+void drm_global_item_put(struct drm_global_reference *ref);
 int drm_global_item_ref(struct drm_global_reference *ref);
 void drm_global_item_unref(struct drm_global_reference *ref);
 
diff --git a/scripts/coccinelle/api/drm-get-put.cocci 
b/scripts/coccinelle/api/drm-get-put.cocci
index 91fceb8..db1c465 100644
--- a/scripts/coccinelle/api/drm-get-put.cocci
+++ b/scripts/coccinelle/api/drm-get-put.cocci
@@ -54,6 +54,12 @@ expression object;
 |
 - drm_dev_unref(object)
 + drm_dev_put(object)
+|
+- drm_global_item_ref(object)
++ drm_global_item_get(object)
+|
+- drm_global_item_unref(object)
++ drm_global_item_put(object)
 )
 
 @r depends on report@
@@ -87,6 +93,10 @@ drm_property_unreference_blob@p(object)
 drm_property_reference_blob@p(object)
 |
 drm_dev_unref@p(object)
+|
+drm_global_item_ref@p(object)
+|
+drm_global_item_unref@p(object)
 )
 
 @script:python depends on report@
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH DRM] drm/vmwgfx: replace drm_*_unreference with drm_*_put

2018-03-13 Thread Haneen Mohammed
This patch replace instances of drm_framebuffer_unreference with _put()
suffix, because it is shorter and consistent with the kernel use of
*_get/put() suffixes.
This was done with the following Coccinelle script:

@r@
expression e;
@@

(
-drm_framebuffer_reference(e);
+drm_framebuffer_get(e);
|
-drm_framebuffer_unreference(e);
+drm_framebuffer_put(e);
)

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_fb.c| 2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
index d23a18a..be7d7fb 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
@@ -500,7 +500,7 @@ static int vmw_fb_kms_detach(struct vmw_fb_par *par,
}
 
if (cur_fb) {
-   drm_framebuffer_unreference(cur_fb);
+   drm_framebuffer_put(cur_fb);
par->set_fb = NULL;
}
 
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
index 67f8446..c5e8eae 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
@@ -316,7 +316,7 @@ int vmw_present_ioctl(struct drm_device *dev, void *data,
 out_no_surface:
ttm_read_unlock(_priv->reservation_sem);
 out_no_ttm_lock:
-   drm_framebuffer_unreference(fb);
+   drm_framebuffer_put(fb);
 out_no_fb:
drm_modeset_unlock_all(dev);
 out_no_copy:
@@ -393,7 +393,7 @@ int vmw_present_readback_ioctl(struct drm_device *dev, void 
*data,
 
ttm_read_unlock(_priv->reservation_sem);
 out_no_ttm_lock:
-   drm_framebuffer_unreference(fb);
+   drm_framebuffer_put(fb);
 out_no_fb:
drm_modeset_unlock_all(dev);
 out_no_copy:
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v4 0/2] drm: Move debug macros out of drmP.h

2017-10-18 Thread Haneen Mohammed
This patchset move debug macros from drmP.h to drm_print.h and move
printing related functions used by the debug macros from drm_drv.[hc]
to drm_print.[hc].
In addition, it fixes old comment style.

Changes in v4:
- Move DRM_UT_ debug messaging macros from drmP.h to drm_print.h.

Changes in v3:
- Move debug macros and print functions into drm_print.[hc] instead of
introducing drm_debug.[hc].

Haneen Mohammed (2):
  drm: Move debug macros out of drmP.h
  drm/print: Update old comment style

 drivers/gpu/drm/drm_drv.c   |  47 ---
 drivers/gpu/drm/drm_print.c |  47 +++
 include/drm/drmP.h  | 193 +---
 include/drm/drm_drv.h   |   7 --
 include/drm/drm_print.h | 192 +++
 5 files changed, 240 insertions(+), 246 deletions(-)

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 0/2] drm: Move debug macros out of drmP.h

2017-10-18 Thread Haneen Mohammed
This patchset move debug macros from drmP.h to drm_print.h and move
printing related functions used by the debug macros from drm_drv.[hc]
to drm_print.[hc].
In addition, it fixes old comment style.

Changes in v3:
- Move debug macros and print functions into drm_print.[hc] instead of
introducing drm_debug.[hc].

Haneen Mohammed (2):
  drm: Move debug macros out of drmP.h
  drm/print: Update old comment style

 drivers/gpu/drm/drm_drv.c   |  47 --
 drivers/gpu/drm/drm_print.c |  47 ++
 include/drm/drmP.h  | 150 +---
 include/drm/drm_drv.h   |   7 ---
 include/drm/drm_print.h | 149 +++
 5 files changed, 197 insertions(+), 203 deletions(-)

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v4 1/2] drm: Move debug macros out of drmP.h

2017-10-18 Thread Haneen Mohammed
This patch extract DRM_* debug macros from drmP.h to drm_print.h and
move printing related functions used by these macros from drm_drv.[hc]
to drm_print.[hc].

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
Changes in v4: 
- Move DRM_UT_ debug messaging macros from drmP.h to drm_print.h.

 drivers/gpu/drm/drm_drv.c   |  47 ---
 drivers/gpu/drm/drm_print.c |  47 +++
 include/drm/drmP.h  | 193 +-
 include/drm/drm_drv.h   |   7 --
 include/drm/drm_print.h | 199 
 5 files changed, 247 insertions(+), 246 deletions(-)

diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index be38ac7..9710c78 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -74,53 +74,6 @@ static bool drm_core_init_complete = false;
 
 static struct dentry *drm_debugfs_root;
 
-#define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"
-
-void drm_dev_printk(const struct device *dev, const char *level,
-   unsigned int category, const char *function_name,
-   const char *prefix, const char *format, ...)
-{
-   struct va_format vaf;
-   va_list args;
-
-   if (category != DRM_UT_NONE && !(drm_debug & category))
-   return;
-
-   va_start(args, format);
-   vaf.fmt = format;
-   vaf.va = 
-
-   if (dev)
-   dev_printk(level, dev, DRM_PRINTK_FMT, function_name, prefix,
-  );
-   else
-   printk("%s" DRM_PRINTK_FMT, level, function_name, prefix, );
-
-   va_end(args);
-}
-EXPORT_SYMBOL(drm_dev_printk);
-
-void drm_printk(const char *level, unsigned int category,
-   const char *format, ...)
-{
-   struct va_format vaf;
-   va_list args;
-
-   if (category != DRM_UT_NONE && !(drm_debug & category))
-   return;
-
-   va_start(args, format);
-   vaf.fmt = format;
-   vaf.va = 
-
-   printk("%s" "[" DRM_NAME ":%ps]%s %pV",
-  level, __builtin_return_address(0),
-  strcmp(level, KERN_ERR) == 0 ? " *ERROR*" : "", );
-
-   va_end(args);
-}
-EXPORT_SYMBOL(drm_printk);
-
 /*
  * DRM Minors
  * A DRM device can provide several char-dev interfaces on the DRM-Major. Each
diff --git a/drivers/gpu/drm/drm_print.c b/drivers/gpu/drm/drm_print.c
index 74c466a..0b3bf47 100644
--- a/drivers/gpu/drm/drm_print.c
+++ b/drivers/gpu/drm/drm_print.c
@@ -63,3 +63,50 @@ void drm_printf(struct drm_printer *p, const char *f, ...)
va_end(args);
 }
 EXPORT_SYMBOL(drm_printf);
+
+#define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"
+
+void drm_dev_printk(const struct device *dev, const char *level,
+   unsigned int category, const char *function_name,
+   const char *prefix, const char *format, ...)
+{
+   struct va_format vaf;
+   va_list args;
+
+   if (category != DRM_UT_NONE && !(drm_debug & category))
+   return;
+
+   va_start(args, format);
+   vaf.fmt = format;
+   vaf.va = 
+
+   if (dev)
+   dev_printk(level, dev, DRM_PRINTK_FMT, function_name, prefix,
+  );
+   else
+   printk("%s" DRM_PRINTK_FMT, level, function_name, prefix, );
+
+   va_end(args);
+}
+EXPORT_SYMBOL(drm_dev_printk);
+
+void drm_printk(const char *level, unsigned int category,
+   const char *format, ...)
+{
+   struct va_format vaf;
+   va_list args;
+
+   if (category != DRM_UT_NONE && !(drm_debug & category))
+   return;
+
+   va_start(args, format);
+   vaf.fmt = format;
+   vaf.va = 
+
+   printk("%s" "[" DRM_NAME ":%ps]%s %pV",
+  level, __builtin_return_address(0),
+  strcmp(level, KERN_ERR) == 0 ? " *ERROR*" : "", );
+
+   va_end(args);
+}
+EXPORT_SYMBOL(drm_printk);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 7277783a..ccd 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -75,6 +75,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -94,208 +95,16 @@ struct dma_buf_attachment;
 struct pci_dev;
 struct pci_controller;
 
-/*
- * The following categories are defined:
- *
- * CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ...
- *  This is the category used by the DRM_DEBUG() macro.
- *
- * DRIVER: Used in the vendor specific part of the driver: i915, radeon, ...
- *This is the category used by the DRM_DEBUG_DRIVER() macro.
- *
- * KMS: used in the modesetting code.
- * This is the category used by the DRM_DEBUG_KMS() macro.
- *
- * PRIME: used in the prime code.
- *   This is the cate

[PATCH v3 2/2] drm/print: Update old comment style

2017-10-18 Thread Haneen Mohammed
Remove old comment style used by doxygen.
And remove comment left from commit 99cdb35e787b ("drm/doc: move printf
helpers out of drmP.h") after refactoring drmP.h.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
Changes in v3:
- nothing

 include/drm/drm_print.h | 27 ++-
 1 file changed, 10 insertions(+), 17 deletions(-)

diff --git a/include/drm/drm_print.h b/include/drm/drm_print.h
index 9dacc5e..d208a85 100644
--- a/include/drm/drm_print.h
+++ b/include/drm/drm_print.h
@@ -136,9 +136,8 @@ void drm_dev_printk(const struct device *dev, const char 
*level,
 __printf(3, 4)
 void drm_printk(const char *level, unsigned int category,
const char *format, ...);
-/***/
-/** \name Macros to make printk easier */
-/*@{*/
+
+/* Macros to make printk easier */
 
 #define _DRM_PRINTK(once, level, fmt, ...) \
do {\
@@ -163,8 +162,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Error output.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_ERROR(dev, fmt, ...)   \
drm_dev_printk(dev, KERN_ERR, DRM_UT_NONE, __func__, " *ERROR*",\
@@ -175,8 +174,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Rate limited error output.  Like DRM_ERROR() but won't flood the log.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...)   \
 ({ \
@@ -206,8 +205,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Debug output.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_DEBUG(dev, fmt, args...)   \
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_CORE, __func__, "", fmt, \
@@ -258,8 +257,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Rate limited debug output. Like DRM_DEBUG() but won't flood the log.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, args...)   \
DEV__DRM_DEFINE_DEBUG_RATELIMITED(dev, CORE, fmt, ##args)
@@ -278,10 +277,4 @@ void drm_printk(const char *level, unsigned int category,
 #define DRM_DEBUG_PRIME_RATELIMITED(fmt, args...)  \
DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##args)
 
-/* Format strings and argument splitters to simplify printing
- * various "complex" objects
- */
-
-/*@}*/
-
 #endif /* DRM_PRINT_H_ */
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v3 1/2] drm: Move debug macros out of drmP.h

2017-10-18 Thread Haneen Mohammed
This patch extract DRM_* debug macros from drmP.h to drm_print.h and
move printing related functions used by these macros from drm_drv.[hc]
to drm_print.[hc].

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
Changes in v3:
- Move debug macros and print functions into drm_print.[hc] instead of
introducing drm_debug.[hc].

 drivers/gpu/drm/drm_drv.c   |  47 -
 drivers/gpu/drm/drm_print.c |  47 +
 include/drm/drmP.h  | 150 +-
 include/drm/drm_drv.h   |   7 --
 include/drm/drm_print.h | 156 
 5 files changed, 204 insertions(+), 203 deletions(-)

diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index be38ac7..9710c78 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -74,53 +74,6 @@ static bool drm_core_init_complete = false;
 
 static struct dentry *drm_debugfs_root;
 
-#define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"
-
-void drm_dev_printk(const struct device *dev, const char *level,
-   unsigned int category, const char *function_name,
-   const char *prefix, const char *format, ...)
-{
-   struct va_format vaf;
-   va_list args;
-
-   if (category != DRM_UT_NONE && !(drm_debug & category))
-   return;
-
-   va_start(args, format);
-   vaf.fmt = format;
-   vaf.va = 
-
-   if (dev)
-   dev_printk(level, dev, DRM_PRINTK_FMT, function_name, prefix,
-  );
-   else
-   printk("%s" DRM_PRINTK_FMT, level, function_name, prefix, );
-
-   va_end(args);
-}
-EXPORT_SYMBOL(drm_dev_printk);
-
-void drm_printk(const char *level, unsigned int category,
-   const char *format, ...)
-{
-   struct va_format vaf;
-   va_list args;
-
-   if (category != DRM_UT_NONE && !(drm_debug & category))
-   return;
-
-   va_start(args, format);
-   vaf.fmt = format;
-   vaf.va = 
-
-   printk("%s" "[" DRM_NAME ":%ps]%s %pV",
-  level, __builtin_return_address(0),
-  strcmp(level, KERN_ERR) == 0 ? " *ERROR*" : "", );
-
-   va_end(args);
-}
-EXPORT_SYMBOL(drm_printk);
-
 /*
  * DRM Minors
  * A DRM device can provide several char-dev interfaces on the DRM-Major. Each
diff --git a/drivers/gpu/drm/drm_print.c b/drivers/gpu/drm/drm_print.c
index 74c466a..0b3bf47 100644
--- a/drivers/gpu/drm/drm_print.c
+++ b/drivers/gpu/drm/drm_print.c
@@ -63,3 +63,50 @@ void drm_printf(struct drm_printer *p, const char *f, ...)
va_end(args);
 }
 EXPORT_SYMBOL(drm_printf);
+
+#define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"
+
+void drm_dev_printk(const struct device *dev, const char *level,
+   unsigned int category, const char *function_name,
+   const char *prefix, const char *format, ...)
+{
+   struct va_format vaf;
+   va_list args;
+
+   if (category != DRM_UT_NONE && !(drm_debug & category))
+   return;
+
+   va_start(args, format);
+   vaf.fmt = format;
+   vaf.va = 
+
+   if (dev)
+   dev_printk(level, dev, DRM_PRINTK_FMT, function_name, prefix,
+  );
+   else
+   printk("%s" DRM_PRINTK_FMT, level, function_name, prefix, );
+
+   va_end(args);
+}
+EXPORT_SYMBOL(drm_dev_printk);
+
+void drm_printk(const char *level, unsigned int category,
+   const char *format, ...)
+{
+   struct va_format vaf;
+   va_list args;
+
+   if (category != DRM_UT_NONE && !(drm_debug & category))
+   return;
+
+   va_start(args, format);
+   vaf.fmt = format;
+   vaf.va = 
+
+   printk("%s" "[" DRM_NAME ":%ps]%s %pV",
+  level, __builtin_return_address(0),
+  strcmp(level, KERN_ERR) == 0 ? " *ERROR*" : "", );
+
+   va_end(args);
+}
+EXPORT_SYMBOL(drm_printk);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 7277783a..2ba73ff4 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -75,6 +75,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -142,160 +143,11 @@ struct pci_controller;
 /*@{*/
 
 /***/
-/** \name Macros to make printk easier */
-/*@{*/
-
-#define _DRM_PRINTK(once, level, fmt, ...) \
-   do {\
-   printk##once(KERN_##level "[" DRM_NAME "] " fmt,\
-##__VA_ARGS__);\
-   } while (0)
-
-#define DRM_INFO(fmt, ...)  

Re: [PATCH v3 1/2] drm: Move debug macros out of drmP.h

2017-10-18 Thread Haneen Mohammed
On Tue, Oct 17, 2017 at 03:54:13PM -0400, Sean Paul wrote:
> On Tue, Oct 17, 2017 at 02:43:38AM -0600, Haneen Mohammed wrote:
> > This patch extract DRM_* debug macros from drmP.h to drm_print.h and
> > move printing related functions used by these macros from drm_drv.[hc]
> > to drm_print.[hc].
> > 
> > Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
> > ---
> > Changes in v3:
> > - Move debug macros and print functions into drm_print.[hc] instead of
> > introducing drm_debug.[hc].
> > 
> >  drivers/gpu/drm/drm_drv.c   |  47 -
> >  drivers/gpu/drm/drm_print.c |  47 +
> >  include/drm/drmP.h  | 150 
> > +-
> >  include/drm/drm_drv.h   |   7 --
> >  include/drm/drm_print.h | 156 
> > 
> >  5 files changed, 204 insertions(+), 203 deletions(-)
> > 
> 
> 
> 
> > diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> > index 7277783a..2ba73ff4 100644
> > --- a/include/drm/drmP.h
> > +++ b/include/drm/drmP.h
> > @@ -75,6 +75,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> >  #include 
> >  #include 
> > @@ -142,160 +143,11 @@ struct pci_controller;
> >  /*@{*/
> >  
> 
> Any reason why you didn't move the DRM_UT_* defines as well? They're sprinkled
> through a couple drivers, but it's all related to debug messaging.
> 
> Sean
> 

No, I didn't know they are specifically related to debug messaging.
I will include them then in a revised patch.

Thank you,
Haneen

> >  /***/
> > -/** \name Macros to make printk easier */
> > -/*@{*/
> > -
> > -#define _DRM_PRINTK(once, level, fmt, ...) \
> > -   do {\
> > -   printk##once(KERN_##level "[" DRM_NAME "] " fmt,\
> > -##__VA_ARGS__);\
> > -   } while (0)
> > -
> > -#define DRM_INFO(fmt, ...) \
> > -   _DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__)
> > -#define DRM_NOTE(fmt, ...) \
> > -   _DRM_PRINTK(, NOTICE, fmt, ##__VA_ARGS__)
> > -#define DRM_WARN(fmt, ...) \
> > -   _DRM_PRINTK(, WARNING, fmt, ##__VA_ARGS__)
> > -
> > -#define DRM_INFO_ONCE(fmt, ...)
> > \
> > -   _DRM_PRINTK(_once, INFO, fmt, ##__VA_ARGS__)
> > -#define DRM_NOTE_ONCE(fmt, ...)
> > \
> > -   _DRM_PRINTK(_once, NOTICE, fmt, ##__VA_ARGS__)
> > -#define DRM_WARN_ONCE(fmt, ...)
> > \
> > -   _DRM_PRINTK(_once, WARNING, fmt, ##__VA_ARGS__)
> > -
> > -/**
> > - * Error output.
> > - *
> > - * \param fmt printf() like format string.
> > - * \param arg arguments
> > - */
> > -#define DRM_DEV_ERROR(dev, fmt, ...)   
> > \
> > -   drm_dev_printk(dev, KERN_ERR, DRM_UT_NONE, __func__, " *ERROR*",\
> > -  fmt, ##__VA_ARGS__)
> > -#define DRM_ERROR(fmt, ...)
> > \
> > -   drm_printk(KERN_ERR, DRM_UT_NONE, fmt,  ##__VA_ARGS__)
> > -
> > -/**
> > - * Rate limited error output.  Like DRM_ERROR() but won't flood the log.
> > - *
> > - * \param fmt printf() like format string.
> > - * \param arg arguments
> > - */
> > -#define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...)   \
> > -({ \
> > -   static DEFINE_RATELIMIT_STATE(_rs,  \
> > - DEFAULT_RATELIMIT_INTERVAL,   \
> > - DEFAULT_RATELIMIT_BURST); \
> > -   \
> > -   if (__ratelimit(&_rs))  \
> > -   DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \
> > -})
> > -#define DRM_ERROR_RATELIMITED(fmt, ...)
> > \
> > -   DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__)
> > -
> > -#define DRM_DEV_INFO(dev, fmt, ...)
> > \
> > -   drm_dev_prin

[PATCH v4 2/2] drm/print: Update old comment style

2017-10-18 Thread Haneen Mohammed
Remove old comment style used by doxygen.
And remove comment left from commit 99cdb35e787b ("drm/doc: move printf
helpers out of drmP.h") after refactoring drmP.h.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
Changes in v4:
- Nothing.

 include/drm/drm_print.h | 27 ++-
 1 file changed, 10 insertions(+), 17 deletions(-)

diff --git a/include/drm/drm_print.h b/include/drm/drm_print.h
index 41dd757..7b9c86a 100644
--- a/include/drm/drm_print.h
+++ b/include/drm/drm_print.h
@@ -179,9 +179,8 @@ void drm_dev_printk(const struct device *dev, const char 
*level,
 __printf(3, 4)
 void drm_printk(const char *level, unsigned int category,
const char *format, ...);
-/***/
-/** \name Macros to make printk easier */
-/*@{*/
+
+/* Macros to make printk easier */
 
 #define _DRM_PRINTK(once, level, fmt, ...) \
do {\
@@ -206,8 +205,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Error output.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_ERROR(dev, fmt, ...)   \
drm_dev_printk(dev, KERN_ERR, DRM_UT_NONE, __func__, " *ERROR*",\
@@ -218,8 +217,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Rate limited error output.  Like DRM_ERROR() but won't flood the log.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...)   \
 ({ \
@@ -249,8 +248,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Debug output.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_DEBUG(dev, fmt, args...)   \
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_CORE, __func__, "", fmt, \
@@ -301,8 +300,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Rate limited debug output. Like DRM_DEBUG() but won't flood the log.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, args...)   \
DEV__DRM_DEFINE_DEBUG_RATELIMITED(dev, CORE, fmt, ##args)
@@ -321,10 +320,4 @@ void drm_printk(const char *level, unsigned int category,
 #define DRM_DEBUG_PRIME_RATELIMITED(fmt, args...)  \
DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##args)
 
-/* Format strings and argument splitters to simplify printing
- * various "complex" objects
- */
-
-/*@}*/
-
 #endif /* DRM_PRINT_H_ */
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH v2 1/3] drm: Extract drm_debug.[hc]

2017-10-15 Thread Haneen Mohammed
On Thu, Oct 12, 2017 at 11:35:12AM +0100, Chris Wilson wrote:
> Quoting Haneen Mohammed (2017-10-12 03:32:53)
> > diff --git a/drivers/gpu/drm/drm_debug.c b/drivers/gpu/drm/drm_debug.c
> > new file mode 100644
> > index 000..a79593f
> > --- /dev/null
> > +++ b/drivers/gpu/drm/drm_debug.c
> > @@ -0,0 +1,75 @@
> > +/*
> > + * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California.
> > + * All Rights Reserved.
> > + *
> > + * Author Rickard E. (Rik) Faith <fa...@valinux.com>
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > + * copy of this software and associated documentation files (the 
> > "Software"),
> > + * to deal in the Software without restriction, including without 
> > limitation
> > + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> > + * and/or sell copies of the Software, and to permit persons to whom the
> > + * Software is furnished to do so, subject to the following conditions:
> > + *
> > + * The above copyright notice and this permission notice (including the 
> > next
> > + * paragraph) shall be included in all copies or substantial portions of 
> > the
> > + * Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
> > OR
> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> > + * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES 
> > OR
> > + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> > + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
> > OTHER
> > + * DEALINGS IN THE SOFTWARE.
> > + */
> > +
> > +#include 
> > +#include 
> > +
> > +#define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"
> > +
> > +void drm_dev_printk(const struct device *dev, const char *level,
> > +   unsigned int category, const char *function_name,
> > +   const char *prefix, const char *format, ...)
> > +{
> > +   struct va_format vaf;
> > +   va_list args;
> > +
> > +   if (category != DRM_UT_NONE && !(drm_debug & category))
> > +   return;
> > +
> > +   va_start(args, format);
> > +   vaf.fmt = format;
> > +   vaf.va = 
> > +
> > +   if (dev)
> > +   dev_printk(level, dev, DRM_PRINTK_FMT, function_name, 
> > prefix,
> > +  );
> > +   else
> > +   printk("%s" DRM_PRINTK_FMT, level, function_name, prefix, 
> > );
> > +
> > +   va_end(args);
> > +}
> > +EXPORT_SYMBOL(drm_dev_printk);
> > +
> > +void drm_printk(const char *level, unsigned int category,
> > +   const char *format, ...)
> > +{
> > +   struct va_format vaf;
> > +   va_list args;
> > +
> > +   if (category != DRM_UT_NONE && !(drm_debug & category))
> > +   return;
> > +
> > +   va_start(args, format);
> > +   vaf.fmt = format;
> > +   vaf.va = 
> > +
> > +   printk("%s" "[" DRM_NAME ":%ps]%s %pV",
> > +  level, __builtin_return_address(0),
> > +  strcmp(level, KERN_ERR) == 0 ? " *ERROR*" : "", );
> > +
> > +   va_end(args);
> > +}
> > +EXPORT_SYMBOL(drm_printk);
> 
> We already have drm_print.c, currently used to house drm_printf and the
> drm_printer. It might be a bit confusing to have drm_printk and
> drm_printf next to each other, but less confusing that calling user
> error messages drm_debug.c.
> -Chris

I didn't notice that. 
Should I move these functions and macros to drm_print.[hc] instead then?

Haneen
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 2/3] drm: Update old comment style

2017-10-12 Thread Haneen Mohammed
Remove old comment style used by doxygen.
And remove comment left from commit 99cdb35e787b ("drm/doc: move printf
helpers out of drmP.h") after refactoring drmP.h.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
Changes in v2: 
- Fix kerneldoc comments

 include/drm/drm_debug.h | 26 +-
 1 file changed, 9 insertions(+), 17 deletions(-)

diff --git a/include/drm/drm_debug.h b/include/drm/drm_debug.h
index 24fbea4..b40b0ef 100644
--- a/include/drm/drm_debug.h
+++ b/include/drm/drm_debug.h
@@ -42,9 +42,7 @@ __printf(3, 4)
 void drm_printk(const char *level, unsigned int category,
const char *format, ...);
 
-/***/
-/** \name Macros to make printk easier */
-/*@{*/
+/** Macros to make printk easier */
 
 #define _DRM_PRINTK(once, level, fmt, ...) \
do {\
@@ -69,8 +67,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Error output.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_ERROR(dev, fmt, ...)   \
drm_dev_printk(dev, KERN_ERR, DRM_UT_NONE, __func__, " *ERROR*",\
@@ -81,8 +79,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Rate limited error output.  Like DRM_ERROR() but won't flood the log.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...)   \
 ({ \
@@ -112,8 +110,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Debug output.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_DEBUG(dev, fmt, args...)   \
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_CORE, __func__, "", fmt, \
@@ -164,8 +162,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Rate limited debug output. Like DRM_DEBUG() but won't flood the log.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @dev: device pointer
+ * @fmt: printf() like format string.
  */
 #define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, args...)   \
DEV__DRM_DEFINE_DEBUG_RATELIMITED(dev, CORE, fmt, ##args)
@@ -184,10 +182,4 @@ void drm_printk(const char *level, unsigned int category,
 #define DRM_DEBUG_PRIME_RATELIMITED(fmt, args...)  \
DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##args)
 
-/* Format strings and argument splitters to simplify printing
- * various "complex" objects
- */
-
-/*@}*/
-
 #endif /* _DRM_DEBUG_H_ */
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 3/3] drm/debug: Add missing kerneldoc comments to exported functions

2017-10-12 Thread Haneen Mohammed
Add missing documentation for exported functions to avoid kerneldoc
warning.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
Changes in v2: 
- Include this patch to avoid kerneldoc warning

 drivers/gpu/drm/drm_debug.c | 17 +
 1 file changed, 17 insertions(+)

diff --git a/drivers/gpu/drm/drm_debug.c b/drivers/gpu/drm/drm_debug.c
index a79593f..6e66b05 100644
--- a/drivers/gpu/drm/drm_debug.c
+++ b/drivers/gpu/drm/drm_debug.c
@@ -29,6 +29,16 @@
 
 #define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"
 
+/**
+ * drm_dev_printk
+ *
+ * @dev: device pointer
+ * @level: logging level
+ * @category: debug category
+ * @function_name: function name
+ * @prefix: prefix string
+ * @format: printf() like format string
+ */
 void drm_dev_printk(const struct device *dev, const char *level,
unsigned int category, const char *function_name,
const char *prefix, const char *format, ...)
@@ -53,6 +63,13 @@ void drm_dev_printk(const struct device *dev, const char 
*level,
 }
 EXPORT_SYMBOL(drm_dev_printk);
 
+/**
+ * drm_printk
+ *
+ * @level: logging level
+ * @category: debug category
+ * @format: printf() like format string
+ */
 void drm_printk(const char *level, unsigned int category,
const char *format, ...)
 {
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH v2 0/3] drm: Move debug macros out of drmP.h

2017-10-12 Thread Haneen Mohammed
This patchset move debug macros from drmP.h into debug.h and move
printting related functions from drm_drv.[hc] to drm_debug.[hc].
In addition, it fixes old comment style and add kerneldoc comments
for exported functions to avoid kerneldoc warning.

Changes in v2:
- Place kerneldoc include directives in drm-internals.rst
- Fix kerneldoc comments in drm_debug.h
- include patch 3 to add kerneldoc comments to exported functions 

Haneen Mohammed (3):
  drm: Extract drm_debug.[hc]
  drm: Update old comment style
  drm/debug: Add missing kerneldoc comments to exported functions

 Documentation/gpu/drm-internals.rst |   8 ++
 drivers/gpu/drm/Makefile|   2 +-
 drivers/gpu/drm/drm_debug.c |  92 ++
 drivers/gpu/drm/drm_drv.c   |  47 -
 include/drm/drmP.h  | 149 +
 include/drm/drm_debug.h | 185 
 include/drm/drm_drv.h   |   7 --
 7 files changed, 287 insertions(+), 203 deletions(-)
 create mode 100644 drivers/gpu/drm/drm_debug.c
 create mode 100644 include/drm/drm_debug.h

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 1/2] drm: Extract drm_debug.[hc]

2017-10-12 Thread Haneen Mohammed
On Wed, Oct 11, 2017 at 01:40:47PM +0200, Daniel Vetter wrote:
> On Tue, Oct 10, 2017 at 10:13:36PM -0600, Haneen Mohammed wrote:
> > Extract DRM_* debug macros from drmP.h to drm_debug.h and move printting
> > related functions from drm_drv.[hc] to drm_debug.[hc].
> > 
> > Update kerneldoc include directives accordingly.
> > 
> > Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
> > ---
> >  Documentation/gpu/drm-uapi.rst |   9 ++
> >  drivers/gpu/drm/Makefile   |   2 +-
> >  drivers/gpu/drm/drm_debug.c|  75 
> >  drivers/gpu/drm/drm_drv.c  |  47 --
> >  include/drm/drmP.h | 149 +--
> >  include/drm/drm_debug.h| 193 
> > +
> >  include/drm/drm_drv.h  |   7 --
> >  7 files changed, 279 insertions(+), 203 deletions(-)
> >  create mode 100644 drivers/gpu/drm/drm_debug.c
> >  create mode 100644 include/drm/drm_debug.h
> > 
> > diff --git a/Documentation/gpu/drm-uapi.rst b/Documentation/gpu/drm-uapi.rst
> > index 679373b..9a374e6 100644
> > --- a/Documentation/gpu/drm-uapi.rst
> > +++ b/Documentation/gpu/drm-uapi.rst
> > @@ -235,6 +235,15 @@ Debugfs Support
> >  .. kernel-doc:: drivers/gpu/drm/drm_debugfs.c
> > :export:
> >  
> > +Debug Support
> > +-
> > +
> > +.. kernel-doc:: include/drm/drm_debug.h
> > +   :internal:
> > +
> > +.. kernel-doc:: drivers/gpu/drm/drm_debug.c
> > +   :export:
> 
> debug output isn't really userspace interfaces. Why did you place it here?
> 
> I think finding a suitable place somewhere in drm-internal.rst would be
> better.
> -Daniel
> 

I wasn't sure where to place it, I've just followed the example of 
drm_debugfs.[hc].
Sure, will fix that. 

Haneen

> > +
> >  Sysfs Support
> >  =
> >  
> > diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> > index a8acc19..d09bd06 100644
> > --- a/drivers/gpu/drm/Makefile
> > +++ b/drivers/gpu/drm/Makefile
> > @@ -3,7 +3,7 @@
> >  # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
> >  
> >  drm-y   := drm_auth.o drm_bufs.o drm_cache.o \
> > -   drm_context.o drm_dma.o \
> > +   drm_context.o drm_dma.o drm_debug.o \
> > drm_file.o drm_gem.o drm_ioctl.o drm_irq.o \
> > drm_lock.o drm_memory.o drm_drv.o \
> > drm_scatter.o drm_pci.o \
> > diff --git a/drivers/gpu/drm/drm_debug.c b/drivers/gpu/drm/drm_debug.c
> > new file mode 100644
> > index 000..a79593f
> > --- /dev/null
> > +++ b/drivers/gpu/drm/drm_debug.c
> > @@ -0,0 +1,75 @@
> > +/*
> > + * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California.
> > + * All Rights Reserved.
> > + *
> > + * Author Rickard E. (Rik) Faith <fa...@valinux.com>
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > + * copy of this software and associated documentation files (the 
> > "Software"),
> > + * to deal in the Software without restriction, including without 
> > limitation
> > + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> > + * and/or sell copies of the Software, and to permit persons to whom the
> > + * Software is furnished to do so, subject to the following conditions:
> > + *
> > + * The above copyright notice and this permission notice (including the 
> > next
> > + * paragraph) shall be included in all copies or substantial portions of 
> > the
> > + * Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
> > OR
> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> > + * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES 
> > OR
> > + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> > + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
> > OTHER
> > + * DEALINGS IN THE SOFTWARE.
> > + */
> > +
> > +#include 
> > +#include 
> > +
> > +#define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"
> > +
> > +void drm_dev_printk(const struct device *dev, const char *level,
> > +   unsigned int category, const char *function_name,
> > +   const char *prefix, const char *f

[PATCH v2 1/3] drm: Extract drm_debug.[hc]

2017-10-12 Thread Haneen Mohammed
Extract DRM_* debug macros from drmP.h to drm_debug.h and move printting
related functions from drm_drv.[hc] to drm_debug.[hc].

Update kerneldoc include directives accordingly.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
Changes in v2:
- Place kerneldoc include directives in drm-internals.rst

 Documentation/gpu/drm-internals.rst |   8 ++
 drivers/gpu/drm/Makefile|   2 +-
 drivers/gpu/drm/drm_debug.c |  75 ++
 drivers/gpu/drm/drm_drv.c   |  47 -
 include/drm/drmP.h  | 149 +---
 include/drm/drm_debug.h | 193 
 include/drm/drm_drv.h   |   7 --
 7 files changed, 278 insertions(+), 203 deletions(-)
 create mode 100644 drivers/gpu/drm/drm_debug.c
 create mode 100644 include/drm/drm_debug.h

diff --git a/Documentation/gpu/drm-internals.rst 
b/Documentation/gpu/drm-internals.rst
index 5ee9674..c17f7d2 100644
--- a/Documentation/gpu/drm-internals.rst
+++ b/Documentation/gpu/drm-internals.rst
@@ -230,6 +230,14 @@ Printer
 .. kernel-doc:: drivers/gpu/drm/drm_print.c
:export:
 
+Debug Support
+-
+
+.. kernel-doc:: include/drm/drm_debug.h
+   :internal:
+
+.. kernel-doc:: drivers/gpu/drm/drm_debug.c
+   :export:
 
 Legacy Support Code
 ===
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index a8acc19..d09bd06 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -3,7 +3,7 @@
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
 drm-y   := drm_auth.o drm_bufs.o drm_cache.o \
-   drm_context.o drm_dma.o \
+   drm_context.o drm_dma.o drm_debug.o \
drm_file.o drm_gem.o drm_ioctl.o drm_irq.o \
drm_lock.o drm_memory.o drm_drv.o \
drm_scatter.o drm_pci.o \
diff --git a/drivers/gpu/drm/drm_debug.c b/drivers/gpu/drm/drm_debug.c
new file mode 100644
index 000..a79593f
--- /dev/null
+++ b/drivers/gpu/drm/drm_debug.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California.
+ * All Rights Reserved.
+ *
+ * Author Rickard E. (Rik) Faith <fa...@valinux.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include 
+#include 
+
+#define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"
+
+void drm_dev_printk(const struct device *dev, const char *level,
+   unsigned int category, const char *function_name,
+   const char *prefix, const char *format, ...)
+{
+   struct va_format vaf;
+   va_list args;
+
+   if (category != DRM_UT_NONE && !(drm_debug & category))
+   return;
+
+   va_start(args, format);
+   vaf.fmt = format;
+   vaf.va = 
+
+   if (dev)
+   dev_printk(level, dev, DRM_PRINTK_FMT, function_name, prefix,
+  );
+   else
+   printk("%s" DRM_PRINTK_FMT, level, function_name, prefix, );
+
+   va_end(args);
+}
+EXPORT_SYMBOL(drm_dev_printk);
+
+void drm_printk(const char *level, unsigned int category,
+   const char *format, ...)
+{
+   struct va_format vaf;
+   va_list args;
+
+   if (category != DRM_UT_NONE && !(drm_debug & category))
+   return;
+
+   va_start(args, format);
+   vaf.fmt = format;
+   vaf.va = 
+
+   printk("%s" "[" DRM_NAME ":%ps]%s %pV",
+  level, __builtin_return_address(0),
+  strcmp(level, KERN_ERR) == 0 ? " *ERROR*" : "", );
+
+   va_end(args);
+}
+EXPORT_SYMBOL(drm_printk);
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index be38ac7..9710c78 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -74,5

[PATCH 0/2] drm: Move debug macros out of drmP.h

2017-10-11 Thread Haneen Mohammed
This patchset move debug macros from drmP.h into drm_debug.h and move
printting related functions from drm_drv.[hc] to drm_debug.[hc].
In addition, it fixes old comment style.

Haneen Mohammed (2):
  drm: Extract drm_debug.[hc]
  drm: Update old comment style

 Documentation/gpu/drm-uapi.rst |   9 ++
 drivers/gpu/drm/Makefile   |   2 +-
 drivers/gpu/drm/drm_debug.c|  75 +
 drivers/gpu/drm/drm_drv.c  |  47 ---
 include/drm/drmP.h | 149 +
 include/drm/drm_debug.h| 185 +
 include/drm/drm_drv.h  |   7 --
 7 files changed, 271 insertions(+), 203 deletions(-)
 create mode 100644 drivers/gpu/drm/drm_debug.c
 create mode 100644 include/drm/drm_debug.h

-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 2/2] drm: Update old comment style

2017-10-11 Thread Haneen Mohammed
Remove old comment style used by doxygen.
And remove comment left from commit 99cdb35e787b ("drm/doc: move printf
helpers out of drmP.h") after refactoring drmP.h.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 include/drm/drm_debug.h | 26 +-
 1 file changed, 9 insertions(+), 17 deletions(-)

diff --git a/include/drm/drm_debug.h b/include/drm/drm_debug.h
index 24fbea4..78e3702 100644
--- a/include/drm/drm_debug.h
+++ b/include/drm/drm_debug.h
@@ -42,9 +42,7 @@ __printf(3, 4)
 void drm_printk(const char *level, unsigned int category,
const char *format, ...);
 
-/***/
-/** \name Macros to make printk easier */
-/*@{*/
+/** Macros to make printk easier */
 
 #define _DRM_PRINTK(once, level, fmt, ...) \
do {\
@@ -69,8 +67,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Error output.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @fmt: printf() like format string.
+ * @arg: arguments
  */
 #define DRM_DEV_ERROR(dev, fmt, ...)   \
drm_dev_printk(dev, KERN_ERR, DRM_UT_NONE, __func__, " *ERROR*",\
@@ -81,8 +79,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Rate limited error output.  Like DRM_ERROR() but won't flood the log.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @fmt: printf() like format string.
+ * @arg: arguments
  */
 #define DRM_DEV_ERROR_RATELIMITED(dev, fmt, ...)   \
 ({ \
@@ -112,8 +110,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Debug output.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @fmt: printf() like format string.
+ * @arg: arguments
  */
 #define DRM_DEV_DEBUG(dev, fmt, args...)   \
drm_dev_printk(dev, KERN_DEBUG, DRM_UT_CORE, __func__, "", fmt, \
@@ -164,8 +162,8 @@ void drm_printk(const char *level, unsigned int category,
 /**
  * Rate limited debug output. Like DRM_DEBUG() but won't flood the log.
  *
- * \param fmt printf() like format string.
- * \param arg arguments
+ * @fmt: printf() like format string.
+ * @arg: arguments
  */
 #define DRM_DEV_DEBUG_RATELIMITED(dev, fmt, args...)   \
DEV__DRM_DEFINE_DEBUG_RATELIMITED(dev, CORE, fmt, ##args)
@@ -184,10 +182,4 @@ void drm_printk(const char *level, unsigned int category,
 #define DRM_DEBUG_PRIME_RATELIMITED(fmt, args...)  \
DRM_DEV_DEBUG_PRIME_RATELIMITED(NULL, fmt, ##args)
 
-/* Format strings and argument splitters to simplify printing
- * various "complex" objects
- */
-
-/*@}*/
-
 #endif /* _DRM_DEBUG_H_ */
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


[PATCH 1/2] drm: Extract drm_debug.[hc]

2017-10-11 Thread Haneen Mohammed
Extract DRM_* debug macros from drmP.h to drm_debug.h and move printting
related functions from drm_drv.[hc] to drm_debug.[hc].

Update kerneldoc include directives accordingly.

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 Documentation/gpu/drm-uapi.rst |   9 ++
 drivers/gpu/drm/Makefile   |   2 +-
 drivers/gpu/drm/drm_debug.c|  75 
 drivers/gpu/drm/drm_drv.c  |  47 --
 include/drm/drmP.h | 149 +--
 include/drm/drm_debug.h| 193 +
 include/drm/drm_drv.h  |   7 --
 7 files changed, 279 insertions(+), 203 deletions(-)
 create mode 100644 drivers/gpu/drm/drm_debug.c
 create mode 100644 include/drm/drm_debug.h

diff --git a/Documentation/gpu/drm-uapi.rst b/Documentation/gpu/drm-uapi.rst
index 679373b..9a374e6 100644
--- a/Documentation/gpu/drm-uapi.rst
+++ b/Documentation/gpu/drm-uapi.rst
@@ -235,6 +235,15 @@ Debugfs Support
 .. kernel-doc:: drivers/gpu/drm/drm_debugfs.c
:export:
 
+Debug Support
+-
+
+.. kernel-doc:: include/drm/drm_debug.h
+   :internal:
+
+.. kernel-doc:: drivers/gpu/drm/drm_debug.c
+   :export:
+
 Sysfs Support
 =
 
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index a8acc19..d09bd06 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -3,7 +3,7 @@
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
 drm-y   := drm_auth.o drm_bufs.o drm_cache.o \
-   drm_context.o drm_dma.o \
+   drm_context.o drm_dma.o drm_debug.o \
drm_file.o drm_gem.o drm_ioctl.o drm_irq.o \
drm_lock.o drm_memory.o drm_drv.o \
drm_scatter.o drm_pci.o \
diff --git a/drivers/gpu/drm/drm_debug.c b/drivers/gpu/drm/drm_debug.c
new file mode 100644
index 000..a79593f
--- /dev/null
+++ b/drivers/gpu/drm/drm_debug.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2001 VA Linux Systems, Inc., Sunnyvale, California.
+ * All Rights Reserved.
+ *
+ * Author Rickard E. (Rik) Faith <fa...@valinux.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include 
+#include 
+
+#define DRM_PRINTK_FMT "[" DRM_NAME ":%s]%s %pV"
+
+void drm_dev_printk(const struct device *dev, const char *level,
+   unsigned int category, const char *function_name,
+   const char *prefix, const char *format, ...)
+{
+   struct va_format vaf;
+   va_list args;
+
+   if (category != DRM_UT_NONE && !(drm_debug & category))
+   return;
+
+   va_start(args, format);
+   vaf.fmt = format;
+   vaf.va = 
+
+   if (dev)
+   dev_printk(level, dev, DRM_PRINTK_FMT, function_name, prefix,
+  );
+   else
+   printk("%s" DRM_PRINTK_FMT, level, function_name, prefix, );
+
+   va_end(args);
+}
+EXPORT_SYMBOL(drm_dev_printk);
+
+void drm_printk(const char *level, unsigned int category,
+   const char *format, ...)
+{
+   struct va_format vaf;
+   va_list args;
+
+   if (category != DRM_UT_NONE && !(drm_debug & category))
+   return;
+
+   va_start(args, format);
+   vaf.fmt = format;
+   vaf.va = 
+
+   printk("%s" "[" DRM_NAME ":%ps]%s %pV",
+  level, __builtin_return_address(0),
+  strcmp(level, KERN_ERR) == 0 ? " *ERROR*" : "", );
+
+   va_end(args);
+}
+EXPORT_SYMBOL(drm_printk);
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index be38ac7..9710c78 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -74,53 +74,6 @@ static bool drm_core_init_complete = false;
 
 static struct dentry *drm_debugfs_root;
 
-#define DRM_P

[PATCH] drm/tinydrm: Remove explicit .best_encoder assignment

2017-10-11 Thread Haneen Mohammed
Since the driver is relying on the atomic helpers, remove the explicit
.best_encoder assignment and let the core call
drm_atomic_helper_best_encoder().

Signed-off-by: Haneen Mohammed <hamohammed...@gmail.com>
---
 drivers/gpu/drm/tinydrm/core/tinydrm-pipe.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/tinydrm/core/tinydrm-pipe.c 
b/drivers/gpu/drm/tinydrm/core/tinydrm-pipe.c
index 177e9d8..bc55de2 100644
--- a/drivers/gpu/drm/tinydrm/core/tinydrm-pipe.c
+++ b/drivers/gpu/drm/tinydrm/core/tinydrm-pipe.c
@@ -50,7 +50,6 @@ static int tinydrm_connector_get_modes(struct drm_connector 
*connector)
 
 static const struct drm_connector_helper_funcs tinydrm_connector_hfuncs = {
.get_modes = tinydrm_connector_get_modes,
-   .best_encoder = drm_atomic_helper_best_encoder,
 };
 
 static enum drm_connector_status
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel


  1   2   >