[PATCH v2 2/2] drm/nouveau: add GEM_SET_TILING staging ioctl

Alexandre Courbot gnurou at gmail.com
Mon Jul 6 04:41:07 PDT 2015


Hi Thierry,

On Mon, Jun 29, 2015 at 10:30 PM, Thierry Reding <treding at nvidia.com> wrote:
> On Mon, Jun 15, 2015 at 04:15:36PM +0900, Alexandre Courbot wrote:
>> On 06/15/2015 04:09 PM, Alexandre Courbot wrote:
>> >From: Ari Hirvonen <ahirvonen at nvidia.com>
>> >
>> >Add new NOUVEAU_GEM_SET_TILING ioctl to set correct tiling
>> >mode for imported dma-bufs. This ioctl is staging for now
>> >and enabled with the "staging_tiling" module option.
>>
>> Adding Thierry to the conversation since he knows best about exported
>> buffers and attributes. I wonder if this would not better be done at the
>> time the buffer gets imported. It seems to me that this would be a more
>> appropriate way than having an ioctl dedicated to this. Thierry, would you
>> have any input based on your experience with tegradrm? In the end, it seems
>> like you have settled for a similar ioctl to set the tiling mode of
>> displayed buffers.
>
> You can't do this at the time the buffer is imported because the PRIME
> API doesn't have a means to communicate this type of meta-data. The data
> is also very driver-specific, so you can't easily make it generic enough
> to be useful in a generic import API.

Ok, so does it mean that this kind of use-case is best handled by a
driver-specific IOCTL?

>
> That said, I have a couple of other comments. First, the commit message
> doesn't mention why this needs to be protected by a module option. Also
> I think that if we go for a module option it should be more generic and
> provide an umbrella if ever we want to have more code guarded by the
> option. It might also be useful to introduce a Kconfig symbol that in
> turn depends on the STAGING symbol so that users can't accidentally
> enable this.

We came to this option with Ben while discussing how staging IOCTLs
could be implemented. Since we decided to drop this idea altogether, I
guess we don't have to worry about how to implement the option
anymore.

>
>> >diff --git a/drm/nouveau/nouveau_drm.c b/drm/nouveau/nouveau_drm.c
>> >index 28860268cf38..45a2c88ebf8e 100644
>> >--- a/drm/nouveau/nouveau_drm.c
>> >+++ b/drm/nouveau/nouveau_drm.c
>> >@@ -75,6 +75,10 @@ MODULE_PARM_DESC(runpm, "disable (0), force enable (1), optimus only default (-1
>> >  int nouveau_runtime_pm = -1;
>> >  module_param_named(runpm, nouveau_runtime_pm, int, 0400);
>> >
>> >+MODULE_PARM_DESC(staging_tiling, "enable staging GEM_SET_TILING ioctl");
>> >+int nouveau_staging_tiling = 0;
>> >+module_param_named(staging_tiling, nouveau_staging_tiling, int, 0600);
>
> Perhaps make this a boolean parameter? And like I said, maybe make it
> more general and provide a single option for potentially other staging
> features.
>
> A word of caution: let's only resort to this if absolutely necessary.
> Doing this is going to get messy and if we want this merged I suspect
> that we do have userspace that uses this. Hence if ever this gets
> modified that userspace will break. Can't we find a way around it?
>
> Note that the DRM_TEGRA_STAGING option is a bit of a special case as
> there aren't any real users of it beyond proof of concept code. Nouveau,
> on the other hand, has real users that will want to take advantage of
> this code. So if we really need to do this, let's come up with a *very*
> good rationale.

Yeah, several people weighted in to point out this was a bad idea, so
this patch series is dropped for now. We will just carry these extra
IOCTLs out-of-tree for a longer time, and make sure they are fit and
well-tested before submitting them upstream.

>
>> >diff --git a/drm/nouveau/nouveau_gem.c b/drm/nouveau/nouveau_gem.c
>> >index 0e690bf19fc9..0e69449798aa 100644
>> >--- a/drm/nouveau/nouveau_gem.c
>> >+++ b/drm/nouveau/nouveau_gem.c
>> >@@ -172,6 +172,64 @@ nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv)
>> >     ttm_bo_unreserve(&nvbo->bo);
>> >  }
>> >
>> >+extern int nouveau_staging_tiling;
>
> Put this in nouveau_drm.h along with other external declarations?
>
>> >+int
>> >+nouveau_gem_ioctl_set_tiling(struct drm_device *dev, void *data,
>> >+                         struct drm_file *file_priv)
>> >+{
>> >+    struct nouveau_drm *drm = nouveau_drm(dev);
>> >+    struct nouveau_cli *cli = nouveau_cli(file_priv);
>> >+    struct nvkm_fb *pfb = nvxx_fb(&drm->device);
>> >+    struct drm_nouveau_gem_set_tiling *req = data;
>> >+    struct drm_gem_object *gem;
>> >+    struct nouveau_bo *nvbo;
>> >+    struct nvkm_vma *vma;
>> >+    int ret = 0;
>> >+
>> >+    if (!nouveau_staging_tiling)
>> >+            return -EINVAL;
>> >+
>> >+    if (!pfb->memtype_valid(pfb, req->tile_flags)) {
>> >+            NV_PRINTK(error, cli, "bad page flags: 0x%08x\n", req->tile_flags);
>> >+            return -EINVAL;
>> >+    }
>> >+
>> >+    gem = drm_gem_object_lookup(dev, file_priv, req->handle);
>> >+    if (!gem)
>> >+            return -ENOENT;
>> >+
>> >+    nvbo = nouveau_gem_object(gem);
>> >+
>> >+    /* We can only change tiling on PRIME-imported buffers */
>> >+    if (nvbo->bo.type != ttm_bo_type_sg) {
>> >+            ret = -EINVAL;
>> >+            goto out;
>> >+    }
>
> I don't think that's the right way to check for PRIME-imported buffers.
> The right check is:
>
>         if (!gem->import_attach) {
>                 ret = -EINVAL;
>                 goto out;
>         }
>
> The comment above this block should probably also say *why* we can only
> change tiling on PRIME-imported buffers.

The reason is because we actually don't want to *change* the tiling
settings as much as we want to *set* them for imported buffers. The
DRM_NOUVEAU_GEM_NEW ioctl has a tiling parameter, and we need the same
feature for PRIME-imported buffers. This is why I would have preferred
to have this information somehow attached to the buffer itself, or
specified at import time, since having a dedicated ioctl tends to
suggest that it is to change the tiling settings.

I wanted your thoughts on the topic because I know you had the same
issue with tegra DRM and actively looked for a solution - but from
your comments, it seems like that solution is to simply use a
dedicated IOCTL for this.

Thanks for your comments!
Alex.


More information about the dri-devel mailing list