[Intel-gfx] [PATCH 1/4] drm/i915/hdcp: Update CP as per the kernel internal state
Maarten Lankhorst
maarten.lankhorst at linux.intel.com
Wed Mar 4 08:43:10 UTC 2020
Op 03-03-2020 om 17:35 schreef Anshuman Gupta:
> On 2020-03-03 at 15:36:37 +0100, Maarten Lankhorst wrote:
>> Op 05-02-2020 om 06:07 schreef Anshuman Gupta:
>>> On 2020-01-28 at 21:45:45 +0530, Anshuman Gupta wrote:
>>> Hi Jani ,
>>> As per my understanding intel_hdcp_atomic_check() is not sufficient to
>>> fix the broken hdcp uapi state, as the state fixup required in case
>>> of modeset.
>>> If you do not have any concern, can we continue with the patch.
>>> Thanks,
>>> Anshuman Gupta.
>> Hey,
>>
> Thanks martin for review.
> As full modeset DDI disable sequence (encoder->disable()->intel_hdcp_disable()) can cause HDCP to
> disable without user space knowledge i.e. when Content Protetion state is not UNDESIRED, in those cases
> we want to fix the HDCP Content Protection state.
You can get to crtc_state from the connector_state->crtc, should be easy to fix up this case.
>> In case of a modeset, don't we always call atomic_check() on the connector, either before or after?
> yes it calls drm_atomic_helper_check_modeset()->intel_digital_connector_atomic_check()->intel_hdcp_atomic_check(),
> but if we fix HDCP state in intel_hdcp_atomic_check(), there may be a case at later point that fastset
> check is true, which disable need_modeset and enable update_pipe due to which encoder->update_pipe()->intel_hdcp_update_pipe()
> may endup enabling HDCP again when HDCP is already enabled, which is wrong.
Seems that if you look at the crtc_state carefully, you can prevent that. :)
~Maarten
>> Should be fine to fixup there then?
> Therefore we want to fixup the HDCP state only when full modeset is required, when it is going
> to disable DDI.
>
> Thanks ,
> Anshuman Gupta.
>>>> On 2020-01-28 at 21:14:44 +0530, Anshuman Gupta wrote:
>>>>> On 2020-01-28 at 16:19:31 +0200, Jani Nikula wrote:
>>>>>> On Tue, 28 Jan 2020, Anshuman Gupta <anshuman.gupta at intel.com> wrote:
>>>>>>> Content Protection property should be updated as per the kernel
>>>>>>> internal state. Let's say if Content protection is disabled
>>>>>>> by userspace, CP property should be set to UNDESIRED so that
>>>>>>> reauthentication will not happen until userspace request it again,
>>>>>>> but when kernel disables the HDCP due to any DDI disabling sequences
>>>>>>> like modeset/DPMS operation, kernel should set the property to
>>>>>>> DESIRED, so that when opportunity arises, kernel will start the
>>>>>>> HDCP authentication on its own.
>>>>>>>
>>>>>>> Somewhere in the line, state machine to set content protection to
>>>>>>> DESIRED from kernel was broken and IGT coverage was missing for it.
>>>>>>> This patch fixes it.
>>>>>>> IGT patch to catch further regression on this features is being
>>>>>>> worked upon.
>>>>>>>
>>>>>>> CC: Ramalingam C <ramalingam.c at intel.com>
>>>>>>> Signed-off-by: Anshuman Gupta <anshuman.gupta at intel.com>
>>>>>>> ---
>>>>>>> drivers/gpu/drm/i915/display/intel_display.c | 4 +++
>>>>>>> drivers/gpu/drm/i915/display/intel_hdcp.c | 26 ++++++++++++++++++++
>>>>>>> drivers/gpu/drm/i915/display/intel_hdcp.h | 2 ++
>>>>>>> 3 files changed, 32 insertions(+)
>>>>>>>
>>>>>>> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
>>>>>>> index da5266e76738..934cdf1f1858 100644
>>>>>>> --- a/drivers/gpu/drm/i915/display/intel_display.c
>>>>>>> +++ b/drivers/gpu/drm/i915/display/intel_display.c
>>>>>>> @@ -14595,6 +14595,10 @@ static int intel_atomic_check(struct drm_device *dev,
>>>>>>> goto fail;
>>>>>>>
>>>>>>> if (any_ms) {
>>>>>>> + /*
>>>>>>> + * When there is modeset fix the hdcp uapi CP state.
>>>>>>> + */
>>>>>>> + intel_hdcp_post_need_modeset_check(state);
>>>>>>> ret = intel_modeset_checks(state);
>>>>>>> if (ret)
>>>>>>> goto fail;
>>>>>>> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.c b/drivers/gpu/drm/i915/display/intel_hdcp.c
>>>>>>> index 0fdbd39f6641..be083136eee2 100644
>>>>>>> --- a/drivers/gpu/drm/i915/display/intel_hdcp.c
>>>>>>> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.c
>>>>>>> @@ -2074,6 +2074,32 @@ void intel_hdcp_atomic_check(struct drm_connector *connector,
>>>>>>> crtc_state->mode_changed = true;
>>>>>>> }
>>>>>>>
>>>>>>> +/**
>>>>>>> + * intel_hdcp_post_need_modeset_check.
>>>>>>> + * @state: intel atomic state.
>>>>>>> + *
>>>>>>> + * This function fix the HDCP uapi state when hdcp disabling initiated from
>>>>>>> + * modeset DDI disabling sequence. It updates uapi CP state from ENABLED to
>>>>>>> + * DESIRED so that HDCP uapi state can be restored as per HDCP Auth state.
>>>>>>> + * This function should be called only in case of in case of modeset.
>>>>>>> + * FIXME: As per HDCP content protection property uapi doc, an uevent()
>>>>>>> + * need to be sent if there is transition from ENABLED->DESIRED.
>>>>>>> + */
>>>>>>> +void intel_hdcp_post_need_modeset_check(struct intel_atomic_state *state)
>>>>>>> +{
>>>>>>> + struct drm_connector *connector;
>>>>>>> + struct drm_connector_state *old_state;
>>>>>>> + struct drm_connector_state *new_state;
>>>>>>> + int i;
>>>>>>> +
>>>>>>> + for_each_oldnew_connector_in_state(&state->base, connector, old_state,
>>>>>>> + new_state, i) {
>>>>>>> + if (old_state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED &&
>>>>>>> + new_state->content_protection != DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
>>>>>>> + new_state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
>>>>>>> + }
>>>>>>> +}
>>>>>>> +
>>>>>> Why does this feel like duplication of what you already have in
>>>>>> intel_hdcp_atomic_check()?
>>>>> intel_hdcp_atomic_check() have checks that for disconnected connector and it doesn't look for
>>>> typo here, "intel_hdcp_atomic_check() checks that for disconnected connector and it doesn't check for new state shouldn't be UNDESIRED"
>>>>> old state, that is not sufficient to fix the hdcp CP uapi state, it need to be fix only in case of
>>>>> modeset, Later on a fastset check can disable the modeset and we would endup calling intel_hdcp_enable
>>>>> while hdcp is already enabled. That is the reason i think we would require a new API to
>>>>> fix the uapi state.
>>>>> Thanks ,
>>>>> Anshuman Gupta.
>>>>>> BR,
>>>>>> Jani.
>>>>>>
>>>>>>
>>>>>>> /* Handles the CP_IRQ raised from the DP HDCP sink */
>>>>>>> void intel_hdcp_handle_cp_irq(struct intel_connector *connector)
>>>>>>> {
>>>>>>> diff --git a/drivers/gpu/drm/i915/display/intel_hdcp.h b/drivers/gpu/drm/i915/display/intel_hdcp.h
>>>>>>> index f3c3272e712a..7bf46bc3c348 100644
>>>>>>> --- a/drivers/gpu/drm/i915/display/intel_hdcp.h
>>>>>>> +++ b/drivers/gpu/drm/i915/display/intel_hdcp.h
>>>>>>> @@ -13,6 +13,7 @@
>>>>>>> struct drm_connector;
>>>>>>> struct drm_connector_state;
>>>>>>> struct drm_i915_private;
>>>>>>> +struct intel_atomic_state;
>>>>>>> struct intel_connector;
>>>>>>> struct intel_hdcp_shim;
>>>>>>> enum port;
>>>>>>> @@ -21,6 +22,7 @@ enum transcoder;
>>>>>>> void intel_hdcp_atomic_check(struct drm_connector *connector,
>>>>>>> struct drm_connector_state *old_state,
>>>>>>> struct drm_connector_state *new_state);
>>>>>>> +void intel_hdcp_post_need_modeset_check(struct intel_atomic_state *state);
>>>>>>> int intel_hdcp_init(struct intel_connector *connector,
>>>>>>> const struct intel_hdcp_shim *hdcp_shim);
>>>>>>> int intel_hdcp_enable(struct intel_connector *connector,
>>>>>> --
>>>>>> Jani Nikula, Intel Open Source Graphics Center
>>> _______________________________________________
>>> Intel-gfx mailing list
>>> Intel-gfx at lists.freedesktop.org
>>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
>>>
More information about the Intel-gfx
mailing list