nv50: fix g98+ vdec class allocation

The kernel previously exposed incorrect classes for some of the chipsets
that this code supports.  It no longer does, but the older object ioctls
have compatibility to avoid breaking userspace.

This needs to be fixed before switching over to the newer interfaces.

Rather than hardcoding chipset->class like the rest of the driver does,
this makes use of (new) sclass queries to determine what's available.

v2.
- update to use symbolic class identifier from <nvif/class.h>

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Tested-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
Ben Skeggs 2015-11-25 09:01:32 +10:00
parent 791a3e1850
commit 33a3ba8c59

View file

@ -25,6 +25,8 @@
#include "util/u_sampler.h"
#include "util/u_format.h"
#include <nvif/class.h>
static void
nv98_decoder_decode_bitstream(struct pipe_video_codec *decoder,
struct pipe_video_buffer *video_target,
@ -56,6 +58,28 @@ nv98_decoder_decode_bitstream(struct pipe_video_codec *decoder,
nv98_decoder_ppp(dec, desc, target, comm_seq);
}
static const struct nouveau_mclass
nv98_decoder_msvld[] = {
{ G98_MSVLD, -1 },
{ IGT21A_MSVLD, -1 },
{ GT212_MSVLD, -1 },
{}
};
static const struct nouveau_mclass
nv98_decoder_mspdec[] = {
{ G98_MSPDEC, -1 },
{ GT212_MSPDEC, -1 },
{}
};
static const struct nouveau_mclass
nv98_decoder_msppp[] = {
{ G98_MSPPP, -1 },
{ GT212_MSPPP, -1 },
{}
};
struct pipe_video_codec *
nv98_create_decoder(struct pipe_context *context,
const struct pipe_video_codec *templ)
@ -103,12 +127,33 @@ nv98_create_decoder(struct pipe_context *context,
}
push = dec->pushbuf;
if (!ret)
ret = nouveau_object_new(dec->channel[0], 0x390b1, 0x85b1, NULL, 0, &dec->bsp);
if (!ret)
ret = nouveau_object_new(dec->channel[1], 0x190b2, 0x85b2, NULL, 0, &dec->vp);
if (!ret)
ret = nouveau_object_new(dec->channel[2], 0x290b3, 0x85b3, NULL, 0, &dec->ppp);
if (!ret) {
ret = nouveau_object_mclass(dec->channel[0], nv98_decoder_msvld);
if (ret >= 0) {
ret = nouveau_object_new(dec->channel[0], 0xbeef85b1,
nv98_decoder_msvld[ret].oclass, NULL, 0,
&dec->bsp);
}
}
if (!ret) {
ret = nouveau_object_mclass(dec->channel[1], nv98_decoder_mspdec);
if (ret >= 0) {
ret = nouveau_object_new(dec->channel[1], 0xbeef85b2,
nv98_decoder_mspdec[ret].oclass, NULL, 0,
&dec->vp);
}
}
if (!ret) {
ret = nouveau_object_mclass(dec->channel[2], nv98_decoder_msppp);
if (ret >= 0) {
ret = nouveau_object_new(dec->channel[2], 0xbeef85b3,
nv98_decoder_msppp[ret].oclass, NULL, 0,
&dec->ppp);
}
}
if (ret)
goto fail;