disp: msm: sde: move boolean flags in catalog to a bitmap
Move all the individual boolean flags from HW catalog into a "features" bitmap. These flags are used to specify support of various target specific features. Change-Id: I2334b3b873f3737f91bbae4ef576408247710156 Signed-off-by: Steve Cohen <quic_cohens@quicinc.com>
This commit is contained in:

committed by
Jeykumar Sankaran

parent
5f25adc693
commit
7f0c843da4
@@ -3061,7 +3061,7 @@ static void _dspp_rc_install_property(struct drm_crtc *crtc)
|
|||||||
sizeof(struct drm_msm_rc_mask_cfg));
|
sizeof(struct drm_msm_rc_mask_cfg));
|
||||||
|
|
||||||
/* Override flush mechanism to use layer mixer flush bits */
|
/* Override flush mechanism to use layer mixer flush bits */
|
||||||
if (!catalog->rc_lm_flush_override)
|
if (!test_bit(SDE_FEATURE_RC_LM_FLUSH_OVERRIDE, catalog->features))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
DRM_DEBUG("rc using lm flush override\n");
|
DRM_DEBUG("rc using lm flush override\n");
|
||||||
|
@@ -2860,9 +2860,10 @@ static int sde_connector_populate_mode_info(struct drm_connector *conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
sde_kms_info_add_keyint(info, "qsync_min_fps", mode_info.qsync_min_fps);
|
sde_kms_info_add_keyint(info, "qsync_min_fps", mode_info.qsync_min_fps);
|
||||||
sde_kms_info_add_keyint(info, "has_cwb_crop", sde_kms->catalog->has_cwb_crop);
|
sde_kms_info_add_keyint(info, "has_cwb_crop", test_bit(SDE_FEATURE_CWB_CROP,
|
||||||
|
sde_kms->catalog->features));
|
||||||
sde_kms_info_add_keyint(info, "has_dedicated_cwb_support",
|
sde_kms_info_add_keyint(info, "has_dedicated_cwb_support",
|
||||||
sde_kms->catalog->has_dedicated_cwb_support);
|
test_bit(SDE_FEATURE_DEDICATED_CWB, sde_kms->catalog->features));
|
||||||
|
|
||||||
sde_kms_info_add_keyint(info, "mdp_transfer_time_us",
|
sde_kms_info_add_keyint(info, "mdp_transfer_time_us",
|
||||||
mode_info.mdp_transfer_time_us);
|
mode_info.mdp_transfer_time_us);
|
||||||
@@ -3083,13 +3084,13 @@ static int _sde_connector_install_properties(struct drm_device *dev,
|
|||||||
CONNECTOR_PROP_AUTOREFRESH);
|
CONNECTOR_PROP_AUTOREFRESH);
|
||||||
|
|
||||||
if (connector_type == DRM_MODE_CONNECTOR_DSI) {
|
if (connector_type == DRM_MODE_CONNECTOR_DSI) {
|
||||||
if (sde_kms->catalog->has_qsync && dsi_display && dsi_display->panel &&
|
if (test_bit(SDE_FEATURE_QSYNC, sde_kms->catalog->features) && dsi_display &&
|
||||||
dsi_display->panel->qsync_caps.qsync_support) {
|
dsi_display->panel && dsi_display->panel->qsync_caps.qsync_support) {
|
||||||
msm_property_install_enum(&c_conn->property_info,
|
msm_property_install_enum(&c_conn->property_info,
|
||||||
"qsync_mode", 0, 0, e_qsync_mode,
|
"qsync_mode", 0, 0, e_qsync_mode,
|
||||||
ARRAY_SIZE(e_qsync_mode), 0,
|
ARRAY_SIZE(e_qsync_mode), 0,
|
||||||
CONNECTOR_PROP_QSYNC_MODE);
|
CONNECTOR_PROP_QSYNC_MODE);
|
||||||
if (sde_kms->catalog->has_avr_step)
|
if (test_bit(SDE_FEATURE_AVR_STEP, sde_kms->catalog->features))
|
||||||
msm_property_install_range(&c_conn->property_info,
|
msm_property_install_range(&c_conn->property_info,
|
||||||
"avr_step", 0x0, 0, U32_MAX, 0,
|
"avr_step", 0x0, 0, U32_MAX, 0,
|
||||||
CONNECTOR_PROP_AVR_STEP);
|
CONNECTOR_PROP_AVR_STEP);
|
||||||
@@ -3113,7 +3114,7 @@ static int _sde_connector_install_properties(struct drm_device *dev,
|
|||||||
ARRAY_SIZE(e_panel_mode), 0,
|
ARRAY_SIZE(e_panel_mode), 0,
|
||||||
CONNECTOR_PROP_SET_PANEL_MODE);
|
CONNECTOR_PROP_SET_PANEL_MODE);
|
||||||
|
|
||||||
if (sde_kms->catalog->has_demura) {
|
if (test_bit(SDE_FEATURE_DEMURA, sde_kms->catalog->features)) {
|
||||||
msm_property_install_blob(&c_conn->property_info,
|
msm_property_install_blob(&c_conn->property_info,
|
||||||
"DEMURA_PANEL_ID", DRM_MODE_PROP_IMMUTABLE,
|
"DEMURA_PANEL_ID", DRM_MODE_PROP_IMMUTABLE,
|
||||||
CONNECTOR_PROP_DEMURA_PANEL_ID);
|
CONNECTOR_PROP_DEMURA_PANEL_ID);
|
||||||
@@ -3292,7 +3293,7 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
|
|||||||
goto error_cleanup_fence;
|
goto error_cleanup_fence;
|
||||||
|
|
||||||
if (connector_type == DRM_MODE_CONNECTOR_DSI &&
|
if (connector_type == DRM_MODE_CONNECTOR_DSI &&
|
||||||
sde_kms->catalog->has_demura) {
|
test_bit(SDE_FEATURE_DEMURA, sde_kms->catalog->features)) {
|
||||||
rc = sde_connector_register_event(&c_conn->base,
|
rc = sde_connector_register_event(&c_conn->base,
|
||||||
SDE_CONN_EVENT_PANEL_ID,
|
SDE_CONN_EVENT_PANEL_ID,
|
||||||
sde_connector_handle_panel_id, c_conn);
|
sde_connector_handle_panel_id, c_conn);
|
||||||
|
@@ -1968,19 +1968,16 @@ static void _sde_drm_fb_sec_dir_trans(
|
|||||||
struct sde_mdss_cfg *catalog, bool old_valid_fb, int *ops)
|
struct sde_mdss_cfg *catalog, bool old_valid_fb, int *ops)
|
||||||
{
|
{
|
||||||
/* secure display usecase */
|
/* secure display usecase */
|
||||||
if ((smmu_state->state == ATTACHED)
|
if ((smmu_state->state == ATTACHED) && (secure_level == SDE_DRM_SEC_ONLY)) {
|
||||||
&& (secure_level == SDE_DRM_SEC_ONLY)) {
|
smmu_state->state = (test_bit(SDE_FEATURE_SUI_NS_ALLOWED, catalog->features)) ?
|
||||||
smmu_state->state = catalog->sui_ns_allowed ?
|
|
||||||
DETACH_SEC_REQ : DETACH_ALL_REQ;
|
DETACH_SEC_REQ : DETACH_ALL_REQ;
|
||||||
smmu_state->secure_level = secure_level;
|
smmu_state->secure_level = secure_level;
|
||||||
smmu_state->transition_type = PRE_COMMIT;
|
smmu_state->transition_type = PRE_COMMIT;
|
||||||
*ops |= SDE_KMS_OPS_SECURE_STATE_CHANGE;
|
*ops |= SDE_KMS_OPS_SECURE_STATE_CHANGE;
|
||||||
if (old_valid_fb)
|
if (old_valid_fb)
|
||||||
*ops |= (SDE_KMS_OPS_WAIT_FOR_TX_DONE |
|
*ops |= (SDE_KMS_OPS_WAIT_FOR_TX_DONE | SDE_KMS_OPS_CLEANUP_PLANE_FB);
|
||||||
SDE_KMS_OPS_CLEANUP_PLANE_FB);
|
if (test_bit(SDE_FEATURE_SUI_MISR, catalog->features))
|
||||||
if (catalog->sui_misr_supported)
|
smmu_state->sui_misr_state = SUI_MISR_ENABLE_REQ;
|
||||||
smmu_state->sui_misr_state =
|
|
||||||
SUI_MISR_ENABLE_REQ;
|
|
||||||
/* secure camera usecase */
|
/* secure camera usecase */
|
||||||
} else if (smmu_state->state == ATTACHED) {
|
} else if (smmu_state->state == ATTACHED) {
|
||||||
smmu_state->state = DETACH_SEC_REQ;
|
smmu_state->state = DETACH_SEC_REQ;
|
||||||
@@ -2000,16 +1997,15 @@ static void _sde_drm_fb_transactions(
|
|||||||
|| ((smmu_state->secure_level == SDE_DRM_SEC_ONLY)
|
|| ((smmu_state->secure_level == SDE_DRM_SEC_ONLY)
|
||||||
&& ((smmu_state->state == DETACHED_SEC)
|
&& ((smmu_state->state == DETACHED_SEC)
|
||||||
|| (smmu_state->state == DETACH_SEC_REQ)))) {
|
|| (smmu_state->state == DETACH_SEC_REQ)))) {
|
||||||
smmu_state->state = catalog->sui_ns_allowed ?
|
smmu_state->state = (test_bit(SDE_FEATURE_SUI_NS_ALLOWED, catalog->features)) ?
|
||||||
ATTACH_SEC_REQ : ATTACH_ALL_REQ;
|
ATTACH_SEC_REQ : ATTACH_ALL_REQ;
|
||||||
smmu_state->transition_type = post_commit ?
|
smmu_state->transition_type = post_commit ?
|
||||||
POST_COMMIT : PRE_COMMIT;
|
POST_COMMIT : PRE_COMMIT;
|
||||||
*ops |= SDE_KMS_OPS_SECURE_STATE_CHANGE;
|
*ops |= SDE_KMS_OPS_SECURE_STATE_CHANGE;
|
||||||
if (old_valid_fb)
|
if (old_valid_fb)
|
||||||
*ops |= SDE_KMS_OPS_WAIT_FOR_TX_DONE;
|
*ops |= SDE_KMS_OPS_WAIT_FOR_TX_DONE;
|
||||||
if (catalog->sui_misr_supported)
|
if (test_bit(SDE_FEATURE_SUI_MISR, catalog->features))
|
||||||
smmu_state->sui_misr_state =
|
smmu_state->sui_misr_state = SUI_MISR_DISABLE_REQ;
|
||||||
SUI_MISR_DISABLE_REQ;
|
|
||||||
} else if ((smmu_state->state == DETACHED_SEC)
|
} else if ((smmu_state->state == DETACHED_SEC)
|
||||||
|| (smmu_state->state == DETACH_SEC_REQ)) {
|
|| (smmu_state->state == DETACH_SEC_REQ)) {
|
||||||
smmu_state->state = ATTACH_SEC_REQ;
|
smmu_state->state = ATTACH_SEC_REQ;
|
||||||
@@ -2923,9 +2919,8 @@ static void _sde_crtc_set_dim_layer_v1(struct drm_crtc *crtc,
|
|||||||
user_cfg = &dim_layer_v1.layer_cfg[i];
|
user_cfg = &dim_layer_v1.layer_cfg[i];
|
||||||
|
|
||||||
dim_layer[i].flags = user_cfg->flags;
|
dim_layer[i].flags = user_cfg->flags;
|
||||||
dim_layer[i].stage = (kms->catalog->has_base_layer) ?
|
dim_layer[i].stage = test_bit(SDE_FEATURE_BASE_LAYER, kms->catalog->features) ?
|
||||||
user_cfg->stage : user_cfg->stage +
|
user_cfg->stage : user_cfg->stage + SDE_STAGE_0;
|
||||||
SDE_STAGE_0;
|
|
||||||
|
|
||||||
dim_layer[i].rect.x = user_cfg->rect.x1;
|
dim_layer[i].rect.x = user_cfg->rect.x1;
|
||||||
dim_layer[i].rect.y = user_cfg->rect.y1;
|
dim_layer[i].rect.y = user_cfg->rect.y1;
|
||||||
@@ -4570,7 +4565,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc)
|
|||||||
* reset idle power-collapse to original state during suspend;
|
* reset idle power-collapse to original state during suspend;
|
||||||
* user-mode will change the state on resume, if required
|
* user-mode will change the state on resume, if required
|
||||||
*/
|
*/
|
||||||
if (sde_kms->catalog->has_idle_pc)
|
if (test_bit(SDE_FEATURE_IDLE_PC, sde_kms->catalog->features))
|
||||||
sde_encoder_control_idle_pc(encoder, true);
|
sde_encoder_control_idle_pc(encoder, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4831,7 +4826,7 @@ static int _sde_crtc_check_secure_blend_config(struct drm_crtc *crtc,
|
|||||||
int sec_stage = cnt ? pstates[0].sde_pstate->stage :
|
int sec_stage = cnt ? pstates[0].sde_pstate->stage :
|
||||||
cstate->dim_layer[0].stage;
|
cstate->dim_layer[0].stage;
|
||||||
|
|
||||||
if (!sde_kms->catalog->has_base_layer)
|
if (!test_bit(SDE_FEATURE_BASE_LAYER, sde_kms->catalog->features))
|
||||||
sec_stage -= SDE_STAGE_0;
|
sec_stage -= SDE_STAGE_0;
|
||||||
|
|
||||||
if ((!cnt && !cstate->num_dim_layers) ||
|
if ((!cnt && !cstate->num_dim_layers) ||
|
||||||
@@ -5071,7 +5066,7 @@ static int _sde_crtc_check_get_pstates(struct drm_crtc *crtc,
|
|||||||
blend_type = sde_plane_get_property(pstates[*cnt].sde_pstate,
|
blend_type = sde_plane_get_property(pstates[*cnt].sde_pstate,
|
||||||
PLANE_PROP_BLEND_OP);
|
PLANE_PROP_BLEND_OP);
|
||||||
|
|
||||||
if (!kms->catalog->has_base_layer)
|
if (!test_bit(SDE_FEATURE_BASE_LAYER, kms->catalog->features))
|
||||||
inc_sde_stage = SDE_STAGE_0;
|
inc_sde_stage = SDE_STAGE_0;
|
||||||
|
|
||||||
/* check dim layer stage with every plane */
|
/* check dim layer stage with every plane */
|
||||||
@@ -5230,7 +5225,7 @@ static int _sde_crtc_check_zpos(struct drm_crtc_state *state,
|
|||||||
rc = _sde_crtc_noise_layer_check_zpos(cstate, z_pos);
|
rc = _sde_crtc_noise_layer_check_zpos(cstate, z_pos);
|
||||||
if (rc)
|
if (rc)
|
||||||
break;
|
break;
|
||||||
if (!kms->catalog->has_base_layer)
|
if (!test_bit(SDE_FEATURE_BASE_LAYER, kms->catalog->features))
|
||||||
pstates[i].sde_pstate->stage = z_pos + SDE_STAGE_0;
|
pstates[i].sde_pstate->stage = z_pos + SDE_STAGE_0;
|
||||||
else
|
else
|
||||||
pstates[i].sde_pstate->stage = z_pos;
|
pstates[i].sde_pstate->stage = z_pos;
|
||||||
@@ -5715,11 +5710,13 @@ static void sde_crtc_setup_capabilities_blob(struct sde_kms_info *info,
|
|||||||
"smart_dma_rev", "smart_dma_v2p5");
|
"smart_dma_rev", "smart_dma_v2p5");
|
||||||
}
|
}
|
||||||
|
|
||||||
sde_kms_info_add_keyint(info, "has_src_split", catalog->has_src_split);
|
sde_kms_info_add_keyint(info, "has_src_split", test_bit(SDE_FEATURE_SRC_SPLIT,
|
||||||
sde_kms_info_add_keyint(info, "has_hdr", catalog->has_hdr);
|
catalog->features));
|
||||||
sde_kms_info_add_keyint(info, "has_hdr_plus", catalog->has_hdr_plus);
|
sde_kms_info_add_keyint(info, "has_hdr", test_bit(SDE_FEATURE_HDR, catalog->features));
|
||||||
|
sde_kms_info_add_keyint(info, "has_hdr_plus", test_bit(SDE_FEATURE_HDR_PLUS,
|
||||||
|
catalog->features));
|
||||||
sde_kms_info_add_keyint(info, "skip_inline_rot_threshold",
|
sde_kms_info_add_keyint(info, "skip_inline_rot_threshold",
|
||||||
catalog->skip_inline_rot_threshold);
|
test_bit(SDE_FEATURE_INLINE_SKIP_THRESHOLD, catalog->features));
|
||||||
|
|
||||||
if (catalog->allowed_dsc_reservation_switch)
|
if (catalog->allowed_dsc_reservation_switch)
|
||||||
sde_kms_info_add_keyint(info, "allowed_dsc_reservation_switch",
|
sde_kms_info_add_keyint(info, "allowed_dsc_reservation_switch",
|
||||||
@@ -5849,7 +5846,7 @@ static void sde_crtc_install_properties(struct drm_crtc *crtc,
|
|||||||
"idle_time", 0, 0, U64_MAX, 0,
|
"idle_time", 0, 0, U64_MAX, 0,
|
||||||
CRTC_PROP_IDLE_TIMEOUT);
|
CRTC_PROP_IDLE_TIMEOUT);
|
||||||
|
|
||||||
if (catalog->has_trusted_vm_support) {
|
if (test_bit(SDE_FEATURE_TRUSTED_VM, catalog->features)) {
|
||||||
int init_idx = sde_in_trusted_vm(sde_kms) ? 1 : 0;
|
int init_idx = sde_in_trusted_vm(sde_kms) ? 1 : 0;
|
||||||
|
|
||||||
msm_property_install_enum(&sde_crtc->property_info,
|
msm_property_install_enum(&sde_crtc->property_info,
|
||||||
@@ -5858,18 +5855,18 @@ static void sde_crtc_install_properties(struct drm_crtc *crtc,
|
|||||||
CRTC_PROP_VM_REQ_STATE);
|
CRTC_PROP_VM_REQ_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (catalog->has_idle_pc)
|
if (test_bit(SDE_FEATURE_IDLE_PC, catalog->features))
|
||||||
msm_property_install_enum(&sde_crtc->property_info,
|
msm_property_install_enum(&sde_crtc->property_info,
|
||||||
"idle_pc_state", 0x0, 0, e_idle_pc_state,
|
"idle_pc_state", 0x0, 0, e_idle_pc_state,
|
||||||
ARRAY_SIZE(e_idle_pc_state), 0,
|
ARRAY_SIZE(e_idle_pc_state), 0,
|
||||||
CRTC_PROP_IDLE_PC_STATE);
|
CRTC_PROP_IDLE_PC_STATE);
|
||||||
|
|
||||||
if (catalog->has_dedicated_cwb_support)
|
if (test_bit(SDE_FEATURE_DEDICATED_CWB, catalog->features))
|
||||||
msm_property_install_enum(&sde_crtc->property_info,
|
msm_property_install_enum(&sde_crtc->property_info,
|
||||||
"capture_mode", 0, 0, e_dcwb_data_points,
|
"capture_mode", 0, 0, e_dcwb_data_points,
|
||||||
ARRAY_SIZE(e_dcwb_data_points), 0,
|
ARRAY_SIZE(e_dcwb_data_points), 0,
|
||||||
CRTC_PROP_CAPTURE_OUTPUT);
|
CRTC_PROP_CAPTURE_OUTPUT);
|
||||||
else if (catalog->has_cwb_support)
|
else if (test_bit(SDE_FEATURE_CWB, catalog->features))
|
||||||
msm_property_install_enum(&sde_crtc->property_info,
|
msm_property_install_enum(&sde_crtc->property_info,
|
||||||
"capture_mode", 0, 0, e_cwb_data_points,
|
"capture_mode", 0, 0, e_cwb_data_points,
|
||||||
ARRAY_SIZE(e_cwb_data_points), 0,
|
ARRAY_SIZE(e_cwb_data_points), 0,
|
||||||
@@ -5883,13 +5880,13 @@ static void sde_crtc_install_properties(struct drm_crtc *crtc,
|
|||||||
ARRAY_SIZE(e_secure_level), 0,
|
ARRAY_SIZE(e_secure_level), 0,
|
||||||
CRTC_PROP_SECURITY_LEVEL);
|
CRTC_PROP_SECURITY_LEVEL);
|
||||||
|
|
||||||
if (catalog->syscache_supported)
|
if (test_bit(SDE_FEATURE_SYSCACHE, catalog->features))
|
||||||
msm_property_install_enum(&sde_crtc->property_info, "cache_state",
|
msm_property_install_enum(&sde_crtc->property_info, "cache_state",
|
||||||
0x0, 0, e_cache_state,
|
0x0, 0, e_cache_state,
|
||||||
ARRAY_SIZE(e_cache_state), 0,
|
ARRAY_SIZE(e_cache_state), 0,
|
||||||
CRTC_PROP_CACHE_STATE);
|
CRTC_PROP_CACHE_STATE);
|
||||||
|
|
||||||
if (catalog->has_dim_layer) {
|
if (test_bit(SDE_FEATURE_DIM_LAYER, catalog->features)) {
|
||||||
msm_property_install_volatile_range(&sde_crtc->property_info,
|
msm_property_install_volatile_range(&sde_crtc->property_info,
|
||||||
"dim_layer_v1", 0x0, 0, ~0, 0, CRTC_PROP_DIM_LAYER_V1);
|
"dim_layer_v1", 0x0, 0, ~0, 0, CRTC_PROP_DIM_LAYER_V1);
|
||||||
sde_kms_info_add_keyint(info, "dim_layer_v1_max_layers",
|
sde_kms_info_add_keyint(info, "dim_layer_v1_max_layers",
|
||||||
@@ -5921,7 +5918,7 @@ static void sde_crtc_install_properties(struct drm_crtc *crtc,
|
|||||||
DRM_MODE_PROP_IMMUTABLE, CRTC_PROP_INFO);
|
DRM_MODE_PROP_IMMUTABLE, CRTC_PROP_INFO);
|
||||||
|
|
||||||
sde_kms_info_add_keyint(info, "use_baselayer_for_stage",
|
sde_kms_info_add_keyint(info, "use_baselayer_for_stage",
|
||||||
catalog->has_base_layer);
|
test_bit(SDE_FEATURE_BASE_LAYER, catalog->features));
|
||||||
|
|
||||||
msm_property_set_blob(&sde_crtc->property_info, &sde_crtc->blob_info,
|
msm_property_set_blob(&sde_crtc->property_info, &sde_crtc->blob_info,
|
||||||
info->data, SDE_KMS_INFO_DATALEN(info),
|
info->data, SDE_KMS_INFO_DATALEN(info),
|
||||||
@@ -5929,7 +5926,7 @@ static void sde_crtc_install_properties(struct drm_crtc *crtc,
|
|||||||
|
|
||||||
sde_crtc_install_noise_layer_properties(sde_crtc, catalog, info);
|
sde_crtc_install_noise_layer_properties(sde_crtc, catalog, info);
|
||||||
|
|
||||||
if (catalog->has_ubwc_stats)
|
if (test_bit(SDE_FEATURE_UBWC_STATS, catalog->features))
|
||||||
msm_property_install_range(&sde_crtc->property_info, "frame_data",
|
msm_property_install_range(&sde_crtc->property_info, "frame_data",
|
||||||
0x0, 0, ~0, 0, CRTC_PROP_FRAME_DATA_BUF);
|
0x0, 0, ~0, 0, CRTC_PROP_FRAME_DATA_BUF);
|
||||||
|
|
||||||
@@ -7023,7 +7020,7 @@ void sde_crtc_static_img_control(struct drm_crtc *crtc,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sde_kms->catalog->syscache_supported) {
|
if (!test_bit(SDE_FEATURE_SYSCACHE, sde_kms->catalog->features)) {
|
||||||
SDE_DEBUG("syscache not supported\n");
|
SDE_DEBUG("syscache not supported\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -7231,7 +7228,8 @@ struct drm_crtc *sde_crtc_init(struct drm_device *dev, struct drm_plane *plane)
|
|||||||
sde_crtc_frame_event_work);
|
sde_crtc_frame_event_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
crtc_funcs = kms->catalog->has_precise_vsync_ts ? &sde_crtc_funcs_v1 : &sde_crtc_funcs;
|
crtc_funcs = test_bit(SDE_FEATURE_HW_VSYNC_TS, kms->catalog->features) ?
|
||||||
|
&sde_crtc_funcs_v1 : &sde_crtc_funcs;
|
||||||
drm_crtc_init_with_planes(dev, crtc, plane, NULL, crtc_funcs, NULL);
|
drm_crtc_init_with_planes(dev, crtc, plane, NULL, crtc_funcs, NULL);
|
||||||
drm_crtc_helper_add(crtc, &sde_crtc_helper_funcs);
|
drm_crtc_helper_add(crtc, &sde_crtc_helper_funcs);
|
||||||
|
|
||||||
@@ -7640,7 +7638,7 @@ static void sde_cp_crtc_apply_noise(struct drm_crtc *crtc,
|
|||||||
cfg.alpha_noise = cstate->layer_cfg.alpha_noise;
|
cfg.alpha_noise = cstate->layer_cfg.alpha_noise;
|
||||||
cfg.attn_factor = cstate->layer_cfg.attn_factor;
|
cfg.attn_factor = cstate->layer_cfg.attn_factor;
|
||||||
cfg.strength = cstate->layer_cfg.strength;
|
cfg.strength = cstate->layer_cfg.strength;
|
||||||
if (!kms->catalog->has_base_layer) {
|
if (!test_bit(SDE_FEATURE_BASE_LAYER, kms->catalog->features)) {
|
||||||
cfg.noise_blend_stage = cstate->layer_cfg.zposn + SDE_STAGE_0;
|
cfg.noise_blend_stage = cstate->layer_cfg.zposn + SDE_STAGE_0;
|
||||||
cfg.attn_blend_stage = cstate->layer_cfg.zposattn + SDE_STAGE_0;
|
cfg.attn_blend_stage = cstate->layer_cfg.zposattn + SDE_STAGE_0;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -3355,7 +3355,8 @@ static void sde_encoder_vblank_callback(struct drm_encoder *drm_enc,
|
|||||||
* calculate accurate vsync timestamp when available
|
* calculate accurate vsync timestamp when available
|
||||||
* set current time otherwise
|
* set current time otherwise
|
||||||
*/
|
*/
|
||||||
if (phy_enc->sde_kms && phy_enc->sde_kms->catalog->has_precise_vsync_ts)
|
if (phy_enc->sde_kms && test_bit(SDE_FEATURE_HW_VSYNC_TS,
|
||||||
|
phy_enc->sde_kms->catalog->features))
|
||||||
ts = sde_encoder_calc_last_vsync_timestamp(drm_enc);
|
ts = sde_encoder_calc_last_vsync_timestamp(drm_enc);
|
||||||
if (!ts)
|
if (!ts)
|
||||||
ts = ktime_get();
|
ts = ktime_get();
|
||||||
@@ -3485,9 +3486,9 @@ static void sde_encoder_frame_done_callback(
|
|||||||
is_cmd_mode = true;
|
is_cmd_mode = true;
|
||||||
|
|
||||||
/* get precise vsync timestamp for retire fence, if precise vsync timestamp is enabled */
|
/* get precise vsync timestamp for retire fence, if precise vsync timestamp is enabled */
|
||||||
if (sde_kms->catalog->has_precise_vsync_ts
|
if (test_bit(SDE_FEATURE_HW_VSYNC_TS, sde_kms->catalog->features) &&
|
||||||
&& (event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE)
|
(event & SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE) &&
|
||||||
&& (!(event & (SDE_ENCODER_FRAME_EVENT_ERROR | SDE_ENCODER_FRAME_EVENT_PANEL_DEAD))))
|
(!(event & (SDE_ENCODER_FRAME_EVENT_ERROR | SDE_ENCODER_FRAME_EVENT_PANEL_DEAD))))
|
||||||
ts = sde_encoder_calc_last_vsync_timestamp(drm_enc);
|
ts = sde_encoder_calc_last_vsync_timestamp(drm_enc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -5092,9 +5093,11 @@ static int sde_encoder_setup_display(struct sde_encoder_virt *sde_enc,
|
|||||||
|
|
||||||
if ((disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE) ||
|
if ((disp_info->capabilities & MSM_DISPLAY_CAP_CMD_MODE) ||
|
||||||
(disp_info->capabilities & MSM_DISPLAY_CAP_VID_MODE))
|
(disp_info->capabilities & MSM_DISPLAY_CAP_VID_MODE))
|
||||||
sde_enc->idle_pc_enabled = sde_kms->catalog->has_idle_pc;
|
sde_enc->idle_pc_enabled = test_bit(SDE_FEATURE_IDLE_PC,
|
||||||
|
sde_kms->catalog->features);
|
||||||
|
|
||||||
sde_enc->input_event_enabled = sde_kms->catalog->wakeup_with_touch;
|
sde_enc->input_event_enabled = test_bit(SDE_FEATURE_TOUCH_WAKEUP,
|
||||||
|
sde_kms->catalog->features);
|
||||||
|
|
||||||
mutex_lock(&sde_enc->enc_lock);
|
mutex_lock(&sde_enc->enc_lock);
|
||||||
for (i = 0; i < disp_info->num_of_h_tiles && !ret; i++) {
|
for (i = 0; i < disp_info->num_of_h_tiles && !ret; i++) {
|
||||||
|
@@ -230,7 +230,7 @@ static u32 programmable_fetch_get_num_lines(
|
|||||||
if (start_of_frame_lines >= needed_prefill_lines) {
|
if (start_of_frame_lines >= needed_prefill_lines) {
|
||||||
SDE_DEBUG_VIDENC(vid_enc,
|
SDE_DEBUG_VIDENC(vid_enc,
|
||||||
"prog fetch always enabled case\n");
|
"prog fetch always enabled case\n");
|
||||||
actual_vfp_lines = (m->delay_prg_fetch_start) ? 2 : 1;
|
actual_vfp_lines = (test_bit(SDE_FEATURE_DELAY_PRG_FETCH, m->features)) ? 2 : 1;
|
||||||
} else if (v_front_porch < needed_vfp_lines) {
|
} else if (v_front_porch < needed_vfp_lines) {
|
||||||
/* Warn fetch needed, but not enough porch in panel config */
|
/* Warn fetch needed, but not enough porch in panel config */
|
||||||
pr_warn_once
|
pr_warn_once
|
||||||
@@ -293,7 +293,7 @@ static void programmable_fetch_config(struct sde_encoder_phys *phys_enc,
|
|||||||
* Check if we need to throttle the fetch to start
|
* Check if we need to throttle the fetch to start
|
||||||
* from second line after the active region.
|
* from second line after the active region.
|
||||||
*/
|
*/
|
||||||
if (m->delay_prg_fetch_start)
|
if (test_bit(SDE_FEATURE_DELAY_PRG_FETCH, m->features))
|
||||||
vfp_fetch_start_vsync_counter += horiz_total;
|
vfp_fetch_start_vsync_counter += horiz_total;
|
||||||
|
|
||||||
f.enable = 1;
|
f.enable = 1;
|
||||||
|
@@ -1876,7 +1876,7 @@ static void sde_encoder_phys_wb_disable(struct sde_encoder_phys *phys_enc)
|
|||||||
* If has_3d_merge_reset is not set, legacy reset
|
* If has_3d_merge_reset is not set, legacy reset
|
||||||
* sequence is executed.
|
* sequence is executed.
|
||||||
*/
|
*/
|
||||||
if (hw_wb->catalog->has_3d_merge_reset) {
|
if (test_bit(SDE_FEATURE_3D_MERGE_RESET, hw_wb->catalog->features)) {
|
||||||
sde_encoder_helper_phys_disable(phys_enc, wb_enc);
|
sde_encoder_helper_phys_disable(phys_enc, wb_enc);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
@@ -1622,7 +1622,7 @@ static int _sde_sspp_setup_vigs(struct device_node *np,
|
|||||||
MAX_DOWNSCALE_RATIO_INROT_NRT_DEFAULT;
|
MAX_DOWNSCALE_RATIO_INROT_NRT_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sde_cfg->inline_disable_const_clr)
|
if (test_bit(SDE_FEATURE_INLINE_DISABLE_CONST_CLR, sde_cfg->features))
|
||||||
set_bit(SDE_SSPP_INLINE_CONST_CLR, &sspp->features);
|
set_bit(SDE_SSPP_INLINE_CONST_CLR, &sspp->features);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1914,7 +1914,7 @@ static void sde_sspp_set_features(struct sde_mdss_cfg *sde_cfg,
|
|||||||
sblk->src_blk.id = SDE_SSPP_SRC;
|
sblk->src_blk.id = SDE_SSPP_SRC;
|
||||||
set_bit(SDE_SSPP_SRC, &sspp->features);
|
set_bit(SDE_SSPP_SRC, &sspp->features);
|
||||||
|
|
||||||
if (sde_cfg->has_cdp)
|
if (test_bit(SDE_FEATURE_CDP, sde_cfg->features))
|
||||||
set_bit(SDE_PERF_SSPP_CDP, &sspp->perf_features);
|
set_bit(SDE_PERF_SSPP_CDP, &sspp->perf_features);
|
||||||
|
|
||||||
if (sde_cfg->ts_prefill_rev == 1) {
|
if (sde_cfg->ts_prefill_rev == 1) {
|
||||||
@@ -1931,10 +1931,10 @@ static void sde_sspp_set_features(struct sde_mdss_cfg *sde_cfg,
|
|||||||
if (sde_cfg->sc_cfg[SDE_SYS_CACHE_DISP].has_sys_cache)
|
if (sde_cfg->sc_cfg[SDE_SYS_CACHE_DISP].has_sys_cache)
|
||||||
set_bit(SDE_PERF_SSPP_SYS_CACHE, &sspp->perf_features);
|
set_bit(SDE_PERF_SSPP_SYS_CACHE, &sspp->perf_features);
|
||||||
|
|
||||||
if (sde_cfg->sspp_multirect_error)
|
if (test_bit(SDE_FEATURE_MULTIRECT_ERROR, sde_cfg->features))
|
||||||
set_bit(SDE_SSPP_MULTIRECT_ERROR, &sspp->features);
|
set_bit(SDE_SSPP_MULTIRECT_ERROR, &sspp->features);
|
||||||
|
|
||||||
if (sde_cfg->has_decimation) {
|
if (test_bit(SDE_FEATURE_DECIMATION, sde_cfg->features)) {
|
||||||
sblk->maxhdeciexp = MAX_HORZ_DECIMATION;
|
sblk->maxhdeciexp = MAX_HORZ_DECIMATION;
|
||||||
sblk->maxvdeciexp = MAX_VERT_DECIMATION;
|
sblk->maxvdeciexp = MAX_VERT_DECIMATION;
|
||||||
} else {
|
} else {
|
||||||
@@ -1960,7 +1960,7 @@ static void sde_sspp_set_features(struct sde_mdss_cfg *sde_cfg,
|
|||||||
else
|
else
|
||||||
sblk->max_per_pipe_bw_high = sblk->max_per_pipe_bw;
|
sblk->max_per_pipe_bw_high = sblk->max_per_pipe_bw;
|
||||||
|
|
||||||
if (sde_cfg->has_ubwc_stats)
|
if (test_bit(SDE_FEATURE_UBWC_STATS, sde_cfg->features))
|
||||||
set_bit(SDE_SSPP_UBWC_STATS, &sspp->features);
|
set_bit(SDE_SSPP_UBWC_STATS, &sspp->features);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2286,11 +2286,11 @@ static int sde_mixer_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_c
|
|||||||
PROP_VALUE_ACCESS(blend_props->values,
|
PROP_VALUE_ACCESS(blend_props->values,
|
||||||
MIXER_BLEND_OP_OFF, j);
|
MIXER_BLEND_OP_OFF, j);
|
||||||
|
|
||||||
if (sde_cfg->has_src_split)
|
if (test_bit(SDE_FEATURE_SRC_SPLIT, sde_cfg->features))
|
||||||
set_bit(SDE_MIXER_SOURCESPLIT, &mixer->features);
|
set_bit(SDE_MIXER_SOURCESPLIT, &mixer->features);
|
||||||
if (sde_cfg->has_dim_layer)
|
if (test_bit(SDE_FEATURE_DIM_LAYER, sde_cfg->features))
|
||||||
set_bit(SDE_DIM_LAYER, &mixer->features);
|
set_bit(SDE_DIM_LAYER, &mixer->features);
|
||||||
if (sde_cfg->has_mixer_combined_alpha)
|
if (test_bit(SDE_FEATURE_COMBINED_ALPHA, sde_cfg->features))
|
||||||
set_bit(SDE_MIXER_COMBINED_ALPHA, &mixer->features);
|
set_bit(SDE_MIXER_COMBINED_ALPHA, &mixer->features);
|
||||||
|
|
||||||
of_property_read_string_index(np,
|
of_property_read_string_index(np,
|
||||||
@@ -2545,17 +2545,17 @@ static int sde_wb_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg)
|
|||||||
set_bit(SDE_WB_TRAFFIC_SHAPER, &wb->features);
|
set_bit(SDE_WB_TRAFFIC_SHAPER, &wb->features);
|
||||||
set_bit(SDE_WB_YUV_CONFIG, &wb->features);
|
set_bit(SDE_WB_YUV_CONFIG, &wb->features);
|
||||||
|
|
||||||
if (sde_cfg->has_cdp)
|
if (test_bit(SDE_FEATURE_CDP, sde_cfg->features))
|
||||||
set_bit(SDE_WB_CDP, &wb->features);
|
set_bit(SDE_WB_CDP, &wb->features);
|
||||||
|
|
||||||
set_bit(SDE_WB_QOS, &wb->features);
|
set_bit(SDE_WB_QOS, &wb->features);
|
||||||
if (sde_cfg->vbif_qos_nlvl == 8)
|
if (sde_cfg->vbif_qos_nlvl == 8)
|
||||||
set_bit(SDE_WB_QOS_8LVL, &wb->features);
|
set_bit(SDE_WB_QOS_8LVL, &wb->features);
|
||||||
|
|
||||||
if (sde_cfg->has_wb_ubwc)
|
if (test_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features))
|
||||||
set_bit(SDE_WB_UBWC, &wb->features);
|
set_bit(SDE_WB_UBWC, &wb->features);
|
||||||
|
|
||||||
if (sde_cfg->has_cwb_crop)
|
if (test_bit(SDE_FEATURE_CWB_CROP, sde_cfg->features))
|
||||||
set_bit(SDE_WB_CROP, &wb->features);
|
set_bit(SDE_WB_CROP, &wb->features);
|
||||||
|
|
||||||
set_bit(SDE_WB_XY_ROI_OFFSET, &wb->features);
|
set_bit(SDE_WB_XY_ROI_OFFSET, &wb->features);
|
||||||
@@ -2563,7 +2563,7 @@ static int sde_wb_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg)
|
|||||||
if (IS_SDE_CTL_REV_100(sde_cfg->ctl_rev))
|
if (IS_SDE_CTL_REV_100(sde_cfg->ctl_rev))
|
||||||
set_bit(SDE_WB_INPUT_CTRL, &wb->features);
|
set_bit(SDE_WB_INPUT_CTRL, &wb->features);
|
||||||
|
|
||||||
if (sde_cfg->has_dedicated_cwb_support) {
|
if (test_bit(SDE_FEATURE_DEDICATED_CWB, sde_cfg->features)) {
|
||||||
set_bit(SDE_WB_HAS_DCWB, &wb->features);
|
set_bit(SDE_WB_HAS_DCWB, &wb->features);
|
||||||
if (IS_SDE_CTL_REV_100(sde_cfg->ctl_rev))
|
if (IS_SDE_CTL_REV_100(sde_cfg->ctl_rev))
|
||||||
set_bit(SDE_WB_DCWB_CTRL, &wb->features);
|
set_bit(SDE_WB_DCWB_CTRL, &wb->features);
|
||||||
@@ -2575,10 +2575,10 @@ static int sde_wb_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg)
|
|||||||
sde_cfg->cwb_blk_stride = 0x100;
|
sde_cfg->cwb_blk_stride = 0x100;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sde_cfg->has_cwb_dither)
|
if (test_bit(SDE_FEATURE_CWB_DITHER, sde_cfg->features))
|
||||||
set_bit(SDE_WB_CWB_DITHER_CTRL, &wb->features);
|
set_bit(SDE_WB_CWB_DITHER_CTRL, &wb->features);
|
||||||
|
|
||||||
} else if (sde_cfg->has_cwb_support) {
|
} else if (test_bit(SDE_FEATURE_CWB, sde_cfg->features)) {
|
||||||
set_bit(SDE_WB_HAS_CWB, &wb->features);
|
set_bit(SDE_WB_HAS_CWB, &wb->features);
|
||||||
if (IS_SDE_CTL_REV_100(sde_cfg->ctl_rev))
|
if (IS_SDE_CTL_REV_100(sde_cfg->ctl_rev))
|
||||||
set_bit(SDE_WB_CWB_CTRL, &wb->features);
|
set_bit(SDE_WB_CWB_CTRL, &wb->features);
|
||||||
@@ -3496,7 +3496,7 @@ static int sde_cache_parse_dt(struct device_node *np,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sde_cfg->syscache_supported)
|
if (!test_bit(SDE_FEATURE_SYSCACHE, sde_cfg->features))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
llcc_node = of_find_node_by_name(NULL, "cache-controller");
|
llcc_node = of_find_node_by_name(NULL, "cache-controller");
|
||||||
@@ -3675,7 +3675,7 @@ static int _sde_vbif_populate(struct sde_mdss_cfg *sde_cfg,
|
|||||||
for (j = 0; j < prop_count[VBIF_MEMTYPE_1]; j++)
|
for (j = 0; j < prop_count[VBIF_MEMTYPE_1]; j++)
|
||||||
vbif->memtype[k++] = PROP_VALUE_ACCESS(
|
vbif->memtype[k++] = PROP_VALUE_ACCESS(
|
||||||
prop_value, VBIF_MEMTYPE_1, j);
|
prop_value, VBIF_MEMTYPE_1, j);
|
||||||
if (sde_cfg->vbif_disable_inner_outer_shareable)
|
if (test_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features))
|
||||||
set_bit(SDE_VBIF_DISABLE_SHAREABLE, &vbif->features);
|
set_bit(SDE_VBIF_DISABLE_SHAREABLE, &vbif->features);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -3844,7 +3844,7 @@ static int sde_pp_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg)
|
|||||||
|
|
||||||
if (PROP_VALUE_ACCESS(prop_value, PP_CWB, i)) {
|
if (PROP_VALUE_ACCESS(prop_value, PP_CWB, i)) {
|
||||||
set_bit(SDE_PINGPONG_CWB, &pp->features);
|
set_bit(SDE_PINGPONG_CWB, &pp->features);
|
||||||
if (sde_cfg->has_dedicated_cwb_support)
|
if (test_bit(SDE_FEATURE_DEDICATED_CWB, sde_cfg->features))
|
||||||
sde_cfg->dcwb_count++;
|
sde_cfg->dcwb_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3872,12 +3872,12 @@ static int sde_pp_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg)
|
|||||||
sblk->dither.version = PROP_VALUE_ACCESS(prop_value, DITHER_VER,
|
sblk->dither.version = PROP_VALUE_ACCESS(prop_value, DITHER_VER,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if (sde_cfg->has_cwb_dither &&
|
if (test_bit(SDE_FEATURE_CWB_DITHER, sde_cfg->features) &&
|
||||||
PROP_VALUE_ACCESS(prop_value, CWB_DITHER, i)) {
|
PROP_VALUE_ACCESS(prop_value, CWB_DITHER, i)) {
|
||||||
set_bit(SDE_PINGPONG_CWB_DITHER, &pp->features);
|
set_bit(SDE_PINGPONG_CWB_DITHER, &pp->features);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sde_cfg->dither_luma_mode_support)
|
if (test_bit(SDE_FEATURE_DITHER_LUMA_MODE, sde_cfg->features))
|
||||||
set_bit(SDE_PINGPONG_DITHER_LUMA, &pp->features);
|
set_bit(SDE_PINGPONG_DITHER_LUMA, &pp->features);
|
||||||
|
|
||||||
if (prop_exists[PP_MERGE_3D_ID]) {
|
if (prop_exists[PP_MERGE_3D_ID]) {
|
||||||
@@ -3972,18 +3972,21 @@ static void _sde_top_parse_dt_helper(struct sde_mdss_cfg *cfg,
|
|||||||
SEC_SID_MASK, i);
|
SEC_SID_MASK, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg->has_src_split = PROP_VALUE_ACCESS(props->values, SRC_SPLIT, 0);
|
if (PROP_VALUE_ACCESS(props->values, SRC_SPLIT, 0))
|
||||||
cfg->has_dim_layer = PROP_VALUE_ACCESS(props->values, DIM_LAYER, 0);
|
set_bit(SDE_FEATURE_SRC_SPLIT, cfg->features);
|
||||||
cfg->has_idle_pc = PROP_VALUE_ACCESS(props->values, IDLE_PC, 0);
|
if (PROP_VALUE_ACCESS(props->values, DIM_LAYER, 0))
|
||||||
cfg->wakeup_with_touch = PROP_VALUE_ACCESS(props->values,
|
set_bit(SDE_FEATURE_DIM_LAYER, cfg->features);
|
||||||
WAKEUP_WITH_TOUCH, 0);
|
if (PROP_VALUE_ACCESS(props->values, IDLE_PC, 0))
|
||||||
|
set_bit(SDE_FEATURE_IDLE_PC, cfg->features);
|
||||||
|
if (PROP_VALUE_ACCESS(props->values, WAKEUP_WITH_TOUCH, 0))
|
||||||
|
set_bit(SDE_FEATURE_TOUCH_WAKEUP, cfg->features);
|
||||||
cfg->pipe_order_type = PROP_VALUE_ACCESS(props->values,
|
cfg->pipe_order_type = PROP_VALUE_ACCESS(props->values,
|
||||||
PIPE_ORDER_VERSION, 0);
|
PIPE_ORDER_VERSION, 0);
|
||||||
cfg->has_base_layer = PROP_VALUE_ACCESS(props->values, BASE_LAYER, 0);
|
if (PROP_VALUE_ACCESS(props->values, BASE_LAYER, 0))
|
||||||
|
set_bit(SDE_FEATURE_BASE_LAYER, cfg->features);
|
||||||
cfg->qseed_hw_version = PROP_VALUE_ACCESS(props->values,
|
cfg->qseed_hw_version = PROP_VALUE_ACCESS(props->values,
|
||||||
QSEED_HW_VERSION, 0);
|
QSEED_HW_VERSION, 0);
|
||||||
cfg->trusted_vm_env = PROP_VALUE_ACCESS(props->values, TRUSTED_VM_ENV,
|
cfg->trusted_vm_env = PROP_VALUE_ACCESS(props->values, TRUSTED_VM_ENV, 0);
|
||||||
0);
|
|
||||||
cfg->max_trusted_vm_displays = PROP_VALUE_ACCESS(props->values,
|
cfg->max_trusted_vm_displays = PROP_VALUE_ACCESS(props->values,
|
||||||
MAX_TRUSTED_VM_DISPLAYS, 0);
|
MAX_TRUSTED_VM_DISPLAYS, 0);
|
||||||
if (props->exists[TVM_INCLUDE_REG]) {
|
if (props->exists[TVM_INCLUDE_REG]) {
|
||||||
@@ -4413,7 +4416,7 @@ static int _sde_perf_parse_dt_cfg(struct device_node *np,
|
|||||||
cfg->perf.cdp_cfg[j].wr_enable);
|
cfg->perf.cdp_cfg[j].wr_enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg->has_cdp = true;
|
set_bit(SDE_FEATURE_CDP, cfg->features);
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg->perf.cpu_mask =
|
cfg->perf.cpu_mask =
|
||||||
@@ -4612,7 +4615,7 @@ static int sde_hardware_format_caps(struct sde_mdss_cfg *sde_cfg,
|
|||||||
const struct sde_format_extended *inline_restricted_fmt_tbl = NULL;
|
const struct sde_format_extended *inline_restricted_fmt_tbl = NULL;
|
||||||
|
|
||||||
/* cursor input formats */
|
/* cursor input formats */
|
||||||
if (sde_cfg->has_cursor) {
|
if (test_bit(SDE_FEATURE_CURSOR, sde_cfg->features)) {
|
||||||
cursor_list_size = ARRAY_SIZE(cursor_formats);
|
cursor_list_size = ARRAY_SIZE(cursor_formats);
|
||||||
sde_cfg->cursor_formats = kcalloc(cursor_list_size,
|
sde_cfg->cursor_formats = kcalloc(cursor_list_size,
|
||||||
sizeof(struct sde_format_extended), GFP_KERNEL);
|
sizeof(struct sde_format_extended), GFP_KERNEL);
|
||||||
@@ -4627,7 +4630,7 @@ static int sde_hardware_format_caps(struct sde_mdss_cfg *sde_cfg,
|
|||||||
|
|
||||||
/* DMA pipe input formats */
|
/* DMA pipe input formats */
|
||||||
dma_list_size = ARRAY_SIZE(plane_formats);
|
dma_list_size = ARRAY_SIZE(plane_formats);
|
||||||
if (sde_cfg->has_fp16)
|
if (test_bit(SDE_FEATURE_FP16, sde_cfg->features))
|
||||||
dma_list_size += ARRAY_SIZE(fp16_formats);
|
dma_list_size += ARRAY_SIZE(fp16_formats);
|
||||||
|
|
||||||
sde_cfg->dma_formats = kcalloc(dma_list_size,
|
sde_cfg->dma_formats = kcalloc(dma_list_size,
|
||||||
@@ -4639,15 +4642,15 @@ static int sde_hardware_format_caps(struct sde_mdss_cfg *sde_cfg,
|
|||||||
|
|
||||||
index = sde_copy_formats(sde_cfg->dma_formats, dma_list_size,
|
index = sde_copy_formats(sde_cfg->dma_formats, dma_list_size,
|
||||||
0, plane_formats, ARRAY_SIZE(plane_formats));
|
0, plane_formats, ARRAY_SIZE(plane_formats));
|
||||||
if (sde_cfg->has_fp16)
|
if (test_bit(SDE_FEATURE_FP16, sde_cfg->features))
|
||||||
index += sde_copy_formats(sde_cfg->dma_formats, dma_list_size,
|
index += sde_copy_formats(sde_cfg->dma_formats, dma_list_size,
|
||||||
index, fp16_formats, ARRAY_SIZE(fp16_formats));
|
index, fp16_formats, ARRAY_SIZE(fp16_formats));
|
||||||
|
|
||||||
/* ViG pipe input formats */
|
/* ViG pipe input formats */
|
||||||
vig_list_size = ARRAY_SIZE(plane_formats_vig);
|
vig_list_size = ARRAY_SIZE(plane_formats_vig);
|
||||||
if (sde_cfg->has_vig_p010)
|
if (test_bit(SDE_FEATURE_VIG_P010, sde_cfg->features))
|
||||||
vig_list_size += ARRAY_SIZE(p010_ubwc_formats);
|
vig_list_size += ARRAY_SIZE(p010_ubwc_formats);
|
||||||
if (sde_cfg->has_fp16)
|
if (test_bit(SDE_FEATURE_FP16, sde_cfg->features))
|
||||||
vig_list_size += ARRAY_SIZE(fp16_formats);
|
vig_list_size += ARRAY_SIZE(fp16_formats);
|
||||||
|
|
||||||
sde_cfg->vig_formats = kcalloc(vig_list_size,
|
sde_cfg->vig_formats = kcalloc(vig_list_size,
|
||||||
@@ -4659,17 +4662,17 @@ static int sde_hardware_format_caps(struct sde_mdss_cfg *sde_cfg,
|
|||||||
|
|
||||||
index = sde_copy_formats(sde_cfg->vig_formats, vig_list_size,
|
index = sde_copy_formats(sde_cfg->vig_formats, vig_list_size,
|
||||||
0, plane_formats_vig, ARRAY_SIZE(plane_formats_vig));
|
0, plane_formats_vig, ARRAY_SIZE(plane_formats_vig));
|
||||||
if (sde_cfg->has_vig_p010)
|
if (test_bit(SDE_FEATURE_VIG_P010, sde_cfg->features))
|
||||||
index += sde_copy_formats(sde_cfg->vig_formats,
|
index += sde_copy_formats(sde_cfg->vig_formats,
|
||||||
vig_list_size, index, p010_ubwc_formats,
|
vig_list_size, index, p010_ubwc_formats,
|
||||||
ARRAY_SIZE(p010_ubwc_formats));
|
ARRAY_SIZE(p010_ubwc_formats));
|
||||||
if (sde_cfg->has_fp16)
|
if (test_bit(SDE_FEATURE_FP16, sde_cfg->features))
|
||||||
index += sde_copy_formats(sde_cfg->vig_formats, vig_list_size,
|
index += sde_copy_formats(sde_cfg->vig_formats, vig_list_size,
|
||||||
index, fp16_formats, ARRAY_SIZE(fp16_formats));
|
index, fp16_formats, ARRAY_SIZE(fp16_formats));
|
||||||
|
|
||||||
/* Virtual ViG pipe input formats (all virt pipes use DMA formats) */
|
/* Virtual ViG pipe input formats (all virt pipes use DMA formats) */
|
||||||
virt_vig_list_size = ARRAY_SIZE(plane_formats);
|
virt_vig_list_size = ARRAY_SIZE(plane_formats);
|
||||||
if (sde_cfg->has_fp16)
|
if (test_bit(SDE_FEATURE_FP16, sde_cfg->features))
|
||||||
virt_vig_list_size += ARRAY_SIZE(fp16_formats);
|
virt_vig_list_size += ARRAY_SIZE(fp16_formats);
|
||||||
|
|
||||||
sde_cfg->virt_vig_formats = kcalloc(virt_vig_list_size,
|
sde_cfg->virt_vig_formats = kcalloc(virt_vig_list_size,
|
||||||
@@ -4681,7 +4684,7 @@ static int sde_hardware_format_caps(struct sde_mdss_cfg *sde_cfg,
|
|||||||
|
|
||||||
index = sde_copy_formats(sde_cfg->virt_vig_formats, virt_vig_list_size,
|
index = sde_copy_formats(sde_cfg->virt_vig_formats, virt_vig_list_size,
|
||||||
0, plane_formats, ARRAY_SIZE(plane_formats));
|
0, plane_formats, ARRAY_SIZE(plane_formats));
|
||||||
if (sde_cfg->has_fp16)
|
if (test_bit(SDE_FEATURE_FP16, sde_cfg->features))
|
||||||
index += sde_copy_formats(sde_cfg->virt_vig_formats,
|
index += sde_copy_formats(sde_cfg->virt_vig_formats,
|
||||||
virt_vig_list_size, index, fp16_formats,
|
virt_vig_list_size, index, fp16_formats,
|
||||||
ARRAY_SIZE(fp16_formats));
|
ARRAY_SIZE(fp16_formats));
|
||||||
@@ -4752,7 +4755,7 @@ free_vig:
|
|||||||
free_dma:
|
free_dma:
|
||||||
kfree(sde_cfg->dma_formats);
|
kfree(sde_cfg->dma_formats);
|
||||||
free_cursor:
|
free_cursor:
|
||||||
if (sde_cfg->has_cursor)
|
if (test_bit(SDE_FEATURE_CURSOR, sde_cfg->features))
|
||||||
kfree(sde_cfg->cursor_formats);
|
kfree(sde_cfg->cursor_formats);
|
||||||
out:
|
out:
|
||||||
return rc;
|
return rc;
|
||||||
@@ -4810,7 +4813,12 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* default settings for *MOST* targets */
|
/* default settings for *MOST* targets */
|
||||||
sde_cfg->has_mixer_combined_alpha = true;
|
set_bit(SDE_FEATURE_COMBINED_ALPHA, sde_cfg->features);
|
||||||
|
set_bit(SDE_FEATURE_DELAY_PRG_FETCH, sde_cfg->features);
|
||||||
|
set_bit(SDE_FEATURE_SUI_MISR, sde_cfg->features);
|
||||||
|
set_bit(SDE_FEATURE_SUI_BLENDSTAGE, sde_cfg->features);
|
||||||
|
set_bit(SDE_FEATURE_SUI_NS_ALLOWED, sde_cfg->features);
|
||||||
|
set_bit(SDE_FEATURE_HDR, sde_cfg->features);
|
||||||
sde_cfg->mdss_hw_block_size = DEFAULT_MDSS_HW_BLOCK_SIZE;
|
sde_cfg->mdss_hw_block_size = DEFAULT_MDSS_HW_BLOCK_SIZE;
|
||||||
|
|
||||||
for (i = 0; i < SSPP_MAX; i++) {
|
for (i = 0; i < SSPP_MAX; i++) {
|
||||||
@@ -4821,326 +4829,271 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev)
|
|||||||
/* target specific settings */
|
/* target specific settings */
|
||||||
if (IS_MSM8996_TARGET(hw_rev)) {
|
if (IS_MSM8996_TARGET(hw_rev)) {
|
||||||
sde_cfg->perf.min_prefill_lines = 21;
|
sde_cfg->perf.min_prefill_lines = 21;
|
||||||
sde_cfg->has_decimation = true;
|
set_bit(SDE_FEATURE_DECIMATION, sde_cfg->features);
|
||||||
sde_cfg->has_mixer_combined_alpha = false;
|
clear_bit(SDE_FEATURE_COMBINED_ALPHA, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_HDR, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_DELAY_PRG_FETCH, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_MISR, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_BLENDSTAGE, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_NS_ALLOWED, sde_cfg->features);
|
||||||
} else if (IS_MSM8998_TARGET(hw_rev)) {
|
} else if (IS_MSM8998_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 25;
|
sde_cfg->perf.min_prefill_lines = 25;
|
||||||
sde_cfg->vbif_qos_nlvl = 4;
|
sde_cfg->vbif_qos_nlvl = 4;
|
||||||
sde_cfg->ts_prefill_rev = 1;
|
sde_cfg->ts_prefill_rev = 1;
|
||||||
sde_cfg->has_decimation = true;
|
set_bit(SDE_FEATURE_DECIMATION, sde_cfg->features);
|
||||||
sde_cfg->has_cursor = true;
|
set_bit(SDE_FEATURE_CURSOR, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
clear_bit(SDE_FEATURE_COMBINED_ALPHA, sde_cfg->features);
|
||||||
sde_cfg->has_mixer_combined_alpha = false;
|
clear_bit(SDE_FEATURE_DELAY_PRG_FETCH, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_MISR, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_BLENDSTAGE, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_NS_ALLOWED, sde_cfg->features);
|
||||||
} else if (IS_SDM845_TARGET(hw_rev)) {
|
} else if (IS_SDM845_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0x3F71;
|
sde_cfg->sui_block_xin_mask = 0x3F71;
|
||||||
sde_cfg->has_decimation = true;
|
set_bit(SDE_FEATURE_DECIMATION, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
clear_bit(SDE_FEATURE_DELAY_PRG_FETCH, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_BLENDSTAGE, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_NS_ALLOWED, sde_cfg->features);
|
||||||
} else if (IS_SDM670_TARGET(hw_rev)) {
|
} else if (IS_SDM670_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->has_decimation = true;
|
set_bit(SDE_FEATURE_DECIMATION, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
clear_bit(SDE_FEATURE_DELAY_PRG_FETCH, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_MISR, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_BLENDSTAGE, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_NS_ALLOWED, sde_cfg->features);
|
||||||
} else if (IS_SM8150_TARGET(hw_rev)) {
|
} else if (IS_SM8150_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
set_bit(SDE_FEATURE_HDR_PLUS, sde_cfg->features);
|
||||||
sde_cfg->has_hdr_plus = true;
|
|
||||||
set_bit(SDE_MDP_DHDR_MEMPOOL, &sde_cfg->mdp[0].features);
|
set_bit(SDE_MDP_DHDR_MEMPOOL, &sde_cfg->mdp[0].features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0x3F71;
|
sde_cfg->sui_block_xin_mask = 0x3F71;
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_3D_MERGE_RESET, sde_cfg->features);
|
||||||
sde_cfg->has_3d_merge_reset = true;
|
set_bit(SDE_FEATURE_DECIMATION, sde_cfg->features);
|
||||||
sde_cfg->has_decimation = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
|
||||||
} else if (IS_SDMSHRIKE_TARGET(hw_rev)) {
|
} else if (IS_SDMSHRIKE_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
set_bit(SDE_FEATURE_DECIMATION, sde_cfg->features);
|
||||||
sde_cfg->has_decimation = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
clear_bit(SDE_FEATURE_SUI_MISR, sde_cfg->features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
clear_bit(SDE_FEATURE_SUI_BLENDSTAGE, sde_cfg->features);
|
||||||
|
clear_bit(SDE_FEATURE_SUI_NS_ALLOWED, sde_cfg->features);
|
||||||
} else if (IS_SM6150_TARGET(hw_rev)) {
|
} else if (IS_SM6150_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
set_bit(SDE_FEATURE_DECIMATION, sde_cfg->features);
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->has_decimation = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0x2EE1;
|
sde_cfg->sui_block_xin_mask = 0x2EE1;
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_3D_MERGE_RESET, sde_cfg->features);
|
||||||
sde_cfg->has_3d_merge_reset = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
|
||||||
} else if (IS_SDMMAGPIE_TARGET(hw_rev)) {
|
} else if (IS_SDMMAGPIE_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
|
clear_bit(SDE_FEATURE_HDR, sde_cfg->features);
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0xE71;
|
sde_cfg->sui_block_xin_mask = 0xE71;
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_3D_MERGE_RESET, sde_cfg->features);
|
||||||
sde_cfg->has_3d_merge_reset = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
|
||||||
} else if (IS_KONA_TARGET(hw_rev)) {
|
} else if (IS_KONA_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 35;
|
sde_cfg->perf.min_prefill_lines = 35;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0x3F71;
|
sde_cfg->sui_block_xin_mask = 0x3F71;
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_3D_MERGE_RESET, sde_cfg->features);
|
||||||
sde_cfg->has_3d_merge_reset = true;
|
set_bit(SDE_FEATURE_HDR_PLUS, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
|
||||||
sde_cfg->has_hdr_plus = true;
|
|
||||||
set_bit(SDE_MDP_DHDR_MEMPOOL, &sde_cfg->mdp[0].features);
|
set_bit(SDE_MDP_DHDR_MEMPOOL, &sde_cfg->mdp[0].features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_1_0_0;
|
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_1_0_0;
|
||||||
sde_cfg->uidle_cfg.uidle_rev = SDE_UIDLE_VERSION_1_0_0;
|
sde_cfg->uidle_cfg.uidle_rev = SDE_UIDLE_VERSION_1_0_0;
|
||||||
sde_cfg->inline_disable_const_clr = true;
|
set_bit(SDE_FEATURE_INLINE_DISABLE_CONST_CLR, sde_cfg->features);
|
||||||
} else if (IS_SAIPAN_TARGET(hw_rev)) {
|
} else if (IS_SAIPAN_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 40;
|
sde_cfg->perf.min_prefill_lines = 40;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0xE71;
|
sde_cfg->sui_block_xin_mask = 0xE71;
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_3D_MERGE_RESET, sde_cfg->features);
|
||||||
sde_cfg->has_3d_merge_reset = true;
|
set_bit(SDE_FEATURE_HDR_PLUS, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
|
||||||
sde_cfg->has_hdr_plus = true;
|
|
||||||
set_bit(SDE_MDP_DHDR_MEMPOOL, &sde_cfg->mdp[0].features);
|
set_bit(SDE_MDP_DHDR_MEMPOOL, &sde_cfg->mdp[0].features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_1_0_0;
|
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_1_0_0;
|
||||||
sde_cfg->inline_disable_const_clr = true;
|
set_bit(SDE_FEATURE_INLINE_DISABLE_CONST_CLR, sde_cfg->features);
|
||||||
} else if (IS_SDMTRINKET_TARGET(hw_rev)) {
|
} else if (IS_SDMTRINKET_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0xC61;
|
sde_cfg->sui_block_xin_mask = 0xC61;
|
||||||
sde_cfg->has_hdr = false;
|
clear_bit(SDE_FEATURE_HDR, sde_cfg->features);
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
|
||||||
} else if (IS_BENGAL_TARGET(hw_rev)) {
|
} else if (IS_BENGAL_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = false;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0xC01;
|
sde_cfg->sui_block_xin_mask = 0xC01;
|
||||||
sde_cfg->has_hdr = false;
|
clear_bit(SDE_FEATURE_HDR, sde_cfg->features);
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
|
||||||
} else if (IS_LAGOON_TARGET(hw_rev)) {
|
} else if (IS_LAGOON_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 40;
|
sde_cfg->perf.min_prefill_lines = 40;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0x261;
|
sde_cfg->sui_block_xin_mask = 0x261;
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
|
||||||
} else if (IS_SCUBA_TARGET(hw_rev)) {
|
} else if (IS_SCUBA_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = false;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0x1;
|
sde_cfg->sui_block_xin_mask = 0x1;
|
||||||
sde_cfg->has_hdr = false;
|
clear_bit(SDE_FEATURE_HDR, sde_cfg->features);
|
||||||
sde_cfg->has_sui_blendstage = true;
|
|
||||||
} else if (IS_LAHAINA_TARGET(hw_rev)) {
|
} else if (IS_LAHAINA_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_demura = true;
|
set_bit(SDE_FEATURE_DEMURA, sde_cfg->features);
|
||||||
sde_cfg->demura_supported[SSPP_DMA1][0] = 0;
|
sde_cfg->demura_supported[SSPP_DMA1][0] = 0;
|
||||||
sde_cfg->demura_supported[SSPP_DMA1][1] = 1;
|
sde_cfg->demura_supported[SSPP_DMA1][1] = 1;
|
||||||
sde_cfg->demura_supported[SSPP_DMA3][0] = 0;
|
sde_cfg->demura_supported[SSPP_DMA3][0] = 0;
|
||||||
sde_cfg->demura_supported[SSPP_DMA3][1] = 1;
|
sde_cfg->demura_supported[SSPP_DMA3][1] = 1;
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 40;
|
sde_cfg->perf.min_prefill_lines = 40;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0x3F71;
|
sde_cfg->sui_block_xin_mask = 0x3F71;
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_3D_MERGE_RESET, sde_cfg->features);
|
||||||
sde_cfg->has_3d_merge_reset = true;
|
set_bit(SDE_FEATURE_HDR_PLUS, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
|
||||||
sde_cfg->has_hdr_plus = true;
|
|
||||||
set_bit(SDE_MDP_DHDR_MEMPOOL_4K, &sde_cfg->mdp[0].features);
|
set_bit(SDE_MDP_DHDR_MEMPOOL_4K, &sde_cfg->mdp[0].features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_2_0_0;
|
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_2_0_0;
|
||||||
sde_cfg->uidle_cfg.uidle_rev = SDE_UIDLE_VERSION_1_0_1;
|
sde_cfg->uidle_cfg.uidle_rev = SDE_UIDLE_VERSION_1_0_1;
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->dither_luma_mode_support = true;
|
set_bit(SDE_FEATURE_DITHER_LUMA_MODE, sde_cfg->features);
|
||||||
sde_cfg->mdss_hw_block_size = 0x158;
|
sde_cfg->mdss_hw_block_size = 0x158;
|
||||||
sde_cfg->has_trusted_vm_support = true;
|
set_bit(SDE_FEATURE_TRUSTED_VM, sde_cfg->features);
|
||||||
sde_cfg->syscache_supported = true;
|
set_bit(SDE_FEATURE_SYSCACHE, sde_cfg->features);
|
||||||
} else if (IS_HOLI_TARGET(hw_rev)) {
|
} else if (IS_HOLI_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = false;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
|
||||||
sde_cfg->perf.min_prefill_lines = 24;
|
sde_cfg->perf.min_prefill_lines = 24;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0xC01;
|
sde_cfg->sui_block_xin_mask = 0xC01;
|
||||||
sde_cfg->has_hdr = false;
|
clear_bit(SDE_FEATURE_HDR, sde_cfg->features);
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
|
||||||
sde_cfg->mdss_hw_block_size = 0x158;
|
sde_cfg->mdss_hw_block_size = 0x158;
|
||||||
sde_cfg->rc_lm_flush_override = true;
|
set_bit(SDE_FEATURE_RC_LM_FLUSH_OVERRIDE, sde_cfg->features);
|
||||||
} else if (IS_SHIMA_TARGET(hw_rev)) {
|
} else if (IS_SHIMA_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 35;
|
sde_cfg->perf.min_prefill_lines = 35;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0xE71;
|
sde_cfg->sui_block_xin_mask = 0xE71;
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_3D_MERGE_RESET, sde_cfg->features);
|
||||||
sde_cfg->has_3d_merge_reset = true;
|
set_bit(SDE_FEATURE_HDR_PLUS, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
|
||||||
sde_cfg->has_hdr_plus = true;
|
|
||||||
set_bit(SDE_MDP_DHDR_MEMPOOL, &sde_cfg->mdp[0].features);
|
set_bit(SDE_MDP_DHDR_MEMPOOL, &sde_cfg->mdp[0].features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_1_0_0;
|
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_1_0_0;
|
||||||
sde_cfg->inline_disable_const_clr = true;
|
set_bit(SDE_FEATURE_INLINE_DISABLE_CONST_CLR, sde_cfg->features);
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->mdss_hw_block_size = 0x158;
|
sde_cfg->mdss_hw_block_size = 0x158;
|
||||||
sde_cfg->has_trusted_vm_support = true;
|
set_bit(SDE_FEATURE_TRUSTED_VM, sde_cfg->features);
|
||||||
sde_cfg->syscache_supported = true;
|
set_bit(SDE_FEATURE_SYSCACHE, sde_cfg->features);
|
||||||
} else if (IS_WAIPIO_TARGET(hw_rev)) {
|
} else if (IS_WAIPIO_TARGET(hw_rev)) {
|
||||||
sde_cfg->allowed_dsc_reservation_switch = SDE_DP_DSC_RESERVATION_SWITCH;
|
sde_cfg->allowed_dsc_reservation_switch = SDE_DP_DSC_RESERVATION_SWITCH;
|
||||||
sde_cfg->has_dedicated_cwb_support = true;
|
set_bit(SDE_FEATURE_DEDICATED_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_cwb_dither = true;
|
set_bit(SDE_FEATURE_CWB_DITHER, sde_cfg->features);
|
||||||
sde_cfg->has_wb_ubwc = true;
|
set_bit(SDE_FEATURE_WB_UBWC, sde_cfg->features);
|
||||||
sde_cfg->has_cwb_crop = true;
|
set_bit(SDE_FEATURE_CWB_CROP, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 40;
|
sde_cfg->perf.min_prefill_lines = 40;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
set_bit(SDE_FEATURE_3D_MERGE_RESET, sde_cfg->features);
|
||||||
sde_cfg->sui_ns_allowed = true;
|
set_bit(SDE_FEATURE_HDR_PLUS, sde_cfg->features);
|
||||||
sde_cfg->sui_misr_supported = true;
|
set_bit(SDE_FEATURE_INLINE_SKIP_THRESHOLD, sde_cfg->features);
|
||||||
sde_cfg->has_sui_blendstage = true;
|
|
||||||
sde_cfg->has_3d_merge_reset = true;
|
|
||||||
sde_cfg->has_hdr = true;
|
|
||||||
sde_cfg->has_hdr_plus = true;
|
|
||||||
sde_cfg->skip_inline_rot_threshold = true;
|
|
||||||
set_bit(SDE_MDP_DHDR_MEMPOOL_4K, &sde_cfg->mdp[0].features);
|
set_bit(SDE_MDP_DHDR_MEMPOOL_4K, &sde_cfg->mdp[0].features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_2_0_1;
|
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_2_0_1;
|
||||||
sde_cfg->uidle_cfg.uidle_rev = SDE_UIDLE_VERSION_1_0_2;
|
sde_cfg->uidle_cfg.uidle_rev = SDE_UIDLE_VERSION_1_0_2;
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->dither_luma_mode_support = true;
|
set_bit(SDE_FEATURE_DITHER_LUMA_MODE, sde_cfg->features);
|
||||||
sde_cfg->mdss_hw_block_size = 0x158;
|
sde_cfg->mdss_hw_block_size = 0x158;
|
||||||
sde_cfg->syscache_supported = true;
|
set_bit(SDE_FEATURE_SYSCACHE, sde_cfg->features);
|
||||||
sde_cfg->sspp_multirect_error = true;
|
set_bit(SDE_FEATURE_MULTIRECT_ERROR, sde_cfg->features);
|
||||||
sde_cfg->has_fp16 = true;
|
set_bit(SDE_FEATURE_FP16, sde_cfg->features);
|
||||||
set_bit(SDE_MDP_PERIPH_TOP_0_REMOVED, &sde_cfg->mdp[0].features);
|
set_bit(SDE_MDP_PERIPH_TOP_0_REMOVED, &sde_cfg->mdp[0].features);
|
||||||
sde_cfg->has_precise_vsync_ts = true;
|
set_bit(SDE_FEATURE_DEMURA, sde_cfg->features);
|
||||||
sde_cfg->has_avr_step = true;
|
|
||||||
sde_cfg->has_trusted_vm_support = true;
|
|
||||||
sde_cfg->has_ubwc_stats = true;
|
|
||||||
sde_cfg->has_demura = true;
|
|
||||||
sde_cfg->demura_supported[SSPP_DMA1][0] = 0;
|
sde_cfg->demura_supported[SSPP_DMA1][0] = 0;
|
||||||
sde_cfg->demura_supported[SSPP_DMA1][1] = 1;
|
sde_cfg->demura_supported[SSPP_DMA1][1] = 1;
|
||||||
sde_cfg->demura_supported[SSPP_DMA3][0] = 0;
|
sde_cfg->demura_supported[SSPP_DMA3][0] = 0;
|
||||||
sde_cfg->demura_supported[SSPP_DMA3][1] = 1;
|
sde_cfg->demura_supported[SSPP_DMA3][1] = 1;
|
||||||
|
set_bit(SDE_FEATURE_UBWC_STATS, sde_cfg->features);
|
||||||
|
set_bit(SDE_FEATURE_HW_VSYNC_TS, sde_cfg->features);
|
||||||
|
set_bit(SDE_FEATURE_AVR_STEP, sde_cfg->features);
|
||||||
|
set_bit(SDE_FEATURE_TRUSTED_VM, sde_cfg->features);
|
||||||
} else if (IS_YUPIK_TARGET(hw_rev)) {
|
} else if (IS_YUPIK_TARGET(hw_rev)) {
|
||||||
sde_cfg->has_cwb_support = true;
|
set_bit(SDE_FEATURE_CWB, sde_cfg->features);
|
||||||
sde_cfg->has_qsync = true;
|
set_bit(SDE_FEATURE_QSYNC, sde_cfg->features);
|
||||||
sde_cfg->perf.min_prefill_lines = 40;
|
sde_cfg->perf.min_prefill_lines = 40;
|
||||||
sde_cfg->vbif_qos_nlvl = 8;
|
sde_cfg->vbif_qos_nlvl = 8;
|
||||||
sde_cfg->ts_prefill_rev = 2;
|
sde_cfg->ts_prefill_rev = 2;
|
||||||
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
sde_cfg->ctl_rev = SDE_CTL_CFG_VERSION_1_0_0;
|
||||||
sde_cfg->delay_prg_fetch_start = true;
|
|
||||||
sde_cfg->sui_ns_allowed = true;
|
|
||||||
sde_cfg->sui_misr_supported = true;
|
|
||||||
sde_cfg->sui_block_xin_mask = 0x261;
|
sde_cfg->sui_block_xin_mask = 0x261;
|
||||||
sde_cfg->has_sui_blendstage = true;
|
set_bit(SDE_FEATURE_3D_MERGE_RESET, sde_cfg->features);
|
||||||
sde_cfg->has_3d_merge_reset = true;
|
set_bit(SDE_FEATURE_HDR_PLUS, sde_cfg->features);
|
||||||
sde_cfg->has_hdr = true;
|
|
||||||
sde_cfg->has_hdr_plus = true;
|
|
||||||
set_bit(SDE_MDP_DHDR_MEMPOOL_4K, &sde_cfg->mdp[0].features);
|
set_bit(SDE_MDP_DHDR_MEMPOOL_4K, &sde_cfg->mdp[0].features);
|
||||||
sde_cfg->has_vig_p010 = true;
|
set_bit(SDE_FEATURE_VIG_P010, sde_cfg->features);
|
||||||
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_2_0_0;
|
sde_cfg->true_inline_rot_rev = SDE_INLINE_ROT_VERSION_2_0_0;
|
||||||
sde_cfg->vbif_disable_inner_outer_shareable = true;
|
set_bit(SDE_FEATURE_VBIF_DISABLE_SHAREABLE, sde_cfg->features);
|
||||||
sde_cfg->dither_luma_mode_support = true;
|
set_bit(SDE_FEATURE_DITHER_LUMA_MODE, sde_cfg->features);
|
||||||
sde_cfg->mdss_hw_block_size = 0x158;
|
sde_cfg->mdss_hw_block_size = 0x158;
|
||||||
sde_cfg->rc_lm_flush_override = false;
|
|
||||||
} else {
|
} else {
|
||||||
SDE_ERROR("unsupported chipset id:%X\n", hw_rev);
|
SDE_ERROR("unsupported chipset id:%X\n", hw_rev);
|
||||||
sde_cfg->perf.min_prefill_lines = 0xffff;
|
sde_cfg->perf.min_prefill_lines = 0xffff;
|
||||||
@@ -5164,9 +5117,8 @@ static int _sde_hardware_post_caps(struct sde_mdss_cfg *sde_cfg,
|
|||||||
if (!sde_cfg)
|
if (!sde_cfg)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (sde_cfg->has_sui_blendstage)
|
if (test_bit(SDE_FEATURE_SUI_BLENDSTAGE, sde_cfg->features))
|
||||||
sde_cfg->sui_supported_blendstage =
|
sde_cfg->sui_supported_blendstage = sde_cfg->max_mixer_blendstages - SDE_STAGE_0;
|
||||||
sde_cfg->max_mixer_blendstages - SDE_STAGE_0;
|
|
||||||
|
|
||||||
for (i = 0; i < sde_cfg->sspp_count; i++) {
|
for (i = 0; i < sde_cfg->sspp_count; i++) {
|
||||||
if (sde_cfg->sspp[i].sblk) {
|
if (sde_cfg->sspp[i].sblk) {
|
||||||
@@ -5180,11 +5132,9 @@ static int _sde_hardware_post_caps(struct sde_mdss_cfg *sde_cfg,
|
|||||||
* set sec-ui blocked SSPP feature flag based on blocked
|
* set sec-ui blocked SSPP feature flag based on blocked
|
||||||
* xin-mask if sec-ui-misr feature is enabled;
|
* xin-mask if sec-ui-misr feature is enabled;
|
||||||
*/
|
*/
|
||||||
if (sde_cfg->sui_misr_supported
|
if (test_bit(SDE_FEATURE_SUI_MISR, sde_cfg->features) &&
|
||||||
&& (sde_cfg->sui_block_xin_mask
|
(sde_cfg->sui_block_xin_mask & BIT(sde_cfg->sspp[i].xin_id)))
|
||||||
& BIT(sde_cfg->sspp[i].xin_id)))
|
set_bit(SDE_SSPP_BLOCK_SEC_UI, &sde_cfg->sspp[i].features);
|
||||||
set_bit(SDE_SSPP_BLOCK_SEC_UI,
|
|
||||||
&sde_cfg->sspp[i].features);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_horz_deci)
|
if (max_horz_deci)
|
||||||
|
@@ -617,6 +617,86 @@ enum {
|
|||||||
SDE_UIDLE_MAX
|
SDE_UIDLE_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MDSS features - For enabling target specific functionality in @sde_mdss_cfg "features" bitmap
|
||||||
|
* @SDE_FEATURE_CDP Client driven prefetch supported
|
||||||
|
* @SDE_FEATURE_DIM_LAYER Dim Layer supported
|
||||||
|
* @SDE_FEATURE_WB_UBWC UBWC supported on Writeback
|
||||||
|
* @SDE_FEATURE_CWB Concurrent Writeback supported
|
||||||
|
* @SDE_FEATURE_CWB_CROP CWB Cropping supported
|
||||||
|
* @SDE_FEATURE_CWB_DITHER CWB dither is supported
|
||||||
|
* @SDE_FEATURE_DEDICATED_CWB Dedicated-CWB supported
|
||||||
|
* @SDE_FEATURE_IDLE_PC Idle Power Collapse supported
|
||||||
|
* @SDE_FEATURE_3D_MERGE_RESET 3D merge reset supported
|
||||||
|
* @SDE_FEATURE_DECIMATION Decimation supported
|
||||||
|
* @SDE_FEATURE_COMBINED_ALPHA Combined Alpha supported
|
||||||
|
* @SDE_FEATURE_BASE_LAYER Base Layer supported
|
||||||
|
* @SDE_FEATURE_TOUCH_WAKEUP Early wakeup with touch supported
|
||||||
|
* @SDE_FEATURE_SRC_SPLIT Source split supported
|
||||||
|
* @SDE_FEATURE_CURSOR Cursor supported
|
||||||
|
* @SDE_FEATURE_VIG_P010 P010 ViG pipe format supported
|
||||||
|
* @SDE_FEATURE_FP16 FP16 pipe format supported
|
||||||
|
* @SDE_FEATURE_HDR High Dynamic Range supported
|
||||||
|
* @SDE_FEATURE_HDR_PLUS HDR10+ supported
|
||||||
|
* @SDE_FEATURE_QSYNC QSYNC supported
|
||||||
|
* @SDE_FEATURE_AVR_STEP AVR Step supported
|
||||||
|
* @SDE_FEATURE_DEMURA Demura supported
|
||||||
|
* @SDE_FEATURE_HW_VSYNC_TS HW timestamp supported
|
||||||
|
* @SDE_FEATURE_MULTIRECT_ERROR Multirect Error supported
|
||||||
|
* @SDE_FEATURE_DELAY_PRG_FETCH Delay programmable fetch supported
|
||||||
|
* @SDE_FEATURE_VBIF_DISABLE_SHAREABLE VBIF disable inner/outer shareable required
|
||||||
|
* @SDE_FEATURE_INLINE_DISABLE_CONST_CLR Inline rotation disable constant color required
|
||||||
|
* @SDE_FEATURE_INLINE_SKIP_THRESHOLD Skip inline rotation threshold
|
||||||
|
* @SDE_FEATURE_DITHER_LUMA_MODE Dither LUMA mode supported
|
||||||
|
* @SDE_FEATURE_RC_LM_FLUSH_OVERRIDE RC LM flush override supported
|
||||||
|
* @SDE_FEATURE_SYSCACHE System cache supported
|
||||||
|
* @SDE_FEATURE_SUI_MISR SecureUI MISR supported
|
||||||
|
* @SDE_FEATURE_SUI_BLENDSTAGE SecureUI Blendstage supported
|
||||||
|
* @SDE_FEATURE_SUI_NS_ALLOWED SecureUI allowed to access non-secure context banks
|
||||||
|
* @SDE_FEATURE_TRUSTED_VM Trusted VM supported
|
||||||
|
* @SDE_FEATURE_UBWC_STATS UBWC statistics supported
|
||||||
|
* @SDE_FEATURE_MAX: MAX features value
|
||||||
|
*/
|
||||||
|
enum sde_mdss_features {
|
||||||
|
SDE_FEATURE_CDP,
|
||||||
|
SDE_FEATURE_DIM_LAYER,
|
||||||
|
SDE_FEATURE_WB_UBWC,
|
||||||
|
SDE_FEATURE_CWB,
|
||||||
|
SDE_FEATURE_CWB_CROP,
|
||||||
|
SDE_FEATURE_CWB_DITHER,
|
||||||
|
SDE_FEATURE_DEDICATED_CWB,
|
||||||
|
SDE_FEATURE_IDLE_PC,
|
||||||
|
SDE_FEATURE_3D_MERGE_RESET,
|
||||||
|
SDE_FEATURE_DECIMATION,
|
||||||
|
SDE_FEATURE_COMBINED_ALPHA,
|
||||||
|
SDE_FEATURE_BASE_LAYER,
|
||||||
|
SDE_FEATURE_TOUCH_WAKEUP,
|
||||||
|
SDE_FEATURE_SRC_SPLIT,
|
||||||
|
SDE_FEATURE_CURSOR,
|
||||||
|
SDE_FEATURE_VIG_P010,
|
||||||
|
SDE_FEATURE_FP16,
|
||||||
|
SDE_FEATURE_HDR,
|
||||||
|
SDE_FEATURE_HDR_PLUS,
|
||||||
|
SDE_FEATURE_QSYNC,
|
||||||
|
SDE_FEATURE_AVR_STEP,
|
||||||
|
SDE_FEATURE_DEMURA,
|
||||||
|
SDE_FEATURE_HW_VSYNC_TS,
|
||||||
|
SDE_FEATURE_MULTIRECT_ERROR,
|
||||||
|
SDE_FEATURE_DELAY_PRG_FETCH,
|
||||||
|
SDE_FEATURE_VBIF_DISABLE_SHAREABLE,
|
||||||
|
SDE_FEATURE_INLINE_DISABLE_CONST_CLR,
|
||||||
|
SDE_FEATURE_INLINE_SKIP_THRESHOLD,
|
||||||
|
SDE_FEATURE_DITHER_LUMA_MODE,
|
||||||
|
SDE_FEATURE_RC_LM_FLUSH_OVERRIDE,
|
||||||
|
SDE_FEATURE_SYSCACHE,
|
||||||
|
SDE_FEATURE_SUI_MISR,
|
||||||
|
SDE_FEATURE_SUI_BLENDSTAGE,
|
||||||
|
SDE_FEATURE_SUI_NS_ALLOWED,
|
||||||
|
SDE_FEATURE_TRUSTED_VM,
|
||||||
|
SDE_FEATURE_UBWC_STATS,
|
||||||
|
SDE_FEATURE_MAX
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MACRO SDE_HW_BLK_INFO - information of HW blocks inside SDE
|
* MACRO SDE_HW_BLK_INFO - information of HW blocks inside SDE
|
||||||
* @name: string name for debug purposes
|
* @name: string name for debug purposes
|
||||||
@@ -1475,252 +1555,198 @@ struct sde_perf_cfg {
|
|||||||
* struct sde_mdss_cfg - information of MDSS HW
|
* struct sde_mdss_cfg - information of MDSS HW
|
||||||
* This is the main catalog data structure representing
|
* This is the main catalog data structure representing
|
||||||
* this HW version. Contains number of instances,
|
* this HW version. Contains number of instances,
|
||||||
* register offsets, capabilities of the all MDSS HW sub-blocks.
|
* register offsets, capabilities of all the MDSS HW sub-blocks.
|
||||||
*
|
*
|
||||||
* @trusted_vm_env set to true, if the driver is executing in
|
* @hwversion MDSS HW version
|
||||||
* the trusted VM. false, otherwise.
|
|
||||||
* @max_trusted_vm_displays maximum number of concurrent trusted
|
|
||||||
* vm displays supported.
|
|
||||||
* @tvm_reg_count number of sub-driver register ranges that need to be included
|
|
||||||
* for trusted vm for accepting the resources
|
|
||||||
* @tvm_reg array of sub-driver register ranges entries that need to be
|
|
||||||
* included
|
|
||||||
* @max_sspp_linewidth max source pipe line width support.
|
|
||||||
* @vig_sspp_linewidth max vig source pipe line width support.
|
|
||||||
* @scaling_linewidth max vig source pipe linewidth for scaling usecases
|
|
||||||
* @max_mixer_width max layer mixer line width support.
|
|
||||||
* @max_dsc_width max dsc line width support.
|
|
||||||
* @max_mixer_blendstages max layer mixer blend stages or
|
|
||||||
* supported z order
|
|
||||||
* @max_wb_linewidth max writeback line width support.
|
|
||||||
* @max_wb_linewidth_linear max writeback line width for linear formats.
|
|
||||||
* @max_display_width maximum display width support.
|
|
||||||
* @max_display_height maximum display height support.
|
|
||||||
|
|
||||||
* @min_display_width minimum display width support.
|
|
||||||
* @min_display_height minimum display height support.
|
|
||||||
* @csc_type csc or csc_10bit support.
|
|
||||||
* @smart_dma_rev Supported version of SmartDMA feature.
|
|
||||||
* @ctl_rev supported version of control path.
|
|
||||||
* @has_src_split source split feature status
|
|
||||||
* @has_cdp Client driven prefetch feature status
|
|
||||||
* @has_wb_ubwc UBWC feature supported on WB
|
|
||||||
* @has_cwb_crop CWB cropping is supported
|
|
||||||
* @has_cwb_support indicates if device supports primary capture through CWB
|
|
||||||
* @has_dedicated_cwb_support indicates if device supports dedicated path for CWB capture
|
|
||||||
* @has_cwb_dither indicates if device supports cwb dither feature
|
|
||||||
* @cwb_blk_off CWB offset address
|
|
||||||
* @cwb_blk_stride offset between each CWB blk
|
|
||||||
* @ubwc_version UBWC feature version (0x0 for not supported)
|
* @ubwc_version UBWC feature version (0x0 for not supported)
|
||||||
* @ubwc_bw_calc_version indicate how UBWC BW has to be calculated
|
* @ubwc_bw_calc_version indicates how UBWC BW has to be calculated
|
||||||
* @skip_inline_rot_thresh Skip inline rotation threshold
|
* @qseed_sw_lib_rev qseed SW library version
|
||||||
* @has_idle_pc indicate if idle power collapse feature is supported
|
* @qseed_hw_version qseed HW block version
|
||||||
* @allowed_dsc_reservation_switch intf to which dsc reservation switch is supported
|
* @smart_dma_rev smartDMA block version
|
||||||
* @wakeup_with_touch indicate early wake up display with input touch event
|
* @ctl_rev control path block version
|
||||||
* @has_hdr HDR feature support
|
|
||||||
* @has_hdr_plus HDR10+ feature support
|
|
||||||
* @dma_formats Supported formats for dma pipe
|
|
||||||
* @cursor_formats Supported formats for cursor pipe
|
|
||||||
* @vig_formats Supported formats for vig pipe
|
|
||||||
* @wb_formats Supported formats for wb
|
|
||||||
* @virt_vig_formats Supported formats for virtual vig pipe
|
|
||||||
* @vbif_qos_nlvl number of vbif QoS priority level
|
|
||||||
* @ts_prefill_rev prefill traffic shaper feature revision
|
* @ts_prefill_rev prefill traffic shaper feature revision
|
||||||
* @true_inline_rot_rev inline rotator feature revision
|
* @true_inline_rot_rev inline rotator feature revision
|
||||||
* @macrotile_mode UBWC parameter for macro tile channel distribution
|
* @mdss_count number of valid MDSS HW blocks
|
||||||
* @pipe_order_type indicate if it is required to specify pipe order
|
* @mdss array of pointers to MDSS HW blocks
|
||||||
* @sspp_multirect_error flag to indicate whether ubwc and meta error by rect is supported
|
* @mdss_hw_block_size max offset of MDSS_HW block (0 offset), used for debug
|
||||||
* @delay_prg_fetch_start indicates if throttling the fetch start is required
|
* @mdp_count number of valid MDP HW blocks
|
||||||
* @has_qsync Supports qsync feature
|
* @mdp array of pointers to MDP HW blocks
|
||||||
* @has_3d_merge_reset Supports 3D merge reset
|
* @ctl_count number of valid CTL blocks available
|
||||||
* @has_decimation Supports decimation
|
* @ctl array of pointers to CTL blocks
|
||||||
* @has_trusted_vm_support Supported HW sharing with trusted VM
|
* @sspp_count number of valid SSPP blocks available
|
||||||
* @has_avr_step Supports AVR with vsync alignment to a set step rate
|
* @sspp array of pointers to SSPP blocks
|
||||||
* @rc_lm_flush_override Support Rounded Corner using layer mixer flush
|
* @mixer_count number of valid LM blocks available
|
||||||
* @has_mixer_combined_alpha Mixer has single register for FG & BG alpha
|
* @mixer array of pointers to LM blocks
|
||||||
* @vbif_disable_inner_outer_shareable VBIF requires disabling shareables
|
* @dspp_top pointer to common DSPP_TOP block
|
||||||
* @inline_disable_const_clr Disable constant color during inline rotate
|
* @dspp_count number of valid DSPP blocks available
|
||||||
* @dither_luma_mode_support Enables dither luma mode
|
* @dspp array of pointers to DSPP blocks
|
||||||
* @has_base_layer Supports staging layer as base layer
|
* @ds_count number of valid dest scaler blocks available
|
||||||
* @demura_supported Demura pipe support flag(~0x00 - Not supported)
|
* @ds array of pointers to DS blocks
|
||||||
* @qseed_sw_lib_rev qseed sw library type supporting the qseed hw
|
* @pingpong_count number of valid pingpong blocks available
|
||||||
* @qseed_hw_version qseed hw version of the target
|
* @pingpong array of pointers to pingpong blocks
|
||||||
* @sc_cfg: system cache configuration
|
* @dsc_count number of valid DSC blocks available
|
||||||
* @syscache_supported Flag to indicate if sys cache support is enabled
|
* @dsc array of pointers to DSC blocks
|
||||||
* @uidle_cfg Settings for uidle feature
|
* @vdc_count number of valid VDC blocks available
|
||||||
* @sui_misr_supported indicate if secure-ui-misr is supported
|
* @vdc array of pointers to VDC blocks
|
||||||
* @sui_block_xin_mask mask of all the xin-clients to be blocked during
|
* @cdm_count number of valid chroma-down modules available
|
||||||
* secure-ui when secure-ui-misr feature is supported
|
* @cdm array of pointers to CDM blocks
|
||||||
* @sec_sid_mask_count number of SID masks
|
* @intf_count number of valid INTF blocks available
|
||||||
* @sec_sid_mask SID masks used during the scm_call for transition
|
* @intf array of pointers to INTF blocks
|
||||||
* between secure/non-secure sessions
|
* @wb_count number of valid writeback blocks available
|
||||||
* @sui_ns_allowed flag to indicate non-secure context banks are allowed
|
* @wb array of pointers to WB blocks
|
||||||
* during secure-ui session
|
* @vbif_count number of valid VBIF blocks available
|
||||||
* @sui_supported_blendstage secure-ui supported blendstage
|
* @vbif array of pointers to VBIF blocks
|
||||||
* @has_sui_blendstage flag to indicate secure-ui has a blendstage restriction
|
* @merge_3d_count number of valid merge 3d blocks available
|
||||||
* @has_cursor indicates if hardware cursor is supported
|
* @merge_3d array of pointers to merge 3d blocks
|
||||||
* @has_vig_p010 indicates if vig pipe supports p010 format
|
* @qdss_count number of valid QDSS blocks available
|
||||||
* @has_fp16 indicates if FP16 format is supported on SSPP pipes
|
* @qdss array of pointers to QDSS blocks
|
||||||
* @has_precise_vsync_ts indicates if HW has vsyc timestamp logging capability
|
* @cwb_blk_off CWB offset address
|
||||||
* @has_ubwc_stats: indicates if ubwc stats feature is supported
|
* @cwb_blk_stride offset between each CWB blk
|
||||||
* @mdss_hw_block_size Max offset of MDSS_HW block (0 offset), used for debug
|
|
||||||
* @inline_rot_formats formats supported by the inline rotator feature
|
|
||||||
* @irq_offset_list list of sde_intr_irq_offsets to initialize irq table
|
|
||||||
* @rc_count number of rounded corner hardware instances
|
|
||||||
* @demura_count number of demura hardware instances
|
|
||||||
* @dcwb_count number of dcwb hardware instances
|
* @dcwb_count number of dcwb hardware instances
|
||||||
|
* @reg_dma_count number of valid reg dma blocks available
|
||||||
|
* @dma_cfg pointer to config containing reg dma blocks
|
||||||
|
* @ad_count number of AD4 hardware instances
|
||||||
|
* @ltm_count number of LTM hardware instances
|
||||||
|
* @rc_count number of rounded corner hardware instances
|
||||||
|
* @spr_count number of SPR hardware instances
|
||||||
|
* @demura_count number of demura hardware instances
|
||||||
|
* @demura_supported indicates which SSPP/RECT combinations support demura
|
||||||
|
* @trusted_vm_env true if the driver is executing in the trusted VM
|
||||||
|
* @tvm_reg_count number of sub-driver register ranges that need to be included
|
||||||
|
* for trusted vm for accepting the resources
|
||||||
|
* @tvm_reg array of sub-driver register range entries that need to be included
|
||||||
|
* @max_trusted_vm_displays maximum number of concurrent trusted VM displays supported
|
||||||
|
* @sui_block_xin_mask mask of xin-clients to block during secure-ui when SUI MISR is supported
|
||||||
|
* @sec_sid_mask_count number of SID masks
|
||||||
|
* @sec_sid_mask SID masks used during the scm_call for secure/non-secure transitions
|
||||||
|
* @sui_supported_blendstage secure-ui supported blendstage
|
||||||
|
* @max_display_width minimum display width
|
||||||
|
* @max_display_height minimum display height
|
||||||
|
* @min_display_width maximum display width
|
||||||
|
* @min_display_height maximum display height
|
||||||
|
* @max_sspp_linewidth max source pipe line width
|
||||||
|
* @vig_sspp_linewidth max vig source pipe line width support
|
||||||
|
* @scaling_linewidth max vig source pipe linewidth for scaling usecases
|
||||||
|
* @max_wb_linewidth max writeback line width
|
||||||
|
* @max_wb_linewidth_linear max writeback line width for linear formats
|
||||||
|
* @max_dsc_width max dsc line width
|
||||||
|
* @max_mixer_width max layer mixer line width
|
||||||
|
* @max_mixer_blendstages max layer mixer blend stages (z orders)
|
||||||
|
* @vbif_qos_nlvl number of vbif QoS priority levels
|
||||||
|
* @macrotile_mode UBWC parameter for macro tile channel distribution
|
||||||
|
* @pipe_order_type indicates if it is required to specify pipe order
|
||||||
|
* @csc_type csc or csc_10bit support
|
||||||
|
* @allowed_dsc_reservation_switch intf to which dsc reservation switch is supported
|
||||||
|
* @sc_cfg system cache configuration
|
||||||
|
* @perf performance control settings
|
||||||
|
* @uidle_cfg settings for uidle feature
|
||||||
|
* @irq_offset_list list of sde_intr_irq_offsets to initialize irq table
|
||||||
|
* @features bitmap of supported SDE_FEATUREs
|
||||||
|
* @dma_formats supported formats for dma pipe
|
||||||
|
* @cursor_formats supported formats for cursor pipe
|
||||||
|
* @vig_formats supported formats for vig pipe
|
||||||
|
* @wb_formats supported formats for wb
|
||||||
|
* @virt_vig_formats supported formats for virtual vig pipe
|
||||||
|
* @inline_rot_formats supported formats for inline rotation
|
||||||
|
* @inline_rot_restricted_formats restricted formats for inline rotation
|
||||||
*/
|
*/
|
||||||
struct sde_mdss_cfg {
|
struct sde_mdss_cfg {
|
||||||
|
/* Versions */
|
||||||
u32 hwversion;
|
u32 hwversion;
|
||||||
bool trusted_vm_env;
|
|
||||||
u32 max_trusted_vm_displays;
|
|
||||||
u32 tvm_reg_count;
|
|
||||||
struct resource tvm_reg[MAX_REG_SIZE_ENTRIES];
|
|
||||||
|
|
||||||
u32 max_sspp_linewidth;
|
|
||||||
u32 vig_sspp_linewidth;
|
|
||||||
u32 scaling_linewidth;
|
|
||||||
u32 max_mixer_width;
|
|
||||||
u32 max_dsc_width;
|
|
||||||
u32 max_mixer_blendstages;
|
|
||||||
u32 max_wb_linewidth;
|
|
||||||
u32 max_wb_linewidth_linear;
|
|
||||||
|
|
||||||
u32 max_display_width;
|
|
||||||
u32 max_display_height;
|
|
||||||
u32 min_display_width;
|
|
||||||
u32 min_display_height;
|
|
||||||
|
|
||||||
u32 csc_type;
|
|
||||||
u32 smart_dma_rev;
|
|
||||||
u32 ctl_rev;
|
|
||||||
bool has_src_split;
|
|
||||||
bool has_cdp;
|
|
||||||
bool has_dim_layer;
|
|
||||||
bool has_wb_ubwc;
|
|
||||||
bool has_cwb_crop;
|
|
||||||
bool has_cwb_support;
|
|
||||||
bool has_dedicated_cwb_support;
|
|
||||||
bool has_cwb_dither;
|
|
||||||
u32 cwb_blk_off;
|
|
||||||
u32 cwb_blk_stride;
|
|
||||||
u32 ubwc_version;
|
u32 ubwc_version;
|
||||||
u32 ubwc_bw_calc_version;
|
u32 ubwc_bw_calc_version;
|
||||||
bool skip_inline_rot_threshold;
|
|
||||||
bool has_idle_pc;
|
|
||||||
u32 allowed_dsc_reservation_switch;
|
|
||||||
bool wakeup_with_touch;
|
|
||||||
u32 vbif_qos_nlvl;
|
|
||||||
u32 ts_prefill_rev;
|
|
||||||
u32 true_inline_rot_rev;
|
|
||||||
u32 macrotile_mode;
|
|
||||||
u32 pipe_order_type;
|
|
||||||
bool sspp_multirect_error;
|
|
||||||
bool delay_prg_fetch_start;
|
|
||||||
bool has_qsync;
|
|
||||||
bool has_3d_merge_reset;
|
|
||||||
bool has_decimation;
|
|
||||||
bool has_mixer_combined_alpha;
|
|
||||||
bool vbif_disable_inner_outer_shareable;
|
|
||||||
bool inline_disable_const_clr;
|
|
||||||
bool dither_luma_mode_support;
|
|
||||||
bool has_base_layer;
|
|
||||||
bool has_demura;
|
|
||||||
bool has_trusted_vm_support;
|
|
||||||
bool has_avr_step;
|
|
||||||
bool rc_lm_flush_override;
|
|
||||||
u32 demura_supported[SSPP_MAX][2];
|
|
||||||
u32 qseed_sw_lib_rev;
|
u32 qseed_sw_lib_rev;
|
||||||
u32 qseed_hw_version;
|
u32 qseed_hw_version;
|
||||||
|
u32 smart_dma_rev;
|
||||||
|
u32 ctl_rev;
|
||||||
|
u32 ts_prefill_rev;
|
||||||
|
u32 true_inline_rot_rev;
|
||||||
|
|
||||||
struct sde_sc_cfg sc_cfg[SDE_SYS_CACHE_MAX];
|
/* HW Blocks */
|
||||||
bool syscache_supported;
|
|
||||||
|
|
||||||
bool sui_misr_supported;
|
|
||||||
u32 sui_block_xin_mask;
|
|
||||||
|
|
||||||
u32 sec_sid_mask_count;
|
|
||||||
u32 sec_sid_mask[MAX_BLOCKS];
|
|
||||||
u32 sui_ns_allowed;
|
|
||||||
u32 sui_supported_blendstage;
|
|
||||||
bool has_sui_blendstage;
|
|
||||||
|
|
||||||
bool has_hdr;
|
|
||||||
bool has_hdr_plus;
|
|
||||||
bool has_cursor;
|
|
||||||
bool has_vig_p010;
|
|
||||||
bool has_fp16;
|
|
||||||
bool has_precise_vsync_ts;
|
|
||||||
bool has_ubwc_stats;
|
|
||||||
|
|
||||||
u32 mdss_hw_block_size;
|
|
||||||
u32 mdss_count;
|
u32 mdss_count;
|
||||||
struct sde_mdss_base_cfg mdss[MAX_BLOCKS];
|
struct sde_mdss_base_cfg mdss[MAX_BLOCKS];
|
||||||
|
u32 mdss_hw_block_size;
|
||||||
u32 mdp_count;
|
u32 mdp_count;
|
||||||
struct sde_mdp_cfg mdp[MAX_BLOCKS];
|
struct sde_mdp_cfg mdp[MAX_BLOCKS];
|
||||||
|
|
||||||
/* uidle is a singleton */
|
|
||||||
struct sde_uidle_cfg uidle_cfg;
|
|
||||||
|
|
||||||
u32 ctl_count;
|
u32 ctl_count;
|
||||||
struct sde_ctl_cfg ctl[MAX_BLOCKS];
|
struct sde_ctl_cfg ctl[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 sspp_count;
|
u32 sspp_count;
|
||||||
struct sde_sspp_cfg sspp[MAX_BLOCKS];
|
struct sde_sspp_cfg sspp[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 mixer_count;
|
u32 mixer_count;
|
||||||
struct sde_lm_cfg mixer[MAX_BLOCKS];
|
struct sde_lm_cfg mixer[MAX_BLOCKS];
|
||||||
|
|
||||||
struct sde_dspp_top_cfg dspp_top;
|
struct sde_dspp_top_cfg dspp_top;
|
||||||
|
|
||||||
u32 dspp_count;
|
u32 dspp_count;
|
||||||
struct sde_dspp_cfg dspp[MAX_BLOCKS];
|
struct sde_dspp_cfg dspp[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 ds_count;
|
u32 ds_count;
|
||||||
struct sde_ds_cfg ds[MAX_BLOCKS];
|
struct sde_ds_cfg ds[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 pingpong_count;
|
u32 pingpong_count;
|
||||||
struct sde_pingpong_cfg pingpong[MAX_BLOCKS];
|
struct sde_pingpong_cfg pingpong[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 dsc_count;
|
u32 dsc_count;
|
||||||
struct sde_dsc_cfg dsc[MAX_BLOCKS];
|
struct sde_dsc_cfg dsc[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 vdc_count;
|
u32 vdc_count;
|
||||||
struct sde_vdc_cfg vdc[MAX_BLOCKS];
|
struct sde_vdc_cfg vdc[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 cdm_count;
|
u32 cdm_count;
|
||||||
struct sde_cdm_cfg cdm[MAX_BLOCKS];
|
struct sde_cdm_cfg cdm[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 intf_count;
|
u32 intf_count;
|
||||||
struct sde_intf_cfg intf[MAX_BLOCKS];
|
struct sde_intf_cfg intf[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 wb_count;
|
u32 wb_count;
|
||||||
struct sde_wb_cfg wb[MAX_BLOCKS];
|
struct sde_wb_cfg wb[MAX_BLOCKS];
|
||||||
|
|
||||||
u32 vbif_count;
|
u32 vbif_count;
|
||||||
struct sde_vbif_cfg vbif[MAX_BLOCKS];
|
struct sde_vbif_cfg vbif[MAX_BLOCKS];
|
||||||
|
u32 merge_3d_count;
|
||||||
|
struct sde_merge_3d_cfg merge_3d[MAX_BLOCKS];
|
||||||
|
u32 qdss_count;
|
||||||
|
struct sde_qdss_cfg qdss[MAX_BLOCKS];
|
||||||
|
u32 cwb_blk_off;
|
||||||
|
u32 cwb_blk_stride;
|
||||||
|
u32 dcwb_count;
|
||||||
|
|
||||||
u32 reg_dma_count;
|
u32 reg_dma_count;
|
||||||
struct sde_reg_dma_cfg dma_cfg;
|
struct sde_reg_dma_cfg dma_cfg;
|
||||||
|
|
||||||
u32 ad_count;
|
u32 ad_count;
|
||||||
u32 ltm_count;
|
u32 ltm_count;
|
||||||
u32 rc_count;
|
u32 rc_count;
|
||||||
u32 spr_count;
|
u32 spr_count;
|
||||||
u32 demura_count;
|
u32 demura_count;
|
||||||
|
u32 demura_supported[SSPP_MAX][2];
|
||||||
|
|
||||||
u32 merge_3d_count;
|
/* Secure & Trusted UI */
|
||||||
struct sde_merge_3d_cfg merge_3d[MAX_BLOCKS];
|
bool trusted_vm_env;
|
||||||
|
u32 tvm_reg_count;
|
||||||
|
struct resource tvm_reg[MAX_REG_SIZE_ENTRIES];
|
||||||
|
u32 max_trusted_vm_displays;
|
||||||
|
u32 sui_block_xin_mask;
|
||||||
|
u32 sec_sid_mask_count;
|
||||||
|
u32 sec_sid_mask[MAX_BLOCKS];
|
||||||
|
u32 sui_supported_blendstage;
|
||||||
|
|
||||||
u32 qdss_count;
|
/* Limits */
|
||||||
struct sde_qdss_cfg qdss[MAX_BLOCKS];
|
u32 max_display_width;
|
||||||
|
u32 max_display_height;
|
||||||
u32 dcwb_count;
|
u32 min_display_width;
|
||||||
|
u32 min_display_height;
|
||||||
/* Add additional block data structures here */
|
u32 max_sspp_linewidth;
|
||||||
|
u32 vig_sspp_linewidth;
|
||||||
|
u32 scaling_linewidth;
|
||||||
|
u32 max_wb_linewidth;
|
||||||
|
u32 max_wb_linewidth_linear;
|
||||||
|
u32 max_dsc_width;
|
||||||
|
u32 max_mixer_width;
|
||||||
|
u32 max_mixer_blendstages;
|
||||||
|
|
||||||
|
/* Configs */
|
||||||
|
u32 vbif_qos_nlvl;
|
||||||
|
u32 macrotile_mode;
|
||||||
|
u32 pipe_order_type;
|
||||||
|
u32 csc_type;
|
||||||
|
u32 allowed_dsc_reservation_switch;
|
||||||
|
struct sde_sc_cfg sc_cfg[SDE_SYS_CACHE_MAX];
|
||||||
struct sde_perf_cfg perf;
|
struct sde_perf_cfg perf;
|
||||||
|
struct sde_uidle_cfg uidle_cfg;
|
||||||
|
struct list_head irq_offset_list;
|
||||||
|
DECLARE_BITMAP(features, SDE_FEATURE_MAX);
|
||||||
|
|
||||||
|
/* Supported Pixel Format Lists */
|
||||||
struct sde_format_extended *dma_formats;
|
struct sde_format_extended *dma_formats;
|
||||||
struct sde_format_extended *cursor_formats;
|
struct sde_format_extended *cursor_formats;
|
||||||
struct sde_format_extended *vig_formats;
|
struct sde_format_extended *vig_formats;
|
||||||
@@ -1728,8 +1754,6 @@ struct sde_mdss_cfg {
|
|||||||
struct sde_format_extended *virt_vig_formats;
|
struct sde_format_extended *virt_vig_formats;
|
||||||
struct sde_format_extended *inline_rot_formats;
|
struct sde_format_extended *inline_rot_formats;
|
||||||
struct sde_format_extended *inline_rot_restricted_formats;
|
struct sde_format_extended *inline_rot_restricted_formats;
|
||||||
|
|
||||||
struct list_head irq_offset_list;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sde_mdss_hw_cfg_handler {
|
struct sde_mdss_hw_cfg_handler {
|
||||||
|
@@ -4759,7 +4759,7 @@ static int _sde_kms_hw_init_blocks(struct sde_kms *sde_kms,
|
|||||||
* timestamp as the DRM hooks for vblank timestamp/counters would be set
|
* timestamp as the DRM hooks for vblank timestamp/counters would be set
|
||||||
* based on the feature
|
* based on the feature
|
||||||
*/
|
*/
|
||||||
if (sde_kms->catalog->has_precise_vsync_ts)
|
if (test_bit(SDE_FEATURE_HW_VSYNC_TS, sde_kms->catalog->features))
|
||||||
dev->vblank_disable_immediate = true;
|
dev->vblank_disable_immediate = true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -398,16 +398,16 @@ static inline bool sde_kms_is_secure_session_inprogress(struct sde_kms *sde_kms)
|
|||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
if (!sde_kms)
|
if (!sde_kms || !sde_kms->catalog)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
mutex_lock(&sde_kms->secure_transition_lock);
|
mutex_lock(&sde_kms->secure_transition_lock);
|
||||||
if (((sde_kms->catalog->sui_ns_allowed) &&
|
if (((test_bit(SDE_FEATURE_SUI_NS_ALLOWED, sde_kms->catalog->features)) &&
|
||||||
(sde_kms->smmu_state.secure_level == SDE_DRM_SEC_ONLY) &&
|
(sde_kms->smmu_state.secure_level == SDE_DRM_SEC_ONLY) &&
|
||||||
((sde_kms->smmu_state.state == DETACHED_SEC) ||
|
((sde_kms->smmu_state.state == DETACHED_SEC) ||
|
||||||
(sde_kms->smmu_state.state == DETACH_SEC_REQ) ||
|
(sde_kms->smmu_state.state == DETACH_SEC_REQ) ||
|
||||||
(sde_kms->smmu_state.state == ATTACH_SEC_REQ)))
|
(sde_kms->smmu_state.state == ATTACH_SEC_REQ))) ||
|
||||||
|| (((sde_kms->smmu_state.state == DETACHED) ||
|
(((sde_kms->smmu_state.state == DETACHED) ||
|
||||||
(sde_kms->smmu_state.state == DETACH_ALL_REQ) ||
|
(sde_kms->smmu_state.state == DETACH_ALL_REQ) ||
|
||||||
(sde_kms->smmu_state.state == ATTACH_ALL_REQ))))
|
(sde_kms->smmu_state.state == ATTACH_ALL_REQ))))
|
||||||
ret = true;
|
ret = true;
|
||||||
@@ -429,7 +429,7 @@ static inline bool sde_kms_is_vbif_operation_allowed(struct sde_kms *sde_kms)
|
|||||||
if (!sde_kms)
|
if (!sde_kms)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!sde_kms->catalog->sui_misr_supported)
|
if (!test_bit(SDE_FEATURE_SUI_MISR, sde_kms->catalog->features))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return !sde_kms_is_secure_session_inprogress(sde_kms);
|
return !sde_kms_is_secure_session_inprogress(sde_kms);
|
||||||
@@ -446,7 +446,7 @@ static inline bool sde_kms_is_cp_operation_allowed(struct sde_kms *sde_kms)
|
|||||||
if (!sde_kms || !sde_kms->catalog)
|
if (!sde_kms || !sde_kms->catalog)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (sde_kms->catalog->sui_ns_allowed)
|
if (test_bit(SDE_FEATURE_SUI_NS_ALLOWED, sde_kms->catalog->features))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return !sde_kms_is_secure_session_inprogress(sde_kms);
|
return !sde_kms_is_secure_session_inprogress(sde_kms);
|
||||||
|
@@ -3716,7 +3716,7 @@ static void _sde_plane_setup_capabilities_blob(struct sde_plane *psde,
|
|||||||
sde_kms_info_add_keyint(info, "pipe_idx", pipe_id);
|
sde_kms_info_add_keyint(info, "pipe_idx", pipe_id);
|
||||||
|
|
||||||
index = (master_plane_id == 0) ? 0 : 1;
|
index = (master_plane_id == 0) ? 0 : 1;
|
||||||
if (catalog->has_demura &&
|
if (test_bit(SDE_FEATURE_DEMURA, catalog->features) &&
|
||||||
catalog->demura_supported[psde->pipe][index] != ~0x0)
|
catalog->demura_supported[psde->pipe][index] != ~0x0)
|
||||||
sde_kms_info_add_keyint(info, "demura_block", index);
|
sde_kms_info_add_keyint(info, "demura_block", index);
|
||||||
|
|
||||||
@@ -3816,7 +3816,7 @@ static void _sde_plane_install_properties(struct drm_plane *plane,
|
|||||||
if (catalog->mixer_count &&
|
if (catalog->mixer_count &&
|
||||||
catalog->mixer[0].sblk->maxblendstages) {
|
catalog->mixer[0].sblk->maxblendstages) {
|
||||||
zpos_max = catalog->mixer[0].sblk->maxblendstages - 1;
|
zpos_max = catalog->mixer[0].sblk->maxblendstages - 1;
|
||||||
if (catalog->has_base_layer &&
|
if (test_bit(SDE_FEATURE_BASE_LAYER, catalog->features) &&
|
||||||
(zpos_max > SDE_STAGE_MAX - 1))
|
(zpos_max > SDE_STAGE_MAX - 1))
|
||||||
zpos_max = SDE_STAGE_MAX - 1;
|
zpos_max = SDE_STAGE_MAX - 1;
|
||||||
else if (zpos_max > SDE_STAGE_MAX - SDE_STAGE_0 - 1)
|
else if (zpos_max > SDE_STAGE_MAX - SDE_STAGE_0 - 1)
|
||||||
|
@@ -2209,7 +2209,7 @@ static int _sde_rm_populate_requirements(
|
|||||||
*/
|
*/
|
||||||
if ((!RM_RQ_CWB(reqs) || !RM_RQ_DCWB(reqs))
|
if ((!RM_RQ_CWB(reqs) || !RM_RQ_DCWB(reqs))
|
||||||
&& sde_crtc_state_in_clone_mode(enc, crtc_state)) {
|
&& sde_crtc_state_in_clone_mode(enc, crtc_state)) {
|
||||||
if (cfg->has_dedicated_cwb_support)
|
if (test_bit(SDE_FEATURE_DEDICATED_CWB, cfg->features))
|
||||||
reqs->top_ctrl |= BIT(SDE_RM_TOPCTL_DCWB);
|
reqs->top_ctrl |= BIT(SDE_RM_TOPCTL_DCWB);
|
||||||
else
|
else
|
||||||
reqs->top_ctrl |= BIT(SDE_RM_TOPCTL_CWB);
|
reqs->top_ctrl |= BIT(SDE_RM_TOPCTL_CWB);
|
||||||
|
@@ -465,7 +465,8 @@ int sde_wb_connector_set_info_blob(struct drm_connector *connector,
|
|||||||
}
|
}
|
||||||
|
|
||||||
sde_kms = to_sde_kms(priv->kms);
|
sde_kms = to_sde_kms(priv->kms);
|
||||||
sde_kms_info_add_keyint(info, "has_cwb_dither", sde_kms->catalog->has_cwb_dither);
|
sde_kms_info_add_keyint(info, "has_cwb_dither", test_bit(SDE_FEATURE_CWB_DITHER,
|
||||||
|
sde_kms->catalog->features));
|
||||||
} else {
|
} else {
|
||||||
SDE_ERROR("invalid params %pK\n", wb_dev->drm_dev);
|
SDE_ERROR("invalid params %pK\n", wb_dev->drm_dev);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -507,7 +508,7 @@ static void sde_wb_connector_install_dither_property(struct sde_wb_device *wb_de
|
|||||||
sde_kms = to_sde_kms(priv->kms);
|
sde_kms = to_sde_kms(priv->kms);
|
||||||
catalog = sde_kms->catalog;
|
catalog = sde_kms->catalog;
|
||||||
|
|
||||||
if (!catalog->has_cwb_dither)
|
if (!test_bit(SDE_FEATURE_CWB_DITHER, catalog->features))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
version = SDE_COLOR_PROCESS_MAJOR(
|
version = SDE_COLOR_PROCESS_MAJOR(
|
||||||
|
Reference in New Issue
Block a user