drm/nouveau/kms/nv50-: unify set/clr masks
authorBen Skeggs <bskeggs@redhat.com>
Tue, 8 May 2018 10:39:47 +0000 (20:39 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 18 May 2018 05:01:28 +0000 (15:01 +1000)
This is a simplification that'll be used to improve interlock handling.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/dispnv50/atom.h
drivers/gpu/drm/nouveau/dispnv50/disp.c
drivers/gpu/drm/nouveau/dispnv50/head.c
drivers/gpu/drm/nouveau/dispnv50/wndw.c

index 8c97e25c881f0bc5ae23f6923a9d24201c7a64ef..8bf180666bb7aac06550787210afa178976f8e16 100644 (file)
@@ -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
index c2b1578ed552911baa801144c874546923806539..006562f7f23e724722226280799c401a1f80c2ee 100644 (file)
@@ -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;
 };
 
 /******************************************************************************
index 1335c00500d165dff3724a4e94e2cc78026d3d22..2eb7fdb611310394f89d4c98a7b77824ed87c146 100644 (file)
@@ -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
index 764db736cf2930fe96c479f91b5191d516555653..8a7636f8a2421e2059c041afb8cf54c3d3e1bcec 100644 (file)
@@ -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;
 }