Lines Matching +full:layer +full:- +full:primary

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
30 * struct dpu_rm_requirements - Reservation requirements parameter bundle
47 return -EINVAL; in dpu_rm_init()
54 for (i = 0; i < cat->mixer_count; i++) { in dpu_rm_init()
56 const struct dpu_lm_cfg *lm = &cat->mixer[i]; in dpu_rm_init()
64 rm->mixer_blks[lm->id - LM_0] = &hw->base; in dpu_rm_init()
67 for (i = 0; i < cat->merge_3d_count; i++) { in dpu_rm_init()
69 const struct dpu_merge_3d_cfg *merge_3d = &cat->merge_3d[i]; in dpu_rm_init()
78 rm->merge_3d_blks[merge_3d->id - MERGE_3D_0] = &hw->base; in dpu_rm_init()
81 for (i = 0; i < cat->pingpong_count; i++) { in dpu_rm_init()
83 const struct dpu_pingpong_cfg *pp = &cat->pingpong[i]; in dpu_rm_init()
85 hw = dpu_hw_pingpong_init(dev, pp, mmio, cat->mdss_ver); in dpu_rm_init()
92 if (pp->merge_3d && pp->merge_3d < MERGE_3D_MAX) in dpu_rm_init()
93 hw->merge_3d = to_dpu_hw_merge_3d(rm->merge_3d_blks[pp->merge_3d - MERGE_3D_0]); in dpu_rm_init()
94 rm->pingpong_blks[pp->id - PINGPONG_0] = &hw->base; in dpu_rm_init()
97 for (i = 0; i < cat->intf_count; i++) { in dpu_rm_init()
99 const struct dpu_intf_cfg *intf = &cat->intf[i]; in dpu_rm_init()
101 hw = dpu_hw_intf_init(dev, intf, mmio, cat->mdss_ver); in dpu_rm_init()
107 rm->hw_intf[intf->id - INTF_0] = hw; in dpu_rm_init()
110 for (i = 0; i < cat->wb_count; i++) { in dpu_rm_init()
112 const struct dpu_wb_cfg *wb = &cat->wb[i]; in dpu_rm_init()
114 hw = dpu_hw_wb_init(dev, wb, mmio, cat->mdss_ver); in dpu_rm_init()
120 rm->hw_wb[wb->id - WB_0] = hw; in dpu_rm_init()
123 for (i = 0; i < cat->ctl_count; i++) { in dpu_rm_init()
125 const struct dpu_ctl_cfg *ctl = &cat->ctl[i]; in dpu_rm_init()
127 hw = dpu_hw_ctl_init(dev, ctl, mmio, cat->mixer_count, cat->mixer); in dpu_rm_init()
133 rm->ctl_blks[ctl->id - CTL_0] = &hw->base; in dpu_rm_init()
136 for (i = 0; i < cat->dspp_count; i++) { in dpu_rm_init()
138 const struct dpu_dspp_cfg *dspp = &cat->dspp[i]; in dpu_rm_init()
146 rm->dspp_blks[dspp->id - DSPP_0] = &hw->base; in dpu_rm_init()
149 for (i = 0; i < cat->dsc_count; i++) { in dpu_rm_init()
151 const struct dpu_dsc_cfg *dsc = &cat->dsc[i]; in dpu_rm_init()
153 if (test_bit(DPU_DSC_HW_REV_1_2, &dsc->features)) in dpu_rm_init()
163 rm->dsc_blks[dsc->id - DSC_0] = &hw->base; in dpu_rm_init()
166 for (i = 0; i < cat->sspp_count; i++) { in dpu_rm_init()
168 const struct dpu_sspp_cfg *sspp = &cat->sspp[i]; in dpu_rm_init()
170 hw = dpu_hw_sspp_init(dev, sspp, mmio, mdss_data, cat->mdss_ver); in dpu_rm_init()
176 rm->hw_sspp[sspp->id - SSPP_NONE] = hw; in dpu_rm_init()
179 if (cat->cdm) { in dpu_rm_init()
182 hw = dpu_hw_cdm_init(dev, cat->cdm, mmio, cat->mdss_ver); in dpu_rm_init()
188 rm->cdm_blk = &hw->base; in dpu_rm_init()
194 return rc ? rc : -EFAULT; in dpu_rm_init()
199 return top->num_intf > 1; in _dpu_rm_needs_split_display()
203 * _dpu_rm_get_lm_peer - get the id of a mixer which is a peer of the primary
205 * @primary_idx: index of primary mixer in rm->mixer_blks[]
207 * Returns: lm peer mixed id on success or %-EINVAL on error
213 prim_lm_cfg = to_dpu_hw_mixer(rm->mixer_blks[primary_idx])->cap; in _dpu_rm_get_lm_peer()
215 if (prim_lm_cfg->lm_pair >= LM_0 && prim_lm_cfg->lm_pair < LM_MAX) in _dpu_rm_get_lm_peer()
216 return prim_lm_cfg->lm_pair - LM_0; in _dpu_rm_get_lm_peer()
217 return -EINVAL; in _dpu_rm_get_lm_peer()
221 * _dpu_rm_check_lm_and_get_connected_blks - check if proposed layer mixer meets
227 * @lm_idx: index of proposed layer mixer in rm->mixer_blks[], function checks
230 * @pp_idx: output parameter, index of pingpong block attached to the layer
231 * mixer in rm->pingpong_blks[].
232 * @dspp_idx: output parameter, index of dspp block attached to the layer
233 * mixer in rm->dspp_blks[].
247 if (reserved_by_other(global_state->mixer_to_enc_id, lm_idx, enc_id)) { in _dpu_rm_check_lm_and_get_connected_blks()
252 lm_cfg = to_dpu_hw_mixer(rm->mixer_blks[lm_idx])->cap; in _dpu_rm_check_lm_and_get_connected_blks()
253 idx = lm_cfg->pingpong - PINGPONG_0; in _dpu_rm_check_lm_and_get_connected_blks()
254 if (idx < 0 || idx >= ARRAY_SIZE(rm->pingpong_blks)) { in _dpu_rm_check_lm_and_get_connected_blks()
255 DPU_ERROR("failed to get pp on lm %d\n", lm_cfg->pingpong); in _dpu_rm_check_lm_and_get_connected_blks()
259 if (reserved_by_other(global_state->pingpong_to_enc_id, idx, enc_id)) { in _dpu_rm_check_lm_and_get_connected_blks()
260 DPU_DEBUG("lm %d pp %d already reserved\n", lm_cfg->id, in _dpu_rm_check_lm_and_get_connected_blks()
261 lm_cfg->pingpong); in _dpu_rm_check_lm_and_get_connected_blks()
266 if (!reqs->topology.num_dspp) in _dpu_rm_check_lm_and_get_connected_blks()
269 idx = lm_cfg->dspp - DSPP_0; in _dpu_rm_check_lm_and_get_connected_blks()
270 if (idx < 0 || idx >= ARRAY_SIZE(rm->dspp_blks)) { in _dpu_rm_check_lm_and_get_connected_blks()
271 DPU_ERROR("failed to get dspp on lm %d\n", lm_cfg->dspp); in _dpu_rm_check_lm_and_get_connected_blks()
275 if (reserved_by_other(global_state->dspp_to_enc_id, idx, enc_id)) { in _dpu_rm_check_lm_and_get_connected_blks()
276 DPU_DEBUG("lm %d dspp %d already reserved\n", lm_cfg->id, in _dpu_rm_check_lm_and_get_connected_blks()
277 lm_cfg->dspp); in _dpu_rm_check_lm_and_get_connected_blks()
296 if (!reqs->topology.num_lm) { in _dpu_rm_reserve_lms()
297 DPU_ERROR("invalid number of lm: %d\n", reqs->topology.num_lm); in _dpu_rm_reserve_lms()
298 return -EINVAL; in _dpu_rm_reserve_lms()
301 /* Find a primary mixer */ in _dpu_rm_reserve_lms()
302 for (i = 0; i < ARRAY_SIZE(rm->mixer_blks) && in _dpu_rm_reserve_lms()
303 lm_count < reqs->topology.num_lm; i++) { in _dpu_rm_reserve_lms()
304 if (!rm->mixer_blks[i]) in _dpu_rm_reserve_lms()
318 /* Valid primary mixer found, find matching peers */ in _dpu_rm_reserve_lms()
319 if (lm_count < reqs->topology.num_lm) { in _dpu_rm_reserve_lms()
326 if (!rm->mixer_blks[j]) in _dpu_rm_reserve_lms()
341 if (lm_count != reqs->topology.num_lm) { in _dpu_rm_reserve_lms()
343 return -ENAVAIL; in _dpu_rm_reserve_lms()
347 global_state->mixer_to_enc_id[lm_idx[i]] = enc_id; in _dpu_rm_reserve_lms()
348 global_state->pingpong_to_enc_id[pp_idx[i]] = enc_id; in _dpu_rm_reserve_lms()
349 global_state->dspp_to_enc_id[dspp_idx[i]] = in _dpu_rm_reserve_lms()
350 reqs->topology.num_dspp ? enc_id : 0; in _dpu_rm_reserve_lms()
370 num_ctls = top->num_intf; in _dpu_rm_reserve_ctls()
374 for (j = 0; j < ARRAY_SIZE(rm->ctl_blks); j++) { in _dpu_rm_reserve_ctls()
379 if (!rm->ctl_blks[j]) in _dpu_rm_reserve_ctls()
381 if (reserved_by_other(global_state->ctl_to_enc_id, j, enc_id)) in _dpu_rm_reserve_ctls()
384 ctl = to_dpu_hw_ctl(rm->ctl_blks[j]); in _dpu_rm_reserve_ctls()
385 features = ctl->caps->features; in _dpu_rm_reserve_ctls()
402 return -ENAVAIL; in _dpu_rm_reserve_ctls()
405 global_state->ctl_to_enc_id[ctl_idx[i]] = enc_id; in _dpu_rm_reserve_ctls()
417 int num_dsc = top->num_dsc; in _dpu_rm_reserve_dsc()
422 if (!rm->dsc_blks[i]) { in _dpu_rm_reserve_dsc()
424 return -EIO; in _dpu_rm_reserve_dsc()
427 if (global_state->dsc_to_enc_id[i]) { in _dpu_rm_reserve_dsc()
429 return -EIO; in _dpu_rm_reserve_dsc()
434 global_state->dsc_to_enc_id[i] = enc->base.id; in _dpu_rm_reserve_dsc()
444 if (!rm->cdm_blk) { in _dpu_rm_reserve_cdm()
446 return -EIO; in _dpu_rm_reserve_cdm()
449 if (global_state->cdm_to_enc_id) { in _dpu_rm_reserve_cdm()
451 return -EIO; in _dpu_rm_reserve_cdm()
454 global_state->cdm_to_enc_id = enc->base.id; in _dpu_rm_reserve_cdm()
467 ret = _dpu_rm_reserve_lms(rm, global_state, enc->base.id, reqs); in _dpu_rm_make_reservation()
473 ret = _dpu_rm_reserve_ctls(rm, global_state, enc->base.id, in _dpu_rm_make_reservation()
474 &reqs->topology); in _dpu_rm_make_reservation()
480 ret = _dpu_rm_reserve_dsc(rm, global_state, enc, &reqs->topology); in _dpu_rm_make_reservation()
484 if (reqs->topology.needs_cdm) { in _dpu_rm_make_reservation()
500 reqs->topology = req_topology; in _dpu_rm_populate_requirements()
503 reqs->topology.num_lm, reqs->topology.num_dsc, in _dpu_rm_populate_requirements()
504 reqs->topology.num_intf, reqs->topology.needs_cdm); in _dpu_rm_populate_requirements()
523 _dpu_rm_clear_mapping(global_state->pingpong_to_enc_id, in dpu_rm_release()
524 ARRAY_SIZE(global_state->pingpong_to_enc_id), enc->base.id); in dpu_rm_release()
525 _dpu_rm_clear_mapping(global_state->mixer_to_enc_id, in dpu_rm_release()
526 ARRAY_SIZE(global_state->mixer_to_enc_id), enc->base.id); in dpu_rm_release()
527 _dpu_rm_clear_mapping(global_state->ctl_to_enc_id, in dpu_rm_release()
528 ARRAY_SIZE(global_state->ctl_to_enc_id), enc->base.id); in dpu_rm_release()
529 _dpu_rm_clear_mapping(global_state->dsc_to_enc_id, in dpu_rm_release()
530 ARRAY_SIZE(global_state->dsc_to_enc_id), enc->base.id); in dpu_rm_release()
531 _dpu_rm_clear_mapping(global_state->dspp_to_enc_id, in dpu_rm_release()
532 ARRAY_SIZE(global_state->dspp_to_enc_id), enc->base.id); in dpu_rm_release()
533 _dpu_rm_clear_mapping(&global_state->cdm_to_enc_id, 1, enc->base.id); in dpu_rm_release()
546 /* Check if this is just a page-flip */ in dpu_rm_reserve()
556 enc->base.id, crtc_state->crtc->base.id); in dpu_rm_reserve()
583 hw_blks = rm->pingpong_blks; in dpu_rm_get_assigned_resources()
584 hw_to_enc_id = global_state->pingpong_to_enc_id; in dpu_rm_get_assigned_resources()
585 max_blks = ARRAY_SIZE(rm->pingpong_blks); in dpu_rm_get_assigned_resources()
588 hw_blks = rm->mixer_blks; in dpu_rm_get_assigned_resources()
589 hw_to_enc_id = global_state->mixer_to_enc_id; in dpu_rm_get_assigned_resources()
590 max_blks = ARRAY_SIZE(rm->mixer_blks); in dpu_rm_get_assigned_resources()
593 hw_blks = rm->ctl_blks; in dpu_rm_get_assigned_resources()
594 hw_to_enc_id = global_state->ctl_to_enc_id; in dpu_rm_get_assigned_resources()
595 max_blks = ARRAY_SIZE(rm->ctl_blks); in dpu_rm_get_assigned_resources()
598 hw_blks = rm->dspp_blks; in dpu_rm_get_assigned_resources()
599 hw_to_enc_id = global_state->dspp_to_enc_id; in dpu_rm_get_assigned_resources()
600 max_blks = ARRAY_SIZE(rm->dspp_blks); in dpu_rm_get_assigned_resources()
603 hw_blks = rm->dsc_blks; in dpu_rm_get_assigned_resources()
604 hw_to_enc_id = global_state->dsc_to_enc_id; in dpu_rm_get_assigned_resources()
605 max_blks = ARRAY_SIZE(rm->dsc_blks); in dpu_rm_get_assigned_resources()
608 hw_blks = &rm->cdm_blk; in dpu_rm_get_assigned_resources()
609 hw_to_enc_id = &global_state->cdm_to_enc_id; in dpu_rm_get_assigned_resources()