From c401e4da2401d9c2b4ad6d8725fec7614b9d1d94 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Mon, 18 Dec 2023 17:53:04 +0800 Subject: [PATCH 1/3] drm/rockchip: vop2: fix other display dev do disable and enable when disable writeback At following commit, we update connectors_changed flag for writeback enable lead to other display dev do disable and enable: c7e2a3387eb9 ("drm/rockchip: vop2: No need for a full modested when the only writeback connector changed") And revert the drm framework update for GKI: 82a56746d9be ("Revert "drm: Not mark crtc state as connectors_changed when a writeback connector attatch to a crtc"") But when writeback disable, the DRM framework still thought crtc connectors is changed and set connectors_changed to true, this will lead other display dev do disable and enable, so we add this commit to fix it. Signed-off-by: Sandy Huang Change-Id: Ie69d63ea19110251273eb8969fc40a4fceb5e309 --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index f765f6011636..2c7a66adfb75 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -3245,8 +3245,21 @@ static int vop2_wb_encoder_atomic_check(struct drm_encoder *encoder, return 0; } +static void vop2_wb_encoder_atomic_disable(struct drm_encoder *encoder, + struct drm_atomic_state *state) +{ + struct drm_crtc *crtc = encoder->crtc; + struct vop2_video_port *vp = to_vop2_video_port(crtc); + + if (!crtc->state->active_changed && !crtc->state->mode_changed) { + crtc->state->connectors_changed = false; + DRM_DEBUG("VP%d force change connectors_changed to false when disable wb\n", vp->id); + } +} + static const struct drm_encoder_helper_funcs vop2_wb_encoder_helper_funcs = { .atomic_check = vop2_wb_encoder_atomic_check, + .atomic_disable = vop2_wb_encoder_atomic_disable, }; static const struct drm_connector_helper_funcs vop2_wb_connector_helper_funcs = { From 9403086898909e841681fa93a6cb5480290cf9b5 Mon Sep 17 00:00:00 2001 From: Jon Lin Date: Wed, 20 Dec 2023 12:02:14 +0800 Subject: [PATCH 2/3] spi: spidev_rkslv: Support dynamic adjustment of system performance If the DRAM frequency conversion jitters during the transmission process, it will cause the DMA to be unable to transport SPI FIFO data in a timely manner, resulting in FIFO overflow/underflow. Clear performance status for short cmd packet and Set the performance status for data packet. Change-Id: I65532ba309677a8d98c8277875a3bd358ca44e44 Signed-off-by: Jon Lin --- drivers/spi/spidev-rkslv.c | 45 ++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/drivers/spi/spidev-rkslv.c b/drivers/spi/spidev-rkslv.c index 0ff4415ff7e3..9f8cfcc6d8ee 100644 --- a/drivers/spi/spidev-rkslv.c +++ b/drivers/spi/spidev-rkslv.c @@ -13,6 +13,8 @@ #include #include +#include + #define SPI_OBJ_MAX_XFER_SIZE 0x1040 #define SPI_OBJ_APP_RAM_SIZE 0x10000 @@ -22,6 +24,8 @@ #define SPI_OBJ_CTRL_CMD_WRITE 0x4B #define SPI_OBJ_CTRL_CMD_DUPLEX 0x5C +#define SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD 0x20 + struct spi_obj_ctrl { u16 cmd; u16 addr; @@ -38,42 +42,60 @@ struct spidev_rkslv_data { struct task_struct *tsk; bool tsk_run; struct miscdevice misc_dev; + + /* + * If the DRAM frequency conversion jitters during the transmission process, + * it will cause the DMA to be unable to transport SPI FIFO data in a timely + * manner, resulting in FIFO overflow/underflow. + * + * However, since the command packet length is smaller than FIFO, this + * problem does not exist. So set performance status dynamically for data packet. + */ + bool dyq_perf; }; static u32 bit_per_word = 8; -static int spidev_slv_write(struct spidev_rkslv_data *spidev, const void *txbuf, size_t n) +static int spidev_slv_write(struct spidev_rkslv_data *spidev, const void *txbuf, size_t len) { - int ret = -1; struct spi_device *spi = spidev->spi; struct spi_transfer t = { .tx_buf = txbuf, - .len = n, + .len = len, .bits_per_word = bit_per_word, }; struct spi_message m; + int ret; spi_message_init(&m); spi_message_add_tail(&t, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_set_system_status(SYS_STATUS_PERFORMANCE); ret = spi_sync(spi, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_clear_system_status(SYS_STATUS_PERFORMANCE); return ret; } -static int spidev_slv_read(struct spidev_rkslv_data *spidev, void *rxbuf, size_t n) +static int spidev_slv_read(struct spidev_rkslv_data *spidev, void *rxbuf, size_t len) { - int ret = -1; struct spi_device *spi = spidev->spi; struct spi_transfer t = { .rx_buf = rxbuf, - .len = n, + .len = len, .bits_per_word = bit_per_word, }; struct spi_message m; + int ret; spi_message_init(&m); spi_message_add_tail(&t, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_set_system_status(SYS_STATUS_PERFORMANCE); ret = spi_sync(spi, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_clear_system_status(SYS_STATUS_PERFORMANCE); return ret; } @@ -88,10 +110,18 @@ static int spidev_slv_write_and_read(struct spidev_rkslv_data *spidev, const voi .len = len, }; struct spi_message m; + int ret; spi_message_init(&m); spi_message_add_tail(&t, &m); - return spi_sync(spi, &m); + + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_set_system_status(SYS_STATUS_PERFORMANCE); + ret = spi_sync(spi, &m); + if (spidev->dyq_perf && len > SPI_OBJ_CTRL_DYQ_PERF_THRESHOLD) + rockchip_clear_system_status(SYS_STATUS_PERFORMANCE); + + return ret; } static ssize_t spidev_rkslv_misc_write(struct file *filp, const char __user *buf, @@ -318,6 +348,7 @@ static int spidev_rkslv_probe(struct spi_device *spi) if (!spidev->tempbuf) return -ENOMEM; + spidev->dyq_perf = true; spidev->spi = spi; spidev->dev = &spi->dev; dev_set_drvdata(&spi->dev, spidev); From 87d068845824b89f96208feb628be75bdd2b1f1e Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Mon, 18 Dec 2023 17:26:54 +0800 Subject: [PATCH 3/3] drm/bridge: synopsys: Fix no sound on some TVs This patch do full hw params re-configuation instead of the reset one. Fixes: 0c2c6c94303c ("drm/bridge: synopsys: Fix wrong FIFO reset on AUD_CONF0") Signed-off-by: Sugar Zhang Change-Id: I1e259797ce22cd9a3be7086e1f21bd02c440ac57 --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c index e621021dc50a..7ec390d46ca5 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio.c @@ -145,18 +145,7 @@ static int dw_hdmi_i2s_prepare(struct device *dev, void *data, struct hdmi_codec_daifmt *fmt, struct hdmi_codec_params *hparms) { - struct dw_hdmi_i2s_audio_data *audio = data; - struct dw_hdmi *hdmi = audio->hdmi; - - dw_hdmi_audio_disable(hdmi); - - hdmi_update_bits(audio, HDMI_AUD_CONF0_SW_RESET, - HDMI_AUD_CONF0_SW_RESET, HDMI_AUD_CONF0); - hdmi_write(audio, (u8)~HDMI_MC_SWRSTZ_I2SSWRST_REQ, HDMI_MC_SWRSTZ); - - dw_hdmi_audio_enable(hdmi); - - return 0; + return dw_hdmi_i2s_hw_params(dev, data, fmt, hparms); } static int dw_hdmi_i2s_audio_startup(struct device *dev, void *data)