* [PATCH 0/9] MST AUX Devices (v3)
@ 2019-07-23 23:27 sunpeng.li
[not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org>
` (3 more replies)
0 siblings, 4 replies; 14+ messages in thread
From: sunpeng.li @ 2019-07-23 23:27 UTC (permalink / raw)
To: amd-gfx, dri-devel; +Cc: Leo Li, nicholas.kazlauskas
From: Leo Li <sunpeng.li@amd.com>
Here's what changed in v3:
* Dropped patch to expose the mst-path device attribute, in lieu of
ongoing discussion for defining a better connector path property
* Change WARN_ON_ONCE -> DRM_ERROR on MST dpcd read errors to avoid
tainting the kernel
* Unwind intel_connector_register() on
drm_dp_mst_connector_late_register() failure.
* Docstring and cosmetic fixes
Leo Li (8):
drm/dp: Use non-cyclic idr
drm/nouveau: Use connector kdev as aux device parent
drm/bridge/analogix-anx78xx: Use connector kdev as aux device parent
drm/amd/display: Use connector kdev as aux device parent
drm/i915: Implement MST Aux device registration (v2)
drm/nouveau/kms/nv50: Implement MST Aux device registration
drm/radeon: Implement MST Aux device registration
drm/amd/display: Implement MST Aux device registration
Ville Syrjälä (1):
drm/dp_mst: Enable registration of AUX devices for MST ports
.../display/amdgpu_dm/amdgpu_dm_mst_types.c | 26 +++-
drivers/gpu/drm/bridge/analogix-anx78xx.c | 22 +--
drivers/gpu/drm/drm_dp_aux_dev.c | 18 ++-
drivers/gpu/drm/drm_dp_mst_topology.c | 144 ++++++++++++++++--
drivers/gpu/drm/i915/display/intel_dp_mst.c | 33 +++-
drivers/gpu/drm/nouveau/dispnv50/disp.c | 20 +++
drivers/gpu/drm/nouveau/nouveau_connector.c | 2 +-
drivers/gpu/drm/radeon/radeon_dp_mst.c | 22 +++
include/drm/drm_dp_helper.h | 4 +
include/drm/drm_dp_mst_helper.h | 11 ++
10 files changed, 272 insertions(+), 30 deletions(-)
--
2.22.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread[parent not found: <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org>]
* [PATCH 1/9] drm/dp: Use non-cyclic idr [not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org> @ 2019-07-23 23:28 ` sunpeng.li-5C7GfCeVMHo 2019-07-23 23:28 ` [PATCH 2/9 v3] drm/dp_mst: Enable registration of AUX devices for MST ports sunpeng.li-5C7GfCeVMHo ` (4 subsequent siblings) 5 siblings, 0 replies; 14+ messages in thread From: sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: Leo Li, harry.wentland-5C7GfCeVMHo, nicholas.kazlauskas-5C7GfCeVMHo, ville.syrjala-VuQAYsv1563Yd54FQh9/CA From: Leo Li <sunpeng.li@amd.com> In preparation for adding aux devices for DP MST, make the IDR non-cyclic. That way, hotplug cycling MST devices won't needlessly increment the minor version index. Signed-off-by: Leo Li <sunpeng.li@amd.com> Reviewed-by: Lyude Paul <lyude@redhat.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> --- drivers/gpu/drm/drm_dp_aux_dev.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_dp_aux_dev.c b/drivers/gpu/drm/drm_dp_aux_dev.c index 5be28e3295f3..26e38dacf654 100644 --- a/drivers/gpu/drm/drm_dp_aux_dev.c +++ b/drivers/gpu/drm/drm_dp_aux_dev.c @@ -82,8 +82,7 @@ static struct drm_dp_aux_dev *alloc_drm_dp_aux_dev(struct drm_dp_aux *aux) kref_init(&aux_dev->refcount); mutex_lock(&aux_idr_mutex); - index = idr_alloc_cyclic(&aux_idr, aux_dev, 0, DRM_AUX_MINORS, - GFP_KERNEL); + index = idr_alloc(&aux_idr, aux_dev, 0, DRM_AUX_MINORS, GFP_KERNEL); mutex_unlock(&aux_idr_mutex); if (index < 0) { kfree(aux_dev); -- 2.22.0 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/9 v3] drm/dp_mst: Enable registration of AUX devices for MST ports [not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org> 2019-07-23 23:28 ` [PATCH 1/9] drm/dp: Use non-cyclic idr sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 ` sunpeng.li-5C7GfCeVMHo [not found] ` <20190723232808.28128-3-sunpeng.li-5C7GfCeVMHo@public.gmane.org> 2019-07-23 23:28 ` [PATCH 3/9] drm/nouveau: Use connector kdev as aux device parent sunpeng.li-5C7GfCeVMHo ` (3 subsequent siblings) 5 siblings, 1 reply; 14+ messages in thread From: sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: Leo Li, harry.wentland-5C7GfCeVMHo, nicholas.kazlauskas-5C7GfCeVMHo, ville.syrjala-VuQAYsv1563Yd54FQh9/CA From: Ville Syrjälä <ville.syrjala@linux.intel.com> All available downstream ports - physical and logical - are exposed for each MST device. They are listed in /dev/, following the same naming scheme as SST devices by appending an incremental ID. Although all downstream ports are exposed, only some will work as expected. Consider the following topology: +---------+ | ASIC | +---------+ Conn-0| | +----v----+ +----| MST HUB |----+ | +---------+ | | | |Port-1 Port-2| +-----v-----+ +-----v-----+ | MST | | SST | | Display | | Display | +-----------+ +-----------+ |Port-1 x MST Path | MST Device ----------+---------------------------------- sst:0 | MST Hub mst:0-1 | MST Display mst:0-1-1 | MST Display's disconnected DP out mst:0-1-8 | MST Display's internal sink mst:0-2 | SST Display On certain MST displays, the upstream physical port will ACK DPCD reads. However, reads on the local logical port to the internal sink will *NAK*. i.e. reading mst:0-1 ACKs, but mst:0-1-8 NAKs. There may also be duplicates. Some displays will return the same GUID when reading DPCD from both mst:0-1 and mst:0-1-8. There are some device-dependent behavior as well. The MST hub used during testing will actually *ACK* read requests on a disconnected physical port, whereas the MST displays will NAK. In light of these discrepancies, it's simpler to expose all downstream ports - both physical and logical - and let the user decide what to use. v3 changes: * Change WARN_ON_ONCE -> DRM_ERROR on dpcd read errors * Docstring and cosmetic fixes v2 changes: Moved remote aux device (un)registration to new mst connector late register and early unregister helpers. Drivers should call these from their own mst connector function hooks. This is to solve an issue during driver unload, where mst connector devices are unregistered before the remote aux devices are. In a setup where aux devices are created as children of connector devices, the aux device would be removed too early, and uncleanly. Doing so in early_unregister solves this issue, as that is called before connector unregistration. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Leo Li <sunpeng.li@amd.com> Reviewed-by: Lyude Paul <lyude@redhat.com> --- drivers/gpu/drm/drm_dp_aux_dev.c | 15 ++- drivers/gpu/drm/drm_dp_mst_topology.c | 144 ++++++++++++++++++++++++-- include/drm/drm_dp_helper.h | 4 + include/drm/drm_dp_mst_helper.h | 11 ++ 4 files changed, 162 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/drm_dp_aux_dev.c b/drivers/gpu/drm/drm_dp_aux_dev.c index 26e38dacf654..0cfb386754c3 100644 --- a/drivers/gpu/drm/drm_dp_aux_dev.c +++ b/drivers/gpu/drm/drm_dp_aux_dev.c @@ -37,6 +37,7 @@ #include <drm/drm_crtc.h> #include <drm/drm_dp_helper.h> +#include <drm/drm_dp_mst_helper.h> #include <drm/drm_print.h> #include "drm_crtc_helper_internal.h" @@ -162,7 +163,12 @@ static ssize_t auxdev_read_iter(struct kiocb *iocb, struct iov_iter *to) break; } - res = drm_dp_dpcd_read(aux_dev->aux, pos, buf, todo); + if (aux_dev->aux->is_remote) + res = drm_dp_mst_dpcd_read(aux_dev->aux, pos, buf, + todo); + else + res = drm_dp_dpcd_read(aux_dev->aux, pos, buf, todo); + if (res <= 0) break; @@ -209,7 +215,12 @@ static ssize_t auxdev_write_iter(struct kiocb *iocb, struct iov_iter *from) break; } - res = drm_dp_dpcd_write(aux_dev->aux, pos, buf, todo); + if (aux_dev->aux->is_remote) + res = drm_dp_mst_dpcd_write(aux_dev->aux, pos, buf, + todo); + else + res = drm_dp_dpcd_write(aux_dev->aux, pos, buf, todo); + if (res <= 0) break; diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c index 0984b9a34d55..4733d3350ede 100644 --- a/drivers/gpu/drm/drm_dp_mst_topology.c +++ b/drivers/gpu/drm/drm_dp_mst_topology.c @@ -36,6 +36,8 @@ #include <drm/drm_print.h> #include <drm/drm_probe_helper.h> +#include "drm_crtc_helper_internal.h" + /** * DOC: dp mst helper * @@ -53,6 +55,9 @@ static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr, int id, struct drm_dp_payload *payload); +static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_mst_port *port, + int offset, int size, u8 *bytes); static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int offset, int size, u8 *bytes); @@ -1238,6 +1243,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); /* @@ -1483,6 +1490,52 @@ static bool drm_dp_port_setup_pdt(struct drm_dp_mst_port *port) return send_link; } +/** + * drm_dp_mst_dpcd_read() - read a series of bytes from the DPCD via sideband + * @aux: Fake sideband AUX CH + * @offset: address of the (first) register to read + * @buffer: buffer to store the register values + * @size: number of bytes in @buffer + * + * Performs the same functionality for remote devices via + * sideband messaging as drm_dp_dpcd_read() does for local + * devices via actual AUX CH. + * + * Return: Number of bytes read, or negative error code on failure. + */ +ssize_t drm_dp_mst_dpcd_read(struct drm_dp_aux *aux, + unsigned int offset, void *buffer, size_t size) +{ + struct drm_dp_mst_port *port = container_of(aux, struct drm_dp_mst_port, + aux); + + return drm_dp_send_dpcd_read(port->mgr, port, + offset, size, buffer); +} + +/** + * drm_dp_mst_dpcd_write() - write a series of bytes to the DPCD via sideband + * @aux: Fake sideband AUX CH + * @offset: address of the (first) register to write + * @buffer: buffer containing the values to write + * @size: number of bytes in @buffer + * + * Performs the same functionality for remote devices via + * sideband messaging as drm_dp_dpcd_write() does for local + * devices via actual AUX CH. + * + * Return: 0 on success, negative error code on failure. + */ +ssize_t drm_dp_mst_dpcd_write(struct drm_dp_aux *aux, + unsigned int offset, void *buffer, size_t size) +{ + struct drm_dp_mst_port *port = container_of(aux, struct drm_dp_mst_port, + aux); + + return drm_dp_send_dpcd_write(port->mgr, port, + offset, size, buffer); +} + static void drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 *guid) { int ret; @@ -1526,6 +1579,46 @@ static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb, strlcat(proppath, temp, proppath_size); } +/** + * drm_dp_mst_connector_late_register() - Late MST connector registration + * @drm_connector: The MST connector + * @port: The MST port for this connector + * + * Helper to register the remote aux device for this MST port. Drivers should + * call this from their mst connector's late_register hook to enable MST aux + * devices. + * + * Return: 0 on success, negative error code on failure. + */ +int drm_dp_mst_connector_late_register(struct drm_connector *connector, + struct drm_dp_mst_port *port) +{ + DRM_DEBUG_KMS("registering %s remote bus for %s\n", + port->aux.name, connector->kdev->kobj.name); + + port->aux.dev = connector->kdev; + return drm_dp_aux_register_devnode(&port->aux); +} +EXPORT_SYMBOL(drm_dp_mst_connector_late_register); + +/** + * drm_dp_mst_connector_early_unregister() - Early MST connector unregistration + * @drm_connector: The MST connector + * @port: The MST port for this connector + * + * Helper to unregister the remote aux device for this MST port, registered by + * drm_dp_mst_connector_late_register(). Drivers should call this from their mst + * connector's early_unregister hook. + */ +void drm_dp_mst_connector_early_unregister(struct drm_connector *connector, + struct drm_dp_mst_port *port) +{ + DRM_DEBUG_KMS("unregistering %s remote bus for %s\n", + port->aux.name, connector->kdev->kobj.name); + drm_dp_aux_unregister_devnode(&port->aux); +} +EXPORT_SYMBOL(drm_dp_mst_connector_early_unregister); + static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, struct drm_device *dev, struct drm_dp_link_addr_reply_port *port_msg) @@ -1548,6 +1641,7 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, port->mgr = mstb->mgr; port->aux.name = "DPMST"; port->aux.dev = dev->dev; + port->aux.is_remote = true; /* * Make sure the memory allocation for our parent branch stays @@ -1816,7 +1910,6 @@ static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr, return false; } -#if 0 static int build_dpcd_read(struct drm_dp_sideband_msg_tx *msg, u8 port_num, u32 offset, u8 num_bytes) { struct drm_dp_sideband_msg_req_body req; @@ -1829,7 +1922,6 @@ static int build_dpcd_read(struct drm_dp_sideband_msg_tx *msg, u8 port_num, u32 return 0; } -#endif static int drm_dp_send_sideband_msg(struct drm_dp_mst_topology_mgr *mgr, bool up, u8 *msg, int len) @@ -2441,26 +2533,58 @@ int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr) } EXPORT_SYMBOL(drm_dp_update_payload_part2); -#if 0 /* unused as of yet */ static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, - int offset, int size) + int offset, int size, u8 *bytes) { int len; + int ret = 0; struct drm_dp_sideband_msg_tx *txmsg; + struct drm_dp_mst_branch *mstb; + + mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); + if (!mstb) + return -EINVAL; txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); - if (!txmsg) - return -ENOMEM; + if (!txmsg) { + ret = -ENOMEM; + goto fail_put; + } - len = build_dpcd_read(txmsg, port->port_num, 0, 8); + len = build_dpcd_read(txmsg, port->port_num, offset, size); txmsg->dst = port->parent; drm_dp_queue_down_tx(mgr, txmsg); - return 0; + ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); + if (ret < 0) + goto fail_free; + + /* DPCD read should never be NACKed */ + if (txmsg->reply.reply_type == 1) { + DRM_ERROR("mstb %p port %d: DPCD read on addr 0x%x for %d bytes NAKed\n", + mstb, port->port_num, offset, size); + ret = -EIO; + goto fail_free; + } + + if (txmsg->reply.u.remote_dpcd_read_ack.num_bytes != size) { + ret = -EPROTO; + goto fail_free; + } + + ret = min_t(size_t, txmsg->reply.u.remote_dpcd_read_ack.num_bytes, + size); + memcpy(bytes, txmsg->reply.u.remote_dpcd_read_ack.bytes, ret); + +fail_free: + kfree(txmsg); +fail_put: + drm_dp_mst_topology_put_mstb(mstb); + + return ret; } -#endif static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, @@ -2489,7 +2613,7 @@ static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr, ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); if (ret > 0) { if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) - ret = -EINVAL; + ret = -EIO; else ret = 0; } diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 397896b5b21a..8364502f92cf 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -1309,6 +1309,10 @@ struct drm_dp_aux { * @cec: struct containing fields used for CEC-Tunneling-over-AUX. */ struct drm_dp_aux_cec cec; + /** + * @is_remote: Is this AUX CH actually using sideband messaging. + */ + bool is_remote; }; ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset, diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h index 8c97a5f92c47..2ba6253ea6d3 100644 --- a/include/drm/drm_dp_mst_helper.h +++ b/include/drm/drm_dp_mst_helper.h @@ -643,6 +643,17 @@ void drm_dp_mst_dump_topology(struct seq_file *m, void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr); int __must_check drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr); + +ssize_t drm_dp_mst_dpcd_read(struct drm_dp_aux *aux, + unsigned int offset, void *buffer, size_t size); +ssize_t drm_dp_mst_dpcd_write(struct drm_dp_aux *aux, + unsigned int offset, void *buffer, size_t size); + +int drm_dp_mst_connector_late_register(struct drm_connector *connector, + struct drm_dp_mst_port *port); +void drm_dp_mst_connector_early_unregister(struct drm_connector *connector, + struct drm_dp_mst_port *port); + struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct drm_atomic_state *state, struct drm_dp_mst_topology_mgr *mgr); int __must_check -- 2.22.0 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 14+ messages in thread
[parent not found: <20190723232808.28128-3-sunpeng.li-5C7GfCeVMHo@public.gmane.org>]
* Re: [PATCH 2/9 v3] drm/dp_mst: Enable registration of AUX devices for MST ports [not found] ` <20190723232808.28128-3-sunpeng.li-5C7GfCeVMHo@public.gmane.org> @ 2019-07-25 19:59 ` Lyude Paul 0 siblings, 0 replies; 14+ messages in thread From: Lyude Paul @ 2019-07-25 19:59 UTC (permalink / raw) To: sunpeng.li-5C7GfCeVMHo, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: harry.wentland-5C7GfCeVMHo, nicholas.kazlauskas-5C7GfCeVMHo, ville.syrjala-VuQAYsv1563Yd54FQh9/CA Noticed something! important note below On Tue, 2019-07-23 at 19:28 -0400, sunpeng.li@amd.com wrote: > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > All available downstream ports - physical and logical - are exposed for > each MST device. They are listed in /dev/, following the same naming > scheme as SST devices by appending an incremental ID. > > Although all downstream ports are exposed, only some will work as > expected. Consider the following topology: > > +---------+ > | ASIC | > +---------+ > Conn-0| > | > +----v----+ > +----| MST HUB |----+ > | +---------+ | > | | > |Port-1 Port-2| > +-----v-----+ +-----v-----+ > | MST | | SST | > | Display | | Display | > +-----------+ +-----------+ > |Port-1 > x > > MST Path | MST Device > ----------+---------------------------------- > sst:0 | MST Hub > mst:0-1 | MST Display > mst:0-1-1 | MST Display's disconnected DP out > mst:0-1-8 | MST Display's internal sink > mst:0-2 | SST Display > > On certain MST displays, the upstream physical port will ACK DPCD reads. > However, reads on the local logical port to the internal sink will > *NAK*. i.e. reading mst:0-1 ACKs, but mst:0-1-8 NAKs. > > There may also be duplicates. Some displays will return the same GUID > when reading DPCD from both mst:0-1 and mst:0-1-8. > > There are some device-dependent behavior as well. The MST hub used > during testing will actually *ACK* read requests on a disconnected > physical port, whereas the MST displays will NAK. > > In light of these discrepancies, it's simpler to expose all downstream > ports - both physical and logical - and let the user decide what to use. > > v3 changes: > * Change WARN_ON_ONCE -> DRM_ERROR on dpcd read errors > * Docstring and cosmetic fixes > > v2 changes: > > Moved remote aux device (un)registration to new mst connector late > register and early unregister helpers. Drivers should call these from > their own mst connector function hooks. > > This is to solve an issue during driver unload, where mst connector > devices are unregistered before the remote aux devices are. In a setup > where aux devices are created as children of connector devices, the aux > device would be removed too early, and uncleanly. Doing so in > early_unregister solves this issue, as that is called before connector > unregistration. > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > Signed-off-by: Leo Li <sunpeng.li@amd.com> > Reviewed-by: Lyude Paul <lyude@redhat.com> > --- > drivers/gpu/drm/drm_dp_aux_dev.c | 15 ++- > drivers/gpu/drm/drm_dp_mst_topology.c | 144 ++++++++++++++++++++++++-- > include/drm/drm_dp_helper.h | 4 + > include/drm/drm_dp_mst_helper.h | 11 ++ > 4 files changed, 162 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/drm_dp_aux_dev.c > b/drivers/gpu/drm/drm_dp_aux_dev.c > index 26e38dacf654..0cfb386754c3 100644 > --- a/drivers/gpu/drm/drm_dp_aux_dev.c > +++ b/drivers/gpu/drm/drm_dp_aux_dev.c > @@ -37,6 +37,7 @@ > > #include <drm/drm_crtc.h> > #include <drm/drm_dp_helper.h> > +#include <drm/drm_dp_mst_helper.h> > #include <drm/drm_print.h> > > #include "drm_crtc_helper_internal.h" > @@ -162,7 +163,12 @@ static ssize_t auxdev_read_iter(struct kiocb *iocb, > struct iov_iter *to) > break; > } > > - res = drm_dp_dpcd_read(aux_dev->aux, pos, buf, todo); > + if (aux_dev->aux->is_remote) > + res = drm_dp_mst_dpcd_read(aux_dev->aux, pos, buf, > + todo); > + else > + res = drm_dp_dpcd_read(aux_dev->aux, pos, buf, todo); > + > if (res <= 0) > break; > > @@ -209,7 +215,12 @@ static ssize_t auxdev_write_iter(struct kiocb *iocb, > struct iov_iter *from) > break; > } > > - res = drm_dp_dpcd_write(aux_dev->aux, pos, buf, todo); > + if (aux_dev->aux->is_remote) > + res = drm_dp_mst_dpcd_write(aux_dev->aux, pos, buf, > + todo); > + else > + res = drm_dp_dpcd_write(aux_dev->aux, pos, buf, todo); > + > if (res <= 0) > break; > > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c > b/drivers/gpu/drm/drm_dp_mst_topology.c > index 0984b9a34d55..4733d3350ede 100644 > --- a/drivers/gpu/drm/drm_dp_mst_topology.c > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c > @@ -36,6 +36,8 @@ > #include <drm/drm_print.h> > #include <drm/drm_probe_helper.h> > > +#include "drm_crtc_helper_internal.h" > + > /** > * DOC: dp mst helper > * > @@ -53,6 +55,9 @@ static int drm_dp_dpcd_write_payload(struct > drm_dp_mst_topology_mgr *mgr, > int id, > struct drm_dp_payload *payload); > > +static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr, > + struct drm_dp_mst_port *port, > + int offset, int size, u8 *bytes); > static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr, > struct drm_dp_mst_port *port, > int offset, int size, u8 *bytes); > @@ -1238,6 +1243,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; > + This looks like some rebase ditritus you probably don't want in the final patch ;) Other then that, everything still looks good to me > kfree(port->cached_edid); > > /* > @@ -1483,6 +1490,52 @@ static bool drm_dp_port_setup_pdt(struct > drm_dp_mst_port *port) > return send_link; > } > > +/** > + * drm_dp_mst_dpcd_read() - read a series of bytes from the DPCD via > sideband > + * @aux: Fake sideband AUX CH > + * @offset: address of the (first) register to read > + * @buffer: buffer to store the register values > + * @size: number of bytes in @buffer > + * > + * Performs the same functionality for remote devices via > + * sideband messaging as drm_dp_dpcd_read() does for local > + * devices via actual AUX CH. > + * > + * Return: Number of bytes read, or negative error code on failure. > + */ > +ssize_t drm_dp_mst_dpcd_read(struct drm_dp_aux *aux, > + unsigned int offset, void *buffer, size_t size) > +{ > + struct drm_dp_mst_port *port = container_of(aux, struct > drm_dp_mst_port, > + aux); > + > + return drm_dp_send_dpcd_read(port->mgr, port, > + offset, size, buffer); > +} > + > +/** > + * drm_dp_mst_dpcd_write() - write a series of bytes to the DPCD via > sideband > + * @aux: Fake sideband AUX CH > + * @offset: address of the (first) register to write > + * @buffer: buffer containing the values to write > + * @size: number of bytes in @buffer > + * > + * Performs the same functionality for remote devices via > + * sideband messaging as drm_dp_dpcd_write() does for local > + * devices via actual AUX CH. > + * > + * Return: 0 on success, negative error code on failure. > + */ > +ssize_t drm_dp_mst_dpcd_write(struct drm_dp_aux *aux, > + unsigned int offset, void *buffer, size_t size) > +{ > + struct drm_dp_mst_port *port = container_of(aux, struct > drm_dp_mst_port, > + aux); > + > + return drm_dp_send_dpcd_write(port->mgr, port, > + offset, size, buffer); > +} > + > static void drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 > *guid) > { > int ret; > @@ -1526,6 +1579,46 @@ static void build_mst_prop_path(const struct > drm_dp_mst_branch *mstb, > strlcat(proppath, temp, proppath_size); > } > > +/** > + * drm_dp_mst_connector_late_register() - Late MST connector registration > + * @drm_connector: The MST connector > + * @port: The MST port for this connector > + * > + * Helper to register the remote aux device for this MST port. Drivers > should > + * call this from their mst connector's late_register hook to enable MST > aux > + * devices. > + * > + * Return: 0 on success, negative error code on failure. > + */ > +int drm_dp_mst_connector_late_register(struct drm_connector *connector, > + struct drm_dp_mst_port *port) > +{ > + DRM_DEBUG_KMS("registering %s remote bus for %s\n", > + port->aux.name, connector->kdev->kobj.name); > + > + port->aux.dev = connector->kdev; > + return drm_dp_aux_register_devnode(&port->aux); > +} > +EXPORT_SYMBOL(drm_dp_mst_connector_late_register); > + > +/** > + * drm_dp_mst_connector_early_unregister() - Early MST connector > unregistration > + * @drm_connector: The MST connector > + * @port: The MST port for this connector > + * > + * Helper to unregister the remote aux device for this MST port, registered > by > + * drm_dp_mst_connector_late_register(). Drivers should call this from > their mst > + * connector's early_unregister hook. > + */ > +void drm_dp_mst_connector_early_unregister(struct drm_connector *connector, > + struct drm_dp_mst_port *port) > +{ > + DRM_DEBUG_KMS("unregistering %s remote bus for %s\n", > + port->aux.name, connector->kdev->kobj.name); > + drm_dp_aux_unregister_devnode(&port->aux); > +} > +EXPORT_SYMBOL(drm_dp_mst_connector_early_unregister); > + > static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, > struct drm_device *dev, > struct drm_dp_link_addr_reply_port *port_msg) > @@ -1548,6 +1641,7 @@ static void drm_dp_add_port(struct drm_dp_mst_branch > *mstb, > port->mgr = mstb->mgr; > port->aux.name = "DPMST"; > port->aux.dev = dev->dev; > + port->aux.is_remote = true; > > /* > * Make sure the memory allocation for our parent branch stays > @@ -1816,7 +1910,6 @@ static bool drm_dp_validate_guid(struct > drm_dp_mst_topology_mgr *mgr, > return false; > } > > -#if 0 > static int build_dpcd_read(struct drm_dp_sideband_msg_tx *msg, u8 port_num, > u32 offset, u8 num_bytes) > { > struct drm_dp_sideband_msg_req_body req; > @@ -1829,7 +1922,6 @@ static int build_dpcd_read(struct > drm_dp_sideband_msg_tx *msg, u8 port_num, u32 > > return 0; > } > -#endif > > static int drm_dp_send_sideband_msg(struct drm_dp_mst_topology_mgr *mgr, > bool up, u8 *msg, int len) > @@ -2441,26 +2533,58 @@ int drm_dp_update_payload_part2(struct > drm_dp_mst_topology_mgr *mgr) > } > EXPORT_SYMBOL(drm_dp_update_payload_part2); > > -#if 0 /* unused as of yet */ > static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr, > struct drm_dp_mst_port *port, > - int offset, int size) > + int offset, int size, u8 *bytes) > { > int len; > + int ret = 0; > struct drm_dp_sideband_msg_tx *txmsg; > + struct drm_dp_mst_branch *mstb; > + > + mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent); > + if (!mstb) > + return -EINVAL; > > txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); > - if (!txmsg) > - return -ENOMEM; > + if (!txmsg) { > + ret = -ENOMEM; > + goto fail_put; > + } > > - len = build_dpcd_read(txmsg, port->port_num, 0, 8); > + len = build_dpcd_read(txmsg, port->port_num, offset, size); > txmsg->dst = port->parent; > > drm_dp_queue_down_tx(mgr, txmsg); > > - return 0; > + ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); > + if (ret < 0) > + goto fail_free; > + > + /* DPCD read should never be NACKed */ > + if (txmsg->reply.reply_type == 1) { > + DRM_ERROR("mstb %p port %d: DPCD read on addr 0x%x for %d > bytes NAKed\n", > + mstb, port->port_num, offset, size); > + ret = -EIO; > + goto fail_free; > + } > + > + if (txmsg->reply.u.remote_dpcd_read_ack.num_bytes != size) { > + ret = -EPROTO; > + goto fail_free; > + } > + > + ret = min_t(size_t, txmsg->reply.u.remote_dpcd_read_ack.num_bytes, > + size); > + memcpy(bytes, txmsg->reply.u.remote_dpcd_read_ack.bytes, ret); > + > +fail_free: > + kfree(txmsg); > +fail_put: > + drm_dp_mst_topology_put_mstb(mstb); > + > + return ret; > } > -#endif > > static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr, > struct drm_dp_mst_port *port, > @@ -2489,7 +2613,7 @@ static int drm_dp_send_dpcd_write(struct > drm_dp_mst_topology_mgr *mgr, > ret = drm_dp_mst_wait_tx_reply(mstb, txmsg); > if (ret > 0) { > if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) > - ret = -EINVAL; > + ret = -EIO; > else > ret = 0; > } > diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h > index 397896b5b21a..8364502f92cf 100644 > --- a/include/drm/drm_dp_helper.h > +++ b/include/drm/drm_dp_helper.h > @@ -1309,6 +1309,10 @@ struct drm_dp_aux { > * @cec: struct containing fields used for CEC-Tunneling-over-AUX. > */ > struct drm_dp_aux_cec cec; > + /** > + * @is_remote: Is this AUX CH actually using sideband messaging. > + */ > + bool is_remote; > }; > > ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset, > diff --git a/include/drm/drm_dp_mst_helper.h > b/include/drm/drm_dp_mst_helper.h > index 8c97a5f92c47..2ba6253ea6d3 100644 > --- a/include/drm/drm_dp_mst_helper.h > +++ b/include/drm/drm_dp_mst_helper.h > @@ -643,6 +643,17 @@ void drm_dp_mst_dump_topology(struct seq_file *m, > void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr); > int __must_check > drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr); > + > +ssize_t drm_dp_mst_dpcd_read(struct drm_dp_aux *aux, > + unsigned int offset, void *buffer, size_t size); > +ssize_t drm_dp_mst_dpcd_write(struct drm_dp_aux *aux, > + unsigned int offset, void *buffer, size_t size); > + > +int drm_dp_mst_connector_late_register(struct drm_connector *connector, > + struct drm_dp_mst_port *port); > +void drm_dp_mst_connector_early_unregister(struct drm_connector *connector, > + struct drm_dp_mst_port *port); > + > struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct > drm_atomic_state *state, > struct > drm_dp_mst_topology_mgr *mgr); > int __must_check -- Cheers, Lyude Paul _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 3/9] drm/nouveau: Use connector kdev as aux device parent [not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org> 2019-07-23 23:28 ` [PATCH 1/9] drm/dp: Use non-cyclic idr sunpeng.li-5C7GfCeVMHo 2019-07-23 23:28 ` [PATCH 2/9 v3] drm/dp_mst: Enable registration of AUX devices for MST ports sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 ` sunpeng.li-5C7GfCeVMHo 2019-07-23 23:28 ` [PATCH 4/9] drm/bridge/analogix-anx78xx: " sunpeng.li-5C7GfCeVMHo ` (2 subsequent siblings) 5 siblings, 0 replies; 14+ messages in thread From: sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: Leo Li, Ben Skeggs, harry.wentland-5C7GfCeVMHo, nicholas.kazlauskas-5C7GfCeVMHo, ville.syrjala-VuQAYsv1563Yd54FQh9/CA From: Leo Li <sunpeng.li@amd.com> Set the connector's kernel device as the parent for the aux kernel device. This allows udev rules to access connector attributes when creating symlinks to aux devices. Cc: Ben Skeggs <bskeggs@redhat.com> Signed-off-by: Leo Li <sunpeng.li@amd.com> Reviewed-by: Lyude Paul <lyude@redhat.com> --- drivers/gpu/drm/nouveau/nouveau_connector.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c index 8f15281faa79..330d7d29a6e3 100644 --- a/drivers/gpu/drm/nouveau/nouveau_connector.c +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c @@ -1349,7 +1349,7 @@ nouveau_connector_create(struct drm_device *dev, break; case DRM_MODE_CONNECTOR_DisplayPort: case DRM_MODE_CONNECTOR_eDP: - nv_connector->aux.dev = dev->dev; + nv_connector->aux.dev = connector->kdev; nv_connector->aux.transfer = nouveau_connector_aux_xfer; snprintf(aux_name, sizeof(aux_name), "sor-%04x-%04x", dcbe->hasht, dcbe->hashm); -- 2.22.0 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/9] drm/bridge/analogix-anx78xx: Use connector kdev as aux device parent [not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org> ` (2 preceding siblings ...) 2019-07-23 23:28 ` [PATCH 3/9] drm/nouveau: Use connector kdev as aux device parent sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 ` sunpeng.li-5C7GfCeVMHo 2019-07-23 23:28 ` [PATCH 5/9] drm/amd/display: " sunpeng.li-5C7GfCeVMHo 2019-07-23 23:28 ` [PATCH 7/9] drm/nouveau/kms/nv50: Implement MST Aux device registration sunpeng.li-5C7GfCeVMHo 5 siblings, 0 replies; 14+ messages in thread From: sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: Nicolas Boichat, Leo Li, Enric Balletbo i Serra, harry.wentland-5C7GfCeVMHo, nicholas.kazlauskas-5C7GfCeVMHo, ville.syrjala-VuQAYsv1563Yd54FQh9/CA From: Leo Li <sunpeng.li@amd.com> Set the connector's kernel device as the parent for the aux kernel device. This allows udev rules to access connector attributes when creating symlinks to aux devices. To do so, the connector needs to be registered beforehand. Therefore, shift aux registration to be after connector registration. Cc: Enric Balletbo i Serra <enric.balletbo@collabora.com> Cc: Nicolas Boichat <drinkcat@chromium.org> Signed-off-by: Leo Li <sunpeng.li@amd.com> --- drivers/gpu/drm/bridge/analogix-anx78xx.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/bridge/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix-anx78xx.c index 3c7cc5af735c..c2800cd3e2ee 100644 --- a/drivers/gpu/drm/bridge/analogix-anx78xx.c +++ b/drivers/gpu/drm/bridge/analogix-anx78xx.c @@ -1008,17 +1008,6 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge) return -ENODEV; } - /* Register aux channel */ - anx78xx->aux.name = "DP-AUX"; - anx78xx->aux.dev = &anx78xx->client->dev; - anx78xx->aux.transfer = anx78xx_aux_transfer; - - err = drm_dp_aux_register(&anx78xx->aux); - if (err < 0) { - DRM_ERROR("Failed to register aux channel: %d\n", err); - return err; - } - err = drm_connector_init(bridge->dev, &anx78xx->connector, &anx78xx_connector_funcs, DRM_MODE_CONNECTOR_DisplayPort); @@ -1038,6 +1027,17 @@ static int anx78xx_bridge_attach(struct drm_bridge *bridge) anx78xx->connector.polled = DRM_CONNECTOR_POLL_HPD; + /* Register aux channel */ + anx78xx->aux.name = "DP-AUX"; + anx78xx->aux.dev = anx78xx->connector.kdev; + anx78xx->aux.transfer = anx78xx_aux_transfer; + + err = drm_dp_aux_register(&anx78xx->aux); + if (err < 0) { + DRM_ERROR("Failed to register aux channel: %d\n", err); + return err; + } + err = drm_connector_attach_encoder(&anx78xx->connector, bridge->encoder); if (err) { -- 2.22.0 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 5/9] drm/amd/display: Use connector kdev as aux device parent [not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org> ` (3 preceding siblings ...) 2019-07-23 23:28 ` [PATCH 4/9] drm/bridge/analogix-anx78xx: " sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 ` sunpeng.li-5C7GfCeVMHo 2019-07-23 23:28 ` [PATCH 7/9] drm/nouveau/kms/nv50: Implement MST Aux device registration sunpeng.li-5C7GfCeVMHo 5 siblings, 0 replies; 14+ messages in thread From: sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: Leo Li, Jerry Zuo, harry.wentland-5C7GfCeVMHo, nicholas.kazlauskas-5C7GfCeVMHo, ville.syrjala-VuQAYsv1563Yd54FQh9/CA From: Leo Li <sunpeng.li@amd.com> Set the connector's kernel device as the parent for the aux kernel device. This allows udev rules to access connector attributes when creating symlinks to aux devices. For example, the following udev rule: SUBSYSTEM=="drm_dp_aux_dev", SUBSYSTEMS=="drm", ATTRS{edid}=="*", SYMLINK+="drm_dp_aux/by-name/$id" Will create the following symlinks using the connector's name: $ ls /dev/drm_dp_aux/by-name/ card0-DP-1 card0-DP-2 card0-DP-3 Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Cc: Jerry (Fangzhi) Zuo <Jerry.Zuo@amd.com> Cc: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Leo Li <sunpeng.li@amd.com> --- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 6e205ee36ac3..53d2cfe62e13 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -388,7 +388,7 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, struct amdgpu_dm_connector *aconnector) { aconnector->dm_dp_aux.aux.name = "dmdc"; - aconnector->dm_dp_aux.aux.dev = dm->adev->dev; + aconnector->dm_dp_aux.aux.dev = aconnector->base.kdev; aconnector->dm_dp_aux.aux.transfer = dm_dp_aux_transfer; aconnector->dm_dp_aux.ddc_service = aconnector->dc_link->ddc; -- 2.22.0 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 7/9] drm/nouveau/kms/nv50: Implement MST Aux device registration [not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org> ` (4 preceding siblings ...) 2019-07-23 23:28 ` [PATCH 5/9] drm/amd/display: " sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 ` sunpeng.li-5C7GfCeVMHo [not found] ` <20190723232808.28128-8-sunpeng.li-5C7GfCeVMHo@public.gmane.org> 5 siblings, 1 reply; 14+ messages in thread From: sunpeng.li-5C7GfCeVMHo @ 2019-07-23 23:28 UTC (permalink / raw) To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: Leo Li, Ben Skeggs, harry.wentland-5C7GfCeVMHo, nicholas.kazlauskas-5C7GfCeVMHo, ville.syrjala-VuQAYsv1563Yd54FQh9/CA From: Leo Li <sunpeng.li@amd.com> Implement late_register and early_unregister hooks for MST connectors. Call drm helpers for MST connector registration, which registers the AUX devices. Cc: Ben Skeggs <bskeggs@redhat.com> Signed-off-by: Leo Li <sunpeng.li@amd.com> --- drivers/gpu/drm/nouveau/dispnv50/disp.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c index 8497768f1b41..0d6e9350ba44 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c @@ -1024,6 +1024,24 @@ nv50_mstc_destroy(struct drm_connector *connector) kfree(mstc); } +static int +nv50_mstc_late_register(struct drm_connector *connector) +{ + struct nv50_mstc *mstc = nv50_mstc(connector); + struct drm_dp_mst_port *port = mstc->port; + + return drm_dp_mst_connector_late_register(connector, port); +} + +static void +nv50_mstc_early_unregister(struct drm_connector *connector) +{ + struct nv50_mstc *mstc = nv50_mstc(connector); + struct drm_dp_mst_port *port = mstc->port; + + drm_dp_mst_connector_early_unregister(connector, port); +} + static const struct drm_connector_funcs nv50_mstc = { .reset = nouveau_conn_reset, @@ -1034,6 +1052,8 @@ nv50_mstc = { .atomic_destroy_state = nouveau_conn_atomic_destroy_state, .atomic_set_property = nouveau_conn_atomic_set_property, .atomic_get_property = nouveau_conn_atomic_get_property, + .late_register = nv50_mstc_late_register, + .early_unregister = nv50_mstc_early_unregister, }; static int -- 2.22.0 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 14+ messages in thread
[parent not found: <20190723232808.28128-8-sunpeng.li-5C7GfCeVMHo@public.gmane.org>]
* Re: [PATCH 7/9] drm/nouveau/kms/nv50: Implement MST Aux device registration [not found] ` <20190723232808.28128-8-sunpeng.li-5C7GfCeVMHo@public.gmane.org> @ 2019-07-25 20:57 ` Lyude Paul 0 siblings, 0 replies; 14+ messages in thread From: Lyude Paul @ 2019-07-25 20:57 UTC (permalink / raw) To: sunpeng.li-5C7GfCeVMHo, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW Cc: harry.wentland-5C7GfCeVMHo, nicholas.kazlauskas-5C7GfCeVMHo, ville.syrjala-VuQAYsv1563Yd54FQh9/CA, Ben Skeggs Works perfectly here, and no warnings (at least not any that are relevant to this patch series :) when reloading nouveau. Reviewed-by: Lyude Paul <lyude@redhat.com> On Tue, 2019-07-23 at 19:28 -0400, sunpeng.li@amd.com wrote: > From: Leo Li <sunpeng.li@amd.com> > > Implement late_register and early_unregister hooks for MST connectors. > Call drm helpers for MST connector registration, which registers the > AUX devices. > > Cc: Ben Skeggs <bskeggs@redhat.com> > Signed-off-by: Leo Li <sunpeng.li@amd.com> > --- > drivers/gpu/drm/nouveau/dispnv50/disp.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c > b/drivers/gpu/drm/nouveau/dispnv50/disp.c > index 8497768f1b41..0d6e9350ba44 100644 > --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c > +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c > @@ -1024,6 +1024,24 @@ nv50_mstc_destroy(struct drm_connector *connector) > kfree(mstc); > } > > +static int > +nv50_mstc_late_register(struct drm_connector *connector) > +{ > + struct nv50_mstc *mstc = nv50_mstc(connector); > + struct drm_dp_mst_port *port = mstc->port; > + > + return drm_dp_mst_connector_late_register(connector, port); > +} > + > +static void > +nv50_mstc_early_unregister(struct drm_connector *connector) > +{ > + struct nv50_mstc *mstc = nv50_mstc(connector); > + struct drm_dp_mst_port *port = mstc->port; > + > + drm_dp_mst_connector_early_unregister(connector, port); > +} > + > static const struct drm_connector_funcs > nv50_mstc = { > .reset = nouveau_conn_reset, > @@ -1034,6 +1052,8 @@ nv50_mstc = { > .atomic_destroy_state = nouveau_conn_atomic_destroy_state, > .atomic_set_property = nouveau_conn_atomic_set_property, > .atomic_get_property = nouveau_conn_atomic_get_property, > + .late_register = nv50_mstc_late_register, > + .early_unregister = nv50_mstc_early_unregister, > }; > > static int -- Cheers, Lyude Paul _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 6/9 v2] drm/i915: Implement MST Aux device registration 2019-07-23 23:27 [PATCH 0/9] MST AUX Devices (v3) sunpeng.li [not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org> @ 2019-07-23 23:28 ` sunpeng.li 2019-07-23 23:28 ` [PATCH 8/9] drm/radeon: " sunpeng.li 2019-07-23 23:28 ` [PATCH 9/9] drm/amd/display: " sunpeng.li 3 siblings, 0 replies; 14+ messages in thread From: sunpeng.li @ 2019-07-23 23:28 UTC (permalink / raw) To: amd-gfx, dri-devel; +Cc: Leo Li, nicholas.kazlauskas From: Leo Li <sunpeng.li@amd.com> Implement late_register and early_unregister hooks for MST connectors. Call drm helpers for MST connector registration, which registers the AUX devices. Signed-off-by: Leo Li <sunpeng.li@amd.com> v2 changes: Unwind intel_connector_register on mst late register failure. --- drivers/gpu/drm/i915/display/intel_dp_mst.c | 33 +++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c index 60652ebbdf61..0633ebf3f1bf 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c @@ -400,13 +400,42 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force) intel_connector->port); } +static int +intel_dp_mst_connector_late_register(struct drm_connector *connector) +{ + struct intel_connector *intel_connector = to_intel_connector(connector); + struct drm_dp_mst_port *port = intel_connector->port; + + int ret; + + ret = intel_connector_register(connector); + if (ret) + return ret; + + ret = drm_dp_mst_connector_late_register(connector, port); + if (ret) + intel_connector_unregister(connector); + + return ret; +} + +static void +intel_dp_mst_connector_early_unregister(struct drm_connector *connector) +{ + struct intel_connector *intel_connector = to_intel_connector(connector); + struct drm_dp_mst_port *port = intel_connector->port; + + drm_dp_mst_connector_early_unregister(connector, port); + intel_connector_unregister(connector); +} + static const struct drm_connector_funcs intel_dp_mst_connector_funcs = { .detect = intel_dp_mst_detect, .fill_modes = drm_helper_probe_single_connector_modes, .atomic_get_property = intel_digital_connector_atomic_get_property, .atomic_set_property = intel_digital_connector_atomic_set_property, - .late_register = intel_connector_register, - .early_unregister = intel_connector_unregister, + .late_register = intel_dp_mst_connector_late_register, + .early_unregister = intel_dp_mst_connector_early_unregister, .destroy = intel_connector_destroy, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, .atomic_duplicate_state = intel_digital_connector_duplicate_state, -- 2.22.0 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 8/9] drm/radeon: Implement MST Aux device registration 2019-07-23 23:27 [PATCH 0/9] MST AUX Devices (v3) sunpeng.li [not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org> 2019-07-23 23:28 ` [PATCH 6/9 v2] drm/i915: " sunpeng.li @ 2019-07-23 23:28 ` sunpeng.li 2019-07-23 23:28 ` [PATCH 9/9] drm/amd/display: " sunpeng.li 3 siblings, 0 replies; 14+ messages in thread From: sunpeng.li @ 2019-07-23 23:28 UTC (permalink / raw) To: amd-gfx, dri-devel; +Cc: Leo Li, Alex Deucher, nicholas.kazlauskas From: Leo Li <sunpeng.li@amd.com> Implement late_register and early_unregister hooks for MST connectors. Call drm helpers for MST connector registration, which registers the AUX devices. Cc: Alex Deucher <alexander.deucher@amd.com> Cc: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Leo Li <sunpeng.li@amd.com> --- drivers/gpu/drm/radeon/radeon_dp_mst.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/gpu/drm/radeon/radeon_dp_mst.c b/drivers/gpu/drm/radeon/radeon_dp_mst.c index 2994f07fbad9..2d53699734fb 100644 --- a/drivers/gpu/drm/radeon/radeon_dp_mst.c +++ b/drivers/gpu/drm/radeon/radeon_dp_mst.c @@ -260,11 +260,33 @@ radeon_dp_mst_connector_destroy(struct drm_connector *connector) kfree(radeon_connector); } +static int +radeon_dp_mst_connector_late_register(struct drm_connector *connector) +{ + struct radeon_connector *radeon_connector = + to_radeon_connector(connector); + struct drm_dp_mst_port *port = radeon_connector->port; + + return drm_dp_mst_connector_late_register(connector, port); +} + +static void +radeon_dp_mst_connector_early_unregister(struct drm_connector *connector) +{ + struct radeon_connector *radeon_connector = + to_radeon_connector(connector); + struct drm_dp_mst_port *port = radeon_connector->port; + + drm_dp_mst_connector_early_unregister(connector, port); +} + static const struct drm_connector_funcs radeon_dp_mst_connector_funcs = { .dpms = drm_helper_connector_dpms, .detect = radeon_dp_mst_detect, .fill_modes = drm_helper_probe_single_connector_modes, .destroy = radeon_dp_mst_connector_destroy, + .late_register = radeon_dp_mst_connector_late_register, + .early_unregister = radeon_dp_mst_connector_early_unregister, }; static struct drm_connector *radeon_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr, -- 2.22.0 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 9/9] drm/amd/display: Implement MST Aux device registration 2019-07-23 23:27 [PATCH 0/9] MST AUX Devices (v3) sunpeng.li ` (2 preceding siblings ...) 2019-07-23 23:28 ` [PATCH 8/9] drm/radeon: " sunpeng.li @ 2019-07-23 23:28 ` sunpeng.li 2019-07-24 20:05 ` Kazlauskas, Nicholas 3 siblings, 1 reply; 14+ messages in thread From: sunpeng.li @ 2019-07-23 23:28 UTC (permalink / raw) To: amd-gfx, dri-devel; +Cc: Leo Li, Jerry Zuo, nicholas.kazlauskas From: Leo Li <sunpeng.li@amd.com> Implement late_register and early_unregister hooks for MST connectors. Call drm helpers for MST connector registration, which registers the AUX devices. Cc: Jerry Zuo <Jerry.Zuo@amd.com> Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Cc: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Leo Li <sunpeng.li@amd.com> --- .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c index 53d2cfe62e13..16218a202b59 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -156,6 +156,26 @@ dm_dp_mst_connector_destroy(struct drm_connector *connector) kfree(amdgpu_dm_connector); } +static int +amdgpu_dm_mst_connector_late_register(struct drm_connector *connector) +{ + struct amdgpu_dm_connector *amdgpu_dm_connector = + to_amdgpu_dm_connector(connector); + struct drm_dp_mst_port *port = amdgpu_dm_connector->port; + + return drm_dp_mst_connector_late_register(connector, port); +} + +static void +amdgpu_dm_mst_connector_early_unregister(struct drm_connector *connector) +{ + struct amdgpu_dm_connector *amdgpu_dm_connector = + to_amdgpu_dm_connector(connector); + struct drm_dp_mst_port *port = amdgpu_dm_connector->port; + + drm_dp_mst_connector_early_unregister(connector, port); +} + static const struct drm_connector_funcs dm_dp_mst_connector_funcs = { .detect = dm_dp_mst_detect, .fill_modes = drm_helper_probe_single_connector_modes, @@ -164,7 +184,9 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = { .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state, .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, .atomic_set_property = amdgpu_dm_connector_atomic_set_property, - .atomic_get_property = amdgpu_dm_connector_atomic_get_property + .atomic_get_property = amdgpu_dm_connector_atomic_get_property, + .late_register = amdgpu_dm_mst_connector_late_register, + .early_unregister = amdgpu_dm_mst_connector_early_unregister, }; static int dm_dp_mst_get_modes(struct drm_connector *connector) -- 2.22.0 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 9/9] drm/amd/display: Implement MST Aux device registration 2019-07-23 23:28 ` [PATCH 9/9] drm/amd/display: " sunpeng.li @ 2019-07-24 20:05 ` Kazlauskas, Nicholas 2019-07-24 20:06 ` Li, Sun peng (Leo) 0 siblings, 1 reply; 14+ messages in thread From: Kazlauskas, Nicholas @ 2019-07-24 20:05 UTC (permalink / raw) To: Li, Sun peng (Leo), amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Cc: Zuo, Jerry On 7/23/19 7:28 PM, sunpeng.li@amd.com wrote: > From: Leo Li <sunpeng.li@amd.com> > > Implement late_register and early_unregister hooks for MST connectors. > Call drm helpers for MST connector registration, which registers the > AUX devices. > > Cc: Jerry Zuo <Jerry.Zuo@amd.com> > Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> > Cc: Harry Wentland <harry.wentland@amd.com> > Signed-off-by: Leo Li <sunpeng.li@amd.com> Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> BTW: I already reviewed patch 5, feel free to add my R-B. Nicholas Kazlauskas > --- > .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 24 ++++++++++++++++++- > 1 file changed, 23 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c > index 53d2cfe62e13..16218a202b59 100644 > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c > @@ -156,6 +156,26 @@ dm_dp_mst_connector_destroy(struct drm_connector *connector) > kfree(amdgpu_dm_connector); > } > > +static int > +amdgpu_dm_mst_connector_late_register(struct drm_connector *connector) > +{ > + struct amdgpu_dm_connector *amdgpu_dm_connector = > + to_amdgpu_dm_connector(connector); > + struct drm_dp_mst_port *port = amdgpu_dm_connector->port; > + > + return drm_dp_mst_connector_late_register(connector, port); > +} > + > +static void > +amdgpu_dm_mst_connector_early_unregister(struct drm_connector *connector) > +{ > + struct amdgpu_dm_connector *amdgpu_dm_connector = > + to_amdgpu_dm_connector(connector); > + struct drm_dp_mst_port *port = amdgpu_dm_connector->port; > + > + drm_dp_mst_connector_early_unregister(connector, port); > +} > + > static const struct drm_connector_funcs dm_dp_mst_connector_funcs = { > .detect = dm_dp_mst_detect, > .fill_modes = drm_helper_probe_single_connector_modes, > @@ -164,7 +184,9 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = { > .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state, > .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > .atomic_set_property = amdgpu_dm_connector_atomic_set_property, > - .atomic_get_property = amdgpu_dm_connector_atomic_get_property > + .atomic_get_property = amdgpu_dm_connector_atomic_get_property, > + .late_register = amdgpu_dm_mst_connector_late_register, > + .early_unregister = amdgpu_dm_mst_connector_early_unregister, > }; > > static int dm_dp_mst_get_modes(struct drm_connector *connector) > _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 9/9] drm/amd/display: Implement MST Aux device registration 2019-07-24 20:05 ` Kazlauskas, Nicholas @ 2019-07-24 20:06 ` Li, Sun peng (Leo) 0 siblings, 0 replies; 14+ messages in thread From: Li, Sun peng (Leo) @ 2019-07-24 20:06 UTC (permalink / raw) To: Kazlauskas, Nicholas, amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Cc: Zuo, Jerry On 2019-07-24 4:05 p.m., Kazlauskas, Nicholas wrote: > On 7/23/19 7:28 PM, sunpeng.li@amd.com wrote: >> From: Leo Li <sunpeng.li@amd.com> >> >> Implement late_register and early_unregister hooks for MST connectors. >> Call drm helpers for MST connector registration, which registers the >> AUX devices. >> >> Cc: Jerry Zuo <Jerry.Zuo@amd.com> >> Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> >> Cc: Harry Wentland <harry.wentland@amd.com> >> Signed-off-by: Leo Li <sunpeng.li@amd.com> > > Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> > > BTW: I already reviewed patch 5, feel free to add my R-B. > > Nicholas Kazlauskas Sorry, will do. Thanks! Leo > >> --- >> .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 24 ++++++++++++++++++- >> 1 file changed, 23 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c >> index 53d2cfe62e13..16218a202b59 100644 >> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c >> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c >> @@ -156,6 +156,26 @@ dm_dp_mst_connector_destroy(struct drm_connector *connector) >> kfree(amdgpu_dm_connector); >> } >> >> +static int >> +amdgpu_dm_mst_connector_late_register(struct drm_connector *connector) >> +{ >> + struct amdgpu_dm_connector *amdgpu_dm_connector = >> + to_amdgpu_dm_connector(connector); >> + struct drm_dp_mst_port *port = amdgpu_dm_connector->port; >> + >> + return drm_dp_mst_connector_late_register(connector, port); >> +} >> + >> +static void >> +amdgpu_dm_mst_connector_early_unregister(struct drm_connector *connector) >> +{ >> + struct amdgpu_dm_connector *amdgpu_dm_connector = >> + to_amdgpu_dm_connector(connector); >> + struct drm_dp_mst_port *port = amdgpu_dm_connector->port; >> + >> + drm_dp_mst_connector_early_unregister(connector, port); >> +} >> + >> static const struct drm_connector_funcs dm_dp_mst_connector_funcs = { >> .detect = dm_dp_mst_detect, >> .fill_modes = drm_helper_probe_single_connector_modes, >> @@ -164,7 +184,9 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = { >> .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state, >> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, >> .atomic_set_property = amdgpu_dm_connector_atomic_set_property, >> - .atomic_get_property = amdgpu_dm_connector_atomic_get_property >> + .atomic_get_property = amdgpu_dm_connector_atomic_get_property, >> + .late_register = amdgpu_dm_mst_connector_late_register, >> + .early_unregister = amdgpu_dm_mst_connector_early_unregister, >> }; >> >> static int dm_dp_mst_get_modes(struct drm_connector *connector) >> > _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2019-07-25 20:57 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-07-23 23:27 [PATCH 0/9] MST AUX Devices (v3) sunpeng.li
[not found] ` <20190723232808.28128-1-sunpeng.li-5C7GfCeVMHo@public.gmane.org>
2019-07-23 23:28 ` [PATCH 1/9] drm/dp: Use non-cyclic idr sunpeng.li-5C7GfCeVMHo
2019-07-23 23:28 ` [PATCH 2/9 v3] drm/dp_mst: Enable registration of AUX devices for MST ports sunpeng.li-5C7GfCeVMHo
[not found] ` <20190723232808.28128-3-sunpeng.li-5C7GfCeVMHo@public.gmane.org>
2019-07-25 19:59 ` Lyude Paul
2019-07-23 23:28 ` [PATCH 3/9] drm/nouveau: Use connector kdev as aux device parent sunpeng.li-5C7GfCeVMHo
2019-07-23 23:28 ` [PATCH 4/9] drm/bridge/analogix-anx78xx: " sunpeng.li-5C7GfCeVMHo
2019-07-23 23:28 ` [PATCH 5/9] drm/amd/display: " sunpeng.li-5C7GfCeVMHo
2019-07-23 23:28 ` [PATCH 7/9] drm/nouveau/kms/nv50: Implement MST Aux device registration sunpeng.li-5C7GfCeVMHo
[not found] ` <20190723232808.28128-8-sunpeng.li-5C7GfCeVMHo@public.gmane.org>
2019-07-25 20:57 ` Lyude Paul
2019-07-23 23:28 ` [PATCH 6/9 v2] drm/i915: " sunpeng.li
2019-07-23 23:28 ` [PATCH 8/9] drm/radeon: " sunpeng.li
2019-07-23 23:28 ` [PATCH 9/9] drm/amd/display: " sunpeng.li
2019-07-24 20:05 ` Kazlauskas, Nicholas
2019-07-24 20:06 ` Li, Sun peng (Leo)
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox