From: Hermes Wu <Hermes.wu@ite.com.tw>
HDCP KSV list readback can choose to use AUX FIFO or general data register.
For some DisplayPort devices, the KSV list must be read in 5 byte boundaries.
The original AUX read command does not support these devices.
The AUX command operation control register "REG_AUX_CMD_REQ" uses b[3:0] as AUX operacion control, and b[7:4] are status bits and read only.
To change KSV read operation uses "CMD_AUX_NATIVE_READ" from using the data registers to using AUX FIFO.
The extended command "CMD_AUX_GET_KSV_LIST" is added as "CMD_AUX_NATIVE_READ" with the 0x10 flag which selects AUX FIFO mode.
Signed-off-by: Hermes Wu <Hermes.wu@ite.com.tw>
---
drivers/gpu/drm/bridge/ite-it6505.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c
index 864fab7e388f..9a022c095af4 100644
--- a/drivers/gpu/drm/bridge/ite-it6505.c
+++ b/drivers/gpu/drm/bridge/ite-it6505.c
@@ -126,6 +126,7 @@
#define REG_AUX_OUT_DATA0 0x27
#define REG_AUX_CMD_REQ 0x2B
+#define M_AUX_REQ_CMD 0x0F
#define AUX_BUSY BIT(5)
#define REG_AUX_DATA_0_7 0x2C
@@ -324,6 +325,9 @@ enum aux_cmd_type {
CMD_AUX_NATIVE_READ = 0x0,
CMD_AUX_NATIVE_WRITE = 0x5,
CMD_AUX_I2C_EDID_READ = 0xB,
+
+ /* KSV read with AUX FIFO extend from CMD_AUX_NATIVE_READ*/
+ CMD_AUX_GET_KSV_LIST = 0x10,
};
enum aux_cmd_reply {
@@ -965,7 +969,8 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505,
it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, AUX_USER_MODE);
aux_op_start:
- if (cmd == CMD_AUX_I2C_EDID_READ) {
+ /* HW AUX FIFO supports only EDID and DCPD KSV FIFO area */
+ if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) {
/* AUX EDID FIFO has max length of AUX_FIFO_MAX_SIZE bytes. */
size = min_t(size_t, size, AUX_FIFO_MAX_SIZE);
/* Enable AUX FIFO read back and clear FIFO */
@@ -996,7 +1001,7 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505,
size);
/* Aux Fire */
- it6505_write(it6505, REG_AUX_CMD_REQ, cmd);
+ it6505_write(it6505, REG_AUX_CMD_REQ, FIELD_GET(M_AUX_REQ_CMD, cmd));
ret = it6505_aux_wait(it6505);
if (ret < 0)
@@ -1030,7 +1035,7 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505,
goto aux_op_start;
}
- if (cmd == CMD_AUX_I2C_EDID_READ) {
+ if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) {
for (i = 0; i < size; i++) {
ret = it6505_read(it6505, REG_AUX_DATA_FIFO);
if (ret < 0)
@@ -1055,7 +1060,7 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505,
ret = i;
aux_op_err:
- if (cmd == CMD_AUX_I2C_EDID_READ) {
+ if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) {
/* clear AUX FIFO */
it6505_set_bits(it6505, REG_AUX_CTRL,
AUX_EN_FIFO_READ | CLR_EDID_FIFO,
@@ -1076,7 +1081,8 @@ static ssize_t it6505_aux_do_transfer(struct it6505 *it6505,
size_t size, enum aux_cmd_reply *reply)
{
int i, ret_size, ret = 0, request_size;
- int fifo_max_size = (cmd == CMD_AUX_I2C_EDID_READ) ? AUX_FIFO_MAX_SIZE : 4;
+ int fifo_max_size = (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) ?
+ AUX_FIFO_MAX_SIZE : 4;
mutex_lock(&it6505->aux_lock);
i = 0;
--
2.34.1
On Tue, Oct 01, 2024 at 02:43:02PM +0800, Hermes Wu wrote: > From: Hermes Wu <Hermes.wu@ite.com.tw> > > HDCP KSV list readback can choose to use AUX FIFO or general data register. > For some DisplayPort devices, the KSV list must be read in 5 byte boundaries. > The original AUX read command does not support these devices. > > The AUX command operation control register "REG_AUX_CMD_REQ" uses b[3:0] as AUX operacion control, and b[7:4] are status bits and read only. > To change KSV read operation uses "CMD_AUX_NATIVE_READ" from using the data registers to using AUX FIFO. > The extended command "CMD_AUX_GET_KSV_LIST" is added as "CMD_AUX_NATIVE_READ" with the 0x10 flag which selects AUX FIFO mode. Please keep the commit message wrapped at 72-75 chars. Other than that: Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > > Signed-off-by: Hermes Wu <Hermes.wu@ite.com.tw> > --- > drivers/gpu/drm/bridge/ite-it6505.c | 16 +++++++++++----- > 1 file changed, 11 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c > index 864fab7e388f..9a022c095af4 100644 > --- a/drivers/gpu/drm/bridge/ite-it6505.c > +++ b/drivers/gpu/drm/bridge/ite-it6505.c > @@ -126,6 +126,7 @@ > #define REG_AUX_OUT_DATA0 0x27 > > #define REG_AUX_CMD_REQ 0x2B > +#define M_AUX_REQ_CMD 0x0F > #define AUX_BUSY BIT(5) > > #define REG_AUX_DATA_0_7 0x2C > @@ -324,6 +325,9 @@ enum aux_cmd_type { > CMD_AUX_NATIVE_READ = 0x0, > CMD_AUX_NATIVE_WRITE = 0x5, > CMD_AUX_I2C_EDID_READ = 0xB, > + > + /* KSV read with AUX FIFO extend from CMD_AUX_NATIVE_READ*/ > + CMD_AUX_GET_KSV_LIST = 0x10, > }; > > enum aux_cmd_reply { > @@ -965,7 +969,8 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505, > it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, AUX_USER_MODE); > > aux_op_start: > - if (cmd == CMD_AUX_I2C_EDID_READ) { > + /* HW AUX FIFO supports only EDID and DCPD KSV FIFO area */ > + if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) { > /* AUX EDID FIFO has max length of AUX_FIFO_MAX_SIZE bytes. */ > size = min_t(size_t, size, AUX_FIFO_MAX_SIZE); > /* Enable AUX FIFO read back and clear FIFO */ > @@ -996,7 +1001,7 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505, > size); > > /* Aux Fire */ > - it6505_write(it6505, REG_AUX_CMD_REQ, cmd); > + it6505_write(it6505, REG_AUX_CMD_REQ, FIELD_GET(M_AUX_REQ_CMD, cmd)); > > ret = it6505_aux_wait(it6505); > if (ret < 0) > @@ -1030,7 +1035,7 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505, > goto aux_op_start; > } > > - if (cmd == CMD_AUX_I2C_EDID_READ) { > + if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) { > for (i = 0; i < size; i++) { > ret = it6505_read(it6505, REG_AUX_DATA_FIFO); > if (ret < 0) > @@ -1055,7 +1060,7 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505, > ret = i; > > aux_op_err: > - if (cmd == CMD_AUX_I2C_EDID_READ) { > + if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) { > /* clear AUX FIFO */ > it6505_set_bits(it6505, REG_AUX_CTRL, > AUX_EN_FIFO_READ | CLR_EDID_FIFO, > @@ -1076,7 +1081,8 @@ static ssize_t it6505_aux_do_transfer(struct it6505 *it6505, > size_t size, enum aux_cmd_reply *reply) > { > int i, ret_size, ret = 0, request_size; > - int fifo_max_size = (cmd == CMD_AUX_I2C_EDID_READ) ? AUX_FIFO_MAX_SIZE : 4; > + int fifo_max_size = (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) ? > + AUX_FIFO_MAX_SIZE : 4; > > mutex_lock(&it6505->aux_lock); > i = 0; > -- > 2.34.1 > -- With best wishes Dmitry
>-----Original Message----- >From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> >Sent: Monday, October 14, 2024 7:53 PM >To: Hermes Wu (吳佳宏) <Hermes.Wu@ite.com.tw> >Cc: Pin-yen Lin <treapking@chromium.org>; Kenneth Hung (洪家倫) <Kenneth.Hung@ite.com.tw>; Pet Weng (翁玉芬) <Pet.Weng@ite.com.tw>; Andrzej Hajda <andrzej.hajda@intel.com>; Neil Armstrong <neil.armstrong@linaro.org>; Robert Foss <rfoss@kernel.org>; Laurent Pinchart <Laurent.pinchart@ideasonboard.com>; Jonas Karlman <jonas@kwiboo.se>; Jernej Skrabec <jernej.skrabec@gmail.com>; Maarten Lankhorst <maarten.lankhorst@linux.intel.com>; Maxime Ripard <mripard@kernel.org>; Thomas Zimmermann <tzimmermann@suse.de>; David Airlie <airlied@gmail.com>; Simona Vetter <simona@ffwll.ch>; open list:DRM DRIVERS <dri-devel@lists.freedesktop.org>; open list <linux-kernel@vger.kernel.org> >Subject: Re: [PATCH v5 03/10] drm/bridge: it6505: add AUX operation for HDCP KSV list read > >On Tue, Oct 01, 2024 at 02:43:02PM +0800, Hermes Wu wrote: >> From: Hermes Wu <Hermes.wu@ite.com.tw> >> >> HDCP KSV list readback can choose to use AUX FIFO or general data register. >> For some DisplayPort devices, the KSV list must be read in 5 byte boundaries. >> The original AUX read command does not support these devices. >> >> The AUX command operation control register "REG_AUX_CMD_REQ" uses b[3:0] as AUX operacion control, and b[7:4] are status bits and read only. >> To change KSV read operation uses "CMD_AUX_NATIVE_READ" from using the data registers to using AUX FIFO. >> The extended command "CMD_AUX_GET_KSV_LIST" is added as "CMD_AUX_NATIVE_READ" with the 0x10 flag which selects AUX FIFO mode. > >Please keep the commit message wrapped at 72-75 chars. > >Other than that: Should I send new v6 patches with commit message wrapped at 72-75 chars? Thanks. > >Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > > >> >> Signed-off-by: Hermes Wu <Hermes.wu@ite.com.tw> >> --- >> drivers/gpu/drm/bridge/ite-it6505.c | 16 +++++++++++----- >> 1 file changed, 11 insertions(+), 5 deletions(-) >> >> diff --git a/drivers/gpu/drm/bridge/ite-it6505.c >> b/drivers/gpu/drm/bridge/ite-it6505.c >> index 864fab7e388f..9a022c095af4 100644 >> --- a/drivers/gpu/drm/bridge/ite-it6505.c >> +++ b/drivers/gpu/drm/bridge/ite-it6505.c >> @@ -126,6 +126,7 @@ >> #define REG_AUX_OUT_DATA0 0x27 >> >> #define REG_AUX_CMD_REQ 0x2B >> +#define M_AUX_REQ_CMD 0x0F >> #define AUX_BUSY BIT(5) >> >> #define REG_AUX_DATA_0_7 0x2C >> @@ -324,6 +325,9 @@ enum aux_cmd_type { >> CMD_AUX_NATIVE_READ = 0x0, >> CMD_AUX_NATIVE_WRITE = 0x5, >> CMD_AUX_I2C_EDID_READ = 0xB, >> + >> + /* KSV read with AUX FIFO extend from CMD_AUX_NATIVE_READ*/ >> + CMD_AUX_GET_KSV_LIST = 0x10, >> }; >> >> enum aux_cmd_reply { >> @@ -965,7 +969,8 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505, >> it6505_set_bits(it6505, REG_AUX_CTRL, AUX_USER_MODE, AUX_USER_MODE); >> >> aux_op_start: >> - if (cmd == CMD_AUX_I2C_EDID_READ) { >> + /* HW AUX FIFO supports only EDID and DCPD KSV FIFO area */ >> + if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) { >> /* AUX EDID FIFO has max length of AUX_FIFO_MAX_SIZE bytes. */ >> size = min_t(size_t, size, AUX_FIFO_MAX_SIZE); >> /* Enable AUX FIFO read back and clear FIFO */ @@ -996,7 +1001,7 @@ >> static ssize_t it6505_aux_operation(struct it6505 *it6505, >> size); >> >> /* Aux Fire */ >> - it6505_write(it6505, REG_AUX_CMD_REQ, cmd); >> + it6505_write(it6505, REG_AUX_CMD_REQ, FIELD_GET(M_AUX_REQ_CMD, >> +cmd)); >> >> ret = it6505_aux_wait(it6505); >> if (ret < 0) >> @@ -1030,7 +1035,7 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505, >> goto aux_op_start; >> } >> >> - if (cmd == CMD_AUX_I2C_EDID_READ) { >> + if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) { >> for (i = 0; i < size; i++) { >> ret = it6505_read(it6505, REG_AUX_DATA_FIFO); >> if (ret < 0) >> @@ -1055,7 +1060,7 @@ static ssize_t it6505_aux_operation(struct it6505 *it6505, >> ret = i; >> >> aux_op_err: >> - if (cmd == CMD_AUX_I2C_EDID_READ) { >> + if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) { >> /* clear AUX FIFO */ >> it6505_set_bits(it6505, REG_AUX_CTRL, >> AUX_EN_FIFO_READ | CLR_EDID_FIFO, @@ -1076,7 +1081,8 @@ static >> ssize_t it6505_aux_do_transfer(struct it6505 *it6505, >> size_t size, enum aux_cmd_reply *reply) { >> int i, ret_size, ret = 0, request_size; >> - int fifo_max_size = (cmd == CMD_AUX_I2C_EDID_READ) ? AUX_FIFO_MAX_SIZE : 4; >> + int fifo_max_size = (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST) ? >> + AUX_FIFO_MAX_SIZE : 4; >> >> mutex_lock(&it6505->aux_lock); >> i = 0; >> -- >> 2.34.1 >> > >-- >With best wishes >Dmitry > > BR, Hermes
© 2016 - 2024 Red Hat, Inc.