update_state->pg_pipe_res_update[PG_OPTC][0] = false;
        }
 
+       if (dc->caps.sequential_ono) {
+               for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) {
+                       if (!update_state->pg_pipe_res_update[PG_HUBP][i] &&
+                           !update_state->pg_pipe_res_update[PG_DPP][i]) {
+                               for (j = i - 1; j >= 0; j--) {
+                                       update_state->pg_pipe_res_update[PG_HUBP][j] = false;
+                                       update_state->pg_pipe_res_update[PG_DPP][j] = false;
+                               }
+
+                               break;
+                       }
+               }
+       }
 }
 
 void dcn35_calc_blocks_to_ungate(struct dc *dc, struct dc_state *context,
        if (hpo_frl_stream_enc_acquired)
                update_state->pg_pipe_res_update[PG_HDMISTREAM][0] = true;
 
+       if (dc->caps.sequential_ono) {
+               for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) {
+                       if (update_state->pg_pipe_res_update[PG_HUBP][i] &&
+                           update_state->pg_pipe_res_update[PG_DPP][i]) {
+                               for (j = i - 1; j >= 0; j--) {
+                                       update_state->pg_pipe_res_update[PG_HUBP][j] = true;
+                                       update_state->pg_pipe_res_update[PG_DPP][j] = true;
+                               }
+
+                               break;
+                       }
+               }
+       }
 }
 
 /**
  *     ONO Region 2, DCPG 24: mpc opp optc dwb
  *     ONO Region 0, DCPG 22: dccg dio dcio - SKIPPED. will be pwr dwn after lono timer is armed
  *
+ * If sequential ONO is specified the order is modified from ONO Region 11 -> ONO Region 0 descending.
+ *
  * @dc: Current DC state
  * @update_state: update PG sequence states for HW block
  */
                        pg_cntl->funcs->hpo_pg_control(pg_cntl, false);
        }
 
-       for (i = 0; i < dc->res_pool->pipe_count; i++) {
-               if (update_state->pg_pipe_res_update[PG_HUBP][i] &&
-                       update_state->pg_pipe_res_update[PG_DPP][i]) {
-                       if (pg_cntl->funcs->hubp_dpp_pg_control)
-                               pg_cntl->funcs->hubp_dpp_pg_control(pg_cntl, i, false);
+       if (!dc->caps.sequential_ono) {
+               for (i = 0; i < dc->res_pool->pipe_count; i++) {
+                       if (update_state->pg_pipe_res_update[PG_HUBP][i] &&
+                           update_state->pg_pipe_res_update[PG_DPP][i]) {
+                               if (pg_cntl->funcs->hubp_dpp_pg_control)
+                                       pg_cntl->funcs->hubp_dpp_pg_control(pg_cntl, i, false);
+                       }
                }
-       }
-       for (i = 0; i < dc->res_pool->res_cap->num_dsc; i++)
-               if (update_state->pg_pipe_res_update[PG_DSC][i]) {
-                       if (pg_cntl->funcs->dsc_pg_control)
-                               pg_cntl->funcs->dsc_pg_control(pg_cntl, i, false);
+
+               for (i = 0; i < dc->res_pool->res_cap->num_dsc; i++) {
+                       if (update_state->pg_pipe_res_update[PG_DSC][i]) {
+                               if (pg_cntl->funcs->dsc_pg_control)
+                                       pg_cntl->funcs->dsc_pg_control(pg_cntl, i, false);
+                       }
                }
+       } else {
+               for (i = dc->res_pool->pipe_count - 1; i >= 0; i--) {
+                       if (update_state->pg_pipe_res_update[PG_DSC][i]) {
+                               if (pg_cntl->funcs->dsc_pg_control)
+                                       pg_cntl->funcs->dsc_pg_control(pg_cntl, i, false);
+                       }
 
+                       if (update_state->pg_pipe_res_update[PG_HUBP][i] &&
+                           update_state->pg_pipe_res_update[PG_DPP][i]) {
+                               if (pg_cntl->funcs->hubp_dpp_pg_control)
+                                       pg_cntl->funcs->hubp_dpp_pg_control(pg_cntl, i, false);
+                       }
+               }
+       }
 
        /*this will need all the clients to unregister optc interruts let dmubfw handle this*/
        if (pg_cntl->funcs->plane_otg_pg_control)
  *     ONO Region 10, DCPG 3: dchubp3, dpp3
  *     ONO Region 3, DCPG 25: hpo - SKIPPED
  *
+ * If sequential ONO is specified the order is modified from ONO Region 0 -> ONO Region 11 ascending.
+ *
  * @dc: Current DC state
  * @update_state: update PG sequence states for HW block
  */
        if (pg_cntl->funcs->plane_otg_pg_control)
                pg_cntl->funcs->plane_otg_pg_control(pg_cntl, true);
 
-       for (i = 0; i < dc->res_pool->res_cap->num_dsc; i++)
-               if (update_state->pg_pipe_res_update[PG_DSC][i]) {
-                       if (pg_cntl->funcs->dsc_pg_control)
-                               pg_cntl->funcs->dsc_pg_control(pg_cntl, i, true);
-               }
+       if (!dc->caps.sequential_ono) {
+               for (i = 0; i < dc->res_pool->res_cap->num_dsc; i++)
+                       if (update_state->pg_pipe_res_update[PG_DSC][i]) {
+                               if (pg_cntl->funcs->dsc_pg_control)
+                                       pg_cntl->funcs->dsc_pg_control(pg_cntl, i, true);
+                       }
+       }
 
        for (i = 0; i < dc->res_pool->pipe_count; i++) {
                if (update_state->pg_pipe_res_update[PG_HUBP][i] &&
                        if (pg_cntl->funcs->hubp_dpp_pg_control)
                                pg_cntl->funcs->hubp_dpp_pg_control(pg_cntl, i, true);
                }
+
+               if (dc->caps.sequential_ono) {
+                       if (update_state->pg_pipe_res_update[PG_DSC][i]) {
+                               if (pg_cntl->funcs->dsc_pg_control)
+                                       pg_cntl->funcs->dsc_pg_control(pg_cntl, i, true);
+                       }
+               }
        }
        if (update_state->pg_res_update[PG_HPO]) {
                if (pg_cntl->funcs->hpo_pg_control)