drm/nouveau: create userspace clients as subclients
authorBen Skeggs <bskeggs@redhat.com>
Mon, 23 May 2016 01:25:17 +0000 (11:25 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 17 Feb 2017 05:15:03 +0000 (15:15 +1000)
This will allow the DRM to share memory objects between clients later
down the track.

For the moment, the only immediate benefit is less logic required to
handle suspend/resume.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_drm.c

index e7a69d1..1e30398 100644 (file)
@@ -131,8 +131,13 @@ nouveau_cli_init(struct nouveau_drm *drm, const char *sname,
        mutex_init(&cli->mutex);
        usif_client_init(cli);
 
-       ret = nvif_driver_init(NULL, nouveau_config, nouveau_debug,
-                              cli->name, device, &cli->base);
+       if (cli == &drm->client) {
+               ret = nvif_driver_init(NULL, nouveau_config, nouveau_debug,
+                                      cli->name, device, &cli->base);
+       } else {
+               ret = nvif_client_init(&drm->client.base, cli->name, device,
+                                      &cli->base);
+       }
        if (ret) {
                NV_ERROR(drm, "Client allocation failed: %d\n", ret);
                goto done;
@@ -569,7 +574,6 @@ static int
 nouveau_do_suspend(struct drm_device *dev, bool runtime)
 {
        struct nouveau_drm *drm = nouveau_drm(dev);
-       struct nouveau_cli *cli;
        int ret;
 
        nouveau_led_suspend(dev);
@@ -599,7 +603,7 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime)
                        goto fail_display;
        }
 
-       NV_INFO(drm, "suspending client object trees...\n");
+       NV_INFO(drm, "suspending fence...\n");
        if (drm->fence && nouveau_fence(drm)->suspend) {
                if (!nouveau_fence(drm)->suspend(drm)) {
                        ret = -ENOMEM;
@@ -607,13 +611,7 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime)
                }
        }
 
-       list_for_each_entry(cli, &drm->clients, head) {
-               ret = nvif_client_suspend(&cli->base);
-               if (ret)
-                       goto fail_client;
-       }
-
-       NV_INFO(drm, "suspending kernel object tree...\n");
+       NV_INFO(drm, "suspending object tree...\n");
        ret = nvif_client_suspend(&drm->client.base);
        if (ret)
                goto fail_client;
@@ -621,10 +619,6 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime)
        return 0;
 
 fail_client:
-       list_for_each_entry_continue_reverse(cli, &drm->clients, head) {
-               nvif_client_resume(&cli->base);
-       }
-
        if (drm->fence && nouveau_fence(drm)->resume)
                nouveau_fence(drm)->resume(drm);
 
@@ -640,19 +634,14 @@ static int
 nouveau_do_resume(struct drm_device *dev, bool runtime)
 {
        struct nouveau_drm *drm = nouveau_drm(dev);
-       struct nouveau_cli *cli;
 
-       NV_INFO(drm, "resuming kernel object tree...\n");
+       NV_INFO(drm, "resuming object tree...\n");
        nvif_client_resume(&drm->client.base);
 
-       NV_INFO(drm, "resuming client object trees...\n");
+       NV_INFO(drm, "resuming fence...\n");
        if (drm->fence && nouveau_fence(drm)->resume)
                nouveau_fence(drm)->resume(drm);
 
-       list_for_each_entry(cli, &drm->clients, head) {
-               nvif_client_resume(&cli->base);
-       }
-
        nouveau_run_vbios_init(dev);
 
        if (dev->mode_config.num_crtc) {