All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joe Kniss <djmk@google.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: amd-gfx@lists.freedesktop.org, "Heiko Stübner" <heiko@sntech.de>,
	"Sean Paul" <seanpaul@google.com>,
	michel.daenzer@amd.com, dri-devel@lists.freedesktop.org,
	"Thierry Reding" <thierry.reding@gmail.com>,
	krzk@kernel.org, "Alexandre Courbot" <gnurou@gmail.com>,
	linux-samsung-soc@vger.kernel.org, jy0922.shim@samsung.com,
	linux-rockchip@lists.infradead.org,
	"Kyungmin Park" <kyungmin.park@samsung.com>,
	javier@osg.samsung.com, tomi.valkeinen@ti.com,
	bskeggs@redhat.com, "CK HU" <ck.hu@mediatek.com>,
	Andrey.Grodzovsky@amd.com, "Joe Kniss" <djmk@chromium.org>,
	"Stephen Warren" <swarren@wwwdotorg.org>,
	linux-arm-msm@vger.kernel.org, intel-gfx@lists.freedesktop.org,
	lin <ux-tegra@vger.kernel.org>,
	linux-mediatek@lists.infradead.org,
	"Matthias Brugger" <matthias.bgg@gmail.com>,
	linux-arm-kernel@lists.infradead.org,
	"long jacob" <mark.yao@rock-chips.com>
Subject: Re: [PATCH] Add drm ioctl DRM_IOCTL_MODE_GETFB2 & associated helpers.
Date: Tue, 1 Aug 2017 17:12:28 -0700	[thread overview]
Message-ID: <CAOvnNvYMF_qBUAE-_DUMq-UgtmZ+Kdyrwf5JJgyEE+ujPkA4+g@mail.gmail.com> (raw)
In-Reply-To: <14443434.mrJIj1bSop@avalon>


[-- Attachment #1.1: Type: text/plain, Size: 10870 bytes --]

On Tue, Aug 1, 2017 at 1:46 PM, Laurent Pinchart <
laurent.pinchart@ideasonboard.com> wrote:

> Hi Joe,
>
> On Tuesday 01 Aug 2017 10:24:25 Joe Kniss wrote:
> > On Tue, Aug 1, 2017 at 5:09 AM, Laurent Pinchart wrote:
> > > On Monday 31 Jul 2017 11:29:13 Joe Kniss wrote:
> > >> New getfb2 functionality uses drm_mode_fb_cmd2 struct to be symmetric
> > >> with addfb2.
> > >
> > > What's the use case for this ? We haven't needed such an ioctl for so
> long
> > > that it seemed to me that userspace doesn't really need it, but I
> could be
> > > wrong.
> >
> > Sorry, I failed to reference the original email.  Here it is:
> >
> > <snip>
> > I am a recent addition to Google's ChromeOS gfx team.   I am currently
> > working on display testing and reporting.   An important part of this is
> > our screen capture tool, which works by querying drm for crtcs, planes,
> and
> > fbs.  Unfortunately, there is only limited information available via
> > drmModeGetFB(), which often wrong information when drmModeAddFB2() was
> used
> > to create the fbs.   For example, if the pixel format is NV12 or YUV420,
> > the fb returned knows nothing about the additional buffer planes required
> > by these formats.   Ideally, we would like a function (e.g.
> drmModeGetFB2)
> > to return information symmetric with drmModeAddFB2 including the pixel
> > format id, buffer plane information etc.
> > </snip>
> >
> > ChromeOS has needed this functionality from the start, for both testing
> and
> > error reporting.  We got away with guessing the buffer's format (32bit
> > xrgb) until now.  We are now enabling overlays and more formats including
> > multi-planar (e.g. NV12).  Current getfb() reports neither the pixel
> format
> > nor  planar information.  Without this information, going forward, our
> gfx
> > testing is going to break.  It would be great if we had access to higher
> > level buffer structs (like gbm), but we generally don't since they would
> be
> > created by other apps (chrome browser, android apps, etc...).
>
> How is screen capture implemented ? Do you enumerate the framebuffers being
> scanned out, dump their contents and compose them manually based on the
> active
> plane configuration ? If so, isn't this very race-prone ?
>
>
Yes, this is basically it.  We identify the crtc to capture, query the
planes associated with it and their properties.  For each plane, we get the
fb, then a FD that we use to import a GBM buffer, which we map and
composite.  It's not ideal, but it's the only thing that will work across
all of our platforms and configs.   We either wait or sleep for consistent
testing captures.  I'm not sure what we can do about the race condition
without a much more substantial change...  We are currently looking into
some platform specific methods, but the current approach won't be going
away anytime soon.


> > >> Also modifies *_fb_create_handle() calls to accept a
> > >> format_plane_index so that handles for each plane can be generated.
> > >> Previously, many *_fb_create_handle() calls simply defaulted to plane
> 0
> > >> only.
> > >
> > > And with this patch the amd/amdgpu, armada, gma500, i915, mediatek,
> msm,
> > > nouveau and radeon drivers still do. Do none of them support
> multi-planar
> > > formats ?
> >
> > I would imagine that some of these do support multi-planar formats, but
> > they don't appear to have them implemented yet (except perhaps as offsets
> > into a single buffer).  I will certainly be looking into this soon, but
> any
> > changes will come in future patches.
> >
> > >> Signed-off-by: Joe Kniss <djmk@google.com>
> > >> ---
> > >>
> > >>  drivers/gpu/drm/amd/amdgpu/amdgpu_display.c |  5 +-
> > >>  drivers/gpu/drm/armada/armada_fb.c          |  1 +
> > >>  drivers/gpu/drm/drm_crtc_internal.h         |  2 +
> > >>  drivers/gpu/drm/drm_fb_cma_helper.c         | 11 ++--
> > >>  drivers/gpu/drm/drm_framebuffer.c           | 79
> +++++++++++++++++++-
> > >>  drivers/gpu/drm/drm_ioctl.c                 |  1 +
> > >>  drivers/gpu/drm/exynos/exynos_drm_fb.c      |  7 ++-
> > >>  drivers/gpu/drm/gma500/framebuffer.c        |  2 +
> > >>  drivers/gpu/drm/i915/intel_display.c        |  1 +
> > >>  drivers/gpu/drm/mediatek/mtk_drm_fb.c       |  1 +
> > >>  drivers/gpu/drm/msm/msm_fb.c                |  5 +-
> > >>  drivers/gpu/drm/nouveau/nouveau_display.c   |  1 +
> > >>  drivers/gpu/drm/omapdrm/omap_fb.c           |  5 +-
> > >>  drivers/gpu/drm/radeon/radeon_display.c     |  5 +-
> > >>  drivers/gpu/drm/rockchip/rockchip_drm_fb.c  |  6 ++-
> > >>  drivers/gpu/drm/tegra/fb.c                  |  9 +++-
> > >>  include/drm/drm_framebuffer.h               |  1 +
> > >>  include/uapi/drm/drm.h                      |  2 +
> > >>  18 files changed, 127 insertions(+), 17 deletions(-)
> > >
> > > [snip]
> > >
> > >> diff --git a/drivers/gpu/drm/drm_framebuffer.c
> > >> b/drivers/gpu/drm/drm_framebuffer.c index 28a0108a1ab8..67b3be1bedbc
> > >> 100644
> > >> --- a/drivers/gpu/drm/drm_framebuffer.c
> > >> +++ b/drivers/gpu/drm/drm_framebuffer.c
> > >> @@ -24,6 +24,7 @@
>
> [snip]
>
> > >> +/**
> > >> + * drm_mode_getfb2 - get FB info
> > >> + * @dev: drm device for the ioctl
> > >> + * @data: data pointer for the ioctl
> > >> + * @file_priv: drm file for the ioctl call
> > >> + *
> > >> + * Lookup the FB given its ID and return info about it.
> > >> + *
> > >> + * Called by the user via ioctl.
> > >> + *
> > >> + * Returns:
> > >> + * Zero on success, negative errno on failure.
> > >> + */
> > >> +int drm_mode_getfb2(struct drm_device *dev,
> > >> +                void *data, struct drm_file *file_priv)
> > >> +{
> > >> +     struct drm_mode_fb_cmd2 *r = data;
> > >> +     struct drm_framebuffer *fb;
> > >> +     int ret, i;
> > >> +
> > >> +     if (!drm_core_check_feature(dev, DRIVER_MODESET))
> > >> +             return -EINVAL;
> > >> +
> > >> +     fb = drm_framebuffer_lookup(dev, r->fb_id);
> > >> +     if (!fb)
> > >> +             return -ENOENT;
> > >> +
> > >> +     r->height = fb->height;
> > >> +     r->width = fb->width;
> > >> +     r->pixel_format = fb->format->format;
> > >> +     for (i = 0; i < 4; ++i) {
> > >> +             r->pitches[i] = fb->pitches[i];
> > >> +             r->offsets[i] = fb->offsets[i];
> > >> +             r->modifier[i] = fb->modifier;
> > >> +             r->handles[i] = 0;
> > >> +     }
> > >> +
> > >> +     for (i = 0; i < fb->format->num_planes; ++i) {
> > >> +             if (fb->funcs->create_handle) {
> > >> +                     if (drm_is_current_master(file_priv) ||
> > >> +                         capable(CAP_SYS_ADMIN) ||
> > >> +                         drm_is_control_client(file_priv)) {
> > >> +                             ret = fb->funcs->create_handle(fb, i,
> > >> file_priv,
> > >> +
> > >> &r->handles[i]);
> > >> +                             if (ret)
> > >> +                                     break;
> > >> +                     } else {
> > >> +                             /* GET_FB() is an unprivileged ioctl so
> we
> > >> must
> > >> +                              * not return a buffer-handle to
> > >> non-master
> > >> +                              * processes! For
> backwards-compatibility
> > >> +                              * reasons, we cannot make GET_FB()
> > >> privileged,
> > >> +                              * so just return an invalid handle for
> > >> +                              * non-masters. */
> > >
> > > There's no backward compatibility to handle here, just make it
> privileged
> > > if it has to be.
> >
> > Sure thing, sounds good.
> >
> > > > +                             r->handles[i] = 0;
> > > > +                             ret = 0;
> > > > +                     }
> > > > +             } else {
> > > > +                     ret = -ENODEV;
> > > > +                     break;
> > > > +             }
> > > > +     }
> > > > +
> > > > +     /* If handle creation failed, delete/dereference any that were
> > >
> > > made.
> > > */
> > >
> > > > +     if (ret) {
> > > > +             for (i = 0; i < 4; ++i) {
> > > > +                     if (r->handles[i])
> > > > +                             drm_gem_handle_delete(file_priv, r-
> > > >handles[i]);
> > >
> > > My initial reaction to this was to reply that not all drivers use GEM,
> but
> > > after some investigation it seems they actually do. If that's really
> the
> > > case, we could get rid of the .create_handle() operation completely,
> which
> > > should simplify the implementation of both DRM_IOCTL_MODE_GETFB and
> > > DRM_IOCTL_MODE_GETFB2.
> >
> > Deleting the handle is the same in all cases, but creating the handle
> > isn't consistent across the drivers.  I didn't see a clean way to
> simplify
> > this.
>
> Creating the handle seems to be fairly consistent, except for a very small
> number of special cases. If we stored the GEM object pointers in the
> drm_framebuffer structure, the common case would be simplified. Or maybe
> I've
> missed something :-)
>
>
I am sure this would be fine, I'd be happy to get rid of it.  I'll put
together a separate patch for this.



> > >> +                     r->handles[i] = 0;
> > >> +             }
> > >> +     }
> > >> +
> > >> +     drm_framebuffer_unreference(fb);
> > >> +
> > >> +     return ret;
> > >> +}
>
> [snip]
>
> > >> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
> > >> index b2c52843bc70..c81c75335cca 100644
> > >> --- a/include/uapi/drm/drm.h
> > >> +++ b/include/uapi/drm/drm.h
> > >> @@ -814,6 +814,8 @@ extern "C" {
> > >>
> > >>  #define DRM_IOCTL_MODE_CREATEPROPBLOB        DRM_IOWR(0xBD, struct
> > >> drm_mode_create_blob)
> > >> #define DRM_IOCTL_MODE_DESTROYPROPBLOB        DRM_IOWR(0xBE, struct
> > >> drm_mode_destroy_blob)
> > >>
> > >> +#define DRM_IOCTL_MODE_GETFB2  DRM_IOWR(0xC4, struct
> drm_mode_fb_cmd2)
> > >> +
> > >
> > > Which tree is this based on ? The last defined ioctl
> > > (DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE) is 0xC2 in drm-next and
> drm-misc-next.
> >
> > I just did a quick search for "DRM_IOWR 0xC*" and picked the first unused
> > one, there was a patch in-flight from last month that used 0xC3 (
> > https://lists.freedesktop.org/archives/amd-gfx/2017-June/010153.html).
> > Naturally, I'll set this to whatever is appropriate.
>
> The best is to base your patch on top of the drm-misc-next branch of the
> drm-
> misc tree. Whoever is merged first will win the ioctl number :-) Of course
> it
> means rebasing if someone else wins the race, but that shouldn't be a big
> deal.
>
>
Will do.


> > > >  /**
> > > >
> > > >   * Device specific ioctls should only be in their respective headers
> > > >   * The device specific ioctl range is from 0x40 to 0x9f.
>
> --
> Regards,
>
> Laurent Pinchart
>
>
I'll respond with an updated patch ASAP.

-- 
Dr. Joe Michael Kniss |  Google ChromeOS |  djmk@google.com   |
1-801-898-7977 <(801)%20898-7977>

[-- Attachment #1.2: Type: text/html, Size: 16939 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

      reply	other threads:[~2017-08-02  0:12 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-27  1:35 Need a drmModeGetFB2() or similar query Joe Kniss
     [not found] ` <CAOvnNvYKXsy9dvOB0ge1WxQbwubPpzKofd=OGagKyft-yQJ1xw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-07-31 18:29   ` [PATCH] Add drm ioctl DRM_IOCTL_MODE_GETFB2 & associated helpers Joe Kniss
2017-07-31 18:29     ` Joe Kniss
2017-07-31 18:29     ` Joe Kniss
2017-08-01 12:09     ` Laurent Pinchart
2017-08-01 17:24       ` Joe Kniss
     [not found]         ` <CAOvnNvZoHv8prg2R57cgGx5w7h69=X3hQGrpP5iXaLujhOfzYA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-08-01 20:46           ` Laurent Pinchart
2017-08-02  0:12             ` Joe Kniss [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAOvnNvYMF_qBUAE-_DUMq-UgtmZ+Kdyrwf5JJgyEE+ujPkA4+g@mail.gmail.com \
    --to=djmk@google.com \
    --cc=Andrey.Grodzovsky@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=bskeggs@redhat.com \
    --cc=ck.hu@mediatek.com \
    --cc=djmk@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gnurou@gmail.com \
    --cc=heiko@sntech.de \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=javier@osg.samsung.com \
    --cc=jy0922.shim@samsung.com \
    --cc=krzk@kernel.org \
    --cc=kyungmin.park@samsung.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=mark.yao@rock-chips.com \
    --cc=matthias.bgg@gmail.com \
    --cc=michel.daenzer@amd.com \
    --cc=seanpaul@google.com \
    --cc=swarren@wwwdotorg.org \
    --cc=thierry.reding@gmail.com \
    --cc=tomi.valkeinen@ti.com \
    --cc=ux-tegra@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.