|
@@ -129,17 +129,26 @@ nvkm_outp_acquire(struct nvkm_outp *outp, u8 user)
|
|
if (proto == UNKNOWN)
|
|
if (proto == UNKNOWN)
|
|
return -ENOSYS;
|
|
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);
|
|
|
|
+ }
|
|
|
|
+
|
|
/* First preference is to reuse the OR that is currently armed
|
|
/* First preference is to reuse the OR that is currently armed
|
|
* on HW, if any, in order to prevent unnecessary switching.
|
|
* on HW, if any, in order to prevent unnecessary switching.
|
|
*/
|
|
*/
|
|
list_for_each_entry(ior, &outp->disp->ior, head) {
|
|
list_for_each_entry(ior, &outp->disp->ior, head) {
|
|
- if (!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);
|
|
return nvkm_outp_acquire_ior(outp, user, ior);
|
|
}
|
|
}
|
|
|
|
|
|
/* Failing that, a completely unused OR is the next best thing. */
|
|
/* Failing that, a completely unused OR is the next best thing. */
|
|
list_for_each_entry(ior, &outp->disp->ior, head) {
|
|
list_for_each_entry(ior, &outp->disp->ior, head) {
|
|
- if (!ior->asy.outp && ior->type == type && !ior->arm.outp &&
|
|
|
|
|
|
+ if (!ior->identity &&
|
|
|
|
+ !ior->asy.outp && ior->type == type && !ior->arm.outp &&
|
|
(ior->func->route.set || ior->id == __ffs(outp->info.or)))
|
|
(ior->func->route.set || ior->id == __ffs(outp->info.or)))
|
|
return nvkm_outp_acquire_ior(outp, user, ior);
|
|
return nvkm_outp_acquire_ior(outp, user, ior);
|
|
}
|
|
}
|
|
@@ -148,7 +157,7 @@ nvkm_outp_acquire(struct nvkm_outp *outp, u8 user)
|
|
* but will be released during the next modeset.
|
|
* but will be released during the next modeset.
|
|
*/
|
|
*/
|
|
list_for_each_entry(ior, &outp->disp->ior, head) {
|
|
list_for_each_entry(ior, &outp->disp->ior, head) {
|
|
- if (!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)))
|
|
(ior->func->route.set || ior->id == __ffs(outp->info.or)))
|
|
return nvkm_outp_acquire_ior(outp, user, ior);
|
|
return nvkm_outp_acquire_ior(outp, user, ior);
|
|
}
|
|
}
|