From: Terje Bergstrom <tbergstrom@nvidia.com>
To: thierry.reding@avionic-design.de, linux-tegra@vger.kernel.org,
dri-devel@lists.freedesktop.org
Cc: linux-kernel@vger.kernel.org,
Terje Bergstrom <tbergstrom@nvidia.com>,
Arto Merilainen <amerilainen@nvidia.com>
Subject: [RFC v2 8/8] drm: tegra: Add gr2d device
Date: Mon, 26 Nov 2012 15:19:14 +0200 [thread overview]
Message-ID: <1353935954-13763-9-git-send-email-tbergstrom@nvidia.com> (raw)
In-Reply-To: <1353935954-13763-1-git-send-email-tbergstrom@nvidia.com>
Add client driver for 2D device.
Signed-off-by: Arto Merilainen <amerilainen@nvidia.com>
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
---
drivers/gpu/drm/tegra/Makefile | 2 +-
drivers/gpu/drm/tegra/drm.c | 231 +++++++++++++++++++++++++++++++++++++++-
drivers/gpu/drm/tegra/drm.h | 42 ++++++--
drivers/gpu/drm/tegra/gr2d.c | 224 ++++++++++++++++++++++++++++++++++++++
include/drm/tegra_drm.h | 129 ++++++++++++++++++++++
5 files changed, 615 insertions(+), 13 deletions(-)
create mode 100644 drivers/gpu/drm/tegra/gr2d.c
create mode 100644 include/drm/tegra_drm.h
diff --git a/drivers/gpu/drm/tegra/Makefile b/drivers/gpu/drm/tegra/Makefile
index 53ea383..5e85042 100644
--- a/drivers/gpu/drm/tegra/Makefile
+++ b/drivers/gpu/drm/tegra/Makefile
@@ -1,7 +1,7 @@
ccflags-y := -Iinclude/drm
ccflags-$(CONFIG_DRM_TEGRA_DEBUG) += -DDEBUG
-tegra-drm-y := drm.o fb.o dc.o
+tegra-drm-y := drm.o fb.o dc.o gr2d.o
tegra-drm-y += output.o rgb.o hdmi.o tvo.o dsi.o
tegra-drm-y += plane.o dmabuf.o
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index f78a31b..c35e547 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -10,6 +10,7 @@
#include <linux/module.h>
#include <linux/of_address.h>
#include <linux/of_platform.h>
+#include <linux/nvhost.h>
#include <mach/clk.h>
#include <linux/dma-mapping.h>
@@ -55,10 +56,12 @@ static int tegra_drm_parse_dt(void)
"nvidia,tegra20-hdmi",
"nvidia,tegra20-tvo",
"nvidia,tegra20-dsi",
+ "nvidia,tegra20-gr2d",
"nvidia,tegra30-dc",
"nvidia,tegra30-hdmi",
"nvidia,tegra30-tvo",
- "nvidia,tegra30-dsi"
+ "nvidia,tegra30-dsi",
+ "nvidia,tegra30-gr2d"
};
unsigned int i;
int err;
@@ -177,7 +180,17 @@ static int tegra_drm_unload(struct drm_device *drm)
static int tegra_drm_open(struct drm_device *drm, struct drm_file *filp)
{
- return 0;
+ struct tegra_drm_fpriv *fpriv;
+ int err = 0;
+
+ fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
+ if (!fpriv)
+ return -ENOMEM;
+
+ INIT_LIST_HEAD(&fpriv->contexts);
+ filp->driver_priv = fpriv;
+
+ return err;
}
static void tegra_drm_lastclose(struct drm_device *drm)
@@ -207,8 +220,13 @@ static int __init tegra_drm_init(void)
if (err < 0)
goto unregister_tvo;
+ err = platform_driver_register(&tegra_gr2d_driver);
+ if (err < 0)
+ goto unregister_dsi;
return 0;
+unregister_dsi:
+ platform_driver_unregister(&tegra_dsi_driver);
unregister_tvo:
platform_driver_unregister(&tegra_tvo_driver);
unregister_hdmi:
@@ -221,6 +239,7 @@ module_init(tegra_drm_init);
static void __exit tegra_drm_exit(void)
{
+ platform_driver_unregister(&tegra_gr2d_driver);
platform_driver_unregister(&tegra_dsi_driver);
platform_driver_unregister(&tegra_tvo_driver);
platform_driver_unregister(&tegra_hdmi_driver);
@@ -232,7 +251,215 @@ MODULE_AUTHOR("Thierry Reding <thierry.reding@avionic-design.de>");
MODULE_DESCRIPTION("NVIDIA Tegra DRM driver");
MODULE_LICENSE("GPL");
+static int
+tegra_drm_ioctl_syncpt_read(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_syncpt_read_args *args = data;
+
+ dev_dbg(drm->dev, "> %s(drm=%p, id=%d)\n", __func__, drm, args->id);
+ args->value = host1x_syncpt_read(args->id);
+ dev_dbg(drm->dev, "< %s(value=%d)\n", __func__, args->value);
+ return 0;
+}
+
+static int
+tegra_drm_ioctl_syncpt_incr(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_syncpt_incr_args *args = data;
+ dev_dbg(drm->dev, "> %s(drm=%p, id=%d)\n", __func__, drm, args->id);
+ host1x_syncpt_incr(args->id);
+ dev_dbg(drm->dev, "< %s()\n", __func__);
+ return 0;
+}
+
+static int
+tegra_drm_ioctl_syncpt_wait(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_syncpt_wait_args *args = data;
+ int err;
+
+ dev_dbg(drm->dev, "> %s(drm=%p, id=%d, thresh=%d)\n", __func__, drm,
+ args->id, args->thresh);
+ err = host1x_syncpt_wait(args->id, args->thresh,
+ args->timeout, &args->value);
+ dev_dbg(drm->dev, "< %s() = %d\n", __func__, err);
+
+ return err;
+}
+
+static int
+tegra_drm_ioctl_open_channel(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_open_channel_args *args = data;
+ struct tegra_drm_client *client;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ dev_dbg(drm->dev, "> %s(fpriv=%p, class=%x)\n", __func__,
+ fpriv, args->class);
+
+ context = kzalloc(sizeof(*context), GFP_KERNEL);
+ if (!context) {
+ err = -ENOMEM;
+ goto out;
+ }
+
+ list_for_each_entry(client, &tegra_drm_subdrv_list, list) {
+ if (client->class == args->class) {
+ dev_dbg(drm->dev, "opening client %x\n", args->class);
+ context->client = client;
+ err = client->ops->open_channel(client, context);
+ if (err)
+ goto out;
+
+ dev_dbg(drm->dev, "context %p\n", context);
+ list_add(&context->list, &fpriv->contexts);
+ args->context = context;
+ goto out;
+ }
+ }
+ err = -ENODEV;
+
+out:
+ if (err)
+ kfree(context);
+
+ dev_dbg(drm->dev, "< %s() = %d\n", __func__, err);
+ return err;
+}
+
+static int
+tegra_drm_ioctl_close_channel(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_open_channel_args *args = data;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ dev_dbg(drm->dev, "> %s(fpriv=%p)\n", __func__, fpriv);
+ list_for_each_entry(context, &fpriv->contexts, list) {
+ if (context == args->context) {
+ context->client->ops->close_channel(context);
+ list_del(&context->list);
+ kfree(context);
+ goto out;
+ }
+ }
+ err = -EINVAL;
+
+out:
+ dev_dbg(drm->dev, "< %s() = %d\n", __func__, err);
+ return err;
+}
+
+static int
+tegra_drm_ioctl_get_syncpoints(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_get_channel_param_args *args = data;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ list_for_each_entry(context, &fpriv->contexts, list) {
+ if (context == args->context) {
+ args->value =
+ context->client->ops->get_syncpoints(context);
+ goto out;
+ }
+ }
+ err = -ENODEV;
+
+out:
+ return err;
+}
+
+static int
+tegra_drm_ioctl_get_modmutexes(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_get_channel_param_args *args = data;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ list_for_each_entry(context, &fpriv->contexts, list) {
+ if (context == args->context) {
+ args->value =
+ context->client->ops->get_modmutexes(context);
+ goto out;
+ }
+ }
+ err = -ENODEV;
+
+out:
+ return err;
+}
+
+static int
+tegra_drm_ioctl_submit(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_submit_args *args = data;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ list_for_each_entry(context, &fpriv->contexts, list) {
+ if (context == args->context) {
+ err = context->client->ops->submit(context, args);
+ goto out;
+ }
+ }
+ err = -ENODEV;
+
+out:
+ return err;
+
+}
+
+static int
+tegra_drm_create_ioctl(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_gem_create *args = data;
+ struct drm_gem_cma_object *cma_obj;
+ int ret;
+
+ cma_obj = drm_gem_cma_create(drm, args->size);
+ if (IS_ERR(cma_obj))
+ goto err_cma_create;
+
+ ret = drm_gem_handle_create(file_priv, &cma_obj->base, &args->handle);
+ if (ret)
+ goto err_handle_create;
+
+ drm_gem_object_unreference(&cma_obj->base);
+
+ return 0;
+
+err_handle_create:
+ drm_gem_cma_free_object(&cma_obj->base);
+err_cma_create:
+ return -ENOMEM;
+}
+
static struct drm_ioctl_desc tegra_drm_ioctls[] = {
+ DRM_IOCTL_DEF_DRV(TEGRA_GEM_CREATE, tegra_drm_create_ioctl, DRM_UNLOCKED | DRM_AUTH),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_SYNCPT_READ, tegra_drm_ioctl_syncpt_read, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_SYNCPT_INCR, tegra_drm_ioctl_syncpt_incr, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_SYNCPT_WAIT, tegra_drm_ioctl_syncpt_wait, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_OPEN_CHANNEL, tegra_drm_ioctl_open_channel, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_CLOSE_CHANNEL, tegra_drm_ioctl_close_channel, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_GET_SYNCPOINTS, tegra_drm_ioctl_get_syncpoints, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_GET_MODMUTEXES, tegra_drm_ioctl_get_modmutexes, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_SUBMIT, tegra_drm_ioctl_submit, DRM_UNLOCKED),
};
static const struct file_operations tegra_drm_fops = {
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index 1267a38..db197f6 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -20,6 +20,7 @@
#include <drm/drm_gem_cma_helper.h>
#include <drm/drm_fb_cma_helper.h>
#include <drm/drm_fixed.h>
+#include <drm/tegra_drm.h>
struct tegra_framebuffer {
struct drm_framebuffer base;
@@ -33,17 +34,44 @@ static inline struct tegra_framebuffer *to_tegra_fb(struct drm_framebuffer *fb)
struct tegra_drm_client;
+struct tegra_drm_context {
+ struct tegra_drm_client *client;
+ struct nvhost_channel *channel;
+ struct list_head list;
+};
+
struct tegra_drm_client_ops {
- int (*drm_init)(struct tegra_drm_client *client,
- struct drm_device *drm);
- int (*drm_exit)(struct tegra_drm_client *client);
+ int (*drm_init)(struct tegra_drm_client *, struct drm_device *);
+ int (*drm_exit)(struct tegra_drm_client *);
+ int (*open_channel)(struct tegra_drm_client *,
+ struct tegra_drm_context *);
+ void (*close_channel)(struct tegra_drm_context *);
+ u32 (*get_syncpoints)(struct tegra_drm_context *);
+ u32 (*get_waitbases)(struct tegra_drm_context *);
+ u32 (*get_modmutexes)(struct tegra_drm_context *);
+ int (*submit)(struct tegra_drm_context *,
+ struct tegra_drm_submit_args *);
+};
+
+
+struct tegra_drm_fpriv {
+ struct list_head contexts;
};
+static inline struct tegra_drm_fpriv *
+tegra_drm_fpriv(struct drm_file *file_priv)
+{
+ return file_priv ? file_priv->driver_priv : NULL;
+}
+
struct tegra_drm_client {
struct device *dev;
const struct tegra_drm_client_ops *ops;
+ u32 class;
+ struct nvhost_channel *channel;
+
struct list_head list;
};
@@ -116,13 +144,6 @@ struct tegra_output_ops {
enum drm_mode_status *status);
};
-enum tegra_output_type {
- TEGRA_OUTPUT_RGB,
- TEGRA_OUTPUT_HDMI,
- TEGRA_OUTPUT_TVO,
- TEGRA_OUTPUT_DSI,
-};
-
struct tegra_output {
struct device_node *of_node;
struct device *dev;
@@ -225,6 +246,7 @@ extern struct platform_driver tegra_hdmi_driver;
extern struct platform_driver tegra_tvo_driver;
extern struct platform_driver tegra_dsi_driver;
extern struct platform_driver tegra_dc_driver;
+extern struct platform_driver tegra_gr2d_driver;
extern struct drm_driver tegra_drm_driver;
/* from dmabuf.c */
diff --git a/drivers/gpu/drm/tegra/gr2d.c b/drivers/gpu/drm/tegra/gr2d.c
new file mode 100644
index 0000000..51605af
--- /dev/null
+++ b/drivers/gpu/drm/tegra/gr2d.c
@@ -0,0 +1,224 @@
+/*
+ * drivers/video/tegra/host/gr2d/gr2d.c
+ *
+ * Tegra Graphics 2D
+ *
+ * Copyright (c) 2012, NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/export.h>
+#include <linux/of.h>
+#include <drm/tegra_drm.h>
+#include <linux/nvhost.h>
+#include "drm.h"
+
+static struct tegra_drm_client gr2d_client;
+
+static int gr2d_client_init(struct tegra_drm_client *client,
+ struct drm_device *drm)
+{
+ return 0;
+}
+
+static int gr2d_client_exit(struct tegra_drm_client *client)
+{
+ return 0;
+}
+
+static int gr2d_open_channel(struct tegra_drm_client *client,
+ struct tegra_drm_context *context)
+{
+ struct nvhost_device_data *pdata = dev_get_drvdata(client->dev);
+ context->channel = nvhost_getchannel(pdata->channel);
+
+ if (!context->channel)
+ return -ENOMEM;
+
+ return 0;
+}
+
+static void gr2d_close_channel(struct tegra_drm_context *context)
+{
+ nvhost_putchannel(context->channel);
+}
+
+static u32 gr2d_get_syncpoints(struct tegra_drm_context *context)
+{
+ struct nvhost_device_data *pdata =
+ dev_get_drvdata(context->client->dev);
+ return pdata->syncpts;
+}
+
+static u32 gr2d_get_modmutexes(struct tegra_drm_context *context)
+{
+ struct nvhost_device_data *pdata =
+ dev_get_drvdata(context->client->dev);
+ return pdata->modulemutexes;
+}
+
+static int gr2d_submit(struct tegra_drm_context *context,
+ struct tegra_drm_submit_args *args)
+{
+ struct nvhost_job *job;
+ int num_cmdbufs = args->num_cmdbufs;
+ int num_relocs = args->num_relocs;
+ int num_waitchks = args->num_waitchks;
+ struct tegra_drm_cmdbuf __user *cmdbufs = args->cmdbufs;
+ struct tegra_drm_reloc __user *relocs = args->relocs;
+ struct tegra_drm_waitchk __user *waitchks = args->waitchks;
+ struct tegra_drm_syncpt_incr syncpt_incr;
+ int err;
+
+ dev_dbg(context->client->dev, "> %s(context=%p, cmdbufs=%d, relocs=%d, waitchks=%d)\n",
+ __func__, context,
+ num_cmdbufs, num_relocs, num_waitchks);
+
+ /* We don't yet support other than one syncpt_incr struct per submit */
+ if (args->num_syncpt_incrs != 1)
+ return -EINVAL;
+
+ job = nvhost_job_alloc(context->channel,
+ args->num_cmdbufs,
+ args->num_relocs,
+ args->num_waitchks);
+ if (!job)
+ return -ENOMEM;
+
+ job->num_relocs = args->num_relocs;
+ job->num_waitchk = args->num_waitchks;
+ job->clientid = (u32)args->context;
+
+ while (num_cmdbufs) {
+ struct tegra_drm_cmdbuf cmdbuf;
+ err = copy_from_user(&cmdbuf, cmdbufs, sizeof(cmdbuf));
+ if (err)
+ goto fail;
+ dev_dbg(context->client->dev, "cmdbuf: mem=%08x, words=%d, offset=%d\n",
+ cmdbuf.mem, cmdbuf.words, cmdbuf.offset);
+ nvhost_job_add_gather(job,
+ cmdbuf.mem, cmdbuf.words, cmdbuf.offset);
+ num_cmdbufs--;
+ cmdbufs++;
+ }
+
+ err = copy_from_user(job->relocarray,
+ relocs, sizeof(*relocs) * num_relocs);
+ if (err)
+ goto fail;
+
+ err = copy_from_user(job->waitchk,
+ relocs, sizeof(*waitchks) * num_waitchks);
+ if (err)
+ goto fail;
+
+ err = nvhost_job_pin(job, to_platform_device(context->client->dev));
+ if (err)
+ goto fail;
+
+ err = copy_from_user(&syncpt_incr,
+ args->syncpt_incrs, sizeof(syncpt_incr));
+ if (err)
+ goto fail;
+
+ job->syncpt_id = syncpt_incr.syncpt_id;
+ job->syncpt_incrs = syncpt_incr.syncpt_incrs;
+ job->timeout = 10000;
+ if (args->timeout && args->timeout < 10000)
+ job->timeout = args->timeout;
+
+ err = nvhost_channel_submit(job);
+ if (err)
+ goto fail_submit;
+
+ args->fence = job->syncpt_end;
+
+ nvhost_job_put(job);
+ dev_dbg(context->client->dev, "< %s(context=%p)\n", __func__, context);
+ return 0;
+
+fail_submit:
+ nvhost_job_unpin(job);
+fail:
+ nvhost_job_put(job);
+ dev_dbg(context->client->dev,
+ "< %s(context=%p) = %d\n", __func__, context, err);
+ return err;
+}
+
+static struct tegra_drm_client_ops gr2d_client_ops = {
+ .drm_init = gr2d_client_init,
+ .drm_exit = gr2d_client_exit,
+ .open_channel = gr2d_open_channel,
+ .close_channel = gr2d_close_channel,
+ .get_syncpoints = gr2d_get_syncpoints,
+ .get_modmutexes = gr2d_get_modmutexes,
+ .submit = gr2d_submit,
+};
+
+static int __devinit gr2d_probe(struct platform_device *dev)
+{
+ int err;
+ struct nvhost_device_data *pdata =
+ (struct nvhost_device_data *)dev->dev.platform_data;
+ pdata->pdev = dev;
+ platform_set_drvdata(dev, pdata);
+ err = nvhost_client_device_init(dev);
+ if (err)
+ return err;
+
+ gr2d_client.ops = &gr2d_client_ops;
+ gr2d_client.dev = &dev->dev;
+ gr2d_client.class = NV_GRAPHICS_2D_CLASS_ID;
+ return tegra_drm_register_client(&gr2d_client);
+}
+
+static int __exit gr2d_remove(struct platform_device *dev)
+{
+ /* Add clean-up */
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int gr2d_suspend(struct platform_device *dev, pm_message_t state)
+{
+ return nvhost_client_device_suspend(dev);
+}
+
+static int gr2d_resume(struct platform_device *dev)
+{
+ dev_info(&dev->dev, "resuming\n");
+ return 0;
+}
+#endif
+
+static struct of_device_id gr2d_match[] __devinitdata = {
+ { .compatible = "nvidia,tegra20-gr2d", },
+ { .compatible = "nvidia,tegra30-gr2d", },
+ { },
+};
+
+struct platform_driver tegra_gr2d_driver = {
+ .probe = gr2d_probe,
+ .remove = __exit_p(gr2d_remove),
+#ifdef CONFIG_PM
+ .suspend = gr2d_suspend,
+ .resume = gr2d_resume,
+#endif
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "tegra-gr2d",
+ .of_match_table = of_match_ptr(gr2d_match),
+ }
+};
diff --git a/include/drm/tegra_drm.h b/include/drm/tegra_drm.h
new file mode 100644
index 0000000..bfc54d8
--- /dev/null
+++ b/include/drm/tegra_drm.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2012, Avionic Design GmbH
+ * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _TEGRA_DRM_H_
+#define _TEGRA_DRM_H_
+
+enum tegra_output_type {
+ TEGRA_OUTPUT_RGB,
+ TEGRA_OUTPUT_HDMI,
+ TEGRA_OUTPUT_TVO,
+ TEGRA_OUTPUT_DSI,
+};
+
+struct tegra_gem_create {
+ uint64_t size;
+ unsigned int flags;
+ unsigned int handle;
+};
+
+#define DRM_TEGRA_GEM_CREATE 0x00
+
+#define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + \
+ DRM_TEGRA_GEM_CREATE, struct tegra_gem_create)
+
+struct tegra_drm_syncpt_read_args {
+ __u32 id;
+ __u32 value;
+};
+
+struct tegra_drm_syncpt_incr_args {
+ __u32 id;
+};
+
+struct tegra_drm_syncpt_wait_args {
+ __u32 id;
+ __u32 thresh;
+ __s32 timeout;
+ __u32 value;
+};
+
+#define DRM_TEGRA_NO_TIMEOUT (-1)
+
+struct tegra_drm_open_channel_args {
+ __u32 class;
+ void *context;
+};
+
+struct tegra_drm_get_channel_param_args {
+ void *context;
+ __u32 value;
+};
+
+struct tegra_drm_syncpt_incr {
+ __u32 syncpt_id;
+ __u32 syncpt_incrs;
+};
+
+struct tegra_drm_cmdbuf {
+ __u32 mem;
+ __u32 offset;
+ __u32 words;
+};
+
+struct tegra_drm_reloc {
+ __u32 cmdbuf_mem;
+ __u32 cmdbuf_offset;
+ __u32 target;
+ __u32 target_offset;
+ __u32 shift;
+};
+
+struct tegra_drm_waitchk {
+ __u32 mem;
+ __u32 offset;
+ __u32 syncpt_id;
+ __u32 thresh;
+};
+
+struct tegra_drm_submit_args {
+ void *context;
+ __u32 num_syncpt_incrs;
+ __u32 num_cmdbufs;
+ __u32 num_relocs;
+ __u32 submit_version;
+ __u32 num_waitchks;
+ __u32 waitchk_mask;
+ __u32 timeout;
+ struct tegra_drm_syncpt_incrs *syncpt_incrs;
+ struct tegra_drm_cmdbuf *cmdbufs;
+ struct tegra_drm_reloc *relocs;
+ struct tegra_drm_waitchk *waitchks;
+
+ __u32 pad[5]; /* future expansion */
+ __u32 fence; /* Return value */
+};
+
+#define DRM_TEGRA_DRM_SYNCPT_READ 0x01
+#define DRM_TEGRA_DRM_SYNCPT_INCR 0x02
+#define DRM_TEGRA_DRM_SYNCPT_WAIT 0x03
+#define DRM_TEGRA_DRM_OPEN_CHANNEL 0x04
+#define DRM_TEGRA_DRM_CLOSE_CHANNEL 0x05
+#define DRM_TEGRA_DRM_GET_SYNCPOINTS 0x06
+#define DRM_TEGRA_DRM_GET_MODMUTEXES 0x07
+#define DRM_TEGRA_DRM_SUBMIT 0x08
+
+#define DRM_IOCTL_TEGRA_DRM_SYNCPT_READ DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_SYNCPT_READ, struct tegra_drm_syncpt_read_args)
+#define DRM_IOCTL_TEGRA_DRM_SYNCPT_INCR DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_SYNCPT_INCR, struct tegra_drm_syncpt_incr_args)
+#define DRM_IOCTL_TEGRA_DRM_SYNCPT_WAIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_SYNCPT_WAIT, struct tegra_drm_syncpt_wait_args)
+#define DRM_IOCTL_TEGRA_DRM_OPEN_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_OPEN_CHANNEL, struct tegra_drm_open_channel_args)
+#define DRM_IOCTL_TEGRA_DRM_CLOSE_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_CLOSE_CHANNEL, struct tegra_drm_open_channel_args)
+#define DRM_IOCTL_TEGRA_DRM_GET_SYNCPOINTS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_GET_SYNCPOINTS, struct tegra_drm_get_channel_param_args)
+#define DRM_IOCTL_TEGRA_DRM_GET_MODMUTEXES DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_GET_MODMUTEXES, struct tegra_drm_get_channel_param_args)
+#define DRM_IOCTL_TEGRA_DRM_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_SUBMIT, struct tegra_drm_submit_args)
+
+#endif
--
1.7.9.5
WARNING: multiple messages have this Message-ID (diff)
From: Terje Bergstrom <tbergstrom@nvidia.com>
To: <thierry.reding@avionic-design.de>, <linux-tegra@vger.kernel.org>,
<dri-devel@lists.freedesktop.org>
Cc: <linux-kernel@vger.kernel.org>,
Terje Bergstrom <tbergstrom@nvidia.com>,
Arto Merilainen <amerilainen@nvidia.com>
Subject: [RFC v2 8/8] drm: tegra: Add gr2d device
Date: Mon, 26 Nov 2012 15:19:14 +0200 [thread overview]
Message-ID: <1353935954-13763-9-git-send-email-tbergstrom@nvidia.com> (raw)
In-Reply-To: <1353935954-13763-1-git-send-email-tbergstrom@nvidia.com>
Add client driver for 2D device.
Signed-off-by: Arto Merilainen <amerilainen@nvidia.com>
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
---
drivers/gpu/drm/tegra/Makefile | 2 +-
drivers/gpu/drm/tegra/drm.c | 231 +++++++++++++++++++++++++++++++++++++++-
drivers/gpu/drm/tegra/drm.h | 42 ++++++--
drivers/gpu/drm/tegra/gr2d.c | 224 ++++++++++++++++++++++++++++++++++++++
include/drm/tegra_drm.h | 129 ++++++++++++++++++++++
5 files changed, 615 insertions(+), 13 deletions(-)
create mode 100644 drivers/gpu/drm/tegra/gr2d.c
create mode 100644 include/drm/tegra_drm.h
diff --git a/drivers/gpu/drm/tegra/Makefile b/drivers/gpu/drm/tegra/Makefile
index 53ea383..5e85042 100644
--- a/drivers/gpu/drm/tegra/Makefile
+++ b/drivers/gpu/drm/tegra/Makefile
@@ -1,7 +1,7 @@
ccflags-y := -Iinclude/drm
ccflags-$(CONFIG_DRM_TEGRA_DEBUG) += -DDEBUG
-tegra-drm-y := drm.o fb.o dc.o
+tegra-drm-y := drm.o fb.o dc.o gr2d.o
tegra-drm-y += output.o rgb.o hdmi.o tvo.o dsi.o
tegra-drm-y += plane.o dmabuf.o
diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c
index f78a31b..c35e547 100644
--- a/drivers/gpu/drm/tegra/drm.c
+++ b/drivers/gpu/drm/tegra/drm.c
@@ -10,6 +10,7 @@
#include <linux/module.h>
#include <linux/of_address.h>
#include <linux/of_platform.h>
+#include <linux/nvhost.h>
#include <mach/clk.h>
#include <linux/dma-mapping.h>
@@ -55,10 +56,12 @@ static int tegra_drm_parse_dt(void)
"nvidia,tegra20-hdmi",
"nvidia,tegra20-tvo",
"nvidia,tegra20-dsi",
+ "nvidia,tegra20-gr2d",
"nvidia,tegra30-dc",
"nvidia,tegra30-hdmi",
"nvidia,tegra30-tvo",
- "nvidia,tegra30-dsi"
+ "nvidia,tegra30-dsi",
+ "nvidia,tegra30-gr2d"
};
unsigned int i;
int err;
@@ -177,7 +180,17 @@ static int tegra_drm_unload(struct drm_device *drm)
static int tegra_drm_open(struct drm_device *drm, struct drm_file *filp)
{
- return 0;
+ struct tegra_drm_fpriv *fpriv;
+ int err = 0;
+
+ fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
+ if (!fpriv)
+ return -ENOMEM;
+
+ INIT_LIST_HEAD(&fpriv->contexts);
+ filp->driver_priv = fpriv;
+
+ return err;
}
static void tegra_drm_lastclose(struct drm_device *drm)
@@ -207,8 +220,13 @@ static int __init tegra_drm_init(void)
if (err < 0)
goto unregister_tvo;
+ err = platform_driver_register(&tegra_gr2d_driver);
+ if (err < 0)
+ goto unregister_dsi;
return 0;
+unregister_dsi:
+ platform_driver_unregister(&tegra_dsi_driver);
unregister_tvo:
platform_driver_unregister(&tegra_tvo_driver);
unregister_hdmi:
@@ -221,6 +239,7 @@ module_init(tegra_drm_init);
static void __exit tegra_drm_exit(void)
{
+ platform_driver_unregister(&tegra_gr2d_driver);
platform_driver_unregister(&tegra_dsi_driver);
platform_driver_unregister(&tegra_tvo_driver);
platform_driver_unregister(&tegra_hdmi_driver);
@@ -232,7 +251,215 @@ MODULE_AUTHOR("Thierry Reding <thierry.reding@avionic-design.de>");
MODULE_DESCRIPTION("NVIDIA Tegra DRM driver");
MODULE_LICENSE("GPL");
+static int
+tegra_drm_ioctl_syncpt_read(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_syncpt_read_args *args = data;
+
+ dev_dbg(drm->dev, "> %s(drm=%p, id=%d)\n", __func__, drm, args->id);
+ args->value = host1x_syncpt_read(args->id);
+ dev_dbg(drm->dev, "< %s(value=%d)\n", __func__, args->value);
+ return 0;
+}
+
+static int
+tegra_drm_ioctl_syncpt_incr(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_syncpt_incr_args *args = data;
+ dev_dbg(drm->dev, "> %s(drm=%p, id=%d)\n", __func__, drm, args->id);
+ host1x_syncpt_incr(args->id);
+ dev_dbg(drm->dev, "< %s()\n", __func__);
+ return 0;
+}
+
+static int
+tegra_drm_ioctl_syncpt_wait(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_syncpt_wait_args *args = data;
+ int err;
+
+ dev_dbg(drm->dev, "> %s(drm=%p, id=%d, thresh=%d)\n", __func__, drm,
+ args->id, args->thresh);
+ err = host1x_syncpt_wait(args->id, args->thresh,
+ args->timeout, &args->value);
+ dev_dbg(drm->dev, "< %s() = %d\n", __func__, err);
+
+ return err;
+}
+
+static int
+tegra_drm_ioctl_open_channel(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_open_channel_args *args = data;
+ struct tegra_drm_client *client;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ dev_dbg(drm->dev, "> %s(fpriv=%p, class=%x)\n", __func__,
+ fpriv, args->class);
+
+ context = kzalloc(sizeof(*context), GFP_KERNEL);
+ if (!context) {
+ err = -ENOMEM;
+ goto out;
+ }
+
+ list_for_each_entry(client, &tegra_drm_subdrv_list, list) {
+ if (client->class == args->class) {
+ dev_dbg(drm->dev, "opening client %x\n", args->class);
+ context->client = client;
+ err = client->ops->open_channel(client, context);
+ if (err)
+ goto out;
+
+ dev_dbg(drm->dev, "context %p\n", context);
+ list_add(&context->list, &fpriv->contexts);
+ args->context = context;
+ goto out;
+ }
+ }
+ err = -ENODEV;
+
+out:
+ if (err)
+ kfree(context);
+
+ dev_dbg(drm->dev, "< %s() = %d\n", __func__, err);
+ return err;
+}
+
+static int
+tegra_drm_ioctl_close_channel(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_open_channel_args *args = data;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ dev_dbg(drm->dev, "> %s(fpriv=%p)\n", __func__, fpriv);
+ list_for_each_entry(context, &fpriv->contexts, list) {
+ if (context == args->context) {
+ context->client->ops->close_channel(context);
+ list_del(&context->list);
+ kfree(context);
+ goto out;
+ }
+ }
+ err = -EINVAL;
+
+out:
+ dev_dbg(drm->dev, "< %s() = %d\n", __func__, err);
+ return err;
+}
+
+static int
+tegra_drm_ioctl_get_syncpoints(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_get_channel_param_args *args = data;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ list_for_each_entry(context, &fpriv->contexts, list) {
+ if (context == args->context) {
+ args->value =
+ context->client->ops->get_syncpoints(context);
+ goto out;
+ }
+ }
+ err = -ENODEV;
+
+out:
+ return err;
+}
+
+static int
+tegra_drm_ioctl_get_modmutexes(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_get_channel_param_args *args = data;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ list_for_each_entry(context, &fpriv->contexts, list) {
+ if (context == args->context) {
+ args->value =
+ context->client->ops->get_modmutexes(context);
+ goto out;
+ }
+ }
+ err = -ENODEV;
+
+out:
+ return err;
+}
+
+static int
+tegra_drm_ioctl_submit(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_drm_submit_args *args = data;
+ struct tegra_drm_context *context;
+ struct tegra_drm_fpriv *fpriv = tegra_drm_fpriv(file_priv);
+ int err = 0;
+
+ list_for_each_entry(context, &fpriv->contexts, list) {
+ if (context == args->context) {
+ err = context->client->ops->submit(context, args);
+ goto out;
+ }
+ }
+ err = -ENODEV;
+
+out:
+ return err;
+
+}
+
+static int
+tegra_drm_create_ioctl(struct drm_device *drm, void *data,
+ struct drm_file *file_priv)
+{
+ struct tegra_gem_create *args = data;
+ struct drm_gem_cma_object *cma_obj;
+ int ret;
+
+ cma_obj = drm_gem_cma_create(drm, args->size);
+ if (IS_ERR(cma_obj))
+ goto err_cma_create;
+
+ ret = drm_gem_handle_create(file_priv, &cma_obj->base, &args->handle);
+ if (ret)
+ goto err_handle_create;
+
+ drm_gem_object_unreference(&cma_obj->base);
+
+ return 0;
+
+err_handle_create:
+ drm_gem_cma_free_object(&cma_obj->base);
+err_cma_create:
+ return -ENOMEM;
+}
+
static struct drm_ioctl_desc tegra_drm_ioctls[] = {
+ DRM_IOCTL_DEF_DRV(TEGRA_GEM_CREATE, tegra_drm_create_ioctl, DRM_UNLOCKED | DRM_AUTH),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_SYNCPT_READ, tegra_drm_ioctl_syncpt_read, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_SYNCPT_INCR, tegra_drm_ioctl_syncpt_incr, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_SYNCPT_WAIT, tegra_drm_ioctl_syncpt_wait, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_OPEN_CHANNEL, tegra_drm_ioctl_open_channel, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_CLOSE_CHANNEL, tegra_drm_ioctl_close_channel, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_GET_SYNCPOINTS, tegra_drm_ioctl_get_syncpoints, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_GET_MODMUTEXES, tegra_drm_ioctl_get_modmutexes, DRM_UNLOCKED),
+ DRM_IOCTL_DEF_DRV(TEGRA_DRM_SUBMIT, tegra_drm_ioctl_submit, DRM_UNLOCKED),
};
static const struct file_operations tegra_drm_fops = {
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index 1267a38..db197f6 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -20,6 +20,7 @@
#include <drm/drm_gem_cma_helper.h>
#include <drm/drm_fb_cma_helper.h>
#include <drm/drm_fixed.h>
+#include <drm/tegra_drm.h>
struct tegra_framebuffer {
struct drm_framebuffer base;
@@ -33,17 +34,44 @@ static inline struct tegra_framebuffer *to_tegra_fb(struct drm_framebuffer *fb)
struct tegra_drm_client;
+struct tegra_drm_context {
+ struct tegra_drm_client *client;
+ struct nvhost_channel *channel;
+ struct list_head list;
+};
+
struct tegra_drm_client_ops {
- int (*drm_init)(struct tegra_drm_client *client,
- struct drm_device *drm);
- int (*drm_exit)(struct tegra_drm_client *client);
+ int (*drm_init)(struct tegra_drm_client *, struct drm_device *);
+ int (*drm_exit)(struct tegra_drm_client *);
+ int (*open_channel)(struct tegra_drm_client *,
+ struct tegra_drm_context *);
+ void (*close_channel)(struct tegra_drm_context *);
+ u32 (*get_syncpoints)(struct tegra_drm_context *);
+ u32 (*get_waitbases)(struct tegra_drm_context *);
+ u32 (*get_modmutexes)(struct tegra_drm_context *);
+ int (*submit)(struct tegra_drm_context *,
+ struct tegra_drm_submit_args *);
+};
+
+
+struct tegra_drm_fpriv {
+ struct list_head contexts;
};
+static inline struct tegra_drm_fpriv *
+tegra_drm_fpriv(struct drm_file *file_priv)
+{
+ return file_priv ? file_priv->driver_priv : NULL;
+}
+
struct tegra_drm_client {
struct device *dev;
const struct tegra_drm_client_ops *ops;
+ u32 class;
+ struct nvhost_channel *channel;
+
struct list_head list;
};
@@ -116,13 +144,6 @@ struct tegra_output_ops {
enum drm_mode_status *status);
};
-enum tegra_output_type {
- TEGRA_OUTPUT_RGB,
- TEGRA_OUTPUT_HDMI,
- TEGRA_OUTPUT_TVO,
- TEGRA_OUTPUT_DSI,
-};
-
struct tegra_output {
struct device_node *of_node;
struct device *dev;
@@ -225,6 +246,7 @@ extern struct platform_driver tegra_hdmi_driver;
extern struct platform_driver tegra_tvo_driver;
extern struct platform_driver tegra_dsi_driver;
extern struct platform_driver tegra_dc_driver;
+extern struct platform_driver tegra_gr2d_driver;
extern struct drm_driver tegra_drm_driver;
/* from dmabuf.c */
diff --git a/drivers/gpu/drm/tegra/gr2d.c b/drivers/gpu/drm/tegra/gr2d.c
new file mode 100644
index 0000000..51605af
--- /dev/null
+++ b/drivers/gpu/drm/tegra/gr2d.c
@@ -0,0 +1,224 @@
+/*
+ * drivers/video/tegra/host/gr2d/gr2d.c
+ *
+ * Tegra Graphics 2D
+ *
+ * Copyright (c) 2012, NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/export.h>
+#include <linux/of.h>
+#include <drm/tegra_drm.h>
+#include <linux/nvhost.h>
+#include "drm.h"
+
+static struct tegra_drm_client gr2d_client;
+
+static int gr2d_client_init(struct tegra_drm_client *client,
+ struct drm_device *drm)
+{
+ return 0;
+}
+
+static int gr2d_client_exit(struct tegra_drm_client *client)
+{
+ return 0;
+}
+
+static int gr2d_open_channel(struct tegra_drm_client *client,
+ struct tegra_drm_context *context)
+{
+ struct nvhost_device_data *pdata = dev_get_drvdata(client->dev);
+ context->channel = nvhost_getchannel(pdata->channel);
+
+ if (!context->channel)
+ return -ENOMEM;
+
+ return 0;
+}
+
+static void gr2d_close_channel(struct tegra_drm_context *context)
+{
+ nvhost_putchannel(context->channel);
+}
+
+static u32 gr2d_get_syncpoints(struct tegra_drm_context *context)
+{
+ struct nvhost_device_data *pdata =
+ dev_get_drvdata(context->client->dev);
+ return pdata->syncpts;
+}
+
+static u32 gr2d_get_modmutexes(struct tegra_drm_context *context)
+{
+ struct nvhost_device_data *pdata =
+ dev_get_drvdata(context->client->dev);
+ return pdata->modulemutexes;
+}
+
+static int gr2d_submit(struct tegra_drm_context *context,
+ struct tegra_drm_submit_args *args)
+{
+ struct nvhost_job *job;
+ int num_cmdbufs = args->num_cmdbufs;
+ int num_relocs = args->num_relocs;
+ int num_waitchks = args->num_waitchks;
+ struct tegra_drm_cmdbuf __user *cmdbufs = args->cmdbufs;
+ struct tegra_drm_reloc __user *relocs = args->relocs;
+ struct tegra_drm_waitchk __user *waitchks = args->waitchks;
+ struct tegra_drm_syncpt_incr syncpt_incr;
+ int err;
+
+ dev_dbg(context->client->dev, "> %s(context=%p, cmdbufs=%d, relocs=%d, waitchks=%d)\n",
+ __func__, context,
+ num_cmdbufs, num_relocs, num_waitchks);
+
+ /* We don't yet support other than one syncpt_incr struct per submit */
+ if (args->num_syncpt_incrs != 1)
+ return -EINVAL;
+
+ job = nvhost_job_alloc(context->channel,
+ args->num_cmdbufs,
+ args->num_relocs,
+ args->num_waitchks);
+ if (!job)
+ return -ENOMEM;
+
+ job->num_relocs = args->num_relocs;
+ job->num_waitchk = args->num_waitchks;
+ job->clientid = (u32)args->context;
+
+ while (num_cmdbufs) {
+ struct tegra_drm_cmdbuf cmdbuf;
+ err = copy_from_user(&cmdbuf, cmdbufs, sizeof(cmdbuf));
+ if (err)
+ goto fail;
+ dev_dbg(context->client->dev, "cmdbuf: mem=%08x, words=%d, offset=%d\n",
+ cmdbuf.mem, cmdbuf.words, cmdbuf.offset);
+ nvhost_job_add_gather(job,
+ cmdbuf.mem, cmdbuf.words, cmdbuf.offset);
+ num_cmdbufs--;
+ cmdbufs++;
+ }
+
+ err = copy_from_user(job->relocarray,
+ relocs, sizeof(*relocs) * num_relocs);
+ if (err)
+ goto fail;
+
+ err = copy_from_user(job->waitchk,
+ relocs, sizeof(*waitchks) * num_waitchks);
+ if (err)
+ goto fail;
+
+ err = nvhost_job_pin(job, to_platform_device(context->client->dev));
+ if (err)
+ goto fail;
+
+ err = copy_from_user(&syncpt_incr,
+ args->syncpt_incrs, sizeof(syncpt_incr));
+ if (err)
+ goto fail;
+
+ job->syncpt_id = syncpt_incr.syncpt_id;
+ job->syncpt_incrs = syncpt_incr.syncpt_incrs;
+ job->timeout = 10000;
+ if (args->timeout && args->timeout < 10000)
+ job->timeout = args->timeout;
+
+ err = nvhost_channel_submit(job);
+ if (err)
+ goto fail_submit;
+
+ args->fence = job->syncpt_end;
+
+ nvhost_job_put(job);
+ dev_dbg(context->client->dev, "< %s(context=%p)\n", __func__, context);
+ return 0;
+
+fail_submit:
+ nvhost_job_unpin(job);
+fail:
+ nvhost_job_put(job);
+ dev_dbg(context->client->dev,
+ "< %s(context=%p) = %d\n", __func__, context, err);
+ return err;
+}
+
+static struct tegra_drm_client_ops gr2d_client_ops = {
+ .drm_init = gr2d_client_init,
+ .drm_exit = gr2d_client_exit,
+ .open_channel = gr2d_open_channel,
+ .close_channel = gr2d_close_channel,
+ .get_syncpoints = gr2d_get_syncpoints,
+ .get_modmutexes = gr2d_get_modmutexes,
+ .submit = gr2d_submit,
+};
+
+static int __devinit gr2d_probe(struct platform_device *dev)
+{
+ int err;
+ struct nvhost_device_data *pdata =
+ (struct nvhost_device_data *)dev->dev.platform_data;
+ pdata->pdev = dev;
+ platform_set_drvdata(dev, pdata);
+ err = nvhost_client_device_init(dev);
+ if (err)
+ return err;
+
+ gr2d_client.ops = &gr2d_client_ops;
+ gr2d_client.dev = &dev->dev;
+ gr2d_client.class = NV_GRAPHICS_2D_CLASS_ID;
+ return tegra_drm_register_client(&gr2d_client);
+}
+
+static int __exit gr2d_remove(struct platform_device *dev)
+{
+ /* Add clean-up */
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int gr2d_suspend(struct platform_device *dev, pm_message_t state)
+{
+ return nvhost_client_device_suspend(dev);
+}
+
+static int gr2d_resume(struct platform_device *dev)
+{
+ dev_info(&dev->dev, "resuming\n");
+ return 0;
+}
+#endif
+
+static struct of_device_id gr2d_match[] __devinitdata = {
+ { .compatible = "nvidia,tegra20-gr2d", },
+ { .compatible = "nvidia,tegra30-gr2d", },
+ { },
+};
+
+struct platform_driver tegra_gr2d_driver = {
+ .probe = gr2d_probe,
+ .remove = __exit_p(gr2d_remove),
+#ifdef CONFIG_PM
+ .suspend = gr2d_suspend,
+ .resume = gr2d_resume,
+#endif
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "tegra-gr2d",
+ .of_match_table = of_match_ptr(gr2d_match),
+ }
+};
diff --git a/include/drm/tegra_drm.h b/include/drm/tegra_drm.h
new file mode 100644
index 0000000..bfc54d8
--- /dev/null
+++ b/include/drm/tegra_drm.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2012, Avionic Design GmbH
+ * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _TEGRA_DRM_H_
+#define _TEGRA_DRM_H_
+
+enum tegra_output_type {
+ TEGRA_OUTPUT_RGB,
+ TEGRA_OUTPUT_HDMI,
+ TEGRA_OUTPUT_TVO,
+ TEGRA_OUTPUT_DSI,
+};
+
+struct tegra_gem_create {
+ uint64_t size;
+ unsigned int flags;
+ unsigned int handle;
+};
+
+#define DRM_TEGRA_GEM_CREATE 0x00
+
+#define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + \
+ DRM_TEGRA_GEM_CREATE, struct tegra_gem_create)
+
+struct tegra_drm_syncpt_read_args {
+ __u32 id;
+ __u32 value;
+};
+
+struct tegra_drm_syncpt_incr_args {
+ __u32 id;
+};
+
+struct tegra_drm_syncpt_wait_args {
+ __u32 id;
+ __u32 thresh;
+ __s32 timeout;
+ __u32 value;
+};
+
+#define DRM_TEGRA_NO_TIMEOUT (-1)
+
+struct tegra_drm_open_channel_args {
+ __u32 class;
+ void *context;
+};
+
+struct tegra_drm_get_channel_param_args {
+ void *context;
+ __u32 value;
+};
+
+struct tegra_drm_syncpt_incr {
+ __u32 syncpt_id;
+ __u32 syncpt_incrs;
+};
+
+struct tegra_drm_cmdbuf {
+ __u32 mem;
+ __u32 offset;
+ __u32 words;
+};
+
+struct tegra_drm_reloc {
+ __u32 cmdbuf_mem;
+ __u32 cmdbuf_offset;
+ __u32 target;
+ __u32 target_offset;
+ __u32 shift;
+};
+
+struct tegra_drm_waitchk {
+ __u32 mem;
+ __u32 offset;
+ __u32 syncpt_id;
+ __u32 thresh;
+};
+
+struct tegra_drm_submit_args {
+ void *context;
+ __u32 num_syncpt_incrs;
+ __u32 num_cmdbufs;
+ __u32 num_relocs;
+ __u32 submit_version;
+ __u32 num_waitchks;
+ __u32 waitchk_mask;
+ __u32 timeout;
+ struct tegra_drm_syncpt_incrs *syncpt_incrs;
+ struct tegra_drm_cmdbuf *cmdbufs;
+ struct tegra_drm_reloc *relocs;
+ struct tegra_drm_waitchk *waitchks;
+
+ __u32 pad[5]; /* future expansion */
+ __u32 fence; /* Return value */
+};
+
+#define DRM_TEGRA_DRM_SYNCPT_READ 0x01
+#define DRM_TEGRA_DRM_SYNCPT_INCR 0x02
+#define DRM_TEGRA_DRM_SYNCPT_WAIT 0x03
+#define DRM_TEGRA_DRM_OPEN_CHANNEL 0x04
+#define DRM_TEGRA_DRM_CLOSE_CHANNEL 0x05
+#define DRM_TEGRA_DRM_GET_SYNCPOINTS 0x06
+#define DRM_TEGRA_DRM_GET_MODMUTEXES 0x07
+#define DRM_TEGRA_DRM_SUBMIT 0x08
+
+#define DRM_IOCTL_TEGRA_DRM_SYNCPT_READ DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_SYNCPT_READ, struct tegra_drm_syncpt_read_args)
+#define DRM_IOCTL_TEGRA_DRM_SYNCPT_INCR DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_SYNCPT_INCR, struct tegra_drm_syncpt_incr_args)
+#define DRM_IOCTL_TEGRA_DRM_SYNCPT_WAIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_SYNCPT_WAIT, struct tegra_drm_syncpt_wait_args)
+#define DRM_IOCTL_TEGRA_DRM_OPEN_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_OPEN_CHANNEL, struct tegra_drm_open_channel_args)
+#define DRM_IOCTL_TEGRA_DRM_CLOSE_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_CLOSE_CHANNEL, struct tegra_drm_open_channel_args)
+#define DRM_IOCTL_TEGRA_DRM_GET_SYNCPOINTS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_GET_SYNCPOINTS, struct tegra_drm_get_channel_param_args)
+#define DRM_IOCTL_TEGRA_DRM_GET_MODMUTEXES DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_GET_MODMUTEXES, struct tegra_drm_get_channel_param_args)
+#define DRM_IOCTL_TEGRA_DRM_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_DRM_SUBMIT, struct tegra_drm_submit_args)
+
+#endif
--
1.7.9.5
next prev parent reply other threads:[~2012-11-26 13:19 UTC|newest]
Thread overview: 273+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-26 13:19 [RFC v2 0/8] Support for Tegra 2D hardware Terje Bergstrom
2012-11-26 13:19 ` Terje Bergstrom
2012-11-26 13:19 ` [RFC v2 1/8] video: tegra: Add nvhost driver Terje Bergstrom
2012-11-26 13:19 ` Terje Bergstrom
[not found] ` <1353935954-13763-2-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-27 10:52 ` Sivaram Nair
2012-11-27 10:52 ` Sivaram Nair
2012-11-28 21:23 ` Thierry Reding
[not found] ` <20121128212301.GA25531-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-11-29 10:21 ` Terje Bergström
2012-11-29 10:21 ` Terje Bergström
[not found] ` <50B73710.2040102-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-29 11:47 ` Thierry Reding
2012-11-29 11:47 ` Thierry Reding
[not found] ` <20121129114704.GB6150-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-11-29 18:38 ` Stephen Warren
2012-11-29 18:38 ` Stephen Warren
2012-11-30 6:52 ` Thierry Reding
2012-11-30 6:52 ` Thierry Reding
2012-11-30 8:50 ` Lucas Stach
2012-11-30 8:50 ` Lucas Stach
2012-12-01 11:44 ` Terje Bergström
2012-12-01 11:44 ` Terje Bergström
[not found] ` <50B9EDA9.2000500-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-01 15:10 ` Thierry Reding
2012-12-01 15:10 ` Thierry Reding
[not found] ` <20121201151020.GC18209-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-01 16:55 ` Terje Bergström
2012-12-01 16:55 ` Terje Bergström
[not found] ` <50BA3668.1010504-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-01 17:34 ` Lucas Stach
2012-12-01 17:34 ` Lucas Stach
2012-12-01 19:29 ` Terje Bergström
[not found] ` <50BA5AB2.8000604-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-01 21:42 ` Dave Airlie
2012-12-01 21:42 ` Dave Airlie
[not found] ` <CAPM=9tzUYkMZhwReSDLxvMYvgDmXukajm8EMqtzqmcNeD+oMAw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-12-01 22:39 ` Thierry Reding
2012-12-01 22:39 ` Thierry Reding
2012-12-02 11:24 ` Terje Bergström
2012-12-02 11:24 ` Terje Bergström
[not found] ` <50BB3A5D.6070304-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-02 20:55 ` Thierry Reding
2012-12-02 20:55 ` Thierry Reding
[not found] ` <20121202205527.GA22086-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-03 6:26 ` Terje Bergström
2012-12-03 6:26 ` Terje Bergström
2012-11-30 8:56 ` Terje Bergström
2012-11-30 8:56 ` Terje Bergström
[not found] ` <50B874C7.5030208-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-30 10:38 ` Thierry Reding
2012-11-30 10:38 ` Thierry Reding
[not found] ` <20121130103850.GA28367-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-01 11:31 ` Terje Bergström
2012-12-01 11:31 ` Terje Bergström
2012-12-01 13:42 ` Daniel Vetter
[not found] ` <CAKMK7uGnm7M5ad=aeCNiFLYXbJZ9Nx-vsGrstjt5_3BcrqWVqA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-12-01 16:22 ` Terje Bergström
2012-12-01 16:22 ` Terje Bergström
[not found] ` <50B9EA76.10803-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-01 14:58 ` Thierry Reding
2012-12-01 14:58 ` Thierry Reding
[not found] ` <20121201145814.GB18209-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-01 17:13 ` Terje Bergström
2012-12-01 17:13 ` Terje Bergström
2012-12-03 19:23 ` Stephen Warren
2012-12-03 19:23 ` Stephen Warren
[not found] ` <50BCFC34.5030203-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-12-04 21:31 ` Thierry Reding
2012-12-04 21:31 ` Thierry Reding
2012-12-03 19:20 ` Stephen Warren
2012-12-03 19:20 ` Stephen Warren
2012-12-03 21:03 ` Thierry Reding
[not found] ` <20121203210328.GA20884-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-04 2:08 ` Mark Zhang
2012-12-04 2:08 ` Mark Zhang
2012-12-04 2:11 ` Mark Zhang
2012-12-04 2:11 ` Mark Zhang
2012-12-04 6:17 ` Terje Bergström
2012-11-29 18:34 ` Stephen Warren
2012-11-29 18:34 ` Stephen Warren
2012-11-30 6:54 ` Terje Bergström
2012-11-30 6:54 ` Terje Bergström
2012-11-30 6:53 ` Thierry Reding
2012-11-30 6:53 ` Thierry Reding
2012-11-29 9:10 ` [RFC,v2,1/8] " Mark Zhang
2012-11-29 9:10 ` Mark Zhang
2012-12-10 10:28 ` Terje Bergström
[not found] ` <1353935954-13763-1-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-26 13:19 ` [RFC v2 2/8] video: tegra: Add syncpoint wait and interrupts Terje Bergstrom
2012-11-26 13:19 ` Terje Bergstrom
2012-11-27 11:02 ` Sivaram Nair
2012-11-29 8:44 ` Thierry Reding
2012-11-29 8:44 ` Thierry Reding
[not found] ` <20121129084400.GA28781-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-11-29 10:39 ` Terje Bergström
2012-11-29 10:39 ` Terje Bergström
2012-11-30 7:22 ` Thierry Reding
[not found] ` <20121130072200.GE26474-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-11-30 7:41 ` Terje Bergström
2012-11-30 7:41 ` Terje Bergström
2012-11-29 18:41 ` Stephen Warren
2012-11-29 18:41 ` Stephen Warren
2012-11-30 7:23 ` Thierry Reding
2012-11-30 7:23 ` Thierry Reding
2012-11-26 13:19 ` [RFC v2 3/8] video: tegra: host: Add channel and client support Terje Bergstrom
2012-11-26 13:19 ` Terje Bergstrom
[not found] ` <1353935954-13763-4-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-29 10:01 ` [RFC,v2,3/8] " Mark Zhang
2012-11-29 10:01 ` Mark Zhang
[not found] ` <50B7325F.20002-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-11-29 10:46 ` Terje Bergström
2012-11-29 10:46 ` Terje Bergström
2012-11-30 6:13 ` Mark Zhang
2012-11-29 10:04 ` [RFC v2 3/8] " Thierry Reding
2012-11-29 10:04 ` Thierry Reding
[not found] ` <20121129100405.GB28781-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-11-29 11:00 ` Terje Bergström
2012-11-29 11:00 ` Terje Bergström
[not found] ` <50B74058.9020904-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-30 7:46 ` Thierry Reding
2012-11-30 7:46 ` Thierry Reding
2012-11-26 13:19 ` [RFC v2 4/8] video: tegra: Add debug support Terje Bergstrom
2012-11-26 13:19 ` Terje Bergstrom
2012-11-26 13:19 ` [RFC v2 6/8] gpu: drm: tegra: Remove redundant host1x Terje Bergstrom
2012-11-26 13:19 ` Terje Bergstrom
[not found] ` <1353935954-13763-7-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-05 8:33 ` Thierry Reding
2012-12-05 8:33 ` Thierry Reding
[not found] ` <20121205083335.GA20984-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-05 10:10 ` Terje Bergström
2012-12-05 10:10 ` Terje Bergström
[not found] ` <50BF1DAA.8030805-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-05 11:13 ` Thierry Reding
2012-12-05 11:13 ` Thierry Reding
[not found] ` <20121205111332.GA25676-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-05 11:47 ` Terje Bergström
2012-12-05 11:47 ` Terje Bergström
[not found] ` <50BF345A.8050201-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-05 12:02 ` Lucas Stach
2012-12-05 12:02 ` Lucas Stach
2012-12-05 12:04 ` Thierry Reding
2012-12-05 12:04 ` Thierry Reding
[not found] ` <20121205120429.GA29943-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-05 15:43 ` Terje Bergström
2012-12-05 15:43 ` Terje Bergström
2012-12-10 11:42 ` Terje Bergström
2012-12-10 11:42 ` Terje Bergström
[not found] ` <50C5CAB5.3040000-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-12 16:08 ` Thierry Reding
2012-12-12 16:08 ` Thierry Reding
[not found] ` <20121212160829.GA30278-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-12 16:56 ` Terje Bergström
2012-12-12 16:56 ` Terje Bergström
2012-12-13 8:48 ` Terje Bergström
2012-12-13 8:48 ` Terje Bergström
2012-12-13 8:57 ` Thierry Reding
[not found] ` <20121213085750.GA14740-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-13 17:58 ` Stephen Warren
2012-12-13 17:58 ` Stephen Warren
[not found] ` <50CA175F.60002-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-12-13 20:32 ` Thierry Reding
2012-12-13 20:32 ` Thierry Reding
2012-12-14 6:09 ` Terje Bergström
2012-12-14 6:09 ` Terje Bergström
2012-12-14 16:21 ` Stephen Warren
[not found] ` <50CB5205.1030303-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-12-14 19:59 ` Terje Bergström
2012-12-14 19:59 ` Terje Bergström
[not found] ` <50CB850F.9090704-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-16 12:16 ` Thierry Reding
2012-12-16 12:16 ` Thierry Reding
[not found] ` <20121216121603.GA31780-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-16 16:37 ` Terje Bergström
2012-12-16 16:37 ` Terje Bergström
[not found] ` <50CDF8C4.4070108-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-17 20:55 ` Stephen Warren
2012-12-17 20:55 ` Stephen Warren
[not found] ` <50CF86D1.7090303-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-12-18 6:37 ` Terje Bergström
2012-12-18 6:37 ` Terje Bergström
2012-12-20 9:17 ` Terje Bergström
2012-12-20 9:17 ` Terje Bergström
[not found] ` <50D2D792.1050401-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 17:14 ` Stephen Warren
2012-12-20 17:14 ` Stephen Warren
[not found] ` <50D34775.5010606-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-12-20 17:46 ` Terje Bergström
2012-12-20 17:46 ` Terje Bergström
[not found] ` <50D34F00.4080308-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 17:55 ` Stephen Warren
2012-12-20 17:55 ` Stephen Warren
[not found] ` <50D3511F.2090308-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-12-20 18:01 ` Terje Bergström
2012-12-20 18:01 ` Terje Bergström
[not found] ` <50D35287.3040509-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 20:30 ` Thierry Reding
2012-12-20 20:30 ` Thierry Reding
[not found] ` <20121220203059.GA12977-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-20 21:34 ` Terje Bergström
2012-12-20 21:34 ` Terje Bergström
[not found] ` <50D38462.3060302-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-20 21:50 ` Thierry Reding
2012-12-20 21:50 ` Thierry Reding
[not found] ` <20121220215008.GA30491-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-20 22:29 ` Stephen Warren
2012-12-20 22:29 ` Stephen Warren
2012-12-20 22:28 ` Stephen Warren
2012-12-20 22:28 ` Stephen Warren
[not found] ` <50D39122.3060401-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-12-21 6:31 ` Terje Bergström
2012-12-21 6:31 ` Terje Bergström
2012-12-21 8:57 ` Arto Merilainen
2012-12-21 8:57 ` Arto Merilainen
[not found] ` <50D42486.7080901-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-12-21 21:19 ` Stephen Warren
2012-12-21 21:19 ` Stephen Warren
[not found] ` <50D4D25B.7030506-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-01-02 5:41 ` Terje Bergström
2013-01-02 5:41 ` Terje Bergström
2013-01-04 10:09 ` Terje Bergström
2013-01-04 10:09 ` Terje Bergström
[not found] ` <50E6AA69.4030001-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-01-04 20:25 ` Stephen Warren
2013-01-04 20:25 ` Stephen Warren
[not found] ` <50E73AA2.7090500-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-01-07 8:20 ` Terje Bergström
2013-01-07 8:20 ` Terje Bergström
[not found] ` <50EA8533.3020109-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-01-07 17:07 ` Stephen Warren
2013-01-07 17:07 ` Stephen Warren
2013-01-15 11:30 ` Thierry Reding
2013-01-15 11:30 ` Thierry Reding
[not found] ` <20130115113049.GB18119-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2013-01-15 11:41 ` Terje Bergström
2013-01-15 11:41 ` Terje Bergström
2012-12-05 12:03 ` Daniel Vetter
[not found] ` <CAKMK7uGPf=TEW8DL-K1KYPhMZALTZhFsSb2DBxDVgFct1kUjSA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-12-05 12:08 ` Daniel Vetter
2012-12-05 12:08 ` Daniel Vetter
2012-12-05 12:22 ` Thierry Reding
2012-12-05 12:22 ` Thierry Reding
[not found] ` <20121205122209.GB29943-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-05 12:31 ` Daniel Vetter
2012-12-05 12:31 ` Daniel Vetter
[not found] ` <CAKMK7uFy=Hkqqqom=yOZ8dgSGjRT4JCJuJK7coJ+i=OyovKcYQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-12-05 13:28 ` Thierry Reding
2012-12-05 13:28 ` Thierry Reding
[not found] ` <20121205132843.GA2834-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-05 16:34 ` Daniel Vetter
2012-12-05 16:34 ` Daniel Vetter
[not found] ` <CAKMK7uG2OHOmH8OJJmZ4uoNWwoeA0wRyiE4VdR9C3ajC1ZBZDw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-12-05 20:44 ` Thierry Reding
2012-12-05 20:44 ` Thierry Reding
2012-11-26 13:19 ` [RFC v2 7/8] gpu: drm: tegra: Prime support Terje Bergstrom
2012-11-26 13:19 ` Terje Bergstrom
2012-12-01 14:45 ` [RFC v2 0/8] Support for Tegra 2D hardware Thierry Reding
2012-12-01 14:45 ` Thierry Reding
[not found] ` <20121201144512.GA18209-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-12-01 17:08 ` Terje Bergström
2012-12-01 17:08 ` Terje Bergström
2012-12-01 19:29 ` Thierry Reding
2012-11-26 13:19 ` [RFC v2 5/8] ARM: tegra: Add auxiliary data for nvhost Terje Bergstrom
2012-11-26 13:19 ` Terje Bergstrom
[not found] ` <1353935954-13763-6-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-26 23:39 ` Stephen Warren
2012-11-26 23:39 ` Stephen Warren
[not found] ` <50B3FDCC.7080709-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-11-27 6:33 ` Terje Bergström
2012-11-27 6:33 ` Terje Bergström
[not found] ` <50B45EA8.7000502-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-27 17:17 ` Stephen Warren
2012-11-27 17:17 ` Stephen Warren
2012-11-26 13:19 ` Terje Bergstrom [this message]
2012-11-26 13:19 ` [RFC v2 8/8] drm: tegra: Add gr2d device Terje Bergstrom
[not found] ` <1353935954-13763-9-git-send-email-tbergstrom-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-26 21:59 ` Rob Clark
2012-11-26 21:59 ` Rob Clark
2012-11-26 22:15 ` Dave Airlie
2012-11-26 22:15 ` Dave Airlie
[not found] ` <CAPM=9tzvt3J6D3zLPV97w629q62CNhAxX8V+_JZ6kmXxxz5fVg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-11-27 6:52 ` Terje Bergström
2012-11-27 6:52 ` Terje Bergström
[not found] ` <50B46336.8030605-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-27 7:33 ` Dave Airlie
2012-11-27 7:33 ` Dave Airlie
[not found] ` <CAPM=9txCuPJcFAfD7Hu5o2BVFK=pVah7B8HhG0ctLCyFPwNEnA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-11-27 8:16 ` Terje Bergström
2012-11-27 8:16 ` Terje Bergström
[not found] ` <50B476E1.4070403-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-27 8:32 ` Dave Airlie
2012-11-27 8:32 ` Dave Airlie
[not found] ` <CAPM=9tysiK6LgnQdAwGSYfxnQfgcfRm0+X2tPSAEDxUPt-QZGA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-11-27 8:45 ` Terje Bergström
2012-11-27 8:45 ` Terje Bergström
[not found] ` <50B47DA8.60609-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-27 10:22 ` Lucas Stach
2012-11-27 10:22 ` Lucas Stach
2012-11-27 10:37 ` Thierry Reding
2012-11-27 10:37 ` Thierry Reding
[not found] ` <20121127103739.GA3329-RM9K5IK7kjIyiCvfTdI0JKcOhU4Rzj621B7CTYaBSLdn68oJJulU0Q@public.gmane.org>
2012-11-27 11:31 ` Terje Bergström
2012-11-27 11:31 ` Terje Bergström
[not found] ` <50B4A483.8030305-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-27 11:47 ` Lucas Stach
2012-11-27 11:47 ` Lucas Stach
2012-11-27 12:59 ` Terje Bergström
2012-11-27 12:59 ` Terje Bergström
2012-11-27 23:00 ` Dave Airlie
2012-11-27 23:00 ` Dave Airlie
[not found] ` <CAPM=9tz=_0Drx3=Me3EQdPgBvYVGzs6Gnqaw6RBaTLsCG24RAg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-11-28 13:17 ` Terje Bergström
2012-11-28 13:17 ` Terje Bergström
[not found] ` <50B60EFF.1050703-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-28 13:33 ` Lucas Stach
2012-11-28 13:33 ` Lucas Stach
2012-11-28 13:57 ` Terje Bergström
2012-11-28 13:57 ` Terje Bergström
2012-11-28 14:06 ` Lucas Stach
2012-11-28 14:45 ` Terje Bergström
2012-11-28 14:45 ` Terje Bergström
[not found] ` <50B6237B.8010808-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-28 15:13 ` Lucas Stach
2012-11-28 15:13 ` Lucas Stach
2012-11-28 16:23 ` Terje Bergström
2012-11-28 16:23 ` Terje Bergström
[not found] ` <50B63A70.8020107-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-28 18:46 ` Lucas Stach
2012-11-28 18:46 ` Lucas Stach
2012-11-29 8:17 ` Terje Bergström
2012-11-29 8:17 ` Terje Bergström
[not found] ` <50B71A28.5060807-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-11-29 9:09 ` Lucas Stach
2012-11-29 9:09 ` Lucas Stach
2012-11-29 12:14 ` Thierry Reding
2012-11-29 12:14 ` Thierry Reding
2012-11-30 7:44 ` Terje Bergström
2012-11-30 7:44 ` Terje Bergström
2012-11-30 7:53 ` Lucas Stach
2012-11-29 13:36 ` Terje Bergström
2012-11-29 13:36 ` Terje Bergström
2012-11-28 16:24 ` Stephen Warren
2012-11-28 20:53 ` Thomas Hellstrom
2012-11-28 20:53 ` Thomas Hellstrom
2012-12-03 9:30 ` Mark Zhang
2012-12-03 9:30 ` Mark Zhang
2012-12-03 9:40 ` Daniel Vetter
[not found] ` <CAKMK7uF-sQ-HzA2Zek4VzWky=69LA3JqJR_+kyRQEO-JgwPQXQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-12-04 1:49 ` Mark Zhang
2012-12-04 1:49 ` Mark Zhang
2012-11-29 7:37 ` [RFC,v2,8/8] " Mark Zhang
2012-11-29 7:37 ` Mark Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1353935954-13763-9-git-send-email-tbergstrom@nvidia.com \
--to=tbergstrom@nvidia.com \
--cc=amerilainen@nvidia.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=thierry.reding@avionic-design.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.