From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [Intel-gfx] [PATCH 3/6] drm/mst: cached EDID for logical ports Date: Wed, 22 Oct 2014 11:06:21 +0200 Message-ID: <20141022090621.GR26941@phenom.ffwll.local> References: <1413945127-31793-1-git-send-email-airlied@gmail.com> <1413945127-31793-4-git-send-email-airlied@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail-wi0-f171.google.com (mail-wi0-f171.google.com [209.85.212.171]) by gabe.freedesktop.org (Postfix) with ESMTP id 3FC876E29B for ; Wed, 22 Oct 2014 02:06:13 -0700 (PDT) Received: by mail-wi0-f171.google.com with SMTP id em10so721189wid.16 for ; Wed, 22 Oct 2014 02:06:12 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1413945127-31793-4-git-send-email-airlied@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Dave Airlie Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org On Wed, Oct 22, 2014 at 12:32:04PM +1000, Dave Airlie wrote: > From: Dave Airlie > > Logical ports are never going to have EDID changes, > they are used for the internal ports on MST monitors. > > We cache the EDIDs from these to save time at MST probe. > > Signed-off-by: Dave Airlie > --- > drivers/gpu/drm/drm_dp_mst_topology.c | 20 ++++++++++++++++++-- > drivers/gpu/drm/i915/intel_dp_mst.c | 2 +- > include/drm/drm_dp_mst_helper.h | 4 +++- > 3 files changed, 22 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c > index 50926db..ce1113c 100644 > --- a/drivers/gpu/drm/drm_dp_mst_topology.c > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c > @@ -858,6 +858,8 @@ static void drm_dp_destroy_port(struct kref *kref) > struct drm_dp_mst_topology_mgr *mgr = port->mgr; > if (!port->input) { > port->vcpi.num_slots = 0; > + > + kfree(port->cached_edid); > if (port->connector) > (*port->mgr->cbs->destroy_connector)(mgr, port->connector); > drm_dp_port_teardown_pdt(port, port->pdt); > @@ -1096,6 +1098,10 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, > char proppath[255]; > build_mst_prop_path(port, mstb, proppath); > port->connector = (*mstb->mgr->cbs->add_connector)(mstb->mgr, port, proppath); > + > + if (port->port_num >= 8) { > + port->cached_edid = drm_get_edid(port->connector, &port->aux.ddc); > + } I'm confused about how this works ... the tile property gets added in the intel ->add_connector callback already, but that relies upon drm_get_edid having parsed the displayid stuff. What am I missing? -Daniel > } > > /* put reference to this port */ > @@ -2149,7 +2155,8 @@ EXPORT_SYMBOL(drm_dp_mst_hpd_irq); > * This returns the current connection state for a port. It validates the > * port pointer still exists so the caller doesn't require a reference > */ > -enum drm_connector_status drm_dp_mst_detect_port(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) > +enum drm_connector_status drm_dp_mst_detect_port(struct drm_connector *connector, > + struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port) > { > enum drm_connector_status status = connector_status_disconnected; > > @@ -2168,6 +2175,10 @@ enum drm_connector_status drm_dp_mst_detect_port(struct drm_dp_mst_topology_mgr > > case DP_PEER_DEVICE_SST_SINK: > status = connector_status_connected; > + /* for logical ports - cache the EDID */ > + if (port->port_num >= 8 && !port->cached_edid) { > + port->cached_edid = drm_get_edid(connector, &port->aux.ddc); > + } > break; > case DP_PEER_DEVICE_DP_LEGACY_CONV: > if (port->ldps) > @@ -2199,7 +2210,12 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_ > if (!port) > return NULL; > > - edid = drm_get_edid(connector, &port->aux.ddc); > + if (port->cached_edid) > + edid = drm_edid_duplicate(port->cached_edid); > + else > + edid = drm_get_edid(connector, &port->aux.ddc); > + > + drm_mode_connector_set_tile_property(connector); > drm_dp_put_port(port); > return edid; > } > diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c > index d9a7a78..c66e73a 100644 > --- a/drivers/gpu/drm/i915/intel_dp_mst.c > +++ b/drivers/gpu/drm/i915/intel_dp_mst.c > @@ -283,7 +283,7 @@ intel_mst_port_dp_detect(struct drm_connector *connector) > struct intel_connector *intel_connector = to_intel_connector(connector); > struct intel_dp *intel_dp = intel_connector->mst_port; > > - return drm_dp_mst_detect_port(&intel_dp->mst_mgr, intel_connector->port); > + return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr, intel_connector->port); > } > > static enum drm_connector_status > diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h > index 338fc10..ee6fbad 100644 > --- a/include/drm/drm_dp_mst_helper.h > +++ b/include/drm/drm_dp_mst_helper.h > @@ -92,6 +92,8 @@ struct drm_dp_mst_port { > struct drm_dp_vcpi vcpi; > struct drm_connector *connector; > struct drm_dp_mst_topology_mgr *mgr; > + > + struct edid *cached_edid; /* for DP logical ports - make tiling work */ > }; > > /** > @@ -474,7 +476,7 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms > int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handled); > > > -enum drm_connector_status drm_dp_mst_detect_port(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port); > +enum drm_connector_status drm_dp_mst_detect_port(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port); > > struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port); > > -- > 2.1.0 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch