[PATCH] nouveau: add support for setting engine on nve0
Ben Skeggs
bskeggs at redhat.com
Sun Jan 13 21:25:40 PST 2013
On Fri, 2013-01-11 at 16:04 +0100, Maarten Lankhorst wrote:
> When a specific engine is needed that's not GR, struct nve0_fifo should be used,
> and the engine member should be used to select the engine.
>
> This will fail on kernels before 3.8, since no support for such engines has been added yet.
This looks strikingly similar to the version of the patch I sent you
ages back. Was there something you noticed wrong with that version?
I do need to re-check some things with that patch and make sure it'll
work properly on both 32/64-bit (hint: sizeof(struct nve0_fifo) is the
same as nvc0_fifo on 64-bit, due to padding...), and maintain compat
with pre-3.8 kernels.
I'll try and sort this out before the end of tomorrow.
Ben.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
>
> ---
> Can you review/test this libdrm patch?
>
> diff --git a/nouveau/abi16.c b/nouveau/abi16.c
> index a67fbc1..f8b51c1 100644
> --- a/nouveau/abi16.c
> +++ b/nouveau/abi16.c
> @@ -70,6 +70,29 @@ abi16_chan_nvc0(struct nouveau_object *obj)
> }
>
> int
> +abi16_chan_nve0(struct nouveau_object *obj)
> +{
> + struct nouveau_device *dev = (struct nouveau_device *)obj->parent;
> + struct nve0_fifo *nve0 = obj->data;
> + struct nvc0_fifo *nvc0 = &nve0->base;
> + struct drm_nouveau_channel_alloc req = { ~0, nve0->engine };
> + int ret;
> +
> + ret = drmCommandWriteRead(dev->fd, DRM_NOUVEAU_CHANNEL_ALLOC,
> + &req, sizeof(req));
> + if (ret)
> + return ret;
> +
> + nvc0->base.channel = req.channel;
> + nvc0->base.pushbuf = req.pushbuf_domains;
> + nvc0->notify = req.notifier_handle;
> + nvc0->base.object->handle = req.channel;
> + nvc0->base.object->length = sizeof(*nve0);
> + return 0;
> +}
> +
> +
> +int
> abi16_engobj(struct nouveau_object *obj)
> {
> struct drm_nouveau_grobj_alloc req = {
> diff --git a/nouveau/nouveau.c b/nouveau/nouveau.c
> index 940d933..24b4639 100644
> --- a/nouveau/nouveau.c
> +++ b/nouveau/nouveau.c
> @@ -246,8 +246,11 @@ nouveau_object_new(struct nouveau_object *parent, uint64_t handle,
> {
> if (dev->chipset < 0xc0)
> ret = abi16_chan_nv04(obj);
> - else
> + else if (dev->chipset < 0xe0 ||
> + length < sizeof(struct nve0_fifo))
> ret = abi16_chan_nvc0(obj);
> + else
> + ret = abi16_chan_nve0(obj);
> }
> break;
> default:
> diff --git a/nouveau/nouveau.h b/nouveau/nouveau.h
> index c42eea7..e088de5 100644
> --- a/nouveau/nouveau.h
> +++ b/nouveau/nouveau.h
> @@ -41,6 +41,19 @@ struct nvc0_fifo {
> uint32_t notify;
> };
>
> +struct nve0_fifo {
> + struct nvc0_fifo base;
> + uint32_t engine;
> +
> +#define NVE0_CHANNEL_IND_ENGINE_GR 0x00000001
> +#define NVE0_CHANNEL_IND_ENGINE_VP 0x00000002
> +#define NVE0_CHANNEL_IND_ENGINE_PPP 0x00000004
> +#define NVE0_CHANNEL_IND_ENGINE_BSP 0x00000008
> +#define NVE0_CHANNEL_IND_ENGINE_CE0 0x00000010
> +#define NVE0_CHANNEL_IND_ENGINE_CE1 0x00000020
> +#define NVE0_CHANNEL_IND_ENGINE_ENC 0x00000040
> +};
> +
> struct nv04_notify {
> struct nouveau_object *object;
> uint32_t offset;
> diff --git a/nouveau/private.h b/nouveau/private.h
> index b409cc8..8a5cb26 100644
> --- a/nouveau/private.h
> +++ b/nouveau/private.h
> @@ -113,6 +113,7 @@ nouveau_device_open_existing(struct nouveau_device **, int, int, drm_context_t);
> /* abi16.c */
> int abi16_chan_nv04(struct nouveau_object *);
> int abi16_chan_nvc0(struct nouveau_object *);
> +int abi16_chan_nve0(struct nouveau_object *);
> int abi16_engobj(struct nouveau_object *);
> int abi16_ntfy(struct nouveau_object *);
> void abi16_bo_info(struct nouveau_bo *, struct drm_nouveau_gem_info *);
>
More information about the dri-devel
mailing list