diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2018-05-08 20:39:47 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2018-05-18 15:01:28 +1000 |
commit | f88bc9d3ecca5ddc29642269f4624d07265c1bf5 (patch) | |
tree | 420189c28160b0f36c43f048b90c66b855af5037 /drivers/gpu | |
parent | 9d6c2fe1917fc5ba6a9e8586ca16d007410baf42 (diff) |
drm/nouveau/kms/nv50-: unify set/clr masks
This is a simplification that'll be used to improve interlock handling.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/nouveau/dispnv50/atom.h | 26 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/dispnv50/disp.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/dispnv50/head.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/dispnv50/wndw.c | 12 |
4 files changed, 20 insertions, 44 deletions
diff --git a/drivers/gpu/drm/nouveau/dispnv50/atom.h b/drivers/gpu/drm/nouveau/dispnv50/atom.h index 8c97e25c881f..8bf180666bb7 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/atom.h +++ b/drivers/gpu/drm/nouveau/dispnv50/atom.h @@ -105,16 +105,7 @@ struct nv50_head_atom { u8 depth:4; } or; - union { - struct { - bool ilut:1; - bool core:1; - bool curs:1; - }; - u8 mask; - } clr; - - union { + union nv50_head_atom_mask { struct { bool ilut:1; bool core:1; @@ -128,7 +119,7 @@ struct nv50_head_atom { bool or:1; }; u16 mask; - } set; + } set, clr; }; static inline struct nv50_head_atom * @@ -184,16 +175,7 @@ struct nv50_wndw_atom { u16 y; } point; - union { - struct { - bool ntfy:1; - bool sema:1; - bool image:1; - }; - u8 mask; - } clr; - - union { + union nv50_wndw_atom_mask { struct { bool ntfy:1; bool sema:1; @@ -202,6 +184,6 @@ struct nv50_wndw_atom { bool point:1; }; u8 mask; - } set; + } set, clr; }; #endif diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c index c2b1578ed552..006562f7f23e 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c @@ -62,19 +62,12 @@ struct nv50_outp_atom { struct drm_encoder *encoder; bool flush_disable; - union { + union nv50_outp_atom_mask { struct { bool ctrl:1; }; u8 mask; - } clr; - - union { - struct { - bool ctrl:1; - }; - u8 mask; - } set; + } set, clr; }; /****************************************************************************** diff --git a/drivers/gpu/drm/nouveau/dispnv50/head.c b/drivers/gpu/drm/nouveau/dispnv50/head.c index 1335c00500d1..2eb7fdb61131 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/head.c +++ b/drivers/gpu/drm/nouveau/dispnv50/head.c @@ -81,14 +81,15 @@ nv50_head_lut_load(struct drm_property_blob *blob, int mode, } void -nv50_head_flush_clr(struct nv50_head *head, struct nv50_head_atom *asyh, bool y) +nv50_head_flush_clr(struct nv50_head *head, + struct nv50_head_atom *asyh, bool flush) { - if (asyh->clr.ilut && (!asyh->set.ilut || y)) - head->func->ilut_clr(head); - if (asyh->clr.core && (!asyh->set.core || y)) - head->func->core_clr(head); - if (asyh->clr.curs && (!asyh->set.curs || y)) - head->func->curs_clr(head); + union nv50_head_atom_mask clr = { + .mask = asyh->clr.mask & ~(flush ? 0 : asyh->set.mask), + }; + if (clr.ilut) head->func->ilut_clr(head); + if (clr.core) head->func->core_clr(head); + if (clr.curs) head->func->curs_clr(head); } void diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.c b/drivers/gpu/drm/nouveau/dispnv50/wndw.c index 764db736cf29..8a7636f8a242 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/wndw.c +++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.c @@ -111,12 +111,12 @@ u32 nv50_wndw_flush_clr(struct nv50_wndw *wndw, u32 interlock, bool flush, struct nv50_wndw_atom *asyw) { - if (asyw->clr.sema && (!asyw->set.sema || flush)) - wndw->func->sema_clr(wndw); - if (asyw->clr.ntfy && (!asyw->set.ntfy || flush)) - wndw->func->ntfy_clr(wndw); - if (asyw->clr.image && (!asyw->set.image || flush)) - wndw->func->image_clr(wndw); + union nv50_wndw_atom_mask clr = { + .mask = asyw->clr.mask & ~(flush ? 0 : asyw->set.mask), + }; + if (clr.sema ) wndw->func-> sema_clr(wndw); + if (clr.ntfy ) wndw->func-> ntfy_clr(wndw); + if (clr.image) wndw->func->image_clr(wndw); return flush ? wndw->func->update(wndw, interlock) : 0; } |