drm/nouveau/kms/nv50-: Refactor and cleanup DP HPD handling
[linux-2.6-microblaze.git] / drivers / gpu / drm / nouveau / nouveau_encoder.h
index b0e1dad..eef4643 100644 (file)
@@ -65,6 +65,13 @@ struct nouveau_encoder {
                        struct nv50_mstm *mstm;
                        int link_nr;
                        int link_bw;
+
+                       /* Protects DP state that needs to be accessed outside
+                        * connector reprobing contexts
+                        */
+                       struct mutex hpd_irq_lock;
+
+                       u8 dpcd[DP_RECEIVER_CAP_SIZE];
                        struct drm_dp_desc desc;
                } dp;
        };
@@ -79,6 +86,21 @@ struct nouveau_encoder {
                       struct nv50_head_atom *, u8 proto, u8 depth);
 };
 
+struct nv50_mstm {
+       struct nouveau_encoder *outp;
+
+       struct drm_dp_mst_topology_mgr mgr;
+
+       /* Protected under nouveau_encoder->dp.hpd_irq_lock */
+       bool can_mst;
+       bool is_mst;
+       bool suspended;
+
+       bool modified;
+       bool disabled;
+       int links;
+};
+
 struct nouveau_encoder *
 find_encoder(struct drm_connector *connector, int type);
 
@@ -102,11 +124,14 @@ get_slave_funcs(struct drm_encoder *enc)
 
 /* nouveau_dp.c */
 enum nouveau_dp_status {
+       NOUVEAU_DP_NONE,
        NOUVEAU_DP_SST,
        NOUVEAU_DP_MST,
 };
 
 int nouveau_dp_detect(struct nouveau_connector *, struct nouveau_encoder *);
+void nouveau_dp_irq(struct nouveau_drm *drm,
+                   struct nouveau_connector *nv_connector);
 enum drm_mode_status nv50_dp_mode_valid(struct drm_connector *,
                                        struct nouveau_encoder *,
                                        const struct drm_display_mode *,
@@ -119,7 +144,9 @@ struct nouveau_connector *
 nv50_outp_get_old_connector(struct nouveau_encoder *outp,
                            struct drm_atomic_state *state);
 
-int nv50_mstm_detect(struct nv50_mstm *, u8 dpcd[8], int allow);
-void nv50_mstm_remove(struct nv50_mstm *);
-void nv50_mstm_service(struct nv50_mstm *);
+int nv50_mstm_detect(struct nouveau_encoder *encoder);
+void nv50_mstm_remove(struct nv50_mstm *mstm);
+bool nv50_mstm_service(struct nouveau_drm *drm,
+                      struct nouveau_connector *nv_connector,
+                      struct nv50_mstm *mstm);
 #endif /* __NOUVEAU_ENCODER_H__ */