diff --git a/packages/audio/alsa-utils/scripts/soundconfig b/packages/audio/alsa-utils/scripts/soundconfig index ec097fc921..09d3ba4036 100755 --- a/packages/audio/alsa-utils/scripts/soundconfig +++ b/packages/audio/alsa-utils/scripts/soundconfig @@ -155,6 +155,10 @@ else # Amlogic GX HDMI and S/PDIF mixer $card 'AIU HDMI CTRL SRC' 'I2S' mixer $card 'AIU SPDIF SRC SEL' 'SPDIF' + +# ES8316 headphone jack + mixer $card 'Right Headphone Mixer Right DAC' on + mixer $card 'Left Headphone Mixer Left DAC' on fi exit 0 diff --git a/packages/linux/patches/default/linux-020-eld-constraints-for-compressed-formats.patch b/packages/linux/patches/default/linux-020-eld-constraints-for-compressed-formats.patch new file mode 100644 index 0000000000..bb74ff7bd7 --- /dev/null +++ b/packages/linux/patches/default/linux-020-eld-constraints-for-compressed-formats.patch @@ -0,0 +1,91 @@ +From a2769637a9b98c6809d4d25a3a20447a3ff7b23a Mon Sep 17 00:00:00 2001 +From: Matthias Reichl +Date: Fri, 19 Mar 2021 12:14:17 +0100 +Subject: [PATCH] ALSA: pcm: fix ELD constraints for some compressed audio + formats + +The SADs of compressed formats like AC3 and DTS contain the channel +and sample rate info of the audio data inside the compressed stream, +but when building constraints we must use the rates and formats used +to pass through the stream. eg 2ch 48kHz for AC3. + +Signed-off-by: Matthias Reichl +--- + sound/core/pcm_drm_eld.c | 38 +++++++++++++++++++++++++++++++++++--- + 1 file changed, 35 insertions(+), 3 deletions(-) + +diff --git a/sound/core/pcm_drm_eld.c b/sound/core/pcm_drm_eld.c +index 4b5faae5d16e5..e7ec7a8b9d420 100644 +--- a/sound/core/pcm_drm_eld.c ++++ b/sound/core/pcm_drm_eld.c +@@ -6,6 +6,7 @@ + #include + #include + #include ++#include + + static const unsigned int eld_rates[] = { + 32000, +@@ -17,9 +18,40 @@ static const unsigned int eld_rates[] = { + 192000, + }; + ++static unsigned int sad_format(const u8 *sad) ++{ ++ return (sad[0] & 0x78) >> 3; ++} ++ + static unsigned int sad_max_channels(const u8 *sad) + { +- return 1 + (sad[0] & 7); ++ switch (sad_format(sad)) { ++ case HDMI_AUDIO_CODING_TYPE_AC3: ++ case HDMI_AUDIO_CODING_TYPE_DTS: ++ case HDMI_AUDIO_CODING_TYPE_EAC3: ++ return 2; ++ case HDMI_AUDIO_CODING_TYPE_DTS_HD: ++ case HDMI_AUDIO_CODING_TYPE_MLP: ++ return 8; ++ default: ++ return 1 + (sad[0] & 7); ++ } ++} ++ ++static unsigned int sad_rate_mask(const u8 *sad) ++{ ++ switch (sad_format(sad)) { ++ case HDMI_AUDIO_CODING_TYPE_AC3: ++ case HDMI_AUDIO_CODING_TYPE_DTS: ++ return 0x07; // 32-48kHz ++ case HDMI_AUDIO_CODING_TYPE_EAC3: ++ return 0x7f; // 32-192kHz ++ case HDMI_AUDIO_CODING_TYPE_DTS_HD: ++ case HDMI_AUDIO_CODING_TYPE_MLP: ++ return 0x60; // 176.4, 192kHz ++ default: ++ return sad[1] & 0x7f; ++ } + } + + static int eld_limit_rates(struct snd_pcm_hw_params *params, +@@ -42,7 +74,7 @@ static int eld_limit_rates(struct snd_pcm_hw_params *params, + * requested number of channels. + */ + if (c->min <= max_channels) +- rate_mask |= sad[1]; ++ rate_mask |= sad_rate_mask(sad); + } + } + +@@ -70,7 +102,7 @@ static int eld_limit_channels(struct snd_pcm_hw_params *params, + rate_mask |= BIT(i); + + for (i = drm_eld_sad_count(eld); i > 0; i--, sad += 3) +- if (rate_mask & sad[1]) ++ if (rate_mask & sad_rate_mask(sad)) + t.max = max(t.max, sad_max_channels(sad)); + } + +-- +2.20.1 + diff --git a/projects/Rockchip/devices/RK3288/linux/default/linux.arm.conf b/projects/Rockchip/devices/RK3288/linux/default/linux.arm.conf index 480dfd076c..50e0a0a2ff 100644 --- a/projects/Rockchip/devices/RK3288/linux/default/linux.arm.conf +++ b/projects/Rockchip/devices/RK3288/linux/default/linux.arm.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.10.21 Kernel Configuration +# Linux/arm 5.10.30 Kernel Configuration # # @@ -538,7 +538,7 @@ CONFIG_ARM_CPUIDLE=y CONFIG_VFP=y CONFIG_VFPv3=y CONFIG_NEON=y -# CONFIG_KERNEL_MODE_NEON is not set +CONFIG_KERNEL_MODE_NEON=y # end of Floating point emulation # @@ -586,11 +586,20 @@ CONFIG_HAVE_ARM_SMCCC=y CONFIG_ARM_CRYPTO=y CONFIG_CRYPTO_SHA1_ARM=y +CONFIG_CRYPTO_SHA1_ARM_NEON=y +# CONFIG_CRYPTO_SHA1_ARM_CE is not set +# CONFIG_CRYPTO_SHA2_ARM_CE is not set CONFIG_CRYPTO_SHA256_ARM=y CONFIG_CRYPTO_SHA512_ARM=y CONFIG_CRYPTO_AES_ARM=y +CONFIG_CRYPTO_AES_ARM_BS=y +# CONFIG_CRYPTO_AES_ARM_CE is not set +# CONFIG_CRYPTO_GHASH_ARM_CE is not set +CONFIG_CRYPTO_CRC32_ARM_CE=y CONFIG_CRYPTO_CHACHA20_NEON=y CONFIG_CRYPTO_POLY1305_ARM=y +CONFIG_CRYPTO_NHPOLY1305_NEON=y +CONFIG_CRYPTO_CURVE25519_NEON=y CONFIG_AS_VFP_VMRS_FPINST=y # @@ -1059,8 +1068,7 @@ CONFIG_HAVE_PCI=y # # Generic Driver Options # -CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="" +# CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y @@ -5668,9 +5676,10 @@ CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set -# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_CRYPTD=y CONFIG_CRYPTO_AUTHENC=m # CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_SIMD=y CONFIG_CRYPTO_ENGINE=m # @@ -5707,6 +5716,7 @@ CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # CONFIG_CRYPTO_KEYWRAP is not set +CONFIG_CRYPTO_NHPOLY1305=y # CONFIG_CRYPTO_ADIANTUM is not set # CONFIG_CRYPTO_ESSIV is not set @@ -5787,7 +5797,7 @@ CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=m CONFIG_CRYPTO_JITTERENTROPY=m -CONFIG_CRYPTO_USER_API=m +CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=m @@ -5806,11 +5816,13 @@ CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m CONFIG_CRYPTO_LIB_BLAKE2S=m CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y CONFIG_CRYPTO_LIB_CHACHA=m -CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=y +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=y CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA256=y diff --git a/projects/Rockchip/devices/RK3328/linux/default/linux.aarch64.conf b/projects/Rockchip/devices/RK3328/linux/default/linux.aarch64.conf index 9dd3d023a7..a8bfe642c3 100644 --- a/projects/Rockchip/devices/RK3328/linux/default/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3328/linux/default/linux.aarch64.conf @@ -664,7 +664,7 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set -CONFIG_GCC_PLUGIN_RANDSTRUCT=y +# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set # CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE is not set # end of General architecture-dependent options @@ -1303,8 +1303,7 @@ CONFIG_HAVE_PCI=y # # Generic Driver Options # -CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="" +# CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y diff --git a/projects/Rockchip/devices/RK3399/linux/default/linux.aarch64.conf b/projects/Rockchip/devices/RK3399/linux/default/linux.aarch64.conf index fa6c1d94cd..f9e8817321 100644 --- a/projects/Rockchip/devices/RK3399/linux/default/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3399/linux/default/linux.aarch64.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.10.21 Kernel Configuration +# Linux/arm64 5.10.30 Kernel Configuration # # @@ -1372,8 +1372,7 @@ CONFIG_PCIE_ROCKCHIP_HOST=m # # Generic Driver Options # -CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="" +# CONFIG_UEVENT_HELPER is not set CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y @@ -1549,9 +1548,19 @@ CONFIG_VIRTIO_BLK=y # # NVME Support # -# CONFIG_BLK_DEV_NVME is not set -# CONFIG_NVME_FC is not set -# CONFIG_NVME_TARGET is not set +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +# CONFIG_NVME_HWMON is not set +CONFIG_NVME_FABRICS=m +CONFIG_NVME_FC=m +# CONFIG_NVME_TCP is not set +CONFIG_NVME_TARGET=m +# CONFIG_NVME_TARGET_PASSTHRU is not set +CONFIG_NVME_TARGET_LOOP=m +CONFIG_NVME_TARGET_FC=m +# CONFIG_NVME_TARGET_FCLOOP is not set +# CONFIG_NVME_TARGET_TCP is not set # end of NVME Support # diff --git a/projects/Rockchip/patches/linux/default/linux-1001-drm-rockchip.patch b/projects/Rockchip/patches/linux/default/linux-1001-drm-rockchip.patch index a73fa6e984..d6cb3fd1ef 100644 --- a/projects/Rockchip/patches/linux/default/linux-1001-drm-rockchip.patch +++ b/projects/Rockchip/patches/linux/default/linux-1001-drm-rockchip.patch @@ -3059,41 +3059,54 @@ index b3247a3a7290..f5617529dbb5 100644 RK3066_PLL_RATE_NB(426000000, 3, 213, 4, 32), From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee -Date: Wed, 3 Mar 2021 18:27:40 +0100 -Subject: [PATCH] HACK: drm/bridge: prefer RGB output over YUV422/YUV444 in - dw-hdmi +Date: Sat, 10 Apr 2021 16:54:26 +0200 +Subject: [PATCH] drm/bridge: dw-hdmi: fix RGB to YUV color space conversion +We are currently providing color space conversion coefficents +for RGB to YUV conversion for full range to full range. +This is wrong, since we are hardcoding YCC quantization range +limited in the AVI infoframe (which is correct according to +HDMI specs). This results in to dark colors if this conversion +is used. +I verfied this by setting YCC quantization range to full in +AVI infoframe which resulted in correct colors. Doing this, +however, will be ignored by some (most) sinks. + +This patch fixes this, by providing CSC coefficents which +convert RGB full range to YUV limited range for both BT601 +and BT709 colorspaces. + +Fixes: 9aaf880ed4ee ("imx-drm: Add mx6 hdmi transmitter support") +Signed-off-by: Alex Bee --- - drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) + drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c -index f86b8fa40ab6..00ca09956545 100644 +index 5716aabbaf50..508738edfac8 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c -@@ -2664,6 +2664,14 @@ static u32 *dw_hdmi_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge, - output_fmts[i++] = MEDIA_BUS_FMT_RGB101010_1X30; - } +@@ -81,15 +81,15 @@ static const u16 csc_coeff_rgb_out_eitu709[3][4] = { + }; -+ /* Hack: prefer output of RGB over YUV422/YUV444 for Rockchip, -+ * since color space conversion produces wrong results here -+ * TODO: investigate -+ */ -+ -+ if (is_tmds_allowed(info, mode, MEDIA_BUS_FMT_RGB888_1X24)) -+ output_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24; -+ - if ((info->color_formats & DRM_COLOR_FORMAT_YCRCB422) && - is_tmds_allowed(info, mode, MEDIA_BUS_FMT_UYVY8_1X16)) - output_fmts[i++] = MEDIA_BUS_FMT_UYVY8_1X16; -@@ -2672,10 +2680,6 @@ static u32 *dw_hdmi_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge, - is_tmds_allowed(info, mode, MEDIA_BUS_FMT_YUV8_1X24)) - output_fmts[i++] = MEDIA_BUS_FMT_YUV8_1X24; + static const u16 csc_coeff_rgb_in_eitu601[3][4] = { +- { 0x2591, 0x1322, 0x074b, 0x0000 }, +- { 0x6535, 0x2000, 0x7acc, 0x0200 }, +- { 0x6acd, 0x7534, 0x2000, 0x0200 } ++ { 0x2040, 0x1080, 0x0640, 0x0040 }, ++ { 0xe880, 0x1c00, 0xfb80, 0x0200 }, ++ { 0xed80, 0xf680, 0x1c00, 0x0200 } + }; -- /* Default 8bit RGB fallback */ -- if (is_tmds_allowed(info, mode, MEDIA_BUS_FMT_RGB888_1X24)) -- output_fmts[i++] = MEDIA_BUS_FMT_RGB888_1X24; -- - *num_output_fmts = i; + static const u16 csc_coeff_rgb_in_eitu709[3][4] = { +- { 0x2dc5, 0x0d9b, 0x049e, 0x0000 }, +- { 0x62f0, 0x2000, 0x7d11, 0x0200 }, +- { 0x6756, 0x78ab, 0x2000, 0x0200 } ++ { 0x2740, 0x0bc0, 0x0400, 0x0040 }, ++ { 0xe680, 0x1c00, 0xfd80, 0x0200 }, ++ { 0xea40, 0xf980, 0x1c00, 0x0200 } + }; - return output_fmts; + static const u16 csc_coeff_rgb_full_to_rgb_limited[3][4] = { + + diff --git a/projects/Rockchip/patches/linux/default/linux-1002-v4l2-rockchip.patch b/projects/Rockchip/patches/linux/default/linux-1002-v4l2-rockchip.patch index c3b24441ea..a00b59eead 100644 --- a/projects/Rockchip/patches/linux/default/linux-1002-v4l2-rockchip.patch +++ b/projects/Rockchip/patches/linux/default/linux-1002-v4l2-rockchip.patch @@ -1,4 +1,4 @@ -From f675d4c92c304ab18b2d35495ad988a5097f7570 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 23 May 2020 10:18:16 +0000 Subject: [PATCH] WIP: media: rkvdec: continue to gate clock when decoding @@ -34,7 +34,7 @@ index 87987a782d75..a1c33905970d 100644 rkvdec_job_finish(ctx, VB2_BUF_STATE_ERROR); } -From d7b43acd1c553dd7db2857e788d9181e0bf46807 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 23 May 2020 10:16:01 +0000 Subject: [PATCH] WIP: media: rkvdec: pm runtime dont use autosuspend before @@ -62,7 +62,7 @@ index a1c33905970d..8c2ff05e01f7 100644 } -From 958084181228d25b2e62f3a29974050d4aae6d74 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 23 May 2020 11:23:04 +0000 Subject: [PATCH] WIP: media: rkvdec: h264: return early when no reference @@ -120,7 +120,7 @@ index c115cd362a7f..d9a2fd9386e2 100644 if (idx >= ARRAY_SIZE(dec_params->dpb)) continue; -From 6468b5ada5761e13da563207de76b49cc5481763 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 23 May 2020 14:42:27 +0000 Subject: [PATCH] WIP: media: rkvdec: h264: add field decoding support @@ -237,7 +237,7 @@ index d9a2fd9386e2..d4f27ef7addd 100644 writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_CUR_POC0); -From d79b22857b95e78b98216ae53d3981a121ed05b9 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Tue, 29 Oct 2019 01:26:02 +0000 Subject: [PATCH] RFC: media: hantro: Fix H264 decoding of field encoded @@ -438,81 +438,7 @@ index 219283a06f52..7e35140a4f22 100644 /** -From 12de17b99d7e2389381657ad6f5328c95c6aad10 Mon Sep 17 00:00:00 2001 -From: Alex Bee -Date: Wed, 19 Aug 2020 21:12:54 +0200 -Subject: [PATCH] arm64: dts: rockchip: add rkvdec node for RK3328 - -Signed-off-by: Alex Bee ---- - .../bindings/media/rockchip,vdec.yaml | 5 +++++ - arch/arm64/boot/dts/rockchip/rk3328.dtsi | 21 ++++++++++++++++++- - 2 files changed, 25 insertions(+), 1 deletion(-) - -diff --git a/Documentation/devicetree/bindings/media/rockchip,vdec.yaml b/Documentation/devicetree/bindings/media/rockchip,vdec.yaml -index 8d35c327018b..4e4f07d3050c 100644 ---- a/Documentation/devicetree/bindings/media/rockchip,vdec.yaml -+++ b/Documentation/devicetree/bindings/media/rockchip,vdec.yaml -@@ -16,6 +16,11 @@ description: |- - properties: - compatible: - const: rockchip,rk3399-vdec -+ - items: -+ - enum: -+ - rockchip,rk3328-vdec -+ - const: rockchip,rk3399-vdec -+ - - reg: - maxItems: 1 -diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi -index 9358d302f5e4..b54ff9055e5f 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi -+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi -@@ -326,6 +326,10 @@ pd_hevc@RK3328_PD_HEVC { - }; - pd_video@RK3328_PD_VIDEO { - reg = ; -+ clocks = <&cru ACLK_RKVDEC>, -+ <&cru HCLK_RKVDEC>, -+ <&cru SCLK_VDEC_CABAC>, -+ <&cru SCLK_VDEC_CORE>; - }; - pd_vpu@RK3328_PD_VPU { - reg = ; -@@ -670,6 +674,21 @@ vpu_mmu: iommu@ff350800 { - power-domains = <&power RK3328_PD_VPU>; - }; - -+ rkvdec: video-codec@ff360000 { -+ compatible = "rockchip,rk3328-vdec", "rockchip,rk3399-vdec"; -+ reg = <0x0 0xff360000 0x0 0x480>; -+ interrupts = ; -+ interrupt-names = "vdpu"; -+ assigned-clocks = <&cru ACLK_RKVDEC>, <&cru SCLK_VDEC_CABAC>, -+ <&cru SCLK_VDEC_CORE>; -+ assigned-clock-rates = <500000000>, <300000000>, <250000000>; -+ clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>, -+ <&cru SCLK_VDEC_CABAC>, <&cru SCLK_VDEC_CORE>; -+ clock-names = "axi", "ahb", "cabac", "core"; -+ iommus = <&rkvdec_mmu>; -+ power-domains = <&power RK3328_PD_VIDEO>; -+ }; -+ - rkvdec_mmu: iommu@ff360480 { - compatible = "rockchip,iommu"; - reg = <0x0 0xff360480 0x0 0x40>, <0x0 0xff3604c0 0x0 0x40>; -@@ -678,7 +697,7 @@ rkvdec_mmu: iommu@ff360480 { - clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>; - clock-names = "aclk", "iface"; - #iommu-cells = <0>; -- status = "disabled"; -+ power-domains = <&power RK3328_PD_VIDEO>; - }; - - vop: vop@ff370000 { - -From 6e4661c70aef5e7d9a30e0bf0aa5cfa233fb94a1 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee Date: Wed, 14 Oct 2020 13:27:12 +0200 Subject: [PATCH] media: hantro: adapt to match 5.11 H.264 uapi changes @@ -540,7 +466,7 @@ index bc2af450a94c..7bdefcc2fc77 100644 if (dpb[i / 2].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM) -From 0c62ee6f28b97e6c9265761bb2c88cc544ec65f2 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee Date: Wed, 14 Oct 2020 13:42:01 +0200 Subject: [PATCH] media: rkvdec: adapt to match 5.11 H.264 uapi changes @@ -586,7 +512,7 @@ index d4f27ef7addd..627cd4efabef 100644 set_ps_field(hw_rps, DPB_INFO(i, j), idx | (1 << 4)); -From 8414ee78e57232ef2cbd169e1db6e30999801564 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee Date: Sun, 31 May 2020 18:22:01 +0200 Subject: [PATCH] media: hantro: rk3288: increase max ACLK @@ -612,60 +538,462 @@ index 7b299ee3e93d..23f793e73941 100644 /* * Supported formats. -From 739eb1964e8ca26371588e231c18efe842f08a3e Mon Sep 17 00:00:00 2001 -From: Jonas Karlman -Date: Sat, 23 May 2020 11:42:23 +0000 -Subject: [PATCH] HACK: media: rkvdec: soft reset +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Randy Li +Date: Sun, 6 Jan 2019 01:48:37 +0800 +Subject: [PATCH] soc: rockchip: power-domain: export idle request -NOTE: rkvdec does not fully self reset, trigger pm runtime suspend to unlock when rkvdec issue soft reset +We need to put the power status of HEVC IP into IDLE unless +we can't reset that IP or the SoC would crash down. +rockchip_pmu_idle_request(dev, true)---> enter idle +rockchip_pmu_idle_request(dev, false)---> exit idle + +Signed-off-by: Caesar Wang +Signed-off-by: Jeffy Chen +Signed-off-by: Randy Li --- - drivers/staging/media/rkvdec/rkvdec.c | 9 ++++++++- - drivers/staging/media/rkvdec/rkvdec.h | 1 + - 2 files changed, 9 insertions(+), 1 deletion(-) + drivers/soc/rockchip/pm_domains.c | 23 +++++++++++++++++++++++ + include/linux/rockchip_pmu.h | 15 +++++++++++++++ + include/soc/rockchip/pm_domains.h | 18 ++++++++++++++++++ + 3 files changed, 56 insertions(+) + create mode 100644 include/linux/rockchip_pmu.h + create mode 100644 include/soc/rockchip/pm_domains.h +diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c +index 54eb6cfc5d5b..727af107e6d3 100644 +--- a/drivers/soc/rockchip/pm_domains.c ++++ b/drivers/soc/rockchip/pm_domains.c +@@ -196,6 +196,29 @@ static int rockchip_pmu_set_idle_request(struct rockchip_pm_domain *pd, + return 0; + } + ++int rockchip_pmu_idle_request(struct device *dev, bool idle) ++{ ++ struct generic_pm_domain *genpd; ++ struct rockchip_pm_domain *pd; ++ int ret; ++ ++ if (IS_ERR_OR_NULL(dev)) ++ return -EINVAL; ++ ++ if (IS_ERR_OR_NULL(dev->pm_domain)) ++ return -EINVAL; ++ ++ genpd = pd_to_genpd(dev->pm_domain); ++ pd = to_rockchip_pd(genpd); ++ ++ mutex_lock(&pd->pmu->mutex); ++ ret = rockchip_pmu_set_idle_request(pd, idle); ++ mutex_unlock(&pd->pmu->mutex); ++ ++ return ret; ++} ++EXPORT_SYMBOL(rockchip_pmu_idle_request); ++ + static int rockchip_pmu_save_qos(struct rockchip_pm_domain *pd) + { + int i; +diff --git a/include/linux/rockchip_pmu.h b/include/linux/rockchip_pmu.h +new file mode 100644 +index 000000000000..720b3314e71a +--- /dev/null ++++ b/include/linux/rockchip_pmu.h +@@ -0,0 +1,15 @@ ++/* ++ * pm_domain.h - Definitions and headers related to device power domains. ++ * ++ * Copyright (C) 2017 Randy Li . ++ * ++ * This file is released under the GPLv2. ++ */ ++ ++#ifndef _LINUX_ROCKCHIP_PM_H ++#define _LINUX_ROCKCHIP_PM_H ++#include ++ ++int rockchip_pmu_idle_request(struct device *dev, bool idle); ++ ++#endif /* _LINUX_ROCKCHIP_PM_H */ +diff --git a/include/soc/rockchip/pm_domains.h b/include/soc/rockchip/pm_domains.h +new file mode 100644 +index 000000000000..690db6118636 +--- /dev/null ++++ b/include/soc/rockchip/pm_domains.h +@@ -0,0 +1,18 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef __SOC_ROCKCHIP_PM_DOMAINS_H ++#define __SOC_ROCKCHIP_PM_DOMAINS_H ++ ++#include ++ ++struct device; ++ ++#ifdef CONFIG_ROCKCHIP_PM_DOMAINS ++int rockchip_pmu_idle_request(struct device *dev, bool idle); ++#else ++static inline int rockchip_pmu_idle_request(struct device *dev, bool idle) ++{ ++ return -ENOTSUPP; ++} ++#endif ++ ++#endif + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Alex Bee +Date: Wed, 20 May 2020 17:04:47 +0200 +Subject: [PATCH] WIP: media: rkvdec: implement reset controls + +--- + .../bindings/media/rockchip,vdec.yaml | 19 +++++++ + drivers/staging/media/rkvdec/rkvdec-regs.h | 5 ++ + drivers/staging/media/rkvdec/rkvdec.c | 54 +++++++++++++++++++ + drivers/staging/media/rkvdec/rkvdec.h | 11 +++- + 4 files changed, 88 insertions(+), 1 deletion(-) + +diff --git a/Documentation/devicetree/bindings/media/rockchip,vdec.yaml b/Documentation/devicetree/bindings/media/rockchip,vdec.yaml +index 8d35c327018b..dfafdb671798 100644 +--- a/Documentation/devicetree/bindings/media/rockchip,vdec.yaml ++++ b/Documentation/devicetree/bindings/media/rockchip,vdec.yaml +@@ -43,6 +43,18 @@ properties: + iommus: + maxItems: 1 + ++ resets: ++ maxItems: 6 ++ ++ reset-names: ++ items: ++ - const: video_h ++ - const: video_a ++ - const: video_core ++ - const: video_cabac ++ - const: niu_a ++ - const: niu_h ++ + required: + - compatible + - reg +@@ -50,6 +62,8 @@ required: + - clocks + - clock-names + - power-domains ++ - resets ++ - reset-names + + additionalProperties: false + +@@ -68,6 +82,11 @@ examples: + clock-names = "axi", "ahb", "cabac", "core"; + power-domains = <&power RK3399_PD_VDU>; + iommus = <&vdec_mmu>; ++ resets = <&cru SRST_H_VDU>, <&cru SRST_A_VDU>, ++ <&cru SRST_VDU_CORE>, <&cru SRST_VDU_CA>, ++ <&cru SRST_A_VDU_NOC>, <&cru SRST_H_VDU_NOC>; ++ reset-names = "video_h", "video_a", "video_core", "video_cabac", ++ "niu_a", "niu_h"; + }; + + ... +diff --git a/drivers/staging/media/rkvdec/rkvdec-regs.h b/drivers/staging/media/rkvdec/rkvdec-regs.h +index 15b9bee92016..3acc914888f6 100644 +--- a/drivers/staging/media/rkvdec/rkvdec-regs.h ++++ b/drivers/staging/media/rkvdec/rkvdec-regs.h +@@ -28,6 +28,11 @@ + #define RKVDEC_SOFTRST_EN_P BIT(20) + #define RKVDEC_FORCE_SOFTRESET_VALID BIT(21) + #define RKVDEC_SOFTRESET_RDY BIT(22) ++#define RKVDEC_ERR_MASK (RKVDEC_BUS_STA \ ++ | RKVDEC_ERR_STA \ ++ | RKVDEC_TIMEOUT_STA \ ++ | RKVDEC_BUF_EMPTY_STA \ ++ | RKVDEC_COLMV_REF_ERR_STA ) + + #define RKVDEC_REG_SYSCTRL 0x008 + #define RKVDEC_IN_ENDIAN BIT(0) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c -index 8c2ff05e01f7..6bc766f88c13 100644 +index 8c2ff05e01f7..a0a1149ca1a8 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c -@@ -725,6 +725,8 @@ static void rkvdec_job_finish(struct rkvdec_ctx *ctx, +@@ -10,12 +10,15 @@ + */ + + #include ++#include + #include + #include + #include + #include + #include + #include ++#include ++#include + #include + #include + #include +@@ -725,6 +728,11 @@ static void rkvdec_job_finish(struct rkvdec_ctx *ctx, pm_runtime_mark_last_busy(rkvdec->dev); pm_runtime_put_autosuspend(rkvdec->dev); -+ if (result == VB2_BUF_STATE_ERROR) -+ rkvdec->soft_reset = true; ++ ++ if (result == VB2_BUF_STATE_ERROR && ++ rkvdec->reset_mask == RESET_NONE) ++ rkvdec->reset_mask |= RESET_SOFT; ++ rkvdec_job_finish_no_pm(ctx, result); } -@@ -763,6 +765,11 @@ static void rkvdec_device_run(void *priv) +@@ -762,6 +770,34 @@ static void rkvdec_device_run(void *priv) + if (WARN_ON(!desc)) return; - -+ if (rkvdec->soft_reset) { -+ pm_runtime_suspend(rkvdec->dev); -+ rkvdec->soft_reset = false; -+ } ++ if (rkvdec->reset_mask != RESET_NONE) { + ++ if (rkvdec->reset_mask & RESET_SOFT) { ++ writel(RKVDEC_SOFTRST_EN_P, ++ rkvdec->regs + RKVDEC_REG_INTERRUPT); ++ udelay(RKVDEC_RESET_DELAY); ++ if (readl(rkvdec->regs + RKVDEC_REG_INTERRUPT) ++ & RKVDEC_SOFTRESET_RDY) ++ dev_info_ratelimited(rkvdec->dev, ++ "softreset failed\n"); ++ } ++ ++ if (rkvdec->reset_mask & RESET_HARD) { ++ pm_runtime_suspend(rkvdec->dev); ++ rockchip_pmu_idle_request(rkvdec->dev, true); ++ ret = reset_control_assert(rkvdec->rstc); ++ if (!ret) { ++ udelay(RKVDEC_RESET_DELAY); ++ ret = reset_control_deassert(rkvdec->rstc); ++ } ++ rockchip_pmu_idle_request(rkvdec->dev, false); ++ if (ret) ++ dev_notice_ratelimited(rkvdec->dev, ++ "hardreset failed\n"); ++ } ++ ++ rkvdec->reset_mask = RESET_NONE; ++ } + ret = pm_runtime_get_sync(rkvdec->dev); if (ret < 0) { - rkvdec_job_finish_no_pm(ctx, VB2_BUF_STATE_ERROR); -@@ -1046,7 +1053,7 @@ static void rkvdec_watchdog_func(struct work_struct *work) +@@ -1029,6 +1065,11 @@ static irqreturn_t rkvdec_irq_handler(int irq, void *priv) + if (cancel_delayed_work(&rkvdec->watchdog_work)) { + struct rkvdec_ctx *ctx; + ++ if (state == VB2_BUF_STATE_ERROR) { ++ rkvdec->reset_mask |= (status & RKVDEC_ERR_MASK) ? ++ RESET_HARD : RESET_SOFT; ++ } ++ + ctx = v4l2_m2m_get_curr_priv(rkvdec->m2m_dev); + rkvdec_job_finish(ctx, state); + } +@@ -1046,6 +1087,7 @@ static void rkvdec_watchdog_func(struct work_struct *work) ctx = v4l2_m2m_get_curr_priv(rkvdec->m2m_dev); if (ctx) { dev_err(rkvdec->dev, "Frame processing timed out!\n"); -- writel(RKVDEC_CONFIG_DEC_CLK_GATE_E | RKVDEC_IRQ_DIS, -+ writel(RKVDEC_CONFIG_DEC_CLK_GATE_E | RKVDEC_IRQ_DIS | RKVDEC_SOFTRST_EN_P, ++ rkvdec->reset_mask |= RESET_HARD; + writel(RKVDEC_CONFIG_DEC_CLK_GATE_E | RKVDEC_IRQ_DIS, rkvdec->regs + RKVDEC_REG_INTERRUPT); writel(0, rkvdec->regs + RKVDEC_REG_SYSCTRL); - rkvdec_job_finish(ctx, VB2_BUF_STATE_ERROR); +@@ -1125,6 +1167,18 @@ static int rkvdec_probe(struct platform_device *pdev) + return ret; + } + ++ ++ rkvdec->rstc = devm_reset_control_array_get(&pdev->dev, false, true); ++ if (IS_ERR(rkvdec->rstc)) { ++ dev_err(&pdev->dev, ++ "get resets failed %ld\n", PTR_ERR(rkvdec->rstc)); ++ return PTR_ERR(rkvdec->rstc); ++ } else { ++ dev_dbg(&pdev->dev, ++ "requested %d resets\n", ++ reset_control_get_count(&pdev->dev)); ++ } ++ + pm_runtime_set_autosuspend_delay(&pdev->dev, 100); + pm_runtime_use_autosuspend(&pdev->dev); + pm_runtime_enable(&pdev->dev); diff --git a/drivers/staging/media/rkvdec/rkvdec.h b/drivers/staging/media/rkvdec/rkvdec.h -index e95c52e3168a..2e42833d83e1 100644 +index e95c52e3168a..c14cd2571bfc 100644 --- a/drivers/staging/media/rkvdec/rkvdec.h +++ b/drivers/staging/media/rkvdec/rkvdec.h -@@ -91,6 +91,7 @@ struct rkvdec_dev { +@@ -11,10 +11,11 @@ + #ifndef RKVDEC_H_ + #define RKVDEC_H_ + ++#include + #include ++#include + #include + #include +-#include + + #include + #include +@@ -22,6 +23,12 @@ + #include + #include + ++#define RESET_NONE 0 ++#define RESET_SOFT BIT(0) ++#define RESET_HARD BIT(1) ++ ++#define RKVDEC_RESET_DELAY 5 ++ + struct rkvdec_ctx; + + struct rkvdec_ctrl_desc { +@@ -91,6 +98,8 @@ struct rkvdec_dev { void __iomem *regs; struct mutex vdev_lock; /* serializes ioctls */ struct delayed_work watchdog_work; -+ bool soft_reset; ++ struct reset_control *rstc; ++ u8 reset_mask; }; struct rkvdec_ctx { + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Alex Bee +Date: Tue, 18 Aug 2020 11:38:04 +0200 +Subject: [PATCH] WIP: arm64: dts: add resets to vdec for RK3399 + +--- + arch/arm64/boot/dts/rockchip/rk3399.dtsi | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +index ea1ef6c7455a..92e3f6da0297 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +@@ -1022,7 +1022,10 @@ pd_vcodec@RK3399_PD_VCODEC { + pd_vdu@RK3399_PD_VDU { + reg = ; + clocks = <&cru ACLK_VDU>, +- <&cru HCLK_VDU>; ++ <&cru HCLK_VDU>, ++ <&cru SCLK_VDU_CA>, ++ <&cru SCLK_VDU_CORE>; ++ + pm_qos = <&qos_video_m1_r>, + <&qos_video_m1_w>; + }; +@@ -1283,6 +1286,11 @@ vdec: video-codec@ff660000 { + clock-names = "axi", "ahb", "cabac", "core"; + iommus = <&vdec_mmu>; + power-domains = <&power RK3399_PD_VDU>; ++ resets = <&cru SRST_H_VDU>, <&cru SRST_A_VDU>, ++ <&cru SRST_VDU_CORE>, <&cru SRST_VDU_CA>, ++ <&cru SRST_A_VDU_NOC>, <&cru SRST_H_VDU_NOC>; ++ reset-names = "video_h", "video_a", "video_core", "video_cabac", ++ "niu_a", "niu_h"; + }; + + vdec_mmu: iommu@ff660480 { + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Alex Bee +Date: Fri, 1 Jan 2021 12:11:12 +0200 +Subject: [PATCH] arm64: dts: rockchip: fix RK3399 vdec register witdh + +Signed-off-by: Alex Bee +--- + arch/arm64/boot/dts/rockchip/rk3399.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +index 92e3f6da0297..03c6737ca0ea 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +@@ -1279,7 +1279,7 @@ vpu_mmu: iommu@ff650800 { + + vdec: video-codec@ff660000 { + compatible = "rockchip,rk3399-vdec"; +- reg = <0x0 0xff660000 0x0 0x400>; ++ reg = <0x0 0xff660000 0x0 0x480>; + interrupts = ; + clocks = <&cru ACLK_VDU>, <&cru HCLK_VDU>, + <&cru SCLK_VDU_CA>, <&cru SCLK_VDU_CORE>; + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Alex Bee +Date: Wed, 19 Aug 2020 21:12:54 +0200 +Subject: [PATCH] arm64: dts: rockchip: add rkvdec node for RK3328 + +Signed-off-by: Alex Bee +--- + .../bindings/media/rockchip,vdec.yaml | 5 ++++ + arch/arm64/boot/dts/rockchip/rk3328.dtsi | 26 ++++++++++++++++++- + 2 files changed, 30 insertions(+), 1 deletion(-) + +diff --git a/Documentation/devicetree/bindings/media/rockchip,vdec.yaml b/Documentation/devicetree/bindings/media/rockchip,vdec.yaml +index dfafdb671798..360b750e5514 100644 +--- a/Documentation/devicetree/bindings/media/rockchip,vdec.yaml ++++ b/Documentation/devicetree/bindings/media/rockchip,vdec.yaml +@@ -16,6 +16,11 @@ description: |- + properties: + compatible: + const: rockchip,rk3399-vdec ++ - items: ++ - enum: ++ - rockchip,rk3328-vdec ++ - const: rockchip,rk3399-vdec ++ + + reg: + maxItems: 1 +diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +index 31c48c38c955..dad09ad7e501 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -326,6 +326,10 @@ pd_hevc@RK3328_PD_HEVC { + }; + pd_video@RK3328_PD_VIDEO { + reg = ; ++ clocks = <&cru ACLK_RKVDEC>, ++ <&cru HCLK_RKVDEC>, ++ <&cru SCLK_VDEC_CABAC>, ++ <&cru SCLK_VDEC_CORE>; + }; + pd_vpu@RK3328_PD_VPU { + reg = ; +@@ -670,6 +674,26 @@ vpu_mmu: iommu@ff350800 { + power-domains = <&power RK3328_PD_VPU>; + }; + ++ rkvdec: video-codec@ff360000 { ++ compatible = "rockchip,rk3328-vdec", "rockchip,rk3399-vdec"; ++ reg = <0x0 0xff360000 0x0 0x480>; ++ interrupts = ; ++ interrupt-names = "vdpu"; ++ assigned-clocks = <&cru ACLK_RKVDEC>, <&cru SCLK_VDEC_CABAC>, ++ <&cru SCLK_VDEC_CORE>; ++ assigned-clock-rates = <500000000>, <300000000>, <250000000>; ++ clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>, ++ <&cru SCLK_VDEC_CABAC>, <&cru SCLK_VDEC_CORE>; ++ clock-names = "axi", "ahb", "cabac", "core"; ++ iommus = <&rkvdec_mmu>; ++ power-domains = <&power RK3328_PD_VIDEO>; ++ resets = <&cru SRST_VDEC_H>, <&cru SRST_VDEC_A>, ++ <&cru SRST_VDEC_CORE>, <&cru SRST_VDEC_CABAC>, ++ <&cru SRST_VDEC_NIU_A>, <&cru SRST_VDEC_NIU_H>; ++ reset-names = "video_h", "video_a", "video_core", "video_cabac", ++ "niu_a", "niu_h"; ++ }; ++ + rkvdec_mmu: iommu@ff360480 { + compatible = "rockchip,iommu"; + reg = <0x0 0xff360480 0x0 0x40>, <0x0 0xff3604c0 0x0 0x40>; +@@ -678,7 +702,7 @@ rkvdec_mmu: iommu@ff360480 { + clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>; + clock-names = "aclk", "iface"; + #iommu-cells = <0>; +- status = "disabled"; ++ power-domains = <&power RK3328_PD_VIDEO>; + }; + + vop: vop@ff370000 { diff --git a/projects/Rockchip/patches/linux/default/linux-1003-for-libreelec.patch b/projects/Rockchip/patches/linux/default/linux-1003-for-libreelec.patch index 8ada0e70a3..ff563de04d 100644 --- a/projects/Rockchip/patches/linux/default/linux-1003-for-libreelec.patch +++ b/projects/Rockchip/patches/linux/default/linux-1003-for-libreelec.patch @@ -149,30 +149,6 @@ index b54ff9055e5f..2fae7fa6b000 100644 h265e_mmu: iommu@ff330200 { -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alex Bee -Date: Wed, 2 Sep 2020 21:22:31 +0200 -Subject: [PATCH] arm64: dts: rockchip: add rockchip,disable-mmu-reset for vdec - iommu - -Signed-off-by: Alex Bee ---- - arch/arm64/boot/dts/rockchip/rk3328.dtsi | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi -index 2fae7fa6b000..3d933d74c2b3 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi -+++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi -@@ -731,6 +731,7 @@ rkvdec_mmu: iommu@ff360480 { - clock-names = "aclk", "iface"; - #iommu-cells = <0>; - power-domains = <&power RK3328_PD_VIDEO>; -+ rockchip,disable-mmu-reset; - }; - - vop: vop@ff370000 { - From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee Date: Mon, 10 Feb 2020 19:22:41 +0100 @@ -220,7 +196,7 @@ Signed-off-by: Alex Bee 1 file changed, 20 insertions(+) diff --git a/arch/arm/boot/dts/rk3288-miqi.dts b/arch/arm/boot/dts/rk3288-miqi.dts -index 713f55e143c6..2420d8e1c66f 100644 +index 713f55e143c6..8d30c49f406e 100644 --- a/arch/arm/boot/dts/rk3288-miqi.dts +++ b/arch/arm/boot/dts/rk3288-miqi.dts @@ -78,6 +78,21 @@ vcc_sys: vsys-regulator { @@ -231,7 +207,7 @@ index 713f55e143c6..2420d8e1c66f 100644 + sound { + compatible = "simple-audio-card"; + simple-audio-card,format = "i2s"; -+ simple-audio-card,name = "rockchip,miqi-codec"; ++ simple-audio-card,name = "HDMI"; + simple-audio-card,mclk-fs = <512>; + + simple-audio-card,codec { @@ -260,27 +236,41 @@ index 713f55e143c6..2420d8e1c66f 100644 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee -Date: Fri, 1 Jan 2021 12:11:12 +0200 -Subject: [PATCH] arm64: dts: rockchip: fix RK3399 vdec register witdh +Date: Fri, 2 Apr 2021 17:54:22 +0200 +Subject: [PATCH] ARM64/ARM: dts: align sound card names Signed-off-by: Alex Bee --- + arch/arm/boot/dts/rk3288-tinker.dtsi | 2 +- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) + 2 files changed, 2 insertions(+), 2 deletions(-) +diff --git a/arch/arm/boot/dts/rk3288-tinker.dtsi b/arch/arm/boot/dts/rk3288-tinker.dtsi +index 9c1e38c54eae..ee332fc9cf1f 100644 +--- a/arch/arm/boot/dts/rk3288-tinker.dtsi ++++ b/arch/arm/boot/dts/rk3288-tinker.dtsi +@@ -75,7 +75,7 @@ sdio_pwrseq: sdio-pwrseq { + sound { + compatible = "simple-audio-card"; + simple-audio-card,format = "i2s"; +- simple-audio-card,name = "rockchip,tinker-codec"; ++ simple-audio-card,name = "HDMI"; + simple-audio-card,mclk-fs = <512>; + + simple-audio-card,codec { diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi -index 418d16b0b648..4d5004c9c778 100644 +index 03c6737ca0ea..9c2ac03c154b 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi -@@ -1276,7 +1276,7 @@ vpu_mmu: iommu@ff650800 { +@@ -1782,7 +1782,7 @@ hdmi_sound: hdmi-sound { + compatible = "simple-audio-card"; + simple-audio-card,format = "i2s"; + simple-audio-card,mclk-fs = <256>; +- simple-audio-card,name = "hdmi-sound"; ++ simple-audio-card,name = "HDMI"; + status = "disabled"; - vdec: video-codec@ff660000 { - compatible = "rockchip,rk3399-vdec"; -- reg = <0x0 0xff660000 0x0 0x400>; -+ reg = <0x0 0xff660000 0x0 0x480>; - interrupts = ; - interrupt-names = "vdpu"; - clocks = <&cru ACLK_VDU>, <&cru HCLK_VDU>, + simple-audio-card,cpu { From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee @@ -774,3 +764,4 @@ index 70ab4fbdc23e..4dbc370e538f 100644 cec_transmit_attempt_done(adap, cec->tx_status); } if (cec->rx_done) { + diff --git a/projects/Rockchip/patches/linux/default/linux-2001-v4l-wip-rkvdec-hevc.patch b/projects/Rockchip/patches/linux/default/linux-2001-v4l-wip-rkvdec-hevc.patch index 67591dddca..1c7776fd36 100644 --- a/projects/Rockchip/patches/linux/default/linux-2001-v4l-wip-rkvdec-hevc.patch +++ b/projects/Rockchip/patches/linux/default/linux-2001-v4l-wip-rkvdec-hevc.patch @@ -1,4 +1,4 @@ -From 669adf695f98a9566741ab25f59c24ed619a456e Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 26 Oct 2019 13:55:15 +0200 Subject: [PATCH] media: uapi: hevc: Add scaling matrix control @@ -78,7 +78,7 @@ index d585909bc4e2..f817c643761b 100644 Buffers associated with this pixel format must contain the appropriate number of macroblocks to decode a full corresponding frame. diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c -index a88e962ac8a1..4267ba536013 100644 +index 1666a7ec873a..92bbfb81610d 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c @@ -1026,6 +1026,7 @@ const char *v4l2_ctrl_get_name(u32 id) @@ -109,7 +109,7 @@ index a88e962ac8a1..4267ba536013 100644 case V4L2_CTRL_TYPE_AREA: area = p; if (!area->width || !area->height) -@@ -2865,6 +2872,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, +@@ -2866,6 +2873,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS: elem_size = sizeof(struct v4l2_ctrl_hevc_slice_params); break; @@ -154,7 +154,7 @@ index 1009cf0891cc..1592e52c3614 100644 + #endif -From 440e3efbf4c5340a7e69329fb75f40756a800a48 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 26 Oct 2019 15:42:28 +0200 Subject: [PATCH] media: uapi: hevc: Add segment address field @@ -217,7 +217,7 @@ index 1592e52c3614..3e2e32098312 100644 /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -From 858acf136fbac4923e04d8faeb0e18d8fcb446c0 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 23 May 2020 15:03:46 +0000 Subject: [PATCH] WIP: media: uapi: hevc: add fields needed for rkvdec @@ -287,7 +287,7 @@ index 3e2e32098312..3cc3b47e1417 100644 /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -From 2442d3b1ae900e75f19cbfcdc506e3dd06f12042 Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 23 May 2020 15:07:15 +0000 Subject: [PATCH] HACK: media: uapi: hevc: tiles and num_slices @@ -330,7 +330,7 @@ index 3cc3b47e1417..b33e1a8141e1 100644 /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -From e7453ce1b822f9abc7b29460edd6d6b0a01d1eac Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 23 May 2020 15:17:45 +0000 Subject: [PATCH] WIP: media: rkvdec: add HEVC backend @@ -2886,10 +2886,10 @@ index 000000000000..03ba848411c6 + .run = rkvdec_hevc_run, +}; diff --git a/drivers/staging/media/rkvdec/rkvdec-regs.h b/drivers/staging/media/rkvdec/rkvdec-regs.h -index 15b9bee92016..83bf790ed9b7 100644 +index 3acc914888f6..4addfaefdfb4 100644 --- a/drivers/staging/media/rkvdec/rkvdec-regs.h +++ b/drivers/staging/media/rkvdec/rkvdec-regs.h -@@ -43,6 +43,7 @@ +@@ -48,6 +48,7 @@ #define RKVDEC_RLC_MODE BIT(11) #define RKVDEC_STRM_START_BIT(x) (((x) & 0x7f) << 12) #define RKVDEC_MODE(x) (((x) & 0x03) << 20) @@ -2898,10 +2898,10 @@ index 15b9bee92016..83bf790ed9b7 100644 #define RKVDEC_MODE_VP9 2 #define RKVDEC_RPS_MODE BIT(24) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c -index 073a7b0fd7b0..315894fc511b 100644 +index 7b4ac2292751..c005e2fba128 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c -@@ -159,6 +159,61 @@ static const u32 rkvdec_h264_decoded_fmts[] = { +@@ -162,6 +162,61 @@ static const u32 rkvdec_h264_decoded_fmts[] = { V4L2_PIX_FMT_NV20, }; @@ -2963,7 +2963,7 @@ index 073a7b0fd7b0..315894fc511b 100644 static const struct rkvdec_ctrl_desc rkvdec_vp9_ctrl_descs[] = { { .mandatory = true, -@@ -209,6 +264,21 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { +@@ -212,6 +267,21 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { .num_decoded_fmts = ARRAY_SIZE(rkvdec_h264_decoded_fmts), .decoded_fmts = rkvdec_h264_decoded_fmts, }, @@ -2986,10 +2986,10 @@ index 073a7b0fd7b0..315894fc511b 100644 .fourcc = V4L2_PIX_FMT_VP9_FRAME, .frmsize = { diff --git a/drivers/staging/media/rkvdec/rkvdec.h b/drivers/staging/media/rkvdec/rkvdec.h -index 68d268f37c86..a801668f5f7b 100644 +index d760c3609e2c..975fe4b5dd68 100644 --- a/drivers/staging/media/rkvdec/rkvdec.h +++ b/drivers/staging/media/rkvdec/rkvdec.h -@@ -124,6 +124,7 @@ void rkvdec_run_preamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run); +@@ -132,6 +132,7 @@ void rkvdec_run_preamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run); void rkvdec_run_postamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run); extern const struct rkvdec_coded_fmt_ops rkvdec_h264_fmt_ops; @@ -2998,7 +2998,7 @@ index 68d268f37c86..a801668f5f7b 100644 #endif /* RKVDEC_H_ */ -From c4d8468621327805f65b028779e035c35a65613c Mon Sep 17 00:00:00 2001 +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 1 Aug 2020 12:24:58 +0000 Subject: [PATCH] WIP: media: rkvdec: add HEVC format validation @@ -3038,10 +3038,10 @@ index 03ba848411c6..b8ad7fc2271c 100644 .stop = rkvdec_hevc_stop, .run = rkvdec_hevc_run, diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c -index 315894fc511b..3108d06ef7e0 100644 +index c005e2fba128..55a54a1f8496 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c -@@ -76,6 +76,26 @@ static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) +@@ -79,6 +79,26 @@ static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) if (width > ctx->coded_fmt.fmt.pix_mp.width || height > ctx->coded_fmt.fmt.pix_mp.height) return -EINVAL; @@ -3068,7 +3068,7 @@ index 315894fc511b..3108d06ef7e0 100644 } return 0; } -@@ -84,7 +104,7 @@ static int rkvdec_s_ctrl(struct v4l2_ctrl *ctrl) +@@ -87,7 +107,7 @@ static int rkvdec_s_ctrl(struct v4l2_ctrl *ctrl) { struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl); @@ -3077,7 +3077,7 @@ index 315894fc511b..3108d06ef7e0 100644 ctx->valid_fmt = rkvdec_valid_fmt(ctx, ctrl); if (ctx->valid_fmt) { struct v4l2_pix_format_mplane *pix_mp; -@@ -170,6 +190,7 @@ static const struct rkvdec_ctrl_desc rkvdec_hevc_ctrl_descs[] = { +@@ -173,6 +193,7 @@ static const struct rkvdec_ctrl_desc rkvdec_hevc_ctrl_descs[] = { { .mandatory = true, .cfg.id = V4L2_CID_MPEG_VIDEO_HEVC_SPS, @@ -3085,6 +3085,141 @@ index 315894fc511b..3108d06ef7e0 100644 }, { .mandatory = true, + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Alex Bee +Date: Wed, 14 Apr 2021 18:01:21 +0200 +Subject: [PATCH] WIP: media: rkvdec: hevc: Fix column width / row height + calculation for no-tiled case + +Signed-off-by: Alex Bee +--- + drivers/staging/media/rkvdec/rkvdec-hevc.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/staging/media/rkvdec/rkvdec-hevc.c b/drivers/staging/media/rkvdec/rkvdec-hevc.c +index a6be4eebef74..8a94fc04980f 100644 +--- a/drivers/staging/media/rkvdec/rkvdec-hevc.c ++++ b/drivers/staging/media/rkvdec/rkvdec-hevc.c +@@ -2164,9 +2164,9 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, + for (i = 0; i <= pps->num_tile_rows_minus1; i++) + WRITE_PPS(pps->row_height_minus1[i], ROW_HEIGHT(i)); + } else { +- WRITE_PPS(round_up(sps->pic_width_in_luma_samples, ctb_size_y) - 1, ++ WRITE_PPS(((sps->pic_width_in_luma_samples + ctb_size_y - 1) / ctb_size_y) - 1, + COLUMN_WIDTH(0)); +- WRITE_PPS(round_up(sps->pic_height_in_luma_samples, ctb_size_y) - 1, ++ WRITE_PPS(((sps->pic_height_in_luma_samples + ctb_size_y - 1) / ctb_size_y) - 1, + ROW_HEIGHT(0)); + } + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Alex Bee +Date: Wed, 14 Apr 2021 17:26:43 +0200 +Subject: [PATCH] WIP: media: rkvdec: hevc: fix long ref decoding + +Signed-off-by: Alex Bee +--- + drivers/staging/media/rkvdec/rkvdec-hevc.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/staging/media/rkvdec/rkvdec-hevc.c b/drivers/staging/media/rkvdec/rkvdec-hevc.c +index b8ad7fc2271c..7c6d46bc69e9 100644 +--- a/drivers/staging/media/rkvdec/rkvdec-hevc.c ++++ b/drivers/staging/media/rkvdec/rkvdec-hevc.c +@@ -2194,8 +2194,8 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, + #define REF_PIC_IDX_L1(i) PS_FIELD((i < 4 ? 76 : 128) + (i * 5), 4) + + #define LOWDELAY PS_FIELD(182, 1) +-#define SHORT_TERM_REF_PIC_SET_SIZE PS_FIELD(183, 10) +-#define LONG_TERM_REF_PIC_SET_SIZE PS_FIELD(193, 9) ++#define LONG_TERM_RPS_BIT_OFFSET PS_FIELD(183, 10) ++#define SHORT_TERM_RPS_BIT_OFFSET PS_FIELD(193, 9) + #define NUM_RPS_POC PS_FIELD(202, 4) + + for (j = 0; j < run->num_slices; j++) { +@@ -2222,11 +2222,11 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, + // TODO: lowdelay + WRITE_RPS(0, LOWDELAY); + +- // NOTE: these two differs from mpp ++ WRITE_RPS(sl_params->long_term_ref_pic_set_size + ++ sl_params->short_term_ref_pic_set_size, ++ LONG_TERM_RPS_BIT_OFFSET); + WRITE_RPS(sl_params->short_term_ref_pic_set_size, +- SHORT_TERM_REF_PIC_SET_SIZE); +- WRITE_RPS(sl_params->long_term_ref_pic_set_size, +- LONG_TERM_REF_PIC_SET_SIZE); ++ SHORT_TERM_RPS_BIT_OFFSET); + + WRITE_RPS(sl_params->num_rps_poc_st_curr_before + + sl_params->num_rps_poc_st_curr_after + + +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Alex Bee +Date: Thu, 15 Apr 2021 20:22:54 +0200 +Subject: [PATCH] WIP: media: rkvdec: hevc: implement lowdelay + +Signed-off-by: Alex Bee +--- + drivers/staging/media/rkvdec/rkvdec-hevc.c | 16 ++++++++++++++-- + include/media/hevc-ctrls.h | 1 + + 2 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/drivers/staging/media/rkvdec/rkvdec-hevc.c b/drivers/staging/media/rkvdec/rkvdec-hevc.c +index 7c6d46bc69e9..a6be4eebef74 100644 +--- a/drivers/staging/media/rkvdec/rkvdec-hevc.c ++++ b/drivers/staging/media/rkvdec/rkvdec-hevc.c +@@ -2185,6 +2185,7 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, + struct rkvdec_hevc_priv_tbl *priv_tbl = hevc_ctx->priv_tbl.cpu; + struct rkvdec_rps_packet *hw_ps; + int i, j; ++ unsigned int lowdelay; + + #define WRITE_RPS(value, field) set_ps_field(hw_ps->info, field, value) + +@@ -2201,6 +2202,7 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, + for (j = 0; j < run->num_slices; j++) { + sl_params = &run->slices_params[j]; + dpb = sl_params->dpb; ++ lowdelay = 0; + + hw_ps = &priv_tbl->rps[j]; + memset(hw_ps, 0, sizeof(*hw_ps)); +@@ -2219,8 +2221,18 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, + + //WRITE_RPS(0xffffffff, PS_FIELD(96, 32)); + +- // TODO: lowdelay +- WRITE_RPS(0, LOWDELAY); ++ if (sl_params->slice_type != V4L2_HEVC_SLICE_TYPE_I && ++ !(!!(sl_params->flags & V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT))) { ++ lowdelay = 1; ++ for (i = 0; i < sl_params->num_active_dpb_entries; i++) { ++ if (dpb[i].pic_order_cnt[0] > sl_params->slice_pic_order_cnt) { ++ lowdelay = 0; ++ break; ++ } ++ } ++ } ++ ++ WRITE_RPS(lowdelay, LOWDELAY); + + WRITE_RPS(sl_params->long_term_ref_pic_set_size + + sl_params->short_term_ref_pic_set_size, +diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h +index b33e1a8141e1..bda0ea61f331 100644 +--- a/include/media/hevc-ctrls.h ++++ b/include/media/hevc-ctrls.h +@@ -168,6 +168,7 @@ struct v4l2_hevc_pred_weight_table { + #define V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV (1ULL << 6) + #define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED (1ULL << 7) + #define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 8) ++#define V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 9) + + struct v4l2_ctrl_hevc_slice_params { + __u32 bit_size; + From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alex Bee Date: Sat, 30 Jan 2021 18:16:39 +0100 @@ -3107,10 +3242,10 @@ Signed-off-by: Alex Bee 2 files changed, 84 insertions(+), 30 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c -index 3108d06ef7e0..18ae1b15d0a4 100644 +index 55a54a1f8496..2a056413e4b4 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c -@@ -13,6 +13,7 @@ +@@ -14,6 +14,7 @@ #include #include #include @@ -3118,7 +3253,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 #include #include #include -@@ -270,21 +271,6 @@ static const u32 rkvdec_vp9_decoded_fmts[] = { +@@ -273,21 +274,6 @@ static const u32 rkvdec_vp9_decoded_fmts[] = { }; static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { @@ -3140,7 +3275,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 { .fourcc = V4L2_PIX_FMT_HEVC_SLICE, .frmsize = { -@@ -299,6 +285,23 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { +@@ -302,6 +288,23 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { .ops = &rkvdec_hevc_fmt_ops, .num_decoded_fmts = ARRAY_SIZE(rkvdec_hevc_decoded_fmts), .decoded_fmts = rkvdec_hevc_decoded_fmts, @@ -3164,7 +3299,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 }, { .fourcc = V4L2_PIX_FMT_VP9_FRAME, -@@ -314,16 +317,31 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { +@@ -317,16 +320,31 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] = { .ops = &rkvdec_vp9_fmt_ops, .num_decoded_fmts = ARRAY_SIZE(rkvdec_vp9_decoded_fmts), .decoded_fmts = rkvdec_vp9_decoded_fmts, @@ -3176,11 +3311,10 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 static const struct rkvdec_coded_fmt_desc * -rkvdec_find_coded_fmt_desc(u32 fourcc) +rkvdec_default_coded_fmt_desc(unsigned int capabilities) - { - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(rkvdec_coded_fmts); i++) { -- if (rkvdec_coded_fmts[i].fourcc == fourcc) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < ARRAY_SIZE(rkvdec_coded_fmts); i++) { + if (rkvdec_coded_fmts[i].capability & capabilities) + return &rkvdec_coded_fmts[i]; + } @@ -3190,16 +3324,17 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 + +static const struct rkvdec_coded_fmt_desc * +rkvdec_find_coded_fmt_desc(u32 fourcc, unsigned int capabilities) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < ARRAY_SIZE(rkvdec_coded_fmts); i++) { + { + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(rkvdec_coded_fmts); i++) { +- if (rkvdec_coded_fmts[i].fourcc == fourcc) + if (rkvdec_coded_fmts[i].fourcc == fourcc && + (rkvdec_coded_fmts[i].capability & capabilities)) return &rkvdec_coded_fmts[i]; } -@@ -346,7 +364,7 @@ static void rkvdec_reset_coded_fmt(struct rkvdec_ctx *ctx) +@@ -349,7 +367,7 @@ static void rkvdec_reset_coded_fmt(struct rkvdec_ctx *ctx) { struct v4l2_format *f = &ctx->coded_fmt; @@ -3208,7 +3343,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 rkvdec_reset_fmt(ctx, f, ctx->coded_fmt_desc->fourcc); f->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; -@@ -373,11 +391,13 @@ static int rkvdec_enum_framesizes(struct file *file, void *priv, +@@ -376,11 +394,13 @@ static int rkvdec_enum_framesizes(struct file *file, void *priv, struct v4l2_frmsizeenum *fsize) { const struct rkvdec_coded_fmt_desc *fmt; @@ -3223,7 +3358,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 if (!fmt) return -EINVAL; -@@ -448,10 +468,11 @@ static int rkvdec_try_output_fmt(struct file *file, void *priv, +@@ -451,10 +471,11 @@ static int rkvdec_try_output_fmt(struct file *file, void *priv, struct rkvdec_ctx *ctx = fh_to_rkvdec_ctx(priv); const struct rkvdec_coded_fmt_desc *desc; @@ -3238,7 +3373,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 } v4l2_apply_frmsize_constraints(&pix_mp->width, -@@ -538,7 +559,8 @@ static int rkvdec_s_output_fmt(struct file *file, void *priv, +@@ -541,7 +562,8 @@ static int rkvdec_s_output_fmt(struct file *file, void *priv, if (ret) return ret; @@ -3248,7 +3383,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 if (!desc) return -EINVAL; ctx->coded_fmt_desc = desc; -@@ -586,7 +608,10 @@ static int rkvdec_g_capture_fmt(struct file *file, void *priv, +@@ -589,7 +611,10 @@ static int rkvdec_g_capture_fmt(struct file *file, void *priv, static int rkvdec_enum_output_fmt(struct file *file, void *priv, struct v4l2_fmtdesc *f) { @@ -3260,7 +3395,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 return -EINVAL; f->pixelformat = rkvdec_coded_fmts[f->index].fourcc; -@@ -1012,14 +1037,17 @@ static int rkvdec_init_ctrls(struct rkvdec_ctx *ctx) +@@ -1041,14 +1066,17 @@ static int rkvdec_init_ctrls(struct rkvdec_ctx *ctx) int ret; for (i = 0; i < ARRAY_SIZE(rkvdec_coded_fmts); i++) @@ -3282,7 +3417,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 } ret = v4l2_ctrl_handler_setup(&ctx->ctrl_hdl); -@@ -1217,8 +1245,17 @@ static void rkvdec_watchdog_func(struct work_struct *work) +@@ -1252,8 +1280,17 @@ static void rkvdec_watchdog_func(struct work_struct *work) } } @@ -3301,7 +3436,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, of_rkvdec_match); -@@ -1231,6 +1268,7 @@ static int rkvdec_probe(struct platform_device *pdev) +@@ -1266,6 +1303,7 @@ static int rkvdec_probe(struct platform_device *pdev) { struct rkvdec_dev *rkvdec; struct resource *res; @@ -3309,7 +3444,7 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 unsigned int i; int ret, irq; -@@ -1256,6 +1294,12 @@ static int rkvdec_probe(struct platform_device *pdev) +@@ -1291,6 +1329,12 @@ static int rkvdec_probe(struct platform_device *pdev) if (ret) return ret; @@ -3323,12 +3458,12 @@ index 3108d06ef7e0..18ae1b15d0a4 100644 * Bump ACLK to max. possible freq. (500 MHz) to improve performance * When 4k video playback. diff --git a/drivers/staging/media/rkvdec/rkvdec.h b/drivers/staging/media/rkvdec/rkvdec.h -index a801668f5f7b..ff1cfd89a1e0 100644 +index 975fe4b5dd68..cc505bc4a042 100644 --- a/drivers/staging/media/rkvdec/rkvdec.h +++ b/drivers/staging/media/rkvdec/rkvdec.h -@@ -22,6 +22,10 @@ - #include - #include +@@ -29,6 +29,10 @@ + + #define RKVDEC_RESET_DELAY 5 +#define RKVDEC_CAPABILITY_H264 BIT(0) +#define RKVDEC_CAPABILITY_HEVC BIT(1) @@ -3337,7 +3472,7 @@ index a801668f5f7b..ff1cfd89a1e0 100644 struct rkvdec_ctx; struct rkvdec_ctrl_desc { -@@ -64,6 +68,10 @@ vb2_to_rkvdec_decoded_buf(struct vb2_buffer *buf) +@@ -71,6 +75,10 @@ vb2_to_rkvdec_decoded_buf(struct vb2_buffer *buf) base.vb.vb2_buf); } @@ -3348,7 +3483,7 @@ index a801668f5f7b..ff1cfd89a1e0 100644 struct rkvdec_coded_fmt_ops { int (*adjust_fmt)(struct rkvdec_ctx *ctx, struct v4l2_format *f); -@@ -83,6 +91,7 @@ struct rkvdec_coded_fmt_desc { +@@ -90,6 +98,7 @@ struct rkvdec_coded_fmt_desc { const struct rkvdec_coded_fmt_ops *ops; unsigned int num_decoded_fmts; const u32 *decoded_fmts; @@ -3356,10 +3491,10 @@ index a801668f5f7b..ff1cfd89a1e0 100644 }; struct rkvdec_dev { -@@ -96,6 +105,7 @@ struct rkvdec_dev { - struct mutex vdev_lock; /* serializes ioctls */ +@@ -104,6 +113,7 @@ struct rkvdec_dev { struct delayed_work watchdog_work; - bool soft_reset; + struct reset_control *rstc; + u8 reset_mask; + unsigned int capabilities; }; @@ -3379,10 +3514,10 @@ Signed-off-by: Alex Bee 1 file changed, 8 insertions(+) diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c -index 18ae1b15d0a4..c3b74ac8d979 100644 +index 2a056413e4b4..1c0e35f9d84f 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c -@@ -1251,11 +1251,19 @@ static const struct rkvdec_variant rk3399_rkvdec_variant = { +@@ -1286,11 +1286,19 @@ static const struct rkvdec_variant rk3399_rkvdec_variant = { RKVDEC_CAPABILITY_VP9 }; @@ -3410,14 +3545,14 @@ Subject: [PATCH] ARM: dts: RK3288: add hevc node Signed-off-by: Alex Bee --- - arch/arm/boot/dts/rk3288.dtsi | 19 ++++++++++++++++++- - 1 file changed, 18 insertions(+), 1 deletion(-) + arch/arm/boot/dts/rk3288.dtsi | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi -index 746acfac1e92..ba43ee6b91e8 100644 +index 746acfac1e92..32e141a3955b 100644 --- a/arch/arm/boot/dts/rk3288.dtsi +++ b/arch/arm/boot/dts/rk3288.dtsi -@@ -1271,6 +1271,23 @@ vpu_mmu: iommu@ff9a0800 { +@@ -1271,6 +1271,25 @@ vpu_mmu: iommu@ff9a0800 { power-domains = <&power RK3288_PD_VIDEO>; }; @@ -3436,12 +3571,14 @@ index 746acfac1e92..ba43ee6b91e8 100644 + <300000000>, <300000000>; + iommus = <&hevc_mmu>; + power-domains = <&power RK3288_PD_HEVC>; ++ resets = <&cru SRST_HEVC>; ++ reset-names = "video_core"; + }; + hevc_mmu: iommu@ff9c0440 { compatible = "rockchip,iommu"; reg = <0x0 0xff9c0440 0x0 0x40>, <0x0 0xff9c0480 0x0 0x40>; -@@ -1279,7 +1296,7 @@ hevc_mmu: iommu@ff9c0440 { +@@ -1279,7 +1298,7 @@ hevc_mmu: iommu@ff9c0440 { clocks = <&cru ACLK_HEVC>, <&cru HCLK_HEVC>; clock-names = "aclk", "iface"; #iommu-cells = <0>;