On Wed, May 23, 2018 at 12:31:01PM -0700, Jeykumar Sankaran wrote: > Remove hand rolled msm property caching to handle DPU > custom properties. This change also cleans up all its > dependencies to cache and restore respective drm > states. > > Signed-off-by: Jeykumar Sankaran <jsanka@xxxxxxxxxxxxxx> Reviewed-by: Sean Paul <seanpaul@xxxxxxxxxxxx> > --- > drivers/gpu/drm/msm/Makefile | 1 - > drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 2 - > drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 239 +-------- > drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 16 - > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 2 - > drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 123 +---- > drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h | 12 - > drivers/gpu/drm/msm/msm_drv.h | 16 +- > drivers/gpu/drm/msm/msm_prop.c | 688 -------------------------- > drivers/gpu/drm/msm/msm_prop.h | 438 ---------------- > 10 files changed, 8 insertions(+), 1529 deletions(-) > delete mode 100644 drivers/gpu/drm/msm/msm_prop.c > delete mode 100644 drivers/gpu/drm/msm/msm_prop.h > > diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile > index d289503..5331188 100644 > --- a/drivers/gpu/drm/msm/Makefile > +++ b/drivers/gpu/drm/msm/Makefile > @@ -76,7 +76,6 @@ msm-y := \ > dpu_io_util.o \ > dpu_dbg_evtlog.o \ > dpu_power_handle.o \ > - msm_prop.o \ > msm_atomic.o \ > msm_debugfs.o \ > msm_drv.o \ > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c > index c4820de..e4b82d5 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c > @@ -19,8 +19,6 @@ > #include <linux/clk.h> > #include <linux/bitmap.h> > > -#include "msm_prop.h" > - > #include "dpu_kms.h" > #include "dpu_trace.h" > #include "dpu_crtc.h" > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > index b0a3a30..43d9985 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c > @@ -579,10 +579,6 @@ static void dpu_crtc_destroy(struct drm_crtc *crtc) > if (!crtc) > return; > > - if (dpu_crtc->blob_info) > - drm_property_blob_put(dpu_crtc->blob_info); > - msm_property_destroy(&dpu_crtc->property_info); > - > _dpu_crtc_deinit_events(dpu_crtc); > > drm_crtc_cleanup(crtc); > @@ -1390,9 +1386,7 @@ static void dpu_crtc_destroy_state(struct drm_crtc *crtc, > > __drm_atomic_helper_crtc_destroy_state(state); > > - /* destroy value helper */ > - msm_property_destroy_state(&dpu_crtc->property_info, cstate, > - &cstate->property_state); > + kfree(cstate); > } > > static int _dpu_crtc_wait_for_frame_done(struct drm_crtc *crtc) > @@ -1641,17 +1635,12 @@ static struct drm_crtc_state *dpu_crtc_duplicate_state(struct drm_crtc *crtc) > > dpu_crtc = to_dpu_crtc(crtc); > old_cstate = to_dpu_crtc_state(crtc->state); > - cstate = msm_property_alloc_state(&dpu_crtc->property_info); > + cstate = kmemdup(old_cstate, sizeof(*old_cstate), GFP_KERNEL); > if (!cstate) { > DPU_ERROR("failed to allocate state\n"); > return NULL; > } > > - /* duplicate value helper */ > - msm_property_duplicate_state(&dpu_crtc->property_info, > - old_cstate, cstate, > - &cstate->property_state, cstate->property_values); > - > /* duplicate base helper */ > __drm_atomic_helper_crtc_duplicate_state(crtc, &cstate->base); > > @@ -1687,17 +1676,12 @@ static void dpu_crtc_reset(struct drm_crtc *crtc) > } > > dpu_crtc = to_dpu_crtc(crtc); > - cstate = msm_property_alloc_state(&dpu_crtc->property_info); > + cstate = kzalloc(sizeof(*cstate), GFP_KERNEL); > if (!cstate) { > DPU_ERROR("failed to allocate state\n"); > return; > } > > - /* reset value helper */ > - msm_property_reset_state(&dpu_crtc->property_info, cstate, > - &cstate->property_state, > - cstate->property_values); > - > _dpu_crtc_rp_reset(&cstate->rp, &dpu_crtc->rp_lock, > &dpu_crtc->rp_head); > > @@ -2194,212 +2178,6 @@ void dpu_crtc_cancel_pending_flip(struct drm_crtc *crtc, struct drm_file *file) > _dpu_crtc_complete_flip(crtc, file); > } > > -/** > - * dpu_crtc_install_properties - install all drm properties for crtc > - * @crtc: Pointer to drm crtc structure > - */ > -static void dpu_crtc_install_properties(struct drm_crtc *crtc, > - struct dpu_mdss_cfg *catalog) > -{ > - struct dpu_crtc *dpu_crtc; > - struct drm_device *dev; > - struct dpu_kms_info *info; > - struct dpu_kms *dpu_kms; > - > - DPU_DEBUG("\n"); > - > - if (!crtc || !catalog) { > - DPU_ERROR("invalid crtc or catalog\n"); > - return; > - } > - > - dpu_crtc = to_dpu_crtc(crtc); > - dev = crtc->dev; > - dpu_kms = _dpu_crtc_get_kms(crtc); > - > - if (!dpu_kms) { > - DPU_ERROR("invalid argument\n"); > - return; > - } > - > - info = kzalloc(sizeof(struct dpu_kms_info), GFP_KERNEL); > - if (!info) { > - DPU_ERROR("failed to allocate info memory\n"); > - return; > - } > - > - msm_property_install_blob(&dpu_crtc->property_info, "capabilities", > - DRM_MODE_PROP_IMMUTABLE, CRTC_PROP_INFO); > - > - dpu_kms_info_reset(info); > - > - dpu_kms_info_add_keyint(info, "hw_version", catalog->hwversion); > - dpu_kms_info_add_keyint(info, "max_linewidth", > - catalog->caps->max_mixer_width); > - dpu_kms_info_add_keyint(info, "max_blendstages", > - catalog->caps->max_mixer_blendstages); > - if (catalog->caps->qseed_type == DPU_SSPP_SCALER_QSEED2) > - dpu_kms_info_add_keystr(info, "qseed_type", "qseed2"); > - if (catalog->caps->qseed_type == DPU_SSPP_SCALER_QSEED3) > - dpu_kms_info_add_keystr(info, "qseed_type", "qseed3"); > - > - if (dpu_is_custom_client()) { > - if (catalog->caps->smart_dma_rev == DPU_SSPP_SMART_DMA_V1) > - dpu_kms_info_add_keystr(info, > - "smart_dma_rev", "smart_dma_v1"); > - if (catalog->caps->smart_dma_rev == DPU_SSPP_SMART_DMA_V2) > - dpu_kms_info_add_keystr(info, > - "smart_dma_rev", "smart_dma_v2"); > - } > - > - dpu_kms_info_add_keyint(info, "has_src_split", > - catalog->caps->has_src_split); > - if (catalog->perf.max_bw_low) > - dpu_kms_info_add_keyint(info, "max_bandwidth_low", > - catalog->perf.max_bw_low * 1000LL); > - if (catalog->perf.max_bw_high) > - dpu_kms_info_add_keyint(info, "max_bandwidth_high", > - catalog->perf.max_bw_high * 1000LL); > - if (catalog->perf.min_core_ib) > - dpu_kms_info_add_keyint(info, "min_core_ib", > - catalog->perf.min_core_ib * 1000LL); > - if (catalog->perf.min_llcc_ib) > - dpu_kms_info_add_keyint(info, "min_llcc_ib", > - catalog->perf.min_llcc_ib * 1000LL); > - if (catalog->perf.min_dram_ib) > - dpu_kms_info_add_keyint(info, "min_dram_ib", > - catalog->perf.min_dram_ib * 1000LL); > - if (dpu_kms->perf.max_core_clk_rate) > - dpu_kms_info_add_keyint(info, "max_mdp_clk", > - dpu_kms->perf.max_core_clk_rate); > - dpu_kms_info_add_keystr(info, "core_ib_ff", > - catalog->perf.core_ib_ff); > - dpu_kms_info_add_keystr(info, "core_clk_ff", > - catalog->perf.core_clk_ff); > - dpu_kms_info_add_keystr(info, "comp_ratio_rt", > - catalog->perf.comp_ratio_rt); > - dpu_kms_info_add_keystr(info, "comp_ratio_nrt", > - catalog->perf.comp_ratio_nrt); > - dpu_kms_info_add_keyint(info, "dest_scale_prefill_lines", > - catalog->perf.dest_scale_prefill_lines); > - dpu_kms_info_add_keyint(info, "undersized_prefill_lines", > - catalog->perf.undersized_prefill_lines); > - dpu_kms_info_add_keyint(info, "macrotile_prefill_lines", > - catalog->perf.macrotile_prefill_lines); > - dpu_kms_info_add_keyint(info, "yuv_nv12_prefill_lines", > - catalog->perf.yuv_nv12_prefill_lines); > - dpu_kms_info_add_keyint(info, "linear_prefill_lines", > - catalog->perf.linear_prefill_lines); > - dpu_kms_info_add_keyint(info, "downscaling_prefill_lines", > - catalog->perf.downscaling_prefill_lines); > - dpu_kms_info_add_keyint(info, "xtra_prefill_lines", > - catalog->perf.xtra_prefill_lines); > - dpu_kms_info_add_keyint(info, "amortizable_threshold", > - catalog->perf.amortizable_threshold); > - dpu_kms_info_add_keyint(info, "min_prefill_lines", > - catalog->perf.min_prefill_lines); > - > - msm_property_set_blob(&dpu_crtc->property_info, &dpu_crtc->blob_info, > - info->data, DPU_KMS_INFO_DATALEN(info), CRTC_PROP_INFO); > - > - kfree(info); > -} > - > -/** > - * dpu_crtc_atomic_set_property - atomically set a crtc drm property > - * @crtc: Pointer to drm crtc structure > - * @state: Pointer to drm crtc state structure > - * @property: Pointer to targeted drm property > - * @val: Updated property value > - * @Returns: Zero on success > - */ > -static int dpu_crtc_atomic_set_property(struct drm_crtc *crtc, > - struct drm_crtc_state *state, > - struct drm_property *property, > - uint64_t val) > -{ > - struct dpu_crtc *dpu_crtc; > - struct dpu_crtc_state *cstate; > - int ret = -EINVAL; > - > - if (!crtc || !state || !property) { > - DPU_ERROR("invalid argument(s)\n"); > - } else { > - dpu_crtc = to_dpu_crtc(crtc); > - cstate = to_dpu_crtc_state(state); > - ret = msm_property_atomic_set(&dpu_crtc->property_info, > - &cstate->property_state, property, val); > - if (ret) > - DRM_ERROR("failed to set the property\n"); > - > - DPU_DEBUG("crtc%d %s[%d] <= 0x%llx ret=%d\n", crtc->base.id, > - property->name, property->base.id, val, ret); > - } > - > - return ret; > -} > - > -/** > - * dpu_crtc_set_property - set a crtc drm property > - * @crtc: Pointer to drm crtc structure > - * @property: Pointer to targeted drm property > - * @val: Updated property value > - * @Returns: Zero on success > - */ > -static int dpu_crtc_set_property(struct drm_crtc *crtc, > - struct drm_property *property, uint64_t val) > -{ > - DPU_DEBUG("\n"); > - > - return dpu_crtc_atomic_set_property(crtc, crtc->state, property, val); > -} > - > -/** > - * dpu_crtc_atomic_get_property - retrieve a crtc drm property > - * @crtc: Pointer to drm crtc structure > - * @state: Pointer to drm crtc state structure > - * @property: Pointer to targeted drm property > - * @val: Pointer to variable for receiving property value > - * @Returns: Zero on success > - */ > -static int dpu_crtc_atomic_get_property(struct drm_crtc *crtc, > - const struct drm_crtc_state *state, > - struct drm_property *property, > - uint64_t *val) > -{ > - struct dpu_crtc *dpu_crtc; > - struct dpu_crtc_state *cstate; > - struct drm_encoder *encoder; > - int i, ret = -EINVAL; > - bool is_cmd = true; > - > - if (!crtc || !state) { > - DPU_ERROR("invalid argument(s)\n"); > - } else { > - dpu_crtc = to_dpu_crtc(crtc); > - cstate = to_dpu_crtc_state(state); > - > - /** > - * set the cmd flag only when all the encoders attached > - * to the crtc are in cmd mode. Consider all other cases > - * as video mode. > - */ > - drm_for_each_encoder(encoder, crtc->dev) { > - if (encoder->crtc == crtc) > - is_cmd = dpu_encoder_check_mode(encoder, > - MSM_DISPLAY_CAP_CMD_MODE); > - } > - > - i = msm_property_index(&dpu_crtc->property_info, property); > - ret = msm_property_atomic_get(&dpu_crtc->property_info, > - &cstate->property_state, > - property, val); > - if (ret) > - DRM_ERROR("get property failed\n"); > - } > - return ret; > -} > - > #ifdef CONFIG_DEBUG_FS > static int _dpu_debugfs_status_show(struct seq_file *s, void *data) > { > @@ -2759,9 +2537,6 @@ static void dpu_crtc_early_unregister(struct drm_crtc *crtc) > .set_config = drm_atomic_helper_set_config, > .destroy = dpu_crtc_destroy, > .page_flip = drm_atomic_helper_page_flip, > - .set_property = dpu_crtc_set_property, > - .atomic_set_property = dpu_crtc_atomic_set_property, > - .atomic_get_property = dpu_crtc_atomic_get_property, > .reset = dpu_crtc_reset, > .atomic_duplicate_state = dpu_crtc_duplicate_state, > .atomic_destroy_state = dpu_crtc_destroy_state, > @@ -2924,14 +2699,6 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane) > return ERR_PTR(rc); > } > > - /* create CRTC properties */ > - msm_property_init(&dpu_crtc->property_info, &crtc->base, dev, > - priv->crtc_property, dpu_crtc->property_data, > - CRTC_PROP_COUNT, CRTC_PROP_BLOBCOUNT, > - sizeof(struct dpu_crtc_state)); > - > - dpu_crtc_install_properties(crtc, kms->catalog); > - > DPU_DEBUG("%s: successfully initialized crtc\n", dpu_crtc->name); > return crtc; > } > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h > index 6628eb3..f752101 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h > @@ -22,7 +22,6 @@ > #include <linux/kthread.h> > #include <uapi/drm/dpu_drm.h> > #include <drm/drm_crtc.h> > -#include "msm_prop.h" > #include "dpu_kms.h" > #include "dpu_core_perf.h" > #include "dpu_hw_blk.h" > @@ -200,10 +199,6 @@ struct dpu_crtc { > struct drm_pending_vblank_event *event; > u32 vsync_count; > > - struct msm_property_info property_info; > - struct msm_property_data property_data[CRTC_PROP_COUNT]; > - struct drm_property_blob *blob_info; > - > struct dpu_hw_stage_cfg stage_cfg; > struct dentry *debugfs_root; > > @@ -324,8 +319,6 @@ struct dpu_crtc_state { > bool is_ppsplit; > struct dpu_rect lm_bounds[CRTC_DUAL_MIXERS]; > > - struct msm_property_state property_state; > - struct msm_property_value property_values[CRTC_PROP_COUNT]; > uint64_t input_fence_timeout_ns; > > struct dpu_core_perf_params new_perf; > @@ -336,15 +329,6 @@ struct dpu_crtc_state { > container_of(x, struct dpu_crtc_state, base) > > /** > - * dpu_crtc_get_property - query integer value of crtc property > - * @S: Pointer to crtc state > - * @X: Property index, from enum msm_mdp_crtc_property > - * Returns: Integer value of requested property > - */ > -#define dpu_crtc_get_property(S, X) \ > - ((S) && ((X) < CRTC_PROP_COUNT) ? ((S)->property_values[(X)].value) : 0) > - > -/** > * dpu_crtc_get_mixer_width - get the mixer width > * Mixer width will be same as panel width(/2 for split) > */ > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h > index d853ad9..0339dfd 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h > @@ -20,8 +20,6 @@ > #define __DPU_ENCODER_H__ > > #include <drm/drm_crtc.h> > - > -#include "msm_prop.h" > #include "dpu_hw_mdss.h" > > #define DPU_ENCODER_FRAME_EVENT_DONE BIT(0) > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c > index 28735c8..faf5903 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c > @@ -20,9 +20,8 @@ > > #include <linux/debugfs.h> > #include <linux/dma-buf.h> > -#include "msm_prop.h" > -#include "msm_drv.h" > > +#include "msm_drv.h" > #include "dpu_kms.h" > #include "dpu_formats.h" > #include "dpu_hw_sspp.h" > @@ -119,9 +118,6 @@ struct dpu_plane { > > const struct dpu_sspp_sub_blks *pipe_sblk; > char pipe_name[DPU_NAME_SIZE]; > - struct msm_property_info property_info; > - struct msm_property_data property_data[PLANE_PROP_COUNT]; > - struct drm_property_blob *blob_info; > > /* debugfs related stuff */ > struct dentry *debugfs_root; > @@ -1401,7 +1397,6 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane, > } > > _dpu_plane_set_qos_remap(plane); > - > return 0; > } > > @@ -1486,89 +1481,6 @@ void dpu_plane_restore(struct drm_plane *plane) > dpu_plane_atomic_update(plane, plane->state); > } > > -/* helper to install properties which are common to planes and crtcs */ > -static void _dpu_plane_install_properties(struct drm_plane *plane, > - struct dpu_mdss_cfg *catalog, u32 master_plane_id) > -{ > - struct dpu_plane *pdpu = to_dpu_plane(plane); > - int zpos_max = 255; > - int zpos_def = 0; > - > - if (!plane || !pdpu) { > - DPU_ERROR("invalid plane\n"); > - return; > - } else if (!pdpu->pipe_hw || !pdpu->pipe_sblk) { > - DPU_ERROR("invalid plane, pipe_hw %d pipe_sblk %d\n", > - pdpu->pipe_hw != 0, pdpu->pipe_sblk != 0); > - return; > - } else if (!catalog) { > - DPU_ERROR("invalid catalog\n"); > - return; > - } > - > - pdpu->catalog = catalog; > - > - if (dpu_is_custom_client()) { > - if (catalog->mixer_count && > - catalog->mixer[0].sblk->maxblendstages) { > - zpos_max = catalog->mixer[0].sblk->maxblendstages - 1; > - if (zpos_max > DPU_STAGE_MAX - DPU_STAGE_0 - 1) > - zpos_max = DPU_STAGE_MAX - DPU_STAGE_0 - 1; > - } > - } else if (plane->type != DRM_PLANE_TYPE_PRIMARY) { > - /* reserve zpos == 0 for primary planes */ > - zpos_def = drm_plane_index(plane) + 1; > - } > -} > - > -static int dpu_plane_atomic_set_property(struct drm_plane *plane, > - struct drm_plane_state *state, struct drm_property *property, > - uint64_t val) > -{ > - struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL; > - struct dpu_plane_state *pstate; > - int ret = -EINVAL; > - > - DPU_DEBUG_PLANE(pdpu, "\n"); > - > - if (!plane) { > - DPU_ERROR("invalid plane\n"); > - } else if (!state) { > - DPU_ERROR_PLANE(pdpu, "invalid state\n"); > - } else { > - pstate = to_dpu_plane_state(state); > - ret = msm_property_atomic_set(&pdpu->property_info, > - &pstate->property_state, property, val); > - } > - > - DPU_DEBUG_PLANE(pdpu, "%s[%d] <= 0x%llx ret=%d\n", > - property->name, property->base.id, val, ret); > - > - return ret; > -} > - > -static int dpu_plane_atomic_get_property(struct drm_plane *plane, > - const struct drm_plane_state *state, > - struct drm_property *property, uint64_t *val) > -{ > - struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL; > - struct dpu_plane_state *pstate; > - int ret = -EINVAL; > - > - if (!plane) { > - DPU_ERROR("invalid plane\n"); > - } else if (!state) { > - DPU_ERROR("invalid state\n"); > - } else { > - DPU_DEBUG_PLANE(pdpu, "\n"); > - pstate = to_dpu_plane_state(state); > - ret = msm_property_atomic_get(&pdpu->property_info, > - &pstate->property_state, property, val); > - } > - > - return ret; > -} > - > static void dpu_plane_destroy(struct drm_plane *plane) > { > struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL; > @@ -1578,9 +1490,6 @@ static void dpu_plane_destroy(struct drm_plane *plane) > if (pdpu) { > _dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL); > > - if (pdpu->blob_info) > - drm_property_blob_put(pdpu->blob_info); > - msm_property_destroy(&pdpu->property_info); > mutex_destroy(&pdpu->lock); > > drm_plane_helper_disable(plane); > @@ -1598,7 +1507,6 @@ static void dpu_plane_destroy(struct drm_plane *plane) > static void dpu_plane_destroy_state(struct drm_plane *plane, > struct drm_plane_state *state) > { > - struct dpu_plane *pdpu; > struct dpu_plane_state *pstate; > > if (!plane || !state) { > @@ -1607,18 +1515,13 @@ static void dpu_plane_destroy_state(struct drm_plane *plane, > return; > } > > - pdpu = to_dpu_plane(plane); > pstate = to_dpu_plane_state(state); > > - DPU_DEBUG_PLANE(pdpu, "\n"); > - > /* remove ref count for frame buffers */ > if (state->fb) > drm_framebuffer_put(state->fb); > > - /* destroy value helper */ > - msm_property_destroy_state(&pdpu->property_info, pstate, > - &pstate->property_state); > + kfree(pstate); > } > > static struct drm_plane_state * > @@ -1638,7 +1541,7 @@ static void dpu_plane_destroy_state(struct drm_plane *plane, > > old_state = to_dpu_plane_state(plane->state); > pdpu = to_dpu_plane(plane); > - pstate = msm_property_alloc_state(&pdpu->property_info); > + pstate = kmemdup(old_state, sizeof(*old_state), GFP_KERNEL); > if (!pstate) { > DPU_ERROR_PLANE(pdpu, "failed to allocate state\n"); > return NULL; > @@ -1646,10 +1549,6 @@ static void dpu_plane_destroy_state(struct drm_plane *plane, > > DPU_DEBUG_PLANE(pdpu, "\n"); > > - /* duplicate value helper */ > - msm_property_duplicate_state(&pdpu->property_info, old_state, pstate, > - &pstate->property_state, pstate->property_values); > - > pstate->pending = false; > > __drm_atomic_helper_plane_duplicate_state(plane, &pstate->base); > @@ -1676,17 +1575,12 @@ static void dpu_plane_reset(struct drm_plane *plane) > plane->state = 0; > } > > - pstate = msm_property_alloc_state(&pdpu->property_info); > + pstate = kzalloc(sizeof(*pstate), GFP_KERNEL); > if (!pstate) { > DPU_ERROR_PLANE(pdpu, "failed to allocate state\n"); > return; > } > > - /* reset value helper */ > - msm_property_reset_state(&pdpu->property_info, pstate, > - &pstate->property_state, > - pstate->property_values); > - > pstate->base.plane = plane; > > plane->state = &pstate->base; > @@ -1919,8 +1813,6 @@ static void dpu_plane_early_unregister(struct drm_plane *plane) > .update_plane = drm_atomic_helper_update_plane, > .disable_plane = drm_atomic_helper_disable_plane, > .destroy = dpu_plane_destroy, > - .atomic_set_property = dpu_plane_atomic_set_property, > - .atomic_get_property = dpu_plane_atomic_get_property, > .reset = dpu_plane_reset, > .atomic_duplicate_state = dpu_plane_duplicate_state, > .atomic_destroy_state = dpu_plane_destroy_state, > @@ -2064,13 +1956,6 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev, > /* success! finalize initialization */ > drm_plane_helper_add(plane, &dpu_plane_helper_funcs); > > - msm_property_init(&pdpu->property_info, &plane->base, dev, > - priv->plane_property, pdpu->property_data, > - PLANE_PROP_COUNT, PLANE_PROP_BLOBCOUNT, > - sizeof(struct dpu_plane_state)); > - > - _dpu_plane_install_properties(plane, kms->catalog, master_plane_id); > - > /* save user friendly pipe name for later */ > snprintf(pdpu->pipe_name, DPU_NAME_SIZE, "plane%u", plane->base.id); > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h > index a06c8b4..f6fe6dd 100644 > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h > @@ -21,7 +21,6 @@ > > #include <drm/drm_crtc.h> > > -#include "msm_prop.h" > #include "dpu_kms.h" > #include "dpu_hw_mdss.h" > #include "dpu_hw_sspp.h" > @@ -44,8 +43,6 @@ > */ > struct dpu_plane_state { > struct drm_plane_state base; > - struct msm_property_state property_state; > - struct msm_property_value property_values[PLANE_PROP_COUNT]; > struct msm_gem_address_space *aspace; > void *input_fence; > enum dpu_stage stage; > @@ -74,15 +71,6 @@ struct dpu_multirect_plane_states { > container_of(x, struct dpu_plane_state, base) > > /** > - * dpu_plane_get_property - Query integer value of plane property > - * @S: Pointer to plane state > - * @X: Property index, from enum msm_mdp_plane_property > - * Returns: Integer value of requested property > - */ > -#define dpu_plane_get_property(S, X) ((S) && ((X) < PLANE_PROP_COUNT) ? \ > - ((S)->property_values[(X)].value) : 0) > - > -/** > * dpu_plane_pipe - return sspp identifier for the given plane > * @plane: Pointer to DRM plane object > * Returns: sspp identifier of the given plane > diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h > index 8e80b4b..edb395d 100644 > --- a/drivers/gpu/drm/msm/msm_drv.h > +++ b/drivers/gpu/drm/msm/msm_drv.h > @@ -77,26 +77,13 @@ struct msm_file_private { > }; > > enum msm_mdp_plane_property { > - /* # of blob properties */ > - PLANE_PROP_BLOBCOUNT, > - > /* range properties */ > - PLANE_PROP_ZPOS = PLANE_PROP_BLOBCOUNT, > + PLANE_PROP_ZPOS, > > /* total # of properties */ > PLANE_PROP_COUNT > }; > > -enum msm_mdp_crtc_property { > - CRTC_PROP_INFO, > - > - /* # of blob properties */ > - CRTC_PROP_BLOBCOUNT, > - > - /* total # of properties */ > - CRTC_PROP_COUNT > -}; > - > struct msm_vblank_ctrl { > struct kthread_work work; > struct list_head event_list; > @@ -364,7 +351,6 @@ struct msm_drm_private { > > /* Properties */ > struct drm_property *plane_property[PLANE_PROP_COUNT]; > - struct drm_property *crtc_property[CRTC_PROP_COUNT]; > > /* Color processing properties for the crtc */ > struct drm_property **cp_property; > diff --git a/drivers/gpu/drm/msm/msm_prop.c b/drivers/gpu/drm/msm/msm_prop.c > deleted file mode 100644 > index 8f27cde..0000000 > --- a/drivers/gpu/drm/msm/msm_prop.c > +++ /dev/null > @@ -1,688 +0,0 @@ > -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License version 2 and > - * only version 2 as published by the Free Software Foundation. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - */ > - > -#include "msm_prop.h" > - > -void msm_property_init(struct msm_property_info *info, > - struct drm_mode_object *base, > - struct drm_device *dev, > - struct drm_property **property_array, > - struct msm_property_data *property_data, > - uint32_t property_count, > - uint32_t blob_count, > - uint32_t state_size) > -{ > - /* prevent access if any of these are NULL */ > - if (!base || !dev || !property_array || !property_data) { > - property_count = 0; > - blob_count = 0; > - > - DRM_ERROR("invalid arguments, forcing zero properties\n"); > - return; > - } > - > - /* can't have more blob properties than total properties */ > - if (blob_count > property_count) { > - blob_count = property_count; > - > - DBG("Capping number of blob properties to %d", blob_count); > - } > - > - if (!info) { > - DRM_ERROR("info pointer is NULL\n"); > - } else { > - info->base = base; > - info->dev = dev; > - info->property_array = property_array; > - info->property_data = property_data; > - info->property_count = property_count; > - info->blob_count = blob_count; > - info->install_request = 0; > - info->install_count = 0; > - info->recent_idx = 0; > - info->is_active = false; > - info->state_size = state_size; > - info->state_cache_size = 0; > - mutex_init(&info->property_lock); > - > - memset(property_data, > - 0, > - sizeof(struct msm_property_data) * > - property_count); > - } > -} > - > -void msm_property_destroy(struct msm_property_info *info) > -{ > - if (!info) > - return; > - > - /* free state cache */ > - while (info->state_cache_size > 0) > - kfree(info->state_cache[--(info->state_cache_size)]); > - > - mutex_destroy(&info->property_lock); > -} > - > -int msm_property_pop_dirty(struct msm_property_info *info, > - struct msm_property_state *property_state) > -{ > - struct list_head *item; > - int rc = 0; > - > - if (!info || !property_state || !property_state->values) { > - DRM_ERROR("invalid argument(s)\n"); > - return -EINVAL; > - } > - > - mutex_lock(&info->property_lock); > - if (list_empty(&property_state->dirty_list)) { > - rc = -EAGAIN; > - } else { > - item = property_state->dirty_list.next; > - list_del_init(item); > - rc = container_of(item, struct msm_property_value, dirty_node) > - - property_state->values; > - DRM_DEBUG_KMS("property %d dirty\n", rc); > - } > - mutex_unlock(&info->property_lock); > - > - return rc; > -} > - > -/** > - * _msm_property_set_dirty_no_lock - flag given property as being dirty > - * This function doesn't mutex protect the > - * dirty linked list. > - * @info: Pointer to property info container struct > - * @property_state: Pointer to property state container struct > - * @property_idx: Property index > - */ > -static void _msm_property_set_dirty_no_lock( > - struct msm_property_info *info, > - struct msm_property_state *property_state, > - uint32_t property_idx) > -{ > - if (!info || !property_state || !property_state->values || > - property_idx >= info->property_count) { > - DRM_ERROR("invalid argument(s), idx %u\n", property_idx); > - return; > - } > - > - /* avoid re-inserting if already dirty */ > - if (!list_empty(&property_state->values[property_idx].dirty_node)) { > - DRM_DEBUG_KMS("property %u already dirty\n", property_idx); > - return; > - } > - > - list_add_tail(&property_state->values[property_idx].dirty_node, > - &property_state->dirty_list); > -} > - > -/** > - * _msm_property_install_integer - install standard drm range property > - * @info: Pointer to property info container struct > - * @name: Property name > - * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE > - * @min: Min property value > - * @max: Max property value > - * @init: Default Property value > - * @property_idx: Property index > - * @force_dirty: Whether or not to filter 'dirty' status on unchanged values > - */ > -static void _msm_property_install_integer(struct msm_property_info *info, > - const char *name, int flags, uint64_t min, uint64_t max, > - uint64_t init, uint32_t property_idx, bool force_dirty) > -{ > - struct drm_property **prop; > - > - if (!info) > - return; > - > - ++info->install_request; > - > - if (!name || (property_idx >= info->property_count)) { > - DRM_ERROR("invalid argument(s), %s\n", name ? name : "null"); > - } else { > - prop = &info->property_array[property_idx]; > - /* > - * Properties need to be attached to each drm object that > - * uses them, but only need to be created once > - */ > - if (*prop == 0) { > - *prop = drm_property_create_range(info->dev, > - flags, name, min, max); > - if (*prop == 0) > - DRM_ERROR("create %s property failed\n", name); > - } > - > - /* save init value for later */ > - info->property_data[property_idx].default_value = init; > - info->property_data[property_idx].force_dirty = force_dirty; > - > - /* always attach property, if created */ > - if (*prop) { > - drm_object_attach_property(info->base, *prop, init); > - ++info->install_count; > - } > - } > -} > - > -void msm_property_install_range(struct msm_property_info *info, > - const char *name, int flags, uint64_t min, uint64_t max, > - uint64_t init, uint32_t property_idx) > -{ > - _msm_property_install_integer(info, name, flags, > - min, max, init, property_idx, false); > -} > - > -void msm_property_install_volatile_range(struct msm_property_info *info, > - const char *name, int flags, uint64_t min, uint64_t max, > - uint64_t init, uint32_t property_idx) > -{ > - _msm_property_install_integer(info, name, flags, > - min, max, init, property_idx, true); > -} > - > -void msm_property_install_rotation(struct msm_property_info *info, > - struct drm_plane *plane, unsigned int rotation, > - unsigned int supported_rotations, uint32_t property_idx) > -{ > - if (!info || !plane) > - return; > - > - ++info->install_request; > - > - if (property_idx >= info->property_count) { > - DRM_ERROR("invalid property index %d\n", property_idx); > - return; > - } > - > - if (drm_plane_create_rotation_property(plane, > - rotation, supported_rotations)) { > - DRM_ERROR("create rotation property failed\n"); > - return; > - } > - > - if (plane->rotation_property) { > - info->property_array[property_idx] = plane->rotation_property; > - > - /* save init value for later */ > - info->property_data[property_idx].default_value = rotation; > - info->property_data[property_idx].force_dirty = false; > - > - ++info->install_count; > - } > -} > - > -void msm_property_install_enum(struct msm_property_info *info, > - const char *name, int flags, int is_bitmask, > - const struct drm_prop_enum_list *values, int num_values, > - uint32_t property_idx) > -{ > - struct drm_property **prop; > - > - if (!info) > - return; > - > - ++info->install_request; > - > - if (!name || !values || !num_values || > - (property_idx >= info->property_count)) { > - DRM_ERROR("invalid argument(s), %s\n", name ? name : "null"); > - } else { > - prop = &info->property_array[property_idx]; > - /* > - * Properties need to be attached to each drm object that > - * uses them, but only need to be created once > - */ > - if (*prop == 0) { > - /* 'bitmask' is a special type of 'enum' */ > - if (is_bitmask) > - *prop = drm_property_create_bitmask(info->dev, > - DRM_MODE_PROP_BITMASK | flags, > - name, values, num_values, -1); > - else > - *prop = drm_property_create_enum(info->dev, > - DRM_MODE_PROP_ENUM | flags, > - name, values, num_values); > - if (*prop == 0) > - DRM_ERROR("create %s property failed\n", name); > - } > - > - /* save init value for later */ > - info->property_data[property_idx].default_value = 0; > - info->property_data[property_idx].force_dirty = false; > - > - /* select first defined value for enums */ > - if (!is_bitmask) > - info->property_data[property_idx].default_value = > - values->type; > - > - /* always attach property, if created */ > - if (*prop) { > - drm_object_attach_property(info->base, *prop, > - info->property_data > - [property_idx].default_value); > - ++info->install_count; > - } > - } > -} > - > -void msm_property_install_blob(struct msm_property_info *info, > - const char *name, int flags, uint32_t property_idx) > -{ > - struct drm_property **prop; > - > - if (!info) > - return; > - > - ++info->install_request; > - > - if (!name || (property_idx >= info->blob_count)) { > - DRM_ERROR("invalid argument(s), %s\n", name ? name : "null"); > - } else { > - prop = &info->property_array[property_idx]; > - /* > - * Properties need to be attached to each drm object that > - * uses them, but only need to be created once > - */ > - if (*prop == 0) { > - /* use 'create' for blob property place holder */ > - *prop = drm_property_create(info->dev, > - DRM_MODE_PROP_BLOB | flags, name, 0); > - if (*prop == 0) > - DRM_ERROR("create %s property failed\n", name); > - } > - > - /* save init value for later */ > - info->property_data[property_idx].default_value = 0; > - info->property_data[property_idx].force_dirty = true; > - > - /* always attach property, if created */ > - if (*prop) { > - drm_object_attach_property(info->base, *prop, -1); > - ++info->install_count; > - } > - } > -} > - > -int msm_property_install_get_status(struct msm_property_info *info) > -{ > - int rc = -ENOMEM; > - > - if (info && (info->install_request == info->install_count)) > - rc = 0; > - > - return rc; > -} > - > -int msm_property_index(struct msm_property_info *info, > - struct drm_property *property) > -{ > - uint32_t count; > - int32_t idx; > - int rc = -EINVAL; > - > - if (!info || !property) { > - DRM_ERROR("invalid argument(s)\n"); > - } else { > - /* > - * Linear search, but start from last found index. This will > - * help if any single property is accessed multiple times in a > - * row. Ideally, we could keep a list of properties sorted in > - * the order of most recent access, but that may be overkill > - * for now. > - */ > - mutex_lock(&info->property_lock); > - idx = info->recent_idx; > - count = info->property_count; > - while (count) { > - --count; > - > - /* stop searching on match */ > - if (info->property_array[idx] == property) { > - info->recent_idx = idx; > - rc = idx; > - break; > - } > - > - /* move to next valid index */ > - if (--idx < 0) > - idx = info->property_count - 1; > - } > - mutex_unlock(&info->property_lock); > - } > - > - return rc; > -} > - > -int msm_property_set_dirty(struct msm_property_info *info, > - struct msm_property_state *property_state, > - int property_idx) > -{ > - if (!info || !property_state || !property_state->values) { > - DRM_ERROR("invalid argument(s)\n"); > - return -EINVAL; > - } > - mutex_lock(&info->property_lock); > - _msm_property_set_dirty_no_lock(info, property_state, property_idx); > - mutex_unlock(&info->property_lock); > - return 0; > -} > - > -int msm_property_atomic_set(struct msm_property_info *info, > - struct msm_property_state *property_state, > - struct drm_property *property, uint64_t val) > -{ > - struct drm_property_blob *blob; > - int property_idx, rc = -EINVAL; > - > - property_idx = msm_property_index(info, property); > - if (!info || !property_state || > - (property_idx == -EINVAL) || !property_state->values) { > - DRM_DEBUG("invalid argument(s)\n"); > - } else { > - /* extra handling for incoming properties */ > - mutex_lock(&info->property_lock); > - if ((property->flags & DRM_MODE_PROP_BLOB) && > - (property_idx < info->blob_count)) { > - /* DRM lookup also takes a reference */ > - blob = drm_property_lookup_blob(info->dev, > - (uint32_t)val); > - if (!blob) { > - DRM_ERROR("blob not found\n"); > - val = 0; > - } else { > - DBG("Blob %u saved", blob->base.id); > - val = blob->base.id; > - > - /* save blob - need to clear previous ref */ > - if (property_state->values[property_idx].blob) > - drm_property_blob_put( > - property_state->values[ > - property_idx].blob); > - property_state->values[property_idx].blob = > - blob; > - } > - } > - > - /* update value and flag as dirty */ > - if (property_state->values[property_idx].value != val || > - info->property_data[property_idx].force_dirty) { > - property_state->values[property_idx].value = val; > - _msm_property_set_dirty_no_lock(info, property_state, > - property_idx); > - > - DBG("%s - %lld", property->name, val); > - } > - mutex_unlock(&info->property_lock); > - rc = 0; > - } > - > - return rc; > -} > - > -int msm_property_atomic_get(struct msm_property_info *info, > - struct msm_property_state *property_state, > - struct drm_property *property, uint64_t *val) > -{ > - int property_idx, rc = -EINVAL; > - > - property_idx = msm_property_index(info, property); > - if (!info || (property_idx == -EINVAL) || > - !property_state->values || !val) { > - DRM_DEBUG("Invalid argument(s)\n"); > - } else { > - mutex_lock(&info->property_lock); > - *val = property_state->values[property_idx].value; > - mutex_unlock(&info->property_lock); > - rc = 0; > - } > - > - return rc; > -} > - > -void *msm_property_alloc_state(struct msm_property_info *info) > -{ > - void *state = NULL; > - > - if (!info) { > - DRM_ERROR("invalid property info\n"); > - return NULL; > - } > - > - mutex_lock(&info->property_lock); > - if (info->state_cache_size) > - state = info->state_cache[--(info->state_cache_size)]; > - mutex_unlock(&info->property_lock); > - > - if (!state && info->state_size) > - state = kmalloc(info->state_size, GFP_KERNEL); > - > - if (!state) > - DRM_ERROR("failed to allocate state\n"); > - > - return state; > -} > - > -/** > - * _msm_property_free_state - helper function for freeing local state objects > - * @info: Pointer to property info container struct > - * @st: Pointer to state object > - */ > -static void _msm_property_free_state(struct msm_property_info *info, void *st) > -{ > - if (!info || !st) > - return; > - > - mutex_lock(&info->property_lock); > - if (info->state_cache_size < MSM_PROP_STATE_CACHE_SIZE) > - info->state_cache[(info->state_cache_size)++] = st; > - else > - kfree(st); > - mutex_unlock(&info->property_lock); > -} > - > -void msm_property_reset_state(struct msm_property_info *info, void *state, > - struct msm_property_state *property_state, > - struct msm_property_value *property_values) > -{ > - uint32_t i; > - > - if (!info) { > - DRM_ERROR("invalid property info\n"); > - return; > - } > - > - if (state) > - memset(state, 0, info->state_size); > - > - if (property_state) { > - property_state->property_count = info->property_count; > - property_state->values = property_values; > - INIT_LIST_HEAD(&property_state->dirty_list); > - } > - > - /* > - * Assign default property values. This helper is mostly used > - * to initialize newly created state objects. > - */ > - if (property_values) > - for (i = 0; i < info->property_count; ++i) { > - property_values[i].value = > - info->property_data[i].default_value; > - property_values[i].blob = NULL; > - INIT_LIST_HEAD(&property_values[i].dirty_node); > - } > -} > - > -void msm_property_duplicate_state(struct msm_property_info *info, > - void *old_state, void *state, > - struct msm_property_state *property_state, > - struct msm_property_value *property_values) > -{ > - uint32_t i; > - > - if (!info || !old_state || !state) { > - DRM_ERROR("invalid argument(s)\n"); > - return; > - } > - > - memcpy(state, old_state, info->state_size); > - > - if (!property_state) > - return; > - > - INIT_LIST_HEAD(&property_state->dirty_list); > - property_state->values = property_values; > - > - if (property_state->values) > - /* add ref count for blobs and initialize dirty nodes */ > - for (i = 0; i < info->property_count; ++i) { > - if (property_state->values[i].blob) > - drm_property_blob_get( > - property_state->values[i].blob); > - INIT_LIST_HEAD(&property_state->values[i].dirty_node); > - } > -} > - > -void msm_property_destroy_state(struct msm_property_info *info, void *state, > - struct msm_property_state *property_state) > -{ > - uint32_t i; > - > - if (!info || !state) { > - DRM_ERROR("invalid argument(s)\n"); > - return; > - } > - if (property_state && property_state->values) { > - /* remove ref count for blobs */ > - for (i = 0; i < info->property_count; ++i) > - if (property_state->values[i].blob) { > - drm_property_blob_put( > - property_state->values[i].blob); > - property_state->values[i].blob = NULL; > - } > - } > - > - _msm_property_free_state(info, state); > -} > - > -void *msm_property_get_blob(struct msm_property_info *info, > - struct msm_property_state *property_state, > - size_t *byte_len, > - uint32_t property_idx) > -{ > - struct drm_property_blob *blob; > - size_t len = 0; > - void *rc = 0; > - > - if (!info || !property_state || !property_state->values || > - (property_idx >= info->blob_count)) { > - DRM_ERROR("invalid argument(s)\n"); > - } else { > - blob = property_state->values[property_idx].blob; > - if (blob) { > - len = blob->length; > - rc = &blob->data; > - } > - } > - > - if (byte_len) > - *byte_len = len; > - > - return rc; > -} > - > -int msm_property_set_blob(struct msm_property_info *info, > - struct drm_property_blob **blob_reference, > - void *blob_data, > - size_t byte_len, > - uint32_t property_idx) > -{ > - struct drm_property_blob *blob = NULL; > - int rc = -EINVAL; > - > - if (!info || !blob_reference || (property_idx >= info->blob_count)) { > - DRM_ERROR("invalid argument(s)\n"); > - } else { > - /* create blob */ > - if (blob_data && byte_len) { > - blob = drm_property_create_blob(info->dev, > - byte_len, > - blob_data); > - if (IS_ERR_OR_NULL(blob)) { > - rc = PTR_ERR(blob); > - DRM_ERROR("failed to create blob, %d\n", rc); > - goto exit; > - } > - } > - > - /* update drm object */ > - rc = drm_object_property_set_value(info->base, > - info->property_array[property_idx], > - blob ? blob->base.id : 0); > - if (rc) { > - DRM_ERROR("failed to set blob to property\n"); > - if (blob) > - drm_property_blob_put(blob); > - goto exit; > - } > - > - /* update local reference */ > - if (*blob_reference) > - drm_property_blob_put(*blob_reference); > - *blob_reference = blob; > - } > - > -exit: > - return rc; > -} > - > -int msm_property_set_property(struct msm_property_info *info, > - struct msm_property_state *property_state, > - uint32_t property_idx, > - uint64_t val) > -{ > - int rc = -EINVAL; > - > - if (!info || (property_idx >= info->property_count) || > - property_idx < info->blob_count || > - !property_state || !property_state->values) { > - DRM_ERROR("invalid argument(s)\n"); > - } else { > - struct drm_property *drm_prop; > - > - mutex_lock(&info->property_lock); > - > - /* update cached value */ > - property_state->values[property_idx].value = val; > - > - /* update the new default value for immutables */ > - drm_prop = info->property_array[property_idx]; > - if (drm_prop->flags & DRM_MODE_PROP_IMMUTABLE) > - info->property_data[property_idx].default_value = val; > - > - mutex_unlock(&info->property_lock); > - > - /* update drm object */ > - rc = drm_object_property_set_value(info->base, drm_prop, val); > - if (rc) > - DRM_ERROR("failed set property value, idx %d rc %d\n", > - property_idx, rc); > - > - } > - > - return rc; > -} > - > diff --git a/drivers/gpu/drm/msm/msm_prop.h b/drivers/gpu/drm/msm/msm_prop.h > deleted file mode 100644 > index 6785955..0000000 > --- a/drivers/gpu/drm/msm/msm_prop.h > +++ /dev/null > @@ -1,438 +0,0 @@ > -/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. > - * > - * This program is free software; you can redistribute it and/or modify > - * it under the terms of the GNU General Public License version 2 and > - * only version 2 as published by the Free Software Foundation. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - */ > - > -#ifndef _MSM_PROP_H_ > -#define _MSM_PROP_H_ > - > -#include <linux/list.h> > -#include "msm_drv.h" > - > -#define MSM_PROP_STATE_CACHE_SIZE 2 > - > -/** > - * struct msm_property_data - opaque structure for tracking per > - * drm-object per property stuff > - * @default_value: Default property value for this drm object > - * @force_dirty: Always dirty property on incoming sets, rather than checking > - * for modified values > - */ > -struct msm_property_data { > - uint64_t default_value; > - bool force_dirty; > -}; > - > -/** > - * struct msm_property_value - opaque structure for tracking per > - * drm-object per property stuff > - * @value: Current property value for this drm object > - * @blob: Pointer to associated blob data, if available > - * @dirty_node: Linked list node to track if property is dirty or not > - */ > -struct msm_property_value { > - uint64_t value; > - struct drm_property_blob *blob; > - struct list_head dirty_node; > -}; > - > -/** > - * struct msm_property_info: Structure for property/state helper functions > - * @base: Pointer to base drm object (plane/crtc/etc.) > - * @dev: Pointer to drm device object > - * @property_array: Pointer to array for storing created property objects > - * @property_data: Pointer to array for storing private property data > - * @property_count: Total number of properties > - * @blob_count: Total number of blob properties, should be <= count > - * @install_request: Total number of property 'install' requests > - * @install_count: Total number of successful 'install' requests > - * @recent_idx: Index of property most recently accessed by set/get > - * @is_active: Whether or not drm component properties are 'active' > - * @state_cache: Cache of local states, to prevent alloc/free thrashing > - * @state_size: Size of local state structures > - * @state_cache_size: Number of state structures currently stored in state_cache > - * @property_lock: Mutex to protect local variables > - */ > -struct msm_property_info { > - struct drm_mode_object *base; > - struct drm_device *dev; > - > - struct drm_property **property_array; > - struct msm_property_data *property_data; > - uint32_t property_count; > - uint32_t blob_count; > - uint32_t install_request; > - uint32_t install_count; > - > - int32_t recent_idx; > - > - bool is_active; > - > - void *state_cache[MSM_PROP_STATE_CACHE_SIZE]; > - uint32_t state_size; > - int32_t state_cache_size; > - struct mutex property_lock; > -}; > - > -/** > - * struct msm_property_state - Structure for local property state information > - * @property_count: Total number of properties > - * @values: Pointer to array of msm_property_value objects > - * @dirty_list: List of all properties that have been 'atomic_set' but not > - * yet cleared with 'msm_property_pop_dirty' > - */ > -struct msm_property_state { > - uint32_t property_count; > - struct msm_property_value *values; > - struct list_head dirty_list; > -}; > - > -/** > - * msm_property_index_to_drm_property - get drm property struct from prop index > - * @info: Pointer to property info container struct > - * @property_idx: Property index > - * Returns: drm_property pointer associated with property index > - */ > -static inline > -struct drm_property *msm_property_index_to_drm_property( > - struct msm_property_info *info, uint32_t property_idx) > -{ > - if (!info || property_idx >= info->property_count) > - return NULL; > - > - return info->property_array[property_idx]; > -} > - > -/** > - * msm_property_get_default - query default value of a property > - * @info: Pointer to property info container struct > - * @property_idx: Property index > - * Returns: Default value for specified property > - */ > -static inline > -uint64_t msm_property_get_default(struct msm_property_info *info, > - uint32_t property_idx) > -{ > - uint64_t rc = 0; > - > - if (!info) > - return 0; > - > - mutex_lock(&info->property_lock); > - if (property_idx < info->property_count) > - rc = info->property_data[property_idx].default_value; > - mutex_unlock(&info->property_lock); > - > - return rc; > -} > - > -/** > - * msm_property_set_is_active - set overall 'active' status for all properties > - * @info: Pointer to property info container struct > - * @is_active: New 'is active' status > - */ > -static inline > -void msm_property_set_is_active(struct msm_property_info *info, bool is_active) > -{ > - if (info) { > - mutex_lock(&info->property_lock); > - info->is_active = is_active; > - mutex_unlock(&info->property_lock); > - } > -} > - > -/** > - * msm_property_get_is_active - query property 'is active' status > - * @info: Pointer to property info container struct > - * Returns: Current 'is active's status > - */ > -static inline > -bool msm_property_get_is_active(struct msm_property_info *info) > -{ > - bool rc = false; > - > - if (info) { > - mutex_lock(&info->property_lock); > - rc = info->is_active; > - mutex_unlock(&info->property_lock); > - } > - > - return rc; > -} > - > -/** > - * msm_property_pop_dirty - determine next dirty property and clear > - * its dirty flag > - * @info: Pointer to property info container struct > - * @property_state: Pointer to property state container struct > - * Returns: Valid msm property index on success, > - * -EAGAIN if no dirty properties are available > - * Property indicies returned from this function are similar > - * to those returned by the msm_property_index function. > - */ > -int msm_property_pop_dirty(struct msm_property_info *info, > - struct msm_property_state *property_state); > - > -/** > - * msm_property_init - initialize property info structure > - * @info: Pointer to property info container struct > - * @base: Pointer to base drm object (plane/crtc/etc.) > - * @dev: Pointer to drm device object > - * @property_array: Pointer to array for storing created property objects > - * @property_data: Pointer to array for storing private property data > - * @property_count: Total number of properties > - * @blob_count: Total number of blob properties, should be <= count > - * @state_size: Size of local state object > - */ > -void msm_property_init(struct msm_property_info *info, > - struct drm_mode_object *base, > - struct drm_device *dev, > - struct drm_property **property_array, > - struct msm_property_data *property_data, > - uint32_t property_count, > - uint32_t blob_count, > - uint32_t state_size); > - > -/** > - * msm_property_destroy - destroy helper info structure > - * > - * @info: Pointer to property info container struct > - */ > -void msm_property_destroy(struct msm_property_info *info); > - > -/** > - * msm_property_install_range - install standard drm range property > - * @info: Pointer to property info container struct > - * @name: Property name > - * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE > - * @min: Min property value > - * @max: Max property value > - * @init: Default Property value > - * @property_idx: Property index > - */ > -void msm_property_install_range(struct msm_property_info *info, > - const char *name, > - int flags, > - uint64_t min, > - uint64_t max, > - uint64_t init, > - uint32_t property_idx); > - > -/** > - * msm_property_install_volatile_range - install drm range property > - * This function is similar to msm_property_install_range, but assumes > - * that the property is meant for holding user pointers or descriptors > - * that may reference volatile data without having an updated value. > - * @info: Pointer to property info container struct > - * @name: Property name > - * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE > - * @min: Min property value > - * @max: Max property value > - * @init: Default Property value > - * @property_idx: Property index > - */ > -void msm_property_install_volatile_range(struct msm_property_info *info, > - const char *name, > - int flags, > - uint64_t min, > - uint64_t max, > - uint64_t init, > - uint32_t property_idx); > - > -/** > - * msm_property_install_rotation - install standard drm rotation property > - * @info: Pointer to property info container struct > - * @plane: Pointer to drm_plane which this property is installed on > - * @rotation: The default value for this new property > - * @supported_rotations: Bitmask of supported rotation values (see > - * drm_plane_create_rotation_property for more details) > - * @property_idx: Property index > - */ > -void msm_property_install_rotation(struct msm_property_info *info, > - struct drm_plane *plane, > - unsigned int rotation, > - unsigned int supported_rotations, > - uint32_t property_idx); > - > -/** > - * msm_property_install_enum - install standard drm enum/bitmask property > - * @info: Pointer to property info container struct > - * @name: Property name > - * @flags: Other property type flags, e.g. DRM_MODE_PROP_IMMUTABLE > - * @is_bitmask: Set to non-zero to create a bitmask property, rather than an > - * enumeration one > - * @values: Array of allowable enumeration/bitmask values > - * @num_values: Size of values array > - * @property_idx: Property index > - */ > -void msm_property_install_enum(struct msm_property_info *info, > - const char *name, > - int flags, > - int is_bitmask, > - const struct drm_prop_enum_list *values, > - int num_values, > - uint32_t property_idx); > - > -/** > - * msm_property_install_blob - install standard drm blob property > - * @info: Pointer to property info container struct > - * @name: Property name > - * @flags: Extra flags for property creation > - * @property_idx: Property index > - */ > -void msm_property_install_blob(struct msm_property_info *info, > - const char *name, > - int flags, > - uint32_t property_idx); > - > -/** > - * msm_property_install_get_status - query overal status of property additions > - * @info: Pointer to property info container struct > - * Returns: Zero if previous property install calls were all successful > - */ > -int msm_property_install_get_status(struct msm_property_info *info); > - > -/** > - * msm_property_index - determine property index from drm_property ptr > - * @info: Pointer to property info container struct > - * @property: Incoming property pointer > - * Returns: Valid property index, or -EINVAL on error > - */ > -int msm_property_index(struct msm_property_info *info, > - struct drm_property *property); > - > -/** > - * msm_property_set_dirty - forcibly flag a property as dirty > - * @info: Pointer to property info container struct > - * @property_state: Pointer to property state container struct > - * @property_idx: Property index > - * Returns: Zero on success > - */ > -int msm_property_set_dirty(struct msm_property_info *info, > - struct msm_property_state *property_state, > - int property_idx); > - > -/** > - * msm_property_atomic_set - helper function for atomic property set callback > - * @info: Pointer to property info container struct > - * @property_state: Pointer to local state structure > - * @property: Incoming property pointer > - * @val: Incoming property value > - * Returns: Zero on success > - */ > -int msm_property_atomic_set(struct msm_property_info *info, > - struct msm_property_state *property_state, > - struct drm_property *property, > - uint64_t val); > - > -/** > - * msm_property_atomic_get - helper function for atomic property get callback > - * @info: Pointer to property info container struct > - * @property_state: Pointer to local state structure > - * @property: Incoming property pointer > - * @val: Pointer to variable for receiving property value > - * Returns: Zero on success > - */ > -int msm_property_atomic_get(struct msm_property_info *info, > - struct msm_property_state *property_state, > - struct drm_property *property, > - uint64_t *val); > - > -/** > - * msm_property_alloc_state - helper function for allocating local state objects > - * @info: Pointer to property info container struct > - */ > -void *msm_property_alloc_state(struct msm_property_info *info); > - > -/** > - * msm_property_reset_state - helper function for state reset callback > - * @info: Pointer to property info container struct > - * @state: Pointer to local state structure > - * @property_state: Pointer to property state container struct > - * @property_values: Pointer to property values cache array > - */ > -void msm_property_reset_state(struct msm_property_info *info, void *state, > - struct msm_property_state *property_state, > - struct msm_property_value *property_values); > - > -/** > - * msm_property_duplicate_state - helper function for duplicate state cb > - * @info: Pointer to property info container struct > - * @old_state: Pointer to original state structure > - * @state: Pointer to newly created state structure > - * @property_state: Pointer to destination property state container struct > - * @property_values: Pointer to property values cache array > - */ > -void msm_property_duplicate_state(struct msm_property_info *info, > - void *old_state, > - void *state, > - struct msm_property_state *property_state, > - struct msm_property_value *property_values); > - > -/** > - * msm_property_destroy_state - helper function for destroy state cb > - * @info: Pointer to property info container struct > - * @state: Pointer to local state structure > - * @property_state: Pointer to property state container struct > - */ > -void msm_property_destroy_state(struct msm_property_info *info, > - void *state, > - struct msm_property_state *property_state); > - > -/** > - * msm_property_get_blob - obtain cached data pointer for drm blob property > - * @info: Pointer to property info container struct > - * @property_state: Pointer to property state container struct > - * @byte_len: Optional pointer to variable for accepting blob size > - * @property_idx: Property index > - * Returns: Pointer to blob data > - */ > -void *msm_property_get_blob(struct msm_property_info *info, > - struct msm_property_state *property_state, > - size_t *byte_len, > - uint32_t property_idx); > - > -/** > - * msm_property_set_blob - update blob property on a drm object > - * This function updates the blob property value of the given drm object. Its > - * intended use is to update blob properties that have been created with the > - * DRM_MODE_PROP_IMMUTABLE flag set. > - * @info: Pointer to property info container struct > - * @blob_reference: Reference to a pointer that holds the created data blob > - * @blob_data: Pointer to blob data > - * @byte_len: Length of blob data, in bytes > - * @property_idx: Property index > - * Returns: Zero on success > - */ > -int msm_property_set_blob(struct msm_property_info *info, > - struct drm_property_blob **blob_reference, > - void *blob_data, > - size_t byte_len, > - uint32_t property_idx); > - > -/** > - * msm_property_set_property - update property on a drm object > - * This function updates the property value of the given drm object. Its > - * intended use is to update properties that have been created with the > - * DRM_MODE_PROP_IMMUTABLE flag set. > - * Note: This function cannot be called on a blob. > - * @info: Pointer to property info container struct > - * @property_state: Pointer to property state container struct > - * @property_idx: Property index > - * @val: value of the property to set > - * Returns: Zero on success > - */ > -int msm_property_set_property(struct msm_property_info *info, > - struct msm_property_state *property_state, > - uint32_t property_idx, > - uint64_t val); > - > -#endif /* _MSM_PROP_H_ */ > - > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project > -- Sean Paul, Software Engineer, Google / Chromium OS -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html