From mboxrd@z Thu Jan 1 00:00:00 1970 From: Damien Lespiau Subject: [PATCH] intel_infoframes: Dump HDMI vendor infoframes Date: Wed, 26 Sep 2012 18:17:53 +0100 Message-ID: <1348679873-4351-1-git-send-email-damien.lespiau@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail-wi0-f171.google.com (mail-wi0-f171.google.com [209.85.212.171]) by gabe.freedesktop.org (Postfix) with ESMTP id DF3EA9E796 for ; Wed, 26 Sep 2012 10:18:03 -0700 (PDT) Received: by wibhj13 with SMTP id hj13so1975556wib.12 for ; Wed, 26 Sep 2012 10:18:02 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org From: Damien Lespiau Those infoframes are programmed when using stereo 3D modes. Signed-off-by: Damien Lespiau --- tools/intel_infoframes.c | 63 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 62 insertions(+), 1 deletions(-) diff --git a/tools/intel_infoframes.c b/tools/intel_infoframes.c index d74df64..66351ac 100644 --- a/tools/intel_infoframes.c +++ b/tools/intel_infoframes.c @@ -125,6 +125,8 @@ typedef enum { #define SPD_INFOFRAME_VERSION 0x01 #define SPD_INFOFRAME_LENGTH 0x19 +#define VENDOR_ID_HDMI 0x000c03 + typedef struct { uint8_t type; uint8_t version; @@ -175,6 +177,21 @@ typedef union { } __attribute__((packed)) spd; struct { DipInfoFrameHeader header; + uint8_t checksum; + + uint8_t id[3]; + + uint8_t Rsvd0 :5; + uint8_t video_format :3; + + uint8_t Rsvd1 :4; + uint8_t s3d_structure :4; + + uint8_t Rsvd2 :4; + uint8_t s3d_ext_data :4; + } __attribute__((packed)) vendor; + struct { + DipInfoFrameHeader header; uint8_t body[27]; } generic; uint8_t data8[128]; @@ -424,10 +441,45 @@ static void dump_avi_info(Transcoder transcoder) printf("Invalid InfoFrame checksum!\n"); } +static const char *vendor_id_to_string(uint32_t id) +{ + switch (id) { + case VENDOR_ID_HDMI: + return "HDMI"; + default: + return "Unknown"; + } +} + +static const char *s3d_structure_to_string(int format) +{ + switch (format) { + case 0: + return "Frame Packing"; + case 6: + return "Top Bottom"; + case 8: + return "Side By Side (half)"; + default: + return "Reserved"; + } +} + +static void dump_vendor_hdmi(DipInfoFrame *frame) +{ + int s3d_present = frame->vendor.video_format & 0x2; + + printf("- video format: 0x%03x %s\n", frame->vendor.video_format, + s3d_present ? "(3D)" : ""); + if (s3d_present) + printf("- 3D Format: %s\n", + s3d_structure_to_string(frame->vendor.s3d_structure)); +} + static void dump_vendor_info(Transcoder transcoder) { Register reg = get_dip_ctl_reg(transcoder); - uint32_t val; + uint32_t val, vendor_id; DipFrequency freq; DipInfoFrame frame; @@ -446,6 +498,15 @@ static void dump_vendor_info(Transcoder transcoder) dump_raw_infoframe(&frame); + vendor_id = frame.vendor.id[2] << 16 | frame.vendor.id[1] << 8 | + frame.vendor.id[0]; + + printf("- vendor Id: 0x%06x (%s)\n", vendor_id, + vendor_id_to_string(vendor_id)); + + if (vendor_id == VENDOR_ID_HDMI) + dump_vendor_hdmi(&frame); + if (!infoframe_valid_checksum(&frame)) printf("Invalid InfoFrame checksum!\n"); } -- 1.7.7.5