Create a struct to represent MDP5 Layer Mixer instances. This will
eventually allow us to detach CRTCs from the Layer Mixers, and
generally clean things up a bit.

This is very similar to how hwpipes were previously abstracted away
from drm planes.

Signed-off-by: Archit Taneja <arch...@codeaurora.org>
---
 drivers/gpu/drm/msm/Makefile              |  1 +
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c   | 33 +++++++++++++++++++++++
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h   |  4 +++
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.c | 44 +++++++++++++++++++++++++++++++
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.h | 37 ++++++++++++++++++++++++++
 5 files changed, 119 insertions(+)
 create mode 100644 drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.c
 create mode 100644 drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.h

diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
index 39055362da95..5241ac8803ba 100644
--- a/drivers/gpu/drm/msm/Makefile
+++ b/drivers/gpu/drm/msm/Makefile
@@ -40,6 +40,7 @@ msm-y := \
        mdp/mdp5/mdp5_mdss.o \
        mdp/mdp5/mdp5_kms.o \
        mdp/mdp5/mdp5_pipe.o \
+       mdp/mdp5/mdp5_mixer.o \
        mdp/mdp5/mdp5_plane.o \
        mdp/mdp5/mdp5_smp.o \
        msm_atomic.o \
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c 
b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
index 9d21317b2cc3..c55ba6e8387c 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c
@@ -162,6 +162,9 @@ static void mdp5_kms_destroy(struct msm_kms *kms)
        struct msm_gem_address_space *aspace = mdp5_kms->aspace;
        int i;
 
+       for (i = 0; i < mdp5_kms->num_hwmixers; i++)
+               mdp5_mixer_destroy(mdp5_kms->hwmixers[i]);
+
        for (i = 0; i < mdp5_kms->num_hwpipes; i++)
                mdp5_pipe_destroy(mdp5_kms->hwpipes[i]);
 
@@ -868,6 +871,32 @@ static int hwpipe_init(struct mdp5_kms *mdp5_kms)
        return 0;
 }
 
+static int hwmixer_init(struct mdp5_kms *mdp5_kms)
+{
+       struct drm_device *dev = mdp5_kms->dev;
+       const struct mdp5_cfg_hw *hw_cfg;
+       int i, ret;
+
+       hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
+
+       for (i = 0; i < hw_cfg->lm.count; i++) {
+               struct mdp5_hw_mixer *mixer;
+
+               mixer = mdp5_mixer_init(&hw_cfg->lm.instances[i]);
+               if (IS_ERR(mixer)) {
+                       ret = PTR_ERR(mixer);
+                       dev_err(dev->dev, "failed to construct LM%d (%d)\n",
+                               i, ret);
+                       return ret;
+               }
+
+               mixer->idx = mdp5_kms->num_hwmixers;
+               mdp5_kms->hwmixers[mdp5_kms->num_hwmixers++] = mixer;
+       }
+
+       return 0;
+}
+
 static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
 {
        struct msm_drm_private *priv = dev->dev_private;
@@ -980,6 +1009,10 @@ static int mdp5_init(struct platform_device *pdev, struct 
drm_device *dev)
        if (ret)
                goto fail;
 
+       ret = hwmixer_init(mdp5_kms);
+       if (ret)
+               goto fail;
+
        /* set uninit-ed kms */
        priv->kms = &mdp5_kms->base.base;
 
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h 
b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
index 9258871d879c..f3a3b767e35c 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h
@@ -25,6 +25,7 @@
 #include "mdp5.xml.h"
 #include "mdp5_ctl.h"
 #include "mdp5_pipe.h"
+#include "mdp5_mixer.h"
 #include "mdp5_smp.h"
 
 struct mdp5_state;
@@ -39,6 +40,9 @@ struct mdp5_kms {
        unsigned num_hwpipes;
        struct mdp5_hw_pipe *hwpipes[SSPP_MAX];
 
+       unsigned num_hwmixers;
+       struct mdp5_hw_mixer *hwmixers[8];
+
        struct mdp5_cfg_handler *cfg;
        uint32_t caps;  /* MDP capabilities (MDP_CAP_XXX bits) */
 
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.c 
b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.c
new file mode 100644
index 000000000000..dd38f0bc2494
--- /dev/null
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "mdp5_kms.h"
+
+void mdp5_mixer_destroy(struct mdp5_hw_mixer *mixer)
+{
+       kfree(mixer);
+}
+
+static const char * const mixer_names[] = {
+       "LM0", "LM1", "LM2", "LM3", "LM4", "LM5",
+};
+
+struct mdp5_hw_mixer *mdp5_mixer_init(const struct mdp5_lm_instance *lm)
+{
+       struct mdp5_hw_mixer *mixer;
+
+       mixer = kzalloc(sizeof(*mixer), GFP_KERNEL);
+       if (!mixer)
+               return ERR_PTR(-ENOMEM);
+
+       mixer->name = mixer_names[lm->id];
+       mixer->lm = lm->id;
+       mixer->caps = lm->caps;
+       mixer->pp = lm->pp;
+       mixer->dspp = lm->dspp;
+       mixer->flush_mask = mdp_ctl_flush_mask_lm(lm->id);
+
+       return mixer;
+}
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.h 
b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.h
new file mode 100644
index 000000000000..08d2173703bf
--- /dev/null
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_mixer.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2017 The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __MDP5_LM_H__
+#define __MDP5_LM_H__
+
+/* represents a hw Layer Mixer, one (or more) is dynamically assigned to a 
crtc */
+struct mdp5_hw_mixer {
+       int idx;
+
+       const char *name;
+
+       int lm;                 /* the LM instance # */
+       uint32_t caps;
+       int pp;
+       int dspp;
+
+       uint32_t flush_mask;      /* used to commit LM registers */
+};
+
+struct mdp5_hw_mixer *mdp5_mixer_init(const struct mdp5_lm_instance *lm);
+void mdp5_mixer_destroy(struct mdp5_hw_mixer *lm);
+
+#endif /* __MDP5_LM_H__ */
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to