diff mbox series

[v1] drm/bridge: it6505: HDCP CTS fail on repeater items

Message ID 20240919025551.254-1-Hermes.Wu@ite.com.tw (mailing list archive)
State New, archived
Headers show
Series [v1] drm/bridge: it6505: HDCP CTS fail on repeater items | expand

Commit Message

Hermes Wu Sept. 19, 2024, 2:55 a.m. UTC
From: Hermes Wu <Hermes.Wu@ite.com.tw>

Fix HDCP CTS items on UNIGRAF DPR-100.

Signed-off-by: Hermes Wu <Hermes.Wu@ite.com.tw>
---
 drivers/gpu/drm/bridge/ite-it6505.c | 152 ++++++++++++++++++----------
 1 file changed, 101 insertions(+), 51 deletions(-)

Comments

Pin-yen Lin Sept. 20, 2024, 5:27 a.m. UTC | #1
On Thu, Sep 19, 2024 at 10:58 AM <Hermes.Wu@ite.com.tw> wrote:
>
> From: Hermes Wu <Hermes.Wu@ite.com.tw>
>
> Fix HDCP CTS items on UNIGRAF DPR-100.
>
> Signed-off-by: Hermes Wu <Hermes.Wu@ite.com.tw>

Reviewed-by: Pin-yen Lin <treapking@chromium.org>
> ---
>  drivers/gpu/drm/bridge/ite-it6505.c | 152 ++++++++++++++++++----------
>  1 file changed, 101 insertions(+), 51 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c
> index 7a4608844de3..cef02c8c363e 100644
> --- a/drivers/gpu/drm/bridge/ite-it6505.c
> +++ b/drivers/gpu/drm/bridge/ite-it6505.c
> @@ -298,11 +298,11 @@
>  #define MAX_LANE_COUNT 4
>  #define MAX_LINK_RATE HBR
>  #define AUTO_TRAIN_RETRY 3
> -#define MAX_HDCP_DOWN_STREAM_COUNT 10
> +#define MAX_HDCP_DOWN_STREAM_COUNT 127
>  #define MAX_CR_LEVEL 0x03
>  #define MAX_EQ_LEVEL 0x03
>  #define AUX_WAIT_TIMEOUT_MS 15
> -#define AUX_FIFO_MAX_SIZE 32
> +#define AUX_FIFO_MAX_SIZE 16
>  #define PIXEL_CLK_DELAY 1
>  #define PIXEL_CLK_INVERSE 0
>  #define ADJUST_PHASE_THRESHOLD 80000
> @@ -326,6 +326,9 @@ enum aux_cmd_type {
>         CMD_AUX_NATIVE_READ = 0x0,
>         CMD_AUX_NATIVE_WRITE = 0x5,
>         CMD_AUX_I2C_EDID_READ = 0xB,
> +
> +       /*extend read ncommand */
> +       CMD_AUX_GET_KSV_LIST = 0x10,
>  };
>
>  enum aux_cmd_reply {
> @@ -973,7 +976,7 @@ 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) {
> +       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 */
> @@ -1004,7 +1007,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, (cmd & 0x0F));
>
>         ret = it6505_aux_wait(it6505);
>         if (ret < 0)
> @@ -1038,7 +1041,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)
> @@ -1063,7 +1066,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,
> @@ -1084,18 +1087,25 @@ 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;
> +       struct device *dev = &it6505->client->dev;
>
>         mutex_lock(&it6505->aux_lock);
> -       for (i = 0; i < size; i += 4) {
> -               request_size = min((int)size - i, 4);
> +       for (i = 0; i < size; ) {
> +               if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST)
> +                       request_size = min((int)size - i, AUX_FIFO_MAX_SIZE);
> +               else
> +                       request_size = min((int)size - i, 4);
> +
>                 ret_size = it6505_aux_operation(it6505, cmd, address + i,
>                                                 buffer + i, request_size,
>                                                 reply);
> +
>                 if (ret_size < 0) {
>                         ret = ret_size;
>                         goto aux_op_err;
>                 }
>
> +               i += request_size;
>                 ret += ret_size;
>         }
>
> @@ -1186,6 +1196,35 @@ static int it6505_get_edid_block(void *data, u8 *buf, unsigned int block,
>         return 0;
>  }
>
> +static int it6505_get_ksvlist(struct it6505 *it6505, u8 *buf, size_t len)
> +{
> +       int i, request_size, ret;
> +       struct device *dev = &it6505->client->dev;
> +       enum aux_cmd_reply reply;
> +
> +       for (i = 0; i < len; ) {
> +               request_size = min((int)len - i, 15);
> +
> +               ret = it6505_aux_do_transfer(it6505, CMD_AUX_GET_KSV_LIST,
> +                                            DP_AUX_HDCP_KSV_FIFO,
> +                                            buf + i, request_size, &reply);
> +
> +               DRM_DEV_DEBUG_DRIVER(dev, "request_size = %d, ret =%d", request_size, ret);
> +               if (ret < 0)
> +                       return ret;
> +
> +               i += request_size;
> +       }
> +
> +       DRM_DEV_DEBUG_DRIVER(dev, "ksv read cnt = %d down_stream_cnt=%d ", i, i/5);
> +
> +       for (i = 0 ; i < len; i += 5)
> +               DRM_DEV_DEBUG_DRIVER(dev, "ksv[%d] = %02X%02X%02X%02X%02X",
> +                               i/5, buf[i], buf[i + 1], buf[i + 2], buf[i + 3], buf[i + 4]);
> +
> +       return len;
> +}
> +
>  static void it6505_variable_config(struct it6505 *it6505)
>  {
>         it6505->link_rate_bw_code = HBR;
> @@ -1927,6 +1966,7 @@ static void it6505_hdcp_part1_auth(struct it6505 *it6505)
>         it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_START,
>                         HDCP_TRIGGER_START);
>
> +       it6505->is_repeater = (hdcp_bcaps & DP_BCAPS_REPEATER_PRESENT);
>         it6505->hdcp_status = HDCP_AUTH_GOING;
>  }
>
> @@ -1963,7 +2003,7 @@ static int it6505_setup_sha1_input(struct it6505 *it6505, u8 *sha1_input)
>  {
>         struct device *dev = &it6505->client->dev;
>         u8 binfo[2];
> -       int down_stream_count, i, err, msg_count = 0;
> +       int down_stream_count, err, msg_count = 0;
>
>         err = it6505_get_dpcd(it6505, DP_AUX_HDCP_BINFO, binfo,
>                               ARRAY_SIZE(binfo));
> @@ -1989,17 +2029,12 @@ static int it6505_setup_sha1_input(struct it6505 *it6505, u8 *sha1_input)
>                 return 0;
>         }
>
> -       for (i = 0; i < down_stream_count; i++) {
> -               err = it6505_get_dpcd(it6505, DP_AUX_HDCP_KSV_FIFO +
> -                                     (i % 3) * DRM_HDCP_KSV_LEN,
> -                                     sha1_input + msg_count,
> -                                     DRM_HDCP_KSV_LEN);
>
> -               if (err < 0)
> -                       return err;
> +       err =  it6505_get_ksvlist(it6505, sha1_input, down_stream_count * 5);
> +       if (err < 0)
> +               return err;
>
> -               msg_count += 5;
> -       }
> +       msg_count += down_stream_count * 5;
>
>         it6505->hdcp_down_stream_count = down_stream_count;
>         sha1_input[msg_count++] = binfo[0];
> @@ -2027,7 +2062,7 @@ static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505)
>  {
>         struct device *dev = &it6505->client->dev;
>         u8 av[5][4], bv[5][4];
> -       int i, err;
> +       int i, err, retry;
>
>         i = it6505_setup_sha1_input(it6505, it6505->sha1_input);
>         if (i <= 0) {
> @@ -2037,21 +2072,28 @@ static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505)
>
>         it6505_sha1_digest(it6505, it6505->sha1_input, i, (u8 *)av);
>
> -       err = it6505_get_dpcd(it6505, DP_AUX_HDCP_V_PRIME(0), (u8 *)bv,
> -                             sizeof(bv));
> +       for (retry = 0; retry < 3; retry++) {
>
> -       if (err < 0) {
> -               dev_err(dev, "Read V' value Fail");
> -               return false;
> -       }
> +               err = it6505_get_dpcd(it6505, DP_AUX_HDCP_V_PRIME(0), (u8 *)bv,
> +                                       sizeof(bv));
>
> -       for (i = 0; i < 5; i++)
> -               if (bv[i][3] != av[i][0] || bv[i][2] != av[i][1] ||
> -                   bv[i][1] != av[i][2] || bv[i][0] != av[i][3])
> -                       return false;
> +               if (err < 0) {
> +                       dev_err(dev, "Read V' value Fail %d", retry);
> +                       continue;
> +               }
>
> -       DRM_DEV_DEBUG_DRIVER(dev, "V' all match!!");
> -       return true;
> +               for (i = 0; i < 5; i++) {
> +                       if (bv[i][3] != av[i][0] || bv[i][2] != av[i][1] ||
> +                               bv[i][1] != av[i][2] || bv[i][0] != av[i][3])
> +                               break;
> +
> +                       DRM_DEV_DEBUG_DRIVER(dev, "V' all match!! %d, %d", retry, i);
> +                       return true;
> +               }
> +       }
> +
> +       DRM_DEV_DEBUG_DRIVER(dev, "V' NOT match!! %d", retry);
> +       return false;
>  }
>
>  static void it6505_hdcp_wait_ksv_list(struct work_struct *work)
> @@ -2059,7 +2101,7 @@ static void it6505_hdcp_wait_ksv_list(struct work_struct *work)
>         struct it6505 *it6505 = container_of(work, struct it6505,
>                                              hdcp_wait_ksv_list);
>         struct device *dev = &it6505->client->dev;
> -       unsigned int timeout = 5000;
> +       unsigned int timeout = 2000;
>         u8 bstatus = 0;
>         bool ksv_list_check;
>
> @@ -2079,21 +2121,18 @@ static void it6505_hdcp_wait_ksv_list(struct work_struct *work)
>
>         if (timeout == 0) {
>                 DRM_DEV_DEBUG_DRIVER(dev, "timeout and ksv list wait failed");
> -               goto timeout;
> +               goto hdcp_ksvlist_fail;
>         }
>
>         ksv_list_check = it6505_hdcp_part2_ksvlist_check(it6505);
>         DRM_DEV_DEBUG_DRIVER(dev, "ksv list ready, ksv list check %s",
> -                            ksv_list_check ? "pass" : "fail");
> -       if (ksv_list_check) {
> -               it6505_set_bits(it6505, REG_HDCP_TRIGGER,
> -                               HDCP_TRIGGER_KSV_DONE, HDCP_TRIGGER_KSV_DONE);
> +                               ksv_list_check ? "pass" : "fail");
> +
> +       if (ksv_list_check)
>                 return;
> -       }
> -timeout:
> -       it6505_set_bits(it6505, REG_HDCP_TRIGGER,
> -                       HDCP_TRIGGER_KSV_DONE | HDCP_TRIGGER_KSV_FAIL,
> -                       HDCP_TRIGGER_KSV_DONE | HDCP_TRIGGER_KSV_FAIL);
> +
> +hdcp_ksvlist_fail:
> +       it6505_start_hdcp(it6505);
>  }
>
>  static void it6505_hdcp_work(struct work_struct *work)
> @@ -2139,7 +2178,7 @@ static void it6505_hdcp_work(struct work_struct *work)
>         it6505_hdcp_part1_auth(it6505);
>  }
>
> -static void it6505_show_hdcp_info(struct it6505 *it6505)
> +static void it6505_show_hdcp_info(struct it6505 *it6505, bool repeater_info)
>  {
>         struct device *dev = &it6505->client->dev;
>         int i;
> @@ -2150,7 +2189,7 @@ static void it6505_show_hdcp_info(struct it6505 *it6505)
>         DRM_DEV_DEBUG_DRIVER(dev, "bksv = 0x%*ph",
>                              (int)ARRAY_SIZE(it6505->bksvs), it6505->bksvs);
>
> -       if (it6505->is_repeater) {
> +       if ((repeater_info) && (it6505->is_repeater)) {
>                 DRM_DEV_DEBUG_DRIVER(dev, "hdcp_down_stream_count: %d",
>                                      it6505->hdcp_down_stream_count);
>                 DRM_DEV_DEBUG_DRIVER(dev, "sha1_input: 0x%*ph",
> @@ -2251,12 +2290,11 @@ static void it6505_link_training_work(struct work_struct *work)
>         if (ret) {
>                 it6505->auto_train_retry = AUTO_TRAIN_RETRY;
>                 it6505_link_train_ok(it6505);
> -               return;
>         } else {
>                 it6505->auto_train_retry--;
> +               it6505_dump(it6505);
>         }
>
> -       it6505_dump(it6505);
>  }
>
>  static void it6505_plugged_status_to_codec(struct it6505 *it6505)
> @@ -2311,14 +2349,22 @@ static int it6505_process_hpd_irq(struct it6505 *it6505)
>         DRM_DEV_DEBUG_DRIVER(dev, "dp_irq_vector = 0x%02x", dp_irq_vector);
>
>         if (dp_irq_vector & DP_CP_IRQ) {
> -               it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_CPIRQ,
> -                               HDCP_TRIGGER_CPIRQ);
>
>                 bstatus = it6505_dpcd_read(it6505, DP_AUX_HDCP_BSTATUS);
>                 if (bstatus < 0)
>                         return bstatus;
>
>                 DRM_DEV_DEBUG_DRIVER(dev, "Bstatus = 0x%02x", bstatus);
> +
> +               /*1B-02 ignore when bstatus is 0 */
> +               if ((bstatus & DP_BSTATUS_R0_PRIME_READY) &&
> +                               (it6505->hdcp_status == HDCP_AUTH_GOING))
> +                       it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_CPIRQ,
> +                                       HDCP_TRIGGER_CPIRQ);
> +               else if ((bstatus & (DP_BSTATUS_REAUTH_REQ | DP_BSTATUS_LINK_FAILURE)) &&
> +                               (it6505->hdcp_status == HDCP_AUTH_DONE))
> +                       it6505_start_hdcp(it6505);
> +
>         }
>
>         ret = drm_dp_dpcd_read_link_status(&it6505->aux, link_status);
> @@ -2431,7 +2477,7 @@ static void it6505_irq_hdcp_done(struct it6505 *it6505)
>
>         DRM_DEV_DEBUG_DRIVER(dev, "hdcp done interrupt");
>         it6505->hdcp_status = HDCP_AUTH_DONE;
> -       it6505_show_hdcp_info(it6505);
> +       it6505_show_hdcp_info(it6505, false);
>  }
>
>  static void it6505_irq_hdcp_fail(struct it6505 *it6505)
> @@ -2440,7 +2486,7 @@ static void it6505_irq_hdcp_fail(struct it6505 *it6505)
>
>         DRM_DEV_DEBUG_DRIVER(dev, "hdcp fail interrupt");
>         it6505->hdcp_status = HDCP_AUTH_IDLE;
> -       it6505_show_hdcp_info(it6505);
> +       it6505_show_hdcp_info(it6505, true);
>         it6505_start_hdcp(it6505);
>  }
>
> @@ -2455,7 +2501,11 @@ static void it6505_irq_hdcp_ksv_check(struct it6505 *it6505)
>  {
>         struct device *dev = &it6505->client->dev;
>
> -       DRM_DEV_DEBUG_DRIVER(dev, "HDCP event Interrupt");
> +       DRM_DEV_DEBUG_DRIVER(dev, "HDCP repeater R0 event Interrupt");
> +
> +       it6505_set_bits(it6505, REG_HDCP_TRIGGER,
> +                       HDCP_TRIGGER_KSV_DONE, HDCP_TRIGGER_KSV_DONE);
> +
>         schedule_work(&it6505->hdcp_wait_ksv_list);
>  }
>
> --
> 2.34.1
>
Dmitry Baryshkov Sept. 20, 2024, 3:50 p.m. UTC | #2
On Fri, Sep 20, 2024 at 01:27:54PM GMT, Pin-yen Lin wrote:
> On Thu, Sep 19, 2024 at 10:58 AM <Hermes.Wu@ite.com.tw> wrote:
> >
> > From: Hermes Wu <Hermes.Wu@ite.com.tw>
> >
> > Fix HDCP CTS items on UNIGRAF DPR-100.
> >
> > Signed-off-by: Hermes Wu <Hermes.Wu@ite.com.tw>
> 
> Reviewed-by: Pin-yen Lin <treapking@chromium.org>

For the sake of somebody applying the patch because it was R-B'ed

Nacked-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

The commit message doesn't describe what is being done and why, it
doesn't have Fixes tags, etc.

Hermes, I'm not sure what's happening on your side. I have seen several
revisions of this patch with minimal modifications (and being a part of
different series). Some of them were marked as v1 (although you've sent
different patches as v1), other had v2 (but no changelog, etc). Please
adhere to the described process of sending patches.
Hermes Wu Sept. 23, 2024, 5:21 a.m. UTC | #3
Hi 

Sorry for the confusion caused

Last patches did not switch to drm-misc-nest. And I need re-create patches.

The HDCP patches is now on tow threads.(This one and the one include MCCS patches with cover letter)

Should I keep on this thread or restart a new thread?



BR,
Hermes
-----Original Message-----
From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 
Sent: Friday, September 20, 2024 11:50 PM
To: Pin-yen Lin <treapking@chromium.org>
Cc: Hermes Wu (吳佳宏) <Hermes.Wu@ite.com.tw>; Andrzej Hajda <a.hajda@samsung.com>; Neil Armstrong <narmstrong@baylibre.com>; Robert Foss <robert.foss@linaro.org>; Laurent Pinchart <Laurent.pinchart@ideasonboard.com>; Jonas Karlman <jonas@kwiboo.se>; Jernej Skrabec <jernej.skrabec@gmail.com>; David Airlie <airlied@gmail.com>; Daniel Vetter <daniel@ffwll.ch>; open list:DRM DRIVERS <dri-devel@lists.freedesktop.org>; open list <linux-kernel@vger.kernel.org>; Kenneth Hung (洪家倫) <Kenneth.Hung@ite.com.tw>
Subject: Re: [PATCH v1] drm/bridge: it6505: HDCP CTS fail on repeater items

On Fri, Sep 20, 2024 at 01:27:54PM GMT, Pin-yen Lin wrote:
> On Thu, Sep 19, 2024 at 10:58 AM <Hermes.Wu@ite.com.tw> wrote:
> >
> > From: Hermes Wu <Hermes.Wu@ite.com.tw>
> >
> > Fix HDCP CTS items on UNIGRAF DPR-100.
> >
> > Signed-off-by: Hermes Wu <Hermes.Wu@ite.com.tw>
> 
> Reviewed-by: Pin-yen Lin <treapking@chromium.org>

For the sake of somebody applying the patch because it was R-B'ed

Nacked-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

The commit message doesn't describe what is being done and why, it
doesn't have Fixes tags, etc.

Hermes, I'm not sure what's happening on your side. I have seen several
revisions of this patch with minimal modifications (and being a part of
different series). Some of them were marked as v1 (although you've sent
different patches as v1), other had v2 (but no changelog, etc). Please
adhere to the described process of sending patches.
Dmitry Baryshkov Sept. 23, 2024, 6:16 a.m. UTC | #4
Hi,

On Mon, Sep 23, 2024 at 05:21:41AM GMT, Hermes.Wu@ite.com.tw wrote:
> Hi 
> 
> Sorry for the confusion caused

Please don't top post. Answers should come below the original quoted
text, not above it. Otherwise reading the email becomes really hard.

> 
> Last patches did not switch to drm-misc-nest. And I need re-create patches.
> 
> The HDCP patches is now on tow threads.(This one and the one include MCCS patches with cover letter)

Just make sure that when you send the next iteration of the HDCP + MCSS
patches you provide the history of the changes in the changelog (either
in the cover letter or in the individual patches). Also please don't
send several patches using the same vN. I'd point out the 'b4' tool, it
can automate a lot of such topics for you.

> Should I keep on this thread or restart a new thread?

Please always send new revisions as a new thread. Otherwise your patches
can easily get lost.

I suppose that [1] is the latest revision. Please review and implement
the feedback that was provided to all iterations of your pachset, then
send v3 as a separate new thread.

[1] https://lore.kernel.org/dri-devel/vxs3eklfifsnaq5rn6kppegfv3plsviqaq5nvlzo3fgazwj6y7@od4atbvf5ep3/T/#u

> 
> 
> BR,
> Hermes
> -----Original Message-----
> From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 
> Sent: Friday, September 20, 2024 11:50 PM
> To: Pin-yen Lin <treapking@chromium.org>
> Cc: Hermes Wu (吳佳宏) <Hermes.Wu@ite.com.tw>; Andrzej Hajda <a.hajda@samsung.com>; Neil Armstrong <narmstrong@baylibre.com>; Robert Foss <robert.foss@linaro.org>; Laurent Pinchart <Laurent.pinchart@ideasonboard.com>; Jonas Karlman <jonas@kwiboo.se>; Jernej Skrabec <jernej.skrabec@gmail.com>; David Airlie <airlied@gmail.com>; Daniel Vetter <daniel@ffwll.ch>; open list:DRM DRIVERS <dri-devel@lists.freedesktop.org>; open list <linux-kernel@vger.kernel.org>; Kenneth Hung (洪家倫) <Kenneth.Hung@ite.com.tw>
> Subject: Re: [PATCH v1] drm/bridge: it6505: HDCP CTS fail on repeater items
> 
> On Fri, Sep 20, 2024 at 01:27:54PM GMT, Pin-yen Lin wrote:
> > On Thu, Sep 19, 2024 at 10:58 AM <Hermes.Wu@ite.com.tw> wrote:
> > >
> > > From: Hermes Wu <Hermes.Wu@ite.com.tw>
> > >
> > > Fix HDCP CTS items on UNIGRAF DPR-100.
> > >
> > > Signed-off-by: Hermes Wu <Hermes.Wu@ite.com.tw>
> > 
> > Reviewed-by: Pin-yen Lin <treapking@chromium.org>
> 
> For the sake of somebody applying the patch because it was R-B'ed
> 
> Nacked-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> 
> The commit message doesn't describe what is being done and why, it
> doesn't have Fixes tags, etc.
> 
> Hermes, I'm not sure what's happening on your side. I have seen several
> revisions of this patch with minimal modifications (and being a part of
> different series). Some of them were marked as v1 (although you've sent
> different patches as v1), other had v2 (but no changelog, etc). Please
> adhere to the described process of sending patches.
> 
> -- 
> With best wishes
> Dmitry
Hermes Wu Sept. 23, 2024, 7:25 a.m. UTC | #5
Hi

BR,
Hermes


>-----Original Message-----
>From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 
>Sent: Monday, September 23, 2024 2:16 PM
>To: Hermes Wu (吳佳宏) <Hermes.Wu@ite.com.tw>
>Cc: treapking@chromium.org; a.hajda@samsung.com; narmstrong@baylibre.com; robert.foss@linaro.org; Laurent.pinchart@ideasonboard.com; jonas@kwiboo.se; jernej.>skrabec@gmail.com; airlied@gmail.com; daniel@ffwll.ch; dri-devel@lists.freedesktop.org; linux-kernel@vger.kernel.org; Kenneth Hung (洪家倫) <Kenneth.Hung@ite.com.tw>
>Subject: Re: [PATCH v1] drm/bridge: it6505: HDCP CTS fail on repeater items
>
>Hi,
>
>On Mon, Sep 23, 2024 at 05:21:41AM GMT, Hermes.Wu@ite.com.tw wrote:
>> Hi 
>> 
>> Sorry for the confusion caused
>
>Please don't top post. Answers should come below the original quoted
>text, not above it. Otherwise reading the email becomes really hard.
>
>> 
>> Last patches did not switch to drm-misc-nest. And I need re-create patches.
>> 
>> The HDCP patches is now on tow threads.(This one and the one include MCCS patches with cover letter)
>
>Just make sure that when you send the next iteration of the HDCP + MCSS
>patches you provide the history of the changes in the changelog (either
>in the cover letter or in the individual patches). Also please don't
>send several patches using the same vN. I'd point out the 'b4' tool, it
>can automate a lot of such topics for you.
>
I will check using of B4 tools

>> Should I keep on this thread or restart a new thread?
>
>Please always send new revisions as a new thread. Otherwise your patches
>can easily get lost.
>
>I suppose that [1] is the latest revision. Please review and implement
>the feedback that was provided to all iterations of your pachset, then
>send v3 as a separate new thread.
>
>[1] https://lore.kernel.org/dri-devel/vxs3eklfifsnaq5rn6kppegfv3plsviqaq5nvlzo3fgazwj6y7@od4atbvf5ep3/T/#u
>

A suggestion that a aux path need separate to different path, this change will before HDCP
Won't it become more complicate?

it goes like this?

Patch V1 aux
Patch V3 HDCP
Patch V3 MCCS


>> 
>> 
>> BR,
>> Hermes
>> -----Original Message-----
>> From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> 
>> Sent: Friday, September 20, 2024 11:50 PM
>> To: Pin-yen Lin <treapking@chromium.org>
>> Cc: Hermes Wu (吳佳宏) <Hermes.Wu@ite.com.tw>; Andrzej Hajda <a.hajda@samsung.com>; Neil Armstrong <narmstrong@baylibre.com>; Robert Foss <robert.foss@linaro.org>; >Laurent Pinchart <Laurent.pinchart@ideasonboard.com>; Jonas Karlman <jonas@kwiboo.se>; Jernej Skrabec <jernej.skrabec@gmail.com>; David Airlie <airlied@gmail.com>; >Daniel Vetter <daniel@ffwll.ch>; open list:DRM DRIVERS <dri-devel@lists.freedesktop.org>; open list <linux-kernel@vger.kernel.org>; Kenneth Hung (洪家倫) <Kenneth.>Hung@ite.com.tw>
>> Subject: Re: [PATCH v1] drm/bridge: it6505: HDCP CTS fail on repeater items
>> 
>> On Fri, Sep 20, 2024 at 01:27:54PM GMT, Pin-yen Lin wrote:
>> > On Thu, Sep 19, 2024 at 10:58 AM <Hermes.Wu@ite.com.tw> wrote:
>> > >
>> > > From: Hermes Wu <Hermes.Wu@ite.com.tw>
>> > >
>> > > Fix HDCP CTS items on UNIGRAF DPR-100.
>> > >
>> > > Signed-off-by: Hermes Wu <Hermes.Wu@ite.com.tw>
>> > 
>> > Reviewed-by: Pin-yen Lin <treapking@chromium.org>
>> 
>> For the sake of somebody applying the patch because it was R-B'ed
>> 
>> Nacked-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>> 
>> The commit message doesn't describe what is being done and why, it
>> doesn't have Fixes tags, etc.
>> 
>> Hermes, I'm not sure what's happening on your side. I have seen several
>> revisions of this patch with minimal modifications (and being a part of
>> different series). Some of them were marked as v1 (although you've sent
>> different patches as v1), other had v2 (but no changelog, etc). Please
>> adhere to the described process of sending patches.
>> 
>> -- 
>> With best wishes
>> Dmitry
Pin-yen Lin Sept. 23, 2024, 8:27 a.m. UTC | #6
On Mon, Sep 23, 2024 at 3:25 PM <Hermes.Wu@ite.com.tw> wrote:
>
> Hi
>
> BR,
> Hermes
>
>
> >-----Original Message-----
> >From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> >Sent: Monday, September 23, 2024 2:16 PM
> >To: Hermes Wu (吳佳宏) <Hermes.Wu@ite.com.tw>
> >Cc: treapking@chromium.org; a.hajda@samsung.com; narmstrong@baylibre.com; robert.foss@linaro.org; Laurent.pinchart@ideasonboard.com; jonas@kwiboo.se; jernej.>skrabec@gmail.com; airlied@gmail.com; daniel@ffwll.ch; dri-devel@lists.freedesktop.org; linux-kernel@vger.kernel.org; Kenneth Hung (洪家倫) <Kenneth.Hung@ite.com.tw>
> >Subject: Re: [PATCH v1] drm/bridge: it6505: HDCP CTS fail on repeater items
> >
> >Hi,
> >
> >On Mon, Sep 23, 2024 at 05:21:41AM GMT, Hermes.Wu@ite.com.tw wrote:
> >> Hi
> >>
> >> Sorry for the confusion caused
> >
> >Please don't top post. Answers should come below the original quoted
> >text, not above it. Otherwise reading the email becomes really hard.
> >
> >>
> >> Last patches did not switch to drm-misc-nest. And I need re-create patches.
> >>
> >> The HDCP patches is now on tow threads.(This one and the one include MCCS patches with cover letter)
> >
> >Just make sure that when you send the next iteration of the HDCP + MCSS
> >patches you provide the history of the changes in the changelog (either
> >in the cover letter or in the individual patches). Also please don't
> >send several patches using the same vN. I'd point out the 'b4' tool, it
> >can automate a lot of such topics for you.
> >
> I will check using of B4 tools
>
> >> Should I keep on this thread or restart a new thread?
> >
> >Please always send new revisions as a new thread. Otherwise your patches
> >can easily get lost.
> >
> >I suppose that [1] is the latest revision. Please review and implement
> >the feedback that was provided to all iterations of your pachset, then
> >send v3 as a separate new thread.
> >
> >[1] https://lore.kernel.org/dri-devel/vxs3eklfifsnaq5rn6kppegfv3plsviqaq5nvlzo3fgazwj6y7@od4atbvf5ep3/T/#u
> >
>
> A suggestion that a aux path need separate to different path, this change will before HDCP
I assume you mean something needs to be a separate patch...? I don't
really get this sentence.
> Won't it become more complicate?
>
> it goes like this?
>
> Patch V1 aux
> Patch V3 HDCP
> Patch V3 MCCS
The whole series should share the same version number, so you can send
out a v3 series that contains these three patches. Just mark the new
aux patch as "new in v3" in your change log.

Regards,
Pin-yen
>
>
> >>
> >>
> >> BR,
> >> Hermes
> >> -----Original Message-----
> >> From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> >> Sent: Friday, September 20, 2024 11:50 PM
> >> To: Pin-yen Lin <treapking@chromium.org>
> >> Cc: Hermes Wu (吳佳宏) <Hermes.Wu@ite.com.tw>; Andrzej Hajda <a.hajda@samsung.com>; Neil Armstrong <narmstrong@baylibre.com>; Robert Foss <robert.foss@linaro.org>; >Laurent Pinchart <Laurent.pinchart@ideasonboard.com>; Jonas Karlman <jonas@kwiboo.se>; Jernej Skrabec <jernej.skrabec@gmail.com>; David Airlie <airlied@gmail.com>; >Daniel Vetter <daniel@ffwll.ch>; open list:DRM DRIVERS <dri-devel@lists.freedesktop.org>; open list <linux-kernel@vger.kernel.org>; Kenneth Hung (洪家倫) <Kenneth.>Hung@ite.com.tw>
> >> Subject: Re: [PATCH v1] drm/bridge: it6505: HDCP CTS fail on repeater items
> >>
> >> On Fri, Sep 20, 2024 at 01:27:54PM GMT, Pin-yen Lin wrote:
> >> > On Thu, Sep 19, 2024 at 10:58 AM <Hermes.Wu@ite.com.tw> wrote:
> >> > >
> >> > > From: Hermes Wu <Hermes.Wu@ite.com.tw>
> >> > >
> >> > > Fix HDCP CTS items on UNIGRAF DPR-100.
> >> > >
> >> > > Signed-off-by: Hermes Wu <Hermes.Wu@ite.com.tw>
> >> >
> >> > Reviewed-by: Pin-yen Lin <treapking@chromium.org>
> >>
> >> For the sake of somebody applying the patch because it was R-B'ed
> >>
> >> Nacked-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> >>
> >> The commit message doesn't describe what is being done and why, it
> >> doesn't have Fixes tags, etc.
> >>
> >> Hermes, I'm not sure what's happening on your side. I have seen several
> >> revisions of this patch with minimal modifications (and being a part of
> >> different series). Some of them were marked as v1 (although you've sent
> >> different patches as v1), other had v2 (but no changelog, etc). Please
> >> adhere to the described process of sending patches.
> >>
> >> --
> >> With best wishes
> >> Dmitry
>
> --
> With best wishes
> Dmitry
>
> BR,
> Hermes
>
>
> -----Original Message-----
> From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> Sent: Monday, September 23, 2024 2:16 PM
> To: Hermes Wu (吳佳宏) <Hermes.Wu@ite.com.tw>
> Cc: treapking@chromium.org; a.hajda@samsung.com; narmstrong@baylibre.com; robert.foss@linaro.org; Laurent.pinchart@ideasonboard.com; jonas@kwiboo.se; jernej.skrabec@gmail.com; airlied@gmail.com; daniel@ffwll.ch; dri-devel@lists.freedesktop.org; linux-kernel@vger.kernel.org; Kenneth Hung (洪家倫) <Kenneth.Hung@ite.com.tw>
> Subject: Re: [PATCH v1] drm/bridge: it6505: HDCP CTS fail on repeater items
>
> Hi,
>
> On Mon, Sep 23, 2024 at 05:21:41AM GMT, Hermes.Wu@ite.com.tw wrote:
> > Hi
> >
> > Sorry for the confusion caused
>
> Please don't top post. Answers should come below the original quoted text, not above it. Otherwise reading the email becomes really hard.
>
> >
> > Last patches did not switch to drm-misc-nest. And I need re-create patches.
> >
> > The HDCP patches is now on tow threads.(This one and the one include
> > MCCS patches with cover letter)
>
> Just make sure that when you send the next iteration of the HDCP + MCSS patches you provide the history of the changes in the changelog (either in the cover letter or in the individual patches). Also please don't send several patches using the same vN. I'd point out the 'b4' tool, it can automate a lot of such topics for you.
>
> > Should I keep on this thread or restart a new thread?
>
> Please always send new revisions as a new thread. Otherwise your patches can easily get lost.
>
> I suppose that [1] is the latest revision. Please review and implement the feedback that was provided to all iterations of your pachset, then send v3 as a separate new thread.
>
> [1] https://lore.kernel.org/dri-devel/vxs3eklfifsnaq5rn6kppegfv3plsviqaq5nvlzo3fgazwj6y7@od4atbvf5ep3/T/#u
>
> >
> >
> > BR,
> > Hermes
> > -----Original Message-----
> > From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> > Sent: Friday, September 20, 2024 11:50 PM
> > To: Pin-yen Lin <treapking@chromium.org>
> > Cc: Hermes Wu (吳佳宏) <Hermes.Wu@ite.com.tw>; Andrzej Hajda
> > <a.hajda@samsung.com>; Neil Armstrong <narmstrong@baylibre.com>;
> > Robert Foss <robert.foss@linaro.org>; Laurent Pinchart
> > <Laurent.pinchart@ideasonboard.com>; Jonas Karlman <jonas@kwiboo.se>;
> > Jernej Skrabec <jernej.skrabec@gmail.com>; David Airlie
> > <airlied@gmail.com>; Daniel Vetter <daniel@ffwll.ch>; open list:DRM
> > DRIVERS <dri-devel@lists.freedesktop.org>; open list
> > <linux-kernel@vger.kernel.org>; Kenneth Hung (洪家倫)
> > <Kenneth.Hung@ite.com.tw>
> > Subject: Re: [PATCH v1] drm/bridge: it6505: HDCP CTS fail on repeater
> > items
> >
> > On Fri, Sep 20, 2024 at 01:27:54PM GMT, Pin-yen Lin wrote:
> > > On Thu, Sep 19, 2024 at 10:58 AM <Hermes.Wu@ite.com.tw> wrote:
> > > >
> > > > From: Hermes Wu <Hermes.Wu@ite.com.tw>
> > > >
> > > > Fix HDCP CTS items on UNIGRAF DPR-100.
> > > >
> > > > Signed-off-by: Hermes Wu <Hermes.Wu@ite.com.tw>
> > >
> > > Reviewed-by: Pin-yen Lin <treapking@chromium.org>
> >
> > For the sake of somebody applying the patch because it was R-B'ed
> >
> > Nacked-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> >
> > The commit message doesn't describe what is being done and why, it
> > doesn't have Fixes tags, etc.
> >
> > Hermes, I'm not sure what's happening on your side. I have seen
> > several revisions of this patch with minimal modifications (and being
> > a part of different series). Some of them were marked as v1 (although
> > you've sent different patches as v1), other had v2 (but no changelog,
> > etc). Please adhere to the described process of sending patches.
> >
> > --
> > With best wishes
> > Dmitry
>
> --
> With best wishes
> Dmitry
diff mbox series

Patch

diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c
index 7a4608844de3..cef02c8c363e 100644
--- a/drivers/gpu/drm/bridge/ite-it6505.c
+++ b/drivers/gpu/drm/bridge/ite-it6505.c
@@ -298,11 +298,11 @@ 
 #define MAX_LANE_COUNT 4
 #define MAX_LINK_RATE HBR
 #define AUTO_TRAIN_RETRY 3
-#define MAX_HDCP_DOWN_STREAM_COUNT 10
+#define MAX_HDCP_DOWN_STREAM_COUNT 127
 #define MAX_CR_LEVEL 0x03
 #define MAX_EQ_LEVEL 0x03
 #define AUX_WAIT_TIMEOUT_MS 15
-#define AUX_FIFO_MAX_SIZE 32
+#define AUX_FIFO_MAX_SIZE 16
 #define PIXEL_CLK_DELAY 1
 #define PIXEL_CLK_INVERSE 0
 #define ADJUST_PHASE_THRESHOLD 80000
@@ -326,6 +326,9 @@  enum aux_cmd_type {
 	CMD_AUX_NATIVE_READ = 0x0,
 	CMD_AUX_NATIVE_WRITE = 0x5,
 	CMD_AUX_I2C_EDID_READ = 0xB,
+
+	/*extend read ncommand */
+	CMD_AUX_GET_KSV_LIST = 0x10,
 };
 
 enum aux_cmd_reply {
@@ -973,7 +976,7 @@  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) {
+	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 */
@@ -1004,7 +1007,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, (cmd & 0x0F));
 
 	ret = it6505_aux_wait(it6505);
 	if (ret < 0)
@@ -1038,7 +1041,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)
@@ -1063,7 +1066,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,
@@ -1084,18 +1087,25 @@  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;
+	struct device *dev = &it6505->client->dev;
 
 	mutex_lock(&it6505->aux_lock);
-	for (i = 0; i < size; i += 4) {
-		request_size = min((int)size - i, 4);
+	for (i = 0; i < size; ) {
+		if (cmd == CMD_AUX_I2C_EDID_READ || cmd == CMD_AUX_GET_KSV_LIST)
+			request_size = min((int)size - i, AUX_FIFO_MAX_SIZE);
+		else
+			request_size = min((int)size - i, 4);
+
 		ret_size = it6505_aux_operation(it6505, cmd, address + i,
 						buffer + i, request_size,
 						reply);
+
 		if (ret_size < 0) {
 			ret = ret_size;
 			goto aux_op_err;
 		}
 
+		i += request_size;
 		ret += ret_size;
 	}
 
@@ -1186,6 +1196,35 @@  static int it6505_get_edid_block(void *data, u8 *buf, unsigned int block,
 	return 0;
 }
 
+static int it6505_get_ksvlist(struct it6505 *it6505, u8 *buf, size_t len)
+{
+	int i, request_size, ret;
+	struct device *dev = &it6505->client->dev;
+	enum aux_cmd_reply reply;
+
+	for (i = 0; i < len; ) {
+		request_size = min((int)len - i, 15);
+
+		ret = it6505_aux_do_transfer(it6505, CMD_AUX_GET_KSV_LIST,
+					     DP_AUX_HDCP_KSV_FIFO,
+					     buf + i, request_size, &reply);
+
+		DRM_DEV_DEBUG_DRIVER(dev, "request_size = %d, ret =%d", request_size, ret);
+		if (ret < 0)
+			return ret;
+
+		i += request_size;
+	}
+
+	DRM_DEV_DEBUG_DRIVER(dev, "ksv read cnt = %d down_stream_cnt=%d ", i, i/5);
+
+	for (i = 0 ; i < len; i += 5)
+		DRM_DEV_DEBUG_DRIVER(dev, "ksv[%d] = %02X%02X%02X%02X%02X",
+				i/5, buf[i], buf[i + 1], buf[i + 2], buf[i + 3], buf[i + 4]);
+
+	return len;
+}
+
 static void it6505_variable_config(struct it6505 *it6505)
 {
 	it6505->link_rate_bw_code = HBR;
@@ -1927,6 +1966,7 @@  static void it6505_hdcp_part1_auth(struct it6505 *it6505)
 	it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_START,
 			HDCP_TRIGGER_START);
 
+	it6505->is_repeater = (hdcp_bcaps & DP_BCAPS_REPEATER_PRESENT);
 	it6505->hdcp_status = HDCP_AUTH_GOING;
 }
 
@@ -1963,7 +2003,7 @@  static int it6505_setup_sha1_input(struct it6505 *it6505, u8 *sha1_input)
 {
 	struct device *dev = &it6505->client->dev;
 	u8 binfo[2];
-	int down_stream_count, i, err, msg_count = 0;
+	int down_stream_count, err, msg_count = 0;
 
 	err = it6505_get_dpcd(it6505, DP_AUX_HDCP_BINFO, binfo,
 			      ARRAY_SIZE(binfo));
@@ -1989,17 +2029,12 @@  static int it6505_setup_sha1_input(struct it6505 *it6505, u8 *sha1_input)
 		return 0;
 	}
 
-	for (i = 0; i < down_stream_count; i++) {
-		err = it6505_get_dpcd(it6505, DP_AUX_HDCP_KSV_FIFO +
-				      (i % 3) * DRM_HDCP_KSV_LEN,
-				      sha1_input + msg_count,
-				      DRM_HDCP_KSV_LEN);
 
-		if (err < 0)
-			return err;
+	err =  it6505_get_ksvlist(it6505, sha1_input, down_stream_count * 5);
+	if (err < 0)
+		return err;
 
-		msg_count += 5;
-	}
+	msg_count += down_stream_count * 5;
 
 	it6505->hdcp_down_stream_count = down_stream_count;
 	sha1_input[msg_count++] = binfo[0];
@@ -2027,7 +2062,7 @@  static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505)
 {
 	struct device *dev = &it6505->client->dev;
 	u8 av[5][4], bv[5][4];
-	int i, err;
+	int i, err, retry;
 
 	i = it6505_setup_sha1_input(it6505, it6505->sha1_input);
 	if (i <= 0) {
@@ -2037,21 +2072,28 @@  static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505)
 
 	it6505_sha1_digest(it6505, it6505->sha1_input, i, (u8 *)av);
 
-	err = it6505_get_dpcd(it6505, DP_AUX_HDCP_V_PRIME(0), (u8 *)bv,
-			      sizeof(bv));
+	for (retry = 0; retry < 3; retry++) {
 
-	if (err < 0) {
-		dev_err(dev, "Read V' value Fail");
-		return false;
-	}
+		err = it6505_get_dpcd(it6505, DP_AUX_HDCP_V_PRIME(0), (u8 *)bv,
+					sizeof(bv));
 
-	for (i = 0; i < 5; i++)
-		if (bv[i][3] != av[i][0] || bv[i][2] != av[i][1] ||
-		    bv[i][1] != av[i][2] || bv[i][0] != av[i][3])
-			return false;
+		if (err < 0) {
+			dev_err(dev, "Read V' value Fail %d", retry);
+			continue;
+		}
 
-	DRM_DEV_DEBUG_DRIVER(dev, "V' all match!!");
-	return true;
+		for (i = 0; i < 5; i++) {
+			if (bv[i][3] != av[i][0] || bv[i][2] != av[i][1] ||
+				bv[i][1] != av[i][2] || bv[i][0] != av[i][3])
+				break;
+
+			DRM_DEV_DEBUG_DRIVER(dev, "V' all match!! %d, %d", retry, i);
+			return true;
+		}
+	}
+
+	DRM_DEV_DEBUG_DRIVER(dev, "V' NOT match!! %d", retry);
+	return false;
 }
 
 static void it6505_hdcp_wait_ksv_list(struct work_struct *work)
@@ -2059,7 +2101,7 @@  static void it6505_hdcp_wait_ksv_list(struct work_struct *work)
 	struct it6505 *it6505 = container_of(work, struct it6505,
 					     hdcp_wait_ksv_list);
 	struct device *dev = &it6505->client->dev;
-	unsigned int timeout = 5000;
+	unsigned int timeout = 2000;
 	u8 bstatus = 0;
 	bool ksv_list_check;
 
@@ -2079,21 +2121,18 @@  static void it6505_hdcp_wait_ksv_list(struct work_struct *work)
 
 	if (timeout == 0) {
 		DRM_DEV_DEBUG_DRIVER(dev, "timeout and ksv list wait failed");
-		goto timeout;
+		goto hdcp_ksvlist_fail;
 	}
 
 	ksv_list_check = it6505_hdcp_part2_ksvlist_check(it6505);
 	DRM_DEV_DEBUG_DRIVER(dev, "ksv list ready, ksv list check %s",
-			     ksv_list_check ? "pass" : "fail");
-	if (ksv_list_check) {
-		it6505_set_bits(it6505, REG_HDCP_TRIGGER,
-				HDCP_TRIGGER_KSV_DONE, HDCP_TRIGGER_KSV_DONE);
+				ksv_list_check ? "pass" : "fail");
+
+	if (ksv_list_check)
 		return;
-	}
-timeout:
-	it6505_set_bits(it6505, REG_HDCP_TRIGGER,
-			HDCP_TRIGGER_KSV_DONE | HDCP_TRIGGER_KSV_FAIL,
-			HDCP_TRIGGER_KSV_DONE | HDCP_TRIGGER_KSV_FAIL);
+
+hdcp_ksvlist_fail:
+	it6505_start_hdcp(it6505);
 }
 
 static void it6505_hdcp_work(struct work_struct *work)
@@ -2139,7 +2178,7 @@  static void it6505_hdcp_work(struct work_struct *work)
 	it6505_hdcp_part1_auth(it6505);
 }
 
-static void it6505_show_hdcp_info(struct it6505 *it6505)
+static void it6505_show_hdcp_info(struct it6505 *it6505, bool repeater_info)
 {
 	struct device *dev = &it6505->client->dev;
 	int i;
@@ -2150,7 +2189,7 @@  static void it6505_show_hdcp_info(struct it6505 *it6505)
 	DRM_DEV_DEBUG_DRIVER(dev, "bksv = 0x%*ph",
 			     (int)ARRAY_SIZE(it6505->bksvs), it6505->bksvs);
 
-	if (it6505->is_repeater) {
+	if ((repeater_info) && (it6505->is_repeater)) {
 		DRM_DEV_DEBUG_DRIVER(dev, "hdcp_down_stream_count: %d",
 				     it6505->hdcp_down_stream_count);
 		DRM_DEV_DEBUG_DRIVER(dev, "sha1_input: 0x%*ph",
@@ -2251,12 +2290,11 @@  static void it6505_link_training_work(struct work_struct *work)
 	if (ret) {
 		it6505->auto_train_retry = AUTO_TRAIN_RETRY;
 		it6505_link_train_ok(it6505);
-		return;
 	} else {
 		it6505->auto_train_retry--;
+		it6505_dump(it6505);
 	}
 
-	it6505_dump(it6505);
 }
 
 static void it6505_plugged_status_to_codec(struct it6505 *it6505)
@@ -2311,14 +2349,22 @@  static int it6505_process_hpd_irq(struct it6505 *it6505)
 	DRM_DEV_DEBUG_DRIVER(dev, "dp_irq_vector = 0x%02x", dp_irq_vector);
 
 	if (dp_irq_vector & DP_CP_IRQ) {
-		it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_CPIRQ,
-				HDCP_TRIGGER_CPIRQ);
 
 		bstatus = it6505_dpcd_read(it6505, DP_AUX_HDCP_BSTATUS);
 		if (bstatus < 0)
 			return bstatus;
 
 		DRM_DEV_DEBUG_DRIVER(dev, "Bstatus = 0x%02x", bstatus);
+
+		/*1B-02 ignore when bstatus is 0 */
+		if ((bstatus & DP_BSTATUS_R0_PRIME_READY) &&
+				(it6505->hdcp_status == HDCP_AUTH_GOING))
+			it6505_set_bits(it6505, REG_HDCP_TRIGGER, HDCP_TRIGGER_CPIRQ,
+					HDCP_TRIGGER_CPIRQ);
+		else if ((bstatus & (DP_BSTATUS_REAUTH_REQ | DP_BSTATUS_LINK_FAILURE)) &&
+				(it6505->hdcp_status == HDCP_AUTH_DONE))
+			it6505_start_hdcp(it6505);
+
 	}
 
 	ret = drm_dp_dpcd_read_link_status(&it6505->aux, link_status);
@@ -2431,7 +2477,7 @@  static void it6505_irq_hdcp_done(struct it6505 *it6505)
 
 	DRM_DEV_DEBUG_DRIVER(dev, "hdcp done interrupt");
 	it6505->hdcp_status = HDCP_AUTH_DONE;
-	it6505_show_hdcp_info(it6505);
+	it6505_show_hdcp_info(it6505, false);
 }
 
 static void it6505_irq_hdcp_fail(struct it6505 *it6505)
@@ -2440,7 +2486,7 @@  static void it6505_irq_hdcp_fail(struct it6505 *it6505)
 
 	DRM_DEV_DEBUG_DRIVER(dev, "hdcp fail interrupt");
 	it6505->hdcp_status = HDCP_AUTH_IDLE;
-	it6505_show_hdcp_info(it6505);
+	it6505_show_hdcp_info(it6505, true);
 	it6505_start_hdcp(it6505);
 }
 
@@ -2455,7 +2501,11 @@  static void it6505_irq_hdcp_ksv_check(struct it6505 *it6505)
 {
 	struct device *dev = &it6505->client->dev;
 
-	DRM_DEV_DEBUG_DRIVER(dev, "HDCP event Interrupt");
+	DRM_DEV_DEBUG_DRIVER(dev, "HDCP repeater R0 event Interrupt");
+
+	it6505_set_bits(it6505, REG_HDCP_TRIGGER,
+			HDCP_TRIGGER_KSV_DONE, HDCP_TRIGGER_KSV_DONE);
+
 	schedule_work(&it6505->hdcp_wait_ksv_list);
 }