On 9/6/19 5:51 AM, Jiunn Chang wrote:
> For devices on a HDMI ARC link, sinks can only support transmitter
> devices and sources and only support receiver devices.
> 
> This patch checks to see if the DUT is an transmitter or receiver and
> has the ARC flag set properly from the device.
> 
> This should apply to devices that support the HDMI CEC 1.4 spec going
> forward when ARC was introduced.
> 
> Signed-off-by: Jiunn Chang <c0d1n61...@gmail.com>
> ---
>  utils/cec-compliance/cec-test-audio.cpp | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
> 
> diff --git a/utils/cec-compliance/cec-test-audio.cpp 
> b/utils/cec-compliance/cec-test-audio.cpp
> index 872bb9ad..da2ed1d1 100644
> --- a/utils/cec-compliance/cec-test-audio.cpp
> +++ b/utils/cec-compliance/cec-test-audio.cpp
> @@ -297,11 +297,35 @@ static int arc_terminate_rx(struct node *node, unsigned 
> me, unsigned la, bool in
>       return 0;
>  }
>  
> +static int arc_sink_tx(struct node *node, unsigned me, unsigned la, bool 
> interactive)
> +{
> +     /* Check if we are upstream from the device. If we are, then the device 
> is
> +        an HDMI source, which means that it is an ARC receiver, not a 
> transmitter. */
> +     if (pa_is_upstream_from(node->phys_addr, node->remote[la].phys_addr))
> +             return NOTAPPLICABLE;
> +     fail_on_test(!node->remote[la].has_arc_tx);
> +
> +     return 0;
> +}
> +
> +static int arc_source_rx(struct node *node, unsigned me, unsigned la, bool 
> interactive)
> +{
> +     /* Check if the DUT is upstream from us. If it is, then it is an
> +        HDMI sink, which means that it is an ARC transmitter, not receiver. 
> */
> +     if (pa_is_upstream_from(node->remote[la].phys_addr, node->phys_addr))
> +             return NOTAPPLICABLE;
> +     fail_on_test(!node->remote[la].has_arc_rx);
> +
> +     return 0;
> +}
> +
>  struct remote_subtest arc_subtests[] = {
>       { "Initiate ARC (RX)", CEC_LOG_ADDR_MASK_ALL, arc_initiate_rx },
>       { "Terminate ARC (RX)", CEC_LOG_ADDR_MASK_ALL, arc_terminate_rx },
>       { "Initiate ARC (TX)", CEC_LOG_ADDR_MASK_ALL, arc_initiate_tx },
>       { "Terminate ARC (TX)", CEC_LOG_ADDR_MASK_ALL, arc_terminate_tx },
> +     { "Sink ARC (TX)", CEC_LOG_ADDR_MASK_ALL, arc_sink_tx },
> +     { "Source ARC (RX)", CEC_LOG_ADDR_MASK_ALL, arc_source_rx },
>  };
>  
>  const unsigned arc_subtests_size = ARRAY_SIZE(arc_subtests);
> 

This isn't right. First of all, the remote device may not have ARC support
at all, so failing if has_arc_rx/tx is false is wrong. And in addition, CEC
versions < 2 do not signal ARC support since they don't have the
Give Device Features message.

The second is to test against pa_is_upstream_from: a remote device such as
and AV receiver may have ARC support on both sink and source.

Just add the checks to system_info_give_features(): there are already checks
for has_rec_tv, and the new checks are similar to that: a TV can't have
has_arc_rx, and a Playback device can't have has_arc_tx.

Regards,

        Hans

Reply via email to