]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/nouveau/disp: split part of OR allocation logic into a function
authorBen Skeggs <bskeggs@redhat.com>
Wed, 3 Jun 2020 01:40:47 +0000 (11:40 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 4 Jun 2020 04:23:21 +0000 (14:23 +1000)
No logical changes here, this is just moving the code to make the
changes in the next commit more obvious.

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

index 1b1c6ff0e1bc80ae186035a4191cdf91a9210c37..b56224558a05b9f1612a972508a7fbcb8f43356a 100644 (file)
@@ -111,37 +111,18 @@ nvkm_outp_acquire_ior(struct nvkm_outp *outp, u8 user, struct nvkm_ior *ior)
        return 0;
 }
 
-int
-nvkm_outp_acquire(struct nvkm_outp *outp, u8 user, bool hda)
+static inline int
+nvkm_outp_acquire_hda(struct nvkm_outp *outp, enum nvkm_ior_type type,
+                     u8 user, bool hda)
 {
-       struct nvkm_ior *ior = outp->ior;
-       enum nvkm_ior_proto proto;
-       enum nvkm_ior_type type;
-
-       OUTP_TRACE(outp, "acquire %02x |= %02x %p", outp->acquired, user, ior);
-       if (ior) {
-               outp->acquired |= user;
-               return 0;
-       }
-
-       /* Lookup a compatible, and unused, OR to assign to the device. */
-       proto = nvkm_outp_xlat(outp, &type);
-       if (proto == UNKNOWN)
-               return -ENOSYS;
-
-       /* Deal with panels requiring identity-mapped SOR assignment. */
-       if (outp->identity) {
-               ior = nvkm_ior_find(outp->disp, SOR, ffs(outp->info.or) - 1);
-               if (WARN_ON(!ior))
-                       return -ENOSPC;
-               return nvkm_outp_acquire_ior(outp, user, ior);
-       }
+       struct nvkm_ior *ior;
 
        /* First preference is to reuse the OR that is currently armed
         * on HW, if any, in order to prevent unnecessary switching.
         */
        list_for_each_entry(ior, &outp->disp->ior, head) {
-               if (!ior->identity && !ior->asy.outp && ior->arm.outp == outp)
+               if (!ior->identity &&
+                   !ior->asy.outp && ior->arm.outp == outp)
                        return nvkm_outp_acquire_ior(outp, user, ior);
        }
 
@@ -157,7 +138,8 @@ nvkm_outp_acquire(struct nvkm_outp *outp, u8 user, bool hda)
         * but will be released during the next modeset.
         */
        list_for_each_entry(ior, &outp->disp->ior, head) {
-               if (!ior->identity && !ior->asy.outp && ior->type == type &&
+               if (!ior->identity &&
+                   !ior->asy.outp && ior->type == type &&
                    (ior->func->route.set || ior->id == __ffs(outp->info.or)))
                        return nvkm_outp_acquire_ior(outp, user, ior);
        }
@@ -165,6 +147,35 @@ nvkm_outp_acquire(struct nvkm_outp *outp, u8 user, bool hda)
        return -ENOSPC;
 }
 
+int
+nvkm_outp_acquire(struct nvkm_outp *outp, u8 user, bool hda)
+{
+       struct nvkm_ior *ior = outp->ior;
+       enum nvkm_ior_proto proto;
+       enum nvkm_ior_type type;
+
+       OUTP_TRACE(outp, "acquire %02x |= %02x %p", outp->acquired, user, ior);
+       if (ior) {
+               outp->acquired |= user;
+               return 0;
+       }
+
+       /* Lookup a compatible, and unused, OR to assign to the device. */
+       proto = nvkm_outp_xlat(outp, &type);
+       if (proto == UNKNOWN)
+               return -ENOSYS;
+
+       /* Deal with panels requiring identity-mapped SOR assignment. */
+       if (outp->identity) {
+               ior = nvkm_ior_find(outp->disp, SOR, ffs(outp->info.or) - 1);
+               if (WARN_ON(!ior))
+                       return -ENOSPC;
+               return nvkm_outp_acquire_ior(outp, user, ior);
+       }
+
+       return nvkm_outp_acquire_hda(outp, type, user, true);
+}
+
 void
 nvkm_outp_fini(struct nvkm_outp *outp)
 {