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

kmb_dsi.h (9500B)


      1/* SPDX-License-Identifier: GPL-2.0-only
      2 *
      3 * Copyright © 2019-2020 Intel Corporation
      4 */
      5
      6#ifndef __KMB_DSI_H__
      7#define __KMB_DSI_H__
      8
      9#include <drm/drm_encoder.h>
     10#include <drm/drm_mipi_dsi.h>
     11
     12/* MIPI TX CFG */
     13#define MIPI_TX_LANE_DATA_RATE_MBPS 891
     14#define MIPI_TX_REF_CLK_KHZ         24000
     15#define MIPI_TX_CFG_CLK_KHZ         24000
     16#define MIPI_TX_BPP		    24
     17
     18/* DPHY Tx test codes*/
     19#define TEST_CODE_FSM_CONTROL				0x03
     20#define TEST_CODE_MULTIPLE_PHY_CTRL			0x0C
     21#define TEST_CODE_PLL_PROPORTIONAL_CHARGE_PUMP_CTRL	0x0E
     22#define TEST_CODE_PLL_INTEGRAL_CHARGE_PUMP_CTRL		0x0F
     23#define TEST_CODE_PLL_VCO_CTRL				0x12
     24#define TEST_CODE_PLL_GMP_CTRL				0x13
     25#define TEST_CODE_PLL_PHASE_ERR_CTRL			0x14
     26#define TEST_CODE_PLL_LOCK_FILTER			0x15
     27#define TEST_CODE_PLL_UNLOCK_FILTER			0x16
     28#define TEST_CODE_PLL_INPUT_DIVIDER			0x17
     29#define TEST_CODE_PLL_FEEDBACK_DIVIDER			0x18
     30#define   PLL_FEEDBACK_DIVIDER_HIGH			BIT(7)
     31#define TEST_CODE_PLL_OUTPUT_CLK_SEL			0x19
     32#define   PLL_N_OVR_EN					BIT(4)
     33#define   PLL_M_OVR_EN					BIT(5)
     34#define TEST_CODE_VOD_LEVEL				0x24
     35#define TEST_CODE_PLL_CHARGE_PUMP_BIAS			0x1C
     36#define TEST_CODE_PLL_LOCK_DETECTOR			0x1D
     37#define TEST_CODE_HS_FREQ_RANGE_CFG			0x44
     38#define TEST_CODE_PLL_ANALOG_PROG			0x1F
     39#define TEST_CODE_SLEW_RATE_OVERRIDE_CTRL		0xA0
     40#define TEST_CODE_SLEW_RATE_DDL_LOOP_CTRL		0xA3
     41#define TEST_CODE_SLEW_RATE_DDL_CYCLES			0xA4
     42
     43/* DPHY params */
     44#define PLL_N_MIN	0
     45#define PLL_N_MAX	15
     46#define PLL_M_MIN	62
     47#define PLL_M_MAX	623
     48#define PLL_FVCO_MAX	1250
     49
     50#define TIMEOUT		600
     51
     52#define MIPI_TX_FRAME_GEN				4
     53#define MIPI_TX_FRAME_GEN_SECTIONS			4
     54#define MIPI_CTRL_VIRTUAL_CHANNELS			4
     55#define MIPI_D_LANES_PER_DPHY				2
     56#define MIPI_CTRL_2LANE_MAX_MC_FIFO_LOC			255
     57#define MIPI_CTRL_4LANE_MAX_MC_FIFO_LOC			511
     58/* 2 Data Lanes per D-PHY */
     59#define MIPI_DPHY_D_LANES				2
     60#define MIPI_DPHY_DEFAULT_BIT_RATES			63
     61
     62#define KMB_MIPI_DEFAULT_CLK				24000000
     63#define KMB_MIPI_DEFAULT_CFG_CLK			24000000
     64
     65#define to_kmb_dsi(x) container_of(x, struct kmb_dsi, base)
     66
     67struct kmb_dsi {
     68	struct drm_encoder base;
     69	struct device *dev;
     70	struct platform_device *pdev;
     71	struct mipi_dsi_host *host;
     72	struct mipi_dsi_device *device;
     73	struct drm_bridge *adv_bridge;
     74	void __iomem *mipi_mmio;
     75	struct clk *clk_mipi;
     76	struct clk *clk_mipi_ecfg;
     77	struct clk *clk_mipi_cfg;
     78	int sys_clk_mhz;
     79};
     80
     81/* DPHY Tx test codes */
     82
     83enum mipi_ctrl_num {
     84	MIPI_CTRL0 = 0,
     85	MIPI_CTRL1,
     86	MIPI_CTRL2,
     87	MIPI_CTRL3,
     88	MIPI_CTRL4,
     89	MIPI_CTRL5,
     90	MIPI_CTRL6,
     91	MIPI_CTRL7,
     92	MIPI_CTRL8,
     93	MIPI_CTRL9,
     94	MIPI_CTRL_NA
     95};
     96
     97enum mipi_dphy_num {
     98	MIPI_DPHY0 = 0,
     99	MIPI_DPHY1,
    100	MIPI_DPHY2,
    101	MIPI_DPHY3,
    102	MIPI_DPHY4,
    103	MIPI_DPHY5,
    104	MIPI_DPHY6,
    105	MIPI_DPHY7,
    106	MIPI_DPHY8,
    107	MIPI_DPHY9,
    108	MIPI_DPHY_NA
    109};
    110
    111enum mipi_dir {
    112	MIPI_RX,
    113	MIPI_TX
    114};
    115
    116enum mipi_ctrl_type {
    117	MIPI_DSI,
    118	MIPI_CSI
    119};
    120
    121enum mipi_data_if {
    122	MIPI_IF_DMA,
    123	MIPI_IF_PARALLEL
    124};
    125
    126enum mipi_data_mode {
    127	MIPI_DATA_MODE0,
    128	MIPI_DATA_MODE1,
    129	MIPI_DATA_MODE2,
    130	MIPI_DATA_MODE3
    131};
    132
    133enum mipi_dsi_video_mode {
    134	DSI_VIDEO_MODE_NO_BURST_PULSE,
    135	DSI_VIDEO_MODE_NO_BURST_EVENT,
    136	DSI_VIDEO_MODE_BURST
    137};
    138
    139enum mipi_dsi_blanking_mode {
    140	TRANSITION_TO_LOW_POWER,
    141	SEND_BLANK_PACKET
    142};
    143
    144enum mipi_dsi_eotp {
    145	DSI_EOTP_DISABLED,
    146	DSI_EOTP_ENABLES
    147};
    148
    149enum mipi_dsi_data_type {
    150	DSI_SP_DT_RESERVED_00 = 0x00,
    151	DSI_SP_DT_VSYNC_START = 0x01,
    152	DSI_SP_DT_COLOR_MODE_OFF = 0x02,
    153	DSI_SP_DT_GENERIC_SHORT_WR = 0x03,
    154	DSI_SP_DT_GENERIC_RD = 0x04,
    155	DSI_SP_DT_DCS_SHORT_WR = 0x05,
    156	DSI_SP_DT_DCS_RD = 0x06,
    157	DSI_SP_DT_EOTP = 0x08,
    158	DSI_LP_DT_NULL = 0x09,
    159	DSI_LP_DT_RESERVED_0A = 0x0a,
    160	DSI_LP_DT_RESERVED_0B = 0x0b,
    161	DSI_LP_DT_LPPS_YCBCR422_20B = 0x0c,
    162	DSI_LP_DT_PPS_RGB101010_30B = 0x0d,
    163	DSI_LP_DT_PPS_RGB565_16B = 0x0e,
    164	DSI_LP_DT_RESERVED_0F = 0x0f,
    165
    166	DSI_SP_DT_RESERVED_10 = 0x10,
    167	DSI_SP_DT_VSYNC_END = 0x11,
    168	DSI_SP_DT_COLOR_MODE_ON = 0x12,
    169	DSI_SP_DT_GENERIC_SHORT_WR_1PAR = 0x13,
    170	DSI_SP_DT_GENERIC_RD_1PAR = 0x14,
    171	DSI_SP_DT_DCS_SHORT_WR_1PAR = 0x15,
    172	DSI_SP_DT_RESERVED_16 = 0x16,
    173	DSI_SP_DT_RESERVED_17 = 0x17,
    174	DSI_SP_DT_RESERVED_18 = 0x18,
    175	DSI_LP_DT_BLANK = 0x19,
    176	DSI_LP_DT_RESERVED_1A = 0x1a,
    177	DSI_LP_DT_RESERVED_1B = 0x1b,
    178	DSI_LP_DT_PPS_YCBCR422_24B = 0x1c,
    179	DSI_LP_DT_PPS_RGB121212_36B = 0x1d,
    180	DSI_LP_DT_PPS_RGB666_18B = 0x1e,
    181	DSI_LP_DT_RESERVED_1F = 0x1f,
    182
    183	DSI_SP_DT_RESERVED_20 = 0x20,
    184	DSI_SP_DT_HSYNC_START = 0x21,
    185	DSI_SP_DT_SHUT_DOWN_PERIPH_CMD = 0x22,
    186	DSI_SP_DT_GENERIC_SHORT_WR_2PAR = 0x23,
    187	DSI_SP_DT_GENERIC_RD_2PAR = 0x24,
    188	DSI_SP_DT_RESERVED_25 = 0x25,
    189	DSI_SP_DT_RESERVED_26 = 0x26,
    190	DSI_SP_DT_RESERVED_27 = 0x27,
    191	DSI_SP_DT_RESERVED_28 = 0x28,
    192	DSI_LP_DT_GENERIC_LONG_WR = 0x29,
    193	DSI_LP_DT_RESERVED_2A = 0x2a,
    194	DSI_LP_DT_RESERVED_2B = 0x2b,
    195	DSI_LP_DT_PPS_YCBCR422_16B = 0x2c,
    196	DSI_LP_DT_RESERVED_2D = 0x2d,
    197	DSI_LP_DT_LPPS_RGB666_18B = 0x2e,
    198	DSI_LP_DT_RESERVED_2F = 0x2f,
    199
    200	DSI_SP_DT_RESERVED_30 = 0x30,
    201	DSI_SP_DT_HSYNC_END = 0x31,
    202	DSI_SP_DT_TURN_ON_PERIPH_CMD = 0x32,
    203	DSI_SP_DT_RESERVED_33 = 0x33,
    204	DSI_SP_DT_RESERVED_34 = 0x34,
    205	DSI_SP_DT_RESERVED_35 = 0x35,
    206	DSI_SP_DT_RESERVED_36 = 0x36,
    207	DSI_SP_DT_SET_MAX_RETURN_PKT_SIZE = 0x37,
    208	DSI_SP_DT_RESERVED_38 = 0x38,
    209	DSI_LP_DT_DSC_LONG_WR = 0x39,
    210	DSI_LP_DT_RESERVED_3A = 0x3a,
    211	DSI_LP_DT_RESERVED_3B = 0x3b,
    212	DSI_LP_DT_RESERVED_3C = 0x3c,
    213	DSI_LP_DT_PPS_YCBCR420_12B = 0x3d,
    214	DSI_LP_DT_PPS_RGB888_24B = 0x3e,
    215	DSI_LP_DT_RESERVED_3F = 0x3f
    216};
    217
    218enum mipi_tx_hs_tp_sel {
    219	MIPI_TX_HS_TP_WHOLE_FRAME_COLOR0 = 0,
    220	MIPI_TX_HS_TP_WHOLE_FRAME_COLOR1,
    221	MIPI_TX_HS_TP_V_STRIPES,
    222	MIPI_TX_HS_TP_H_STRIPES,
    223};
    224
    225enum dphy_mode {
    226	MIPI_DPHY_SLAVE = 0,
    227	MIPI_DPHY_MASTER
    228};
    229
    230enum dphy_tx_fsm {
    231	DPHY_TX_POWERDWN = 0,
    232	DPHY_TX_BGPON,
    233	DPHY_TX_TERMCAL,
    234	DPHY_TX_TERMCALUP,
    235	DPHY_TX_OFFSETCAL,
    236	DPHY_TX_LOCK,
    237	DPHY_TX_SRCAL,
    238	DPHY_TX_IDLE,
    239	DPHY_TX_ULP,
    240	DPHY_TX_LANESTART,
    241	DPHY_TX_CLKALIGN,
    242	DPHY_TX_DDLTUNNING,
    243	DPHY_TX_ULP_FORCE_PLL,
    244	DPHY_TX_LOCK_LOSS
    245};
    246
    247struct mipi_data_type_params {
    248	u8 size_constraint_pixels;
    249	u8 size_constraint_bytes;
    250	u8 pixels_per_pclk;
    251	u8 bits_per_pclk;
    252};
    253
    254struct mipi_tx_dsi_cfg {
    255	u8 hfp_blank_en;	/* Horizontal front porch blanking enable */
    256	u8 eotp_en;		/* End of transmission packet enable */
    257	/* Last vertical front porch blanking mode */
    258	u8 lpm_last_vfp_line;
    259	/* First vertical sync active blanking mode */
    260	u8 lpm_first_vsa_line;
    261	u8 sync_pulse_eventn;	/* Sync type */
    262	u8 hfp_blanking;	/* Horizontal front porch blanking mode */
    263	u8 hbp_blanking;	/* Horizontal back porch blanking mode */
    264	u8 hsa_blanking;	/* Horizontal sync active blanking mode */
    265	u8 v_blanking;		/* Vertical timing blanking mode */
    266};
    267
    268struct mipi_tx_frame_section_cfg {
    269	u32 dma_v_stride;
    270	u16 dma_v_scale_cfg;
    271	u16 width_pixels;
    272	u16 height_lines;
    273	u8 dma_packed;
    274	u8 bpp;
    275	u8 bpp_unpacked;
    276	u8 dma_h_stride;
    277	u8 data_type;
    278	u8 data_mode;
    279	u8 dma_flip_rotate_sel;
    280};
    281
    282struct mipi_tx_frame_timing_cfg {
    283	u32 bpp;
    284	u32 lane_rate_mbps;
    285	u32 hsync_width;
    286	u32 h_backporch;
    287	u32 h_frontporch;
    288	u32 h_active;
    289	u16 vsync_width;
    290	u16 v_backporch;
    291	u16 v_frontporch;
    292	u16 v_active;
    293	u8 active_lanes;
    294};
    295
    296struct mipi_tx_frame_sect_phcfg {
    297	u32 wc;
    298	enum mipi_data_mode data_mode;
    299	enum mipi_dsi_data_type data_type;
    300	u8 vchannel;
    301	u8 dma_packed;
    302};
    303
    304struct mipi_tx_frame_cfg {
    305	struct mipi_tx_frame_section_cfg *sections[MIPI_TX_FRAME_GEN_SECTIONS];
    306	u32 hsync_width;	/* in pixels */
    307	u32 h_backporch;	/* in pixels */
    308	u32 h_frontporch;	/* in pixels */
    309	u16 vsync_width;	/* in lines */
    310	u16 v_backporch;	/* in lines */
    311	u16 v_frontporch;	/* in lines */
    312};
    313
    314struct mipi_tx_ctrl_cfg {
    315	struct mipi_tx_frame_cfg *frames[MIPI_TX_FRAME_GEN];
    316	const struct mipi_tx_dsi_cfg *tx_dsi_cfg;
    317	u8 line_sync_pkt_en;
    318	u8 line_counter_active;
    319	u8 frame_counter_active;
    320	u8 tx_hsclkkidle_cnt;
    321	u8 tx_hsexit_cnt;
    322	u8 tx_crc_en;
    323	u8 tx_hact_wait_stop;
    324	u8 tx_always_use_hact;
    325	u8 tx_wait_trig;
    326	u8 tx_wait_all_sect;
    327};
    328
    329/* configuration structure for MIPI control */
    330struct mipi_ctrl_cfg {
    331	u8 active_lanes;	/* # active lanes per controller 2/4 */
    332	u32 lane_rate_mbps;	/* MBPS */
    333	u32 ref_clk_khz;
    334	u32 cfg_clk_khz;
    335	struct mipi_tx_ctrl_cfg tx_ctrl_cfg;
    336};
    337
    338static inline void kmb_write_mipi(struct kmb_dsi *kmb_dsi,
    339				  unsigned int reg, u32 value)
    340{
    341	writel(value, (kmb_dsi->mipi_mmio + reg));
    342}
    343
    344static inline u32 kmb_read_mipi(struct kmb_dsi *kmb_dsi, unsigned int reg)
    345{
    346	return readl(kmb_dsi->mipi_mmio + reg);
    347}
    348
    349static inline void kmb_write_bits_mipi(struct kmb_dsi *kmb_dsi,
    350				       unsigned int reg, u32 offset,
    351				       u32 num_bits, u32 value)
    352{
    353	u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
    354	u32 mask = (1 << num_bits) - 1;
    355
    356	value &= mask;
    357	mask <<= offset;
    358	reg_val &= (~mask);
    359	reg_val |= (value << offset);
    360	kmb_write_mipi(kmb_dsi, reg, reg_val);
    361}
    362
    363static inline void kmb_set_bit_mipi(struct kmb_dsi *kmb_dsi,
    364				    unsigned int reg, u32 offset)
    365{
    366	u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
    367
    368	kmb_write_mipi(kmb_dsi, reg, reg_val | (1 << offset));
    369}
    370
    371static inline void kmb_clr_bit_mipi(struct kmb_dsi *kmb_dsi,
    372				    unsigned int reg, u32 offset)
    373{
    374	u32 reg_val = kmb_read_mipi(kmb_dsi, reg);
    375
    376	kmb_write_mipi(kmb_dsi, reg, reg_val & (~(1 << offset)));
    377}
    378
    379int kmb_dsi_host_bridge_init(struct device *dev);
    380struct kmb_dsi *kmb_dsi_init(struct platform_device *pdev);
    381void kmb_dsi_host_unregister(struct kmb_dsi *kmb_dsi);
    382int kmb_dsi_mode_set(struct kmb_dsi *kmb_dsi, struct drm_display_mode *mode,
    383		     int sys_clk_mhz, struct drm_atomic_state *old_state);
    384int kmb_dsi_map_mmio(struct kmb_dsi *kmb_dsi);
    385int kmb_dsi_clk_init(struct kmb_dsi *kmb_dsi);
    386int kmb_dsi_encoder_init(struct drm_device *dev, struct kmb_dsi *kmb_dsi);
    387#endif /* __KMB_DSI_H__ */