mirror of
https://github.com/torvalds/linux.git
synced 2024-12-01 00:21:32 +00:00
drm/nouveau/disp: split part of OR allocation logic into a function
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>
This commit is contained in:
parent
6f8dbcf1c9
commit
f24b6ae19f
@ -111,6 +111,42 @@ nvkm_outp_acquire_ior(struct nvkm_outp *outp, u8 user, struct nvkm_ior *ior)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
nvkm_outp_acquire_hda(struct nvkm_outp *outp, enum nvkm_ior_type type,
|
||||||
|
u8 user, bool hda)
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
return nvkm_outp_acquire_ior(outp, user, ior);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Failing that, a completely unused OR is the next best thing. */
|
||||||
|
list_for_each_entry(ior, &outp->disp->ior, head) {
|
||||||
|
if (!ior->identity &&
|
||||||
|
!ior->asy.outp && ior->type == type && !ior->arm.outp &&
|
||||||
|
(ior->func->route.set || ior->id == __ffs(outp->info.or)))
|
||||||
|
return nvkm_outp_acquire_ior(outp, user, ior);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Last resort is to assign an OR that's already active on HW,
|
||||||
|
* 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 &&
|
||||||
|
(ior->func->route.set || ior->id == __ffs(outp->info.or)))
|
||||||
|
return nvkm_outp_acquire_ior(outp, user, ior);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -ENOSPC;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
nvkm_outp_acquire(struct nvkm_outp *outp, u8 user, bool hda)
|
nvkm_outp_acquire(struct nvkm_outp *outp, u8 user, bool hda)
|
||||||
{
|
{
|
||||||
@ -137,32 +173,7 @@ nvkm_outp_acquire(struct nvkm_outp *outp, u8 user, bool hda)
|
|||||||
return nvkm_outp_acquire_ior(outp, user, ior);
|
return nvkm_outp_acquire_ior(outp, user, ior);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* First preference is to reuse the OR that is currently armed
|
return nvkm_outp_acquire_hda(outp, type, user, true);
|
||||||
* 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)
|
|
||||||
return nvkm_outp_acquire_ior(outp, user, ior);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Failing that, a completely unused OR is the next best thing. */
|
|
||||||
list_for_each_entry(ior, &outp->disp->ior, head) {
|
|
||||||
if (!ior->identity &&
|
|
||||||
!ior->asy.outp && ior->type == type && !ior->arm.outp &&
|
|
||||||
(ior->func->route.set || ior->id == __ffs(outp->info.or)))
|
|
||||||
return nvkm_outp_acquire_ior(outp, user, ior);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Last resort is to assign an OR that's already active on HW,
|
|
||||||
* 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 &&
|
|
||||||
(ior->func->route.set || ior->id == __ffs(outp->info.or)))
|
|
||||||
return nvkm_outp_acquire_ior(outp, user, ior);
|
|
||||||
}
|
|
||||||
|
|
||||||
return -ENOSPC;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user