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

sprd_dsi.c (27765B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (C) 2020 Unisoc Inc.
      4 */
      5
      6#include <linux/component.h>
      7#include <linux/module.h>
      8#include <linux/of_address.h>
      9#include <linux/of_device.h>
     10#include <linux/of_irq.h>
     11#include <linux/of_graph.h>
     12#include <video/mipi_display.h>
     13
     14#include <drm/drm_atomic_helper.h>
     15#include <drm/drm_bridge.h>
     16#include <drm/drm_crtc_helper.h>
     17#include <drm/drm_of.h>
     18#include <drm/drm_probe_helper.h>
     19
     20#include "sprd_drm.h"
     21#include "sprd_dpu.h"
     22#include "sprd_dsi.h"
     23
     24#define SOFT_RESET 0x04
     25#define MASK_PROTOCOL_INT 0x0C
     26#define MASK_INTERNAL_INT 0x14
     27#define DSI_MODE_CFG 0x18
     28
     29#define VIRTUAL_CHANNEL_ID 0x1C
     30#define GEN_RX_VCID GENMASK(1, 0)
     31#define VIDEO_PKT_VCID GENMASK(3, 2)
     32
     33#define DPI_VIDEO_FORMAT 0x20
     34#define DPI_VIDEO_MODE_FORMAT GENMASK(5, 0)
     35#define LOOSELY18_EN BIT(6)
     36
     37#define VIDEO_PKT_CONFIG 0x24
     38#define VIDEO_PKT_SIZE GENMASK(15, 0)
     39#define VIDEO_LINE_CHUNK_NUM GENMASK(31, 16)
     40
     41#define VIDEO_LINE_HBLK_TIME 0x28
     42#define VIDEO_LINE_HBP_TIME GENMASK(15, 0)
     43#define VIDEO_LINE_HSA_TIME GENMASK(31, 16)
     44
     45#define VIDEO_LINE_TIME 0x2C
     46
     47#define VIDEO_VBLK_LINES 0x30
     48#define VFP_LINES GENMASK(9, 0)
     49#define VBP_LINES GENMASK(19, 10)
     50#define VSA_LINES GENMASK(29, 20)
     51
     52#define VIDEO_VACTIVE_LINES 0x34
     53
     54#define VID_MODE_CFG 0x38
     55#define VID_MODE_TYPE GENMASK(1, 0)
     56#define LP_VSA_EN BIT(8)
     57#define LP_VBP_EN BIT(9)
     58#define LP_VFP_EN BIT(10)
     59#define LP_VACT_EN BIT(11)
     60#define LP_HBP_EN BIT(12)
     61#define LP_HFP_EN BIT(13)
     62#define FRAME_BTA_ACK_EN BIT(14)
     63
     64#define TIMEOUT_CNT_CLK_CONFIG 0x40
     65#define HTX_TO_CONFIG 0x44
     66#define LRX_H_TO_CONFIG 0x48
     67
     68#define TX_ESC_CLK_CONFIG 0x5C
     69
     70#define CMD_MODE_CFG 0x68
     71#define TEAR_FX_EN BIT(0)
     72
     73#define GEN_HDR 0x6C
     74#define GEN_DT GENMASK(5, 0)
     75#define GEN_VC GENMASK(7, 6)
     76
     77#define GEN_PLD_DATA 0x70
     78
     79#define PHY_CLK_LANE_LP_CTRL 0x74
     80#define PHY_CLKLANE_TX_REQ_HS BIT(0)
     81#define AUTO_CLKLANE_CTRL_EN BIT(1)
     82
     83#define PHY_INTERFACE_CTRL 0x78
     84#define RF_PHY_SHUTDOWN BIT(0)
     85#define RF_PHY_RESET_N BIT(1)
     86#define RF_PHY_CLK_EN BIT(2)
     87
     88#define CMD_MODE_STATUS 0x98
     89#define GEN_CMD_RDATA_FIFO_EMPTY BIT(1)
     90#define GEN_CMD_WDATA_FIFO_EMPTY BIT(3)
     91#define GEN_CMD_CMD_FIFO_EMPTY BIT(5)
     92#define GEN_CMD_RDCMD_DONE BIT(7)
     93
     94#define PHY_STATUS 0x9C
     95#define PHY_LOCK BIT(1)
     96
     97#define PHY_MIN_STOP_TIME 0xA0
     98#define PHY_LANE_NUM_CONFIG 0xA4
     99
    100#define PHY_CLKLANE_TIME_CONFIG 0xA8
    101#define PHY_CLKLANE_LP_TO_HS_TIME GENMASK(15, 0)
    102#define PHY_CLKLANE_HS_TO_LP_TIME GENMASK(31, 16)
    103
    104#define PHY_DATALANE_TIME_CONFIG 0xAC
    105#define PHY_DATALANE_LP_TO_HS_TIME GENMASK(15, 0)
    106#define PHY_DATALANE_HS_TO_LP_TIME GENMASK(31, 16)
    107
    108#define MAX_READ_TIME 0xB0
    109
    110#define RX_PKT_CHECK_CONFIG 0xB4
    111#define RX_PKT_ECC_EN BIT(0)
    112#define RX_PKT_CRC_EN BIT(1)
    113
    114#define TA_EN 0xB8
    115
    116#define EOTP_EN 0xBC
    117#define TX_EOTP_EN BIT(0)
    118#define RX_EOTP_EN BIT(1)
    119
    120#define VIDEO_NULLPKT_SIZE 0xC0
    121#define DCS_WM_PKT_SIZE 0xC4
    122
    123#define VIDEO_SIG_DELAY_CONFIG 0xD0
    124#define VIDEO_SIG_DELAY GENMASK(23, 0)
    125
    126#define PHY_TST_CTRL0 0xF0
    127#define PHY_TESTCLR BIT(0)
    128#define PHY_TESTCLK BIT(1)
    129
    130#define PHY_TST_CTRL1 0xF4
    131#define PHY_TESTDIN GENMASK(7, 0)
    132#define PHY_TESTDOUT GENMASK(15, 8)
    133#define PHY_TESTEN BIT(16)
    134
    135#define host_to_dsi(host) \
    136	container_of(host, struct sprd_dsi, host)
    137
    138static inline u32
    139dsi_reg_rd(struct dsi_context *ctx, u32 offset, u32 mask,
    140	   u32 shift)
    141{
    142	return (readl(ctx->base + offset) & mask) >> shift;
    143}
    144
    145static inline void
    146dsi_reg_wr(struct dsi_context *ctx, u32 offset, u32 mask,
    147	   u32 shift, u32 val)
    148{
    149	u32 ret;
    150
    151	ret = readl(ctx->base + offset);
    152	ret &= ~mask;
    153	ret |= (val << shift) & mask;
    154	writel(ret, ctx->base + offset);
    155}
    156
    157static inline void
    158dsi_reg_up(struct dsi_context *ctx, u32 offset, u32 mask,
    159	   u32 val)
    160{
    161	u32 ret = readl(ctx->base + offset);
    162
    163	writel((ret & ~mask) | (val & mask), ctx->base + offset);
    164}
    165
    166static int regmap_tst_io_write(void *context, u32 reg, u32 val)
    167{
    168	struct sprd_dsi *dsi = context;
    169	struct dsi_context *ctx = &dsi->ctx;
    170
    171	if (val > 0xff || reg > 0xff)
    172		return -EINVAL;
    173
    174	drm_dbg(dsi->drm, "reg = 0x%02x, val = 0x%02x\n", reg, val);
    175
    176	dsi_reg_up(ctx, PHY_TST_CTRL1, PHY_TESTEN, PHY_TESTEN);
    177	dsi_reg_wr(ctx, PHY_TST_CTRL1, PHY_TESTDIN, 0, reg);
    178	dsi_reg_up(ctx, PHY_TST_CTRL0, PHY_TESTCLK, PHY_TESTCLK);
    179	dsi_reg_up(ctx, PHY_TST_CTRL0, PHY_TESTCLK, 0);
    180	dsi_reg_up(ctx, PHY_TST_CTRL1, PHY_TESTEN, 0);
    181	dsi_reg_wr(ctx, PHY_TST_CTRL1, PHY_TESTDIN, 0, val);
    182	dsi_reg_up(ctx, PHY_TST_CTRL0, PHY_TESTCLK, PHY_TESTCLK);
    183	dsi_reg_up(ctx, PHY_TST_CTRL0, PHY_TESTCLK, 0);
    184
    185	return 0;
    186}
    187
    188static int regmap_tst_io_read(void *context, u32 reg, u32 *val)
    189{
    190	struct sprd_dsi *dsi = context;
    191	struct dsi_context *ctx = &dsi->ctx;
    192	int ret;
    193
    194	if (reg > 0xff)
    195		return -EINVAL;
    196
    197	dsi_reg_up(ctx, PHY_TST_CTRL1, PHY_TESTEN, PHY_TESTEN);
    198	dsi_reg_wr(ctx, PHY_TST_CTRL1, PHY_TESTDIN, 0, reg);
    199	dsi_reg_up(ctx, PHY_TST_CTRL0, PHY_TESTCLK, PHY_TESTCLK);
    200	dsi_reg_up(ctx, PHY_TST_CTRL0, PHY_TESTCLK, 0);
    201	dsi_reg_up(ctx, PHY_TST_CTRL1, PHY_TESTEN, 0);
    202
    203	udelay(1);
    204
    205	ret = dsi_reg_rd(ctx, PHY_TST_CTRL1, PHY_TESTDOUT, 8);
    206	if (ret < 0)
    207		return ret;
    208
    209	*val = ret;
    210
    211	drm_dbg(dsi->drm, "reg = 0x%02x, val = 0x%02x\n", reg, *val);
    212	return 0;
    213}
    214
    215static struct regmap_bus regmap_tst_io = {
    216	.reg_write = regmap_tst_io_write,
    217	.reg_read = regmap_tst_io_read,
    218};
    219
    220static const struct regmap_config byte_config = {
    221	.reg_bits = 8,
    222	.val_bits = 8,
    223};
    224
    225static int dphy_wait_pll_locked(struct dsi_context *ctx)
    226{
    227	struct sprd_dsi *dsi = container_of(ctx, struct sprd_dsi, ctx);
    228	int i;
    229
    230	for (i = 0; i < 50000; i++) {
    231		if (dsi_reg_rd(ctx, PHY_STATUS, PHY_LOCK, 1))
    232			return 0;
    233		udelay(3);
    234	}
    235
    236	drm_err(dsi->drm, "dphy pll can not be locked\n");
    237	return -ETIMEDOUT;
    238}
    239
    240static int dsi_wait_tx_payload_fifo_empty(struct dsi_context *ctx)
    241{
    242	int i;
    243
    244	for (i = 0; i < 5000; i++) {
    245		if (dsi_reg_rd(ctx, CMD_MODE_STATUS, GEN_CMD_WDATA_FIFO_EMPTY, 3))
    246			return 0;
    247		udelay(1);
    248	}
    249
    250	return -ETIMEDOUT;
    251}
    252
    253static int dsi_wait_tx_cmd_fifo_empty(struct dsi_context *ctx)
    254{
    255	int i;
    256
    257	for (i = 0; i < 5000; i++) {
    258		if (dsi_reg_rd(ctx, CMD_MODE_STATUS, GEN_CMD_CMD_FIFO_EMPTY, 5))
    259			return 0;
    260		udelay(1);
    261	}
    262
    263	return -ETIMEDOUT;
    264}
    265
    266static int dsi_wait_rd_resp_completed(struct dsi_context *ctx)
    267{
    268	int i;
    269
    270	for (i = 0; i < 10000; i++) {
    271		if (dsi_reg_rd(ctx, CMD_MODE_STATUS, GEN_CMD_RDCMD_DONE, 7))
    272			return 0;
    273		udelay(10);
    274	}
    275
    276	return -ETIMEDOUT;
    277}
    278
    279static u16 calc_bytes_per_pixel_x100(int coding)
    280{
    281	u16 bpp_x100;
    282
    283	switch (coding) {
    284	case COLOR_CODE_16BIT_CONFIG1:
    285	case COLOR_CODE_16BIT_CONFIG2:
    286	case COLOR_CODE_16BIT_CONFIG3:
    287		bpp_x100 = 200;
    288		break;
    289	case COLOR_CODE_18BIT_CONFIG1:
    290	case COLOR_CODE_18BIT_CONFIG2:
    291		bpp_x100 = 225;
    292		break;
    293	case COLOR_CODE_24BIT:
    294		bpp_x100 = 300;
    295		break;
    296	case COLOR_CODE_COMPRESSTION:
    297		bpp_x100 = 100;
    298		break;
    299	case COLOR_CODE_20BIT_YCC422_LOOSELY:
    300		bpp_x100 = 250;
    301		break;
    302	case COLOR_CODE_24BIT_YCC422:
    303		bpp_x100 = 300;
    304		break;
    305	case COLOR_CODE_16BIT_YCC422:
    306		bpp_x100 = 200;
    307		break;
    308	case COLOR_CODE_30BIT:
    309		bpp_x100 = 375;
    310		break;
    311	case COLOR_CODE_36BIT:
    312		bpp_x100 = 450;
    313		break;
    314	case COLOR_CODE_12BIT_YCC420:
    315		bpp_x100 = 150;
    316		break;
    317	default:
    318		DRM_ERROR("invalid color coding");
    319		bpp_x100 = 0;
    320		break;
    321	}
    322
    323	return bpp_x100;
    324}
    325
    326static u8 calc_video_size_step(int coding)
    327{
    328	u8 video_size_step;
    329
    330	switch (coding) {
    331	case COLOR_CODE_16BIT_CONFIG1:
    332	case COLOR_CODE_16BIT_CONFIG2:
    333	case COLOR_CODE_16BIT_CONFIG3:
    334	case COLOR_CODE_18BIT_CONFIG1:
    335	case COLOR_CODE_18BIT_CONFIG2:
    336	case COLOR_CODE_24BIT:
    337	case COLOR_CODE_COMPRESSTION:
    338		return video_size_step = 1;
    339	case COLOR_CODE_20BIT_YCC422_LOOSELY:
    340	case COLOR_CODE_24BIT_YCC422:
    341	case COLOR_CODE_16BIT_YCC422:
    342	case COLOR_CODE_30BIT:
    343	case COLOR_CODE_36BIT:
    344	case COLOR_CODE_12BIT_YCC420:
    345		return video_size_step = 2;
    346	default:
    347		DRM_ERROR("invalid color coding");
    348		return 0;
    349	}
    350}
    351
    352static u16 round_video_size(int coding, u16 video_size)
    353{
    354	switch (coding) {
    355	case COLOR_CODE_16BIT_YCC422:
    356	case COLOR_CODE_24BIT_YCC422:
    357	case COLOR_CODE_20BIT_YCC422_LOOSELY:
    358	case COLOR_CODE_12BIT_YCC420:
    359		/* round up active H pixels to a multiple of 2 */
    360		if ((video_size % 2) != 0)
    361			video_size += 1;
    362		break;
    363	default:
    364		break;
    365	}
    366
    367	return video_size;
    368}
    369
    370#define SPRD_MIPI_DSI_FMT_DSC 0xff
    371static u32 fmt_to_coding(u32 fmt)
    372{
    373	switch (fmt) {
    374	case MIPI_DSI_FMT_RGB565:
    375		return COLOR_CODE_16BIT_CONFIG1;
    376	case MIPI_DSI_FMT_RGB666:
    377	case MIPI_DSI_FMT_RGB666_PACKED:
    378		return COLOR_CODE_18BIT_CONFIG1;
    379	case MIPI_DSI_FMT_RGB888:
    380		return COLOR_CODE_24BIT;
    381	case SPRD_MIPI_DSI_FMT_DSC:
    382		return COLOR_CODE_COMPRESSTION;
    383	default:
    384		DRM_ERROR("Unsupported format (%d)\n", fmt);
    385		return COLOR_CODE_24BIT;
    386	}
    387}
    388
    389#define ns_to_cycle(ns, byte_clk) \
    390	DIV_ROUND_UP((ns) * (byte_clk), 1000000)
    391
    392static void sprd_dsi_init(struct dsi_context *ctx)
    393{
    394	struct sprd_dsi *dsi = container_of(ctx, struct sprd_dsi, ctx);
    395	u32 byte_clk = dsi->slave->hs_rate / 8;
    396	u16 data_hs2lp, data_lp2hs, clk_hs2lp, clk_lp2hs;
    397	u16 max_rd_time;
    398	int div;
    399
    400	writel(0, ctx->base + SOFT_RESET);
    401	writel(0xffffffff, ctx->base + MASK_PROTOCOL_INT);
    402	writel(0xffffffff, ctx->base + MASK_INTERNAL_INT);
    403	writel(1, ctx->base + DSI_MODE_CFG);
    404	dsi_reg_up(ctx, EOTP_EN, RX_EOTP_EN, 0);
    405	dsi_reg_up(ctx, EOTP_EN, TX_EOTP_EN, 0);
    406	dsi_reg_up(ctx, RX_PKT_CHECK_CONFIG, RX_PKT_ECC_EN, RX_PKT_ECC_EN);
    407	dsi_reg_up(ctx, RX_PKT_CHECK_CONFIG, RX_PKT_CRC_EN, RX_PKT_CRC_EN);
    408	writel(1, ctx->base + TA_EN);
    409	dsi_reg_up(ctx, VIRTUAL_CHANNEL_ID, VIDEO_PKT_VCID, 0);
    410	dsi_reg_up(ctx, VIRTUAL_CHANNEL_ID, GEN_RX_VCID, 0);
    411
    412	div = DIV_ROUND_UP(byte_clk, dsi->slave->lp_rate);
    413	writel(div, ctx->base + TX_ESC_CLK_CONFIG);
    414
    415	max_rd_time = ns_to_cycle(ctx->max_rd_time, byte_clk);
    416	writel(max_rd_time, ctx->base + MAX_READ_TIME);
    417
    418	data_hs2lp = ns_to_cycle(ctx->data_hs2lp, byte_clk);
    419	data_lp2hs = ns_to_cycle(ctx->data_lp2hs, byte_clk);
    420	clk_hs2lp = ns_to_cycle(ctx->clk_hs2lp, byte_clk);
    421	clk_lp2hs = ns_to_cycle(ctx->clk_lp2hs, byte_clk);
    422	dsi_reg_wr(ctx, PHY_DATALANE_TIME_CONFIG,
    423		   PHY_DATALANE_HS_TO_LP_TIME, 16, data_hs2lp);
    424	dsi_reg_wr(ctx, PHY_DATALANE_TIME_CONFIG,
    425		   PHY_DATALANE_LP_TO_HS_TIME, 0, data_lp2hs);
    426	dsi_reg_wr(ctx, PHY_CLKLANE_TIME_CONFIG,
    427		   PHY_CLKLANE_HS_TO_LP_TIME, 16, clk_hs2lp);
    428	dsi_reg_wr(ctx, PHY_CLKLANE_TIME_CONFIG,
    429		   PHY_CLKLANE_LP_TO_HS_TIME, 0, clk_lp2hs);
    430
    431	writel(1, ctx->base + SOFT_RESET);
    432}
    433
    434/*
    435 * Free up resources and shutdown host controller and PHY
    436 */
    437static void sprd_dsi_fini(struct dsi_context *ctx)
    438{
    439	writel(0xffffffff, ctx->base + MASK_PROTOCOL_INT);
    440	writel(0xffffffff, ctx->base + MASK_INTERNAL_INT);
    441	writel(0, ctx->base + SOFT_RESET);
    442}
    443
    444/*
    445 * If not in burst mode, it will compute the video and null packet sizes
    446 * according to necessity.
    447 * Configure timers for data lanes and/or clock lane to return to LP when
    448 * bandwidth is not filled by data.
    449 */
    450static int sprd_dsi_dpi_video(struct dsi_context *ctx)
    451{
    452	struct sprd_dsi *dsi = container_of(ctx, struct sprd_dsi, ctx);
    453	struct videomode *vm = &ctx->vm;
    454	u32 byte_clk = dsi->slave->hs_rate / 8;
    455	u16 bpp_x100;
    456	u16 video_size;
    457	u32 ratio_x1000;
    458	u16 null_pkt_size = 0;
    459	u8 video_size_step;
    460	u32 hs_to;
    461	u32 total_bytes;
    462	u32 bytes_per_chunk;
    463	u32 chunks = 0;
    464	u32 bytes_left = 0;
    465	u32 chunk_overhead;
    466	const u8 pkt_header = 6;
    467	u8 coding;
    468	int div;
    469	u16 hline;
    470	u16 byte_cycle;
    471
    472	coding = fmt_to_coding(dsi->slave->format);
    473	video_size = round_video_size(coding, vm->hactive);
    474	bpp_x100 = calc_bytes_per_pixel_x100(coding);
    475	video_size_step = calc_video_size_step(coding);
    476	ratio_x1000 = byte_clk * 1000 / (vm->pixelclock / 1000);
    477	hline = vm->hactive + vm->hsync_len + vm->hfront_porch +
    478		vm->hback_porch;
    479
    480	writel(0, ctx->base + SOFT_RESET);
    481	dsi_reg_wr(ctx, VID_MODE_CFG, FRAME_BTA_ACK_EN, 15, ctx->frame_ack_en);
    482	dsi_reg_wr(ctx, DPI_VIDEO_FORMAT, DPI_VIDEO_MODE_FORMAT, 0, coding);
    483	dsi_reg_wr(ctx, VID_MODE_CFG, VID_MODE_TYPE, 0, ctx->burst_mode);
    484	byte_cycle = 95 * hline * ratio_x1000 / 100000;
    485	dsi_reg_wr(ctx, VIDEO_SIG_DELAY_CONFIG, VIDEO_SIG_DELAY, 0, byte_cycle);
    486	byte_cycle = hline * ratio_x1000 / 1000;
    487	writel(byte_cycle, ctx->base + VIDEO_LINE_TIME);
    488	byte_cycle = vm->hsync_len * ratio_x1000 / 1000;
    489	dsi_reg_wr(ctx, VIDEO_LINE_HBLK_TIME, VIDEO_LINE_HSA_TIME, 16, byte_cycle);
    490	byte_cycle = vm->hback_porch * ratio_x1000 / 1000;
    491	dsi_reg_wr(ctx, VIDEO_LINE_HBLK_TIME, VIDEO_LINE_HBP_TIME, 0, byte_cycle);
    492	writel(vm->vactive, ctx->base + VIDEO_VACTIVE_LINES);
    493	dsi_reg_wr(ctx, VIDEO_VBLK_LINES, VFP_LINES, 0, vm->vfront_porch);
    494	dsi_reg_wr(ctx, VIDEO_VBLK_LINES, VBP_LINES, 10, vm->vback_porch);
    495	dsi_reg_wr(ctx, VIDEO_VBLK_LINES, VSA_LINES, 20, vm->vsync_len);
    496	dsi_reg_up(ctx, VID_MODE_CFG, LP_HBP_EN | LP_HFP_EN | LP_VACT_EN |
    497			LP_VFP_EN | LP_VBP_EN | LP_VSA_EN, LP_HBP_EN | LP_HFP_EN |
    498			LP_VACT_EN | LP_VFP_EN | LP_VBP_EN | LP_VSA_EN);
    499
    500	hs_to = (hline * vm->vactive) + (2 * bpp_x100) / 100;
    501	for (div = 0x80; (div < hs_to) && (div > 2); div--) {
    502		if ((hs_to % div) == 0) {
    503			writel(div, ctx->base + TIMEOUT_CNT_CLK_CONFIG);
    504			writel(hs_to / div, ctx->base + LRX_H_TO_CONFIG);
    505			writel(hs_to / div, ctx->base + HTX_TO_CONFIG);
    506			break;
    507		}
    508	}
    509
    510	if (ctx->burst_mode == VIDEO_BURST_WITH_SYNC_PULSES) {
    511		dsi_reg_wr(ctx, VIDEO_PKT_CONFIG, VIDEO_PKT_SIZE, 0, video_size);
    512		writel(0, ctx->base + VIDEO_NULLPKT_SIZE);
    513		dsi_reg_up(ctx, VIDEO_PKT_CONFIG, VIDEO_LINE_CHUNK_NUM, 0);
    514	} else {
    515		/* non burst transmission */
    516		null_pkt_size = 0;
    517
    518		/* bytes to be sent - first as one chunk */
    519		bytes_per_chunk = vm->hactive * bpp_x100 / 100 + pkt_header;
    520
    521		/* hline total bytes from the DPI interface */
    522		total_bytes = (vm->hactive + vm->hfront_porch) *
    523				ratio_x1000 / dsi->slave->lanes / 1000;
    524
    525		/* check if the pixels actually fit on the DSI link */
    526		if (total_bytes < bytes_per_chunk) {
    527			drm_err(dsi->drm, "current resolution can not be set\n");
    528			return -EINVAL;
    529		}
    530
    531		chunk_overhead = total_bytes - bytes_per_chunk;
    532
    533		/* overhead higher than 1 -> enable multi packets */
    534		if (chunk_overhead > 1) {
    535			/* multi packets */
    536			for (video_size = video_size_step;
    537			     video_size < vm->hactive;
    538			     video_size += video_size_step) {
    539				if (vm->hactive * 1000 / video_size % 1000)
    540					continue;
    541
    542				chunks = vm->hactive / video_size;
    543				bytes_per_chunk = bpp_x100 * video_size / 100
    544						  + pkt_header;
    545				if (total_bytes >= (bytes_per_chunk * chunks)) {
    546					bytes_left = total_bytes -
    547						     bytes_per_chunk * chunks;
    548					break;
    549				}
    550			}
    551
    552			/* prevent overflow (unsigned - unsigned) */
    553			if (bytes_left > (pkt_header * chunks)) {
    554				null_pkt_size = (bytes_left -
    555						pkt_header * chunks) / chunks;
    556				/* avoid register overflow */
    557				if (null_pkt_size > 1023)
    558					null_pkt_size = 1023;
    559			}
    560
    561		} else {
    562			/* single packet */
    563			chunks = 1;
    564
    565			/* must be a multiple of 4 except 18 loosely */
    566			for (video_size = vm->hactive;
    567			    (video_size % video_size_step) != 0;
    568			     video_size++)
    569				;
    570		}
    571
    572		dsi_reg_wr(ctx, VIDEO_PKT_CONFIG, VIDEO_PKT_SIZE, 0, video_size);
    573		writel(null_pkt_size, ctx->base + VIDEO_NULLPKT_SIZE);
    574		dsi_reg_wr(ctx, VIDEO_PKT_CONFIG, VIDEO_LINE_CHUNK_NUM, 16, chunks);
    575	}
    576
    577	writel(ctx->int0_mask, ctx->base + MASK_PROTOCOL_INT);
    578	writel(ctx->int1_mask, ctx->base + MASK_INTERNAL_INT);
    579	writel(1, ctx->base + SOFT_RESET);
    580
    581	return 0;
    582}
    583
    584static void sprd_dsi_edpi_video(struct dsi_context *ctx)
    585{
    586	struct sprd_dsi *dsi = container_of(ctx, struct sprd_dsi, ctx);
    587	const u32 fifo_depth = 1096;
    588	const u32 word_length = 4;
    589	u32 hactive = ctx->vm.hactive;
    590	u32 bpp_x100;
    591	u32 max_fifo_len;
    592	u8 coding;
    593
    594	coding = fmt_to_coding(dsi->slave->format);
    595	bpp_x100 = calc_bytes_per_pixel_x100(coding);
    596	max_fifo_len = word_length * fifo_depth * 100 / bpp_x100;
    597
    598	writel(0, ctx->base + SOFT_RESET);
    599	dsi_reg_wr(ctx, DPI_VIDEO_FORMAT, DPI_VIDEO_MODE_FORMAT, 0, coding);
    600	dsi_reg_wr(ctx, CMD_MODE_CFG, TEAR_FX_EN, 0, ctx->te_ack_en);
    601
    602	if (max_fifo_len > hactive)
    603		writel(hactive, ctx->base + DCS_WM_PKT_SIZE);
    604	else
    605		writel(max_fifo_len, ctx->base + DCS_WM_PKT_SIZE);
    606
    607	writel(ctx->int0_mask, ctx->base + MASK_PROTOCOL_INT);
    608	writel(ctx->int1_mask, ctx->base + MASK_INTERNAL_INT);
    609	writel(1, ctx->base + SOFT_RESET);
    610}
    611
    612/*
    613 * Send a packet on the generic interface,
    614 * this function has an active delay to wait for the buffer to clear.
    615 * The delay is limited to:
    616 * (param_length / 4) x DSIH_FIFO_ACTIVE_WAIT x register access time
    617 * the controller restricts the sending of.
    618 *
    619 * This function will not be able to send Null and Blanking packets due to
    620 * controller restriction
    621 */
    622static int sprd_dsi_wr_pkt(struct dsi_context *ctx, u8 vc, u8 type,
    623			   const u8 *param, u16 len)
    624{
    625	struct sprd_dsi *dsi = container_of(ctx, struct sprd_dsi, ctx);
    626	u8 wc_lsbyte, wc_msbyte;
    627	u32 payload;
    628	int i, j, ret;
    629
    630	if (vc > 3)
    631		return -EINVAL;
    632
    633	/* 1st: for long packet, must config payload first */
    634	ret = dsi_wait_tx_payload_fifo_empty(ctx);
    635	if (ret) {
    636		drm_err(dsi->drm, "tx payload fifo is not empty\n");
    637		return ret;
    638	}
    639
    640	if (len > 2) {
    641		for (i = 0, j = 0; i < len; i += j) {
    642			payload = 0;
    643			for (j = 0; (j < 4) && ((j + i) < (len)); j++)
    644				payload |= param[i + j] << (j * 8);
    645
    646			writel(payload, ctx->base + GEN_PLD_DATA);
    647		}
    648		wc_lsbyte = len & 0xff;
    649		wc_msbyte = len >> 8;
    650	} else {
    651		wc_lsbyte = (len > 0) ? param[0] : 0;
    652		wc_msbyte = (len > 1) ? param[1] : 0;
    653	}
    654
    655	/* 2nd: then set packet header */
    656	ret = dsi_wait_tx_cmd_fifo_empty(ctx);
    657	if (ret) {
    658		drm_err(dsi->drm, "tx cmd fifo is not empty\n");
    659		return ret;
    660	}
    661
    662	writel(type | (vc << 6) | (wc_lsbyte << 8) | (wc_msbyte << 16),
    663	       ctx->base + GEN_HDR);
    664
    665	return 0;
    666}
    667
    668/*
    669 * Send READ packet to peripheral using the generic interface,
    670 * this will force command mode and stop video mode (because of BTA).
    671 *
    672 * This function has an active delay to wait for the buffer to clear,
    673 * the delay is limited to 2 x DSIH_FIFO_ACTIVE_WAIT
    674 * (waiting for command buffer, and waiting for receiving)
    675 * @note this function will enable BTA
    676 */
    677static int sprd_dsi_rd_pkt(struct dsi_context *ctx, u8 vc, u8 type,
    678			   u8 msb_byte, u8 lsb_byte,
    679			   u8 *buffer, u8 bytes_to_read)
    680{
    681	struct sprd_dsi *dsi = container_of(ctx, struct sprd_dsi, ctx);
    682	int i, ret;
    683	int count = 0;
    684	u32 temp;
    685
    686	if (vc > 3)
    687		return -EINVAL;
    688
    689	/* 1st: send read command to peripheral */
    690	ret = dsi_reg_rd(ctx, CMD_MODE_STATUS, GEN_CMD_CMD_FIFO_EMPTY, 5);
    691	if (!ret)
    692		return -EIO;
    693
    694	writel(type | (vc << 6) | (lsb_byte << 8) | (msb_byte << 16),
    695	       ctx->base + GEN_HDR);
    696
    697	/* 2nd: wait peripheral response completed */
    698	ret = dsi_wait_rd_resp_completed(ctx);
    699	if (ret) {
    700		drm_err(dsi->drm, "wait read response time out\n");
    701		return ret;
    702	}
    703
    704	/* 3rd: get data from rx payload fifo */
    705	ret = dsi_reg_rd(ctx, CMD_MODE_STATUS, GEN_CMD_RDATA_FIFO_EMPTY, 1);
    706	if (ret) {
    707		drm_err(dsi->drm, "rx payload fifo empty\n");
    708		return -EIO;
    709	}
    710
    711	for (i = 0; i < 100; i++) {
    712		temp = readl(ctx->base + GEN_PLD_DATA);
    713
    714		if (count < bytes_to_read)
    715			buffer[count++] = temp & 0xff;
    716		if (count < bytes_to_read)
    717			buffer[count++] = (temp >> 8) & 0xff;
    718		if (count < bytes_to_read)
    719			buffer[count++] = (temp >> 16) & 0xff;
    720		if (count < bytes_to_read)
    721			buffer[count++] = (temp >> 24) & 0xff;
    722
    723		ret = dsi_reg_rd(ctx, CMD_MODE_STATUS, GEN_CMD_RDATA_FIFO_EMPTY, 1);
    724		if (ret)
    725			return count;
    726	}
    727
    728	return 0;
    729}
    730
    731static void sprd_dsi_set_work_mode(struct dsi_context *ctx, u8 mode)
    732{
    733	if (mode == DSI_MODE_CMD)
    734		writel(1, ctx->base + DSI_MODE_CFG);
    735	else
    736		writel(0, ctx->base + DSI_MODE_CFG);
    737}
    738
    739static void sprd_dsi_state_reset(struct dsi_context *ctx)
    740{
    741	writel(0, ctx->base + SOFT_RESET);
    742	udelay(100);
    743	writel(1, ctx->base + SOFT_RESET);
    744}
    745
    746static int sprd_dphy_init(struct dsi_context *ctx)
    747{
    748	struct sprd_dsi *dsi = container_of(ctx, struct sprd_dsi, ctx);
    749	int ret;
    750
    751	dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_RESET_N, 0);
    752	dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_SHUTDOWN, 0);
    753	dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_CLK_EN, 0);
    754
    755	dsi_reg_up(ctx, PHY_TST_CTRL0, PHY_TESTCLR, 0);
    756	dsi_reg_up(ctx, PHY_TST_CTRL0, PHY_TESTCLR, PHY_TESTCLR);
    757	dsi_reg_up(ctx, PHY_TST_CTRL0, PHY_TESTCLR, 0);
    758
    759	dphy_pll_config(ctx);
    760	dphy_timing_config(ctx);
    761
    762	dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_SHUTDOWN, RF_PHY_SHUTDOWN);
    763	dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_RESET_N, RF_PHY_RESET_N);
    764	writel(0x1C, ctx->base + PHY_MIN_STOP_TIME);
    765	dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_CLK_EN, RF_PHY_CLK_EN);
    766	writel(dsi->slave->lanes - 1, ctx->base + PHY_LANE_NUM_CONFIG);
    767
    768	ret = dphy_wait_pll_locked(ctx);
    769	if (ret) {
    770		drm_err(dsi->drm, "dphy initial failed\n");
    771		return ret;
    772	}
    773
    774	return 0;
    775}
    776
    777static void sprd_dphy_fini(struct dsi_context *ctx)
    778{
    779	dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_RESET_N, 0);
    780	dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_SHUTDOWN, 0);
    781	dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_RESET_N, RF_PHY_RESET_N);
    782}
    783
    784static void sprd_dsi_encoder_mode_set(struct drm_encoder *encoder,
    785				      struct drm_display_mode *mode,
    786				 struct drm_display_mode *adj_mode)
    787{
    788	struct sprd_dsi *dsi = encoder_to_dsi(encoder);
    789
    790	drm_display_mode_to_videomode(adj_mode, &dsi->ctx.vm);
    791}
    792
    793static void sprd_dsi_encoder_enable(struct drm_encoder *encoder)
    794{
    795	struct sprd_dsi *dsi = encoder_to_dsi(encoder);
    796	struct sprd_dpu *dpu = to_sprd_crtc(encoder->crtc);
    797	struct dsi_context *ctx = &dsi->ctx;
    798
    799	if (ctx->enabled) {
    800		drm_warn(dsi->drm, "dsi is initialized\n");
    801		return;
    802	}
    803
    804	sprd_dsi_init(ctx);
    805	if (ctx->work_mode == DSI_MODE_VIDEO)
    806		sprd_dsi_dpi_video(ctx);
    807	else
    808		sprd_dsi_edpi_video(ctx);
    809
    810	sprd_dphy_init(ctx);
    811
    812	sprd_dsi_set_work_mode(ctx, ctx->work_mode);
    813	sprd_dsi_state_reset(ctx);
    814
    815	if (dsi->slave->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) {
    816		dsi_reg_up(ctx, PHY_CLK_LANE_LP_CTRL, AUTO_CLKLANE_CTRL_EN,
    817			   AUTO_CLKLANE_CTRL_EN);
    818	} else {
    819		dsi_reg_up(ctx, PHY_CLK_LANE_LP_CTRL, RF_PHY_CLK_EN, RF_PHY_CLK_EN);
    820		dsi_reg_up(ctx, PHY_CLK_LANE_LP_CTRL, PHY_CLKLANE_TX_REQ_HS,
    821			   PHY_CLKLANE_TX_REQ_HS);
    822		dphy_wait_pll_locked(ctx);
    823	}
    824
    825	sprd_dpu_run(dpu);
    826
    827	ctx->enabled = true;
    828}
    829
    830static void sprd_dsi_encoder_disable(struct drm_encoder *encoder)
    831{
    832	struct sprd_dsi *dsi = encoder_to_dsi(encoder);
    833	struct sprd_dpu *dpu = to_sprd_crtc(encoder->crtc);
    834	struct dsi_context *ctx = &dsi->ctx;
    835
    836	if (!ctx->enabled) {
    837		drm_warn(dsi->drm, "dsi isn't initialized\n");
    838		return;
    839	}
    840
    841	sprd_dpu_stop(dpu);
    842	sprd_dphy_fini(ctx);
    843	sprd_dsi_fini(ctx);
    844
    845	ctx->enabled = false;
    846}
    847
    848static const struct drm_encoder_helper_funcs sprd_encoder_helper_funcs = {
    849	.mode_set	= sprd_dsi_encoder_mode_set,
    850	.enable		= sprd_dsi_encoder_enable,
    851	.disable	= sprd_dsi_encoder_disable
    852};
    853
    854static const struct drm_encoder_funcs sprd_encoder_funcs = {
    855	.destroy = drm_encoder_cleanup,
    856};
    857
    858static int sprd_dsi_encoder_init(struct sprd_dsi *dsi,
    859				 struct device *dev)
    860{
    861	struct drm_encoder *encoder = &dsi->encoder;
    862	u32 crtc_mask;
    863	int ret;
    864
    865	crtc_mask = drm_of_find_possible_crtcs(dsi->drm, dev->of_node);
    866	if (!crtc_mask) {
    867		drm_err(dsi->drm, "failed to find crtc mask\n");
    868		return -EINVAL;
    869	}
    870
    871	drm_dbg(dsi->drm, "find possible crtcs: 0x%08x\n", crtc_mask);
    872
    873	encoder->possible_crtcs = crtc_mask;
    874	ret = drm_encoder_init(dsi->drm, encoder, &sprd_encoder_funcs,
    875			       DRM_MODE_ENCODER_DSI, NULL);
    876	if (ret) {
    877		drm_err(dsi->drm, "failed to init dsi encoder\n");
    878		return ret;
    879	}
    880
    881	drm_encoder_helper_add(encoder, &sprd_encoder_helper_funcs);
    882
    883	return 0;
    884}
    885
    886static int sprd_dsi_bridge_init(struct sprd_dsi *dsi,
    887				struct device *dev)
    888{
    889	int ret;
    890
    891	dsi->panel_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
    892	if (IS_ERR(dsi->panel_bridge))
    893		return PTR_ERR(dsi->panel_bridge);
    894
    895	ret = drm_bridge_attach(&dsi->encoder, dsi->panel_bridge, NULL, 0);
    896	if (ret)
    897		return ret;
    898
    899	return 0;
    900}
    901
    902static int sprd_dsi_context_init(struct sprd_dsi *dsi,
    903				 struct device *dev)
    904{
    905	struct platform_device *pdev = to_platform_device(dev);
    906	struct dsi_context *ctx = &dsi->ctx;
    907	struct resource *res;
    908
    909	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    910	if (!res) {
    911		dev_err(dev, "failed to get I/O resource\n");
    912		return -EINVAL;
    913	}
    914
    915	ctx->base = devm_ioremap(dev, res->start, resource_size(res));
    916	if (!ctx->base) {
    917		drm_err(dsi->drm, "failed to map dsi host registers\n");
    918		return -ENXIO;
    919	}
    920
    921	ctx->regmap = devm_regmap_init(dev, &regmap_tst_io, dsi, &byte_config);
    922	if (IS_ERR(ctx->regmap)) {
    923		drm_err(dsi->drm, "dphy regmap init failed\n");
    924		return PTR_ERR(ctx->regmap);
    925	}
    926
    927	ctx->data_hs2lp = 120;
    928	ctx->data_lp2hs = 500;
    929	ctx->clk_hs2lp = 4;
    930	ctx->clk_lp2hs = 15;
    931	ctx->max_rd_time = 6000;
    932	ctx->int0_mask = 0xffffffff;
    933	ctx->int1_mask = 0xffffffff;
    934	ctx->enabled = true;
    935
    936	return 0;
    937}
    938
    939static int sprd_dsi_bind(struct device *dev, struct device *master, void *data)
    940{
    941	struct drm_device *drm = data;
    942	struct sprd_dsi *dsi = dev_get_drvdata(dev);
    943	int ret;
    944
    945	dsi->drm = drm;
    946
    947	ret = sprd_dsi_encoder_init(dsi, dev);
    948	if (ret)
    949		return ret;
    950
    951	ret = sprd_dsi_bridge_init(dsi, dev);
    952	if (ret)
    953		return ret;
    954
    955	ret = sprd_dsi_context_init(dsi, dev);
    956	if (ret)
    957		return ret;
    958
    959	return 0;
    960}
    961
    962static void sprd_dsi_unbind(struct device *dev,
    963			    struct device *master, void *data)
    964{
    965	struct sprd_dsi *dsi = dev_get_drvdata(dev);
    966
    967	drm_of_panel_bridge_remove(dev->of_node, 1, 0);
    968
    969	drm_encoder_cleanup(&dsi->encoder);
    970}
    971
    972static const struct component_ops dsi_component_ops = {
    973	.bind	= sprd_dsi_bind,
    974	.unbind	= sprd_dsi_unbind,
    975};
    976
    977static int sprd_dsi_host_attach(struct mipi_dsi_host *host,
    978				struct mipi_dsi_device *slave)
    979{
    980	struct sprd_dsi *dsi = host_to_dsi(host);
    981	struct dsi_context *ctx = &dsi->ctx;
    982
    983	dsi->slave = slave;
    984
    985	if (slave->mode_flags & MIPI_DSI_MODE_VIDEO)
    986		ctx->work_mode = DSI_MODE_VIDEO;
    987	else
    988		ctx->work_mode = DSI_MODE_CMD;
    989
    990	if (slave->mode_flags & MIPI_DSI_MODE_VIDEO_BURST)
    991		ctx->burst_mode = VIDEO_BURST_WITH_SYNC_PULSES;
    992	else if (slave->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)
    993		ctx->burst_mode = VIDEO_NON_BURST_WITH_SYNC_PULSES;
    994	else
    995		ctx->burst_mode = VIDEO_NON_BURST_WITH_SYNC_EVENTS;
    996
    997	return component_add(host->dev, &dsi_component_ops);
    998}
    999
   1000static int sprd_dsi_host_detach(struct mipi_dsi_host *host,
   1001				struct mipi_dsi_device *slave)
   1002{
   1003	component_del(host->dev, &dsi_component_ops);
   1004
   1005	return 0;
   1006}
   1007
   1008static ssize_t sprd_dsi_host_transfer(struct mipi_dsi_host *host,
   1009				      const struct mipi_dsi_msg *msg)
   1010{
   1011	struct sprd_dsi *dsi = host_to_dsi(host);
   1012	const u8 *tx_buf = msg->tx_buf;
   1013
   1014	if (msg->rx_buf && msg->rx_len) {
   1015		u8 lsb = (msg->tx_len > 0) ? tx_buf[0] : 0;
   1016		u8 msb = (msg->tx_len > 1) ? tx_buf[1] : 0;
   1017
   1018		return sprd_dsi_rd_pkt(&dsi->ctx, msg->channel, msg->type,
   1019				msb, lsb, msg->rx_buf, msg->rx_len);
   1020	}
   1021
   1022	if (msg->tx_buf && msg->tx_len)
   1023		return sprd_dsi_wr_pkt(&dsi->ctx, msg->channel, msg->type,
   1024					tx_buf, msg->tx_len);
   1025
   1026	return 0;
   1027}
   1028
   1029static const struct mipi_dsi_host_ops sprd_dsi_host_ops = {
   1030	.attach = sprd_dsi_host_attach,
   1031	.detach = sprd_dsi_host_detach,
   1032	.transfer = sprd_dsi_host_transfer,
   1033};
   1034
   1035static const struct of_device_id dsi_match_table[] = {
   1036	{ .compatible = "sprd,sharkl3-dsi-host" },
   1037	{ /* sentinel */ },
   1038};
   1039
   1040static int sprd_dsi_probe(struct platform_device *pdev)
   1041{
   1042	struct device *dev = &pdev->dev;
   1043	struct sprd_dsi *dsi;
   1044
   1045	dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
   1046	if (!dsi)
   1047		return -ENOMEM;
   1048
   1049	dev_set_drvdata(dev, dsi);
   1050
   1051	dsi->host.ops = &sprd_dsi_host_ops;
   1052	dsi->host.dev = dev;
   1053
   1054	return mipi_dsi_host_register(&dsi->host);
   1055}
   1056
   1057static int sprd_dsi_remove(struct platform_device *pdev)
   1058{
   1059	struct sprd_dsi *dsi = dev_get_drvdata(&pdev->dev);
   1060
   1061	mipi_dsi_host_unregister(&dsi->host);
   1062
   1063	return 0;
   1064}
   1065
   1066struct platform_driver sprd_dsi_driver = {
   1067	.probe = sprd_dsi_probe,
   1068	.remove = sprd_dsi_remove,
   1069	.driver = {
   1070		.name = "sprd-dsi-drv",
   1071		.of_match_table = dsi_match_table,
   1072	},
   1073};
   1074
   1075MODULE_AUTHOR("Leon He <leon.he@unisoc.com>");
   1076MODULE_AUTHOR("Kevin Tang <kevin.tang@unisoc.com>");
   1077MODULE_DESCRIPTION("Unisoc MIPI DSI HOST Controller Driver");
   1078MODULE_LICENSE("GPL v2");