Message ID | 20190826132216.2823-7-oleg.vasilev@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v3,1/7] drm: move DP_MAX_DOWNSTREAM_PORTS from i915 to drm core | expand |
On Mon, Aug 26, 2019 at 9:22 AM Oleg Vasilev <oleg.vasilev@intel.com> wrote: > > Since DP-specific information is stored in driver's structures, every > driver needs to implement subconnector property by itself. > > Reviewed-by: Emil Velikov <emil.velikov@collabora.com> > Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com> > Cc: Alex Deucher <alexander.deucher@amd.com> > Cc: Christian König <christian.koenig@amd.com> > Cc: David (ChunMing) Zhou <David1.Zhou@amd.com> > Cc: amd-gfx@lists.freedesktop.org Similar to Ilia's sentiments, do these make sense for amd drivers? We expose the physical connectors only. So physical DP ports show up as DP drm connectors and if you connect a passive DP to HDMI/DVI dingle, the driver just does the right thing. We don't expose multiple drm connectors for the same physical connector. Alex > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 10 ++++++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 1 + > drivers/gpu/drm/amd/amdgpu/atombios_dp.c | 18 +++++++++++++++++- > 3 files changed, 28 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > index ece55c8fa673..348ed9e46bae 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > @@ -26,6 +26,7 @@ > > #include <drm/drm_edid.h> > #include <drm/drm_fb_helper.h> > +#include <drm/drm_dp_helper.h> > #include <drm/drm_probe_helper.h> > #include <drm/amdgpu_drm.h> > #include "amdgpu.h" > @@ -1407,6 +1408,10 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force) > pm_runtime_put_autosuspend(connector->dev->dev); > } > > + drm_dp_set_subconnector_property(&amdgpu_connector->base, > + ret, > + amdgpu_dig_connector->dpcd, > + amdgpu_dig_connector->downstream_ports); > return ret; > } > > @@ -1934,6 +1939,11 @@ amdgpu_connector_add(struct amdgpu_device *adev, > if (has_aux) > amdgpu_atombios_dp_aux_init(amdgpu_connector); > > + if (connector_type == DRM_MODE_CONNECTOR_DisplayPort || > + connector_type == DRM_MODE_CONNECTOR_eDP) { > + drm_mode_add_dp_subconnector_property(&amdgpu_connector->base); > + } > + > return; > > failed: > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > index eb9975f4decb..cb360b44371c 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > @@ -469,6 +469,7 @@ struct amdgpu_encoder { > struct amdgpu_connector_atom_dig { > /* displayport */ > u8 dpcd[DP_RECEIVER_CAP_SIZE]; > + u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS]; > u8 dp_sink_type; > int dp_clock; > int dp_lane_count; > diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c > index 6858cde9fc5d..b0d414553e71 100644 > --- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c > +++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c > @@ -334,6 +334,22 @@ static void amdgpu_atombios_dp_probe_oui(struct amdgpu_connector *amdgpu_connect > buf[0], buf[1], buf[2]); > } > > +static void amdgpu_atombios_dp_ds_ports(struct amdgpu_connector *amdgpu_connector) > +{ > + struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv; > + int ret; > + > + if (dig_connector->dpcd[DP_DPCD_REV] > 0x10) { > + ret = drm_dp_dpcd_read(&amdgpu_connector->ddc_bus->aux, > + DP_DOWNSTREAM_PORT_0, > + dig_connector->downstream_ports, > + DP_MAX_DOWNSTREAM_PORTS); > + if (ret) > + memset(dig_connector->downstream_ports, 0, > + DP_MAX_DOWNSTREAM_PORTS); > + } > +} > + > int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector) > { > struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv; > @@ -349,7 +365,7 @@ int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector) > dig_connector->dpcd); > > amdgpu_atombios_dp_probe_oui(amdgpu_connector); > - > + amdgpu_atombios_dp_ds_ports(amdgpu_connector); > return 0; > } > > -- > 2.23.0 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx
On Thu, Aug 29, 2019 at 08:52:31AM -0400, Alex Deucher wrote: > On Mon, Aug 26, 2019 at 9:22 AM Oleg Vasilev <oleg.vasilev@intel.com> wrote: > > > > Since DP-specific information is stored in driver's structures, every > > driver needs to implement subconnector property by itself. > > > > Reviewed-by: Emil Velikov <emil.velikov@collabora.com> > > Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com> > > Cc: Alex Deucher <alexander.deucher@amd.com> > > Cc: Christian König <christian.koenig@amd.com> > > Cc: David (ChunMing) Zhou <David1.Zhou@amd.com> > > Cc: amd-gfx@lists.freedesktop.org > > Similar to Ilia's sentiments, do these make sense for amd drivers? We > expose the physical connectors only. So physical DP ports show up as > DP drm connectors and if you connect a passive DP to HDMI/DVI dingle, > the driver just does the right thing. We don't expose multiple drm > connectors for the same physical connector. After a bit more though I guess you could just if (detected DP) set_subconnector_prop(DFP type); else if (detected HDMI) set_subconnector_prop(HDMI) > > Alex > > > --- > > drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 10 ++++++++++ > > drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h | 1 + > > drivers/gpu/drm/amd/amdgpu/atombios_dp.c | 18 +++++++++++++++++- > > 3 files changed, 28 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > > index ece55c8fa673..348ed9e46bae 100644 > > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c > > @@ -26,6 +26,7 @@ > > > > #include <drm/drm_edid.h> > > #include <drm/drm_fb_helper.h> > > +#include <drm/drm_dp_helper.h> > > #include <drm/drm_probe_helper.h> > > #include <drm/amdgpu_drm.h> > > #include "amdgpu.h" > > @@ -1407,6 +1408,10 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force) > > pm_runtime_put_autosuspend(connector->dev->dev); > > } > > > > + drm_dp_set_subconnector_property(&amdgpu_connector->base, > > + ret, > > + amdgpu_dig_connector->dpcd, > > + amdgpu_dig_connector->downstream_ports); > > return ret; > > } > > > > @@ -1934,6 +1939,11 @@ amdgpu_connector_add(struct amdgpu_device *adev, > > if (has_aux) > > amdgpu_atombios_dp_aux_init(amdgpu_connector); > > > > + if (connector_type == DRM_MODE_CONNECTOR_DisplayPort || > > + connector_type == DRM_MODE_CONNECTOR_eDP) { > > + drm_mode_add_dp_subconnector_property(&amdgpu_connector->base); > > + } > > + > > return; > > > > failed: > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > > index eb9975f4decb..cb360b44371c 100644 > > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h > > @@ -469,6 +469,7 @@ struct amdgpu_encoder { > > struct amdgpu_connector_atom_dig { > > /* displayport */ > > u8 dpcd[DP_RECEIVER_CAP_SIZE]; > > + u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS]; > > u8 dp_sink_type; > > int dp_clock; > > int dp_lane_count; > > diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c > > index 6858cde9fc5d..b0d414553e71 100644 > > --- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c > > +++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c > > @@ -334,6 +334,22 @@ static void amdgpu_atombios_dp_probe_oui(struct amdgpu_connector *amdgpu_connect > > buf[0], buf[1], buf[2]); > > } > > > > +static void amdgpu_atombios_dp_ds_ports(struct amdgpu_connector *amdgpu_connector) > > +{ > > + struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv; > > + int ret; > > + > > + if (dig_connector->dpcd[DP_DPCD_REV] > 0x10) { > > + ret = drm_dp_dpcd_read(&amdgpu_connector->ddc_bus->aux, > > + DP_DOWNSTREAM_PORT_0, > > + dig_connector->downstream_ports, > > + DP_MAX_DOWNSTREAM_PORTS); > > + if (ret) > > + memset(dig_connector->downstream_ports, 0, > > + DP_MAX_DOWNSTREAM_PORTS); > > + } > > +} > > + > > int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector) > > { > > struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv; > > @@ -349,7 +365,7 @@ int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector) > > dig_connector->dpcd); > > > > amdgpu_atombios_dp_probe_oui(amdgpu_connector); > > - > > + amdgpu_atombios_dp_ds_ports(amdgpu_connector); > > return 0; > > } > > > > -- > > 2.23.0 > > > > _______________________________________________ > > amd-gfx mailing list > > amd-gfx@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/amd-gfx > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c index ece55c8fa673..348ed9e46bae 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c @@ -26,6 +26,7 @@ #include <drm/drm_edid.h> #include <drm/drm_fb_helper.h> +#include <drm/drm_dp_helper.h> #include <drm/drm_probe_helper.h> #include <drm/amdgpu_drm.h> #include "amdgpu.h" @@ -1407,6 +1408,10 @@ amdgpu_connector_dp_detect(struct drm_connector *connector, bool force) pm_runtime_put_autosuspend(connector->dev->dev); } + drm_dp_set_subconnector_property(&amdgpu_connector->base, + ret, + amdgpu_dig_connector->dpcd, + amdgpu_dig_connector->downstream_ports); return ret; } @@ -1934,6 +1939,11 @@ amdgpu_connector_add(struct amdgpu_device *adev, if (has_aux) amdgpu_atombios_dp_aux_init(amdgpu_connector); + if (connector_type == DRM_MODE_CONNECTOR_DisplayPort || + connector_type == DRM_MODE_CONNECTOR_eDP) { + drm_mode_add_dp_subconnector_property(&amdgpu_connector->base); + } + return; failed: diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h index eb9975f4decb..cb360b44371c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h @@ -469,6 +469,7 @@ struct amdgpu_encoder { struct amdgpu_connector_atom_dig { /* displayport */ u8 dpcd[DP_RECEIVER_CAP_SIZE]; + u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS]; u8 dp_sink_type; int dp_clock; int dp_lane_count; diff --git a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c index 6858cde9fc5d..b0d414553e71 100644 --- a/drivers/gpu/drm/amd/amdgpu/atombios_dp.c +++ b/drivers/gpu/drm/amd/amdgpu/atombios_dp.c @@ -334,6 +334,22 @@ static void amdgpu_atombios_dp_probe_oui(struct amdgpu_connector *amdgpu_connect buf[0], buf[1], buf[2]); } +static void amdgpu_atombios_dp_ds_ports(struct amdgpu_connector *amdgpu_connector) +{ + struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv; + int ret; + + if (dig_connector->dpcd[DP_DPCD_REV] > 0x10) { + ret = drm_dp_dpcd_read(&amdgpu_connector->ddc_bus->aux, + DP_DOWNSTREAM_PORT_0, + dig_connector->downstream_ports, + DP_MAX_DOWNSTREAM_PORTS); + if (ret) + memset(dig_connector->downstream_ports, 0, + DP_MAX_DOWNSTREAM_PORTS); + } +} + int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector) { struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv; @@ -349,7 +365,7 @@ int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector) dig_connector->dpcd); amdgpu_atombios_dp_probe_oui(amdgpu_connector); - + amdgpu_atombios_dp_ds_ports(amdgpu_connector); return 0; }