summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9e6f96a)
raw | patch | inline | side by side (parent: 9e6f96a)
author | Ben Skeggs <bskeggs@redhat.com> | |
Fri, 23 Nov 2012 02:40:30 +0000 (12:40 +1000) | ||
committer | Ben Skeggs <bskeggs@redhat.com> | |
Wed, 16 Jan 2013 09:48:49 +0000 (19:48 +1000) |
v2: Take Maarten Lankhorst's suggestion of nesting the struct to prevent
sizeof() issues due to padding on older revisions.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
sizeof() issues due to padding on older revisions.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
nouveau/abi16.c | patch | blob | history | |
nouveau/nouveau.c | patch | blob | history | |
nouveau/nouveau.h | patch | blob | history | |
nouveau/private.h | patch | blob | history |
diff --git a/nouveau/abi16.c b/nouveau/abi16.c
index a67fbc123a97cba5025cc4347adca6b75d3d5d5f..f34175e02b2904658d39a5b222f9fa0f407ebb75 100644 (file)
--- a/nouveau/abi16.c
+++ b/nouveau/abi16.c
#include <stdlib.h>
#include <stdint.h>
+#include <stddef.h>
#include "private.h"
+
int
abi16_chan_nv04(struct nouveau_object *obj)
{
return 0;
}
+int
+abi16_chan_nve0(struct nouveau_object *obj)
+{
+ struct nouveau_device *dev = (struct nouveau_device *)obj->parent;
+ struct drm_nouveau_channel_alloc req = {};
+ struct nve0_fifo *nve0 = obj->data;
+ int ret;
+
+ if (obj->length > offsetof(struct nve0_fifo, engine)) {
+ req.fb_ctxdma_handle = 0xffffffff;
+ req.tt_ctxdma_handle = nve0->engine;
+ }
+
+ ret = drmCommandWriteRead(dev->fd, DRM_NOUVEAU_CHANNEL_ALLOC,
+ &req, sizeof(req));
+ if (ret)
+ return ret;
+
+ nve0->base.channel = req.channel;
+ nve0->base.pushbuf = req.pushbuf_domains;
+ nve0->notify = req.notifier_handle;
+ nve0->base.object->handle = req.channel;
+ nve0->base.object->length = sizeof(*nve0);
+ return 0;
+}
+
int
abi16_engobj(struct nouveau_object *obj)
{
diff --git a/nouveau/nouveau.c b/nouveau/nouveau.c
index 940d93396e566bef5aba643ef7c11fd005375383..9b32e319d0d2c99bc47b26ffa3089a15d1e98d30 100644 (file)
--- a/nouveau/nouveau.c
+++ b/nouveau/nouveau.c
if (dev->chipset < 0xc0)
ret = abi16_chan_nv04(obj);
else
+ if (dev->chipset < 0xe0)
ret = abi16_chan_nvc0(obj);
+ else
+ ret = abi16_chan_nve0(obj);
}
break;
default:
diff --git a/nouveau/nouveau.h b/nouveau/nouveau.h
index c42eea7a8e909d3ba33a3e25c1b249eddd04f395..a55e2b02077891f26f815ebe527373369c07f53d 100644 (file)
--- a/nouveau/nouveau.h
+++ b/nouveau/nouveau.h
uint32_t notify;
};
+#define NVE0_FIFO_ENGINE_GR 0x00000001
+#define NVE0_FIFO_ENGINE_VP 0x00000002
+#define NVE0_FIFO_ENGINE_PPP 0x00000004
+#define NVE0_FIFO_ENGINE_BSP 0x00000008
+#define NVE0_FIFO_ENGINE_CE0 0x00000010
+#define NVE0_FIFO_ENGINE_CE1 0x00000020
+#define NVE0_FIFO_ENGINE_ENC 0x00000040
+
+struct nve0_fifo {
+ struct {
+ struct nouveau_fifo base;
+ uint32_t notify;
+ };
+ uint32_t engine;
+};
+
struct nv04_notify {
struct nouveau_object *object;
uint32_t offset;
diff --git a/nouveau/private.h b/nouveau/private.h
index b409cc8d3c80ac0890ad3269a950106258602f68..8a5cb26144942097babcb111a789b5fd5c96e4c9 100644 (file)
--- 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 *);