/* * SiI8620 Linux Driver * * Copyright (C) 2013-2014 Silicon Image, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation version 2. * This program is distributed AS-IS WITHOUT ANY WARRANTY of any * kind, whether express or implied; INCLUDING without the implied warranty * of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE or NON-INFRINGEMENT. * See the GNU General Public License for more details at * http://www.gnu.org/licenses/gpl-2.0.html. */ #ifndef _SI_MHL_DEFS_H_ #define _SI_MHL_DEFS_H_ /* * This file contains MHL Specs related definitions. */ /* * DEVCAP offsets */ enum { DEVCAP_OFFSET_DEV_STATE, DEVCAP_OFFSET_MHL_VERSION, DEVCAP_OFFSET_DEV_CAT, DEVCAP_OFFSET_ADOPTER_ID_H, DEVCAP_OFFSET_ADOPTER_ID_L, DEVCAP_OFFSET_VID_LINK_MODE, DEVCAP_OFFSET_AUD_LINK_MODE, DEVCAP_OFFSET_VIDEO_TYPE, DEVCAP_OFFSET_LOG_DEV_MAP, DEVCAP_OFFSET_BANDWIDTH, DEVCAP_OFFSET_FEATURE_FLAG, DEVCAP_OFFSET_DEVICE_ID_H, DEVCAP_OFFSET_DEVICE_ID_L, DEVCAP_OFFSET_SCRATCHPAD_SIZE, DEVCAP_OFFSET_INT_STAT_SIZE, DEVCAP_OFFSET_RESERVED, /* this one must be last */ DEVCAP_SIZE }; SI_PUSH_STRUCT_PACKING struct SI_PACK_THIS_STRUCT MHLDevCap_t { uint8_t state; uint8_t mhl_version; uint8_t deviceCategory; uint8_t adopterIdHigh; uint8_t adopterIdLow; uint8_t vid_link_mode; uint8_t audLinkMode; uint8_t videoType; uint8_t logicalDeviceMap; uint8_t bandWidth; uint8_t featureFlag; uint8_t deviceIdHigh; uint8_t deviceIdLow; uint8_t scratchPadSize; uint8_t int_state_size; uint8_t reserved; }; union MHLDevCap_u { struct MHLDevCap_t mdc; uint8_t devcap_cache[DEVCAP_SIZE]; }; /* Version that this chip supports */ #define MHL_VER_MAJOR 0x30 #define MHL_VER_MINOR 0x02 #define MHL_VERSION (MHL_VER_MAJOR | MHL_VER_MINOR) /* Device Category */ #define MHL_DEV_CATEGORY_OFFSET DEVCAP_OFFSET_DEV_CAT #define MHL_DEV_CATEGORY_POW_BIT 0x10 #define MHL_DEV_CATEGORY_PLIM2_0 0xE0 #define I_VBUS_PRE_DISCOVERY 100 #define I_VBUS_SOURCE_TO_DONGLE 200 #define I_VBUS_POST_DISCOVERY 500 #define MHL_DEV_CAT_SINK 0x01 #define MHL_DEV_CAT_SOURCE 0x02 #define MHL_DEV_CAT_DONGLE 0x03 #define MHL_DEV_CAT_SELF_POWERED_DONGLE 0x13 /* Video Link Mode */ #define MHL_DEV_VID_LINK_SUPP_RGB444 0x01 #define MHL_DEV_VID_LINK_SUPP_YCBCR444 0x02 #define MHL_DEV_VID_LINK_SUPP_YCBCR422 0x04 #define MHL_DEV_VID_LINK_SUPP_PPIXEL 0x08 #define MHL_DEV_VID_LINK_SUPP_ISLANDS 0x10 #define MHL_DEV_VID_LINK_SUPP_VGA 0x20 #define MHL_DEV_VID_LINK_SUPP_16BPP 0x40 /* Audio Link Mode Support */ #define MHL_DEV_AUD_LINK_2CH 0x01 #define MHL_DEV_AUD_LINK_8CH 0x02 /* Feature Flag in the devcap */ #define MHL_DEV_FEATURE_FLAG_OFFSET DEVCAP_OFFSET_FEATURE_FLAG #define MHL_FEATURE_RCP_SUPPORT 0x01 #define MHL_FEATURE_RAP_SUPPORT 0x02 #define MHL_FEATURE_SP_SUPPORT 0x04 #define MHL_FEATURE_UCP_SEND_SUPPORT 0x08 #define MHL_FEATURE_UCP_RECV_SUPPORT 0x10 #define MHL_FEATURE_RBP_SUPPORT 0x40 /* VIDEO TYPES */ #define MHL_VT_GRAPHICS 0x00 #define MHL_VT_PHOTO 0x02 #define MHL_VT_CINEMA 0x04 #define MHL_VT_GAMES 0x08 #define MHL_SUPP_VT 0x80 /* Logical Dev Map */ #define MHL_DEV_LD_DISPLAY 0x01 #define MHL_DEV_LD_VIDEO 0x02 #define MHL_DEV_LD_AUDIO 0x04 #define MHL_DEV_LD_MEDIA 0x08 #define MHL_DEV_LD_TUNER 0x10 #define MHL_DEV_LD_RECORD 0x20 #define MHL_DEV_LD_SPEAKER 0x40 #define MHL_DEV_LD_GUI 0x80 /* Bandwidth */ #define MHL_BANDWIDTH_LIMIT 22 /* 225 MHz */ #define MHL_STATUS_REG_CONNECTED_RDY 0x30 #define MHL_STATUS_REG_LINK_MODE 0x31 #define MHL_STATUS_REG_VERSION_STAT 0x32 #define MHL_STATUS_DCAP_RDY 0x01 #define MHL_STATUS_XDEVCAPP_SUPP 0x02 #define MHL_STATUS_POW_STAT 0x04 #define MHL_STATUS_PLIM_STAT_MASK 0x38 #define MHL_STATUS_CLK_MODE_MASK 0x07 #define MHL_STATUS_CLK_MODE_PACKED_PIXEL 0x02 #define MHL_STATUS_CLK_MODE_NORMAL 0x03 #define MHL_STATUS_PATH_EN_MASK 0x08 #define MHL_STATUS_PATH_ENABLED 0x08 #define MHL_STATUS_PATH_DISABLED 0x00 #define MHL_STATUS_MUTED_MASK 0x10 #define MHL_RCHANGE_INT 0x20 #define MHL_DCHANGE_INT 0x21 #define MHL_INT_DCAP_CHG 0x01 #define MHL_INT_DSCR_CHG 0x02 #define MHL_INT_REQ_WRT 0x04 #define MHL_INT_GRT_WRT 0x08 #define MHL2_INT_3D_REQ 0x10 #define MHL3_INT_FEAT_REQ 0x20 #define MHL3_INT_FEAT_COMPLETE 0x40 /* On INTR_1 the EDID_CHG is located at BIT 0 */ #define MHL_INT_EDID_CHG 0x02 /* This contains one nibble each - max offset */ #define MHL_INT_AND_STATUS_SIZE 0x33 #define MHL_SCRATCHPAD_SIZE 16 /* manually define highest number */ #define MHL_MAX_BUFFER_SIZE MHL_SCRATCHPAD_SIZE #define SILICON_IMAGE_ADOPTER_ID 322 enum BurstId_e { MHL_TEST_ADOPTER_ID = 0x0000, burst_id_3D_VIC = 0x0010, burst_id_3D_DTD = 0x0011, burst_id_HEV_VIC = 0x0020, burst_id_HEV_DTDA = 0x0021, burst_id_HEV_DTDB = 0x0022, burst_id_VC_ASSIGN = 0x0038, burst_id_VC_CONFIRM = 0x0039, burst_id_AUD_DELAY = 0x0040, burst_id_ADT_BURSTID = 0x0041, burst_id_BIST_SETUP = 0x0051, burst_id_BIST_RETURN_STAT = 0x0052, burst_id_BIST_DISCARD = 0x0053, burst_id_BIST_ECHO_REQUEST = 0x0054, burst_id_BIST_ECHO_RESPONSE = 0x0055, burst_id_EMSC_SUPPORT = 0x0061, burst_id_HID_PAYLOAD = 0x0062, burst_id_BLK_RCV_BUFFER_INFO = 0x0063, burst_id_BITS_PER_PIXEL_FMT = 0x0064, adopter_id_RANGE_START = 0x0080, LOCAL_ADOPTER_ID = SILICON_IMAGE_ADOPTER_ID, /* add new burst ID's above here */ /* Burst ID's are a 16-bit big-endian quantity. */ burst_id_16_BITS_REQUIRED = 0x8000 }; struct SI_PACK_THIS_STRUCT MHL_high_low_t { uint8_t high; uint8_t low; }; struct SI_PACK_THIS_STRUCT MHL_burst_id_t { uint8_t high; uint8_t low; }; struct SI_PACK_THIS_STRUCT EMSC_BLK_ADOPT_ID_PAYLD_HDR { struct MHL_burst_id_t burst_id; uint8_t remaining_length; }; #define ENDIAN_CONVERT_16(a) \ ((((uint16_t)((a).high))<<8)|((uint16_t)((a).low))) #define BURST_ID(bid) (enum BurstId_e)ENDIAN_CONVERT_16(bid) #define HIGH_BYTE_16(x) (uint8_t)((x >> 8) & 0xFF) #define LOW_BYTE_16(x) (uint8_t)(x & 0xFF) #define ENCODE_BURST_ID(id) {HIGH_BYTE_16(id), LOW_BYTE_16(id)} struct SI_PACK_THIS_STRUCT standard_transport_header_t { uint8_t rx_unload_ack; uint8_t length_remaining; }; #define STD_TRANSPORT_HDR_SIZE \ sizeof(struct SI_PACK_THIS_STRUCT standard_transport_header_t) struct SI_PACK_THIS_STRUCT block_rcv_buffer_info_t { /* use the BURST_ID macro to access this */ struct MHL_burst_id_t burst_id; uint8_t blk_rcv_buffer_size_low; uint8_t blk_rcv_buffer_size_high; }; /* see MHL2.0 spec section 5.9.1.2 */ struct SI_PACK_THIS_STRUCT MHL2_video_descriptor_t { uint8_t reserved_high; unsigned char frame_sequential:1; /*FB_SUPP*/ unsigned char top_bottom:1; /*TB_SUPP*/ unsigned char left_right:1; /*LR_SUPP*/ unsigned char reserved_low:5; }; struct MHL3_vdi_l_t { unsigned char frame_sequential:1; /*FB_SUPP*/ unsigned char top_bottom:1; /*TB_SUPP*/ unsigned char left_right:1; /*LR_SUPP*/ unsigned char reserved_low:5; }; struct MHL3_vdi_h_t { unsigned char reserved; }; /* see MHL3.0 spec section 5.11 */ struct SI_PACK_THIS_STRUCT MHL3_video_descriptor_t { /* VDI_H comes before VDI_L. See Table 5-5 */ struct MHL3_vdi_h_t vdi_h; struct MHL3_vdi_l_t vdi_l; }; struct SI_PACK_THIS_STRUCT MHL3_burst_header_t { struct MHL_burst_id_t burst_id; uint8_t checksum; uint8_t total_entries; uint8_t sequence_index; }; struct SI_PACK_THIS_STRUCT MHL2_video_format_data_t { struct MHL3_burst_header_t header; uint8_t num_entries_this_burst; struct MHL2_video_descriptor_t video_descriptors[5]; }; struct SI_PACK_THIS_STRUCT MHL3_hev_vic_descriptor_t { uint8_t reserved; uint8_t vic_cea861f; }; struct SI_PACK_THIS_STRUCT MHL3_hev_vic_data_t { struct MHL3_burst_header_t header; uint8_t num_entries_this_burst; struct MHL3_hev_vic_descriptor_t video_descriptors[5]; }; struct SI_PACK_THIS_STRUCT MHL3_hev_dtd_a_payload_t { struct MHL_high_low_t pixel_clock_in_MHz; struct MHL_high_low_t h_active_in_pixels; struct MHL_high_low_t h_blank_in_pixels; struct MHL_high_low_t h_front_porch_in_pixels; struct MHL_high_low_t h_sync_width_in_pixels; uint8_t h_flags; }; struct SI_PACK_THIS_STRUCT MHL3_hev_dtd_b_payload_t { struct MHL_high_low_t v_total_in_lines; uint8_t v_blank_in_lines; /* note 7 for table 5-16 is wrong */ uint8_t v_front_porch_in_lines; /* note 7 for table 5-16 is wrong */ uint8_t v_sync_width_in_lines; /* note 7 for table 5-16 is wrong */ uint8_t v_refresh_rate_in_fields_per_second; uint8_t v_flags; uint8_t reserved[4]; }; struct SI_PACK_THIS_STRUCT MHL3_hev_dtd_a_data_t { struct MHL3_burst_header_t header; struct MHL3_hev_dtd_a_payload_t payload; }; struct SI_PACK_THIS_STRUCT MHL3_hev_dtd_b_data_t { struct MHL3_burst_header_t header; struct MHL3_hev_dtd_b_payload_t payload; }; struct SI_PACK_THIS_STRUCT MHL3_hev_dtd_item_t { uint8_t sequence_index; struct MHL3_hev_dtd_a_payload_t a; struct MHL3_hev_dtd_b_payload_t b; struct MHL3_video_descriptor_t _3d_info; }; struct MHL3_hev_vic_item_t { struct MHL3_hev_vic_descriptor_t mhl3_hev_vic_descriptor; struct MHL3_video_descriptor_t _3d_info; }; struct MHL3_3d_vic_item_t { struct cea_short_descriptor_t svd; struct MHL3_video_descriptor_t _3d_info; }; struct MHL3_3d_dtd_item_t { uint8_t index; struct detailed_timing_descriptor_t dtd_cea_861; struct MHL3_video_descriptor_t _3d_info; }; struct SI_PACK_THIS_STRUCT MHL3_speaker_allocation_data_block_t { uint8_t cea861f_spkr_alloc[3]; }; struct SI_PACK_THIS_STRUCT MHL3_adt_payload_t { uint8_t format_flags; union { uint8_t short_descs[9]; struct MHL3_speaker_allocation_data_block_t spkr_alloc_db[3]; } descriptors; uint8_t reserved; }; struct SI_PACK_THIS_STRUCT MHL3_audio_delay_burst_t { struct MHL_burst_id_t burst_id; uint8_t checksum; uint8_t delay_h; uint8_t delay_m; uint8_t delay_l; uint8_t reserved[10]; }; struct SI_PACK_THIS_STRUCT MHL3_adt_data_t { struct MHL3_burst_header_t header; struct MHL3_adt_payload_t payload; }; struct SI_PACK_THIS_STRUCT MHL3_emsc_support_payload_t { struct MHL_burst_id_t burst_ids[5]; }; struct SI_PACK_THIS_STRUCT MHL3_emsc_support_data_t { struct MHL3_burst_header_t header; uint8_t num_entries_this_burst; struct MHL3_emsc_support_payload_t payload; }; enum view_pixel_fmt_e { VIEW_PIX_FMT_24BPP, VIEW_PIX_FMT_16BPP }; struct SI_PACK_THIS_STRUCT MHL3_bits_per_pixel_fmt_descriptor_t { uint8_t stream_id; uint8_t stream_pixel_format; }; struct SI_PACK_THIS_STRUCT MHL_bits_per_pixel_fmt_data_t { struct MHL3_burst_header_t header; uint8_t num_entries_this_burst; /* reserve 5 for use with WRITE_BURST actual length is variable, indicated by num_entries_this_burst */ /* todo change this to 1 when WRITE_BURST OPTION is removed */ struct MHL3_bits_per_pixel_fmt_descriptor_t descriptors[5]; }; union SI_PACK_THIS_STRUCT video_burst_descriptor_u { struct MHL2_video_descriptor_t mhl2_3d_descriptor; struct MHL3_video_descriptor_t mhl3_3d_descriptor; struct MHL3_hev_vic_descriptor_t mhl3_hev_vic_descriptor; struct MHL3_hev_dtd_item_t mhl3_hev_dtd; }; struct SI_PACK_THIS_STRUCT mhl3_vsif_t { VSIF_COMMON_FIELDS uint8_t pb4; uint8_t pb5_reserved; uint8_t pb6; struct MHL_high_low_t mhl_hev_fmt_type; uint8_t pb9; struct MHL_high_low_t av_delay_sync; }; /* the enum's in the following section are defined "in position" to avoid shifting on the fly */ #define MHL3_VSIF_TYPE 0x81 #define MHL3_VSIF_VERSION 0x03 #define IEEE_OUI_MHL 0x7CA61D #define PB4_MASK_MHL_VID_FMT 0x03 enum mhl_vid_fmt_e { mhl_vid_fmt_no_additional, mhl_vid_fmt_3d_fmt_present, mhl_vid_fmt_multi_view, mhl_vid_fmt_dual_3d }; #define PB4_MASK_MHL_3D_FMT_TYPE 0x1C enum mhl_3d_fmt_type_e { MHL_3D_FMT_TYPE_FS, /* Frame Sequential */ MHL_3D_FMT_TYPE_TB = 0x04, /* Top-Bottom */ MHL_3D_FMT_TYPE_LR = 0x08, /* Left-Right */ MHL_3D_FMT_TYPE_FS_TB = 0x0C, /* Frame Sequential Top-Bottom */ MHL_3D_FMT_TYPE_FS_LR = 0x10, /* Frame Sequential Left-Right */ MHL_3D_FMT_TYPE_TBLR = 0x14 /* Top-Bottom-Left-Right */ }; #define PB4_MASK_SEP_AUD 0x20 enum mhl_sep_audio_e { mhl_sep_audio_not_available, mhl_sep_audio_available = 0x20 }; #define PB4_MASK_RESERVED 0xC0 #define MHL3_VSIF_PB4(vid_fmt, _3d_fmt_type, sep_aud) \ (uint8_t)(((vid_fmt)&PB4_MASK_MHL_VID_FMT) | \ ((_3d_fmt_type)&PB4_MASK_MHL_3D_FMT_TYPE) | \ ((sep_aud)&PB4_MASK_SEP_AUD)) #define PB6_MASK_MHL_HEV_FMT 0x03 enum mhl_hev_fmt_e { mhl_hev_fmt_no_additional, mhl_hev_fmt_hev_present, mhl_hev_fmt_reserved_2, mhl_hev_fmt_reserved_3 }; #define PB6_MASK_RESERVED 0xFC #define MHL3_VSIF_PB6(hev_fmt) (uint8_t)((hev_fmt) & PB6_MASK_MHL_HEV_FMT) #define PB9_MASK_AV_DELAY_SYNC_19_16 0x0F #define PB9_MASK_AV_DELAY_DIR 0x10 enum mhl_av_delay_dir_e { mhl_av_delay_dir_audio_earlier, mhl_av_delay_dir_video_earlier = 0x10 }; #define PB9_MASK_RESERVED 0xE0 #define MHL3_VSIF_PB9(delay_sync, delay_dir) \ (uint8_t)((((delay_sync) >> 16) & PB9_MASK_AV_DELAY_SYNC_19_16) | \ ((delay_dir) & PB9_MASK_AV_DELAY_DIR)) struct SI_PACK_THIS_STRUCT info_frame_t { union { struct info_frame_header_t header; struct avi_info_frame_t avi; struct hdmi_vsif_t vendorSpecific; struct mhl3_vsif_t mhl3_vsif; struct unr_info_frame_t unr; } body; }; union SI_PACK_THIS_STRUCT vsif_mhl3_or_hdmi_u { struct SI_PACK_THIS_STRUCT vsif_common_header_t common; struct SI_PACK_THIS_STRUCT hdmi_vsif_t hdmi; struct SI_PACK_THIS_STRUCT mhl3_vsif_t mhl3; }; enum InfoFrameType_e { InfoFrameType_AVI, InfoFrameType_VendorSpecific, InfoFrameType_VendorSpecific_MHL3, InfoFrameType_Audio }; SI_POP_STRUCT_PACKING enum { MHL_MSC_MSG_RCP = 0x10, /* RCP sub-command */ MHL_MSC_MSG_RCPK = 0x11, /* RCP Acknowledge sub-command */ MHL_MSC_MSG_RCPE = 0x12, /* RCP Error sub-command */ MHL_MSC_MSG_RAP = 0x20, /* Mode Change Warning sub-command */ MHL_MSC_MSG_RAPK = 0x21, /* MCW Acknowledge sub-command */ MHL_MSC_MSG_RBP = 0x22, /* Remote Button Protocol sub-command */ MHL_MSC_MSG_RBPK = 0x23, /* RBP Acknowledge sub-command */ MHL_MSC_MSG_RBPE = 0x24, /* RBP Error sub-command */ MHL_MSC_MSG_UCP = 0x30, /* UCP sub-command */ MHL_MSC_MSG_UCPK = 0x31, /* UCP Acknowledge sub-command */ MHL_MSC_MSG_UCPE = 0x32, /* UCP Error sub-command */ MHL_MSC_MSG_RUSB = 0x40, /* Request USB host role */ MHL_MSC_MSG_RUSBK = 0x41, /* Acknowledge request for USB host role */ MHL_MSC_MSG_RHID = 0x42, /* Request HID host role */ MHL_MSC_MSG_RHIDK = 0x43, /* Acknowledge request for HID host role */ MHL_MSC_MSG_ATT = 0x50, /* Request attention sub-command */ MHL_MSC_MSG_ATTK = 0x51, /* ATT Acknowledge sub-command */ MHL_MSC_MSG_BIST_TRIGGER = 0x60, MHL_MSC_MSG_BIST_REQUEST_STAT = 0x61, MHL_MSC_MSG_BIST_READY = 0x62, MHL_MSC_MSG_BIST_STOP = 0x63, }; #define BIST_TRIGGER_E_CBUS_TX 0x01 #define BIST_TRIGGER_E_CBUS_RX 0x02 #define BIST_TRIGGER_E_CBUS_TYPE_MASK 0x08 #define BIST_TRIGGER_TEST_E_CBUS_S 0x00 #define BIST_TRIGGER_TEST_E_CBUS_D 0x08 #define BIST_TRIGGER_AVLINK_TX 0x10 #define BIST_TRIGGER_AVLINK_RX 0x20 #define BIST_TRIGGER_IMPEDANCE_TEST 0x40 #define BIST_TRIGGER_ECBUS_AV_LINK_MASK (BIST_TRIGGER_AVLINK_TX | \ BIST_TRIGGER_AVLINK_RX) #define BIST_TRIGGER_ECBUS_TX_RX_MASK (BIST_TRIGGER_E_CBUS_TX | \ BIST_TRIGGER_E_CBUS_RX) #define BIST_TRIGGER_OPERAND_VALID_MASK 0x7B #define BIST_READY_E_CBUS_READY 0x01 #define BIST_READY_AVLINK_READY 0x02 #define BIST_READY_TERM_READY 0x04 #define BIST_READY_E_CBUS_ERROR 0x10 #define BIST_READY_AVLINK_ERROR 0x20 #define BIST_READY_TERM_ERROR 0x40 #define RCPE_NO_ERROR 0x00 #define RCPE_INEFFECTIVE_KEY_CODE 0x01 #define RCPE_BUSY 0x02 #define MHL_RCP_KEY_RELEASED_MASK 0x80 #define MHL_RCP_KEY_ID_MASK 0x7F #define RBPE_NO_ERROR 0x00 #define RBPE_INEFFECTIVE_BUTTON_CODE 0x01 #define RBPE_BUSY 0x02 #define MHL_RBP_BUTTON_RELEASED_MASK 0x80 #define MHL_RBP_BUTTON_ID_MASK 0x7F #define T_PRESS_MODE 300 #define T_HOLD_MAINTAIN 2000 #define T_RAP_WAIT_MIN 100 #define T_RAP_WAIT_MAX 1000 enum { /* Command or Data byte acknowledge */ MHL_ACK = 0x33, /* Command or Data byte not acknowledge */ MHL_NACK = 0x34, /* Transaction abort */ MHL_ABORT = 0x35, /* Write one status register strip top bit */ MHL_WRITE_STAT = 0x60 | 0x80, /* Write one interrupt register */ MHL_SET_INT = 0x60, /* Read one register */ MHL_READ_DEVCAP_REG = 0x61, /* Read CBUS revision level from follower */ MHL_GET_STATE = 0x62, /* Read vendor ID value from follower */ MHL_GET_VENDOR_ID = 0x63, /* Set Hot Plug Detect in follower */ MHL_SET_HPD = 0x64, /* Clear Hot Plug Detect in follower */ MHL_CLR_HPD = 0x65, /* Set Capture ID for downstream device */ MHL_SET_CAP_ID = 0x66, /* Get Capture ID from downstream device */ MHL_GET_CAP_ID = 0x67, /* VS command to send RCP sub-commands */ MHL_MSC_MSG = 0x68, /* Get Vendor-Specific command error code */ MHL_GET_SC1_ERRORCODE = 0x69, /* Get DDC channel command error code */ MHL_GET_DDC_ERRORCODE = 0x6A, /* Get MSC command error code */ MHL_GET_MSC_ERRORCODE = 0x6B, /* Write 1-16 bytes to responder's scratchpad */ MHL_WRITE_BURST = 0x6C, /* Get channel 3 command error code */ MHL_GET_SC3_ERRORCODE = 0x6D, /* Write one extended status register */ MHL_WRITE_XSTAT = 0x70, /* Read one extended devcap register */ MHL_READ_XDEVCAP_REG = 0x71, /* let the rest of these float, they are software specific */ MHL_READ_EDID_BLOCK, MHL_SEND_3D_REQ_OR_FEAT_REQ, MHL_READ_DEVCAP, MHL_READ_XDEVCAP }; /* RAP action codes */ #define MHL_RAP_POLL 0x00 /* Just do an ack */ #define MHL_RAP_CONTENT_ON 0x10 /* Turn content stream ON */ #define MHL_RAP_CONTENT_OFF 0x11 /* Turn content stream OFF */ #define MHL_RAP_CBUS_MODE_DOWN 0x20 #define MHL_RAP_CBUS_MODE_UP 0x21 /* RAPK status codes */ #define MHL_RAPK_NO_ERR 0x00 /* RAP action recognized & supported */ #define MHL_RAPK_UNRECOGNIZED 0x01 /* Unknown RAP action code received */ #define MHL_RAPK_UNSUPPORTED 0x02 /* Rcvd RAP action code not supported */ #define MHL_RAPK_BUSY 0x03 /* Responder too busy to respond */ /* * Error status codes for RCPE messages */ /* No error. (Not allowed in RCPE messages) */ #define MHL_RCPE_STATUS_NO_ERROR 0x00 /* Unsupported/unrecognized key code */ #define MHL_RCPE_STATUS_INEFFECTIVE_KEY_CODE 0x01 /* Responder busy. Initiator may retry message */ #define MHL_RCPE_STATUS_BUSY 0x02 /* * Error status codes for RBPE messages */ /* No error. (Not allowed in RBPE messages) */ #define MHL_RBPE_STATUS_NO_ERROR 0x00 /* Unsupported/unrecognized button code */ #define MHL_RBPE_STATUS_INEFFECTIVE_BUTTON_CODE 0x01 /* Responder busy. Initiator may retry message */ #define MHL_RBPE_STATUS_BUSY 0x02 /* * Error status codes for UCPE messages */ /* No error. (Not allowed in UCPE messages) */ #define MHL_UCPE_STATUS_NO_ERROR 0x00 /* Unsupported/unrecognized key code */ #define MHL_UCPE_STATUS_INEFFECTIVE_KEY_CODE 0x01 /* Extended Device Capability Registers 7.12.1 */ enum { XDEVCAP_START = 0x80, XDEVCAP_ADDR_ECBUS_SPEEDS = XDEVCAP_START, XDEVCAP_ADDR_TMDS_SPEEDS = 0x81, XDEVCAP_ADDR_ECBUS_DEV_ROLES = 0x82, XDEVCAP_ADDR_LOG_DEV_MAPX = 0x83, XDEVCAP_LIMIT, /* don't hard-code this one */ XDEVCAP_ADDR_RESERVED_4 = 0x84, XDEVCAP_ADDR_RESERVED_5 = 0x85, XDEVCAP_ADDR_RESERVED_6 = 0x86, XDEVCAP_ADDR_RESERVED_7 = 0x87, XDEVCAP_ADDR_RESERVED_8 = 0x88, XDEVCAP_ADDR_RESERVED_9 = 0x89, XDEVCAP_ADDR_RESERVED_A = 0x8A, XDEVCAP_ADDR_RESERVED_B = 0x8B, XDEVCAP_ADDR_RESERVED_C = 0x8C, XDEVCAP_ADDR_RESERVED_D = 0x8D, XDEVCAP_ADDR_RESERVED_E = 0x8E, XDEVCAP_ADDR_RESERVED_F = 0x8F, XDEVCAP_ADDR_LAST, /* this one must be last */ XDEVCAP_SIZE = XDEVCAP_ADDR_LAST - XDEVCAP_START }; #define XDEVCAP_OFFSET(reg) (reg - XDEVCAP_ADDR_ECBUS_SPEEDS) SI_PUSH_STRUCT_PACKING struct SI_PACK_THIS_STRUCT MHLXDevCap_t { uint8_t ecbus_speeds; uint8_t tmds_speeds; uint8_t ecbus_dev_roles; uint8_t log_dev_mapx; uint8_t reserved_4; uint8_t reserved_5; uint8_t reserved_6; uint8_t reserved_7; uint8_t reserved_8; uint8_t reserved_9; uint8_t reserved_a; uint8_t reserved_b; uint8_t reserved_c; uint8_t reserved_d; uint8_t reserved_e; uint8_t reserved_f; }; union MHLXDevCap_u { struct MHLXDevCap_t mxdc; uint8_t xdevcap_cache[XDEVCAP_SIZE]; }; SI_POP_STRUCT_PACKING /* XDEVCAP - eCBUS Speeds 7.12.1.1 */ #define MHL_XDC_ECBUS_S_075 0x01 #define MHL_XDC_ECBUS_S_8BIT 0x02 #define MHL_XDC_ECBUS_S_12BIT 0x04 #define MHL_XDC_ECBUS_D_150 0x10 #define MHL_XDC_ECBUS_D_8BIT 0x20 /* XDEVCAP - TMDS Speeds 7.12.1.2 */ #define MHL_XDC_TMDS_000 0x00 #define MHL_XDC_TMDS_150 0x01 #define MHL_XDC_TMDS_300 0x02 #define MHL_XDC_TMDS_600 0x04 /* XDEVCAP - Device Roles 7.12.1.3 */ #define MHL_XDC_DEV_HOST 0x01 #define MHL_XDC_DEV_DEVICE 0x02 #define MHL_XDC_DEV_CHARGER 0x04 #define MHL_XDC_HID_HOST 0x08 #define MHL_XDC_HID_DEVICE 0x10 /* XDEVCAP - Extended Logical Device Map 7.12.1.4 */ #define MHL_XDC_LD_PHONE 0x01 /* Extended Device Status Registers 7.12.2 */ enum { XDEVSTAT_OFFSET_CURR_ECBUS_MODE, XDEVSTAT_OFFSET_AVLINK_MODE_STATUS, XDEVSTAT_OFFSET_AVLINK_MODE_CONTROL, XDEVSTAT_OFFSET_MULTI_SINK_STATUS, XDEVSTAT_OFFSET_RESERVED_04, XDEVSTAT_OFFSET_RESERVED_05, XDEVSTAT_OFFSET_RESERVED_06, XDEVSTAT_OFFSET_RESERVED_07, XDEVSTAT_OFFSET_RESERVED_08, XDEVSTAT_OFFSET_RESERVED_09, XDEVSTAT_OFFSET_RESERVED_0A, XDEVSTAT_OFFSET_RESERVED_0B, XDEVSTAT_OFFSET_RESERVED_0C, XDEVSTAT_OFFSET_RESERVED_0D, XDEVSTAT_OFFSET_RESERVED_0E, XDEVSTAT_OFFSET_RESERVED_0F, XDEVSTAT_OFFSET_RESERVED_10, XDEVSTAT_OFFSET_RESERVED_11, XDEVSTAT_OFFSET_RESERVED_12, XDEVSTAT_OFFSET_RESERVED_13, XDEVSTAT_OFFSET_RESERVED_14, XDEVSTAT_OFFSET_RESERVED_15, XDEVSTAT_OFFSET_RESERVED_16, XDEVSTAT_OFFSET_RESERVED_17, XDEVSTAT_OFFSET_RESERVED_18, XDEVSTAT_OFFSET_RESERVED_19, XDEVSTAT_OFFSET_RESERVED_1A, XDEVSTAT_OFFSET_RESERVED_1B, XDEVSTAT_OFFSET_RESERVED_1C, XDEVSTAT_OFFSET_RESERVED_1D, XDEVSTAT_OFFSET_RESERVED_1E, XDEVSTAT_OFFSET_RESERVED_1F, /* this one must be last */ XDEVSTAT_SIZE }; /* XDEVSTAT - Current eCBUS Mode 7.12.2.1 */ #define MHL_XSTATUS_REG_CBUS_MODE 0x90 #define MHL_XDS_SLOT_MODE_8BIT 0x00 #define MHL_XDS_SLOT_MODE_6BIT 0x01 #define MHL_XDS_ECBUS_S 0x04 #define MHL_XDS_ECBUS_D 0x08 #define MHL_XDS_LINK_CLOCK_75MHZ 0x00 #define MHL_XDS_LINK_CLOCK_150MHZ 0x10 #define MHL_XDS_LINK_CLOCK_300MHZ 0x20 #define MHL_XDS_LINK_CLOCK_600MHZ 0x30 /* XDEVSTAT - AV Link Mode Status 7.12.2.2 */ #define MHL_XDS_LINK_STATUS_NO_SIGNAL 0x00 #define MHL_XDS_LINK_STATUS_CRU_LOCKED 0x01 #define MHL_XDS_LINK_STATUS_TMDS_NORMAL 0x02 #define MHL_XDS_LINK_STATUS_TMDS_RESERVED 0x03 /* XDEVSTAT - AV Link Mode Control 7.12.2.3 */ #define MHL_STATUS_REG_AV_LINK_MODE_CONTROL 0x92 #define MHL_XDS_LINK_RATE_1_5_GBPS 0x00 #define MHL_XDS_LINK_RATE_3_0_GBPS 0x01 #define MHL_XDS_LINK_RATE_6_0_GBPS 0x02 #define MHL_XDS_ATT_CAPABLE 0x08 /* XDEVSTAT - Multi-Sink Status 7.12.2.4 */ #define MHL_XDS_SINK_STATUS_1_HPD_LOW 0x00 #define MHL_XDS_SINK_STATUS_1_HPD_HIGH 0x01 #define MHL_XDS_SINK_STATUS_2_HPD_LOW 0x00 #define MHL_XDS_SINK_STATUS_2_HPD_HIGH 0x04 #define MHL_XDS_SINK_STATUS_3_HPD_LOW 0x00 #define MHL_XDS_SINK_STATUS_3_HPD_HIGH 0x10 #define MHL_XDS_SINK_STATUS_4_HPD_LOW 0x00 #define MHL_XDS_SINK_STATUS_4_HPD_HIGH 0x40 /* * Define format of Write Burst used in MHL 3 * to assign TDM slots to virtual channels. */ struct SI_PACK_THIS_STRUCT virt_chan_info { uint8_t vc_num; uint8_t feature_id; #define FEATURE_ID_E_MSC 0x00 #define FEATURE_ID_USB 0x01 #define FEATURE_ID_AUDIO 0x02 #define FEATURE_ID_IP 0x03 #define FEATURE_ID_COMP_VIDEO 0x04 #define FEATURE_ID_HID 0x05 #define FEATURE_ID_LAST FEATURE_ID_HID union { uint8_t channel_size; uint8_t response; #define VC_RESPONSE_ACCEPT 0x00 #define VC_RESPONSE_BAD_VC_NUM 0x01 #define VC_RESPONSE_BAD_FEATURE_ID 0x02 #define VC_RESPONSE_BAD_CHANNEL_SIZE 0x03 } req_resp; }; #define MAX_VC_ENTRIES 3 struct SI_PACK_THIS_STRUCT tdm_alloc_burst { struct MHL3_burst_header_t header; uint8_t num_entries_this_burst; struct virt_chan_info vc_info[MAX_VC_ENTRIES]; uint8_t reserved; }; /* BIST_SETUP WRITE_BURST 15.1.1 */ #define BIST_ECBUS_PATTERN_UNSPECIFIED 0x00 #define BIST_ECBUS_PATTERN_PRBS 0x01 #define BIST_ECBUS_PATTERN_FIXED_8 0x02 #define BIST_ECBUS_PATTERN_FIXED_10 0x03 #define BIST_ECBUS_PATTERN_MAX BIST_ECBUS_PATTERN_FIXED_10 #define BIST_AVLINK_DATA_RATE_UNSPECIFIED 0x00 #define BIST_AVLINK_DATA_RATE_1500MBPS 0x01 #define BIST_AVLINK_DATA_RATE_3000MBPS 0x02 #define BIST_AVLINK_DATA_RATE_6000MBPS 0x03 #define BIST_AVLINK_DATA_RATE_MAX BIST_AVLINK_DATA_RATE_6000MBPS #define BIST_AVLINK_PATTERN_UNSPECIFIED 0x00 #define BIST_AVLINK_PATTERN_PRBS 0x01 #define BIST_AVLINK_PATTERN_FIXED_8 0x02 #define BIST_AVLINK_PATTERN_FIXED_10 0x03 #define BIST_AVLINK_PATTERN_MAX BIST_AVLINK_PATTERN_FIXED_10 #define BIST_IMPEDANCE_MODE_AVLINK_TX_LOW 0x00 #define BIST_IMPEDANCE_MODE_AVLINK_TX_HIGH 0x01 #define BIST_IMPEDANCE_MODE_AVLINK_RX 0x02 #define BIST_IMPEDANCE_MODE_RESERVED_1 0x03 #define BIST_IMPEDANCE_MODE_ECBUS_D_TX_LOW 0x04 #define BIST_IMPEDANCE_MODE_ECBUS_D_TX_HIGH 0x05 #define BIST_IMPEDANCE_MODE_ECBUS_D_RX 0x06 #define BIST_IMPEDANCE_MODE_RESERVED_2 0x07 #define BIST_IMPEDANCE_MODE_ECBUS_S_TX_LOW 0x08 #define BIST_IMPEDANCE_MODE_ECBUS_S_TX_HIGH 0x09 #define BIST_IMPEDANCE_MODE_ECBUS_S_RX 0x0A #define BIST_IMPEDANCE_MODE_MAX BIST_IMPEDANCE_MODE_ECBUS_S_RX struct SI_PACK_THIS_STRUCT bist_setup_burst { uint8_t burst_id_h; uint8_t burst_id_l; uint8_t checksum; uint8_t e_cbus_duration; uint8_t e_cbus_pattern; uint8_t e_cbus_fixed_h; uint8_t e_cbus_fixed_l; uint8_t reserved; uint8_t avlink_data_rate; uint8_t avlink_pattern; uint8_t avlink_video_mode; uint8_t avlink_duration; uint8_t avlink_fixed_h; uint8_t avlink_fixed_l; uint8_t avlink_randomizer; uint8_t impedance_mode; }; /* BIST_RETURN_STAT WRITE_BURST 15.1.2 */ struct SI_PACK_THIS_STRUCT bist_return_stat_burst { uint8_t burst_id_h; uint8_t burst_id_l; uint8_t checksum; uint8_t reserved[9]; uint8_t e_cbus_stat_h; uint8_t e_cbus_stat_l; uint8_t avlink_stat_h; uint8_t avlink_stat_l; }; struct SI_PACK_THIS_STRUCT bist_discard_burst_hdr { struct MHL_burst_id_t burst_id; uint8_t remaining_length; }; struct SI_PACK_THIS_STRUCT bist_discard_burst { struct bist_discard_burst_hdr hdr; uint8_t payload[13]; }; struct SI_PACK_THIS_STRUCT bist_echo_request_burst_hdr { struct MHL_burst_id_t burst_id; uint8_t remaining_length; }; struct SI_PACK_THIS_STRUCT bist_echo_request_burst { struct bist_echo_request_burst_hdr hdr; uint8_t payload[13]; }; struct SI_PACK_THIS_STRUCT bist_echo_response_burst_hdr { struct MHL_burst_id_t burst_id; uint8_t remaining_length; }; struct SI_PACK_THIS_STRUCT bist_echo_response_burst { struct bist_echo_response_burst_hdr hdr; uint8_t payload[13]; }; struct SI_PACK_THIS_STRUCT si_adopter_id_sub_payload_hdr { struct MHL_burst_id_t burst_id; uint8_t remaining_length; uint8_t checksum; uint8_t op_code; }; enum si_adopter_id_opcode { EDID_BLOCK = 0, EDID_STOP = 1, }; struct SI_PACK_THIS_STRUCT si_opcode_data_edid_block { uint8_t block_num; uint8_t data[128]; }; struct SI_PACK_THIS_STRUCT si_adopter_id_data { struct SI_PACK_THIS_STRUCT si_adopter_id_sub_payload_hdr hdr; union { struct SI_PACK_THIS_STRUCT si_opcode_data_edid_block edid_blk; /* more members to come later */ } opcode_data; }; #define MHL_T_src_vbus_cbus_stable_min 100 #define T_BIST_MODE_DOWN_MAX 5000 #define T_BIST_MODE_DOWN_MIN 2000 #endif