[Nouveau] [libdrm 05/13] nouveau: add interfaces to query information about supported classes

Emil Velikov emil.l.velikov at gmail.com
Thu Nov 26 12:39:22 PST 2015


On 26 November 2015 at 07:14, Ben Skeggs <skeggsb at gmail.com> wrote:
> From: Ben Skeggs <bskeggs at redhat.com>
>
> This will expose functionality supported by newer kernel interfaces.
>
> Current userspace uses the chipset to determine which classes are likely
> exposed, which generally works pretty well, but isn't as flexible as it
> could be.
>
> Unfortunately, the G98:GF100 video code in Mesa is still relying on the
> kernel exposing incorrect vdec classes on some chipsets.  The ABI16
> kernel interfaces have a workaround for this in place, but that will no
> longer be available once libdrm supports NVIF.
>
> To prevent a regression when NVIF support is added, if there's no kernel
> support for NVIF, libdrm will magic up a class list containing correct
> vdec classes anyway instead of failing with -ENODEV.
>
> Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
> ---
>  nouveau/abi16.c              | 28 ++++++++++++++++++++++++++++
>  nouveau/nouveau-symbol-check |  3 +++
>  nouveau/nouveau.c            | 41 +++++++++++++++++++++++++++++++++++++++++
>  nouveau/nouveau.h            | 17 +++++++++++++++++
>  nouveau/private.h            |  1 +
>  5 files changed, 90 insertions(+)
>
> diff --git a/nouveau/abi16.c b/nouveau/abi16.c
> index 8f24ba2..34e9fb1 100644
> --- a/nouveau/abi16.c
> +++ b/nouveau/abi16.c

> +drm_private int
> +abi16_sclass(struct nouveau_object *obj, struct nouveau_sclass **psclass)
> +{
> +       struct nouveau_sclass *sclass;
> +       struct nouveau_device *dev;
> +
> +       if (!(sclass = *psclass = calloc(8, sizeof(*sclass))))
Most places set the user provided pointer if the function succeeds.
I.e. move *psclass = sclass; after the error check ?

> +               return -ENOMEM;
> +
> +       switch (obj->oclass) {
> +       case NOUVEAU_FIFO_CHANNEL_CLASS:
> +               dev = (struct nouveau_device *)obj->parent;
> +               if (dev->chipset >= 0x98 &&
> +                   dev->chipset != 0xa0 &&
> +                   dev->chipset <  0xc0) {
> +                       *sclass++ = (struct nouveau_sclass){ 0x85b1, -1, -1 };
> +                       *sclass++ = (struct nouveau_sclass){ 0x85b2, -1, -1 };
> +                       *sclass++ = (struct nouveau_sclass){ 0x85b3, -1, -1 };
Worth adding a comment (just grab the commit message) about this magic ?

> --- a/nouveau/nouveau.h
> +++ b/nouveau/nouveau.h
> @@ -63,12 +63,29 @@ struct nv04_notify {
>         uint32_t length;
>  };
>
> +struct nouveau_sclass {
> +       int32_t oclass;
> +       int minver;
> +       int maxver;
> +};
> +
> +struct nouveau_mclass {
> +       int32_t oclass;
> +       int version;
> +       void *data;
> +};
> +
Can you please add a comment about the meaning of sclass and mclass.

Thanks
Emil


More information about the Nouveau mailing list