[PATCH v2] drm: add dp helper to initialize remote aux channel.

2019-12-06 Thread David (Dingchen) Zhang
[why]
We need to minimally initialize the remote aux channel, e.g. the
crc work struct of remote aux to dump the sink's DPRX CRCs in MST
setup.

[how]
Add helper that only initializes the crc work struct of the remote
aux, hooke crc work queue to 'drm_dp_aux_crc_work'. Then call this
helper in DP MST port initialization.
This, plus David Francis' patch [1], fix the issue of MST remote
aux DPCD CRCs read.

[1] https://patchwork.kernel.org/patch/11217941/

Cc: Leo Li 
Cc: Harry Wentland 
Signed-off-by: David (Dingchen) Zhang 
---
 drivers/gpu/drm/drm_dp_helper.c   | 13 +
 drivers/gpu/drm/drm_dp_mst_topology.c |  3 +++
 include/drm/drm_dp_helper.h   |  1 +
 3 files changed, 17 insertions(+)

diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 2c7870aef469..cc4845d0fcb8 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -968,6 +968,19 @@ static void drm_dp_aux_crc_work(struct work_struct *work)
}
 }
 
+/**
+ * drm_dp_remote_aux_init() - minimally initialise a remote aux channel
+ * @aux: DisplayPort AUX channel
+ *
+ * Used for remote aux channel in general. Merely initialize the crc work
+ * struct.
+ */
+void drm_dp_remote_aux_init(struct drm_dp_aux *aux)
+{
+   INIT_WORK(>crc_work, drm_dp_aux_crc_work);
+}
+EXPORT_SYMBOL(drm_dp_remote_aux_init);
+
 /**
  * drm_dp_aux_init() - minimally initialise an aux channel
  * @aux: DisplayPort AUX channel
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
b/drivers/gpu/drm/drm_dp_mst_topology.c
index 87fc44895d83..edafa182264a 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -1945,6 +1945,9 @@ drm_dp_mst_handle_link_address_port(struct 
drm_dp_mst_branch *mstb,
port->aux.dev = dev->dev;
port->aux.is_remote = true;
 
+   /* initialize the MST downstream port's AUX crc work queue */
+   drm_dp_remote_aux_init(>aux);
+
/*
 * Make sure the memory allocation for our parent branch stays
 * around until our own memory allocation is released
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index 8f8f3632e697..b2e6923d5929 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -1465,6 +1465,7 @@ int drm_dp_downstream_id(struct drm_dp_aux *aux, char 
id[6]);
 void drm_dp_downstream_debug(struct seq_file *m, const u8 
dpcd[DP_RECEIVER_CAP_SIZE],
 const u8 port_cap[4], struct drm_dp_aux *aux);
 
+void drm_dp_remote_aux_init(struct drm_dp_aux *aux);
 void drm_dp_aux_init(struct drm_dp_aux *aux);
 int drm_dp_aux_register(struct drm_dp_aux *aux);
 void drm_dp_aux_unregister(struct drm_dp_aux *aux);
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH 1/2] drm: add dp helper to initialize remote aux channel.

2019-12-05 Thread David (Dingchen) Zhang
[why]
We need to minimally initialize the remote aux channel, e.g. the
crc work struct of remote aux to dump the sink's DPRX CRCs in MST
setup.

[how]
Add helper that only initializes the crc work struct of the remote
aux, hooke crc work queue to 'drm_dp_aux_crc_work'. Then call this
helper in DP MST port initialization.


Cc: Leo Li 
Cc: Harry Wentland 
Signed-off-by: David (Dingchen) Zhang 
---
 drivers/gpu/drm/drm_dp_helper.c   | 13 +
 drivers/gpu/drm/drm_dp_mst_topology.c |  3 +++
 include/drm/drm_dp_helper.h   |  1 +
 3 files changed, 17 insertions(+)

diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index fc39323e7d52..37312593dd0a 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -1091,6 +1091,19 @@ static void drm_dp_aux_crc_work(struct work_struct *work)
}
 }
 
+/**
+ * drm_dp_remote_aux_init() - minimally initialise a remote aux channel
+ * @aux: DisplayPort AUX channel
+ *
+ * Used for remote aux channel in general. Merely initialize the crc work
+ * struct.
+ */
+void drm_dp_remote_aux_init(struct drm_dp_aux *aux)
+{
+   INIT_WORK(>crc_work, drm_dp_aux_crc_work);
+}
+EXPORT_SYMBOL(drm_dp_remote_aux_init);
+
 /**
  * drm_dp_aux_init() - minimally initialise an aux channel
  * @aux: DisplayPort AUX channel
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c 
b/drivers/gpu/drm/drm_dp_mst_topology.c
index d5df02315e14..4308316fe211 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -1642,6 +1642,9 @@ static void drm_dp_add_port(struct drm_dp_mst_branch 
*mstb,
port->aux.dev = dev->dev;
port->aux.is_remote = true;
 
+   /* initialize the MST downstream port's AUX crc work queue */
+   drm_dp_remote_aux_init(>aux);
+
/*
 * Make sure the memory allocation for our parent branch stays
 * around until our own memory allocation is released
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index 61ef351c5fca..da0a69f10e38 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -1403,6 +1403,7 @@ int drm_dp_downstream_id(struct drm_dp_aux *aux, char 
id[6]);
 void drm_dp_downstream_debug(struct seq_file *m, const u8 
dpcd[DP_RECEIVER_CAP_SIZE],
 const u8 port_cap[4], struct drm_dp_aux *aux);
 
+void drm_dp_remote_aux_init(struct drm_dp_aux *aux);
 void drm_dp_aux_init(struct drm_dp_aux *aux);
 int drm_dp_aux_register(struct drm_dp_aux *aux);
 void drm_dp_aux_unregister(struct drm_dp_aux *aux);
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v3] drm: Set crc->opened to false before setting crc source to NULL.

2019-07-26 Thread David (Dingchen) Zhang
From: Dingchen Zhang 

to terminate the while-loop in drm_dp_aux_crc_work when
drm_dp_start/stop_crc are called in the hook to set crc source.

v3: set crc->opened to false without checking (Nick)
v2: Move spin_lock around entire crc->opened use (Daniel)

Cc: Daniel Vetter 
Cc: Harry Wentland 
Cc: Nick Kazlauskas 
Signed-off-by: Dingchen Zhang 
---
 drivers/gpu/drm/drm_debugfs_crc.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/gpu/drm/drm_debugfs_crc.c 
b/drivers/gpu/drm/drm_debugfs_crc.c
index dac267e840af..d2d2389d8892 100644
--- a/drivers/gpu/drm/drm_debugfs_crc.c
+++ b/drivers/gpu/drm/drm_debugfs_crc.c
@@ -249,6 +249,11 @@ static int crtc_crc_release(struct inode *inode, struct 
file *filep)
struct drm_crtc *crtc = filep->f_inode->i_private;
struct drm_crtc_crc *crc = >crc;
 
+   /* terminate the infinite while loop if 'drm_dp_aux_crc_work' running */
+   spin_lock_irq(>lock);
+   crc->opened = false;
+   spin_unlock_irq(>lock);
+
crtc->funcs->set_crc_source(crtc, NULL);
 
spin_lock_irq(>lock);
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH v2] drm: Set crc->opened to false before setting crc source to NULL.

2019-07-26 Thread David (Dingchen) Zhang
From: Dingchen Zhang 

to terminate the while-loop in drm_dp_aux_crc_work when
drm_dp_start/stop_crc are called in the hook to set crc source.

v2: Move spin_lock around entire crc->opened use (Daniel)

Cc: Daniel Vetter 
Cc: Harry Wentland 
Cc: Nick Kazlauskas 
Signed-off-by: Dingchen Zhang 
---
 drivers/gpu/drm/drm_debugfs_crc.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/gpu/drm/drm_debugfs_crc.c 
b/drivers/gpu/drm/drm_debugfs_crc.c
index dac267e840af..f87148203599 100644
--- a/drivers/gpu/drm/drm_debugfs_crc.c
+++ b/drivers/gpu/drm/drm_debugfs_crc.c
@@ -249,6 +249,12 @@ static int crtc_crc_release(struct inode *inode, struct 
file *filep)
struct drm_crtc *crtc = filep->f_inode->i_private;
struct drm_crtc_crc *crc = >crc;
 
+   /* terminate the infinite while loop if 'drm_dp_aux_crc_work' running */
+   spin_lock_irq(>lock);
+   if (crc->opened)
+   crc->opened = false;
+   spin_unlock_irq(>lock);
+
crtc->funcs->set_crc_source(crtc, NULL);
 
spin_lock_irq(>lock);
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH] drm: remove the newline for CRC source name.

2019-06-10 Thread Dingchen Zhang
userspace may transfer a newline, and this terminating newline
is replaced by a '\0' to avoid followup issues.

'len-1' is the index to replace the newline of CRC source name.

v3: typo fix (Sam)

v2: update patch subject, body and format. (Sam)

Cc: Leo Li 
Cc: Harry Wentland 
Cc: Sam Ravnborg 
Signed-off-by: Dingchen Zhang 
---
 drivers/gpu/drm/drm_debugfs_crc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_debugfs_crc.c 
b/drivers/gpu/drm/drm_debugfs_crc.c
index 585169f0dcc5..dac267e840af 100644
--- a/drivers/gpu/drm/drm_debugfs_crc.c
+++ b/drivers/gpu/drm/drm_debugfs_crc.c
@@ -131,8 +131,8 @@ static ssize_t crc_control_write(struct file *file, const 
char __user *ubuf,
if (IS_ERR(source))
return PTR_ERR(source);
 
-   if (source[len] == '\n')
-   source[len] = '\0';
+   if (source[len - 1] == '\n')
+   source[len - 1] = '\0';
 
ret = crtc->funcs->verify_crc_source(crtc, source, _cnt);
if (ret)
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH] drm: remove the newline for CRC source name.

2019-06-07 Thread Dingchen Zhang
userspace may transfer a newline, and this terminating newline
is replaced by a '\0' to avoid followup issues.

'n-1' is the index to replace the newline of CRC source name.

v2: update patch subject, body and format. (Sam)

Cc: Leo Li 
Cc: Harry Wentland 
Cc: Sam Ravnborg 
Signed-off-by: Dingchen Zhang 
---
 drivers/gpu/drm/drm_debugfs_crc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_debugfs_crc.c 
b/drivers/gpu/drm/drm_debugfs_crc.c
index 585169f0dcc5..dac267e840af 100644
--- a/drivers/gpu/drm/drm_debugfs_crc.c
+++ b/drivers/gpu/drm/drm_debugfs_crc.c
@@ -131,8 +131,8 @@ static ssize_t crc_control_write(struct file *file, const 
char __user *ubuf,
if (IS_ERR(source))
return PTR_ERR(source);
 
-   if (source[len] == '\n')
-   source[len] = '\0';
+   if (source[len - 1] == '\n')
+   source[len - 1] = '\0';
 
ret = crtc->funcs->verify_crc_source(crtc, source, _cnt);
if (ret)
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH] drm: actually remove the newline for CRC source name.

2019-06-05 Thread Dingchen Zhang
'n-1' is the index to replace the newline character of CRC source name.

Cc: Leo Li 
Cc: Harry Wentland
Signed-off-by: Dingchen Zhang 
---
 drivers/gpu/drm/drm_debugfs_crc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_debugfs_crc.c 
b/drivers/gpu/drm/drm_debugfs_crc.c
index 585169f0dcc5..e20adef9d623 100644
--- a/drivers/gpu/drm/drm_debugfs_crc.c
+++ b/drivers/gpu/drm/drm_debugfs_crc.c
@@ -131,8 +131,8 @@ static ssize_t crc_control_write(struct file *file, const 
char __user *ubuf,
if (IS_ERR(source))
return PTR_ERR(source);
 
-   if (source[len] == '\n')
-   source[len] = '\0';
+   if (source[len-1] == '\n')
+   source[len-1] = '\0';
 
ret = crtc->funcs->verify_crc_source(crtc, source, _cnt);
if (ret)
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH 2/2] drm: Set crc->opened = false before setting crc source to NULL.

2019-06-05 Thread Dingchen Zhang
to terminate the while-loop in drm_dp_aux_crc_work when drm_dp_start/stop_crc
are called in the hook to set crc source.

Cc:Leo Li , Harry , Nick 

Signed-off-by: Dingchen Zhang 
---
 drivers/gpu/drm/drm_debugfs_crc.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/drm_debugfs_crc.c 
b/drivers/gpu/drm/drm_debugfs_crc.c
index e20adef9d623..0e8bcc130383 100644
--- a/drivers/gpu/drm/drm_debugfs_crc.c
+++ b/drivers/gpu/drm/drm_debugfs_crc.c
@@ -249,6 +249,13 @@ static int crtc_crc_release(struct inode *inode, struct 
file *filep)
struct drm_crtc *crtc = filep->f_inode->i_private;
struct drm_crtc_crc *crc = >crc;
 
+   /* terminate the infinite while loop if 'drm_dp_aux_crc_work' running */
+   if (crc->opened) {
+   spin_lock_irq(>lock);
+   crc->opened = false;
+   spin_unlock_irq(>lock);
+   }
+
crtc->funcs->set_crc_source(crtc, NULL);
 
spin_lock_irq(>lock);
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[PATCH 1/2] drm: not to read outside the boundary for CRC source name.

2019-06-05 Thread Dingchen Zhang
'n-1' is the index to access the last character of CRC source name.

Cc:Leo Li , Harry Wentland
Signed-off-by: Dingchen Zhang 
---
 drivers/gpu/drm/drm_debugfs_crc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_debugfs_crc.c 
b/drivers/gpu/drm/drm_debugfs_crc.c
index 585169f0dcc5..e20adef9d623 100644
--- a/drivers/gpu/drm/drm_debugfs_crc.c
+++ b/drivers/gpu/drm/drm_debugfs_crc.c
@@ -131,8 +131,8 @@ static ssize_t crc_control_write(struct file *file, const 
char __user *ubuf,
if (IS_ERR(source))
return PTR_ERR(source);
 
-   if (source[len] == '\n')
-   source[len] = '\0';
+   if (source[len-1] == '\n')
+   source[len-1] = '\0';
 
ret = crtc->funcs->verify_crc_source(crtc, source, _cnt);
if (ret)
-- 
2.17.1

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel