Loading drivers/gpu/drm/msm/msm_drv.h +1 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,7 @@ enum msm_mdp_conn_property { CONNECTOR_PROP_TOPOLOGY_CONTROL, CONNECTOR_PROP_AUTOREFRESH, CONNECTOR_PROP_LP, CONNECTOR_PROP_FB_TRANSLATION_MODE, /* total # of properties */ CONNECTOR_PROP_COUNT Loading drivers/gpu/drm/msm/sde/sde_connector.c +1 −20 Original line number Diff line number Diff line Loading @@ -522,7 +522,6 @@ static void _sde_connector_destroy_fb(struct sde_connector *c_conn, return; } msm_framebuffer_cleanup(c_state->out_fb, c_state->aspace); drm_framebuffer_unreference(c_state->out_fb); c_state->out_fb = NULL; Loading Loading @@ -603,7 +602,6 @@ sde_connector_atomic_duplicate_state(struct drm_connector *connector) { struct sde_connector *c_conn; struct sde_connector_state *c_state, *c_oldstate; int rc; if (!connector || !connector->state) { SDE_ERROR("invalid connector %pK\n", connector); Loading @@ -624,13 +622,8 @@ sde_connector_atomic_duplicate_state(struct drm_connector *connector) &c_state->property_state, c_state->property_values); /* additional handling for drm framebuffer objects */ if (c_state->out_fb) { if (c_state->out_fb) drm_framebuffer_reference(c_state->out_fb); rc = msm_framebuffer_prepare(c_state->out_fb, c_state->aspace); if (rc) SDE_ERROR("failed to prepare fb, %d\n", rc); } return &c_state->base; } Loading Loading @@ -795,18 +788,6 @@ static int sde_connector_atomic_set_property(struct drm_connector *connector, } else { msm_framebuffer_set_kmap(c_state->out_fb, c_conn->fb_kmap); if (c_state->out_fb->flags & DRM_MODE_FB_SECURE) c_state->aspace = c_conn->aspace[SDE_IOMMU_DOMAIN_SECURE]; else c_state->aspace = c_conn->aspace[SDE_IOMMU_DOMAIN_UNSECURE]; rc = msm_framebuffer_prepare(c_state->out_fb, c_state->aspace); if (rc) SDE_ERROR("prep fb failed, %d\n", rc); } break; default: Loading drivers/gpu/drm/msm/sde/sde_connector.h +0 −2 Original line number Diff line number Diff line Loading @@ -322,7 +322,6 @@ struct sde_connector { * struct sde_connector_state - private connector status structure * @base: Base drm connector structure * @out_fb: Pointer to output frame buffer, if applicable * @aspace: Address space for accessing frame buffer objects, if applicable * @property_state: Local storage for msm_prop properties * @property_values: Local cache of current connector property values * @rois: Regions of interest structure for mapping CRTC to Connector output Loading @@ -331,7 +330,6 @@ struct sde_connector { struct sde_connector_state { struct drm_connector_state base; struct drm_framebuffer *out_fb; struct msm_gem_address_space *aspace; struct msm_property_state property_state; struct msm_property_value property_values[CONNECTOR_PROP_COUNT]; Loading drivers/gpu/drm/msm/sde/sde_encoder_phys.h +4 −0 Original line number Diff line number Diff line Loading @@ -350,6 +350,8 @@ struct sde_encoder_phys_cmd { * @intf_cfg: Interface hardware configuration * @wb_roi: Writeback region-of-interest * @wb_fmt: Writeback pixel format * @wb_fb: Pointer to current writeback framebuffer * @wb_aspace: Pointer to current writeback address space * @frame_count: Counter of completed writeback operations * @kickoff_count: Counter of issued writeback operations * @aspace: address space identifier for non-secure/secure domain Loading @@ -372,6 +374,8 @@ struct sde_encoder_phys_wb { struct sde_hw_intf_cfg intf_cfg; struct sde_rect wb_roi; const struct sde_format *wb_fmt; struct drm_framebuffer *wb_fb; struct msm_gem_address_space *wb_aspace; u32 frame_count; u32 kickoff_count; struct msm_gem_address_space *aspace[SDE_IOMMU_DOMAIN_MAX]; Loading drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c +35 −2 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__ #include <linux/debugfs.h> #include <uapi/drm/sde_drm.h> #include "sde_encoder_phys.h" #include "sde_formats.h" Loading Loading @@ -263,8 +264,10 @@ static void sde_encoder_phys_wb_setup_fb(struct sde_encoder_phys *phys_enc, const struct msm_format *format; int ret; struct msm_gem_address_space *aspace; u32 fb_mode; if (!phys_enc || !phys_enc->sde_kms || !phys_enc->sde_kms->catalog) { if (!phys_enc || !phys_enc->sde_kms || !phys_enc->sde_kms->catalog || !phys_enc->connector) { SDE_ERROR("invalid encoder\n"); return; } Loading @@ -275,13 +278,32 @@ static void sde_encoder_phys_wb_setup_fb(struct sde_encoder_phys *phys_enc, memset(wb_cfg, 0, sizeof(struct sde_hw_wb_cfg)); wb_cfg->intf_mode = phys_enc->intf_mode; wb_cfg->is_secure = (fb->flags & DRM_MODE_FB_SECURE) ? true : false; fb_mode = sde_connector_get_property(phys_enc->connector->state, CONNECTOR_PROP_FB_TRANSLATION_MODE); if (phys_enc->enable_state == SDE_ENC_DISABLING) wb_cfg->is_secure = false; else if (fb_mode == SDE_DRM_FB_SEC) wb_cfg->is_secure = true; else wb_cfg->is_secure = false; aspace = (wb_cfg->is_secure) ? wb_enc->aspace[SDE_IOMMU_DOMAIN_SECURE] : wb_enc->aspace[SDE_IOMMU_DOMAIN_UNSECURE]; SDE_DEBUG("[fb_secure:%d]\n", wb_cfg->is_secure); ret = msm_framebuffer_prepare(fb, aspace); if (ret) { SDE_ERROR("prep fb failed, %d\n", ret); return; } /* cache framebuffer for cleanup in writeback done */ wb_enc->wb_fb = fb; wb_enc->wb_aspace = aspace; format = msm_framebuffer_format(fb); if (!format) { SDE_DEBUG("invalid format for fb\n"); Loading Loading @@ -577,6 +599,10 @@ static void sde_encoder_phys_wb_setup( memset(wb_roi, 0, sizeof(struct sde_rect)); /* clear writeback framebuffer - will be updated in setup_fb */ wb_enc->wb_fb = NULL; wb_enc->wb_aspace = NULL; if (phys_enc->enable_state == SDE_ENC_DISABLING) { fb = wb_enc->fb_disable; wb_roi->w = 0; Loading Loading @@ -874,6 +900,13 @@ static int sde_encoder_phys_wb_wait_for_commit_done( wb_enc->wb_dev->wb_idx - WB_0, wb_time); } /* cleanup writeback framebuffer */ if (wb_enc->wb_fb && wb_enc->wb_aspace) { msm_framebuffer_cleanup(wb_enc->wb_fb, wb_enc->wb_aspace); wb_enc->wb_fb = NULL; wb_enc->wb_aspace = NULL; } SDE_EVT32(DRMID(phys_enc->parent), WBID(wb_enc), wb_enc->frame_count, wb_time, event, rc); Loading Loading
drivers/gpu/drm/msm/msm_drv.h +1 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,7 @@ enum msm_mdp_conn_property { CONNECTOR_PROP_TOPOLOGY_CONTROL, CONNECTOR_PROP_AUTOREFRESH, CONNECTOR_PROP_LP, CONNECTOR_PROP_FB_TRANSLATION_MODE, /* total # of properties */ CONNECTOR_PROP_COUNT Loading
drivers/gpu/drm/msm/sde/sde_connector.c +1 −20 Original line number Diff line number Diff line Loading @@ -522,7 +522,6 @@ static void _sde_connector_destroy_fb(struct sde_connector *c_conn, return; } msm_framebuffer_cleanup(c_state->out_fb, c_state->aspace); drm_framebuffer_unreference(c_state->out_fb); c_state->out_fb = NULL; Loading Loading @@ -603,7 +602,6 @@ sde_connector_atomic_duplicate_state(struct drm_connector *connector) { struct sde_connector *c_conn; struct sde_connector_state *c_state, *c_oldstate; int rc; if (!connector || !connector->state) { SDE_ERROR("invalid connector %pK\n", connector); Loading @@ -624,13 +622,8 @@ sde_connector_atomic_duplicate_state(struct drm_connector *connector) &c_state->property_state, c_state->property_values); /* additional handling for drm framebuffer objects */ if (c_state->out_fb) { if (c_state->out_fb) drm_framebuffer_reference(c_state->out_fb); rc = msm_framebuffer_prepare(c_state->out_fb, c_state->aspace); if (rc) SDE_ERROR("failed to prepare fb, %d\n", rc); } return &c_state->base; } Loading Loading @@ -795,18 +788,6 @@ static int sde_connector_atomic_set_property(struct drm_connector *connector, } else { msm_framebuffer_set_kmap(c_state->out_fb, c_conn->fb_kmap); if (c_state->out_fb->flags & DRM_MODE_FB_SECURE) c_state->aspace = c_conn->aspace[SDE_IOMMU_DOMAIN_SECURE]; else c_state->aspace = c_conn->aspace[SDE_IOMMU_DOMAIN_UNSECURE]; rc = msm_framebuffer_prepare(c_state->out_fb, c_state->aspace); if (rc) SDE_ERROR("prep fb failed, %d\n", rc); } break; default: Loading
drivers/gpu/drm/msm/sde/sde_connector.h +0 −2 Original line number Diff line number Diff line Loading @@ -322,7 +322,6 @@ struct sde_connector { * struct sde_connector_state - private connector status structure * @base: Base drm connector structure * @out_fb: Pointer to output frame buffer, if applicable * @aspace: Address space for accessing frame buffer objects, if applicable * @property_state: Local storage for msm_prop properties * @property_values: Local cache of current connector property values * @rois: Regions of interest structure for mapping CRTC to Connector output Loading @@ -331,7 +330,6 @@ struct sde_connector { struct sde_connector_state { struct drm_connector_state base; struct drm_framebuffer *out_fb; struct msm_gem_address_space *aspace; struct msm_property_state property_state; struct msm_property_value property_values[CONNECTOR_PROP_COUNT]; Loading
drivers/gpu/drm/msm/sde/sde_encoder_phys.h +4 −0 Original line number Diff line number Diff line Loading @@ -350,6 +350,8 @@ struct sde_encoder_phys_cmd { * @intf_cfg: Interface hardware configuration * @wb_roi: Writeback region-of-interest * @wb_fmt: Writeback pixel format * @wb_fb: Pointer to current writeback framebuffer * @wb_aspace: Pointer to current writeback address space * @frame_count: Counter of completed writeback operations * @kickoff_count: Counter of issued writeback operations * @aspace: address space identifier for non-secure/secure domain Loading @@ -372,6 +374,8 @@ struct sde_encoder_phys_wb { struct sde_hw_intf_cfg intf_cfg; struct sde_rect wb_roi; const struct sde_format *wb_fmt; struct drm_framebuffer *wb_fb; struct msm_gem_address_space *wb_aspace; u32 frame_count; u32 kickoff_count; struct msm_gem_address_space *aspace[SDE_IOMMU_DOMAIN_MAX]; Loading
drivers/gpu/drm/msm/sde/sde_encoder_phys_wb.c +35 −2 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__ #include <linux/debugfs.h> #include <uapi/drm/sde_drm.h> #include "sde_encoder_phys.h" #include "sde_formats.h" Loading Loading @@ -263,8 +264,10 @@ static void sde_encoder_phys_wb_setup_fb(struct sde_encoder_phys *phys_enc, const struct msm_format *format; int ret; struct msm_gem_address_space *aspace; u32 fb_mode; if (!phys_enc || !phys_enc->sde_kms || !phys_enc->sde_kms->catalog) { if (!phys_enc || !phys_enc->sde_kms || !phys_enc->sde_kms->catalog || !phys_enc->connector) { SDE_ERROR("invalid encoder\n"); return; } Loading @@ -275,13 +278,32 @@ static void sde_encoder_phys_wb_setup_fb(struct sde_encoder_phys *phys_enc, memset(wb_cfg, 0, sizeof(struct sde_hw_wb_cfg)); wb_cfg->intf_mode = phys_enc->intf_mode; wb_cfg->is_secure = (fb->flags & DRM_MODE_FB_SECURE) ? true : false; fb_mode = sde_connector_get_property(phys_enc->connector->state, CONNECTOR_PROP_FB_TRANSLATION_MODE); if (phys_enc->enable_state == SDE_ENC_DISABLING) wb_cfg->is_secure = false; else if (fb_mode == SDE_DRM_FB_SEC) wb_cfg->is_secure = true; else wb_cfg->is_secure = false; aspace = (wb_cfg->is_secure) ? wb_enc->aspace[SDE_IOMMU_DOMAIN_SECURE] : wb_enc->aspace[SDE_IOMMU_DOMAIN_UNSECURE]; SDE_DEBUG("[fb_secure:%d]\n", wb_cfg->is_secure); ret = msm_framebuffer_prepare(fb, aspace); if (ret) { SDE_ERROR("prep fb failed, %d\n", ret); return; } /* cache framebuffer for cleanup in writeback done */ wb_enc->wb_fb = fb; wb_enc->wb_aspace = aspace; format = msm_framebuffer_format(fb); if (!format) { SDE_DEBUG("invalid format for fb\n"); Loading Loading @@ -577,6 +599,10 @@ static void sde_encoder_phys_wb_setup( memset(wb_roi, 0, sizeof(struct sde_rect)); /* clear writeback framebuffer - will be updated in setup_fb */ wb_enc->wb_fb = NULL; wb_enc->wb_aspace = NULL; if (phys_enc->enable_state == SDE_ENC_DISABLING) { fb = wb_enc->fb_disable; wb_roi->w = 0; Loading Loading @@ -874,6 +900,13 @@ static int sde_encoder_phys_wb_wait_for_commit_done( wb_enc->wb_dev->wb_idx - WB_0, wb_time); } /* cleanup writeback framebuffer */ if (wb_enc->wb_fb && wb_enc->wb_aspace) { msm_framebuffer_cleanup(wb_enc->wb_fb, wb_enc->wb_aspace); wb_enc->wb_fb = NULL; wb_enc->wb_aspace = NULL; } SDE_EVT32(DRMID(phys_enc->parent), WBID(wb_enc), wb_enc->frame_count, wb_time, event, rc); Loading