| /* SPDX-License-Identifier: GPL-2.0+ */ |
| /* |
| * logicore_dp_tx_regif.h |
| * |
| * Register interface definition for XILINX LogiCore DisplayPort v6.1 TX |
| * (Source) based on Xilinx dp_v3_1 driver sources |
| * |
| * (C) Copyright 2016 |
| * Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc |
| */ |
| |
| #ifndef __GDSYS_LOGICORE_DP_TX_REGIF_H__ |
| #define __GDSYS_LOGICORE_DP_TX_REGIF_H__ |
| |
| enum { |
| /* link configuration field */ |
| REG_LINK_BW_SET = 0x000, |
| REG_LANE_COUNT_SET = 0x004, |
| REG_ENHANCED_FRAME_EN = 0x008, |
| REG_TRAINING_PATTERN_SET = 0x00C, |
| REG_LINK_QUAL_PATTERN_SET = 0x010, |
| REG_SCRAMBLING_DISABLE = 0x014, |
| REG_DOWNSPREAD_CTRL = 0x018, |
| REG_SOFT_RESET = 0x01C, |
| }; |
| |
| enum { |
| /* core enables */ |
| REG_ENABLE = 0x080, |
| REG_ENABLE_MAIN_STREAM = 0x084, |
| REG_ENABLE_SEC_STREAM = 0x088, |
| REG_FORCE_SCRAMBLER_RESET = 0x0C0, |
| REG_MST_CONFIG = 0x0D0, |
| REG_LINE_RESET_DISABLE = 0x0F0, |
| }; |
| |
| enum { |
| /* core ID */ |
| REG_VERSION = 0x0F8, |
| REG_CORE_ID = 0x0FC, |
| }; |
| |
| enum { |
| /* AUX channel interface */ |
| REG_AUX_CMD = 0x100, |
| REG_AUX_WRITE_FIFO = 0x104, |
| REG_AUX_ADDRESS = 0x108, |
| REG_AUX_CLK_DIVIDER = 0x10C, |
| REG_USER_FIFO_OVERFLOW = 0x110, |
| REG_INTERRUPT_SIG_STATE = 0x130, |
| REG_AUX_REPLY_DATA = 0x134, |
| REG_AUX_REPLY_CODE = 0x138, |
| REG_AUX_REPLY_COUNT = 0x13C, |
| REG_INTERRUPT_STATUS = 0x140, |
| REG_INTERRUPT_MASK = 0x144, |
| REG_REPLY_DATA_COUNT = 0x148, |
| REG_REPLY_STATUS = 0x14C, |
| REG_HPD_DURATION = 0x150, |
| }; |
| |
| enum { |
| /* main stream attributes for SST / MST STREAM1 */ |
| REG_STREAM1_MSA_START = 0x180, |
| REG_MAIN_STREAM_HTOTAL = 0x180, |
| REG_MAIN_STREAM_VTOTAL = 0x184, |
| REG_MAIN_STREAM_POLARITY = 0x188, |
| REG_MAIN_STREAM_HSWIDTH = 0x18C, |
| REG_MAIN_STREAM_VSWIDTH = 0x190, |
| REG_MAIN_STREAM_HRES = 0x194, |
| REG_MAIN_STREAM_VRES = 0x198, |
| REG_MAIN_STREAM_HSTART = 0x19C, |
| REG_MAIN_STREAM_VSTART = 0x1A0, |
| REG_MAIN_STREAM_MISC0 = 0x1A4, |
| REG_MAIN_STREAM_MISC1 = 0x1A8, |
| REG_M_VID = 0x1AC, |
| REG_TU_SIZE = 0x1B0, |
| REG_N_VID = 0x1B4, |
| REG_USER_PIXEL_WIDTH = 0x1B8, |
| REG_USER_DATA_COUNT_PER_LANE = 0x1BC, |
| REG_MAIN_STREAM_INTERLACED = 0x1C0, |
| REG_MIN_BYTES_PER_TU = 0x1C4, |
| REG_FRAC_BYTES_PER_TU = 0x1C8, |
| REG_INIT_WAIT = 0x1CC, |
| REG_STREAM1 = 0x1D0, |
| REG_STREAM2 = 0x1D4, |
| REG_STREAM3 = 0x1D8, |
| REG_STREAM4 = 0x1DC, |
| }; |
| |
| enum { |
| /* PHY configuration status */ |
| REG_PHY_CONFIG = 0x200, |
| REG_PHY_VOLTAGE_DIFF_LANE_0 = 0x220, |
| REG_PHY_VOLTAGE_DIFF_LANE_1 = 0x224, |
| REG_PHY_VOLTAGE_DIFF_LANE_2 = 0x228, |
| REG_PHY_VOLTAGE_DIFF_LANE_3 = 0x22C, |
| REG_PHY_TRANSMIT_PRBS7 = 0x230, |
| REG_PHY_CLOCK_SELECT = 0x234, |
| REG_PHY_POWER_DOWN = 0x238, |
| REG_PHY_PRECURSOR_LANE_0 = 0x23C, |
| REG_PHY_PRECURSOR_LANE_1 = 0x240, |
| REG_PHY_PRECURSOR_LANE_2 = 0x244, |
| REG_PHY_PRECURSOR_LANE_3 = 0x248, |
| REG_PHY_POSTCURSOR_LANE_0 = 0x24C, |
| REG_PHY_POSTCURSOR_LANE_1 = 0x250, |
| REG_PHY_POSTCURSOR_LANE_2 = 0x254, |
| REG_PHY_POSTCURSOR_LANE_3 = 0x258, |
| REG_PHY_STATUS = 0x280, |
| REG_GT_DRP_COMMAND = 0x2A0, |
| REG_GT_DRP_READ_DATA = 0x2A4, |
| REG_GT_DRP_CHANNEL_STATUS = 0x2A8, |
| }; |
| |
| enum { |
| /* DisplayPort audio */ |
| REG_AUDIO_CONTROL = 0x300, |
| REG_AUDIO_CHANNELS = 0x304, |
| REG_AUDIO_INFO_DATA = 0x308, |
| REG_AUDIO_MAUD = 0x328, |
| REG_AUDIO_NAUD = 0x32C, |
| REG_AUDIO_EXT_DATA = 0x330, |
| }; |
| |
| enum { |
| /* HDCP */ |
| REG_HDCP_ENABLE = 0x400, |
| }; |
| |
| enum { |
| /* main stream attributes for MST STREAM2, 3, and 4 */ |
| REG_STREAM2_MSA_START = 0x500, |
| REG_STREAM3_MSA_START = 0x550, |
| REG_STREAM4_MSA_START = 0x5A0, |
| |
| REG_VC_PAYLOAD_BUFFER_ADDR = 0x800, |
| }; |
| |
| enum { |
| LINK_BW_SET_162GBPS = 0x06, |
| LINK_BW_SET_270GBPS = 0x0A, |
| LINK_BW_SET_540GBPS = 0x14, |
| }; |
| |
| enum { |
| LANE_COUNT_SET_1 = 0x1, |
| LANE_COUNT_SET_2 = 0x2, |
| LANE_COUNT_SET_4 = 0x4, |
| }; |
| |
| enum { |
| TRAINING_PATTERN_SET_OFF = 0x0, |
| /* training pattern 1 used for clock recovery */ |
| TRAINING_PATTERN_SET_TP1 = 0x1, |
| /* training pattern 2 used for channel equalization */ |
| TRAINING_PATTERN_SET_TP2 = 0x2, |
| /* |
| * training pattern 3 used for channel equalization for cores with DP |
| * v1.2 |
| */ |
| TRAINING_PATTERN_SET_TP3 = 0x3, |
| }; |
| |
| enum { |
| LINK_QUAL_PATTERN_SET_OFF = 0x0, |
| /* D10.2 unscrambled test pattern transmitted */ |
| LINK_QUAL_PATTERN_SET_D102_TEST = 0x1, |
| /* symbol error rate measurement pattern transmitted */ |
| LINK_QUAL_PATTERN_SET_SER_MES = 0x2, |
| /* pseudo random bit sequence 7 transmitted */ |
| LINK_QUAL_PATTERN_SET_PRBS7 = 0x3, |
| }; |
| |
| enum { |
| SOFT_RESET_VIDEO_STREAM1_MASK = 0x00000001, |
| SOFT_RESET_VIDEO_STREAM2_MASK = 0x00000002, |
| SOFT_RESET_VIDEO_STREAM3_MASK = 0x00000004, |
| SOFT_RESET_VIDEO_STREAM4_MASK = 0x00000008, |
| SOFT_RESET_AUX_MASK = 0x00000080, |
| SOFT_RESET_VIDEO_STREAM_ALL_MASK = 0x0000000F, |
| }; |
| |
| enum { |
| MST_CONFIG_MST_EN_MASK = 0x00000001, |
| }; |
| |
| enum { |
| LINE_RESET_DISABLE_MASK = 0x1, |
| }; |
| |
| #define AUX_CMD_NBYTES_TRANSFER_MASK 0x0000000F |
| |
| #define AUX_CMD_SHIFT 8 |
| #define AUX_CMD_MASK 0x00000F00 |
| enum { |
| AUX_CMD_I2C_WRITE = 0x0, |
| AUX_CMD_I2C_READ = 0x1, |
| AUX_CMD_I2C_WRITE_STATUS = 0x2, |
| AUX_CMD_I2C_WRITE_MOT = 0x4, |
| AUX_CMD_I2C_READ_MOT = 0x5, |
| AUX_CMD_I2C_WRITE_STATUS_MOT = 0x6, |
| AUX_CMD_WRITE = 0x8, |
| AUX_CMD_READ = 0x9, |
| }; |
| |
| #define AUX_CLK_DIVIDER_VAL_MASK 0x00FF |
| |
| #define AUX_CLK_DIVIDER_AUX_SIG_WIDTH_FILT_SHIFT 8 |
| #define AUX_CLK_DIVIDER_AUX_SIG_WIDTH_FILT_MASK 0xFF00 |
| |
| enum { |
| INTERRUPT_SIG_STATE_HPD_STATE_MASK = 0x00000001, |
| INTERRUPT_SIG_STATE_REQUEST_STATE_MASK = 0x00000002, |
| INTERRUPT_SIG_STATE_REPLY_STATE_MASK = 0x00000004, |
| INTERRUPT_SIG_STATE_REPLY_TIMEOUT_MASK = 0x00000008, |
| }; |
| |
| enum { |
| AUX_REPLY_CODE_ACK = 0x0, |
| AUX_REPLY_CODE_I2C_ACK = 0x0, |
| AUX_REPLY_CODE_NACK = 0x1, |
| AUX_REPLY_CODE_DEFER = 0x2, |
| AUX_REPLY_CODE_I2C_NACK = 0x4, |
| AUX_REPLY_CODE_I2C_DEFER = 0x8, |
| }; |
| |
| enum { |
| INTERRUPT_STATUS_HPD_IRQ_MASK = 0x00000001, |
| INTERRUPT_STATUS_HPD_EVENT_MASK = 0x00000002, |
| INTERRUPT_STATUS_REPLY_RECEIVED_MASK = 0x00000004, |
| INTERRUPT_STATUS_REPLY_TIMEOUT_MASK = 0x00000008, |
| INTERRUPT_STATUS_HPD_PULSE_DETECTED_MASK = 0x00000010, |
| INTERRUPT_STATUS_EXT_PKT_TXD_MASK = 0x00000020, |
| }; |
| |
| enum { |
| INTERRUPT_MASK_HPD_IRQ_MASK = 0x00000001, |
| INTERRUPT_MASK_HPD_EVENT_MASK = 0x00000002, |
| INTERRUPT_MASK_REPLY_RECEIVED_MASK = 0x00000004, |
| INTERRUPT_MASK_REPLY_TIMEOUT_MASK = 0x00000008, |
| INTERRUPT_MASK_HPD_PULSE_DETECTED_MASK = 0x00000010, |
| INTERRUPT_MASK_EXT_PKT_TXD_MASK = 0x00000020, |
| }; |
| |
| #define REPLY_STATUS_REPLY_STATUS_STATE_SHIFT 4 |
| #define REPLY_STATUS_REPLY_STATUS_STATE_MASK 0x00000FF0 |
| enum { |
| REPLY_STATUS_REPLY_RECEIVED_MASK = 0x00000001, |
| REPLY_STATUS_REPLY_IN_PROGRESS_MASK = 0x00000002, |
| REPLY_STATUS_REQUEST_IN_PROGRESS_MASK = 0x00000004, |
| REPLY_STATUS_REPLY_ERROR_MASK = 0x00000008, |
| }; |
| |
| #define MAIN_STREAMX_POLARITY_VSYNC_POL_SHIFT 1 |
| enum { |
| MAIN_STREAMX_POLARITY_HSYNC_POL_MASK = 0x00000001, |
| MAIN_STREAMX_POLARITY_VSYNC_POL_MASK = 0x00000002, |
| }; |
| |
| enum { |
| MAIN_STREAMX_MISC0_SYNC_CLK_MASK = 0x00000001, |
| }; |
| |
| #define MAIN_STREAMX_MISC0_COMPONENT_FORMAT_SHIFT 1 |
| #define MAIN_STREAMX_MISC0_COMPONENT_FORMAT_MASK 0x00000006 |
| enum { |
| MAIN_STREAMX_MISC0_COMPONENT_FORMAT_RGB = 0x0, |
| MAIN_STREAMX_MISC0_COMPONENT_FORMAT_YCBCR422 = 0x1, |
| MAIN_STREAMX_MISC0_COMPONENT_FORMAT_YCBCR444 = 0x2, |
| }; |
| |
| #define MAIN_STREAMX_MISC0_DYNAMIC_RANGE_SHIFT 3 |
| #define MAIN_STREAMX_MISC0_DYNAMIC_RANGE_MASK 0x00000008 |
| |
| #define MAIN_STREAMX_MISC0_YCBCR_COLORIMETRY_SHIFT 4 |
| #define MAIN_STREAMX_MISC0_YCBCR_COLORIMETRY_MASK 0x00000010 |
| |
| #define MAIN_STREAMX_MISC0_BDC_SHIFT 5 |
| #define MAIN_STREAMX_MISC0_BDC_MASK 0x000000E0 |
| enum { |
| MAIN_STREAMX_MISC0_BDC_6BPC = 0x0, |
| MAIN_STREAMX_MISC0_BDC_8BPC = 0x1, |
| MAIN_STREAMX_MISC0_BDC_10BPC = 0x2, |
| MAIN_STREAMX_MISC0_BDC_12BPC = 0x3, |
| MAIN_STREAMX_MISC0_BDC_16BPC = 0x4, |
| }; |
| |
| enum { |
| PHY_CONFIG_PHY_RESET_ENABLE_MASK = 0x0000000, |
| PHY_CONFIG_PHY_RESET_MASK = 0x0000001, |
| PHY_CONFIG_GTTX_RESET_MASK = 0x0000002, |
| PHY_CONFIG_GT_ALL_RESET_MASK = 0x0000003, |
| PHY_CONFIG_TX_PHY_PMA_RESET_MASK = 0x0000100, |
| PHY_CONFIG_TX_PHY_PCS_RESET_MASK = 0x0000200, |
| PHY_CONFIG_TX_PHY_POLARITY_MASK = 0x0000800, |
| PHY_CONFIG_TX_PHY_PRBSFORCEERR_MASK = 0x0001000, |
| PHY_CONFIG_TX_PHY_POLARITY_IND_LANE_MASK = 0x0010000, |
| PHY_CONFIG_TX_PHY_POLARITY_LANE0_MASK = 0x0020000, |
| PHY_CONFIG_TX_PHY_POLARITY_LANE1_MASK = 0x0040000, |
| PHY_CONFIG_TX_PHY_POLARITY_LANE2_MASK = 0x0080000, |
| PHY_CONFIG_TX_PHY_POLARITY_LANE3_MASK = 0x0100000, |
| PHY_CONFIG_TX_PHY_8B10BEN_MASK = 0x0200000, |
| }; |
| |
| #define PHY_CONFIG_TX_PHY_LOOPBACK_SHIFT 13 |
| #define PHY_CONFIG_TX_PHY_LOOPBACK_MASK 0x000E000 |
| |
| enum { |
| PHY_CLOCK_SELECT_162GBPS = 0x1, |
| PHY_CLOCK_SELECT_270GBPS = 0x3, |
| PHY_CLOCK_SELECT_540GBPS = 0x5, |
| }; |
| |
| enum { |
| VS_LEVEL_0 = 0x2, |
| VS_LEVEL_1 = 0x5, |
| VS_LEVEL_2 = 0x8, |
| VS_LEVEL_3 = 0xF, |
| VS_LEVEL_OFFSET = 0x4, |
| }; |
| |
| enum { |
| PE_LEVEL_0 = 0x00, |
| PE_LEVEL_1 = 0x0E, |
| PE_LEVEL_2 = 0x14, |
| PE_LEVEL_3 = 0x1B, |
| }; |
| |
| enum { |
| PHY_STATUS_RESET_LANE_2_3_DONE_SHIFT = 2, |
| PHY_STATUS_TX_ERROR_LANE_0_SHIFT = 18, |
| PHY_STATUS_TX_BUFFER_STATUS_LANE_1_SHIFT = 20, |
| PHY_STATUS_TX_ERROR_LANE_1_SHIFT = 22, |
| PHY_STATUS_TX_BUFFER_STATUS_LANE_0_SHIFT = 16, |
| PHY_STATUS_TX_BUFFER_STATUS_LANE_2_SHIFT = 24, |
| PHY_STATUS_TX_ERROR_LANE_2_SHIFT = 26, |
| PHY_STATUS_TX_BUFFER_STATUS_LANE_3_SHIFT = 28, |
| PHY_STATUS_TX_ERROR_LANE_3_SHIFT = 30, |
| }; |
| |
| enum { |
| PHY_STATUS_RESET_LANE_0_DONE_MASK = 0x00000001, |
| PHY_STATUS_RESET_LANE_1_DONE_MASK = 0x00000002, |
| PHY_STATUS_RESET_LANE_2_3_DONE_MASK = 0x0000000C, |
| PHY_STATUS_PLL_LANE0_1_LOCK_MASK = 0x00000010, |
| PHY_STATUS_PLL_LANE2_3_LOCK_MASK = 0x00000020, |
| PHY_STATUS_PLL_FABRIC_LOCK_MASK = 0x00000040, |
| PHY_STATUS_TX_BUFFER_STATUS_LANE_0_MASK = 0x00030000, |
| PHY_STATUS_TX_ERROR_LANE_0_MASK = 0x000C0000, |
| PHY_STATUS_TX_BUFFER_STATUS_LANE_1_MASK = 0x00300000, |
| PHY_STATUS_TX_ERROR_LANE_1_MASK = 0x00C00000, |
| PHY_STATUS_TX_BUFFER_STATUS_LANE_2_MASK = 0x03000000, |
| PHY_STATUS_TX_ERROR_LANE_2_MASK = 0x0C000000, |
| PHY_STATUS_TX_BUFFER_STATUS_LANE_3_MASK = 0x30000000, |
| PHY_STATUS_TX_ERROR_LANE_3_MASK = 0xC0000000, |
| }; |
| |
| #define PHY_STATUS_LANE_0_READY_MASK \ |
| (PHY_STATUS_RESET_LANE_0_DONE_MASK | \ |
| PHY_STATUS_PLL_LANE0_1_LOCK_MASK) |
| #define PHY_STATUS_LANES_0_1_READY_MASK \ |
| (PHY_STATUS_LANE_0_READY_MASK | \ |
| PHY_STATUS_RESET_LANE_1_DONE_MASK) |
| /* |
| * PHY_STATUS_ALL_LANES_READY_MASK seems to be missing lanes 0 and 1 in |
| * Xilinx dp_v3_0 implementation |
| */ |
| #define PHY_STATUS_ALL_LANES_READY_MASK \ |
| (PHY_STATUS_LANES_0_1_READY_MASK | \ |
| PHY_STATUS_RESET_LANE_2_3_DONE_MASK | \ |
| PHY_STATUS_PLL_LANE2_3_LOCK_MASK) |
| |
| /** |
| * phy_status_lanes_ready_mask() - Generate phy status ready mask |
| * @lane_count: Number of lanes for which to generate a mask |
| * |
| * Return: The generated phy status ready mask |
| */ |
| static inline u32 phy_status_lanes_ready_mask(u8 lane_count) |
| { |
| if (lane_count > 2) |
| return PHY_STATUS_ALL_LANES_READY_MASK; |
| |
| if (lane_count == 2) |
| return PHY_STATUS_LANES_0_1_READY_MASK; |
| |
| return PHY_STATUS_LANE_0_READY_MASK; |
| } |
| |
| #define GT_DRP_COMMAND_DRP_ADDR_MASK 0x000F |
| #define GT_DRP_COMMAND_DRP_RW_CMD_MASK 0x0080 |
| #define GT_DRP_COMMAND_DRP_W_DATA_SHIFT 16 |
| #define GT_DRP_COMMAND_DRP_W_DATA_MASK 0xFF00 |
| |
| #define HDCP_ENABLE_BYPASS_DISABLE_MASK 0x0001 |
| |
| #endif /* __GDSYS_LOGICORE_DP_TX_REGIF_H__ */ |