Loading drivers/gpu/drm/nouveau/include/nvkm/core/client.h +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ struct nvkm_client { struct nvkm_client_notify *notify[16]; struct rb_root objroot; struct rb_root dmaroot; struct nvkm_handle *root; Loading drivers/gpu/drm/nouveau/include/nvkm/engine/dma.h +16 −5 Original line number Diff line number Diff line #ifndef __NVKM_DMA_H__ #define __NVKM_DMA_H__ #include <core/engine.h> struct nvkm_client; struct nvkm_gpuobj; struct nvkm_dmaobj { struct nvkm_object base; const struct nvkm_dmaobj_func *func; struct nvkm_dma *dma; struct nvkm_object object; u32 target; u32 access; u64 start; u64 limit; struct rb_node rb; u64 handle; /*XXX HANDLE MERGE */ }; struct nvkm_dmaobj_func { int (*bind)(struct nvkm_dmaobj *, struct nvkm_gpuobj *, int align, struct nvkm_gpuobj **); }; struct nvkm_dma { struct nvkm_engine engine; /* creates a "physical" dma object from a struct nvkm_dmaobj */ int (*bind)(struct nvkm_dmaobj *dmaobj, struct nvkm_gpuobj *parent, struct nvkm_gpuobj **); }; struct nvkm_dmaobj * nvkm_dma_search(struct nvkm_dma *, struct nvkm_client *, u64 object); extern struct nvkm_oclass *nv04_dmaeng_oclass; extern struct nvkm_oclass *nv50_dmaeng_oclass; extern struct nvkm_oclass *gf100_dmaeng_oclass; Loading drivers/gpu/drm/nouveau/nvkm/core/client.c +1 −0 Original line number Diff line number Diff line Loading @@ -314,6 +314,7 @@ nvkm_client_new(const char *name, u64 device, const char *cfg, client->device = device; client->debug = nvkm_dbgopt(dbg, "CLIENT"); client->objroot = RB_ROOT; client->dmaroot = RB_ROOT; ret = nvkm_handle_create(NULL, ~0, &client->object, &client->root); if (ret) Loading drivers/gpu/drm/nouveau/nvkm/engine/device/user.c +19 −8 Original line number Diff line number Diff line Loading @@ -292,11 +292,12 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index, (1ULL << NVDEV_ENGINE_FIFO) | (1ULL << NVDEV_ENGINE_DISP) | (1ULL << NVDEV_ENGINE_PM); const struct nvkm_device_oclass *sclass; const struct nvkm_device_oclass *sclass = NULL; int i; for (; i = __ffs64(mask), mask; mask &= ~(1ULL << i)) { if ((engine = nvkm_device_engine(device, i))) { for (; i = __ffs64(mask), mask && !sclass; mask &= ~(1ULL << i)) { if ((engine = nvkm_device_engine(device, i)) && !engine->func) { struct nvkm_oclass *sclass = engine->sclass; int c = 0; while (sclass && sclass->ofuncs) { Loading @@ -312,17 +313,27 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index, sclass++; } index -= c; continue; } if (!(engine = nvkm_device_engine(device, i)) || !(engine->func->base.sclass)) continue; oclass->engine = engine; index -= engine->func->base.sclass(oclass, index, &sclass); } if (!sclass) { switch (index) { case 0: sclass = &nvkm_control_oclass; break; default: return -EINVAL; } oclass->base = sclass->base; } oclass->ctor = nvkm_udevice_child_new; oclass->base = sclass->base; oclass->priv = sclass; return 0; } Loading drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c +12 −19 Original line number Diff line number Diff line Loading @@ -209,8 +209,9 @@ nv50_disp_dmac_create_(struct nvkm_object *parent, struct nvkm_oclass *oclass, u64 pushbuf, int head, int length, void **pobject) { struct nvkm_device *device = parent->engine->subdev.device; struct nvkm_client *client = nvkm_client(parent); struct nvkm_handle *handle; struct nvkm_dma *dma = device->dma; struct nvkm_dmaobj *dmaobj; struct nv50_disp_dmac *dmac; int ret; Loading @@ -221,14 +222,10 @@ nv50_disp_dmac_create_(struct nvkm_object *parent, if (ret) return ret; handle = nvkm_client_search(client, pushbuf); if (!handle) dmaobj = nvkm_dma_search(dma, client, pushbuf); if (!dmaobj) return -ENOENT; dmaobj = (void *)handle->object; switch (nv_mclass(dmaobj)) { case 0x0002: case 0x003d: if (dmaobj->limit - dmaobj->start != 0xfff) return -EINVAL; Loading @@ -242,10 +239,6 @@ nv50_disp_dmac_create_(struct nvkm_object *parent, default: return -EINVAL; } break; default: return -EINVAL; } return 0; } Loading Loading
drivers/gpu/drm/nouveau/include/nvkm/core/client.h +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ struct nvkm_client { struct nvkm_client_notify *notify[16]; struct rb_root objroot; struct rb_root dmaroot; struct nvkm_handle *root; Loading
drivers/gpu/drm/nouveau/include/nvkm/engine/dma.h +16 −5 Original line number Diff line number Diff line #ifndef __NVKM_DMA_H__ #define __NVKM_DMA_H__ #include <core/engine.h> struct nvkm_client; struct nvkm_gpuobj; struct nvkm_dmaobj { struct nvkm_object base; const struct nvkm_dmaobj_func *func; struct nvkm_dma *dma; struct nvkm_object object; u32 target; u32 access; u64 start; u64 limit; struct rb_node rb; u64 handle; /*XXX HANDLE MERGE */ }; struct nvkm_dmaobj_func { int (*bind)(struct nvkm_dmaobj *, struct nvkm_gpuobj *, int align, struct nvkm_gpuobj **); }; struct nvkm_dma { struct nvkm_engine engine; /* creates a "physical" dma object from a struct nvkm_dmaobj */ int (*bind)(struct nvkm_dmaobj *dmaobj, struct nvkm_gpuobj *parent, struct nvkm_gpuobj **); }; struct nvkm_dmaobj * nvkm_dma_search(struct nvkm_dma *, struct nvkm_client *, u64 object); extern struct nvkm_oclass *nv04_dmaeng_oclass; extern struct nvkm_oclass *nv50_dmaeng_oclass; extern struct nvkm_oclass *gf100_dmaeng_oclass; Loading
drivers/gpu/drm/nouveau/nvkm/core/client.c +1 −0 Original line number Diff line number Diff line Loading @@ -314,6 +314,7 @@ nvkm_client_new(const char *name, u64 device, const char *cfg, client->device = device; client->debug = nvkm_dbgopt(dbg, "CLIENT"); client->objroot = RB_ROOT; client->dmaroot = RB_ROOT; ret = nvkm_handle_create(NULL, ~0, &client->object, &client->root); if (ret) Loading
drivers/gpu/drm/nouveau/nvkm/engine/device/user.c +19 −8 Original line number Diff line number Diff line Loading @@ -292,11 +292,12 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index, (1ULL << NVDEV_ENGINE_FIFO) | (1ULL << NVDEV_ENGINE_DISP) | (1ULL << NVDEV_ENGINE_PM); const struct nvkm_device_oclass *sclass; const struct nvkm_device_oclass *sclass = NULL; int i; for (; i = __ffs64(mask), mask; mask &= ~(1ULL << i)) { if ((engine = nvkm_device_engine(device, i))) { for (; i = __ffs64(mask), mask && !sclass; mask &= ~(1ULL << i)) { if ((engine = nvkm_device_engine(device, i)) && !engine->func) { struct nvkm_oclass *sclass = engine->sclass; int c = 0; while (sclass && sclass->ofuncs) { Loading @@ -312,17 +313,27 @@ nvkm_udevice_child_get(struct nvkm_object *object, int index, sclass++; } index -= c; continue; } if (!(engine = nvkm_device_engine(device, i)) || !(engine->func->base.sclass)) continue; oclass->engine = engine; index -= engine->func->base.sclass(oclass, index, &sclass); } if (!sclass) { switch (index) { case 0: sclass = &nvkm_control_oclass; break; default: return -EINVAL; } oclass->base = sclass->base; } oclass->ctor = nvkm_udevice_child_new; oclass->base = sclass->base; oclass->priv = sclass; return 0; } Loading
drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c +12 −19 Original line number Diff line number Diff line Loading @@ -209,8 +209,9 @@ nv50_disp_dmac_create_(struct nvkm_object *parent, struct nvkm_oclass *oclass, u64 pushbuf, int head, int length, void **pobject) { struct nvkm_device *device = parent->engine->subdev.device; struct nvkm_client *client = nvkm_client(parent); struct nvkm_handle *handle; struct nvkm_dma *dma = device->dma; struct nvkm_dmaobj *dmaobj; struct nv50_disp_dmac *dmac; int ret; Loading @@ -221,14 +222,10 @@ nv50_disp_dmac_create_(struct nvkm_object *parent, if (ret) return ret; handle = nvkm_client_search(client, pushbuf); if (!handle) dmaobj = nvkm_dma_search(dma, client, pushbuf); if (!dmaobj) return -ENOENT; dmaobj = (void *)handle->object; switch (nv_mclass(dmaobj)) { case 0x0002: case 0x003d: if (dmaobj->limit - dmaobj->start != 0xfff) return -EINVAL; Loading @@ -242,10 +239,6 @@ nv50_disp_dmac_create_(struct nvkm_object *parent, default: return -EINVAL; } break; default: return -EINVAL; } return 0; } Loading