|
@@ -29,9 +29,12 @@
|
|
|
* - 1.0.0 - initial interface
|
|
|
* - 1.1.0 - adds madvise, and support for submits with > 4 cmd buffers
|
|
|
* - 1.2.0 - adds explicit fence support for submit ioctl
|
|
|
+ * - 1.3.0 - adds GMEM_BASE + NR_RINGS params, SUBMITQUEUE_NEW +
|
|
|
+ * SUBMITQUEUE_CLOSE ioctls, and MSM_INFO_IOVA flag for
|
|
|
+ * MSM_GEM_INFO ioctl.
|
|
|
*/
|
|
|
#define MSM_VERSION_MAJOR 1
|
|
|
-#define MSM_VERSION_MINOR 2
|
|
|
+#define MSM_VERSION_MINOR 3
|
|
|
#define MSM_VERSION_PATCHLEVEL 0
|
|
|
|
|
|
static void msm_fb_output_poll_changed(struct drm_device *dev)
|
|
@@ -504,24 +507,37 @@ static void load_gpu(struct drm_device *dev)
|
|
|
mutex_unlock(&init_lock);
|
|
|
}
|
|
|
|
|
|
-static int msm_open(struct drm_device *dev, struct drm_file *file)
|
|
|
+static int context_init(struct drm_file *file)
|
|
|
{
|
|
|
struct msm_file_private *ctx;
|
|
|
|
|
|
- /* For now, load gpu on open.. to avoid the requirement of having
|
|
|
- * firmware in the initrd.
|
|
|
- */
|
|
|
- load_gpu(dev);
|
|
|
-
|
|
|
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
|
|
|
if (!ctx)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ msm_submitqueue_init(ctx);
|
|
|
+
|
|
|
file->driver_priv = ctx;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int msm_open(struct drm_device *dev, struct drm_file *file)
|
|
|
+{
|
|
|
+ /* For now, load gpu on open.. to avoid the requirement of having
|
|
|
+ * firmware in the initrd.
|
|
|
+ */
|
|
|
+ load_gpu(dev);
|
|
|
+
|
|
|
+ return context_init(file);
|
|
|
+}
|
|
|
+
|
|
|
+static void context_close(struct msm_file_private *ctx)
|
|
|
+{
|
|
|
+ msm_submitqueue_close(ctx);
|
|
|
+ kfree(ctx);
|
|
|
+}
|
|
|
+
|
|
|
static void msm_postclose(struct drm_device *dev, struct drm_file *file)
|
|
|
{
|
|
|
struct msm_drm_private *priv = dev->dev_private;
|
|
@@ -532,7 +548,7 @@ static void msm_postclose(struct drm_device *dev, struct drm_file *file)
|
|
|
priv->lastctx = NULL;
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
|
|
|
- kfree(ctx);
|
|
|
+ context_close(ctx);
|
|
|
}
|
|
|
|
|
|
static void msm_lastclose(struct drm_device *dev)
|
|
@@ -777,6 +793,28 @@ unlock:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+static int msm_ioctl_submitqueue_new(struct drm_device *dev, void *data,
|
|
|
+ struct drm_file *file)
|
|
|
+{
|
|
|
+ struct drm_msm_submitqueue *args = data;
|
|
|
+
|
|
|
+ if (args->flags & ~MSM_SUBMITQUEUE_FLAGS)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return msm_submitqueue_create(file->driver_priv, args->prio,
|
|
|
+ args->flags, &args->id);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int msm_ioctl_submitqueue_close(struct drm_device *dev, void *data,
|
|
|
+ struct drm_file *file)
|
|
|
+{
|
|
|
+ u32 id = *(u32 *) data;
|
|
|
+
|
|
|
+ return msm_submitqueue_remove(file->driver_priv, id);
|
|
|
+}
|
|
|
+
|
|
|
static const struct drm_ioctl_desc msm_ioctls[] = {
|
|
|
DRM_IOCTL_DEF_DRV(MSM_GET_PARAM, msm_ioctl_get_param, DRM_AUTH|DRM_RENDER_ALLOW),
|
|
|
DRM_IOCTL_DEF_DRV(MSM_GEM_NEW, msm_ioctl_gem_new, DRM_AUTH|DRM_RENDER_ALLOW),
|
|
@@ -786,6 +824,8 @@ static const struct drm_ioctl_desc msm_ioctls[] = {
|
|
|
DRM_IOCTL_DEF_DRV(MSM_GEM_SUBMIT, msm_ioctl_gem_submit, DRM_AUTH|DRM_RENDER_ALLOW),
|
|
|
DRM_IOCTL_DEF_DRV(MSM_WAIT_FENCE, msm_ioctl_wait_fence, DRM_AUTH|DRM_RENDER_ALLOW),
|
|
|
DRM_IOCTL_DEF_DRV(MSM_GEM_MADVISE, msm_ioctl_gem_madvise, DRM_AUTH|DRM_RENDER_ALLOW),
|
|
|
+ DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_NEW, msm_ioctl_submitqueue_new, DRM_AUTH|DRM_RENDER_ALLOW),
|
|
|
+ DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_CLOSE, msm_ioctl_submitqueue_close, DRM_AUTH|DRM_RENDER_ALLOW),
|
|
|
};
|
|
|
|
|
|
static const struct vm_operations_struct vm_ops = {
|