Lines Matching +full:x +full:- +full:rc

1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved.
81 int rc; in msm_hdmi_ddc_read() local
99 rc = i2c_transfer(hdmi->i2c, msgs, 2); in msm_hdmi_ddc_read()
101 retry--; in msm_hdmi_ddc_read()
102 if (rc == 2) in msm_hdmi_ddc_read()
103 rc = 0; in msm_hdmi_ddc_read()
107 rc = -EIO; in msm_hdmi_ddc_read()
109 DBG("End DDC read %d", rc); in msm_hdmi_ddc_read()
111 return rc; in msm_hdmi_ddc_read()
119 int rc; in msm_hdmi_ddc_write() local
131 if (data_len > (HDCP_DDC_WRITE_MAX_BYTE_NUM - 1)) { in msm_hdmi_ddc_write()
133 return -ERANGE; in msm_hdmi_ddc_write()
141 rc = i2c_transfer(hdmi->i2c, msgs, 1); in msm_hdmi_ddc_write()
143 retry--; in msm_hdmi_ddc_write()
144 if (rc == 1) in msm_hdmi_ddc_write()
145 rc = 0; in msm_hdmi_ddc_write()
149 rc = -EIO; in msm_hdmi_ddc_write()
151 DBG("End DDC write %d", rc); in msm_hdmi_ddc_write()
153 return rc; in msm_hdmi_ddc_write()
159 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_scm_wr()
166 if (hdcp_ctrl->tz_hdcp) { in msm_hdmi_hdcp_scm_wr()
167 phy_addr = (u32)hdmi->mmio_phy_addr; in msm_hdmi_hdcp_scm_wr()
182 ret = -EINVAL; in msm_hdmi_hdcp_scm_wr()
186 count -= i; in msm_hdmi_hdcp_scm_wr()
198 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_irq()
202 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_irq()
206 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_irq()
215 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_irq()
217 DBG("hdcp irq %x", hdcp_int_status); in msm_hdmi_hdcp_irq()
221 if (HDCP_STATE_AUTHENTICATING == hdcp_ctrl->hdcp_state) { in msm_hdmi_hdcp_irq()
222 set_bit(AUTH_RESULT_RDY_EV, &hdcp_ctrl->auth_event); in msm_hdmi_hdcp_irq()
223 wake_up_all(&hdcp_ctrl->auth_event_queue); in msm_hdmi_hdcp_irq()
229 pr_info("%s: AUTH_FAIL_INT rcvd, LINK0_STATUS=0x%08x\n", in msm_hdmi_hdcp_irq()
231 if (HDCP_STATE_AUTHENTICATED == hdcp_ctrl->hdcp_state) in msm_hdmi_hdcp_irq()
232 queue_work(hdmi->workq, &hdcp_ctrl->hdcp_reauth_work); in msm_hdmi_hdcp_irq()
234 hdcp_ctrl->hdcp_state) { in msm_hdmi_hdcp_irq()
235 set_bit(AUTH_RESULT_RDY_EV, &hdcp_ctrl->auth_event); in msm_hdmi_hdcp_irq()
236 wake_up_all(&hdcp_ctrl->auth_event_queue); in msm_hdmi_hdcp_irq()
243 int rc; in msm_hdmi_hdcp_msleep() local
245 rc = wait_event_timeout(hdcp_ctrl->auth_event_queue, in msm_hdmi_hdcp_msleep()
246 !!test_bit(ev, &hdcp_ctrl->auth_event), in msm_hdmi_hdcp_msleep()
248 if (rc) { in msm_hdmi_hdcp_msleep()
251 clear_bit(ev, &hdcp_ctrl->auth_event); in msm_hdmi_hdcp_msleep()
252 return -ECANCELED; in msm_hdmi_hdcp_msleep()
260 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_read_validate_aksv()
263 hdcp_ctrl->aksv_lsb = hdmi_qfprom_read(hdmi, HDCP_KSV_LSB); in msm_hdmi_hdcp_read_validate_aksv()
264 hdcp_ctrl->aksv_msb = hdmi_qfprom_read(hdmi, HDCP_KSV_MSB); in msm_hdmi_hdcp_read_validate_aksv()
267 if ((hweight32(hdcp_ctrl->aksv_lsb) + hweight32(hdcp_ctrl->aksv_msb)) in msm_hdmi_hdcp_read_validate_aksv()
271 pr_err("%s: QFPROM AKSV chk failed (AKSV=%02x%08x)\n", in msm_hdmi_hdcp_read_validate_aksv()
272 __func__, hdcp_ctrl->aksv_msb, in msm_hdmi_hdcp_read_validate_aksv()
273 hdcp_ctrl->aksv_lsb); in msm_hdmi_hdcp_read_validate_aksv()
274 return -EINVAL; in msm_hdmi_hdcp_read_validate_aksv()
276 DBG("AKSV=%02x%08x", hdcp_ctrl->aksv_msb, hdcp_ctrl->aksv_lsb); in msm_hdmi_hdcp_read_validate_aksv()
283 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_reset_hdcp_ddc_failures()
285 int rc = 0; in msm_reset_hdcp_ddc_failures() local
291 DBG("HDCP_DDC_STATUS=0x%x, FAIL=%d, NACK0=%d", in msm_reset_hdcp_ddc_failures()
319 /* Re-Enable HDCP DDC */ in msm_reset_hdcp_ddc_failures()
324 DBG("Before: HDMI_DDC_SW_STATUS=0x%08x", in msm_reset_hdcp_ddc_failures()
331 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 20, AUTH_ABORT_EV); in msm_reset_hdcp_ddc_failures()
343 if (!rc) in msm_reset_hdcp_ddc_failures()
344 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 20, AUTH_ABORT_EV); in msm_reset_hdcp_ddc_failures()
349 DBG("After: HDMI_DDC_SW_STATUS=0x%08x", in msm_reset_hdcp_ddc_failures()
353 return rc; in msm_reset_hdcp_ddc_failures()
358 int rc; in msm_hdmi_hdcp_hw_ddc_clean() local
363 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_hw_ddc_clean()
382 timeout_count--; in msm_hdmi_hdcp_hw_ddc_clean()
385 return -ETIMEDOUT; in msm_hdmi_hdcp_hw_ddc_clean()
388 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 20, AUTH_ABORT_EV); in msm_hdmi_hdcp_hw_ddc_clean()
389 if (rc) in msm_hdmi_hdcp_hw_ddc_clean()
390 return rc; in msm_hdmi_hdcp_hw_ddc_clean()
400 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_reauth_work()
408 * attempt a re-authentication, HW would clear the AN0_READY and in msm_hdmi_hdcp_reauth_work()
411 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_reauth_work()
418 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_reauth_work()
433 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_reauth_work()
437 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_reauth_work()
442 if (++hdcp_ctrl->auth_retries == AUTH_RETRIES_TIME) { in msm_hdmi_hdcp_reauth_work()
443 hdcp_ctrl->hdcp_state = HDCP_STATE_INACTIVE; in msm_hdmi_hdcp_reauth_work()
444 hdcp_ctrl->auth_retries = 0; in msm_hdmi_hdcp_reauth_work()
451 hdcp_ctrl->hdcp_state = HDCP_STATE_AUTHENTICATING; in msm_hdmi_hdcp_reauth_work()
452 queue_work(hdmi->workq, &hdcp_ctrl->hdcp_auth_work); in msm_hdmi_hdcp_reauth_work()
457 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_auth_prepare()
461 int rc; in msm_hdmi_hdcp_auth_prepare() local
463 if (!hdcp_ctrl->aksv_valid) { in msm_hdmi_hdcp_auth_prepare()
464 rc = msm_hdmi_hdcp_read_validate_aksv(hdcp_ctrl); in msm_hdmi_hdcp_auth_prepare()
465 if (rc) { in msm_hdmi_hdcp_auth_prepare()
467 hdcp_ctrl->hdcp_state = HDCP_STATE_NO_AKSV; in msm_hdmi_hdcp_auth_prepare()
468 return -ENOTSUPP; in msm_hdmi_hdcp_auth_prepare()
470 hdcp_ctrl->aksv_valid = true; in msm_hdmi_hdcp_auth_prepare()
473 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_prepare()
483 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_prepare()
490 hdmi_write(hdmi, REG_HDMI_HDCP_SW_LOWER_AKSV, hdcp_ctrl->aksv_lsb); in msm_hdmi_hdcp_auth_prepare()
491 hdmi_write(hdmi, REG_HDMI_HDCP_SW_UPPER_AKSV, hdcp_ctrl->aksv_msb); in msm_hdmi_hdcp_auth_prepare()
504 DBG("HDCP_DEBUG_CTRL=0x%08x", in msm_hdmi_hdcp_auth_prepare()
525 DBG("After enabling HDCP Link0_Status=0x%08x", link0_status); in msm_hdmi_hdcp_auth_prepare()
532 rc = msm_reset_hdcp_ddc_failures(hdcp_ctrl); in msm_hdmi_hdcp_auth_prepare()
534 return rc; in msm_hdmi_hdcp_auth_prepare()
539 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_auth_fail()
545 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_fail()
549 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_fail()
551 hdcp_ctrl->hdcp_state = HDCP_STATE_AUTH_FAILED; in msm_hdmi_hdcp_auth_fail()
552 queue_work(hdmi->workq, &hdcp_ctrl->hdcp_reauth_work); in msm_hdmi_hdcp_auth_fail()
557 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_auth_done()
565 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_done()
569 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_done()
572 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_done()
576 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_done()
578 hdcp_ctrl->hdcp_state = HDCP_STATE_AUTHENTICATED; in msm_hdmi_hdcp_auth_done()
579 hdcp_ctrl->auth_retries = 0; in msm_hdmi_hdcp_auth_done()
592 int rc; in msm_hdmi_hdcp_wait_key_an_ready() local
593 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_wait_key_an_ready()
609 timeout_count--; in msm_hdmi_hdcp_wait_key_an_ready()
612 return -ETIMEDOUT; in msm_hdmi_hdcp_wait_key_an_ready()
615 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 20, AUTH_ABORT_EV); in msm_hdmi_hdcp_wait_key_an_ready()
616 if (rc) in msm_hdmi_hdcp_wait_key_an_ready()
617 return rc; in msm_hdmi_hdcp_wait_key_an_ready()
628 DBG("An not ready(%d). l0_status=0x%08x", in msm_hdmi_hdcp_wait_key_an_ready()
631 timeout_count--; in msm_hdmi_hdcp_wait_key_an_ready()
634 return -ETIMEDOUT; in msm_hdmi_hdcp_wait_key_an_ready()
637 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 20, AUTH_ABORT_EV); in msm_hdmi_hdcp_wait_key_an_ready()
638 if (rc) in msm_hdmi_hdcp_wait_key_an_ready()
639 return rc; in msm_hdmi_hdcp_wait_key_an_ready()
647 int rc = 0; in msm_hdmi_hdcp_send_aksv_an() local
648 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_send_aksv_an()
661 DBG("Link ASKV=%08x%08x", link0_aksv_0, link0_aksv_1); in msm_hdmi_hdcp_send_aksv_an()
670 rc = msm_hdmi_ddc_write(hdmi, HDCP_PORT_ADDR, 0x18, (u8 *)link0_an, in msm_hdmi_hdcp_send_aksv_an()
672 if (rc) { in msm_hdmi_hdcp_send_aksv_an()
674 return rc; in msm_hdmi_hdcp_send_aksv_an()
676 DBG("Link0-An=%08x%08x", link0_an[0], link0_an[1]); in msm_hdmi_hdcp_send_aksv_an()
679 rc = msm_hdmi_ddc_write(hdmi, HDCP_PORT_ADDR, 0x10, aksv, 5); in msm_hdmi_hdcp_send_aksv_an()
680 if (rc) { in msm_hdmi_hdcp_send_aksv_an()
682 return rc; in msm_hdmi_hdcp_send_aksv_an()
684 DBG("Link0-AKSV=%02x%08x", link0_aksv_1 & 0xFF, link0_aksv_0); in msm_hdmi_hdcp_send_aksv_an()
691 int rc = 0; in msm_hdmi_hdcp_recv_bksv() local
692 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_recv_bksv()
697 rc = msm_hdmi_ddc_read(hdmi, HDCP_PORT_ADDR, 0x00, bksv, 5); in msm_hdmi_hdcp_recv_bksv()
698 if (rc) { in msm_hdmi_hdcp_recv_bksv()
700 return rc; in msm_hdmi_hdcp_recv_bksv()
703 hdcp_ctrl->bksv_lsb = bksv[0] | (bksv[1] << 8) | in msm_hdmi_hdcp_recv_bksv()
705 hdcp_ctrl->bksv_msb = bksv[4]; in msm_hdmi_hdcp_recv_bksv()
706 DBG(":BKSV=%02x%08x", hdcp_ctrl->bksv_msb, hdcp_ctrl->bksv_lsb); in msm_hdmi_hdcp_recv_bksv()
709 if ((hweight32(hdcp_ctrl->bksv_lsb) + hweight32(hdcp_ctrl->bksv_msb)) in msm_hdmi_hdcp_recv_bksv()
712 pr_err(": BKSV chk fail. BKSV=%02x%02x%02x%02x%02x\n", in msm_hdmi_hdcp_recv_bksv()
714 return -EINVAL; in msm_hdmi_hdcp_recv_bksv()
719 data[0] = hdcp_ctrl->bksv_lsb; in msm_hdmi_hdcp_recv_bksv()
721 data[1] = hdcp_ctrl->bksv_msb; in msm_hdmi_hdcp_recv_bksv()
722 rc = msm_hdmi_hdcp_scm_wr(hdcp_ctrl, reg, data, 2); in msm_hdmi_hdcp_recv_bksv()
724 return rc; in msm_hdmi_hdcp_recv_bksv()
729 int rc = 0; in msm_hdmi_hdcp_recv_bcaps() local
730 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_recv_bcaps()
734 rc = msm_hdmi_ddc_read(hdmi, HDCP_PORT_ADDR, 0x40, &bcaps, 1); in msm_hdmi_hdcp_recv_bcaps()
735 if (rc) { in msm_hdmi_hdcp_recv_bcaps()
737 return rc; in msm_hdmi_hdcp_recv_bcaps()
739 DBG("BCAPS=%02x", bcaps); in msm_hdmi_hdcp_recv_bcaps()
742 hdcp_ctrl->ds_type = (bcaps & BIT(6)) ? DS_REPEATER : DS_RECEIVER; in msm_hdmi_hdcp_recv_bcaps()
747 rc = msm_hdmi_hdcp_scm_wr(hdcp_ctrl, &reg, &data, 1); in msm_hdmi_hdcp_recv_bcaps()
749 return rc; in msm_hdmi_hdcp_recv_bcaps()
754 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_auth_part1_key_exchange()
756 int rc; in msm_hdmi_hdcp_auth_part1_key_exchange() local
759 rc = msm_hdmi_hdcp_wait_key_an_ready(hdcp_ctrl); in msm_hdmi_hdcp_auth_part1_key_exchange()
760 if (rc) { in msm_hdmi_hdcp_auth_part1_key_exchange()
762 return rc; in msm_hdmi_hdcp_auth_part1_key_exchange()
766 rc = msm_hdmi_hdcp_recv_bcaps(hdcp_ctrl); in msm_hdmi_hdcp_auth_part1_key_exchange()
767 if (rc) { in msm_hdmi_hdcp_auth_part1_key_exchange()
769 return rc; in msm_hdmi_hdcp_auth_part1_key_exchange()
779 rc = msm_hdmi_hdcp_send_aksv_an(hdcp_ctrl); in msm_hdmi_hdcp_auth_part1_key_exchange()
780 if (rc) { in msm_hdmi_hdcp_auth_part1_key_exchange()
782 return rc; in msm_hdmi_hdcp_auth_part1_key_exchange()
786 rc = msm_hdmi_hdcp_recv_bksv(hdcp_ctrl); in msm_hdmi_hdcp_auth_part1_key_exchange()
787 if (rc) { in msm_hdmi_hdcp_auth_part1_key_exchange()
789 return rc; in msm_hdmi_hdcp_auth_part1_key_exchange()
793 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_part1_key_exchange()
800 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_auth_part1_key_exchange()
808 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_auth_part1_recv_r0()
809 int rc = 0; in msm_hdmi_hdcp_auth_part1_recv_r0() local
813 * HDCP Compliance Test case 1A-01: in msm_hdmi_hdcp_auth_part1_recv_r0()
816 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 125, AUTH_ABORT_EV); in msm_hdmi_hdcp_auth_part1_recv_r0()
817 if (rc) in msm_hdmi_hdcp_auth_part1_recv_r0()
818 return rc; in msm_hdmi_hdcp_auth_part1_recv_r0()
821 rc = msm_hdmi_ddc_read(hdmi, HDCP_PORT_ADDR, 0x08, buf, 2); in msm_hdmi_hdcp_auth_part1_recv_r0()
822 if (rc) { in msm_hdmi_hdcp_auth_part1_recv_r0()
824 return rc; in msm_hdmi_hdcp_auth_part1_recv_r0()
826 DBG("R0'=%02x%02x", buf[1], buf[0]); in msm_hdmi_hdcp_auth_part1_recv_r0()
838 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_auth_part1_verify_r0()
840 int rc; in msm_hdmi_hdcp_auth_part1_verify_r0() local
843 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 10000, AUTH_RESULT_RDY_EV); in msm_hdmi_hdcp_auth_part1_verify_r0()
844 if (!rc) { in msm_hdmi_hdcp_auth_part1_verify_r0()
846 return -ETIMEDOUT; in msm_hdmi_hdcp_auth_part1_verify_r0()
852 return -EINVAL; in msm_hdmi_hdcp_auth_part1_verify_r0()
866 int rc; in msm_hdmi_hdcp_recv_check_bstatus() local
867 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_recv_check_bstatus()
874 rc = msm_hdmi_ddc_read(hdmi, HDCP_PORT_ADDR, 0x41, buf, 2); in msm_hdmi_hdcp_recv_check_bstatus()
875 if (rc) { in msm_hdmi_hdcp_recv_check_bstatus()
894 rc = -EINVAL; in msm_hdmi_hdcp_recv_check_bstatus()
899 * HDCP Compliance 1B-05: in msm_hdmi_hdcp_recv_check_bstatus()
906 rc = -EINVAL; in msm_hdmi_hdcp_recv_check_bstatus()
911 * HDCP Compliance 1B-06: in msm_hdmi_hdcp_recv_check_bstatus()
918 rc = -EINVAL; in msm_hdmi_hdcp_recv_check_bstatus()
923 hdcp_ctrl->dev_count = down_stream_devices; in msm_hdmi_hdcp_recv_check_bstatus()
924 hdcp_ctrl->max_cascade_exceeded = max_cascade_exceeded; in msm_hdmi_hdcp_recv_check_bstatus()
925 hdcp_ctrl->max_dev_exceeded = max_devs_exceeded; in msm_hdmi_hdcp_recv_check_bstatus()
926 hdcp_ctrl->depth = repeater_cascade_depth; in msm_hdmi_hdcp_recv_check_bstatus()
927 return rc; in msm_hdmi_hdcp_recv_check_bstatus()
933 int rc; in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready() local
934 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
947 rc = msm_hdmi_ddc_read(hdmi, HDCP_PORT_ADDR, 0x40, &bcaps, 1); in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
948 if (rc) { in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
950 return rc; in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
956 timeout_count--; in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
959 return -ETIMEDOUT; in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
962 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 20, AUTH_ABORT_EV); in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
963 if (rc) in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
964 return rc; in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
967 rc = msm_hdmi_hdcp_recv_check_bstatus(hdcp_ctrl, &bstatus); in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
968 if (rc) { in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
970 return rc; in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
976 rc = msm_hdmi_hdcp_scm_wr(hdcp_ctrl, &reg, &data, 1); in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
977 if (rc) { in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
979 return rc; in msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready()
993 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_transfer_v_h()
994 int rc = 0; in msm_hdmi_hdcp_transfer_v_h() local
1010 rc = msm_hdmi_ddc_read(hdmi, HDCP_PORT_ADDR, in msm_hdmi_hdcp_transfer_v_h()
1011 rd->off, (u8 *)&data[i], (u16)sizeof(data[i])); in msm_hdmi_hdcp_transfer_v_h()
1012 if (rc) { in msm_hdmi_hdcp_transfer_v_h()
1013 pr_err("%s: Read %s failed\n", __func__, rd->name); in msm_hdmi_hdcp_transfer_v_h()
1017 DBG("%s =%x", rd->name, data[i]); in msm_hdmi_hdcp_transfer_v_h()
1021 rc = msm_hdmi_hdcp_scm_wr(hdcp_ctrl, reg, data, size); in msm_hdmi_hdcp_transfer_v_h()
1024 return rc; in msm_hdmi_hdcp_transfer_v_h()
1029 int rc; in msm_hdmi_hdcp_recv_ksv_fifo() local
1030 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_recv_ksv_fifo()
1033 ksv_bytes = 5 * hdcp_ctrl->dev_count; in msm_hdmi_hdcp_recv_ksv_fifo()
1035 rc = msm_hdmi_ddc_read(hdmi, HDCP_PORT_ADDR, 0x43, in msm_hdmi_hdcp_recv_ksv_fifo()
1036 hdcp_ctrl->ksv_list, ksv_bytes); in msm_hdmi_hdcp_recv_ksv_fifo()
1037 if (rc) in msm_hdmi_hdcp_recv_ksv_fifo()
1040 return rc; in msm_hdmi_hdcp_recv_ksv_fifo()
1046 u32 rc = 0; in msm_hdmi_hdcp_reset_sha_engine() local
1053 rc = msm_hdmi_hdcp_scm_wr(hdcp_ctrl, reg, data, 2); in msm_hdmi_hdcp_reset_sha_engine()
1055 return rc; in msm_hdmi_hdcp_reset_sha_engine()
1061 int rc; in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo() local
1075 rc = msm_hdmi_hdcp_recv_ksv_fifo(hdcp_ctrl); in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1076 if (!rc) in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1079 timeout_count--; in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1082 return -ETIMEDOUT; in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1085 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 25, AUTH_ABORT_EV); in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1086 if (rc) in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1087 return rc; in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1090 rc = msm_hdmi_hdcp_transfer_v_h(hdcp_ctrl); in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1091 if (rc) { in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1093 return rc; in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1097 rc = msm_hdmi_hdcp_reset_sha_engine(hdcp_ctrl); in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1098 if (rc) { in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1100 return rc; in msm_hdmi_hdcp_auth_part2_recv_ksv_fifo()
1117 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_write_ksv_fifo()
1121 u32 rc = 0; in msm_hdmi_hdcp_write_ksv_fifo() local
1123 ksv_bytes = 5 * hdcp_ctrl->dev_count; in msm_hdmi_hdcp_write_ksv_fifo()
1126 if (hdcp_ctrl->ksv_fifo_w_index) { in msm_hdmi_hdcp_write_ksv_fifo()
1128 DBG("HDCP_SHA_STATUS=%08x", reg_val); in msm_hdmi_hdcp_write_ksv_fifo()
1129 if (hdcp_ctrl->ksv_fifo_w_index == ksv_bytes) { in msm_hdmi_hdcp_write_ksv_fifo()
1135 return -EAGAIN; in msm_hdmi_hdcp_write_ksv_fifo()
1140 return -EAGAIN; in msm_hdmi_hdcp_write_ksv_fifo()
1146 ksv_bytes -= hdcp_ctrl->ksv_fifo_w_index; in msm_hdmi_hdcp_write_ksv_fifo()
1152 ksv_fifo = hdcp_ctrl->ksv_list; in msm_hdmi_hdcp_write_ksv_fifo()
1153 ksv_fifo += hdcp_ctrl->ksv_fifo_w_index; in msm_hdmi_hdcp_write_ksv_fifo()
1158 if ((i == (ksv_bytes - 1)) && last_byte) in msm_hdmi_hdcp_write_ksv_fifo()
1163 rc = msm_hdmi_hdcp_scm_wr(hdcp_ctrl, &reg, &data, 1); in msm_hdmi_hdcp_write_ksv_fifo()
1165 if (rc) in msm_hdmi_hdcp_write_ksv_fifo()
1166 return rc; in msm_hdmi_hdcp_write_ksv_fifo()
1169 hdcp_ctrl->ksv_fifo_w_index += ksv_bytes; in msm_hdmi_hdcp_write_ksv_fifo()
1172 *return -EAGAIN to notify caller to wait for COMP_DONE or BLOCK_DONE in msm_hdmi_hdcp_write_ksv_fifo()
1174 return -EAGAIN; in msm_hdmi_hdcp_write_ksv_fifo()
1181 int rc; in msm_hdmi_hdcp_auth_part2_write_ksv_fifo() local
1184 hdcp_ctrl->ksv_fifo_w_index = 0; in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1187 rc = msm_hdmi_hdcp_write_ksv_fifo(hdcp_ctrl); in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1188 if (!rc) in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1191 if (rc != -EAGAIN) in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1192 return rc; in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1194 timeout_count--; in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1197 return -ETIMEDOUT; in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1200 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 20, AUTH_ABORT_EV); in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1201 if (rc) in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1202 return rc; in msm_hdmi_hdcp_auth_part2_write_ksv_fifo()
1210 int rc = 0; in msm_hdmi_hdcp_auth_part2_check_v_match() local
1211 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_auth_part2_check_v_match()
1220 timeout_count--; in msm_hdmi_hdcp_auth_part2_check_v_match()
1223 return -ETIMEDOUT; in msm_hdmi_hdcp_auth_part2_check_v_match()
1226 rc = msm_hdmi_hdcp_msleep(hdcp_ctrl, 20, AUTH_ABORT_EV); in msm_hdmi_hdcp_auth_part2_check_v_match()
1227 if (rc) in msm_hdmi_hdcp_auth_part2_check_v_match()
1228 return rc; in msm_hdmi_hdcp_auth_part2_check_v_match()
1238 int rc; in msm_hdmi_hdcp_auth_work() local
1240 rc = msm_hdmi_hdcp_auth_prepare(hdcp_ctrl); in msm_hdmi_hdcp_auth_work()
1241 if (rc) { in msm_hdmi_hdcp_auth_work()
1242 pr_err("%s: auth prepare failed %d\n", __func__, rc); in msm_hdmi_hdcp_auth_work()
1247 rc = msm_hdmi_hdcp_auth_part1_key_exchange(hdcp_ctrl); in msm_hdmi_hdcp_auth_work()
1248 if (rc) { in msm_hdmi_hdcp_auth_work()
1249 pr_err("%s: key exchange failed %d\n", __func__, rc); in msm_hdmi_hdcp_auth_work()
1253 rc = msm_hdmi_hdcp_auth_part1_recv_r0(hdcp_ctrl); in msm_hdmi_hdcp_auth_work()
1254 if (rc) { in msm_hdmi_hdcp_auth_work()
1255 pr_err("%s: receive r0 failed %d\n", __func__, rc); in msm_hdmi_hdcp_auth_work()
1259 rc = msm_hdmi_hdcp_auth_part1_verify_r0(hdcp_ctrl); in msm_hdmi_hdcp_auth_work()
1260 if (rc) { in msm_hdmi_hdcp_auth_work()
1261 pr_err("%s: verify r0 failed %d\n", __func__, rc); in msm_hdmi_hdcp_auth_work()
1265 if (hdcp_ctrl->ds_type == DS_RECEIVER) in msm_hdmi_hdcp_auth_work()
1269 rc = msm_hdmi_hdcp_auth_part2_wait_ksv_fifo_ready(hdcp_ctrl); in msm_hdmi_hdcp_auth_work()
1270 if (rc) { in msm_hdmi_hdcp_auth_work()
1271 pr_err("%s: wait ksv fifo ready failed %d\n", __func__, rc); in msm_hdmi_hdcp_auth_work()
1275 rc = msm_hdmi_hdcp_auth_part2_recv_ksv_fifo(hdcp_ctrl); in msm_hdmi_hdcp_auth_work()
1276 if (rc) { in msm_hdmi_hdcp_auth_work()
1277 pr_err("%s: recv ksv fifo failed %d\n", __func__, rc); in msm_hdmi_hdcp_auth_work()
1281 rc = msm_hdmi_hdcp_auth_part2_write_ksv_fifo(hdcp_ctrl); in msm_hdmi_hdcp_auth_work()
1282 if (rc) { in msm_hdmi_hdcp_auth_work()
1283 pr_err("%s: write ksv fifo failed %d\n", __func__, rc); in msm_hdmi_hdcp_auth_work()
1287 rc = msm_hdmi_hdcp_auth_part2_check_v_match(hdcp_ctrl); in msm_hdmi_hdcp_auth_work()
1288 if (rc) in msm_hdmi_hdcp_auth_work()
1289 pr_err("%s: check v match failed %d\n", __func__, rc); in msm_hdmi_hdcp_auth_work()
1292 if (rc == -ECANCELED) { in msm_hdmi_hdcp_auth_work()
1294 } else if (rc == -ENOTSUPP) { in msm_hdmi_hdcp_auth_work()
1296 } else if (rc) { in msm_hdmi_hdcp_auth_work()
1306 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_on()
1310 if ((HDCP_STATE_INACTIVE != hdcp_ctrl->hdcp_state) || in msm_hdmi_hdcp_on()
1311 (HDCP_STATE_NO_AKSV == hdcp_ctrl->hdcp_state)) { in msm_hdmi_hdcp_on()
1317 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_on()
1321 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_on()
1323 hdcp_ctrl->auth_event = 0; in msm_hdmi_hdcp_on()
1324 hdcp_ctrl->hdcp_state = HDCP_STATE_AUTHENTICATING; in msm_hdmi_hdcp_on()
1325 hdcp_ctrl->auth_retries = 0; in msm_hdmi_hdcp_on()
1326 queue_work(hdmi->workq, &hdcp_ctrl->hdcp_auth_work); in msm_hdmi_hdcp_on()
1331 struct hdmi *hdmi = hdcp_ctrl->hdmi; in msm_hdmi_hdcp_off()
1335 if ((HDCP_STATE_INACTIVE == hdcp_ctrl->hdcp_state) || in msm_hdmi_hdcp_off()
1336 (HDCP_STATE_NO_AKSV == hdcp_ctrl->hdcp_state)) { in msm_hdmi_hdcp_off()
1344 * attempt a re-authentication, HW would clear the AN0_READY and in msm_hdmi_hdcp_off()
1347 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_off()
1358 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_off()
1366 set_bit(AUTH_ABORT_EV, &hdcp_ctrl->auth_event); in msm_hdmi_hdcp_off()
1367 wake_up_all(&hdcp_ctrl->auth_event_queue); in msm_hdmi_hdcp_off()
1368 cancel_work_sync(&hdcp_ctrl->hdcp_auth_work); in msm_hdmi_hdcp_off()
1369 cancel_work_sync(&hdcp_ctrl->hdcp_reauth_work); in msm_hdmi_hdcp_off()
1377 spin_lock_irqsave(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_off()
1386 spin_unlock_irqrestore(&hdmi->reg_lock, flags); in msm_hdmi_hdcp_off()
1388 hdcp_ctrl->hdcp_state = HDCP_STATE_INACTIVE; in msm_hdmi_hdcp_off()
1397 if (!hdmi->qfprom_mmio) { in msm_hdmi_hdcp_init()
1400 return ERR_PTR(-EINVAL); in msm_hdmi_hdcp_init()
1405 return ERR_PTR(-ENOMEM); in msm_hdmi_hdcp_init()
1407 INIT_WORK(&hdcp_ctrl->hdcp_auth_work, msm_hdmi_hdcp_auth_work); in msm_hdmi_hdcp_init()
1408 INIT_WORK(&hdcp_ctrl->hdcp_reauth_work, msm_hdmi_hdcp_reauth_work); in msm_hdmi_hdcp_init()
1409 init_waitqueue_head(&hdcp_ctrl->auth_event_queue); in msm_hdmi_hdcp_init()
1410 hdcp_ctrl->hdmi = hdmi; in msm_hdmi_hdcp_init()
1411 hdcp_ctrl->hdcp_state = HDCP_STATE_INACTIVE; in msm_hdmi_hdcp_init()
1412 hdcp_ctrl->aksv_valid = false; in msm_hdmi_hdcp_init()
1415 hdcp_ctrl->tz_hdcp = true; in msm_hdmi_hdcp_init()
1417 hdcp_ctrl->tz_hdcp = false; in msm_hdmi_hdcp_init()
1425 kfree(hdmi->hdcp_ctrl); in msm_hdmi_hdcp_destroy()
1426 hdmi->hdcp_ctrl = NULL; in msm_hdmi_hdcp_destroy()