cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vc4_hdmi_regs.h (13504B)


      1#ifndef _VC4_HDMI_REGS_H_
      2#define _VC4_HDMI_REGS_H_
      3
      4#include <linux/pm_runtime.h>
      5
      6#include "vc4_hdmi.h"
      7
      8#define VC4_HDMI_PACKET_STRIDE			0x24
      9
     10enum vc4_hdmi_regs {
     11	VC4_INVALID = 0,
     12	VC4_HDMI,
     13	VC4_HD,
     14	VC5_CEC,
     15	VC5_CSC,
     16	VC5_DVP,
     17	VC5_PHY,
     18	VC5_RAM,
     19	VC5_RM,
     20};
     21
     22enum vc4_hdmi_field {
     23	HDMI_AUDIO_PACKET_CONFIG,
     24	HDMI_CEC_CNTRL_1,
     25	HDMI_CEC_CNTRL_2,
     26	HDMI_CEC_CNTRL_3,
     27	HDMI_CEC_CNTRL_4,
     28	HDMI_CEC_CNTRL_5,
     29	HDMI_CEC_CPU_CLEAR,
     30	HDMI_CEC_CPU_MASK_CLEAR,
     31	HDMI_CEC_CPU_MASK_SET,
     32	HDMI_CEC_CPU_MASK_STATUS,
     33	HDMI_CEC_CPU_STATUS,
     34	HDMI_CEC_CPU_SET,
     35
     36	/*
     37	 * Transmit data, first byte is low byte of the 32-bit reg.
     38	 * MSB of each byte transmitted first.
     39	 */
     40	HDMI_CEC_RX_DATA_1,
     41	HDMI_CEC_RX_DATA_2,
     42	HDMI_CEC_RX_DATA_3,
     43	HDMI_CEC_RX_DATA_4,
     44	HDMI_CEC_TX_DATA_1,
     45	HDMI_CEC_TX_DATA_2,
     46	HDMI_CEC_TX_DATA_3,
     47	HDMI_CEC_TX_DATA_4,
     48	HDMI_CLOCK_STOP,
     49	HDMI_CORE_REV,
     50	HDMI_CRP_CFG,
     51	HDMI_CSC_12_11,
     52	HDMI_CSC_14_13,
     53	HDMI_CSC_22_21,
     54	HDMI_CSC_24_23,
     55	HDMI_CSC_32_31,
     56	HDMI_CSC_34_33,
     57	HDMI_CSC_CHANNEL_CTL,
     58	HDMI_CSC_CTL,
     59
     60	/*
     61	 * 20-bit fields containing CTS values to be transmitted if
     62	 * !EXTERNAL_CTS_EN
     63	 */
     64	HDMI_CTS_0,
     65	HDMI_CTS_1,
     66	HDMI_DEEP_COLOR_CONFIG_1,
     67	HDMI_DVP_CTL,
     68	HDMI_FIFO_CTL,
     69	HDMI_FRAME_COUNT,
     70	HDMI_GCP_CONFIG,
     71	HDMI_GCP_WORD_1,
     72	HDMI_HORZA,
     73	HDMI_HORZB,
     74	HDMI_HOTPLUG,
     75	HDMI_HOTPLUG_INT,
     76
     77	/*
     78	 * 3 bits per field, where each field maps from that
     79	 * corresponding MAI bus channel to the given HDMI channel.
     80	 */
     81	HDMI_MAI_CHANNEL_MAP,
     82	HDMI_MAI_CONFIG,
     83	HDMI_MAI_CTL,
     84
     85	/*
     86	 * Register for DMAing in audio data to be transported over
     87	 * the MAI bus to the Falcon core.
     88	 */
     89	HDMI_MAI_DATA,
     90
     91	/* Format header to be placed on the MAI data. Unused. */
     92	HDMI_MAI_FMT,
     93
     94	/* Last received format word on the MAI bus. */
     95	HDMI_MAI_FORMAT,
     96	HDMI_MAI_SMP,
     97	HDMI_MAI_THR,
     98	HDMI_M_CTL,
     99	HDMI_RAM_PACKET_CONFIG,
    100	HDMI_RAM_PACKET_START,
    101	HDMI_RAM_PACKET_STATUS,
    102	HDMI_RM_CONTROL,
    103	HDMI_RM_FORMAT,
    104	HDMI_RM_OFFSET,
    105	HDMI_SCHEDULER_CONTROL,
    106	HDMI_SCRAMBLER_CTL,
    107	HDMI_SW_RESET_CONTROL,
    108	HDMI_TX_PHY_CHANNEL_SWAP,
    109	HDMI_TX_PHY_CLK_DIV,
    110	HDMI_TX_PHY_CTL_0,
    111	HDMI_TX_PHY_CTL_1,
    112	HDMI_TX_PHY_CTL_2,
    113	HDMI_TX_PHY_CTL_3,
    114	HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1,
    115	HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2,
    116	HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4,
    117	HDMI_TX_PHY_PLL_CFG,
    118	HDMI_TX_PHY_PLL_CTL_0,
    119	HDMI_TX_PHY_PLL_CTL_1,
    120	HDMI_TX_PHY_POWERDOWN_CTL,
    121	HDMI_TX_PHY_RESET_CTL,
    122	HDMI_TX_PHY_TMDS_CLK_WORD_SEL,
    123	HDMI_VEC_INTERFACE_CFG,
    124	HDMI_VEC_INTERFACE_XBAR,
    125	HDMI_VERTA0,
    126	HDMI_VERTA1,
    127	HDMI_VERTB0,
    128	HDMI_VERTB1,
    129	HDMI_VID_CTL,
    130};
    131
    132struct vc4_hdmi_register {
    133	char *name;
    134	enum vc4_hdmi_regs reg;
    135	unsigned int offset;
    136};
    137
    138#define _VC4_REG(_base, _reg, _offset)	\
    139	[_reg] = {				\
    140		.name = #_reg,			\
    141		.reg = _base,			\
    142		.offset = _offset,		\
    143	}
    144
    145#define VC4_HD_REG(reg, offset)		_VC4_REG(VC4_HD, reg, offset)
    146#define VC4_HDMI_REG(reg, offset)	_VC4_REG(VC4_HDMI, reg, offset)
    147#define VC5_CEC_REG(reg, offset)	_VC4_REG(VC5_CEC, reg, offset)
    148#define VC5_CSC_REG(reg, offset)	_VC4_REG(VC5_CSC, reg, offset)
    149#define VC5_DVP_REG(reg, offset)	_VC4_REG(VC5_DVP, reg, offset)
    150#define VC5_PHY_REG(reg, offset)	_VC4_REG(VC5_PHY, reg, offset)
    151#define VC5_RAM_REG(reg, offset)	_VC4_REG(VC5_RAM, reg, offset)
    152#define VC5_RM_REG(reg, offset)		_VC4_REG(VC5_RM, reg, offset)
    153
    154static const struct vc4_hdmi_register __maybe_unused vc4_hdmi_fields[] = {
    155	VC4_HD_REG(HDMI_M_CTL, 0x000c),
    156	VC4_HD_REG(HDMI_MAI_CTL, 0x0014),
    157	VC4_HD_REG(HDMI_MAI_THR, 0x0018),
    158	VC4_HD_REG(HDMI_MAI_FMT, 0x001c),
    159	VC4_HD_REG(HDMI_MAI_DATA, 0x0020),
    160	VC4_HD_REG(HDMI_MAI_SMP, 0x002c),
    161	VC4_HD_REG(HDMI_VID_CTL, 0x0038),
    162	VC4_HD_REG(HDMI_CSC_CTL, 0x0040),
    163	VC4_HD_REG(HDMI_CSC_12_11, 0x0044),
    164	VC4_HD_REG(HDMI_CSC_14_13, 0x0048),
    165	VC4_HD_REG(HDMI_CSC_22_21, 0x004c),
    166	VC4_HD_REG(HDMI_CSC_24_23, 0x0050),
    167	VC4_HD_REG(HDMI_CSC_32_31, 0x0054),
    168	VC4_HD_REG(HDMI_CSC_34_33, 0x0058),
    169	VC4_HD_REG(HDMI_FRAME_COUNT, 0x0068),
    170
    171	VC4_HDMI_REG(HDMI_CORE_REV, 0x0000),
    172	VC4_HDMI_REG(HDMI_SW_RESET_CONTROL, 0x0004),
    173	VC4_HDMI_REG(HDMI_HOTPLUG_INT, 0x0008),
    174	VC4_HDMI_REG(HDMI_HOTPLUG, 0x000c),
    175	VC4_HDMI_REG(HDMI_FIFO_CTL, 0x005c),
    176	VC4_HDMI_REG(HDMI_MAI_CHANNEL_MAP, 0x0090),
    177	VC4_HDMI_REG(HDMI_MAI_CONFIG, 0x0094),
    178	VC4_HDMI_REG(HDMI_MAI_FORMAT, 0x0098),
    179	VC4_HDMI_REG(HDMI_AUDIO_PACKET_CONFIG, 0x009c),
    180	VC4_HDMI_REG(HDMI_RAM_PACKET_CONFIG, 0x00a0),
    181	VC4_HDMI_REG(HDMI_RAM_PACKET_STATUS, 0x00a4),
    182	VC4_HDMI_REG(HDMI_CRP_CFG, 0x00a8),
    183	VC4_HDMI_REG(HDMI_CTS_0, 0x00ac),
    184	VC4_HDMI_REG(HDMI_CTS_1, 0x00b0),
    185	VC4_HDMI_REG(HDMI_SCHEDULER_CONTROL, 0x00c0),
    186	VC4_HDMI_REG(HDMI_HORZA, 0x00c4),
    187	VC4_HDMI_REG(HDMI_HORZB, 0x00c8),
    188	VC4_HDMI_REG(HDMI_VERTA0, 0x00cc),
    189	VC4_HDMI_REG(HDMI_VERTB0, 0x00d0),
    190	VC4_HDMI_REG(HDMI_VERTA1, 0x00d4),
    191	VC4_HDMI_REG(HDMI_VERTB1, 0x00d8),
    192	VC4_HDMI_REG(HDMI_CEC_CNTRL_1, 0x00e8),
    193	VC4_HDMI_REG(HDMI_CEC_CNTRL_2, 0x00ec),
    194	VC4_HDMI_REG(HDMI_CEC_CNTRL_3, 0x00f0),
    195	VC4_HDMI_REG(HDMI_CEC_CNTRL_4, 0x00f4),
    196	VC4_HDMI_REG(HDMI_CEC_CNTRL_5, 0x00f8),
    197	VC4_HDMI_REG(HDMI_CEC_TX_DATA_1, 0x00fc),
    198	VC4_HDMI_REG(HDMI_CEC_TX_DATA_2, 0x0100),
    199	VC4_HDMI_REG(HDMI_CEC_TX_DATA_3, 0x0104),
    200	VC4_HDMI_REG(HDMI_CEC_TX_DATA_4, 0x0108),
    201	VC4_HDMI_REG(HDMI_CEC_RX_DATA_1, 0x010c),
    202	VC4_HDMI_REG(HDMI_CEC_RX_DATA_2, 0x0110),
    203	VC4_HDMI_REG(HDMI_CEC_RX_DATA_3, 0x0114),
    204	VC4_HDMI_REG(HDMI_CEC_RX_DATA_4, 0x0118),
    205	VC4_HDMI_REG(HDMI_TX_PHY_RESET_CTL, 0x02c0),
    206	VC4_HDMI_REG(HDMI_TX_PHY_CTL_0, 0x02c4),
    207	VC4_HDMI_REG(HDMI_CEC_CPU_STATUS, 0x0340),
    208	VC4_HDMI_REG(HDMI_CEC_CPU_SET, 0x0344),
    209	VC4_HDMI_REG(HDMI_CEC_CPU_CLEAR, 0x0348),
    210	VC4_HDMI_REG(HDMI_CEC_CPU_MASK_STATUS, 0x034c),
    211	VC4_HDMI_REG(HDMI_CEC_CPU_MASK_SET, 0x0350),
    212	VC4_HDMI_REG(HDMI_CEC_CPU_MASK_CLEAR, 0x0354),
    213	VC4_HDMI_REG(HDMI_RAM_PACKET_START, 0x0400),
    214};
    215
    216static const struct vc4_hdmi_register __maybe_unused vc5_hdmi_hdmi0_fields[] = {
    217	VC4_HD_REG(HDMI_DVP_CTL, 0x0000),
    218	VC4_HD_REG(HDMI_MAI_CTL, 0x0010),
    219	VC4_HD_REG(HDMI_MAI_THR, 0x0014),
    220	VC4_HD_REG(HDMI_MAI_FMT, 0x0018),
    221	VC4_HD_REG(HDMI_MAI_DATA, 0x001c),
    222	VC4_HD_REG(HDMI_MAI_SMP, 0x0020),
    223	VC4_HD_REG(HDMI_VID_CTL, 0x0044),
    224	VC4_HD_REG(HDMI_FRAME_COUNT, 0x0060),
    225
    226	VC4_HDMI_REG(HDMI_FIFO_CTL, 0x074),
    227	VC4_HDMI_REG(HDMI_AUDIO_PACKET_CONFIG, 0x0b8),
    228	VC4_HDMI_REG(HDMI_RAM_PACKET_CONFIG, 0x0bc),
    229	VC4_HDMI_REG(HDMI_RAM_PACKET_STATUS, 0x0c4),
    230	VC4_HDMI_REG(HDMI_CRP_CFG, 0x0c8),
    231	VC4_HDMI_REG(HDMI_CTS_0, 0x0cc),
    232	VC4_HDMI_REG(HDMI_CTS_1, 0x0d0),
    233	VC4_HDMI_REG(HDMI_SCHEDULER_CONTROL, 0x0e0),
    234	VC4_HDMI_REG(HDMI_HORZA, 0x0e4),
    235	VC4_HDMI_REG(HDMI_HORZB, 0x0e8),
    236	VC4_HDMI_REG(HDMI_VERTA0, 0x0ec),
    237	VC4_HDMI_REG(HDMI_VERTB0, 0x0f0),
    238	VC4_HDMI_REG(HDMI_VERTA1, 0x0f4),
    239	VC4_HDMI_REG(HDMI_VERTB1, 0x0f8),
    240	VC4_HDMI_REG(HDMI_MAI_CHANNEL_MAP, 0x09c),
    241	VC4_HDMI_REG(HDMI_MAI_CONFIG, 0x0a0),
    242	VC4_HDMI_REG(HDMI_DEEP_COLOR_CONFIG_1, 0x170),
    243	VC4_HDMI_REG(HDMI_GCP_CONFIG, 0x178),
    244	VC4_HDMI_REG(HDMI_GCP_WORD_1, 0x17c),
    245	VC4_HDMI_REG(HDMI_HOTPLUG, 0x1a8),
    246	VC4_HDMI_REG(HDMI_SCRAMBLER_CTL, 0x1c4),
    247
    248	VC5_DVP_REG(HDMI_CLOCK_STOP, 0x0bc),
    249	VC5_DVP_REG(HDMI_VEC_INTERFACE_CFG, 0x0ec),
    250	VC5_DVP_REG(HDMI_VEC_INTERFACE_XBAR, 0x0f0),
    251
    252	VC5_PHY_REG(HDMI_TX_PHY_RESET_CTL, 0x000),
    253	VC5_PHY_REG(HDMI_TX_PHY_POWERDOWN_CTL, 0x004),
    254	VC5_PHY_REG(HDMI_TX_PHY_CTL_0, 0x008),
    255	VC5_PHY_REG(HDMI_TX_PHY_CTL_1, 0x00c),
    256	VC5_PHY_REG(HDMI_TX_PHY_CTL_2, 0x010),
    257	VC5_PHY_REG(HDMI_TX_PHY_CTL_3, 0x014),
    258	VC5_PHY_REG(HDMI_TX_PHY_PLL_CTL_0, 0x01c),
    259	VC5_PHY_REG(HDMI_TX_PHY_PLL_CTL_1, 0x020),
    260	VC5_PHY_REG(HDMI_TX_PHY_CLK_DIV, 0x028),
    261	VC5_PHY_REG(HDMI_TX_PHY_PLL_CFG, 0x034),
    262	VC5_PHY_REG(HDMI_TX_PHY_TMDS_CLK_WORD_SEL, 0x044),
    263	VC5_PHY_REG(HDMI_TX_PHY_CHANNEL_SWAP, 0x04c),
    264	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1, 0x050),
    265	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2, 0x054),
    266	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4, 0x05c),
    267
    268	VC5_RM_REG(HDMI_RM_CONTROL, 0x000),
    269	VC5_RM_REG(HDMI_RM_OFFSET, 0x018),
    270	VC5_RM_REG(HDMI_RM_FORMAT, 0x01c),
    271
    272	VC5_RAM_REG(HDMI_RAM_PACKET_START, 0x000),
    273
    274	VC5_CEC_REG(HDMI_CEC_CNTRL_1, 0x010),
    275	VC5_CEC_REG(HDMI_CEC_CNTRL_2, 0x014),
    276	VC5_CEC_REG(HDMI_CEC_CNTRL_3, 0x018),
    277	VC5_CEC_REG(HDMI_CEC_CNTRL_4, 0x01c),
    278	VC5_CEC_REG(HDMI_CEC_CNTRL_5, 0x020),
    279	VC5_CEC_REG(HDMI_CEC_TX_DATA_1, 0x028),
    280	VC5_CEC_REG(HDMI_CEC_TX_DATA_2, 0x02c),
    281	VC5_CEC_REG(HDMI_CEC_TX_DATA_3, 0x030),
    282	VC5_CEC_REG(HDMI_CEC_TX_DATA_4, 0x034),
    283	VC5_CEC_REG(HDMI_CEC_RX_DATA_1, 0x038),
    284	VC5_CEC_REG(HDMI_CEC_RX_DATA_2, 0x03c),
    285	VC5_CEC_REG(HDMI_CEC_RX_DATA_3, 0x040),
    286	VC5_CEC_REG(HDMI_CEC_RX_DATA_4, 0x044),
    287
    288	VC5_CSC_REG(HDMI_CSC_CTL, 0x000),
    289	VC5_CSC_REG(HDMI_CSC_12_11, 0x004),
    290	VC5_CSC_REG(HDMI_CSC_14_13, 0x008),
    291	VC5_CSC_REG(HDMI_CSC_22_21, 0x00c),
    292	VC5_CSC_REG(HDMI_CSC_24_23, 0x010),
    293	VC5_CSC_REG(HDMI_CSC_32_31, 0x014),
    294	VC5_CSC_REG(HDMI_CSC_34_33, 0x018),
    295	VC5_CSC_REG(HDMI_CSC_CHANNEL_CTL, 0x02c),
    296};
    297
    298static const struct vc4_hdmi_register __maybe_unused vc5_hdmi_hdmi1_fields[] = {
    299	VC4_HD_REG(HDMI_DVP_CTL, 0x0000),
    300	VC4_HD_REG(HDMI_MAI_CTL, 0x0030),
    301	VC4_HD_REG(HDMI_MAI_THR, 0x0034),
    302	VC4_HD_REG(HDMI_MAI_FMT, 0x0038),
    303	VC4_HD_REG(HDMI_MAI_DATA, 0x003c),
    304	VC4_HD_REG(HDMI_MAI_SMP, 0x0040),
    305	VC4_HD_REG(HDMI_VID_CTL, 0x0048),
    306	VC4_HD_REG(HDMI_FRAME_COUNT, 0x0064),
    307
    308	VC4_HDMI_REG(HDMI_FIFO_CTL, 0x074),
    309	VC4_HDMI_REG(HDMI_AUDIO_PACKET_CONFIG, 0x0b8),
    310	VC4_HDMI_REG(HDMI_RAM_PACKET_CONFIG, 0x0bc),
    311	VC4_HDMI_REG(HDMI_RAM_PACKET_STATUS, 0x0c4),
    312	VC4_HDMI_REG(HDMI_CRP_CFG, 0x0c8),
    313	VC4_HDMI_REG(HDMI_CTS_0, 0x0cc),
    314	VC4_HDMI_REG(HDMI_CTS_1, 0x0d0),
    315	VC4_HDMI_REG(HDMI_SCHEDULER_CONTROL, 0x0e0),
    316	VC4_HDMI_REG(HDMI_HORZA, 0x0e4),
    317	VC4_HDMI_REG(HDMI_HORZB, 0x0e8),
    318	VC4_HDMI_REG(HDMI_VERTA0, 0x0ec),
    319	VC4_HDMI_REG(HDMI_VERTB0, 0x0f0),
    320	VC4_HDMI_REG(HDMI_VERTA1, 0x0f4),
    321	VC4_HDMI_REG(HDMI_VERTB1, 0x0f8),
    322	VC4_HDMI_REG(HDMI_MAI_CHANNEL_MAP, 0x09c),
    323	VC4_HDMI_REG(HDMI_MAI_CONFIG, 0x0a0),
    324	VC4_HDMI_REG(HDMI_DEEP_COLOR_CONFIG_1, 0x170),
    325	VC4_HDMI_REG(HDMI_GCP_CONFIG, 0x178),
    326	VC4_HDMI_REG(HDMI_GCP_WORD_1, 0x17c),
    327	VC4_HDMI_REG(HDMI_HOTPLUG, 0x1a8),
    328	VC4_HDMI_REG(HDMI_SCRAMBLER_CTL, 0x1c4),
    329
    330	VC5_DVP_REG(HDMI_CLOCK_STOP, 0x0bc),
    331	VC5_DVP_REG(HDMI_VEC_INTERFACE_CFG, 0x0ec),
    332	VC5_DVP_REG(HDMI_VEC_INTERFACE_XBAR, 0x0f0),
    333
    334	VC5_PHY_REG(HDMI_TX_PHY_RESET_CTL, 0x000),
    335	VC5_PHY_REG(HDMI_TX_PHY_POWERDOWN_CTL, 0x004),
    336	VC5_PHY_REG(HDMI_TX_PHY_CTL_0, 0x008),
    337	VC5_PHY_REG(HDMI_TX_PHY_CTL_1, 0x00c),
    338	VC5_PHY_REG(HDMI_TX_PHY_CTL_2, 0x010),
    339	VC5_PHY_REG(HDMI_TX_PHY_CTL_3, 0x014),
    340	VC5_PHY_REG(HDMI_TX_PHY_PLL_CTL_0, 0x01c),
    341	VC5_PHY_REG(HDMI_TX_PHY_PLL_CTL_1, 0x020),
    342	VC5_PHY_REG(HDMI_TX_PHY_CLK_DIV, 0x028),
    343	VC5_PHY_REG(HDMI_TX_PHY_PLL_CFG, 0x034),
    344	VC5_PHY_REG(HDMI_TX_PHY_CHANNEL_SWAP, 0x04c),
    345	VC5_PHY_REG(HDMI_TX_PHY_TMDS_CLK_WORD_SEL, 0x044),
    346	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1, 0x050),
    347	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2, 0x054),
    348	VC5_PHY_REG(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4, 0x05c),
    349
    350	VC5_RM_REG(HDMI_RM_CONTROL, 0x000),
    351	VC5_RM_REG(HDMI_RM_OFFSET, 0x018),
    352	VC5_RM_REG(HDMI_RM_FORMAT, 0x01c),
    353
    354	VC5_RAM_REG(HDMI_RAM_PACKET_START, 0x000),
    355
    356	VC5_CEC_REG(HDMI_CEC_CNTRL_1, 0x010),
    357	VC5_CEC_REG(HDMI_CEC_CNTRL_2, 0x014),
    358	VC5_CEC_REG(HDMI_CEC_CNTRL_3, 0x018),
    359	VC5_CEC_REG(HDMI_CEC_CNTRL_4, 0x01c),
    360	VC5_CEC_REG(HDMI_CEC_CNTRL_5, 0x020),
    361	VC5_CEC_REG(HDMI_CEC_TX_DATA_1, 0x028),
    362	VC5_CEC_REG(HDMI_CEC_TX_DATA_2, 0x02c),
    363	VC5_CEC_REG(HDMI_CEC_TX_DATA_3, 0x030),
    364	VC5_CEC_REG(HDMI_CEC_TX_DATA_4, 0x034),
    365	VC5_CEC_REG(HDMI_CEC_RX_DATA_1, 0x038),
    366	VC5_CEC_REG(HDMI_CEC_RX_DATA_2, 0x03c),
    367	VC5_CEC_REG(HDMI_CEC_RX_DATA_3, 0x040),
    368	VC5_CEC_REG(HDMI_CEC_RX_DATA_4, 0x044),
    369
    370	VC5_CSC_REG(HDMI_CSC_CTL, 0x000),
    371	VC5_CSC_REG(HDMI_CSC_12_11, 0x004),
    372	VC5_CSC_REG(HDMI_CSC_14_13, 0x008),
    373	VC5_CSC_REG(HDMI_CSC_22_21, 0x00c),
    374	VC5_CSC_REG(HDMI_CSC_24_23, 0x010),
    375	VC5_CSC_REG(HDMI_CSC_32_31, 0x014),
    376	VC5_CSC_REG(HDMI_CSC_34_33, 0x018),
    377	VC5_CSC_REG(HDMI_CSC_CHANNEL_CTL, 0x02c),
    378};
    379
    380static inline
    381void __iomem *__vc4_hdmi_get_field_base(struct vc4_hdmi *hdmi,
    382					enum vc4_hdmi_regs reg)
    383{
    384	switch (reg) {
    385	case VC4_HD:
    386		return hdmi->hd_regs;
    387
    388	case VC4_HDMI:
    389		return hdmi->hdmicore_regs;
    390
    391	case VC5_CSC:
    392		return hdmi->csc_regs;
    393
    394	case VC5_CEC:
    395		return hdmi->cec_regs;
    396
    397	case VC5_DVP:
    398		return hdmi->dvp_regs;
    399
    400	case VC5_PHY:
    401		return hdmi->phy_regs;
    402
    403	case VC5_RAM:
    404		return hdmi->ram_regs;
    405
    406	case VC5_RM:
    407		return hdmi->rm_regs;
    408
    409	default:
    410		return NULL;
    411	}
    412
    413	return NULL;
    414}
    415
    416static inline u32 vc4_hdmi_read(struct vc4_hdmi *hdmi,
    417				enum vc4_hdmi_field reg)
    418{
    419	const struct vc4_hdmi_register *field;
    420	const struct vc4_hdmi_variant *variant = hdmi->variant;
    421	void __iomem *base;
    422
    423	WARN_ON(!pm_runtime_active(&hdmi->pdev->dev));
    424
    425	if (reg >= variant->num_registers) {
    426		dev_warn(&hdmi->pdev->dev,
    427			 "Invalid register ID %u\n", reg);
    428		return 0;
    429	}
    430
    431	field = &variant->registers[reg];
    432	base = __vc4_hdmi_get_field_base(hdmi, field->reg);
    433	if (!base) {
    434		dev_warn(&hdmi->pdev->dev,
    435			 "Unknown register ID %u\n", reg);
    436		return 0;
    437	}
    438
    439	return readl(base + field->offset);
    440}
    441#define HDMI_READ(reg)		vc4_hdmi_read(vc4_hdmi, reg)
    442
    443static inline void vc4_hdmi_write(struct vc4_hdmi *hdmi,
    444				  enum vc4_hdmi_field reg,
    445				  u32 value)
    446{
    447	const struct vc4_hdmi_register *field;
    448	const struct vc4_hdmi_variant *variant = hdmi->variant;
    449	void __iomem *base;
    450
    451	lockdep_assert_held(&hdmi->hw_lock);
    452
    453	WARN_ON(!pm_runtime_active(&hdmi->pdev->dev));
    454
    455	if (reg >= variant->num_registers) {
    456		dev_warn(&hdmi->pdev->dev,
    457			 "Invalid register ID %u\n", reg);
    458		return;
    459	}
    460
    461	field = &variant->registers[reg];
    462	base = __vc4_hdmi_get_field_base(hdmi, field->reg);
    463	if (!base)
    464		return;
    465
    466	writel(value, base + field->offset);
    467}
    468#define HDMI_WRITE(reg, val)	vc4_hdmi_write(vc4_hdmi, reg, val)
    469
    470#endif /* _VC4_HDMI_REGS_H_ */