drm/msm/dpu: iterate for assigned hw ctl in virtual encoder
authorJeykumar Sankaran <jsanka@codeaurora.org>
Thu, 6 Sep 2018 02:08:17 +0000 (19:08 -0700)
committerRob Clark <robdclark@gmail.com>
Thu, 4 Oct 2018 00:24:51 +0000 (20:24 -0400)
In virtual encoder modeset, DPU makes RM request to assign hw blocks
for the display. It is also expected in modeset to iterate and
associate the physical encoders with their relevant hw blocks.
Ping pong blocks are already handled here but hw ctl blocks are not.
This change moves the hw_ctl iteration and mapping from physical
encoder to virtual encoder.

changes in v4:
- Fix hw_ctl initialization (Sean)
changes in v5:
- Update commit text with details on why the change is
  needed (Sean)

Signed-off-by: Jeykumar Sankaran <jsanka@codeaurora.org>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c

index a8bbe810414e9fdc6a04c81ce123c3396b58b939..0454e94b23b9df163289e8b27b24624b70ec8351 100644 (file)
@@ -1011,9 +1011,10 @@ static void dpu_encoder_virt_mode_set(struct drm_encoder *drm_enc,
        struct dpu_kms *dpu_kms;
        struct list_head *connector_list;
        struct drm_connector *conn = NULL, *conn_iter;
-       struct dpu_rm_hw_iter pp_iter;
+       struct dpu_rm_hw_iter pp_iter, ctl_iter;
        struct msm_display_topology topology;
        enum dpu_rm_topology_name topology_name;
+       struct dpu_hw_ctl *hw_ctl[MAX_CHANNELS_PER_ENC] = { NULL };
        int i = 0, ret;
 
        if (!drm_enc) {
@@ -1061,17 +1062,33 @@ static void dpu_encoder_virt_mode_set(struct drm_encoder *drm_enc,
                dpu_enc->hw_pp[i] = (struct dpu_hw_pingpong *) pp_iter.hw;
        }
 
+       dpu_rm_init_hw_iter(&ctl_iter, drm_enc->base.id, DPU_HW_BLK_CTL);
+       for (i = 0; i < MAX_CHANNELS_PER_ENC; i++) {
+               if (!dpu_rm_get_hw(&dpu_kms->rm, &ctl_iter))
+                       break;
+               hw_ctl[i] = (struct dpu_hw_ctl *)ctl_iter.hw;
+       }
+
        topology_name = dpu_rm_get_topology_name(topology);
        for (i = 0; i < dpu_enc->num_phys_encs; i++) {
                struct dpu_encoder_phys *phys = dpu_enc->phys_encs[i];
 
                if (phys) {
                        if (!dpu_enc->hw_pp[i]) {
-                               DPU_ERROR_ENC(dpu_enc,
-                                   "invalid pingpong block for the encoder\n");
+                               DPU_ERROR_ENC(dpu_enc, "no pp block assigned"
+                                            "at idx: %d\n", i);
                                return;
                        }
+
+                       if (!hw_ctl[i]) {
+                               DPU_ERROR_ENC(dpu_enc, "no ctl block assigned"
+                                            "at idx: %d\n", i);
+                               return;
+                       }
+
                        phys->hw_pp = dpu_enc->hw_pp[i];
+                       phys->hw_ctl = hw_ctl[i];
+
                        phys->connector = conn->state->connector;
                        phys->topology_name = topology_name;
                        if (phys->ops.mode_set)
index c8c4612dc34ddb430499d2038f6124173258717d..5c89868364536337effa70286fe800abfd1b09ef 100644 (file)
@@ -196,9 +196,6 @@ static void dpu_encoder_phys_cmd_mode_set(
 {
        struct dpu_encoder_phys_cmd *cmd_enc =
                to_dpu_encoder_phys_cmd(phys_enc);
-       struct dpu_rm *rm = &phys_enc->dpu_kms->rm;
-       struct dpu_rm_hw_iter iter;
-       int i, instance;
 
        if (!phys_enc || !mode || !adj_mode) {
                DPU_ERROR("invalid args\n");
@@ -208,22 +205,6 @@ static void dpu_encoder_phys_cmd_mode_set(
        DPU_DEBUG_CMDENC(cmd_enc, "caching mode:\n");
        drm_mode_debug_printmodeline(adj_mode);
 
-       instance = phys_enc->split_role == ENC_ROLE_SLAVE ? 1 : 0;
-
-       /* Retrieve previously allocated HW Resources. Shouldn't fail */
-       dpu_rm_init_hw_iter(&iter, phys_enc->parent->base.id, DPU_HW_BLK_CTL);
-       for (i = 0; i <= instance; i++) {
-               if (dpu_rm_get_hw(rm, &iter))
-                       phys_enc->hw_ctl = (struct dpu_hw_ctl *)iter.hw;
-       }
-
-       if (IS_ERR_OR_NULL(phys_enc->hw_ctl)) {
-               DPU_ERROR_CMDENC(cmd_enc, "failed to init ctl: %ld\n",
-                               PTR_ERR(phys_enc->hw_ctl));
-               phys_enc->hw_ctl = NULL;
-               return;
-       }
-
        _dpu_encoder_phys_cmd_setup_irq_hw_idx(phys_enc);
 }
 
index ecb8c65ab6cd4c2e20729d0bedbe508a4522ce9d..ca0963c3613ef039521d558c008ca02ba9e75a0d 100644 (file)
@@ -395,9 +395,6 @@ static void dpu_encoder_phys_vid_mode_set(
                struct drm_display_mode *mode,
                struct drm_display_mode *adj_mode)
 {
-       struct dpu_rm *rm;
-       struct dpu_rm_hw_iter iter;
-       int i, instance;
        struct dpu_encoder_phys_vid *vid_enc;
 
        if (!phys_enc || !phys_enc->dpu_kms) {
@@ -405,7 +402,6 @@ static void dpu_encoder_phys_vid_mode_set(
                return;
        }
 
-       rm = &phys_enc->dpu_kms->rm;
        vid_enc = to_dpu_encoder_phys_vid(phys_enc);
 
        if (adj_mode) {
@@ -414,21 +410,6 @@ static void dpu_encoder_phys_vid_mode_set(
                DPU_DEBUG_VIDENC(vid_enc, "caching mode:\n");
        }
 
-       instance = phys_enc->split_role == ENC_ROLE_SLAVE ? 1 : 0;
-
-       /* Retrieve previously allocated HW Resources. Shouldn't fail */
-       dpu_rm_init_hw_iter(&iter, phys_enc->parent->base.id, DPU_HW_BLK_CTL);
-       for (i = 0; i <= instance; i++) {
-               if (dpu_rm_get_hw(rm, &iter))
-                       phys_enc->hw_ctl = (struct dpu_hw_ctl *)iter.hw;
-       }
-       if (IS_ERR_OR_NULL(phys_enc->hw_ctl)) {
-               DPU_ERROR_VIDENC(vid_enc, "failed to init ctl, %ld\n",
-                               PTR_ERR(phys_enc->hw_ctl));
-               phys_enc->hw_ctl = NULL;
-               return;
-       }
-
        _dpu_encoder_phys_vid_setup_irq_hw_idx(phys_enc);
 }