Message ID | 73019b13e5e8d727c37ec1b99f2e746aad0a7153.1505388690.git.joabreu@synopsys.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Hans Verkuil |
Headers |
Received: from vger.kernel.org ([209.132.180.67]) by www.linuxtv.org with esmtp (Exim 4.84_2) (envelope-from <linux-media-owner@vger.kernel.org>) id 1dsSP3-0005Mk-9i; Thu, 14 Sep 2017 11:33:53 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752029AbdINLdt (ORCPT <rfc822;mkrufky@linuxtv.org> + 1 other); Thu, 14 Sep 2017 07:33:49 -0400 Received: from smtprelay.synopsys.com ([198.182.60.111]:37311 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752028AbdINLdr (ORCPT <rfc822;linux-media@vger.kernel.org>); Thu, 14 Sep 2017 07:33:47 -0400 Received: from mailhost.synopsys.com (mailhost1.synopsys.com [10.12.238.239]) by smtprelay.synopsys.com (Postfix) with ESMTP id 23A3910C1201; Thu, 14 Sep 2017 04:33:47 -0700 (PDT) Received: from mailhost.synopsys.com (localhost [127.0.0.1]) by mailhost.synopsys.com (Postfix) with ESMTP id A67A3E0C; Thu, 14 Sep 2017 04:33:46 -0700 (PDT) Received: from joabreu-VirtualBox.internal.synopsys.com (joabreu-e7440.internal.synopsys.com [10.107.19.118]) by mailhost.synopsys.com (Postfix) with ESMTP id 82728DEF; Thu, 14 Sep 2017 04:33:45 -0700 (PDT) From: Jose Abreu <Jose.Abreu@synopsys.com> To: linux-media@vger.kernel.org Cc: Jose Abreu <Jose.Abreu@synopsys.com>, Hans Verkuil <hans.verkuil@cisco.com>, Joao Pinto <Joao.Pinto@synopsys.com> Subject: [PATCH] [media] cec: GIVE_PHYSICAL_ADDR should respond to unregistered device Date: Thu, 14 Sep 2017 12:33:31 +0100 Message-Id: <73019b13e5e8d727c37ec1b99f2e746aad0a7153.1505388690.git.joabreu@synopsys.com> X-Mailer: git-send-email 1.9.1 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: <linux-media.vger.kernel.org> X-Mailing-List: linux-media@vger.kernel.org |
Commit Message
Jose Abreu
Sept. 14, 2017, 11:33 a.m. UTC
Running CEC 1.4 compliance test we get the following error on test
11.1.6.2: "ERROR: The DUT did not broadcast a
<Report Physical Address> message to the unregistered device."
Fix this by letting GIVE_PHYSICAL_ADDR message respond to unregistered
device.
With this fix we pass CEC 1.4 official compliance.
Signed-off-by: Jose Abreu <joabreu@synopsys.com>
Cc: Hans Verkuil <hans.verkuil@cisco.com>
Cc: Joao Pinto <jpinto@synopsys.com>
---
drivers/media/cec/cec-adap.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
Comments
On 09/14/17 13:33, Jose Abreu wrote: > Running CEC 1.4 compliance test we get the following error on test > 11.1.6.2: "ERROR: The DUT did not broadcast a > <Report Physical Address> message to the unregistered device." > > Fix this by letting GIVE_PHYSICAL_ADDR message respond to unregistered > device. > > With this fix we pass CEC 1.4 official compliance. > > Signed-off-by: Jose Abreu <joabreu@synopsys.com> > Cc: Hans Verkuil <hans.verkuil@cisco.com> > Cc: Joao Pinto <jpinto@synopsys.com> > --- > drivers/media/cec/cec-adap.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c > index dd769e4..48482aa 100644 > --- a/drivers/media/cec/cec-adap.c > +++ b/drivers/media/cec/cec-adap.c > @@ -1797,9 +1797,12 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, > case CEC_MSG_GIVE_DEVICE_VENDOR_ID: > case CEC_MSG_ABORT: > case CEC_MSG_GIVE_DEVICE_POWER_STATUS: > - case CEC_MSG_GIVE_PHYSICAL_ADDR: > case CEC_MSG_GIVE_OSD_NAME: > case CEC_MSG_GIVE_FEATURES: > + if (from_unregistered) This should be (!adap->passthrough && from_unregistered) > + return 0; Actually, CEC_MSG_GIVE_DEVICE_VENDOR_ID and CEC_MSG_GIVE_FEATURES fall in the same category as CEC_MSG_GIVE_PHYSICAL_ADDR. I.e. these are directed messages but the reply is a broadcast message. All three can be sent by an unregistered device. It's a good idea to mention this here. I.e. something like: /* These messages reply with a directed message, so ignore if the initiator is Unregistered */ > + /* Fall through */ > + case CEC_MSG_GIVE_PHYSICAL_ADDR: > /* > * Skip processing these messages if the passthrough mode > * is on. > @@ -1807,7 +1810,7 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, > if (adap->passthrough) > goto skip_processing; > /* Ignore if addressing is wrong */ > - if (is_broadcast || from_unregistered) > + if (is_broadcast) > return 0; > break; > > Good catch, if you can make a v2 then I'll get this in for 4.14. Not bad, just one obscure compliance error! Regards, Hans
Hi Hans, On 14-09-2017 14:10, Hans Verkuil wrote: > On 09/14/17 13:33, Jose Abreu wrote: >> Running CEC 1.4 compliance test we get the following error on test >> 11.1.6.2: "ERROR: The DUT did not broadcast a >> <Report Physical Address> message to the unregistered device." >> >> Fix this by letting GIVE_PHYSICAL_ADDR message respond to unregistered >> device. >> >> With this fix we pass CEC 1.4 official compliance. >> >> Signed-off-by: Jose Abreu <joabreu@synopsys.com> >> Cc: Hans Verkuil <hans.verkuil@cisco.com> >> Cc: Joao Pinto <jpinto@synopsys.com> >> --- >> drivers/media/cec/cec-adap.c | 7 +++++-- >> 1 file changed, 5 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c >> index dd769e4..48482aa 100644 >> --- a/drivers/media/cec/cec-adap.c >> +++ b/drivers/media/cec/cec-adap.c >> @@ -1797,9 +1797,12 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, >> case CEC_MSG_GIVE_DEVICE_VENDOR_ID: >> case CEC_MSG_ABORT: >> case CEC_MSG_GIVE_DEVICE_POWER_STATUS: >> - case CEC_MSG_GIVE_PHYSICAL_ADDR: >> case CEC_MSG_GIVE_OSD_NAME: >> case CEC_MSG_GIVE_FEATURES: >> + if (from_unregistered) > This should be (!adap->passthrough && from_unregistered) Ok. > >> + return 0; > Actually, CEC_MSG_GIVE_DEVICE_VENDOR_ID and CEC_MSG_GIVE_FEATURES > fall in the same category as CEC_MSG_GIVE_PHYSICAL_ADDR. I.e. these are > directed messages but the reply is a broadcast message. All three can be > sent by an unregistered device. It's a good idea to mention this here. > I.e. something like: > > /* These messages reply with a directed message, so ignore if > the initiator is Unregistered */ Ok, but this comment applies to the remaining msgs, right? I mean, GIVE_DEVICE_VENDOR_ID, GIVE_FEATURES and GIVE_PHYSICAL_ADDR will still send a response if initiator is unregistered, correct? > >> + /* Fall through */ >> + case CEC_MSG_GIVE_PHYSICAL_ADDR: >> /* >> * Skip processing these messages if the passthrough mode >> * is on. >> @@ -1807,7 +1810,7 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, >> if (adap->passthrough) >> goto skip_processing; >> /* Ignore if addressing is wrong */ >> - if (is_broadcast || from_unregistered) >> + if (is_broadcast) >> return 0; >> break; >> >> > Good catch, if you can make a v2 then I'll get this in for 4.14. > > Not bad, just one obscure compliance error! Actually, I have at least one more fix which I don't know if it's valid and I didn't manage to actually write it in a nice way. This one is for CEC 2.0. My test equipment (which is certified) in some tests sends msgs only with the opcode. As the received msg length does not match the expected one CEC core is rejecting the message and my compliance test is failling (test is 4.2.3). Have you run this test? Did it pass? Best regards, Jose Miguel Abreu > > Regards, > > Hans
On 09/14/17 15:28, Jose Abreu wrote: > Hi Hans, > > On 14-09-2017 14:10, Hans Verkuil wrote: >> On 09/14/17 13:33, Jose Abreu wrote: >>> Running CEC 1.4 compliance test we get the following error on test >>> 11.1.6.2: "ERROR: The DUT did not broadcast a >>> <Report Physical Address> message to the unregistered device." >>> >>> Fix this by letting GIVE_PHYSICAL_ADDR message respond to unregistered >>> device. >>> >>> With this fix we pass CEC 1.4 official compliance. >>> >>> Signed-off-by: Jose Abreu <joabreu@synopsys.com> >>> Cc: Hans Verkuil <hans.verkuil@cisco.com> >>> Cc: Joao Pinto <jpinto@synopsys.com> >>> --- >>> drivers/media/cec/cec-adap.c | 7 +++++-- >>> 1 file changed, 5 insertions(+), 2 deletions(-) >>> >>> diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c >>> index dd769e4..48482aa 100644 >>> --- a/drivers/media/cec/cec-adap.c >>> +++ b/drivers/media/cec/cec-adap.c >>> @@ -1797,9 +1797,12 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, >>> case CEC_MSG_GIVE_DEVICE_VENDOR_ID: >>> case CEC_MSG_ABORT: >>> case CEC_MSG_GIVE_DEVICE_POWER_STATUS: >>> - case CEC_MSG_GIVE_PHYSICAL_ADDR: >>> case CEC_MSG_GIVE_OSD_NAME: >>> case CEC_MSG_GIVE_FEATURES: >>> + if (from_unregistered) >> This should be (!adap->passthrough && from_unregistered) > > Ok. > >> >>> + return 0; >> Actually, CEC_MSG_GIVE_DEVICE_VENDOR_ID and CEC_MSG_GIVE_FEATURES >> fall in the same category as CEC_MSG_GIVE_PHYSICAL_ADDR. I.e. these are >> directed messages but the reply is a broadcast message. All three can be >> sent by an unregistered device. It's a good idea to mention this here. >> I.e. something like: >> >> /* These messages reply with a directed message, so ignore if >> the initiator is Unregistered */ > > Ok, but this comment applies to the remaining msgs, right? I > mean, GIVE_DEVICE_VENDOR_ID, GIVE_FEATURES and GIVE_PHYSICAL_ADDR > will still send a response if initiator is unregistered, correct? No, I meant this to go right before the 'if (!adap->passthrough && from_unregistered)' statement. Sorry for the confusion. > >> >>> + /* Fall through */ >>> + case CEC_MSG_GIVE_PHYSICAL_ADDR: >>> /* >>> * Skip processing these messages if the passthrough mode >>> * is on. >>> @@ -1807,7 +1810,7 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, >>> if (adap->passthrough) >>> goto skip_processing; >>> /* Ignore if addressing is wrong */ >>> - if (is_broadcast || from_unregistered) >>> + if (is_broadcast) >>> return 0; >>> break; >>> >>> >> Good catch, if you can make a v2 then I'll get this in for 4.14. >> >> Not bad, just one obscure compliance error! > > Actually, I have at least one more fix which I don't know if it's > valid and I didn't manage to actually write it in a nice way. > This one is for CEC 2.0. My test equipment (which is certified) > in some tests sends msgs only with the opcode. As the received > msg length does not match the expected one CEC core is rejecting > the message and my compliance test is failling (test is 4.2.3). In the HDMI 1.4 spec in CEC 7.3 (Frame Validation) it says that a follower should ignore frames that are too small. At the same time unsupported opcodes should result in a Feature Abort. If you don't send a properly formed message, then it's not clear to me what should happen. Which opcode failed? > Have you run this test? Did it pass? No, we haven't. Never got around to that. Regards, Hans > > Best regards, > Jose Miguel Abreu > >> >> Regards, >> >> Hans >
On 14-09-2017 16:09, Hans Verkuil wrote: > On 09/14/17 15:28, Jose Abreu wrote: > >> Actually, I have at least one more fix which I don't know if it's >> valid and I didn't manage to actually write it in a nice way. >> This one is for CEC 2.0. My test equipment (which is certified) >> in some tests sends msgs only with the opcode. As the received >> msg length does not match the expected one CEC core is rejecting >> the message and my compliance test is failling (test is 4.2.3). > In the HDMI 1.4 spec in CEC 7.3 (Frame Validation) it says that a follower > should ignore frames that are too small. > > At the same time unsupported opcodes should result in a Feature Abort. > > If you don't send a properly formed message, then it's not clear to me > what should happen. Which opcode failed? Hmm, yeah, the spec confirms. The failing opcodes are the ones that have arguments, the test equipment is just sending the header plus opcode. Anyway, for this failing test the MOI for this equipment is not approved so I will probably carry this fix only locally and send it upstream only if the MOI gets approved. > >> Have you run this test? Did it pass? > No, we haven't. Never got around to that. Ok. I can say that CEC 1.4 + CEC 2.0 all pass compliance with this patch and with my local fix + my test app! Best regards, Jose Miguel Abreu > > Regards, > > Hans > >> Best regards, >> Jose Miguel Abreu >> >>> Regards, >>> >>> Hans
On 09/14/2017 05:30 PM, Jose Abreu wrote: > > > On 14-09-2017 16:09, Hans Verkuil wrote: >> On 09/14/17 15:28, Jose Abreu wrote: >> >>> Actually, I have at least one more fix which I don't know if it's >>> valid and I didn't manage to actually write it in a nice way. >>> This one is for CEC 2.0. My test equipment (which is certified) >>> in some tests sends msgs only with the opcode. As the received >>> msg length does not match the expected one CEC core is rejecting >>> the message and my compliance test is failling (test is 4.2.3). >> In the HDMI 1.4 spec in CEC 7.3 (Frame Validation) it says that a follower >> should ignore frames that are too small. >> >> At the same time unsupported opcodes should result in a Feature Abort. >> >> If you don't send a properly formed message, then it's not clear to me >> what should happen. Which opcode failed? > > Hmm, yeah, the spec confirms. The failing opcodes are the ones > that have arguments, the test equipment is just sending the > header plus opcode. Anyway, for this failing test the MOI for > this equipment is not approved so I will probably carry this fix > only locally and send it upstream only if the MOI gets approved. So is this test just running through all opcodes from 1-255 and see what happens? Or is it only doing this for a subset of opcodes? And if so, which? I'm just curious to see how this is done. Which test equipment do you use? We don't actually have any certified CEC 2.0 test equipment, only 1.4, so I'm grateful that you did it for me :-) Regards, Hans > >> >>> Have you run this test? Did it pass? >> No, we haven't. Never got around to that. > > Ok. I can say that CEC 1.4 + CEC 2.0 all pass compliance with > this patch and with my local fix + my test app! > > Best regards, > Jose Miguel Abreu > >> >> Regards, >> >> Hans >> >>> Best regards, >>> Jose Miguel Abreu >>> >>>> Regards, >>>> >>>> Hans >
Hi Hans, On 14-09-2017 16:46, Hans Verkuil wrote: > On 09/14/2017 05:30 PM, Jose Abreu wrote: >> >> On 14-09-2017 16:09, Hans Verkuil wrote: >>> On 09/14/17 15:28, Jose Abreu wrote: >>> >>>> Actually, I have at least one more fix which I don't know if it's >>>> valid and I didn't manage to actually write it in a nice way. >>>> This one is for CEC 2.0. My test equipment (which is certified) >>>> in some tests sends msgs only with the opcode. As the received >>>> msg length does not match the expected one CEC core is rejecting >>>> the message and my compliance test is failling (test is 4.2.3). >>> In the HDMI 1.4 spec in CEC 7.3 (Frame Validation) it says that a follower >>> should ignore frames that are too small. >>> >>> At the same time unsupported opcodes should result in a Feature Abort. >>> >>> If you don't send a properly formed message, then it's not clear to me >>> what should happen. Which opcode failed? >> Hmm, yeah, the spec confirms. The failing opcodes are the ones >> that have arguments, the test equipment is just sending the >> header plus opcode. Anyway, for this failing test the MOI for >> this equipment is not approved so I will probably carry this fix >> only locally and send it upstream only if the MOI gets approved. > So is this test just running through all opcodes from 1-255 and see > what happens? Or is it only doing this for a subset of opcodes? > And if so, which? Its running through the opcodes that the sink does not support and sending only the opcode. By spec sink should respond with Feature Abort. But, as you said, only sending opcode is out of spec (for opcodes that have arguments). > > I'm just curious to see how this is done. > > Which test equipment do you use? Its a QD980. Best regards, Jose Miguel Abreu > > We don't actually have any certified CEC 2.0 test equipment, only 1.4, > so I'm grateful that you did it for me :-) > > Regards, > > Hans > >>>> Have you run this test? Did it pass? >>> No, we haven't. Never got around to that. >> Ok. I can say that CEC 1.4 + CEC 2.0 all pass compliance with >> this patch and with my local fix + my test app! >> >> Best regards, >> Jose Miguel Abreu >> >>> Regards, >>> >>> Hans >>> >>>> Best regards, >>>> Jose Miguel Abreu >>>> >>>>> Regards, >>>>> >>>>> Hans
diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c index dd769e4..48482aa 100644 --- a/drivers/media/cec/cec-adap.c +++ b/drivers/media/cec/cec-adap.c @@ -1797,9 +1797,12 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, case CEC_MSG_GIVE_DEVICE_VENDOR_ID: case CEC_MSG_ABORT: case CEC_MSG_GIVE_DEVICE_POWER_STATUS: - case CEC_MSG_GIVE_PHYSICAL_ADDR: case CEC_MSG_GIVE_OSD_NAME: case CEC_MSG_GIVE_FEATURES: + if (from_unregistered) + return 0; + /* Fall through */ + case CEC_MSG_GIVE_PHYSICAL_ADDR: /* * Skip processing these messages if the passthrough mode * is on. @@ -1807,7 +1810,7 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, if (adap->passthrough) goto skip_processing; /* Ignore if addressing is wrong */ - if (is_broadcast || from_unregistered) + if (is_broadcast) return 0; break;