From f792fcee7ddb8752ee9af1fc9ef1960d0c8ddf11 Mon Sep 17 00:00:00 2001 From: Zheng Zhiqi Date: Thu, 1 Feb 2024 17:17:45 +0800 Subject: [PATCH 01/10] ASoC: rockchip-spi-codec: fix kctonrol mute case crash fix kcontrol mute case crash, tested by `dumpsys car_service inject-vhal-event 289475072 1,0`. [ 136.260357][ T632] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010 [ 136.262328][ T632] Mem abort info: [ 136.264924][ T632] ESR = 0x96000005 [ 136.265362][ T632] EC = 0x25: DABT (current EL), IL = 32 bits [ 136.266072][ T632] SET = 0, FnV = 0 [ 136.266406][ T632] EA = 0, S1PTW = 0 [ 136.266772][ T632] Data abort info: [ 136.267094][ T632] ISV = 0, ISS = 0x00000005 [ 136.267518][ T632] CM = 0, WnR = 0 [ 136.267853][ T632] user pgtable: 4k pages, 39-bit VAs, pgdp=000000012871b000 [ 136.268492][ T632] [0000000000000010] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000 [ 136.269342][ T632] Internal error: Oops: 96000005 [#1] PREEMPT SMP [ 136.269899][ T632] Modules linked in: ahci_platform libahci_platform himax_mmi ohci_platform ili210x ohci_hcd [ 136.270788][ T632] CPU: 2 PID: 632 Comm: android.hardwar Not tainted 5.10.198 #46 [ 136.271453][ T632] Hardware name: Rockchip RK3588 VEHICLE EVB V22 Board (DT) [ 136.272077][ T632] pstate: 80400009 (Nzcv daif +PAN -UAO -TCO BTYPE=--) [ 136.272673][ T632] pc : spi_codec_ext_ch_mute_put+0x14/0x40 [ 136.273178][ T632] lr : snd_ctl_elem_write+0x128/0x16c [ 136.273636][ T632] sp : ffffffc00e44bc10 [ 136.273987][ T632] x29: ffffffc00e44bc10 x28: ffffff811e293900 [ 136.274514][ T632] x27: 0000000000000000 x26: 0000000000000000 [ 136.275040][ T632] x25: 0000000000000000 x24: ffffff81006024a0 [ 136.275566][ T632] x23: ffffff8100602000 x22: 00000000c4c85513 [ 136.276092][ T632] x21: ffffff8110838b00 x20: ffffff811cf0f000 [ 136.276618][ T632] x19: ffffff8100602000 x18: ffffffc00dc45040 [ 136.277144][ T632] x17: 0000000020000000 x16: 0000000000000001 [ 136.277669][ T632] x15: 0000000000000000 x14: 000000020000001a [ 136.278195][ T632] x13: 754d206b63616279 x12: 0000000000000000 [ 136.278722][ T632] x11: 0000000000006574 x10: 0000000000000000 [ 136.279249][ T632] x9 : 0000000000000004 x8 : ffffff81038eb000 [ 136.279781][ T632] x7 : 0000000000000000 x6 : ffffff811cf0f4c8 [ 136.280311][ T632] x5 : ffffff811cf0f4c8 x4 : 0000000000000000 [ 136.280840][ T632] x3 : 0000000000000000 x2 : ffffff811cf0f000 [ 136.281367][ T632] x1 : ffffff811cf0f000 x0 : ffffff8107260c00 [ 136.281894][ T632] Call trace: [ 136.282184][ T632] spi_codec_ext_ch_mute_put+0x14/0x40 [ 136.282655][ T632] snd_ctl_elem_write+0x128/0x16c [ 136.283083][ T632] snd_ctl_ioctl+0x7dc/0xb48 [ 136.283479][ T632] __arm64_sys_ioctl+0x90/0xc8 [ 136.283888][ T632] el0_svc_common+0xac/0x1ac [ 136.284283][ T632] do_el0_svc+0x1c/0x28 [ 136.284637][ T632] el0_svc+0x10/0x1c [ 136.284968][ T632] el0_sync_handler+0x68/0xac [ 136.285374][ T632] el0_sync+0x164/0x180 Change-Id: I35ec1fb0974b8dd9b58bd6d8b2b362a414cb4cd7 Signed-off-by: Zheng Zhiqi --- sound/soc/codecs/rockchip-spi-codec.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/sound/soc/codecs/rockchip-spi-codec.c b/sound/soc/codecs/rockchip-spi-codec.c index 6011e9451ff3..262e51a0f9e3 100644 --- a/sound/soc/codecs/rockchip-spi-codec.c +++ b/sound/soc/codecs/rockchip-spi-codec.c @@ -148,8 +148,7 @@ static int spi_codec_ext_ch_mute_get(struct snd_kcontrol *kcontrol, { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct spi_codec_private *priv = snd_soc_component_get_drvdata(component); - struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - unsigned int ch = mc->reg; + unsigned int ch = (unsigned int)kcontrol->private_value; ucontrol->value.integer.value[0] = priv->tdm_mute[ch]; @@ -161,8 +160,7 @@ static int spi_codec_ext_ch_mute_put(struct snd_kcontrol *kcontrol, { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct spi_codec_private *priv = snd_soc_component_get_drvdata(component); - struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; - unsigned int ch = mc->reg; + unsigned int ch = (unsigned int)kcontrol->private_value; priv->tdm_mute[ch] = ucontrol->value.integer.value[0]; From 497d03d9a278624a1869cceeae26fde5f7c4338d Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Wed, 31 Jan 2024 21:01:12 +0800 Subject: [PATCH 02/10] media: rockchip: vicap fixes dma_en logic err with constrant electricity and readback mode Signed-off-by: Zefa Chen Change-Id: I39c407234d07803f5880ed378f05814e510b528b --- drivers/media/platform/rockchip/cif/capture.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 781028938897..b68234830445 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -4535,7 +4535,8 @@ static void rkcif_check_buffer_update_pingpong(struct rkcif_stream *stream, stream->to_stop_dma = 0; wake_up(&stream->wq_stopped); } else { - stream->to_en_dma = RKCIF_DMAEN_BY_VICAP; + if (stream->cifdev->resume_mode != RKISP_RTT_MODE_ONE_FRAME) + stream->to_en_dma = RKCIF_DMAEN_BY_VICAP; v4l2_dbg(3, rkcif_debug, &stream->cifdev->v4l2_dev, "%s stream[%d] start dma capture, frame cnt %d\n", __func__, stream->id, stream->frame_idx); @@ -7516,6 +7517,7 @@ static long rkcif_ioctl_default(struct file *file, void *fh, rkcif_dphy_quick_stream(dev, stream_param->on); v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl, RKMODULE_SET_QUICK_STREAM, &stream_param->on); + dev->resume_mode = RKISP_RTT_MODE_MULTI_FRAME; } else { if (dev->sditf[0]->mode.rdbk_mode == RKISP_VICAP_ONLINE) { for (i = 0; i < stream_num - 1; i++) { From 3258128cd9dd2e61e37edfb17388a265da5d9d8c Mon Sep 17 00:00:00 2001 From: Lin Jinhan Date: Thu, 25 Jan 2024 16:11:36 +0800 Subject: [PATCH 03/10] crypto: rockchip: cryptodev: add akcipher_request_set_callback for rsa Missing akcipher_request_set_callback will cause a process exception when rsa works in asynchronous mode. Signed-off-by: Lin Jinhan Change-Id: I99d3ffde471269528f42869d052004a25a6c14b0 --- drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev.c b/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev.c index bf85f657e619..b2073fcb2721 100644 --- a/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev.c +++ b/drivers/crypto/rockchip/cryptodev_linux/rk_cryptodev.c @@ -708,6 +708,9 @@ static int crypto_rsa_run(struct fcrypt *fcr, struct kernel_crypt_rsa_op *krop) crypto_init_wait(&wait); akcipher_request_set_crypt(req, &src, &dst, rop->in_len, out_len_max); + akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, + crypto_req_done, &wait); + switch (rop->op) { case AOP_ENCRYPT: ret = crypto_wait_req(crypto_akcipher_encrypt(req), &wait); From ad8ec7ddd07dce6569af1542102b51de09206a07 Mon Sep 17 00:00:00 2001 From: Lin Jinhan Date: Wed, 31 Jan 2024 10:39:32 +0800 Subject: [PATCH 04/10] crypto: rockchip: cryptodev: cipher support multithreading Only HASH multithreading is restricted by the hardware. Therefore, cipher removes the restriction on multithreading. Signed-off-by: Lin Jinhan Change-Id: I8ec0cb31cd51e6acfa5582cd7778d6482674f1de --- .../crypto/rockchip/cryptodev_linux/ioctl.c | 39 ++++++------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/drivers/crypto/rockchip/cryptodev_linux/ioctl.c b/drivers/crypto/rockchip/cryptodev_linux/ioctl.c index 032b016e476b..58d89a882295 100644 --- a/drivers/crypto/rockchip/cryptodev_linux/ioctl.c +++ b/drivers/crypto/rockchip/cryptodev_linux/ioctl.c @@ -324,8 +324,9 @@ crypto_create_session(struct fcrypt *fcr, struct session_op *sop) goto session_error; } - /* Non-multithreaded can only create one session */ - if (!rk_cryptodev_multi_thread(NULL) && + /* Non-multithreaded can only create one session for hash */ + if (ses_new->hdata.init && + !rk_cryptodev_multi_thread(NULL) && !atomic_dec_and_test(&cryptodev_sess)) { atomic_inc(&cryptodev_sess); ddebug(2, "Non-multithreaded can only create one session. sess = %d", @@ -379,6 +380,14 @@ crypto_destroy_session(struct csession *ses_ptr) mutex_lock(&ses_ptr->sem); } ddebug(2, "Removed session 0x%08X", ses_ptr->sid); + + /* Non-multithreaded can only create one session for hash */ + if (ses_ptr->hdata.init && + !rk_cryptodev_multi_thread(NULL)) { + atomic_inc(&cryptodev_sess); + ddebug(2, "Release cryptodev_sess = %d", atomic_read(&cryptodev_sess)); + } + cryptodev_cipher_deinit(&ses_ptr->cdata); cryptodev_hash_deinit(&ses_ptr->hdata); ddebug(2, "freeing space for %d user pages", ses_ptr->array_size); @@ -387,12 +396,6 @@ crypto_destroy_session(struct csession *ses_ptr) mutex_unlock(&ses_ptr->sem); mutex_destroy(&ses_ptr->sem); kfree(ses_ptr); - - /* Non-multithreaded can only create one session */ - if (!rk_cryptodev_multi_thread(NULL)) { - atomic_inc(&cryptodev_sess); - ddebug(2, "Release cryptodev_sess = %d", atomic_read(&cryptodev_sess)); - } } /* Look up a session by ID and remove. */ @@ -567,8 +570,6 @@ static void cryptask_routine(struct work_struct *work) } /* ====== /dev/crypto ====== */ -static atomic_t cryptodev_node = ATOMIC_INIT(1); - static int cryptodev_open(struct inode *inode, struct file *filp) { @@ -576,18 +577,6 @@ cryptodev_open(struct inode *inode, struct file *filp) struct crypt_priv *pcr; int i; - /* Non-multithreaded can only be opened once */ - if (!rk_cryptodev_multi_thread(NULL) && - !atomic_dec_and_test(&cryptodev_node)) { - atomic_inc(&cryptodev_node); - ddebug(2, "Non-multithreaded can only be opened once. node = %d", - atomic_read(&cryptodev_node)); - return -EBUSY; - } - - /* make sure sess == 1 after open */ - atomic_set(&cryptodev_sess, 1); - pcr = kzalloc(sizeof(*pcr), GFP_KERNEL); if (!pcr) return -ENOMEM; @@ -646,12 +635,6 @@ cryptodev_release(struct inode *inode, struct file *filp) if (!pcr) return 0; - /* Non-multithreaded can only be opened once */ - if (!rk_cryptodev_multi_thread(NULL)) { - atomic_inc(&cryptodev_node); - ddebug(2, "Release cryptodev_node = %d", atomic_read(&cryptodev_node)); - } - cancel_work_sync(&pcr->cryptask); list_splice_tail(&pcr->todo.list, &pcr->free.list); From b2cdfdd52ad0ab0f5b079dd014fcf327159bb9d6 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Wed, 31 Jan 2024 14:16:02 +0800 Subject: [PATCH 05/10] media: rockchip: isp: fix isp32 bp min output Change-Id: Ic711a9b668cc6f832d4752700e63db54a50ed594 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture.c | 8 -------- drivers/media/platform/rockchip/isp/capture.h | 8 ++++++++ drivers/media/platform/rockchip/isp/capture_v32.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index bad561885b92..76165eb4ba92 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -13,14 +13,6 @@ #include "regs.h" #include "rkisp_tb_helper.h" -#define STREAM_MAX_MP_RSZ_OUTPUT_WIDTH 4416 -#define STREAM_MAX_MP_RSZ_OUTPUT_HEIGHT 3312 -#define STREAM_MAX_SP_RSZ_OUTPUT_WIDTH 1920 -#define STREAM_MAX_SP_RSZ_OUTPUT_HEIGHT 1080 -#define STREAM_MIN_RSZ_OUTPUT_WIDTH 32 -#define STREAM_MIN_RSZ_OUTPUT_HEIGHT 32 -#define STREAM_OUTPUT_STEP_WISE 8 - #define STREAM_MIN_MP_SP_INPUT_WIDTH STREAM_MIN_RSZ_OUTPUT_WIDTH #define STREAM_MIN_MP_SP_INPUT_HEIGHT STREAM_MIN_RSZ_OUTPUT_HEIGHT diff --git a/drivers/media/platform/rockchip/isp/capture.h b/drivers/media/platform/rockchip/isp/capture.h index d382f6cd888c..26b9ee90aa6c 100644 --- a/drivers/media/platform/rockchip/isp/capture.h +++ b/drivers/media/platform/rockchip/isp/capture.h @@ -57,6 +57,14 @@ #define DMATX2_VDEV_NAME DRIVER_NAME "_rawwr2" #define DMATX3_VDEV_NAME DRIVER_NAME "_rawwr3" +#define STREAM_MAX_MP_RSZ_OUTPUT_WIDTH 4416 +#define STREAM_MAX_MP_RSZ_OUTPUT_HEIGHT 3312 +#define STREAM_MAX_SP_RSZ_OUTPUT_WIDTH 1920 +#define STREAM_MAX_SP_RSZ_OUTPUT_HEIGHT 1080 +#define STREAM_MIN_RSZ_OUTPUT_WIDTH 32 +#define STREAM_MIN_RSZ_OUTPUT_HEIGHT 32 +#define STREAM_OUTPUT_STEP_WISE 8 + struct rkisp_stream; enum { diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index e33313869ce1..a0d60cbd16e6 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -359,8 +359,8 @@ static struct stream_config rkisp_bp_stream_config = { .fmt_size = ARRAY_SIZE(bp_fmts), .max_rsz_width = CIF_ISP_INPUT_W_MAX_V32, .max_rsz_height = CIF_ISP_INPUT_H_MAX_V32, - .min_rsz_width = CIF_ISP_INPUT_W_MIN, - .min_rsz_height = CIF_ISP_INPUT_H_MIN, + .min_rsz_width = STREAM_MIN_RSZ_OUTPUT_WIDTH, + .min_rsz_height = STREAM_MIN_RSZ_OUTPUT_HEIGHT, .frame_end_id = ISP3X_MI_BP_FRAME, .rsz = { .ctrl = ISP32_BP_RESIZE_CTRL, From ecb73404914e56776ce78cb0bdeae6a3ec6665aa Mon Sep 17 00:00:00 2001 From: Jianwei Fan Date: Mon, 29 Jan 2024 09:58:01 +0000 Subject: [PATCH 06/10] video: rockchip: vehicle: fix errors of get cif rst and irq Signed-off-by: Jianwei Fan Change-Id: Ib84dbf242bb6611ed1ccbacf1b66e7ba23861cca --- drivers/video/rockchip/vehicle/vehicle_cif.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/video/rockchip/vehicle/vehicle_cif.c b/drivers/video/rockchip/vehicle/vehicle_cif.c index ca9f092075fd..2671d9bc1394 100644 --- a/drivers/video/rockchip/vehicle/vehicle_cif.c +++ b/drivers/video/rockchip/vehicle/vehicle_cif.c @@ -5136,7 +5136,7 @@ int vehicle_cif_init(struct vehicle_cif *cif) for (i = 0; i < clk->rsts_num; i++) { struct reset_control *rst = NULL; - if (rk3568_cif_rsts[i]) + if (rk3588_cif_rsts[i]) rst = devm_reset_control_get(dev, rk3588_cif_rsts[i]); if (IS_ERR(rst)) { dev_err(dev, "failed to get %s\n", rk3588_cif_rsts[i]); @@ -5148,7 +5148,7 @@ int vehicle_cif_init(struct vehicle_cif *cif) for (i = 0; i < clk->rsts_num; i++) { struct reset_control *rst = NULL; - if (rk3568_cif_rsts[i]) + if (rk3562_cif_rsts[i]) rst = devm_reset_control_get(dev, rk3562_cif_rsts[i]); if (IS_ERR(rst)) { dev_err(dev, "failed to get %s\n", rk3562_cif_rsts[i]); @@ -5181,13 +5181,15 @@ int vehicle_cif_init(struct vehicle_cif *cif) /* 3. request cif irq & mipi csi irq1-2 */ if (cif->chip_id >= CHIP_RK3588_VEHICLE_CIF) { - ret = request_irq(cif->irq, rk_camera_irq_v1, IRQF_SHARED, "vehicle_cif", cif); + ret = devm_request_irq(dev, cif->irq, + rk_camera_irq_v1, IRQF_SHARED, "vehicle_cif", cif); if (ret < 0) { VEHICLE_DGERR("request cif irq failed!\n"); return -EINVAL; } } else { - ret = request_irq(cif->irq, rk_camera_irq, IRQF_SHARED, "vehicle_cif", cif); + ret = devm_request_irq(dev, cif->irq, + rk_camera_irq, IRQF_SHARED, "vehicle_cif", cif); if (ret < 0) { VEHICLE_DGERR("request cif irq failed!\n"); return -EINVAL; @@ -5197,14 +5199,14 @@ int vehicle_cif_init(struct vehicle_cif *cif) VEHICLE_DG("%s(%d):\n", __func__, __LINE__); if (inf_id == RKCIF_MIPI_LVDS) { - ret = request_irq(cif->csi2_irq1, vehicle_csirx_irq1, + ret = devm_request_irq(dev, cif->csi2_irq1, vehicle_csirx_irq1, IRQF_SHARED, "vehicle_csi_intr1", cif); if (ret < 0) { VEHICLE_DGERR("request csirx irq1 failed!\n"); return -EINVAL; } - ret = request_irq(cif->csi2_irq2, vehicle_csirx_irq2, + ret = devm_request_irq(dev, cif->csi2_irq2, vehicle_csirx_irq2, IRQF_SHARED, "vehicle_csi_intr2", cif); if (ret < 0) { VEHICLE_DGERR("request csirx irq2 failed!\n"); @@ -5318,10 +5320,10 @@ int vehicle_cif_deinit(struct vehicle_cif *cif) mutex_destroy(&dphy_hw->mutex); } - free_irq(cif->irq, cif); + devm_free_irq(dev, cif->irq, cif); if (inf_id == RKCIF_MIPI_LVDS) { - free_irq(cif->csi2_irq1, cif); - free_irq(cif->csi2_irq2, cif); + devm_free_irq(dev, cif->csi2_irq1, cif); + devm_free_irq(dev, cif->csi2_irq2, cif); } if (cif->err_state.err_print_wq) { flush_workqueue(cif->err_state.err_print_wq); From 270a72866c410811f779cf4c95328a801f72633f Mon Sep 17 00:00:00 2001 From: Jianwei Fan Date: Sat, 13 Jan 2024 02:31:35 +0000 Subject: [PATCH 07/10] media: i2c: rk628: add signal lost event report Change-Id: I0cc2f643486ef3eebd3503d71e1aa5fdadaef0c2 Signed-off-by: Jianwei Fan --- drivers/media/i2c/rk628/rk628_csi_v4l2.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/media/i2c/rk628/rk628_csi_v4l2.c b/drivers/media/i2c/rk628/rk628_csi_v4l2.c index 303e92c77168..d9225e0eb89b 100644 --- a/drivers/media/i2c/rk628/rk628_csi_v4l2.c +++ b/drivers/media/i2c/rk628/rk628_csi_v4l2.c @@ -34,6 +34,7 @@ #include #include #include