drm/tegra: Allocate per-engine channel in core code
authorMikko Perttunen <mperttunen@nvidia.com>
Thu, 10 Jun 2021 11:04:50 +0000 (14:04 +0300)
committerThierry Reding <treding@nvidia.com>
Tue, 10 Aug 2021 12:49:03 +0000 (14:49 +0200)
To avoid code duplication, allocate the per-engine shared channel in
the core code instead. This is the usual channel that all jobs are
submitted to when MLOCKing is not in use. Once MLOCKs are implemented
on Host1x side, we can also update this to avoid allocating a shared
channel when MLOCKs are enabled.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/drm.c
drivers/gpu/drm/tegra/drm.h

index f7dc50e5f817e1cabce63a9d2db720a32af51338..00ac687c81b5a6b24c1c2b79594696bf3576d007 100644 (file)
@@ -870,6 +870,14 @@ static const struct drm_driver tegra_drm_driver = {
 int tegra_drm_register_client(struct tegra_drm *tegra,
                              struct tegra_drm_client *client)
 {
+       /*
+        * When MLOCKs are implemented, change to allocate a shared channel
+        * only when MLOCKs are disabled.
+        */
+       client->shared_channel = host1x_channel_request(&client->base);
+       if (!client->shared_channel)
+               return -EBUSY;
+
        mutex_lock(&tegra->clients_lock);
        list_add_tail(&client->list, &tegra->clients);
        client->drm = tegra;
@@ -886,6 +894,9 @@ int tegra_drm_unregister_client(struct tegra_drm *tegra,
        client->drm = NULL;
        mutex_unlock(&tegra->clients_lock);
 
+       if (client->shared_channel)
+               host1x_channel_put(client->shared_channel);
+
        return 0;
 }
 
index 0cb8680653483bbb5c49cdd390b0921c8fe7662a..536861017d242a7d3f4d9b8b26980ff0b52cb739 100644 (file)
@@ -91,7 +91,9 @@ struct tegra_drm_client {
        struct host1x_client base;
        struct list_head list;
        struct tegra_drm *drm;
+       struct host1x_channel *shared_channel;
 
+       /* Set by driver */
        unsigned int version;
        const struct tegra_drm_client_ops *ops;
 };