Loading drivers/gpu/drm/nouveau/nouveau_abi16.c +39 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <nvif/driver.h> #include <nvif/ioctl.h> #include <nvif/class.h> #include <nvif/unpack.h> #include "nouveau_drm.h" #include "nouveau_dma.h" Loading Loading @@ -346,6 +347,44 @@ nouveau_abi16_chan(struct nouveau_abi16 *abi16, int channel) return NULL; } int nouveau_abi16_usif(struct drm_file *file_priv, void *data, u32 size) { union { struct nvif_ioctl_v0 v0; } *args = data; struct nouveau_abi16_chan *chan; struct nouveau_abi16 *abi16; int ret; if (nvif_unpack(args->v0, 0, 0, true)) { switch (args->v0.type) { case NVIF_IOCTL_V0_NEW: case NVIF_IOCTL_V0_MTHD: case NVIF_IOCTL_V0_SCLASS: break; default: return -EACCES; } } else return ret; if (!(abi16 = nouveau_abi16(file_priv))) return -ENOMEM; if (args->v0.token != ~0ULL) { if (!(chan = nouveau_abi16_chan(abi16, args->v0.token))) return -EINVAL; args->v0.object = nvif_handle(&chan->chan->user); args->v0.owner = NVIF_IOCTL_V0_OWNER_ANY; return 0; } args->v0.object = nvif_handle(&abi16->device.object); args->v0.owner = NVIF_IOCTL_V0_OWNER_ANY; return 0; } int nouveau_abi16_ioctl_channel_free(ABI16_IOCTL_ARGS) { Loading drivers/gpu/drm/nouveau/nouveau_abi16.h +1 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ struct nouveau_abi16 *nouveau_abi16_get(struct drm_file *); int nouveau_abi16_put(struct nouveau_abi16 *, int); void nouveau_abi16_fini(struct nouveau_abi16 *); s32 nouveau_abi16_swclass(struct nouveau_drm *); int nouveau_abi16_usif(struct drm_file *, void *data, u32 size); #define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1) #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) Loading drivers/gpu/drm/nouveau/nouveau_usif.c +13 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include "nouveau_drm.h" #include "nouveau_usif.h" #include "nouveau_abi16.h" #include <nvif/notify.h> #include <nvif/unpack.h> Loading Loading @@ -316,11 +317,21 @@ usif_ioctl(struct drm_file *filp, void __user *user, u32 argc) } else goto done; /* USIF slightly abuses some return-only ioctl members in order * to provide interoperability with the older ABI16 objects */ mutex_lock(&cli->mutex); if (argv->v0.route) { if (ret = -EINVAL, argv->v0.route == 0xff) ret = nouveau_abi16_usif(filp, argv, argc); if (ret) { mutex_unlock(&cli->mutex); goto done; } } switch (argv->v0.type) { case NVIF_IOCTL_V0_NEW: /* ... except if we're creating children */ argv->v0.owner = NVIF_IOCTL_V0_OWNER_ANY; ret = usif_object_new(filp, data, size, argv, argc); break; case NVIF_IOCTL_V0_NTFY_NEW: Loading Loading
drivers/gpu/drm/nouveau/nouveau_abi16.c +39 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <nvif/driver.h> #include <nvif/ioctl.h> #include <nvif/class.h> #include <nvif/unpack.h> #include "nouveau_drm.h" #include "nouveau_dma.h" Loading Loading @@ -346,6 +347,44 @@ nouveau_abi16_chan(struct nouveau_abi16 *abi16, int channel) return NULL; } int nouveau_abi16_usif(struct drm_file *file_priv, void *data, u32 size) { union { struct nvif_ioctl_v0 v0; } *args = data; struct nouveau_abi16_chan *chan; struct nouveau_abi16 *abi16; int ret; if (nvif_unpack(args->v0, 0, 0, true)) { switch (args->v0.type) { case NVIF_IOCTL_V0_NEW: case NVIF_IOCTL_V0_MTHD: case NVIF_IOCTL_V0_SCLASS: break; default: return -EACCES; } } else return ret; if (!(abi16 = nouveau_abi16(file_priv))) return -ENOMEM; if (args->v0.token != ~0ULL) { if (!(chan = nouveau_abi16_chan(abi16, args->v0.token))) return -EINVAL; args->v0.object = nvif_handle(&chan->chan->user); args->v0.owner = NVIF_IOCTL_V0_OWNER_ANY; return 0; } args->v0.object = nvif_handle(&abi16->device.object); args->v0.owner = NVIF_IOCTL_V0_OWNER_ANY; return 0; } int nouveau_abi16_ioctl_channel_free(ABI16_IOCTL_ARGS) { Loading
drivers/gpu/drm/nouveau/nouveau_abi16.h +1 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ struct nouveau_abi16 *nouveau_abi16_get(struct drm_file *); int nouveau_abi16_put(struct nouveau_abi16 *, int); void nouveau_abi16_fini(struct nouveau_abi16 *); s32 nouveau_abi16_swclass(struct nouveau_drm *); int nouveau_abi16_usif(struct drm_file *, void *data, u32 size); #define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1) #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) Loading
drivers/gpu/drm/nouveau/nouveau_usif.c +13 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include "nouveau_drm.h" #include "nouveau_usif.h" #include "nouveau_abi16.h" #include <nvif/notify.h> #include <nvif/unpack.h> Loading Loading @@ -316,11 +317,21 @@ usif_ioctl(struct drm_file *filp, void __user *user, u32 argc) } else goto done; /* USIF slightly abuses some return-only ioctl members in order * to provide interoperability with the older ABI16 objects */ mutex_lock(&cli->mutex); if (argv->v0.route) { if (ret = -EINVAL, argv->v0.route == 0xff) ret = nouveau_abi16_usif(filp, argv, argc); if (ret) { mutex_unlock(&cli->mutex); goto done; } } switch (argv->v0.type) { case NVIF_IOCTL_V0_NEW: /* ... except if we're creating children */ argv->v0.owner = NVIF_IOCTL_V0_OWNER_ANY; ret = usif_object_new(filp, data, size, argv, argc); break; case NVIF_IOCTL_V0_NTFY_NEW: Loading