diff --git a/.github/workflows/build-main.yaml b/.github/workflows/build-main.yaml index 73e359cc63..6791ed916f 100644 --- a/.github/workflows/build-main.yaml +++ b/.github/workflows/build-main.yaml @@ -101,14 +101,14 @@ jobs: |**Device/Platform**|**Download Package**|**Documentation**| |----|----|----| |**Anbernic RG351P/M, Game Console R33S, ODROID Go Advance, ODROID Go Super, Magicx XU10**|[JELOS-RK3326.aarch64-${{ steps.version.outputs.version }}.img.gz](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3326.aarch64-${{ steps.version.outputs.version }}.img.gz)|[documentation](/documentation/PER_DEVICE_DOCUMENTATION/RK3326/)| - |**Anbernic RG353P/M/V/VS, RG503, Powkiddy RK2023, RGB30, RGB10 Max 3**|[JELOS-RK3566.aarch64-${{ steps.version.outputs.version }}.img.gz](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3566.aarch64-${{ steps.version.outputs.version }}.img.gz)|[documentation](/documentation/PER_DEVICE_DOCUMENTATION/RK3566/)| |**Anbernic RG552**|[JELOS-RK3399.aarch64-${{ steps.version.outputs.version }}.img.gz](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3399.aarch64-${{ steps.version.outputs.version }}.img.gz)|[documentation](/documentation/PER_DEVICE_DOCUMENTATION/RK3399/)| |**Atari VCS, AOKZOE, Ayaneo, Ayn, GPD, and other x86_64 devices**|[JELOS-AMD64.x86_64-${{ steps.version.outputs.version }}.img.gz](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-AMD64.x86_64-${{ steps.version.outputs.version }}.img.gz)|[documentation](/documentation/PER_DEVICE_DOCUMENTATION/AMD64/)| |**Hardkernel ODROID Go Ultra, Powkiddy RGB10 Max 3 Pro**|[JELOS-S922X.aarch64-${{ steps.version.outputs.version }}-Odroid_GOU.img.gz](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-S922X.aarch64-${{ steps.version.outputs.version }}-Odroid_GOU.img.gz)|[documentation](/documentation/PER_DEVICE_DOCUMENTATION/S922X/)| |**Hardkernel ODROID N2/N2+**|[JELOS-S922X.aarch64-${{ steps.version.outputs.version }}-Odroid_N2.img.gz](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-S922X.aarch64-${{ steps.version.outputs.version }}-Odroid_N2.img.gz)|[documentation](/documentation/PER_DEVICE_DOCUMENTATION/S922X/)| |**Hardkernel ODROID N2L**|[JELOS-S922X.aarch64-${{ steps.version.outputs.version }}-Odroid_N2L.img.gz](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-S922X.aarch64-${{ steps.version.outputs.version }}-Odroid_N2L.img.gz)|[documentation](/documentation/PER_DEVICE_DOCUMENTATION/S922X/)| |**Orange Pi 5, and Indiedroid Nova**|[JELOS-RK3588.aarch64-${{ steps.version.outputs.version }}.img.gz](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3588.aarch64-${{ steps.version.outputs.version }}.img.gz)|[documentation](/documentation/PER_DEVICE_DOCUMENTATION/RK3588/)| - |**Powkiddy x55**|[JELOS-RK3566-X55.aarch64-${{ steps.version.outputs.version }}.img.gz](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3566-X55.aarch64-${{ steps.version.outputs.version }}.img.gz)|[documentation](/documentation/PER_DEVICE_DOCUMENTATION/RK3566-X55/)| + + > Note: Anbernic RG353P/M/V/VS, RG503, Powkiddy RK2023, RGB30, RGB10 Max 3, and x55 releases are paused at version [20240206](https://github.com/JustEnoughLinuxOS/distribution/releases/tag/20240206) while mainline integration is worked. New releases for these devices will return soon. ## Upgrading * Download and install the update online via the System Settings menu. @@ -121,12 +121,12 @@ jobs: |**Device/Platform**|**Download Package**| |----|----| |**Anbernic RG351P/M, Game Console R33S,ODROID Go Advance, ODROID Go Super, Magicx XU10**|[JELOS-RK3326.aarch64-${{ steps.version.outputs.version }}.tar](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3326.aarch64-${{ steps.version.outputs.version }}.tar)| - |**Anbernic RG353P/M/V/VS, RG503, Powkiddy RK2023, RGB30, RGB10 Max 3**|[JELOS-RK3566.aarch64-${{ steps.version.outputs.version }}.tar](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3566.aarch64-${{ steps.version.outputs.version }}.tar)| |**Anbernic RG552**|[JELOS-RK3399.aarch64-${{ steps.version.outputs.version }}.tar](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3399.aarch64-${{ steps.version.outputs.version }}.tar)| |****Atari VCS, AOKZOE, Ayaneo, Ayn, GPD, and other x86_64 devices****|[JELOS-AMD64.x86_64-${{ steps.version.outputs.version }}.tar](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-AMD64.x86_64-${{ steps.version.outputs.version }}.tar)| |**Hardkernel ODROID Go Ultra, N2/N2+/N2L, Powkiddy RGB10 Max 3 Pro**|[JELOS-S922X.aarch64-${{ steps.version.outputs.version }}.tar](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-S922X.aarch64-${{ steps.version.outputs.version }}.tar)| |**Orange Pi 5, and Indiedroid Nova**|[JELOS-RK3588.aarch64-${{ steps.version.outputs.version }}.tar](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3588.aarch64-${{ steps.version.outputs.version }}.tar)| - |**Powkiddy x55**|[JELOS-RK3566-X55.aarch64-${{ steps.version.outputs.version }}.tar](https://github.com/JustEnoughLinuxOS/distribution/releases/download/${{ steps.version.outputs.version }}/JELOS-RK3566-X55.aarch64-${{ steps.version.outputs.version }}.tar)| + + > Note: Anbernic RG353P/M/V/VS, RG503, Powkiddy RK2023, RGB30, RGB10 Max 3, and x55 releases are paused at version [20240206](https://github.com/JustEnoughLinuxOS/distribution/releases/tag/20240206) while mainline integration is worked. New releases for these devices will return soon. ## Documentation diff --git a/Dockerfile b/Dockerfile index 44c366a259..d425fbd79e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,8 +24,8 @@ RUN apt-get install -y \ ### Cross compiling on ARM RUN if [ "$(uname -m)" = "aarch64" ]; then apt-get install -y --no-install-recommends qemu-user-binfmt libc6-dev-amd64-cross; fi -RUN if [ ! -d /lib64 ]; then ln -sf /usr/x86_64-linux-gnu/lib64 /lib64; fi -RUN if [ ! -d /lib/x86_64-linux-gnu ]; then ln -sf /usr/x86_64-linux-gnu/lib /lib/x86_64-linux-gnu; fi +RUN if [ ! -d /lib64 ]; then ln -sf /usr/x86_64-jelos-linux-gnu/lib64 /lib64; fi +RUN if [ ! -d /lib/x86_64-jelos-linux-gnu ]; then ln -sf /usr/x86_64-jelos-linux-gnu/lib /lib/x86_64-jelos-linux-gnu; fi RUN mkdir -p /work && chown docker /work diff --git a/Makefile b/Makefile index 9049d7b32e..3dcc6363bb 100644 --- a/Makefile +++ b/Makefile @@ -12,9 +12,6 @@ release: image: ./scripts/image mkimage -noobs: - ./scripts/image noobs - clean: rm -rf $(BUILD_DIRS) @@ -27,7 +24,7 @@ src-pkg: docs: ./tools/foreach './scripts/clean emulators && ./scripts/build emulators' -world: AMD64 RK3588 S922X RK3566 RK3566-X55 RK3326 RK3399 +world: AMD64 RK3588 S922X RK3326 RK3399 AMD64: unset DEVICE_ROOT @@ -72,7 +69,6 @@ RK3399: PROJECT=Rockchip DEVICE=RK3399 ARCH=arm ./scripts/build_distro PROJECT=Rockchip DEVICE=RK3399 ARCH=aarch64 ./scripts/build_distro - update: PROJECT=PC DEVICE=AMD64 ARCH=x86_64 ./scripts/update_packages diff --git a/README.md b/README.md index 708f56a88c..c8e49a965e 100644 --- a/README.md +++ b/README.md @@ -101,39 +101,40 @@ JELOS supports a variety of ARM and Intel/AMD based devices. | Manufacturer | Device | CPU / Architecture | Kernel | GL driver | Interface | | -- | -- | -- | -- | -- | -- | -| Anbernic | [RG351P/M](http://jelos.org/devices/anbernic/rg351pmv) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | -| Anbernic | [RG351v](http://jelos.org/devices/anbernic/rg351pmv) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | -| Anbernic | [RG353P](http://jelos.org/devices/anbernic/rg353pmvvs) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | -| Anbernic | [RG353M](http://jelos.org/devices/anbernic/rg353pmvvs) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | -| Anbernic | [RG353V](http://jelos.org/devices/anbernic/rg353pmvvs) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | -| Anbernic | [RG353VS](http://jelos.org/devices/anbernic/rg353pmvvs) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | -| Anbernic | [RG503](http://jelos.org/devices/anbernic/rg503) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | -| Anbernic | [RG552](http://jelos.org/devices/anbernic/rg552) | Rockchip RK3399 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | -| Anbernic | [Win600](http://jelos.org/devices/anbernic/win600) | AMD Athlon Silver 3050e (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| AOKZOE | [A1 Pro](http://jelos.org/devices/aokzoe/a1-pro) | AMD 7840u (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| Atari | [VCS](http://jelos.org/devices/atari/vcs) | AMD Ryzen R1606G (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| AYANEO | [Air / Air Pro](http://jelos.org/devices/ayaneo/air) | Amd Ryzen 5 5560U / AMD Ryzen 7 5825U (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| AYANEO | [Air Plus](http://jelos.org/devices/ayaneo/air-plus) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| AYANEO | [AYANEO 2](http://jelos.org/devices/ayaneo/ayaneo-2) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| AYANEO | [AYANEO 2S](http://jelos.org/devices/ayaneo/ayaneo-2) | Amd Ryzen 7 7840U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| Ayn | [Loki Zero](http://jelos.org/devices/ayn/loki-zero) | AMD Athlon Silver 3050e (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| Ayn | [Loki Max](http://jelos.org/devices/ayn/loki-max) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| Game Console | [RG33S](http://jelos.org/gameconsole/r33s) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | -| GPD | [Win 4](http://jelos.org/devices/gpd/win4) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | -| GPD | [Win Max 2 (2022)](http://jelos.org/devices/gpd/win-max-2) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux| Radeonsi | Weston + Emulation Station | -| Hardkernel | [Odroid Go Advance](http://jelos.org/devices/hardkernel/odroid-go-advance) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | -| Hardkernel | [Odroid Go Super](http://jelos.org/devices/hardkernel/odroid-go-super) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | -| Hardkernel | [Odroid Go Ultra](http://jelos.org/devices/hardkernel/odroid-go-ultra) | Amlogic S922X / Mali G52 M6 (ARMv8-A) | Mainline Linux | Mali | Weston + Emulation Station | -| Hardkernel | [Odroid N2/N2+/N2L](http://jelos.org/devices/hardkernel/odroid-n2) | Amlogic S922X / Mali G52 M6 (ARMv8-A) | Mainline Linux | Mali | Weston + Emulation Station | -| Indiedroid | [Nova](http://jelos.org/devices/indiedroid/nova) | Rockchip RK3588S / Mali G610 (ARMv8-A) | Rockchip 5.10 BSP Linux | Panfrost | Weston + Emulation Station | -| Orange Pi | [Orange Pi 5](http://jelos.org/devices/orange-pi/orange-pi-5) | Rockchip RK3588S / Mali G610 (ARMv8-A) | Rockchip 5.10 BSP Linux | Panfrost | Weston + Emulation Station | -| Magicx | [XU10](http://jelos.org/devices/magicx/xu10) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | -| Powkiddy | [RGB10](http://jelos.org/devices/powkiddy/rgb10) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | -| Powkiddy | [RGB10 Max 3](http://jelos.org/devices/powkiddy/rgb10-max-3) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | -| Powkiddy | [RGB10 Max 3 Pro](http://jelos.org/devices/powkiddy/rgb10-max-3-pro) | Amlogic A311D / Mali G52 M4 (ARMv8-A) | Mainline Linux | Mali | Weston + Emulation Station | -| Powkiddy | [RGB30](http://jelos.org/devices/powkiddy/rgb30) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | -| Powkiddy | [RK2023](http://jelos.org/devices/powkiddy/rk2023) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | -| Powkiddy | [x55](http://jelos.org/devices/powkiddy/x55) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | +| Anbernic | [RG351P/M](https://jelos.org/devices/anbernic/rg351pmv) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | +| Anbernic | [RG351v](https://jelos.org/devices/anbernic/rg351pmv) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | +| Anbernic | [RG353P](https://jelos.org/devices/anbernic/rg353pmvvs) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | +| Anbernic | [RG353M](https://jelos.org/devices/anbernic/rg353pmvvs) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | +| Anbernic | [RG353V](https://jelos.org/devices/anbernic/rg353pmvvs) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | +| Anbernic | [RG353VS](https://jelos.org/devices/anbernic/rg353pmvvs) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | +| Anbernic | [RG503](https://jelos.org/devices/anbernic/rg503) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | +| Anbernic | [RG552](https://jelos.org/devices/anbernic/rg552) | Rockchip RK3399 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | +| Anbernic | [Win600](https://jelos.org/devices/anbernic/win600) | AMD Athlon Silver 3050e (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| AOKZOE | [A1 Pro](https://jelos.org/devices/aokzoe/a1-pro) | AMD 7840u (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| Atari | [VCS](https://jelos.org/devices/atari/vcs) | AMD Ryzen R1606G (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| AYANEO | [Air / Air Pro](https://jelos.org/devices/ayaneo/air) | Amd Ryzen 5 5560U / AMD Ryzen 7 5825U (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| AYANEO | [Air Plus](https://jelos.org/devices/ayaneo/air-plus) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| AYANEO | [AYANEO 2](https://jelos.org/devices/ayaneo/ayaneo-2) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| AYANEO | [AYANEO 2S](https://jelos.org/devices/ayaneo/ayaneo-2) | Amd Ryzen 7 7840U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| Ayn | [Loki Zero](https://jelos.org/devices/ayn/loki-zero) | AMD Athlon Silver 3050e (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| Ayn | [Loki Max](https://jelos.org/devices/ayn/loki-max) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| Game Console | [R33S](https://jelos.org/devices/unbranded/game-console-r33s) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | +| Game Console | [R35S, R36S](https://jelos.org/devices/unbranded/game-console-r35s-r36s) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | +| GPD | [Win 4](https://jelos.org/devices/gpd/win4) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux | Radeonsi | Weston + Emulation Station | +| GPD | [Win Max 2 (2022)](https://jelos.org/devices/gpd/win-max-2) | Amd Ryzen 7 6800U / (x86_64) | Mainline Linux| Radeonsi | Weston + Emulation Station | +| Hardkernel | [Odroid Go Advance](https://jelos.org/devices/hardkernel/odroid-go-advance) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | +| Hardkernel | [Odroid Go Super](https://jelos.org/devices/hardkernel/odroid-go-super) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | +| Hardkernel | [Odroid Go Ultra](https://jelos.org/devices/hardkernel/odroid-go-ultra) | Amlogic S922X / Mali G52 M6 (ARMv8-A) | Mainline Linux | Mali | Weston + Emulation Station | +| Hardkernel | [Odroid N2/N2+/N2L](https://jelos.org/devices/hardkernel/odroid-n2) | Amlogic S922X / Mali G52 M6 (ARMv8-A) | Mainline Linux | Mali | Weston + Emulation Station | +| Indiedroid | [Nova](https://jelos.org/devices/indiedroid/nova) | Rockchip RK3588S / Mali G610 (ARMv8-A) | Rockchip 5.10 BSP Linux | Panfrost | Weston + Emulation Station | +| Orange Pi | [Orange Pi 5](https://jelos.org/devices/orange-pi/orange-pi-5) | Rockchip RK3588S / Mali G610 (ARMv8-A) | Rockchip 5.10 BSP Linux | Panfrost | Weston + Emulation Station | +| Magicx | [XU10](https://jelos.org/devices/magicx/xu10) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | +| Powkiddy | [RGB10](https://jelos.org/devices/powkiddy/rgb10) | Rockchip RK3326 (ARM) | Mainline Linux | Panfrost | Weston + Emulation Station | +| Powkiddy | [RGB10 Max 3](https://jelos.org/devices/powkiddy/rgb10-max-3) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | +| Powkiddy | [RGB10 Max 3 Pro](https://jelos.org/devices/powkiddy/rgb10-max-3-pro) | Amlogic A311D / Mali G52 M4 (ARMv8-A) | Mainline Linux | Mali | Weston + Emulation Station | +| Powkiddy | [RGB30](https://jelos.org/devices/powkiddy/rgb30) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | +| Powkiddy | [RK2023](https://jelos.org/devices/powkiddy/rk2023) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | +| Powkiddy | [x55](https://jelos.org/devices/powkiddy/x55) | Rockchip RK3566 (ARM) | Rockchip BSP 4.19 | Mali | KMS/DRM + Emulation Station | > [!NOTE] > While not technically supported, JELOS is also known to work well on a variety of generic x86_64 devices including gaming PCs, mini PCs, and laptop computers. diff --git a/config/emulators/psvita.conf b/config/emulators/psvita.conf index 6017185235..ff5b34d217 100644 --- a/config/emulators/psvita.conf +++ b/config/emulators/psvita.conf @@ -3,8 +3,8 @@ SYSTEM_FULLNAME="PlayStation Vita" SYSTEM_MANUFACTURER="Sony" SYSTEM_RELEASE="2011" SYSTEM_HARDWARE="portable" -SYSTEM_PATH="/usr/config/vita3k/launcher/" -SYSTEM_EXTENSION=".sh" +SYSTEM_PATH="/storage/.config/vita3k/launcher/" +SYSTEM_EXTENSION=".sh .psvita" SYSTEM_COMMAND="/usr/bin/runemu.sh %ROM% -P%SYSTEM% --core=%CORE% --emulator=%EMULATOR% --controllers=\"%CONTROLLERSCONFIG%\"" SYSTEM_PLATFORM="psvita" SYSTEM_THEME="psvita" diff --git a/config/graphic b/config/graphic index 7773e4c1f9..9ce1aac65a 100644 --- a/config/graphic +++ b/config/graphic @@ -34,7 +34,7 @@ get_graphicdrivers() { V4L2_SUPPORT="no" if [ "${GRAPHIC_DRIVERS}" = "all" ]; then - GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi nvidia nvidia-legacy nvidia-ng vmware virtio vc4" + GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi nvidia nvidia-legacy nvidia-ng virtio" fi if listcontains "${GRAPHIC_DRIVERS}" "crocus"; then @@ -132,24 +132,10 @@ get_graphicdrivers() { VAAPI_SUPPORT="yes" fi - if listcontains "${GRAPHIC_DRIVERS}" "vc4"; then - GALLIUM_DRIVERS+=" vc4 v3d kmsro" - VULKAN_DRIVERS_MESA+=" broadcom" - V4L2_SUPPORT="yes" - VAAPI_SUPPORT="no" - VDPAU_SUPPORT="no" - fi - if listcontains "${GRAPHIC_DRIVERS}" "virtio"; then GALLIUM_DRIVERS+=" virgl" fi - if listcontains "${GRAPHIC_DRIVERS}" "vmware"; then - GALLIUM_DRIVERS+=" svga" - XORG_DRIVERS+=" vmware" - COMPOSITE_SUPPORT="yes" - fi - # VDPAU Support depends on X11 if [ ! "${DISPLAYSERVER}" = "x11" ]; then VDPAU_SUPPORT="no" diff --git a/config/noobs/os.json b/config/noobs/os.json deleted file mode 100644 index 2fb08c7f63..0000000000 --- a/config/noobs/os.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "@DISTRONAME@_@PROJECT@", - "version": "@LIBREELEC_VERSION@", - "release_date": "@RELEASE_DATE@", - "kernel": "@KERNEL_VERSION@", - "description": "@DESCRIPTION@", - "username": "root", - "password": "@ROOT_PASSWORD@", - "supported_hex_revisions": "@NOOBS_HEX@", - "supported_models": [@NOOBS_SUPPORTED_MODELS@] -} diff --git a/config/noobs/partition_setup.sh b/config/noobs/partition_setup.sh deleted file mode 100755 index 50577f5e6b..0000000000 --- a/config/noobs/partition_setup.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh -x - -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) - -MOUNTPOINT="/tmp/LibreELEC-System" - -md5sumCheck() { - ( cd $MOUNTPOINT - echo "checking MD5: $1" - md5sum -c $1.md5 - if [ "$?" = "1" ]; then - echo "#######################################################" - echo "# #" - echo "# LibreELEC failed md5 check - Installation will quit #" - echo "# #" - echo "# Your original download was probably corrupt. #" - echo "# Please visit libreelec.tv and get another copy #" - echo "# #" - echo "#######################################################" - exit 1 - fi - rm -rf $1.md5 - ) -} - -if [ -z $part1 -o -z $part2 -o -z $id1 -o -z $id2 ]; then - echo "error: part1, part2, id1 or id2 not specified" - echo "actual values:" - echo "part1:" $part1 - echo "part2:" $part2 - echo "id1 :" $id1 - echo "id2 :" $id2 - exit 1 -fi - -# create mountpoint - mkdir -p $MOUNTPOINT - -# mount needed partition - mount $part1 $MOUNTPOINT - -# check md5sum - md5sumCheck kernel.img - md5sumCheck SYSTEM - -# create bootloader configuration - echo "creating bootloader configuration..." - echo "boot=$id1 disk=$id2 quiet" > $MOUNTPOINT/cmdline.txt - -# cleanup mountpoint - umount $MOUNTPOINT - rmdir $MOUNTPOINT diff --git a/config/noobs/partitions.json b/config/noobs/partitions.json deleted file mode 100644 index 09b6dad9f6..0000000000 --- a/config/noobs/partitions.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "partitions": [ - { - "label": "System", - "filesystem_type": "FAT", - "partition_size_nominal": @SYSTEM_SIZE@, - "want_maximised": false, - "uncompressed_tarball_size": 1024, - "mkfs_options": "" - }, - { - "label": "Storage", - "filesystem_type": "ext4", - "partition_size_nominal": 1024, - "want_maximised": true, - "uncompressed_tarball_size": 10, - "mkfs_options": "" - } - ] -} diff --git a/config/path b/config/path index 1a057aec0f..ac57af5da2 100644 --- a/config/path +++ b/config/path @@ -19,12 +19,9 @@ set -e fi [ -z "${HOST_NAME}" ] && export HOST_NAME="$(${LOCAL_CC} -dumpmachine)" -TARGET_NAME=$TARGET_GCC_ARCH-libreelec-linux-gnu${TARGET_ABI} +TARGET_NAME=$TARGET_GCC_ARCH-jelos-linux-gnu${TARGET_ABI} BUILD=${BUILD_ROOT}/${BUILD_BASE}.${DISTRONAME}-${DEVICE:-${PROJECT}}.${TARGET_ARCH} -if [ "${LIBREELEC_VERSION}" = "devel" ] ; then - BUILD=${BUILD_ROOT}/${BUILD_BASE}.${DISTRONAME}-${DEVICE:-${PROJECT}}.${TARGET_ARCH}-${OS_VERSION}-${LIBREELEC_VERSION} -fi if [ -n "$BUILD_SUFFIX" ]; then BUILD=$BUILD-$BUILD_SUFFIX diff --git a/distributions/JELOS/options b/distributions/JELOS/options index 5f2178c737..404b9af991 100644 --- a/distributions/JELOS/options +++ b/distributions/JELOS/options @@ -20,13 +20,13 @@ DESCRIPTION="An Open Source firmware." # Distribution Home URL - HOME_URL="https://www.jelos.org" + HOME_URL="https://jelos.org" # Documentation URL - WIKI_URL="https://www.jelos.org" + WIKI_URL="https://jelos.org" # Where to report bugs - BUG_REPORT_URL="https://www.jelos.org" + BUG_REPORT_URL="https://jelos.org" # Root password to integrate in the target system ROOT_PASSWORD="system generated" @@ -107,7 +107,7 @@ CONTAINER_SUPPORT="${CONTAINER_SUPPORT:-no}" # Support for debug tools such as strace - DEBUG_SUPPORT="${DEBUG_SUPPORT:-yes}" + DEBUG_PACKAGES="${DEBUG_PACKAGES:-yes}" # Windowmanager to use (fluxbox / none) WINDOWMANAGER="none" diff --git a/documentation/PER_DEVICE_DOCUMENTATION/AMD64/SUPPORTED_EMULATORS_AND_CORES.md b/documentation/PER_DEVICE_DOCUMENTATION/AMD64/SUPPORTED_EMULATORS_AND_CORES.md index 58979c14dd..038c9d79f2 100644 --- a/documentation/PER_DEVICE_DOCUMENTATION/AMD64/SUPPORTED_EMULATORS_AND_CORES.md +++ b/documentation/PER_DEVICE_DOCUMENTATION/AMD64/SUPPORTED_EMULATORS_AND_CORES.md @@ -119,7 +119,7 @@ This document describes all available systems emulators and cores available for |Sony|PlayStation 2 (ps2)|2000|`ps2`|.iso .mdf .nrg .bin .img .dump .gz .cso .chd|**pcsx2:** pcsx2-sa (default)
**retroarch:** pcsx2
| |Sony|PlayStation 3 (ps3)|2006|`ps3`|.ps3 .psn|**rpcs3:** rpcs3-sa (default)
| |Sony|PlayStation Portable (psp)|2004|`psp`|.iso .cso .pbp .chd|**ppsspp:** ppsspp-sa (default)
**retroarch:** ppsspp
| -|Sony|PlayStation Vita (psvita)|2011|`launcher`|.sh|**vita3k:** vita3k-sa (default)
| +|Sony|PlayStation Vita (psvita)|2011|`launcher`|.sh .psvita|**vita3k:** vita3k-sa (default)
| |Sony|PSP Minis (pspminis)|2004|`pspminis`|.iso .cso .pbp|**ppsspp:** ppsspp-sa (default)
**retroarch:** ppsspp
| |Sun Microsystems|J2ME (j2me)|2002|`j2me`|.jar|**retroarch:** freej2me (default)
| |Various|CHIP-8 / S-CHIP / XO-CHIP (chip-8)|1978|`chip-8`|.ch8 .sc8 .xo8|**retroarch:** jaxe (default)
| diff --git a/documentation/PER_DEVICE_DOCUMENTATION/RK3399/SUPPORTED_EMULATORS_AND_CORES.md b/documentation/PER_DEVICE_DOCUMENTATION/RK3399/SUPPORTED_EMULATORS_AND_CORES.md index c3612ba8c6..e8ea141835 100644 --- a/documentation/PER_DEVICE_DOCUMENTATION/RK3399/SUPPORTED_EMULATORS_AND_CORES.md +++ b/documentation/PER_DEVICE_DOCUMENTATION/RK3399/SUPPORTED_EMULATORS_AND_CORES.md @@ -116,6 +116,7 @@ This document describes all available systems emulators and cores available for |Sony|PlayStation Portable (psp)|2004|`psp`|.iso .cso .pbp .chd|**ppsspp:** ppsspp-sa (default)
| |Sony|PSP Minis (pspminis)|2004|`pspminis`|.iso .cso .pbp|**ppsspp:** ppsspp-sa (default)
**retroarch:** ppsspp
| |Sun Microsystems|J2ME (j2me)|2002|`j2me`|.jar|**retroarch:** freej2me (default)
| +|Various|CHIP-8 / S-CHIP / XO-CHIP (chip-8)|1978|`chip-8`|.ch8 .sc8 .xo8|**retroarch:** jaxe (default)
| |Various|EasyRPG (easyrpg)|2003|`easyrpg`|.zip .easyrpg .ldb|**retroarch:** easyrpg (default)
| |Various|OpenBOR (openbor)|2003|`openbor`|.pak|**OpenBOR:** OpenBOR (default)
| |Various|ScummVM (scummvm)|2001|`games`|.sh .svm .scummvm|**scummvmsa:** scummvm (default)
**retroarch:** scummvm
| diff --git a/packages/apps/device-switch/package.mk b/packages/apps/device-switch/package.mk new file mode 100644 index 0000000000..fd8bc3f21c --- /dev/null +++ b/packages/apps/device-switch/package.mk @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2024-present JELOS (https://github.com/JustEnoughLinuxOS) + +PKG_NAME="device-switch" +PKG_VERSION="" +PKG_ARCH="any" +PKG_LICENSE="mix" +PKG_DEPENDS_TARGET="toolchain" +PKG_SITE="" +PKG_URL="" +PKG_LONGDESC="Support script for switching device dtbs" +PKG_TOOLCHAIN="manual" + +makeinstall_target() { + + mkdir -p ${INSTALL}/usr/bin + cp ${PKG_DIR}/scripts/${DEVICE}/device-switch ${INSTALL}/usr/bin + chmod 0755 ${INSTALL}/usr/bin/* +} diff --git a/packages/apps/device-switch/scripts/RK3326/device-switch b/packages/apps/device-switch/scripts/RK3326/device-switch new file mode 100644 index 0000000000..969756ae05 --- /dev/null +++ b/packages/apps/device-switch/scripts/RK3326/device-switch @@ -0,0 +1,24 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2024-present JELOS (https://github.com/JustEnoughLinuxOS) + +. /etc/profile + +mount -o remount,rw /flash +case $1 in + R33S) + sed -i '/rk3326-gameconsole-r3/c\ load mmc 1:1 ${dtb_loadaddr} rk3326-gameconsole-r33s.dtb' /flash/boot.ini + rm -r /storage/remappings/* + ;; + R36S) + sed -i '/rk3326-gameconsole-r3/c\ load mmc 1:1 ${dtb_loadaddr} rk3326-gameconsole-r36s.dtb' /flash/boot.ini + rm -r /storage/remappings/* + ;; +esac + +cat </flash/device.name +$1 +EOF + +sync +reboot diff --git a/packages/apps/device-switch/scripts/RK3326/device-switch.save b/packages/apps/device-switch/scripts/RK3326/device-switch.save new file mode 100644 index 0000000000..afb5b818b1 --- /dev/null +++ b/packages/apps/device-switch/scripts/RK3326/device-switch.save @@ -0,0 +1,20 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) + +. /etc/profile + +mount -o remount,rw /flash +case $1 in + R33S) + sed -i "s#rk3566-rg353v-linux.dtb#rk3566-rg353p-linux.dtb#g" /flash/extlinux/extlinux.conf + ;; + R36S) + sed -i "s#rk3566-rg353p-linux.dtb#rk3566-rg353v-linux.dtb#g" /flash/extlinux/extlinux.conf + ;; +esac + +set_setting system.hostname ${1} + +sync +reboot diff --git a/packages/apps/jelos-gamepad/package.mk b/packages/apps/jelos-gamepad/package.mk new file mode 100644 index 0000000000..c928235b91 --- /dev/null +++ b/packages/apps/jelos-gamepad/package.mk @@ -0,0 +1,19 @@ +PKG_NAME="jelos-gamepad" +PKG_VERSION="b1fc0fb69047011d99b54029be500280d33a8027" +PKG_ARCH="aarch64" +PKG_LICENSE="GPLv3" +PKG_SITE="https://github.com/R-ARM/rinputer2" +PKG_URL="$PKG_SITE.git" +PKG_DEPENDS_TARGET="toolchain" +PKG_TOOLCHAIN="make" +GET_HANDLER_SUPPORT="git" + +makeinstall_target() { + mkdir -p $INSTALL/usr/bin + cp rinputer2 ${INSTALL}/usr/bin/jelos_gamepad + chmod 0755 ${INSTALL}/usr/bin/jelos_gamepad +} + +post_install() { + enable_service jelos_gamepad.service +} diff --git a/packages/apps/jelos-gamepad/patches/000-jelos-gamepad.patch b/packages/apps/jelos-gamepad/patches/000-jelos-gamepad.patch new file mode 100644 index 0000000000..30f9cea1e9 --- /dev/null +++ b/packages/apps/jelos-gamepad/patches/000-jelos-gamepad.patch @@ -0,0 +1,56 @@ +diff -rupN rinputer2.orig/main.c rinputer2/main.c +--- rinputer2.orig/main.c 2023-11-23 04:47:16.344733862 +0000 ++++ rinputer2/main.c 2023-11-23 15:00:20.535535759 +0000 +@@ -240,7 +240,7 @@ int rescan_devices(struct rinputer_devic + continue; + + // let's not make a loop +- if(strncmp("Rinputer", name, 8) == 0) ++ if(strncmp("JELOS Gamepad", name, 8) == 0) + continue; + // ignore steam-created controllers + // they have this name, with a digit at the end +@@ -316,10 +316,10 @@ int main(void) + + ioctl(outfd, UI_SET_EVBIT, EV_KEY); + +- //ioctl(outfd, UI_SET_KEYBIT, BTN_DPAD_UP); // dpad up +- //ioctl(outfd, UI_SET_KEYBIT, BTN_DPAD_DOWN); // dpad down +- //ioctl(outfd, UI_SET_KEYBIT, BTN_DPAD_LEFT); // dpad left +- //ioctl(outfd, UI_SET_KEYBIT, BTN_DPAD_RIGHT); // dpad right ++ ioctl(outfd, UI_SET_KEYBIT, BTN_DPAD_UP); // dpad up ++ ioctl(outfd, UI_SET_KEYBIT, BTN_DPAD_DOWN); // dpad down ++ ioctl(outfd, UI_SET_KEYBIT, BTN_DPAD_LEFT); // dpad left ++ ioctl(outfd, UI_SET_KEYBIT, BTN_DPAD_RIGHT); // dpad right + + ioctl(outfd, UI_SET_KEYBIT, BTN_NORTH); // x + ioctl(outfd, UI_SET_KEYBIT, BTN_SOUTH); // b +@@ -332,6 +332,9 @@ int main(void) + ioctl(outfd, UI_SET_KEYBIT, BTN_TR2); // L2 + ioctl(outfd, UI_SET_KEYBIT, BTN_TL2); // R2 + ++ ioctl(outfd, UI_SET_KEYBIT, BTN_THUMBL); // L3 ++ ioctl(outfd, UI_SET_KEYBIT, BTN_THUMBR); // R3 ++ + ioctl(outfd, UI_SET_KEYBIT, BTN_SELECT); + ioctl(outfd, UI_SET_KEYBIT, BTN_START); + +@@ -350,15 +353,15 @@ int main(void) + setup_abs(outfd, ABS_RZ); + + // dpad +- setup_abs(outfd, ABS_HAT0X); +- setup_abs(outfd, ABS_HAT0Y); ++ //setup_abs(outfd, ABS_HAT0X); ++ //setup_abs(outfd, ABS_HAT0Y); + + // maybe we should pretend to be xbox gamepad? + memset(&usetup, 0, sizeof(usetup)); + usetup.id.bustype = BUS_USB; + usetup.id.vendor = 0x1234; + usetup.id.product = 0x5678; +- strcpy(usetup.name, "Rinputer"); ++ strcpy(usetup.name, "JELOS Gamepad"); + + ioctl(outfd, UI_DEV_SETUP, &usetup); + ioctl(outfd, UI_DEV_CREATE); diff --git a/packages/apps/jelos-gamepad/system.d/jelos_gamepad.service b/packages/apps/jelos-gamepad/system.d/jelos_gamepad.service new file mode 100644 index 0000000000..d5b6152cde --- /dev/null +++ b/packages/apps/jelos-gamepad/system.d/jelos_gamepad.service @@ -0,0 +1,9 @@ +[Unit] +Description=Ragnarok Input Daemon + +[Service] +Type=simple +ExecStart=/usr/bin/jelos_gamepad + +[Install] +WantedBy=multi-user.target diff --git a/packages/audio/alsa-lib/package.mk b/packages/audio/alsa-lib/package.mk index 5e31aa37c5..694f20133d 100644 --- a/packages/audio/alsa-lib/package.mk +++ b/packages/audio/alsa-lib/package.mk @@ -7,20 +7,11 @@ PKG_VERSION="1.2.10" PKG_LICENSE="GPL" PKG_SITE="http://www.alsa-project.org/" PKG_URL="https://www.alsa-project.org/files/pub/lib/alsa-lib-${PKG_VERSION}.tar.bz2" -PKG_DEPENDS_TARGET="toolchain alsa-topology-conf" +PKG_DEPENDS_TARGET="toolchain alsa-ucm-conf alsa-topology-conf" PKG_LONGDESC="ALSA (Advanced Linux Sound Architecture) is the next generation Linux Sound API." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" -case ${DEVICE} in - RK356*) - PKG_DEPENDS_TARGET+="" - ;; - *) - PKG_DEPENDS_TARGET+=" alsa-ucm-conf" - ;; -esac - if build_with_debug; then PKG_ALSA_DEBUG=--with-debug else diff --git a/packages/audio/alsa-utils/package.mk b/packages/audio/alsa-utils/package.mk index dd1383826a..fed5b128ae 100644 --- a/packages/audio/alsa-utils/package.mk +++ b/packages/audio/alsa-utils/package.mk @@ -8,7 +8,7 @@ PKG_VERSION="1.2.10" PKG_LICENSE="GPL" PKG_SITE="http://www.alsa-project.org/" PKG_URL="https://www.alsa-project.org/files/pub/utils/alsa-utils-${PKG_VERSION}.tar.bz2" -PKG_DEPENDS_TARGET="toolchain alsa-lib ncurses systemd" +PKG_DEPENDS_TARGET="toolchain alsa-lib ncurses systemd alsa-ucm-conf" PKG_LONGDESC="This package includes the utilities for ALSA, like alsamixer, aplay, arecord, alsactl, iecset and speaker-test." PKG_TOOLCHAIN="autotools" @@ -20,10 +20,6 @@ PKG_CONFIGURE_OPTS_TARGET="--disable-alsaconf \ --disable-nls \ --disable-rst2man \ --disable-xmlto" -if [[ ! "${DEVICE}" =~ RK356 ]] -then - PKG_DEPENDS_TARGET+=" alsa-ucm-conf" -fi post_makeinstall_target() { rm -rf ${INSTALL}/lib ${INSTALL}/var diff --git a/packages/audio/rpi-cirrus-config/modprobe.d/rpi-cirrus.conf b/packages/audio/rpi-cirrus-config/modprobe.d/rpi-cirrus.conf deleted file mode 100644 index 2b3237d29f..0000000000 --- a/packages/audio/rpi-cirrus-config/modprobe.d/rpi-cirrus.conf +++ /dev/null @@ -1 +0,0 @@ -softdep arizona-spi pre: arizona-ldo1 diff --git a/packages/audio/rpi-cirrus-config/package.mk b/packages/audio/rpi-cirrus-config/package.mk deleted file mode 100644 index f0f6eccae6..0000000000 --- a/packages/audio/rpi-cirrus-config/package.mk +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="rpi-cirrus-config" -PKG_VERSION="0.0.2" -PKG_SHA256="cc11c47f1f2b6d5e72dcdea828ba57e0dcaf74161f675a4a9f395054f5d82d31" -PKG_LICENSE="GPL" -PKG_SITE="https://github.com/HiassofT/rpi-cirrus-config" -PKG_URL="https://github.com/HiassofT/rpi-cirrus-config/archive/${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="alsa-utils" -PKG_LONGDESC="Config scripts for the Wolfson/Cirrus Logic audio card" -PKG_TOOLCHAIN="manual" - -makeinstall_target() { - mkdir -p ${INSTALL}/usr/lib/udev - install -m 0755 ${PKG_DIR}/scripts/rpi-cirrus-config ${INSTALL}/usr/lib/udev/rpi-cirrus-config - - mkdir -p ${INSTALL}/usr/share/alsa/cards - cp alsa/RPiCirrus.conf ${INSTALL}/usr/share/alsa/cards - - mkdir -p ${INSTALL}/usr/lib/alsa - cp mixer-scripts/rpi-cirrus-functions.sh ${INSTALL}/usr/lib/alsa - - mkdir -p ${INSTALL}/usr/config - cp -PR ${PKG_DIR}/config/* ${INSTALL}/usr/config -} diff --git a/packages/audio/rpi-cirrus-config/scripts/rpi-cirrus-config b/packages/audio/rpi-cirrus-config/scripts/rpi-cirrus-config deleted file mode 100755 index d8bda0b07c..0000000000 --- a/packages/audio/rpi-cirrus-config/scripts/rpi-cirrus-config +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -# setup default mixer settings for Cirrus Logic Audio Card - -. /etc/profile - -if [ -f $HOME/.config/sound.conf ] ; then - alsactl restore -f $HOME/.config/sound.conf -else - if [ -r $HOME/.config/rpi-cirrus-config.sh ] ; then - progress "Setting up Cirrus Logic Audio Card with user config" - sh $HOME/.config/rpi-cirrus-config.sh - else - progress "Setting up Cirrus Logic Audio Card" - - # load helper functions and definitions - . /usr/lib/alsa/rpi-cirrus-functions.sh - - playback_to_spdif - playback_to_lineout - playback_to_headset - mixer 'Noise Gate Switch' off - fi -fi diff --git a/packages/audio/rpi-cirrus-config/udev.d/90-alsa-restore.rules b/packages/audio/rpi-cirrus-config/udev.d/90-alsa-restore.rules deleted file mode 100644 index 283dc4c8b6..0000000000 --- a/packages/audio/rpi-cirrus-config/udev.d/90-alsa-restore.rules +++ /dev/null @@ -1,17 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) - -# When a sound device is detected, restore the volume settings -SUBSYSTEM=="sound", KERNEL=="controlC*", NAME="snd/%k", ACTION=="add", GOTO="alsa_restore_go" -GOTO="alsa_restore_end" - -LABEL="alsa_restore_go" - -# Separate config-script for RPi-Cirrus card -DRIVERS=="snd-rpi-cirrus", RUN+="rpi-cirrus-config", GOTO="alsa_restore_end" - -# Default config-script for all other cards -RUN+="soundconfig %k" - -LABEL="alsa_restore_end" - diff --git a/packages/compress/unzip/package.mk b/packages/compress/unzip/package.mk index be4f17410d..1fb8258952 100644 --- a/packages/compress/unzip/package.mk +++ b/packages/compress/unzip/package.mk @@ -5,8 +5,8 @@ PKG_NAME="unzip" PKG_VERSION="60" PKG_SHA256="036d96991646d0449ed0aa952e4fbe21b476ce994abc276e49d30e686708bd37" PKG_LICENSE="OSS" -PKG_SITE="http://www.info-zip.org/pub/infozip" -PKG_URL="http://downloads.sourceforge.net/sourceforge/infozip/${PKG_NAME}${PKG_VERSION}.tar.gz" +PKG_SITE="http://www.info-zip.org/pub/infozip/" +PKG_URL="https://sourceforge.net/projects/infozip/files/UnZip%206.x%20(latest)/UnZip%206.0/unzip60.tar.gz" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="UnZip is an extraction utility for archives compressed in .zip format." PKG_TOOLCHAIN="manual" diff --git a/packages/debug/strace/package.mk b/packages/debug/strace/package.mk index a09984a29e..baa0d0ec81 100644 --- a/packages/debug/strace/package.mk +++ b/packages/debug/strace/package.mk @@ -11,5 +11,5 @@ PKG_LONGDESC="strace is a diagnostic, debugging and instructional userspace util PKG_TOOLCHAIN="autotools" if [ "${TARGET_ARCH}" = x86_64 -o "${TARGET_ARCH}" = "aarch64" ]; then - PKG_CONFIGURE_OPTS_TARGET="--enable-mpers=no" + PKG_CONFIGURE_OPTS_TARGET="--enable-mpers=no --enable-bundled" fi diff --git a/packages/devel/binutils/patches/binutils-01-warn-for-uses-of-system-directories-when-link.patch b/packages/devel/binutils/patches/binutils-01-warn-for-uses-of-system-directories-when-link.patch index 1619cef941..7cac3adb7c 100644 --- a/packages/devel/binutils/patches/binutils-01-warn-for-uses-of-system-directories-when-link.patch +++ b/packages/devel/binutils/patches/binutils-01-warn-for-uses-of-system-directories-when-link.patch @@ -3,7 +3,7 @@ http://git.yoctoproject.org/cgit.cgi/poky/plain/meta/recipes-devtools/binutils/b just detect and skip system directories if used by mistake linker output in case of using /usr/lib path: -/data/LibreELEC.tv/build.LibreELEC-Generic.x86_64-8.0-devel/toolchain/lib/gcc/x86_64-libreelec-linux-gnu/6.2.0/../../../../x86_64-libreelec-linux-gnu/bin/ld: warning: library search path "/usr/lib" is unsafe for cross-compilation, ignore it +/data/LibreELEC.tv/build.LibreELEC-Generic.x86_64-8.0-devel/toolchain/lib/gcc/x86_64-jelos-linux-gnu/6.2.0/../../../../x86_64-jelos-linux-gnu/bin/ld: warning: library search path "/usr/lib" is unsafe for cross-compilation, ignore it From 7ab8e318659eb5d9adc758c78d084a95560b93fd Mon Sep 17 00:00:00 2001 From: Khem Raj diff --git a/packages/devel/elfutils/package.mk b/packages/devel/elfutils/package.mk index bbbb2e1174..e2ed942057 100644 --- a/packages/devel/elfutils/package.mk +++ b/packages/devel/elfutils/package.mk @@ -14,14 +14,6 @@ PKG_LONGDESC="A collection of utilities to handle ELF objects." PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" -if [ "${LIBREELEC_VERSION}" = "devel" ]; then - PKG_PROGRAMS="--enable-programs --program-prefix=" - PKG_PROGRAMS_LIST="readelf" -else - PKG_PROGRAMS="--disable-programs" - PKG_PROGRAMS_LIST= -fi - PKG_CONFIGURE_OPTS_HOST="utrace_cv_cc_biarch=false \ --disable-programs \ --disable-nls \ @@ -32,7 +24,7 @@ PKG_CONFIGURE_OPTS_HOST="utrace_cv_cc_biarch=false \ --without-lzma" PKG_CONFIGURE_OPTS_TARGET="utrace_cv_cc_biarch=false \ - ${PKG_PROGRAMS} \ + --disable-programs \ --disable-nls \ --disable-demangler \ --disable-debuginfod \ diff --git a/packages/devel/glibc/package.mk b/packages/devel/glibc/package.mk index 84b55eb88a..8265f7b7ca 100644 --- a/packages/devel/glibc/package.mk +++ b/packages/devel/glibc/package.mk @@ -13,9 +13,6 @@ PKG_LONGDESC="The Glibc package contains the main C library." PKG_BUILD_FLAGS="+bfd -gold" case "${DEVICE}" in - RK356*) - OPT_ENABLE_KERNEL=4.4.0 - ;; RK358*) OPT_ENABLE_KERNEL=5.10.0 ;; diff --git a/packages/devel/gmp/package.mk b/packages/devel/gmp/package.mk index d5be433231..e2ce1f083a 100644 --- a/packages/devel/gmp/package.mk +++ b/packages/devel/gmp/package.mk @@ -6,7 +6,7 @@ PKG_NAME="gmp" PKG_VERSION="6.3.0" PKG_LICENSE="LGPLv3+" PKG_SITE="http://gmplib.org/" -PKG_URL="https://gmplib.org/download/gmp/${PKG_NAME}-${PKG_VERSION}.tar.xz" +PKG_URL="https://ftp.gnu.org/gnu/gmp/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_DEPENDS_HOST="ccache:host m4:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="A library for arbitrary precision arithmetic, operating on signed integers, rational numbers, and floating point numbers." diff --git a/packages/devel/qt5/package.mk b/packages/devel/qt5/package.mk index f795e4e35f..7ba9fb84fb 100644 --- a/packages/devel/qt5/package.mk +++ b/packages/devel/qt5/package.mk @@ -60,7 +60,7 @@ pre_configure_target() { PKG_CONFIGURE_OPTS_TARGET="-prefix /usr -sysroot ${SYSROOT_PREFIX} -hostprefix ${TOOLCHAIN} - -device linux-libreelec-g++ + -device linux-g++ -device-option CROSS_COMPILE=${TARGET_PREFIX} -fontconfig -opensource -confirm-license @@ -160,13 +160,8 @@ configure_target() { mkdir -p ${PKG_BUILD}/.${TARGET_NAME} cd ${PKG_BUILD}/.${TARGET_NAME} - # Avoid eglfs_brcm detection by bcm_host.h - if [ "${DEVICE}" = "RPi4" -o "${DEVICE}" = "RPi2" ]; then - sed -e "s#bcm_host.h#bcm_host2.h#" -i ${PKG_BUILD}/qtbase/src/gui/configure.json - fi - # Create mkspecs file - QMAKE_CONF_DIR="${PKG_BUILD}/qtbase/mkspecs/devices/linux-libreelec-g++" + QMAKE_CONF_DIR="${PKG_BUILD}/qtbase/mkspecs/devices/linux-g++" QMAKE_CONF="${QMAKE_CONF_DIR}/qmake.conf" mkdir -p ${QMAKE_CONF_DIR} diff --git a/packages/emulators/libretro/idtech-lr/package.mk b/packages/emulators/libretro/idtech-lr/package.mk index 325913756a..90ffe9836a 100644 --- a/packages/emulators/libretro/idtech-lr/package.mk +++ b/packages/emulators/libretro/idtech-lr/package.mk @@ -3,7 +3,7 @@ PKG_NAME="idtech-lr" PKG_LICENSE="Apache-2.0" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_LONGDESC="Package for all iD Software game engines." PKG_TOOLCHAIN="manual" diff --git a/packages/emulators/standalone/dolphin-sa/config/AMD64/WiiControllerProfiles/hremote.ini b/packages/emulators/standalone/dolphin-sa/config/AMD64/WiiControllerProfiles/hremote.ini index cbd6a07604..88ebbc2d30 100644 --- a/packages/emulators/standalone/dolphin-sa/config/AMD64/WiiControllerProfiles/hremote.ini +++ b/packages/emulators/standalone/dolphin-sa/config/AMD64/WiiControllerProfiles/hremote.ini @@ -12,8 +12,8 @@ Shake/Y = Button 4 Shake/Z = Button 4 D-Pad/Up = Axis 6- D-Pad/Down = Axis 6+ -D-Pad/Left = Axis 7- -D-Pad/Right = Axis 7+ +D-Pad/Left = Axis 7+ +D-Pad/Right = Axis 7- IR/Up = `Axis 4-` IR/Down = `Axis 4+` IR/Left = `Axis 3-` diff --git a/packages/emulators/standalone/dolphin-sa/config/AMD64/WiiControllerProfiles/vremote.ini b/packages/emulators/standalone/dolphin-sa/config/AMD64/WiiControllerProfiles/vremote.ini index 2880a8a369..6f5adf896b 100644 --- a/packages/emulators/standalone/dolphin-sa/config/AMD64/WiiControllerProfiles/vremote.ini +++ b/packages/emulators/standalone/dolphin-sa/config/AMD64/WiiControllerProfiles/vremote.ini @@ -10,10 +10,10 @@ Buttons/Home = Button 8 Shake/X = Button 4 Shake/Y = Button 4 Shake/Z = Button 4 -D-Pad/Up = Axis 7- -D-Pad/Down = Axis 7+ -D-Pad/Left = Axis 6- -D-Pad/Right = Axis 6+ +D-Pad/Up = Axis 7+ +D-Pad/Down = Axis 7- +D-Pad/Left = Axis 6+ +D-Pad/Right = Axis 6- IR/Up = `Axis 4-` IR/Down = `Axis 4+` IR/Left = `Axis 3-` diff --git a/packages/emulators/standalone/duckstation-sa/config/RK3566/RK3566 b/packages/emulators/standalone/duckstation-sa/config/RK3566/RK3566 new file mode 120000 index 0000000000..9207b5754b --- /dev/null +++ b/packages/emulators/standalone/duckstation-sa/config/RK3566/RK3566 @@ -0,0 +1 @@ +RK3566 \ No newline at end of file diff --git a/packages/emulators/standalone/flycast-sa/package.mk b/packages/emulators/standalone/flycast-sa/package.mk index 07472663f5..ad6af839a8 100644 --- a/packages/emulators/standalone/flycast-sa/package.mk +++ b/packages/emulators/standalone/flycast-sa/package.mk @@ -3,7 +3,7 @@ # Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="flycast-sa" -PKG_VERSION="c146a92f83ae2cba8df8970e21efc54301b9ade1" +PKG_VERSION="195f401044fc3a77d6ae0dbd206d446d127b2769" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/flyinghead/flycast" PKG_URL="${PKG_SITE}.git" diff --git a/packages/emulators/standalone/retroarch/package.mk b/packages/emulators/standalone/retroarch/package.mk index 20c5bfc815..0a215f6d65 100644 --- a/packages/emulators/standalone/retroarch/package.mk +++ b/packages/emulators/standalone/retroarch/package.mk @@ -37,16 +37,6 @@ case ${PROJECT} in ;; esac -case ${DEVICE} in - RK3566*) - PKG_DEPENDS_TARGET+=" libgo2" - PKG_CONFIGURE_OPTS_TARGET+=" --enable-odroidgo2" - ;; - *) - PKG_CONFIGURE_OPTS_TARGET+=" --disable-odroidgo2" - ;; -esac - case ${ARCH} in arm) PKG_CONFIGURE_OPTS_TARGET+=" --enable-neon" diff --git a/packages/emulators/standalone/retroarch/patches/RK3566-X55/0011-librga.patch b/packages/emulators/standalone/retroarch/patches/RK3566-X55/0011-librga.patch deleted file mode 100644 index 7f875aea19..0000000000 --- a/packages/emulators/standalone/retroarch/patches/RK3566-X55/0011-librga.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -rupN retroarch.orig/gfx/drivers/oga_gfx.c retroarch/gfx/drivers/oga_gfx.c ---- retroarch.orig/gfx/drivers/oga_gfx.c 2022-02-28 19:40:46.222185295 -0500 -+++ retroarch/gfx/drivers/oga_gfx.c 2022-02-28 19:44:14.187909576 -0500 -@@ -22,7 +22,7 @@ - #include "../../verbosity.h" - #include - #include --#include -+#include - #include - #include - #include diff --git a/packages/emulators/standalone/retroarch/patches/RK3566-X55/002-display-tweaks.patch b/packages/emulators/standalone/retroarch/patches/RK3566-X55/002-display-tweaks.patch deleted file mode 100644 index bc388cce96..0000000000 --- a/packages/emulators/standalone/retroarch/patches/RK3566-X55/002-display-tweaks.patch +++ /dev/null @@ -1,35 +0,0 @@ -Correct DRM format on Powkiddy x55, extracted from PowKiddy x55 sources. -diff --git a/deps/libgo2/src/display.c b/deps/libgo2/src/display.c -index b91cf0624b..936b677fc4 100644 ---- a/deps/libgo2/src/display.c -+++ b/deps/libgo2/src/display.c -@@ -550,7 +550,7 @@ static uint32_t go2_rkformat_get(uint32_t drm_fourcc) - - case DRM_FORMAT_ARGB8888: - case DRM_FORMAT_XRGB8888: -- return RK_FORMAT_BGRA_8888; -+ return RK_FORMAT_RGBA_8888; - - case DRM_FORMAT_RGB565: - return RK_FORMAT_RGB_565; -@@ -586,6 +586,7 @@ void go2_surface_blit(go2_surface_t* srcSurface, int srcX, int srcY, int srcWidt - dst.rect.hstride = dstSurface->height; - dst.rect.format = go2_rkformat_get(dstSurface->format); - -+ - rga_info_t src = { 0 }; - src.fd = go2_surface_prime_fd(srcSurface); - src.mmuFlag = 1; -diff --git a/gfx/drivers_context/drm_go2_ctx.c b/gfx/drivers_context/drm_go2_ctx.c -index b758137703..dbcb992279 100644 ---- a/gfx/drivers_context/drm_go2_ctx.c -+++ b/gfx/drivers_context/drm_go2_ctx.c -@@ -133,7 +133,7 @@ static void *gfx_ctx_go2_drm_init(void *video_driver) - } - - drm->presenter = go2_presenter_create(drm->display, -- DRM_FORMAT_RGB565, 0xff000000, true); -+ DRM_FORMAT_XRGB8888, 0xff000000, true); - - return drm; - } diff --git a/packages/emulators/standalone/vita3k-sa/package.mk b/packages/emulators/standalone/vita3k-sa/package.mk index 0fdf101efa..cc2369c1a5 100644 --- a/packages/emulators/standalone/vita3k-sa/package.mk +++ b/packages/emulators/standalone/vita3k-sa/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="vita3k-sa" -PKG_VERSION="564417b3b6a31296a2a09912c249a0145376e3c8" +PKG_VERSION="da73a57" PKG_LICENSE="GPLv2" PKG_SITE="https://github.com/Vita3K/Vita3K" PKG_URL="${PKG_SITE}.git" @@ -33,7 +33,8 @@ pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF \ -DUSE_DISCORD_RICH_PRESENCE=OFF \ - -DUSE_VITA3K_UPDATE=OFF" + -DUSE_VITA3K_UPDATE=OFF \ + -DXXH_X86DISPATCH_ALLOW_AVX=ON" } makeinstall_target() { @@ -46,6 +47,9 @@ makeinstall_target() { chmod 0755 ${INSTALL}/usr/bin/* mkdir -p ${INSTALL}/usr/config/vita3k/launcher - cp ${PKG_DIR}/scripts/start_vita3k.sh ${INSTALL}/usr/config/vita3k/launcher/Start\ Vita3K.sh - chmod 0755 ${INSTALL}/usr/config/vita3k/launcher/Start\ Vita3K.sh + cp ${PKG_DIR}/scripts/start_vita3k.sh ${INSTALL}/usr/config/vita3k/launcher/_Start\ Vita3K.sh + cp ${PKG_DIR}/scripts/scan_vita3k.sh ${INSTALL}/usr/config/vita3k/launcher/_Scan\ Vita\ Games.sh + chmod 0755 ${INSTALL}/usr/config/vita3k/launcher/*sh + + cp ${PKG_DIR}/sources/vita-gamelist.txt ${INSTALL}/usr/config/vita3k } diff --git a/packages/emulators/standalone/vita3k-sa/patches/001-base-path.patch b/packages/emulators/standalone/vita3k-sa/patches/001-base-path.patch index 1b0777c25d..003bb01ea0 100644 --- a/packages/emulators/standalone/vita3k-sa/patches/001-base-path.patch +++ b/packages/emulators/standalone/vita3k-sa/patches/001-base-path.patch @@ -1,15 +1,26 @@ -diff --git a/vita3k/main.cpp b/vita3k/main.cpp -index 4439ad9b6e..c26b84ff82 100644 ---- a/vita3k/main.cpp -+++ b/vita3k/main.cpp -@@ -84,8 +84,8 @@ static void run_execv(char *argv[], EmuEnvState &emuenv) { - int main(int argc, char *argv[]) { - ZoneScoped; // Tracy - Track main function scope - Root root_paths; -- root_paths.set_base_path(string_utils::utf_to_wide(SDL_GetBasePath())); -- root_paths.set_pref_path(string_utils::utf_to_wide(SDL_GetPrefPath(org_name, app_name))); -+ root_paths.set_base_path(string_utils::utf_to_wide("/storage/.config/vita3k/")); -+ root_paths.set_pref_path(string_utils::utf_to_wide("/storage/psvita/vita3k/")); +diff --git a/vita3k/app/src/app_init.cpp b/vita3k/app/src/app_init.cpp +index 8536b401..459e21f5 100644 +--- a/vita3k/app/src/app_init.cpp ++++ b/vita3k/app/src/app_init.cpp +@@ -103,9 +103,7 @@ void update_viewport(EmuEnvState &state) { + } - // Create default preference path for safety - if (!fs::exists(root_paths.get_pref_path())) + void init_paths(Root &root_paths) { +- auto sdl_base_path = SDL_GetBasePath(); +- auto base_path = fs_utils::utf8_to_path(sdl_base_path); +- SDL_free(sdl_base_path); ++ auto base_path = fs_utils::utf8_to_path("/storage/.config/vita3k/"); + + root_paths.set_base_path(base_path); + root_paths.set_static_assets_path(base_path); +@@ -129,9 +127,7 @@ void init_paths(Root &root_paths) { + } else { + // SDL_GetPrefPath is deferred as it creates the directory. + // When using a portable directory, it is not needed. +- auto sdl_pref_path = SDL_GetPrefPath(org_name, app_name); +- auto pref_path = fs_utils::utf8_to_path(sdl_pref_path); +- SDL_free(sdl_pref_path); ++ auto pref_path = fs_utils::utf8_to_path("/storage/psvita/vita3k/"); + + #if defined(__APPLE__) + // Store other data in the user-wide path. Otherwise we may end up dumping diff --git a/packages/emulators/standalone/vita3k-sa/patches/003-drop-xdg-desktop-portals.patch b/packages/emulators/standalone/vita3k-sa/patches/003-drop-xdg-desktop-portals.patch deleted file mode 100644 index a0effdc0d6..0000000000 --- a/packages/emulators/standalone/vita3k-sa/patches/003-drop-xdg-desktop-portals.patch +++ /dev/null @@ -1,596 +0,0 @@ -diff --git a/.gitmodules b/.gitmodules -index e57fd159..bb5ed956 100644 ---- a/.gitmodules -+++ b/.gitmodules -@@ -90,9 +90,9 @@ - [submodule "external/tracy"] - path = external/tracy - url = https://github.com/wolfpld/tracy.git --[submodule "external/nativefiledialog-extended"] -- path = external/nativefiledialog-extended -- url = https://github.com/btzy/nativefiledialog-extended.git -+[submodule "external/nativefiledialog-cmake"] -+ path = external/nativefiledialog-cmake -+ url = https://github.com/Vita3K/nativefiledialog-cmake - [submodule "external/cubeb"] - path = external/cubeb - url = https://github.com/mozilla/cubeb.git -diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt -index d4dcfc94..4cb3e1ee 100644 ---- a/external/CMakeLists.txt -+++ b/external/CMakeLists.txt -@@ -344,11 +344,20 @@ target_compile_definitions(tracy PUBLIC $<$:TRACY_E - # - # target_compile_definitions(tracy PUBLIC TRACY_ENABLE) - --# Use XDG desktop portals on Linux --set(NFD_PORTAL ON) -+# Create alias to prevent the need of multiple changes in case the target name changes -+# Batocera - bring back nativefiledialog -+if(UNIX) -+ find_package(PkgConfig REQUIRED) -+ pkg_check_modules(GTK3 REQUIRED gtk+-3.0) - --# nativefiledialog-extended --add_subdirectory(nativefiledialog-extended) -+ include_directories(${GTK3_INCLUDE_DIRS}) -+ link_directories(${GTK3_LIBRARY_DIRS}) -+ -+ add_definitions(${GTK3_CFLAGS_OTHER}) -+ -+ add_library(nativefiledialog STATIC nativefiledialog-cmake/src/nfd_gtk.c nativefiledialog-cmake/src/nfd_common.c) -+ target_include_directories(nativefiledialog PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/nativefiledialog-cmake/src/include") -+ target_link_libraries(nativefiledialog ${GTK3_LIBRARIES}) -+endif() -+set_property(TARGET nativefiledialog PROPERTY FOLDER externals) - --# Create alias to prevent the need of multiple changes in case the target name changes --add_library(NFDe::NFDe ALIAS nfd) -diff --git a/vita3k/CMakeLists.txt b/vita3k/CMakeLists.txt -index e1b27dfd..25d8f88b 100644 ---- a/vita3k/CMakeLists.txt -+++ b/vita3k/CMakeLists.txt -@@ -105,7 +105,6 @@ add_subdirectory(features) - add_subdirectory(glutil) - add_subdirectory(gui) - add_subdirectory(gxm) --add_subdirectory(host) - add_subdirectory(ime) - add_subdirectory(lang) - add_subdirectory(net) -diff --git a/vita3k/dir_doc.cpp b/vita3k/dir_doc.cpp -index b66bbd98..28d5a6f4 100644 ---- a/vita3k/dir_doc.cpp -+++ b/vita3k/dir_doc.cpp -@@ -115,12 +115,6 @@ - * @brief Vita's GXM low-level graphics API translation layer - */ - --/** -- * @dir vita3k/host -- * -- * @brief Host operating system abstraction layer -- */ -- - /** - * @dir vita3k/io - * -diff --git a/vita3k/gui/CMakeLists.txt b/vita3k/gui/CMakeLists.txt -index ef7de553..811ee661 100644 ---- a/vita3k/gui/CMakeLists.txt -+++ b/vita3k/gui/CMakeLists.txt -@@ -51,5 +51,5 @@ add_library( - - target_include_directories(gui PUBLIC include ${CMAKE_SOURCE_DIR}/vita3k) - target_link_libraries(gui PUBLIC app compat config dialog emuenv https ime imgui glutil lang regmgr np) --target_link_libraries(gui PRIVATE audio ctrl kernel miniz psvpfsparser pugixml::pugixml stb renderer packages sdl2 touch vkutil host::dialog) -+target_link_libraries(gui PRIVATE audio ctrl kernel miniz psvpfsparser pugixml::pugixml stb renderer packages sdl2 touch vkutil nativefiledialog) - target_link_libraries(gui PUBLIC tracy) -diff --git a/vita3k/gui/src/archive_install_dialog.cpp b/vita3k/gui/src/archive_install_dialog.cpp -index 67832991..5d724637 100644 ---- a/vita3k/gui/src/archive_install_dialog.cpp -+++ b/vita3k/gui/src/archive_install_dialog.cpp -@@ -19,7 +19,7 @@ - #include "private.h" - - #include --#include -+#include - #include - - #include -@@ -32,7 +33,7 @@ static bool delete_archive_file; - static std::string state, type, title; - static std::map> contents_archives; - static std::vector invalid_archives; --static std::filesystem::path archive_path = ""; -+static nfdchar_t *archive_path; - static float global_progress = 0.f; - static float archives_count = 0.f; - -@@ -104,20 +104,12 @@ void draw_archive_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - gui.file_menu.archive_install_dialog = false; - } else { - if (state.empty()) { -- host::dialog::filesystem::Result result = host::dialog::filesystem::Result::CANCEL; -- if (type == "file") { -- // Set file filters for the file picking dialog -- std::vector file_filters = { -- { "PlayStation Vita commercial software package (NoNpDrm/FAGDec) / PlayStation Vita homebrew software package", { "zip", "vpk" } }, -- { "PlayStation Vita commercial software package (NoNpDrm/FAGDec)", { "zip" } }, -- { "PlayStation Vita homebrew software package", { "vpk" } }, -- }; -- // Call file picking dialog from the native file browser -- result = host::dialog::filesystem::open_file(archive_path, file_filters); -- } else { -- result = host::dialog::filesystem::pick_folder(archive_path); -- } -- if (result == host::dialog::filesystem::Result::SUCCESS) { -+ nfdresult_t result = NFD_CANCEL; -+ if (type == "file") -+ result = NFD_OpenDialog("zip,vpk", nullptr, &archive_path); -+ else -+ result = NFD_PickFolder(nullptr, &archive_path); -+ if (result == NFD_OKAY) { - state = "install"; - } else - type.clear(); -@@ -133,7 +127,7 @@ void draw_archive_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - } else - invalid_archives.push_back(archive_path); - }; -- const auto contents_path = fs::path(archive_path.wstring()); -+ const auto contents_path = fs::path(string_utils::utf_to_wide(archive_path)); - if (type == "directory") { - const auto archives_path = get_path_of_archives(contents_path); - archives_count = float(archives_path.size()); -@@ -264,7 +258,7 @@ void draw_archive_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - for (const auto archive : invalid_archives) - fs::remove(archive); - } -- archive_path = ""; -+ archive_path = nullptr; - gui.file_menu.archive_install_dialog = false; - delete_archive_file = false; - contents_archives.clear(); -diff --git a/vita3k/gui/src/firmware_install_dialog.cpp b/vita3k/gui/src/firmware_install_dialog.cpp -index 1b7208e6..f29150f7 100644 ---- a/vita3k/gui/src/firmware_install_dialog.cpp -+++ b/vita3k/gui/src/firmware_install_dialog.cpp -@@ -19,18 +19,19 @@ - - #include - #include --#include - #include - #include - #include - -+#include -+ - #include - - namespace gui { - - std::string fw_version; - bool delete_pup_file; --std::filesystem::path pup_path = ""; -+nfdchar_t *pup_path; - - static void get_firmware_version(EmuEnvState &emuenv) { - fs::ifstream versionFile(emuenv.pref_path + L"/PUP_DEC/PUP/version.txt"); -@@ -46,7 +46,7 @@ static void get_firmware_version(EmuEnvState &emuenv) { - } - - void draw_firmware_install_dialog(GuiState &gui, EmuEnvState &emuenv) { -- host::dialog::filesystem::Result result = host::dialog::filesystem::Result::CANCEL; -+ nfdresult_t result = NFD_CANCEL; - - static std::mutex install_mutex; - static bool draw_file_dialog = true; -@@ -62,23 +62,23 @@ void draw_firmware_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - std::lock_guard lock(install_mutex); - - if (draw_file_dialog) { -- result = host::dialog::filesystem::open_file(pup_path, { { "PlayStation Vita Firmware Package", { "PUP" } } }); -+ result = NFD_OpenDialog("PUP", nullptr, &pup_path); - draw_file_dialog = false; - finished_installing = false; - -- if (result == host::dialog::filesystem::Result::SUCCESS) { -+ if (result == NFD_OKAY) { - std::thread installation([&emuenv]() { -- install_pup(emuenv.pref_path, pup_path.string(), progress_callback); -+ install_pup(emuenv.pref_path, pup_path, progress_callback); - std::lock_guard lock(install_mutex); - finished_installing = true; - get_firmware_version(emuenv); - }); - installation.detach(); -- } else if (result == host::dialog::filesystem::Result::CANCEL) { -+ } else if (result == NFD_CANCEL) { - gui.file_menu.firmware_install_dialog = false; - draw_file_dialog = true; - } else { -- LOG_ERROR("Error initializing file dialog: {}", host::dialog::filesystem::get_error()); -+ LOG_ERROR("Error initializing file dialog: {}", NFD_GetError()); - gui.file_menu.firmware_install_dialog = false; - draw_file_dialog = true; - } -@@ -117,7 +118,7 @@ void draw_firmware_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - ImGui::SetCursorPosX(ImGui::GetWindowWidth() / 2 - 30); - if (ImGui::Button("OK", BUTTON_SIZE)) { - if (delete_pup_file) { -- fs::remove(fs::path(pup_path.wstring())); -+ fs::remove(fs::path(string_utils::utf_to_wide(pup_path))); - delete_pup_file = false; - } - if (emuenv.cfg.initial_setup) -diff --git a/vita3k/gui/src/initial_setup.cpp b/vita3k/gui/src/initial_setup.cpp -index 0bbe3548..e327c6cb 100644 ---- a/vita3k/gui/src/initial_setup.cpp -+++ b/vita3k/gui/src/initial_setup.cpp -@@ -19,11 +19,12 @@ - - #include - #include --#include - #include - - #include - -+#include -+ - namespace gui { - - enum InitialSetup { -@@ -121,12 +122,12 @@ void draw_initial_setup(GuiState &gui, EmuEnvState &emuenv) { - ImGui::TextWrapped("%s", emuenv.cfg.pref_path.c_str()); - ImGui::SetCursorPos(!is_default_path ? ImVec2((WINDOW_SIZE.x / 2.f) - BIG_BUTTON_SIZE.x - (20.f * SCALE.x), BIG_BUTTON_POS.y) : BIG_BUTTON_POS); - if (ImGui::Button("Change Emulator Path", BIG_BUTTON_SIZE)) { -- std::filesystem::path emulator_path = ""; -- host::dialog::filesystem::Result result = host::dialog::filesystem::pick_folder(emulator_path); -+ nfdchar_t *emulator_path = nullptr; -+ nfdresult_t result = NFD_PickFolder(nullptr, &emulator_path); - -- if ((result == host::dialog::filesystem::Result::SUCCESS) && (emulator_path.wstring() != emuenv.pref_path)) { -- emuenv.pref_path = emulator_path.wstring() + L'/'; -- emuenv.cfg.pref_path = emulator_path.string(); -+ if ((result == NFD_OKAY) && (string_utils::utf_to_wide(emulator_path) != emuenv.pref_path)) { -+ emuenv.pref_path = string_utils::utf_to_wide(emulator_path) + L'/'; -+ emuenv.cfg.pref_path = emulator_path; - } - } - if (!is_default_path) { -diff --git a/vita3k/gui/src/license_install_dialog.cpp b/vita3k/gui/src/license_install_dialog.cpp -index beabedb8..7eb910a5 100644 ---- a/vita3k/gui/src/license_install_dialog.cpp -+++ b/vita3k/gui/src/license_install_dialog.cpp -@@ -17,15 +17,15 @@ - - #include "private.h" - --#include - #include - #include - #include -+#include - - namespace gui { - - static std::string state, title, zRIF; --std::filesystem::path license_path = ""; -+nfdchar_t *license_path; - static bool delete_license_file; - - void draw_license_install_dialog(GuiState &gui, EmuEnvState &emuenv) { -@@ -67,10 +67,10 @@ void draw_license_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - if (ImGui::Button(common["cancel"].c_str(), BUTTON_SIZE)) - gui.file_menu.license_install_dialog = false; - } else if (state == "license") { -- host::dialog::filesystem::Result result = host::dialog::filesystem::Result::CANCEL; -- result = host::dialog::filesystem::open_file(license_path, { { "PlayStation Vita software license file", { "bin", "rif" } } }); -- if (result == host::dialog::filesystem::Result::SUCCESS) { -- if (copy_license(emuenv, fs::path(license_path.wstring()))) -+ nfdresult_t result = NFD_CANCEL; -+ result = NFD_OpenDialog("bin,rif", nullptr, &license_path); -+ if (result == NFD_OKAY) { -+ if (copy_license(emuenv, license_path)) - state = "success"; - else - state = "fail"; -@@ -105,12 +105,12 @@ void draw_license_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - ImGui::Spacing(); - ImGui::Separator(); - ImGui::Spacing(); -- if (license_path != "") -+ if (license_path) - ImGui::Checkbox(license["delete_bin_rif"].c_str(), &delete_license_file); - ImGui::SetCursorPos(ImVec2(POS_BUTTON, ImGui::GetWindowSize().y - BUTTON_SIZE.y - (20.f * SCALE.y))); - if (ImGui::Button(common["ok"].c_str(), BUTTON_SIZE)) { - if (delete_license_file) { -- fs::remove(fs::path(license_path.wstring())); -+ fs::remove(fs::path(string_utils::utf_to_wide(std::string(license_path)))); - delete_license_file = false; - } - license_path = nullptr; -diff --git a/vita3k/gui/src/pkg_install_dialog.cpp b/vita3k/gui/src/pkg_install_dialog.cpp -index 75c11214..46fcf6f8 100644 ---- a/vita3k/gui/src/pkg_install_dialog.cpp -+++ b/vita3k/gui/src/pkg_install_dialog.cpp -@@ -18,7 +18,6 @@ - #include "private.h" - - #include --#include - #include - #include - #include -@@ -25,19 +25,18 @@ - #include - #include - #include -- -+#include - #include - - namespace gui { - --static std::filesystem::path pkg_path = ""; --static std::filesystem::path license_path = ""; -+static nfdchar_t *pkg_path, *license_path; - static std::string state, title, zRIF; - static bool draw_file_dialog = true; - static bool delete_pkg_file, delete_license_file; - - void draw_pkg_install_dialog(GuiState &gui, EmuEnvState &emuenv) { -- host::dialog::filesystem::Result result = host::dialog::filesystem::Result::CANCEL; -+ nfdresult_t result = NFD_CANCEL; - static std::atomic progress(0); - static std::mutex install_mutex; - static const auto progress_callback = [&](float updated_progress) { -@@ -53,15 +53,15 @@ void draw_pkg_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - const auto BUTTON_SIZE = ImVec2(160.f * SCALE.x, 45.f * SCALE.y); - - if (draw_file_dialog) { -- result = host::dialog::filesystem::open_file(pkg_path, { { "PlayStation Store Downloaded Package", { "pkg" } } }); -+ result = NFD_OpenDialog("pkg", nullptr, &pkg_path); - draw_file_dialog = false; -- if (result == host::dialog::filesystem::Result::SUCCESS) -+ if (result == NFD_OKAY) - ImGui::OpenPopup("install"); -- else if (result == host::dialog::filesystem::Result::CANCEL) { -+ else if (result == NFD_CANCEL) { - gui.file_menu.pkg_install_dialog = false; - draw_file_dialog = true; - } else { -- LOG_ERROR("Error initializing file dialog: {}", host::dialog::filesystem::get_error()); -+ LOG_ERROR("Error initializing file dialog: {}", NFD_GetError()); - gui.file_menu.pkg_install_dialog = false; - draw_file_dialog = true; - } -@@ -97,9 +96,9 @@ void draw_pkg_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - draw_file_dialog = true; - } - } else if (state == "license") { -- result = host::dialog::filesystem::open_file(license_path, { { "PlayStation Vita software license file", { "bin", "rif" } } }); -- if (result == host::dialog::filesystem::Result::SUCCESS) { -- fs::ifstream binfile(license_path.wstring(), std::ios::in | std::ios::binary | std::ios::ate); -+ result = NFD_OpenDialog("bin,rif", nullptr, &license_path); -+ if (result == NFD_OKAY) { -+ fs::ifstream binfile(string_utils::utf_to_wide(std::string(license_path)), std::ios::in | std::ios::binary | std::ios::ate); - zRIF = rif2zrif(binfile); - state = "install"; - } else -@@ -125,7 +125,7 @@ void draw_pkg_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - state = "install"; - } else if (state == "install") { - std::thread installation([&emuenv]() { -- if (install_pkg(pkg_path.string(), emuenv, zRIF, progress_callback)) { -+ if (install_pkg(std::string(pkg_path), emuenv, zRIF, progress_callback)) { - std::lock_guard lock(install_mutex); - state = "success"; - } else { -@@ -143,17 +142,17 @@ void draw_pkg_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - ImGui::Separator(); - ImGui::Spacing(); - ImGui::Checkbox(lang["delete_pkg"].c_str(), &delete_pkg_file); -- if (license_path != "") -+ if (license_path) - ImGui::Checkbox(lang["delete_bin_rif"].c_str(), &delete_license_file); - ImGui::Spacing(); - ImGui::SetCursorPos(ImVec2(POS_BUTTON, ImGui::GetWindowSize().y - BUTTON_SIZE.y - (20.f * SCALE.y))); - if (ImGui::Button(common["ok"].c_str(), BUTTON_SIZE)) { - if (delete_pkg_file) { -- fs::remove(fs::path(pkg_path.wstring())); -+ fs::remove(fs::path(string_utils::utf_to_wide(std::string(pkg_path)))); - delete_pkg_file = false; - } - if (delete_license_file) { -- fs::remove(fs::path(license_path.wstring())); -+ fs::remove(fs::path(string_utils::utf_to_wide(std::string(pkg_path)))); - delete_license_file = false; - } - if ((emuenv.app_info.app_category.find("gd") != std::string::npos) || (emuenv.app_info.app_category.find("gp") != std::string::npos)) { -@@ -160,8 +160,8 @@ void draw_pkg_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - save_apps_cache(gui, emuenv); - } - update_notice_info(gui, emuenv, "content"); -- pkg_path = ""; -- license_path = ""; -+ pkg_path = nullptr; -+ license_path = nullptr; - gui.file_menu.pkg_install_dialog = false; - draw_file_dialog = true; - state.clear(); -@@ -175,7 +175,7 @@ void draw_pkg_install_dialog(GuiState &gui, EmuEnvState &emuenv) { - ImGui::SetCursorPos(ImVec2(POS_BUTTON, ImGui::GetWindowSize().y - BUTTON_SIZE.y - (20.f * SCALE.y))); - if (ImGui::Button("OK", BUTTON_SIZE)) { - gui.file_menu.pkg_install_dialog = false; -- pkg_path = ""; -+ pkg_path = nullptr; - draw_file_dialog = true; - work_path = ""; - state.clear(); -diff --git a/vita3k/gui/src/settings.cpp b/vita3k/gui/src/settings.cpp -index 72ffabdb..7a6f4265 100644 ---- a/vita3k/gui/src/settings.cpp -+++ b/vita3k/gui/src/settings.cpp -@@ -20,7 +20,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -29,6 +28,7 @@ - #include - #include - -+#include - #include - #include - -@@ -581,11 +581,11 @@ void draw_settings(GuiState &gui, EmuEnvState &emuenv) { - sub_menu.clear(); - } - } else if (sub_menu == "image") { -- std::filesystem::path image_path = ""; -- host::dialog::filesystem::Result result = host::dialog::filesystem::open_file(image_path, { { "Image file", { "bmp", "gif", "jpg", "png", "tif" } } }); -+ nfdchar_t *image_path; -+ nfdresult_t result = NFD_OpenDialog("bmp,gif,jpg,png,tif", nullptr, &image_path); - -- if ((result == host::dialog::filesystem::Result::SUCCESS) && init_user_start_background(gui, image_path.string())) { -- gui.users[emuenv.io.user_id].start_path = image_path.string(); -+ if ((result == NFD_OKAY) && init_user_start_background(gui, image_path)) { -+ gui.users[emuenv.io.user_id].start_path = image_path; - gui.users[emuenv.io.user_id].start_type = "image"; - save_user(gui, emuenv, emuenv.io.user_id); - } -@@ -641,12 +641,12 @@ void draw_settings(GuiState &gui, EmuEnvState &emuenv) { - ImGui::NextColumn(); - } - if (ImGui::Selectable(theme_background.home_screen_backgrounds["add_background"].c_str(), false, ImGuiSelectableFlags_None, SIZE_PACKAGE)) { -- std::filesystem::path background_path = ""; -- host::dialog::filesystem::Result result = host::dialog::filesystem::open_file(background_path, { { "Image file", { "bmp", "gif", "jpg", "png", "tif" } } }); -+ nfdchar_t *background_path; -+ nfdresult_t result = NFD_OpenDialog("bmp,gif,jpg,png,tif", nullptr, &background_path); - -- if ((result == host::dialog::filesystem::Result::SUCCESS) && (!gui.user_backgrounds.contains(background_path.string()))) { -- if (init_user_background(gui, emuenv, background_path.string())) { -- gui.users[emuenv.io.user_id].backgrounds.push_back(background_path.string()); -+ if ((result == NFD_OKAY) && (gui.user_backgrounds.find(background_path) == gui.user_backgrounds.end())) { -+ if (init_user_background(gui, emuenv, background_path)) { -+ gui.users[emuenv.io.user_id].backgrounds.push_back(background_path); - gui.users[emuenv.io.user_id].use_theme_bg = false; - save_user(gui, emuenv, emuenv.io.user_id); - } -diff --git a/vita3k/gui/src/settings_dialog.cpp b/vita3k/gui/src/settings_dialog.cpp -index 37c05f1c..73dc08c3 100644 ---- a/vita3k/gui/src/settings_dialog.cpp -+++ b/vita3k/gui/src/settings_dialog.cpp -@@ -21,7 +21,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -43,6 +42,7 @@ - #include - - #include -+#include - #include - #include - -@@ -105,12 +105,12 @@ static void reset_emulator(GuiState &gui, EmuEnvState &emuenv) { - } - - static void change_emulator_path(GuiState &gui, EmuEnvState &emuenv) { -- std::filesystem::path emulator_path = ""; -- host::dialog::filesystem::Result result = host::dialog::filesystem::pick_folder(emulator_path); -+ nfdchar_t *emulator_path = nullptr; -+ nfdresult_t result = NFD_PickFolder(nullptr, &emulator_path); - -- if (result == host::dialog::filesystem::Result::SUCCESS && emulator_path.wstring() != emuenv.pref_path) { -+ if (result == NFD_OKAY && string_utils::utf_to_wide(emulator_path) != emuenv.pref_path) { - // Refresh the working paths -- emuenv.pref_path = emulator_path.wstring() + L'/'; -+ emuenv.pref_path = string_utils::utf_to_wide(emulator_path) + L'/'; - - // TODO: Move app old to new path - reset_emulator(gui, emuenv); -diff --git a/vita3k/gui/src/trophy_collection.cpp b/vita3k/gui/src/trophy_collection.cpp -index 85854dc3..97193c7d 100644 ---- a/vita3k/gui/src/trophy_collection.cpp -+++ b/vita3k/gui/src/trophy_collection.cpp -@@ -26,6 +26,7 @@ - #include - #include - -+#include - #include - #include - -diff --git a/vita3k/gui/src/user_management.cpp b/vita3k/gui/src/user_management.cpp -index e1d23bfb..f0b8a935 100644 ---- a/vita3k/gui/src/user_management.cpp -+++ b/vita3k/gui/src/user_management.cpp -@@ -24,13 +24,13 @@ - - #include - #include --#include - #include - #include - - #include - #include - -+#include - #include - #include - -@@ -373,11 +373,11 @@ void draw_user_management(GuiState &gui, EmuEnvState &emuenv) { - const auto CHANGE_AVATAR_BTN_SIZE = ImGui::CalcTextSize(lang["change_avatar"].c_str()).x + (ImGui::GetStyle().FramePadding.x * 2.f); - ImGui::SetCursorPos(ImVec2(AVATAR_POS.x + (AVATAR_SIZE.x / 2.f) - (CHANGE_AVATAR_BTN_SIZE / 2.f), AVATAR_POS.y + AVATAR_SIZE.y)); - if (ImGui::Button(lang["choose_avatar"].c_str(), CHANGE_AVATAR_BTN_SIZE)) { -- std::filesystem::path avatar_path = ""; -- host::dialog::filesystem::Result result = host::dialog::filesystem::open_file(avatar_path, { { "Image file", { "bmp", "gif", "jpg", "png", "tif" } } }); -+ nfdchar_t *avatar_path; -+ nfdresult_t result = NFD_OpenDialog("bmp,gif,jpg,png,tif", nullptr, &avatar_path); - -- if ((result == host::dialog::filesystem::Result::SUCCESS) && init_avatar(gui, emuenv, "temp", avatar_path.string())) -- temp.avatar = avatar_path.string(); -+ if ((result == NFD_OKAY) && init_avatar(gui, emuenv, "temp", avatar_path)) -+ temp.avatar = avatar_path; - } - ImGui::SetWindowFontScale(0.8f); - const auto INPUT_NAME_SIZE = 330.f * SCALE.x; -diff --git a/vita3k/host/CMakeLists.txt b/vita3k/host/CMakeLists.txt -deleted file mode 100644 -index f9d89128..00000000 ---- a/vita3k/host/CMakeLists.txt -+++ /dev/null -@@ -1 +0,0 @@ --add_subdirectory(dialog) -diff --git a/vita3k/host/dialog/CMakeLists.txt b/vita3k/host/dialog/CMakeLists.txt -deleted file mode 100644 -index d577a152..00000000 ---- a/vita3k/host/dialog/CMakeLists.txt -+++ /dev/null -@@ -1,11 +0,0 @@ --add_library(host_dialog STATIC -- src/filesystem.cpp --) -- --# Create alias for more friendly naming and avoid conflicts --# in global CMake scope --add_library(host::dialog ALIAS host_dialog) -- --target_include_directories(host_dialog PUBLIC include) -- --target_link_libraries(host_dialog PRIVATE NFDe::NFDe) diff --git a/packages/emulators/standalone/vita3k-sa/patches/004-fix-link-error.patch b/packages/emulators/standalone/vita3k-sa/patches/004-fix-link-error.patch index ce6d21857f..be1ff84d8c 100644 --- a/packages/emulators/standalone/vita3k-sa/patches/004-fix-link-error.patch +++ b/packages/emulators/standalone/vita3k-sa/patches/004-fix-link-error.patch @@ -1,12 +1,15 @@ -diff --git a/vita3k/https/CMakeLists.txt b/vita3k/https/CMakeLists.txt -index f64456bd..e9555080 100644 ---- a/vita3k/https/CMakeLists.txt -+++ b/vita3k/https/CMakeLists.txt -@@ -6,5 +6,6 @@ add_library( - ) - - target_include_directories(https PUBLIC include) --target_include_directories(https PRIVATE ${OPENSSL_INCLUDE_DIR}) -+target_include_directories(https PRIVATE crypto ssl) - target_link_libraries(https PUBLIC util) -+target_link_libraries(https PRIVATE crypto ssl) +diff --git a/vita3k/CMakeLists.txt b/vita3k/CMakeLists.txt +index 04177f04..4adb1e0b 100644 +--- a/vita3k/CMakeLists.txt ++++ b/vita3k/CMakeLists.txt +@@ -136,10 +136,6 @@ if(USE_DISCORD_RICH_PRESENCE) + target_link_libraries(vita3k PRIVATE discord-rpc) + endif() + +-if(LINUX) +- target_link_libraries(vita3k PRIVATE -static-libgcc -static-libstdc++) +-endif() +- + set_target_properties(vita3k PROPERTIES OUTPUT_NAME Vita3K + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" diff --git a/packages/emulators/standalone/vita3k-sa/scripts/scan_vita3k.sh b/packages/emulators/standalone/vita3k-sa/scripts/scan_vita3k.sh new file mode 100755 index 0000000000..2ce1036c7f --- /dev/null +++ b/packages/emulators/standalone/vita3k-sa/scripts/scan_vita3k.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) + +. /etc/profile + +GAME_PATH="/storage/psvita/vita3k/ux0/app" +GAME_DATA="/storage/.config/vita3k/vita-gamelist.txt" +OUTPUT_PATH="/storage/.config/vita3k/launcher" + +cd ${GAME_PATH} +for GAME in PC* +do + FILENAME=$(grep ${GAME} ${GAME_DATA} | sed 's~'${GAME}'\t~~g') + if [ ! -e "${OUTPUT_PATH}/${FILENAME}.psvita" ] && \ + [ -n "${FILENAME}" ] + then + echo ${GAME} > ${OUTPUT_PATH}/"${FILENAME}.psvita" + fi +done diff --git a/packages/emulators/standalone/vita3k-sa/scripts/start_vita3k.sh b/packages/emulators/standalone/vita3k-sa/scripts/start_vita3k.sh old mode 100644 new mode 100755 index 415e268cf6..4e6bf7b9d5 --- a/packages/emulators/standalone/vita3k-sa/scripts/start_vita3k.sh +++ b/packages/emulators/standalone/vita3k-sa/scripts/start_vita3k.sh @@ -6,16 +6,26 @@ . /etc/profile jslisten set "-9 Vita3K" +OUTPUT_PATH="/storage/.config/vita3k/launcher" +GAME="${1}" + #Check if vita3k folder exists in /storage/.config/vita3k if [ ! -d "/storage/.config/vita3k" ]; then mkdir -p "/storage/.config/vita3k" - cp -r "/usr/config/vita3k" "/storage/.config/" fi +#Make sure we sync any changes from /storage/.config so new features will be enabled +#without overwriting existing settings. +rsync -ah --update /usr/config/vita3k/* /storage/.config/vita3k 2>/dev/null + #Check if vita3k folder exists in /storage/roms/psvita if [ ! -d "/storage/roms/psvita/vita3k" ]; then mkdir -p "/storage/roms/psvita/vita3k" fi +if [ -n "${GAME}" ]; then + OPTIONS="-r $(cat "${GAME}")" +fi + #Start Vita3K -/usr/bin/Vita3K +/usr/bin/Vita3K ${OPTIONS} diff --git a/packages/emulators/standalone/vita3k-sa/sources/vita-gamelist.txt b/packages/emulators/standalone/vita3k-sa/sources/vita-gamelist.txt new file mode 100644 index 0000000000..4eb1d5bcb5 --- /dev/null +++ b/packages/emulators/standalone/vita3k-sa/sources/vita-gamelist.txt @@ -0,0 +1,2055 @@ +PCSE00965 #KILLALLZOMBIES +PCSG00891 √Letter +PCSE00963 √Letter +PCSB01019 √Letter +PCSE00890 10 Second Ninja X +PCSB00963 10 Second Ninja X +PCSE00349 1001 Spikes +PCSE00634 2013: Infected Wars +PCSE00972 2064: Read Only Memories +PCSE01169 36 Fragments of Midnight +PCSG00590 5-nin no Koi Prince: Himitsu no Keiyaku Kekkon +PCSE01168 7'scarlet +PCSH10090 7'scarlet +PCSG00876 7'scarlet +PCSE00914 99Vidas +PCSE01167 99vidas - Demo +PCSE00726 A Boy and His Blob +PCSH10075 A Certain Magical Virtual-On +PCSG00505 A Good Librarian Like a Good Shepherd -Library Party- +PCSE01095 A Hole New World +PCSB01095 A Rose in the Twilight +PCSE01046 A Rose in the Twilight +PCSB00955 A Virus Named TOM +PCSE00501 A Virus Named TOM +PCSE01389 A Winter's Daydream +PCSE00232 A-men +PCSB00056 A-men +PCSE00324 A-men 2 +PCSB00222 A-men 2 +PCSB00154 A-men Demo +PCSB00898 A.O.T. Wings of Freedom +PCSB00960 A.W. : Phoenix Festa +PCSE00871 A.W. : Phoenix Festa +PCSE00278 Aabs Animals +PCSG00591 Abunai Koi no Sousashitsu: Eternal Happiness +PCSB00792 AC® Chronicles +PCSE00700 AC® Chronicles +PCSB01101 Accel World vs. Sword Art Online +PCSE01071 Accel World vs. Sword Art Online +PCSG01016 Accel World vs. Sword Art Online +PCSE01356 Access Denied +PCSE01448 Active Neurons +PCSB01008 Active Soccer 2 DX +PCSB00858 Actual Sunlight +PCSE00695 Actual Sunlight +PCSE00582 Adventure Time: the Secret of the Nameless Kingdom +PCSE00905 Adventures of Mana +PCSB00975 Adventures of Mana +PCSG90182 Aegis of Earth Demo +PCSE00844 Aegis of Earth: Protonovus Assault +PCSG00362 Aegis of Earth: Protonovus Assault +PCSG01296 Aerial Life +PCSE00628 AeternoBlade +PCSG00483 AeternoBlade +PCSB00732 AeternoBlade Demo +PCSE00636 AeternoBlade Demo +PCSB00412 Age of Zombies +PCSE00362 Age of Zombies +PCSG01325 Ai Kiss +PCSG00940 AIR +PCSE00980 Air Race Speed +PCSG00461 Airship Q +PCSG00338 Aiyoku no Eustia: Angel’s Blessing +PCSG00780 Akai Suna Ochiru Tsuki +PCSE00927 Akiba's Beat +PCSB01066 AKIBA'S BEAT +PCSG00159 AKIBA'S TRIP 2 +PCSH00057 AKIBA'S TRIP 2 +PCSE00428 AKIBA'S TRIP UNDEAD & UNDRESSED +PCSG90191 ALIA's CARNIVAL! Sacramento Trial +PCSE00210 Alien Breed +PCSE00445 Alien Shooter +PCSB00964 Alone With You +PCSE00887 Alone With You +PCSB01457 Alphaset by POWGI +PCSH10271 Alphaset by POWGI +PCSE01493 Alphaset by POWGI +PCSB01187 Alteric +PCSG01243 Alvastia Chronicles +PCSG01086 Amaekata wa Kanojo Nari ni. +PCSG01293 Amamane +PCSG00638 Amatsumi Sora ni! Kumo no Hatate ni +PCSG01138 Amenity's Life +PCSG90299 Amenity's Life -アメニティーズ ライフ- 体験版 +PCSG00403 AMNESIA LATER×CROWD V Edition +PCSB00740 Amnesia Memories +PCSG00203 AMNESIA V Edition +PCSG00276 AMNESIA World +PCSE00647 Amnesia: Memories +PCSG00696 Angelique Retour +PCSE00322 Angry Birds Trilogy +PCSB00397 Angry Birds™ Star Wars +PCSE00294 Angry Birds™ Star Wars +PCSG00342 Anoko wa Ore Kara Hanarenai +PCSE00472 Another World - 20th Anniversary Edition +PCSE01147 Antiquia Lost +PCSG00700 Ao no Kanata Four Rhythm +PCSG90180 Ao no Kanata no Four Rhythm Trial Version +PCSG01281 Aoki Tsubasa no Chevalier +PCSG01283 Aonatsu Line +PCSG00848 Aqua Kitty - Milk Mine Defender DX +PCSB00798 Ar nosurge Plus: Ode to an Unborn Star +PCSE00707 AR Nosurge Plus: Ode to an Unborn Star +PCSG00751 Arcana Famiglia -La storia della Arcana Famiglia- Ancora +PCSE00427 Arcana Heart 3 LOVE MAX!!!!! +PCSG00328 Arcana Heart 3: LOVE MAX!!!!! +PCSB00050 Army Corps of Hell +PCSE00006 ARMY CORPS OF HELL +PCSE01379 Asdivine Dios +PCSE00968 Asdivine Hearts +PCSE01335 Asdivine Hearts II +PCSE01419 Asdivine Menace +PCSE00007 Asphalt: Injection +PCSG00116 Assassin's Creed® III Lady Liberty +PCSB00074 Assassin's Creed® III Liberation +PCSE00053 Assassin's Creed® III Liberation +PCSG90030 Assault Army +PCSG90032 Assault Gunners Trial Version +PCSG00901 AstralAir no Shiroki Towa: White Eternity +PCSG90248 AstralAir no Shiroki Towa: White Eternity Trial Version +PCSE01333 Atari Flashback Classics +PCSE00584 Atelier Ayesha Plus ~The Alchemist of Dusk~ +PCSB00700 Atelier Ayesha Plus ~The Alchemist of Dusk~ +PCSG00347 Atelier Ayesha Plus: The Alchemist of Dusk +PCSB00906 Atelier Escha & Logy Plus ~Alchemists of the Dusk Sky~ +PCSG00522 Atelier Escha & Logy Plus: Alchemists of the Dusk Sky +PCSE00826 Atelier Escha & Logy Plus: Alchemists of the Dusk Sky +PCSB01087 Atelier Firis ~The Alchemist and the Mysterious Journey~ +PCSE01044 Atelier Firis ~The Alchemist and the Mysterious Journey~ +PCSH10026 Atelier Firis ~The Alchemist and the Mysterious Journey~ +PCSG00929 Atelier Firis: The Alchemist of the Mysterious Journey +PCSG01116 Atelier Lydie & Suelle: The Alchemists and the Mysterious Paintings +PCSE00296 Atelier Meruru Plus: The Apprentice of Arland +PCSB00377 Atelier Meruru Plus: The Apprentice of Arland +PCSG00171 Atelier Meruru Plus: The Apprentice of Arland +PCSG01223 Atelier Nelke: The Alchemists and the New Earth +PCSE00466 Atelier Rorona Plus ~The Alchemist of Arland~ +PCSB00582 Atelier Rorona Plus ~The Alchemist of Arland~ +PCSG00245 Atelier Rorona Plus: The Alchemist of Arland +PCSE00998 Atelier Shallie Plus - Alchemists of the Dusk Sea +PCSG00821 Atelier Shallie Plus ~Alchemists of the Dusk Sea~ +PCSB01043 Atelier Shallie Plus ~Alchemists of the Dusk Sea~ +PCSE00892 Atelier Sophie ~The Alchemist of the Mysterious Book~ +PCSB00973 Atelier Sophie ~The Alchemist of the Mysterious Book~ +PCSG00694 Atelier Sophie: The Alchemist of the Mysterious Book +PCSH00220 Atelier Sophie: The Alchemist of the Mysterious Book +PCSH00231 Atelier Sophie: The Alchemist of the Mysterious Book +PCSE00231 Atelier Totori Plus: The Adventurer of Arland +PCSG00127 Atelier Totori Plus: The Adventurer of Arland +PCSB00291 Atelier Totori Plus: The Adventurer of Arland +PCSB00274 Atomic Ninjas +PCSE00274 Atomic Ninjas +PCSG00762 Attack on Titan +PCSE00812 Attack on Titan +PCSG01102 Attack on Titan 2 +PCSE00780 Attractio +PCSE01367 Awesome Pea +PCSE01474 Awesome Pea 2 +PCSB00779 Axiom Verge +PCSG00666 Ayakashi Gohan: Oomori! +PCSG01175 Azayaka na Irodori no Naka de, Kimi Rashiku +PCSE00861 Azkend 2: The World Beneath +PCSG00711 Baboon! +PCSE01343 Back in 1995 +PCSE00706 Back to Bed +PCSB00468 Backgammon Blitz +PCSB01092 Bad Apple Wars +PCSE01042 Bad Apple Wars +PCSB00669 BADLAND: Game of the Year Edition +PCSG00425 Bakumatsu Rock: Ultra Soul +PCSB01406 Balthazar's Dream +PCSG01123 Banbutsu Otome * Dungeons +PCSG00708 Bara ni Kakusareshi Verite +PCSG01006 Bard's Gold +PCSB00911 Baseball Riot +PCSE00790 Bastion +PCSB00353 Batman: Arkham Origins Blackgate +PCSE00444 Battalion Commander +PCSE01478 Battle Rockets +PCSG00244 Beast Tamer and Prince +PCSG00604 Beast Tamer and Prince ~Flower & Snow~ +PCSG00539 Believer! +PCSE00024 Ben 10™ Galactic Racing +PCSG01221 Beniiro Tenjou Ayakashi Kitan Futaai +PCSF00251 Bentley's Hackpack™ +PCSB01085 BERSERK and the Band of the Hawk +PCSE00377 Best of Arcade Games +PCSB00648 Best Of Arcade Games (FULL) +PCSE01495 Big Dipper +PCSE00091 Big Sky Infinity +PCSF00351 BigFest™ +PCSG00389 Binary Star +PCSB01105 Bit Dungeon Plus +PCSE00302 BIT.TRIP Presents... Runner2: Future Legend of Rhythm Alien +PCSG90096 Bitter Smile Trial +PCSG00242 Bitter smile. +PCSG00468 black butterfly psychedelia +PCSG00935 BLACK WOLVES SAGA -Weiβ und Schwarz- +PCSB00420 Blast 'Em Bunnies +PCSG00180 BLAZBLUE CHRONOPHANTASMA +PCSG00582 BLAZBLUE CHRONOPHANTASMA EXTEND +PCSB00042 BlazBlue Continuum Shift Extend +PCSG00003 BLAZBLUE CONTINUUM SHIFT EXTEND +PCSE00279 BlazBlue: ChronoPhantasma +PCSE00677 BlazBlue: Chronophantasma Extend +PCSE00018 BlazBlue: Continuum Shift EXTEND +PCSE01457 Blind Men +PCSB01250 Bloodstained: Curse of the Moon +PCSE00663 Bloxiq +PCSG00987 BLUE REFLECTION(幻に舞う少女の剣) +PCSE00864 Blue-Collar Astronaut +PCSE01019 Bodycheck +PCSG01205 Boku to Nurse no Kenshuu Nisshi +PCSG00797 Boku wa Mori Sekai no Kami Tonaru +PCSB00741 Bombing Busters +PCSE01368 Bonds of the Skies +PCSG00259 BOOLINK +PCSF00570 Borderlands 2 +PCSE00383 Borderlands 2 +PCSE00604 Boss +PCSE01349 Bouncy Bullets +PCSE00641 Breach & Clear +PCSE00225 BreakQuest: Extra Evolution +PCSB00265 BreakQuest: Extra Evolution +PCSE01429 Breeder Homegrown +PCSE00869 Bridge Constructor +PCSE00657 Broken Age +PCSE01517 Brotherhood United +PCSG00755 BROTHERS CONFLICT Precious Baby +PCSE01455 Bucket Knight +PCSG00361 Bullet Girls +PCSG00568 Bullet Girls 2 +PCSH10099 Bullet Girls Phantasia +PCSB01110 Bunny Must Die! Chelsea and the 7 devils +PCSG90261 Bunny Must Die! Chelsea and the 7devils. Trial version +PCSH10053 BURIED STARS +PCSE01135 Burly Men At Sea +PCSE00117 Burn the Rope +PCSG01197 Cafe Cuillere +PCSB00213 Call of Duty: Black Ops: Declassified +PCSG00135 Call of Duty® Black Ops: Declassified +PCSE00097 Call of Duty® Black Ops: Declassified +PCSB00232 Call of Duty® Black Ops: Declassified +PCSG00450 Captain Earth: Mind Labyrinth +PCSE00946 Castle Invasion: Throne Out +PCSB00111 CastleStorm +PCSG01179 Catherine: Full Body +PCSG90323 Catherine: Full Body Trial Verison +PCSH00099 CatsBlock Vestival +PCSB00573 Cel Damage HD +PCSE00422 Cel Damage HD +PCSG00409 Chain Chronicle V +PCSG00497 Chaos Rings I +PCSG00498 Chaos Rings II +PCSG00500 Chaos Rings III +PCSG00457 Chaos Rings III Prequel Trilogy +PCSG00499 Chaos Rings Ω +PCSE01022 Chaos;Child +PCSG00555 Chaos;Child +PCSB01075 CHAOS;CHILD +PCSG90169 Chaos;Child Demo +PCSG00995 Chaos;Child: Love Chuchu!! +PCSG00411 Chaos;Head Dual +PCSG00435 Chaos;Head Love Chu*Chu! +PCSG00434 Chaos;Head Noah +PCSG01150 Charade Maniacs +PCSE01031 Chasm +PCSB01233 Chicken Range +PCSB00598 Child of Light +PCSE00480 Child of Light +PCSG00850 Chou Ezaru wa Akai Hana: Koi wa Tsuki ni Shirube Kareru +PCSG00644 Chou Jigen Taisen Neptune VS Sega Hard Girls: Yume no Gattai Special +PCSG00234 Chou Megami Shinkou Noire: Gekishin Black Heart +PCSG00274 Chou no Doku Hana no Kusari Taishou Tsuyakoi Ibun +PCSG01066 Chouchou Jiken Rhapsodic +PCSE00044 Chronovolt +PCSB00102 Chronovolt +PCSE01281 Chronus Arc +PCSG00540 ChuSingura46+1 -忠臣蔵46+1- V +PCSG00454 Ciel Nosurge: Ushinawareta Hoshi e Sasagu Uta +PCSG00705 Citizens of Earth +PCSB00686 Citizens of Earth Demo +PCSE00562 Citizens of Earth Demo +PCSG00729 ClaDun Returns: This is Sengoku! +PCSE00999 ClaDun Returns: This is Sengoku! +PCSE01017 Cladun Returns: This is Sengoku! Demo +PCSB01067 Cladun Returns: This is Sengoku! Demo +PCSG90212 Cladun Returns: This is Sengoku! Trial Version +PCSG00415 CLANNAD +PCSA00038 Cliff Diving +PCSG00469 Clock Zero ~Shuuen no Ichibyou~ ExTime +PCSG00716 Clover Day's ~Making for Happiness.~ +PCSB00303 Coconut Dodge Revitalised +PCSE00267 Coconut Dodge Revitalised +PCSB01099 Code: Realize ~Future Blessings~ +PCSE00763 Code: Realize ~Guardian of Rebirth~ +PCSG01110 Code: Realize ~Silver Miracle~ +PCSG00805 Code: Realize ~The Future of Blessings~ +PCSE01278 Code:Realize ~Wintertide Miracles~ +PCSE01011 Collar x Malice +PCSB01061 Collar×Malice +PCSB00768 Color Guardians +PCSE00612 Color Guardians +PCSE01423 Color Slayer +PCSE00123 Colors! +PCSE00376 CONCEPTION II: Children of the Seven Stars +PCSB00547 Conception II: Children of the Seven Stars Demo +PCSE00425 Conception II: Children of the Seven Stars Demo +PCSG90087 Conception II: Children of the Seven Stars Demo +PCSG90092 Conception II: Children of the Seven Stars Demo +PCSE01406 Conga Master Go +PCSB01445 Contraptions +PCSB00822 Corpse Party BLOOD DRIVE +PCSE00708 Corpse Party BLOOD DRIVE +PCSG00298 Corpse Party: Blood Drive +PCSB00840 Corridor Z +PCSE00854 Corridor Z +PCSE01232 CosmicStarHeroine +PCSB00734 Cosmophony +PCSA00116 Counterspy +PCSG01246 Coven and Labyrinth of Galleria +PCSE00222 CRACKLE +PCSG00941 Crank In +PCSG90290 Crank In Trial Version +PCSE00291 Crazy Market +PCSE00916 Criminal Girls 2 Party Favors +PCSB00984 Criminal Girls 2 Party Favors +PCSG00681 Criminal Girls 2: Party Favors +PCSE00516 Criminal Girls: Invite Only +PCSB00636 Criminal Girls: Invite Only +PCSE00453 Crimsonland +PCSG00537 Croixleur Sigma +PCSE00689 Croixleur Sigma +PCSG00597 Cross Ange: Rondo of Angels and Dragons tr. +PCSG00365 CROSS†CHANNEL ~For all people~ +PCSB01331 Crossovers by POWGI +PCSH10175 Crossovers by POWGI +PCSE01377 Crossovers by POWGI +PCSE00806 Crypt of the NecroDancer +PCSE01464 Crypto by POWGI +PCSB01432 Crypto by POWGI +PCSH10240 Crypto by POWGI +PCSG00169 Cure Mate Club +PCSE01152 Cursed Castilla (Maldita Castilla EX) +PCSB01160 Cursed Castilla (Maldita Castilla EX) +PCSB00853 Curses 'N Chaos +PCSG01122 D.S.-Dal Segno- +PCSE01348 Daggerhood +PCSG00264 Dai-3-Ji Super Robot Taisen Z Jigoku-hen +PCSG00494 Dai-3-Ji Super Robot Taisen Z Tengoku-hen +PCSG00372 Daisenryaku Exceed II +PCSG00779 Daisenryaku Perfect: Senjou no Hasha +PCSG00504 Daisenryaku: Dai Toua Kouboushi 3 +PCSG00842 Damascus Gear Saikyou Exodus +PCSE00518 Damascus Gear: Operation Tokyo +PCSG00292 Damascus Gear: Operation Tokyo +PCSG90109 Damascus Gear: Operation Tokyo +PCSG00077 Danball Senki W Release +PCSG00807 Dance with Devils +PCSG01152 Dance with Devils My Carol +PCSG00202 Danganronpa 1&2 Reload +PCSE00399 Danganronpa 2: Goodbye Despair +PCSB00514 Danganronpa 2: Goodbye Despair +PCSE00692 Danganronpa Another Episode: Ultra Despair Girls +PCSB00788 Danganronpa Another Episode: Ultra Despair Girls +PCSG00772 Danganronpa Another Episode: Ultra Despair Girls +PCSE01100 Danganronpa V3: Killing Harmony +PCSE01105 Danganronpa V3: Killing Harmony Demo +PCSH10052 Danganronpa V3: Killing Harmony Demo version +PCSB01130 Danganronpa V3: Killing Harmony Demo version +PCSE00261 Danganronpa: Trigger Happy Havoc +PCSB00346 Danganronpa: Trigger Happy Havoc +PCSG01002 Danjon ni Deai o Motomeru no wa Machigatteiru Darou ka? Infinite Combate +PCSG01017 Daredemo Shodan ni Nareru Igo Kyoushitsu +PCSE00792 DARIUSBURST Chronicle Saviours +PCSE00919 Darkest Dungeon +PCSG00599 Date-A-Live Twin Edition: Rio Reincarnation +PCSB00540 Day D Tower Rush +PCSB00747 Day of the Tentacle Remastered +PCSE01181 Dead Ahead: Zombie Warfare +PCSA00151 Dead Nation™ +PCSB00296 DEAD OR ALIVE 5 PLUS +PCSG00167 DEAD OR ALIVE 5 PLUS +PCSG00771 Dead Or Alive Xtreme 3 Venus +PCSH00250 DEAD OR ALIVE Xtreme 3 Venus +PCSH00281 DEAD OR ALIVE Xtreme 3 Venus Free-to-Play Version +PCSE00578 Deadman's Cross +PCSE01279 Death Mark +PCSE00248 Deathmatch Village +PCSE00401 Deception IV: Blood Ties +PCSB00499 Deception IV: Blood Ties +PCSE00743 Deception IV: The Nightmare Princess +PCSB00829 Deception IV: The Nightmare Princess +PCSG00685 DEEMO ~The Last Recital~ +PCSE01041 DEEMO The Last Recital +PCSE01219 Deep Ones +PCSB01359 Deep Space Rush +PCSB01223 Defender's Quest: Valley of the Forgotten DX +PCSE00889 Delta Strike : First Assault +PCSE01005 Demetrios - The BIG Cynical Adventure +PCSE00358 Demon Gaze +PCSG00043 DEMON GAZE +PCSG00849 DEMON GAZE 2 +PCSB01150 DEMON GAZE 2 +PCSB01437 Demon's Tier+ +PCSE00639 Dengeki Bunko Fighting Climax +PCSG00341 Dengeki Bunko: Fighting Climax +PCSB00763 Dengeki Bunko: Fighting Climax +PCSG00758 Dengeki Bunko: Fighting Climax Ignition +PCSE00542 Desert Ashes +PCSG00959 DESIRE remaster ver. +PCSF00352 Destiny of Spirits +PCSA00106 Destiny of Spirits™ +PCSE01249 Devious Dungeon +PCSB01342 Devious Dungeon 2 +PCSB00953 Dex +PCSG00272 Diabolik Lovers Limited V Edition +PCSG00530 Diabolik Lovers: Dark Fate +PCSG00910 Diabolik Lovers: Lost Eden +PCSG00826 Diabolik Lovers: Lunatic Parade +PCSG00476 Diabolik Lovers: More, Blood Limited V Edition +PCSG00472 Diabolik Lovers: Vandead Carnival +PCSB00389 Die! Die! Die! +PCSE00755 Digimon Story Cyber Sleuth +PCSG00516 Digimon Story: Cyber Sleuth +PCSH00261 Digimon World: Next Order +PCSG00792 Digimon World: Next Order +PCSE00820 Dino Dini's Kick Off +PCSB00895 Dino Dini's Kick Off +PCSE00022 Disgaea 3: Absence of Detention +PCSB00098 Disgaea 3: Absence of Detention +PCSG00005 Disgaea 3:Return(魔界戦記ディスガイア3 Return) +PCSE00360 Disgaea 4: A Promise Revisited +PCSF00309 Disney Epic Mickey : Disney Epic Mickey 2: The Power of Two +PCSF00308 Disney Epic Mickey 2: The Power of Two +PCSA00110 Disney's Epic Mickey 2: The Power of Two +PCSB01165 DISTRAINT: Deluxe Edition +PCSB00373 Divekick +PCSE00208 DJMax Technika Tune +PCSG90047 DJMax Technika Tune Demo +PCSH00025 DJMax Technika Tune Demo +PCSC80021 DMM.com +PCSE00103 Doctor Who: The Eternity Clock +PCSG00775 Dogimegi Inryoku-Chan: Love & Peace +PCSG90220 Dogimegi Inryoku-Chan: Love & Peace Trial Version +PCSA00117 Doki-Doki Universe™ +PCSE00124 Dokuro +PCSB00215 Dokuro +PCSB00639 Don't Die, Mr Robot +PCSE00450 Don't Starve: Giant Edition +PCSE00327 Doodle Devil +PCSE00133 Doodle God +PCSB00556 Doodle Kingdom +PCSG01100 Doukoku Soshite... Remastered +PCSB00952 Downwell +PCSE00873 Downwell +PCSE00305 Dragon Ball Z: Battle of Z +PCSB00424 Dragon Ball Z: Battle of Z Demo +PCSG90095 Dragon Ball Z: Battle of Z Demo +PCSE00330 Dragon Ball Z: Battle of Z Demo +PCSE00217 Dragon Fantasy Book 1 +PCSE00299 Dragon Fantasy Book 2 +PCSE00952 Dragon Fantasy: Black Tome of Ice +PCSE01086 Dragon Fantasy: Volumes of Westeria +PCSE00447 Dragon Fin Soup +PCSB00621 Dragon Fin Soup +PCSG00697 Dragon Quest Builders +PCSE00912 DRAGON QUEST BUILDERS +PCSE00934 Dragon Quest Builders Demo +PCSB00999 Dragon Quest Builders Demo +PCSG90213 Dragon Quest Builders Demo +PCSH00270 Dragon Quest Builders Demo +PCSH00298 Dragon Quest Heroes II +PCSG90245 Dragon Quest Heroes II Demo +PCSE01190 Dragon Sinker +PCSE00019 Dragon's Crown +PCSG00187 Dragon's Crown +PCSB00408 Dragon's Crown +PCSH00050 Dragon's Crown +PCSG00212 Dragon's Dogma Quest +PCSE01360 Dragonfly Chronicles +PCSE01193 Dragooned +PCSG00420 DRAMAtical Murder re:code +PCSE00224 Draw Slasher +PCSG00026 DREAM C CLUB ZERO PORTABLE +PCSE01365 Dreamwalker +PCSE00841 Dreii +PCSB01097 Drive Girls +PCSE01099 Drive Girls +PCSE01363 Drowning +PCSB01404 Duck Souls+ +PCSB00437 Duke Nukem 3D: Megaton Edition +PCSE00339 Duke Nukem 3D: Megaton Edition +PCSB01474 Dull Grey +PCSE00008 Dungeon Hunter: Alliance +PCSE00944 Dungeon Punks +PCSE00693 Dungeon Travelers 2 +PCSG00407 Dungeon Travelers 2 : The Royal Library & the Monster Seal +PCSE00718 Dungeon Travelers 2 Demo +PCSG90141 Dungeon Travelers 2 Demo +PCSG00841 Dungeon Travelers 2-2 +PCSG90278 Dungeon Travelers 2-2 Trial Version +PCSB00824 Dungeon Travelers 2: The Royal Library Demo +PCSG00482 Durarara!! Relay +PCSE00332 Dustforce +PCSB01051 DYING: Reborn +PCSE00984 Dying:Reborn +PCSG00860 DYNAMIC CHORD feat.[reve parfait] V edition +PCSG00915 DYNAMIC CHORD feat.apple-polisher V edition +PCSG00862 DYNAMIC CHORD feat.KYOHSO V edition +PCSG00861 DYNAMIC CHORD feat.Liar-S V edition +PCSG90136 Dynasty Warriors 8 Empires Edit Mode Trial Version +PCSE00405 Dynasty Warriors 8: Xtreme Legends Complete Edition +PCSH00058 Dynasty Warriors Gundam Reborn +PCSE00014 Dynasty Warriors Next +PCSG00002 Dynasty Warriors Next +PCSB00108 Dynasty Warriors Next Demo Version +PCSE00069 Dynasty Warriors Next Demo Version +PCSG90006 Dynasty Warriors Next Trial Version +PCSG90018 Dynasty Warriors Next Trial Version +PCSH00004 Dynasty Warriors Next Trial Version +PCSE00995 DYNASTY WARRIORS: Godseekers +PCSH10007 Dynasty Warriors: Godseekers Trial Version +PCSG90243 Dynasty Warriors: Godseekers Trial Version +PCSB00084 EA SPORTS FIFA Football Demo +PCSB00082 EA SPORTS FIFA Football Demo +PCSB00086 EA SPORTS FIFA Football Demo +PCSE00059 EA SPORTS FIFA Football Demo +PCSB00083 EA SPORTS FIFA Football Démo +PCSE00060 EA SPORTS FIFA Football Démo +PCSE00055 EA SPORTS FIFA Soccer Demo +PCSG00039 EA SPORTS™ FIFA Football +PCSG00432 Earth Defense Force 2: PORTABLE V2 +PCSB00884 Earth Defense Force 2: Invaders from Planet Space +PCSE00710 Earth Defense Force 2: Invaders from Planet Space +PCSE00209 Earth Defense Force 2017 Portable +PCSG00291 EbiKore+ Amagami (エビコレ+ アマガミ) +PCSA00087 Ecolibrium™ +PCSG00753 Eikoku Tantei Mysteria: The Crown +PCSG01026 Eiyuu Densetsu: Akatsuki no Kiseki +PCSG00042 Eiyuu Densetsu: Zero no Kiseki Evolution +PCSG00316 Eiyuu*Senki +PCSH00246 Element4l +PCSB01325 Emerald Shores +PCSB01443 EMMA: Lost In Memories +PCSG00963 end sleep +PCSG90254 End Sleep Trail Version +PCSB00945 Energy Balance +PCSE01124 Energy Cycle +PCSE01192 Energy Invasion +PCSG01167 Enkan no Memoria: Kakera Tomoshi +PCSA00140 Entwined™ +PCSG01134 Ephemeral FANTASY ON DARK +PCSB01431 Epic Word Search Collection +PCSB01458 Epic Word Search Collection 2 +PCSF00023 Escape Plan +PCSA00004 Escape Plan™ +PCSE00095 escapeVektor +PCSE00395 Ethan: Meteor Hunter +PCSG00817 EVE burst error R +PCSG01249 EVE rebirth terror +PCSG01139 Evening Bell of Piofiore +PCSC00001 Everybody's Golf +PCSE00941 Exile's End +PCSG00679 Exist Archive +PCSB00995 Exist Archive +PCSE00883 Exist Archive: The Other Side of the Sky +PCSB01419 Explosive Jake +PCSG00196 Exstetra +PCSB00027 F1 2011 +PCSE00002 F1 2011 +PCSA00042 Facebook +PCSE01051 Factotum90 +PCSG00798 Fairune +PCSE00955 Fallen Legion +PCSH00157 Fantasy Hero ~unsigned legacy~ +PCSG00280 FANTASY HERO~unsigned legacy~ +PCSB00333 Farming Simulator +PCSE00285 Farming Simulator +PCSE00419 Farming Simulator 14 +PCSH00117 Farming Simulator 14 +PCSB00843 Farming Simulator 16 +PCSE01035 Farming Simulator 18 +PCSE01334 Fast Striker +PCSB00894 Fat City +PCSA00156 Fat Princess: Piece of Cake +PCSF00612 Fat Princess: Piece of Cake +PCSG00600 Fate/EXTELLA +PCSG01091 Fate/EXTELLA LINK +PCSE01254 Fate/EXTELLA LINK +PCSE00928 Fate/Extella: The Umbral Star +PCSG00386 Fate/hollow ataraxia +PCSG00122 Fate/Stay Night [Realta Nua] +PCSE01282 Fernz Gate +PCSE00404 Fez +PCSE00266 Fieldrunners 2 +PCSG00107 FIFA 13 WORLD CLASS SOCCER +PCSE00263 FIFA 14 +PCSG00201 FIFA 14 WORLD CLASS SOCCER +PCSG00404 FIFA 15 +PCSE00481 FIFA 15 +PCSE01431 Fifty Words by POWGI +PCSB01397 Fifty Words by POWGI +PCSH10211 Fifty Words by POWGI +PCSE01255 Fill-a-Pix: Phil's Epic Adventure +PCSB00395 FINAL FANTASY X HD Remaster +PCSG00219 FINAL FANTASY X HD Remaster +PCSB00394 Final Fantasy X-2 HD Remaster +PCSG00220 FINAL FANTASY X-2 HD Remaster +PCSE00504 Final Horizon +PCSA00037 Fireworks +PCSB00656 Flame Over +PCSE00566 Flame Over +PCSB00328 Floating Cloud God Saves the Pilgrims in HD! +PCSG01202 Floral flowlove +PCSA00114 Flower +PCSG00459 FLOWERS +PCSG00739 Flowers Le volume sur ete +PCSG01187 Flowers Le volume sur hiver +PCSB00382 Flyhunter Origins +PCSE00257 Flying Hamster HD +PCSE00039 Foosball 2012 +PCSB00160 Foosball 2012 +PCSE00797 Forma.8 +PCSE00321 Fort Defense +PCSB00472 Fort Defense North Menace +PCSG01131 Fortissimo +PCSH10065 Fortune Street: Dragon Quest & Final Fantasy 30th Anniversary +PCSB00522 Foul Play +PCSA00047 foursquare +PCSE01437 FoxyLand +PCSE01438 FoxyLand 2 +PCSE01380 Frane: Dragons' Odyssey +PCSA00147 Freedom Wars +PCSC00054 Freedom Wars +PCSD00087 FREEDOM WARS™ +PCSF00446 FREEDOM WARS™ +PCSG00519 Friend to Lover ~フレラバ~ +PCSA00050 FROBISHER SAYS!™ +PCSE00528 Frozen Synapse Prime +PCSE00229 Fruit Ninja +PCSB00273 Fruit Ninja +PCSG01260 Full Kiss +PCSB01053 Full Throttle Remastered +PCSE01261 FullBlast +PCSE00839 Funk of Titans +PCSB00421 Furmins +PCSE00111 Furmins +PCSG00227 Furuiro Meikyuu Rondo: La Roue de fortune +PCSG00922 Furuki Yoki Jidai no Boukentan +PCSB01333 Furwind +PCSG00569 Fushigi no Chronicle: Furikaerimasen Katsu Madewa +PCSG01085 Futagoza no Paradox +PCSE00495 Futuridium EP Deluxe +PCSG00493 Fuuraiki 3 +PCSG01065 Gakuen Club Himitsu no Nightclub +PCSG00654 Gakuen K -Wonderful School Days- V Edition +PCSH00249 Gakusen Toshi Asterisk Festa - Houka Kenran +PCSG00704 Gal Gunvolt +PCSE00881 Gal*Gun Double Peace +PCSG00699 Gal*Gun Double Peace +PCSB00956 Gal*Gun Double Peace +PCSG01029 Gal*Gun Double Peace Bilingual +PCSG01151 GALTIA V Edition +PCSE01440 Ganbare! Super Strikers +PCSE00958 GAROU: MARK OF THE WOLVES +PCSE00981 Geki Yaba Runner +PCSG00214 Gekijouban Madoka Magicka: The Battle Pentagram +PCSB00799 Gem Legends +PCSB00965 GemSmashers 3D +PCSG00373 Gendai Daisenryaku 2016 ~Chitsujo no Houkai·Haken Kokka Shittsui~ +PCSG00256 GENIMUS +PCSG00619 Genji Koi Emaki +PCSG00695 Genkai Tokki: Moero Crystal +PCSH00301 Genkai Tokki: Moero Crystal +PCSG00882 Genkai Tokki: Seven Pirates +PCSG01294 Gensou Rougoku no Kaleidoscope +PCSB00769 Geometry Wars 3: Dimensions +PCSB00610 Get Off My Lawn! +PCSE00421 Get Off My Lawn! +PCSG00921 Geten no Hana with Yume Akari - Aizouban +PCSG90098 Getsuei Gakuen -kou- +PCSG00991 Getsuei no Kusari: Kouran Moratorium +PCSG00794 Getsuei no Kusari: Sakuran Paranoia +PCSB01378 Ghoulboy +PCSE01340 Ghoulboy +PCSG00419 Ginsei Igo: Next Generation +PCSG01073 Gintama Rumble +PCSG00670 Girlfriend (Kari) - Kimi to Sugosu Natsuyasumi +PCSG00339 Girls und Panzer: Senshado, Kiwamemasu! +PCSG01277 Gnosia +PCSG00786 Gochuumon wa Usagi Desu ka?? +PCSG00240 GOD EATER 2 +PCSE00789 GOD EATER 2 RAGE BURST +PCSG00532 GOD EATER 2 RAGE BURST +PCSH00133 GOD EATER 2 RAGE BURST +PCSG00719 GOD EATER RESURRECTION +PCSH00199 GOD EATER RESURRECTION +PCSE00801 GOD EATER RESURRECTION +PCSF00438 God of War® Collection +PCSA00126 God of War® Collection +PCSG00831 God Wars: Future Past +PCSG00367 Goes! +PCSG00218 Golden Time Vivid Memories +PCSE00879 Grand Kingdom +PCSB01372 Grass Cutter +PCSE00487 Gravity Badgers +PCSB00525 Gravity Crash Ultra +PCSC00002 GRAVITY DAZE™ +PCSE01384 Gravity Duck +PCSB01338 Gravity Duck +PCSD00035 GRAVITY RUSH +PCSF00024 GRAVITY RUSH™ +PCSA00011 GRAVITY RUSH™ +PCSF00067 GRAVITY RUSH™ (DEMO) +PCSB00949 Green Game: Timeswapper +PCSE00547 Grim Fandango Remastered +PCSG00206 Grisaia no Kajitsu Le Fruit de la Grisaia +PCSG00620 Grisaia no kajitsu spinout +PCSG00421 Grisaia no Meikyuu Le Labyrinthe de la Grisaia +PCSG01149 Grisaia Phantom Trigger 01 & 02 +PCSG01218 Grisaia Phantom Trigger 03 & 04 +PCSE00033 Guacamelee! +PCSB00189 Guacamelee! +PCSB01416 Guard Duty +PCSG00131 GUILTY GEAR XX ΛCORE PLUS R +PCSG01013 Gun Gun Pixies +PCSG00126 Gundam Breaker +PCSG00412 Gundam Breaker 2 +PCSH00208 Gundam Breaker 3 +PCSH10042 Gundam Breaker 3 BREAK EDITION +PCSH10041 GUNDAM BREAKER 3 BREAK EDITION +PCSG00657 Gundam Conquest V +PCSE01283 GUNDEMONIUMS +PCSG01289 Gunka o Haita Neko +PCSE00340 Gunslugs +PCSB01365 Habroxia +PCSE01504 Habroxia 2 +PCSG00162 Haiyore! Nyaruko-San +PCSG00577 Hakuisei Aijou Izonshou +PCSG01275 Hakuisei Renai Shoukougun Re:Therapy +PCSE01001 Hakuoki Edo Blossoms +PCSG00217 Hakuouki Kyouka Roku +PCSG00605 Hakuouki Reimeiroku +PCSG00297 Hakuouki SSL: Sweet School Life +PCSG00930 Hakuouki Yugiroku The Great Banquet of the Members +PCSG00811 Hakuouki: Shinkai - Hana no Shou +PCSG00485 Hakuouki's Memoirs Omokagegehana +PCSE01258 Halloween Forever +PCSG00855 Hana Oboro ~Sengoku-den Ranki~ +PCSG01024 Hanasaki Work Spring! +PCSG00576 Hanayaka Nari, Wa ga Ichizoku: Gentou Nostalgie +PCSG00470 Hanayaka Nari, Wa ga Ichizoku: Modern Nostalgie +PCSG00451 Hanayamata: Yosakoi Live! +PCSE00681 Handball 16 +PCSG00992 Harukanaru Toki no Naka de 3 Ultimate +PCSG00542 Harukanaru Toki no Naka De 6 +PCSG00975 Harukanaru Toki no Naka de 6: Gentou Rondo +PCSG01157 Harukanaru Toki no Naka de Ultimate +PCSG01252 Haruoto Alice Gram: Snow Drop +PCSG00559 Harvest OverRay +PCSE00653 Hatoful Boyfriend +PCSE00776 Hatoful Boyfriend: Holiday Star +PCSG01229 Hatsujou Sprinkle +PCSE00867 Hatsune Miku Project DIVA X +PCSE00886 Hatsune Miku Project DIVA X Demo +PCSE00326 Hatsune Miku: Project DIVA f +PCSB00419 Hatsune Miku: Project DIVA f +PCSG00074 Hatsune Miku: Project DIVA f +PCSB00506 Hatsune Miku: Project DIVA f (DEMO) +PCSG00205 Hatsune Miku: Project DIVA F 2nd +PCSB00554 Hatsune Miku: Project DIVA F 2nd +PCSE00434 Hatsune Miku: Project DIVA F 2nd +PCSH00115 Hatsune Miku: Project DIVA F 2nd (DEMO) +PCSG00683 Hatsune Miku: Project Diva X +PCSB01007 Hatsune Miku: Project DIVA X +PCSH00239 Hatsune Miku: Project Diva X (DEMO) +PCSH00176 Hatsune Miku: Project DIVA X (初音未來 -Project DIVA- X) +PCSB01009 Hatsune Miku: Project DIVA X Demo +PCSG90214 Hatsune Miku: Project DIVA X Trial (DEMO) +PCSG00988 Hatsuru Kotonaki Mirai Yori +PCSG00997 Hatsuyuki Sakura +PCSA00134 HELLDIVERS™ +PCSE00666 Heroes of Loot +PCSE01256 Heroes Trials +PCSG00388 Hideboh: Tap Dance Hero +PCSG00406 High School DxD: New Fight +PCSG00517 Higurashi no Naku Koro ni Sui +PCSG00639 Himawari Pebble in the Sky +PCSH10186 Himno +PCSG00688 Himouto! Umaru-chan: Umaru Training Plan +PCSE00254 HISTORY: Legends of War: Patton +PCSB00922 Hitman GO: Definitive Edition +PCSE00846 Hitman GO: Definitive Edition +PCSG00506 Hitotsu Tobashi Ren’ai V +PCSB01340 Hoggy2 +PCSA00123 Hohokum +PCSE00533 Home - A Unique Horror Adventure +PCSB00687 Home - A Unique Horror Adventure +PCSG00926 Hoshi ori yume mirai +PCSA00009 Hot Shots Golf™: World Invitational +PCSG00200 Hotchkiss +PCSE00249 Hotline Miami +PCSB00318 Hotline Miami +PCSE00402 Hotline Miami 2: Wrong Number +PCSB00511 Hotline Miami 2: Wrong Number +PCSB00641 htoL#NiQ -The Firefly Diary- +PCSE00527 htoL#NiQ -The Firefly Diary- +PCSE00551 HTR+ Slot Car Simulation +PCSB00938 HTR+ Slot Car Simulation +PCSE00996 Hue +PCSB00246 Hungry Giraffe +PCSA00007 Hustle Kings +PCSG00518 Hyakka Ryouran Elixir: Record of Torenia Revival +PCSG00477 Hyakka Yakou +PCSE00568 Hyperdevotion Noire Goddess Black Heart +PCSE00400 Hyperdimension Neptunia PP +PCSB00515 Hyperdimension Neptunia PP +PCSG00226 Hyperdimension Neptunia Re;Birth 1 +PCSE00443 Hyperdimension Neptunia Re;Birth 1 +PCSB00626 Hyperdimension Neptunia Re;Birth2 +PCSE00661 Hyperdimension Neptunia Re;Birth3 V GENERATION +PCSG00486 Hyperdimension Neptunia Re;Birth3: V Century +PCSG00394 Hyperdimension Neptunia U: Action Unleashed +PCSB00710 HYPERDIMENSION NEPTUNIA U: Action Unleashed +PCSE00588 HYPERDIMENSION NEPTUNIA U: Action Unleashed +PCSG90077 Hyperdimension Neptunia: Producing Perfection Demo +PCSE01188 I Am The Hero +PCSG01257 I Am The Hero +PCSE01358 I and Me +PCSG00592 I DOLL U - +PCSG00337 I wanna say that I'm not your brother right now!! +PCSG00355 IA/VT -COLORFUL- +PCSE01245 Ice Cream Surfer +PCSE01177 Iconoclasts +PCSG00965 id: RebirthSession +PCSG00865 Idol Death Game TV +PCSG01094 IDOLiSH7 Twelve Fantasia! +PCSG00357 If my Heart Had Wings +PCSG01063 Ikemen Sengoku: Toki o Kakeru Koi - Aratanaru Deai +PCSG00756 Ikenie to Yuki no Setsuna +PCSE01418 Illusion of L'Phalcia +PCSA00113 Imaginstruments +PCSF00210 Imaginstruments +PCSG00602 Incognito, Falling in Love ― Snow Moon Flower Love Emaki ― +PCSE00041 INDOOR SPORTS WORLD +PCSH00278 Infinita Strada Hana +PCSG00270 Infinite Stratos 2: Ignition Hearts +PCSG00584 Infinite Stratos 2: Love and Purge +PCSB00356 Injustice: Gods Among Us Ultimate Edition +PCSE00271 Injustice: Gods Among Us Ultimate Edition +PCSE01237 InkSplosion +PCSB00157 International Snooker 2012 +PCSA00137 Invizimals: The Alliance +PCSF00415 Invizimals™ Hidden Challenges +PCSF00510 Invizimals™: The Resistance +PCSA00552 Invizimals™: The Resistance +PCSE00876 iO +PCSB01029 Iron Sea Defenders +PCSE01369 Iron Snout +PCSG01186 IS IT WRONG TO TRY TO PICK UP GIRLS IN A DUNGEON? SHOOTING +PCSG01000 ISLAND +PCSB01132 It's Spring Again +PCSG00932 Itadaki Street: Dragon Quest & Final Fantasy 30th Anniversary +PCSG01083 Iwaihime Matsuri +PCSG01297 IxSHE Tell +PCSG00300 J-Stars Victory VS +PCSE00595 J-Stars Victory Vs+ +PCSH00136 J-STARS Victory VS+ +PCSB00713 J-STARS Victory VS+ +PCSE01287 Jack N' Jill DX +PCSB01268 Jack N' Jill DX +PCSF00250 Jak 3 +PCSA00080 Jak and Daxter Collection +PCSF00248 Jak and Daxter: The Precursor Legacy +PCSF00249 Jak II +PCSB00236 JAZZ Trump's Journey +PCSE00393 Jet Car Stunts +PCSB00136 Jet Set Radio +PCSE00088 Jet Set Radio +PCSE00213 Jetpack Joyride +PCSB00244 Jetpack Joyride +PCSB00664 Jetpack Joyride Deluxe +PCSE00537 Jetpack Joyride Deluxe +PCSG00064 Jikkyou Powerful Pro Yakyuu 2012 +PCSG00134 Jikkyou Powerful Pro Yakyuu 2012 Kettei Ban +PCSG00207 Jikkyou Powerful Pro Yakyuu 2013 +PCSG00416 Jikkyou Powerful Pro Yakyuu 2014 +PCSG00748 Jikkyou Powerful Pro Yakyuu 2016 +PCSG01164 Jikkyou Powerful Pro Yakyuu 2018 +PCSG01045 Jikkyou Powerful Pro Yakyuu Championship 2017 +PCSG01219 Jikkyou Powerful Pro Yakyuu Championship 2018 +PCSG00596 Jinro Game +PCSE00478 Joe Danger +PCSE00477 Joe Danger 2: The Movie +PCSG00390 JUDAS CODE(ジューダス コード) +PCSE00594 Jungle Rumble: Freedom, Happiness, and Bananas +PCSB01400 Just a Phrase by POWGI +PCSH10213 Just a Phrase by POWGI +PCSE01436 Just a Phrase by POWGI +PCSB01362 Just Ignore Them +PCSG00529 Justy x Nasty: Maou Hajime Mashita +PCSG00635 Jyuzaengi: Engetsu Sangokuden 1+2 +PCSG00381 Kadenz fermata Akkord:fortissimo +PCSG00501 Kaeru Batake de Tsukamaete +PCSG00304 Kagero: Darkside Princess +PCSG00360 Kaihou Shoujo SIN +PCSG00172 Kajiri Kamui Kagura: Akebono no Hikari +PCSG01007 Kamaitachi no Yoru: Rinne Saisei +PCSG00675 Kamen Rider: Battride War Genesis +PCSG01106 Kamidanomi Shisugite Ore no Mirai ga Yabai. +PCSG00595 Kamigami no Asobi InFinite +PCSG00684 KanColle Kai +PCSG01268 Kannagi no Mori Satsukiame Tsuzuri +PCSG01182 Kanojo * Step +PCSG01253 Karigurashi Ren'ai +PCSG01044 Karumaruka Circle +PCSG01332 Kawaii Deathu Desu +PCSG00553 Ken Ga Kimi For V +PCSG00960 Ken ga Kimi: Momoyo Tsuzuri +PCSG00829 Kenka Bancho Otome +PCSG01042 Kenka Bancho Otome : Kanzenmuketsu no My Honey +PCSG01241 Kenka Bancho Otome 2nd Rumble!! +PCSE00485 Kick and Fennick +PCSE00113 KickBeat +PCSB01354 Kid Tripp +PCSG00040 Kidou Senshi Gundam Seed: Battle Destiny +PCSE00473 Kilka Card Gods +PCSB01477 Killer Dolls United +PCSG01132 Killers and Strawberries +PCSD00071 Killzone Mercenary +PCSC00045 Killzone®: Mercenary +PCSF00403 Killzone™ Mercenary +PCSA00107 Killzone™ Mercenary +PCSF00243 Killzone™ Mercenary +PCSG01087 Kimi no Hitomi ni Hit Me +PCSG00913 Kimi o Aogi Otome wa Hime ni +PCSG01318 Kin-iro Loveriche +PCSG01124 Kin'iro no Corda 2 ff +PCSG01212 Kin'iro no Corda 3: AnotherSky feat. Jinnan / Shiseikan / Amane Gakuen +PCSG01211 Kin'iro no Corda 3: Full Voice Special +PCSG00774 Kin'iro no Corda 4 +PCSH00275 Kin'iro no Corda 4 +PCSG01245 Kin'iro no Corda: Octave +PCSE00315 King Oddball +PCSG00742 Kiss Ato +PCSG00413 KissBell +PCSG00478 KLAP!! ~Kind Love And Punish~ +PCSG00970 KLAP!! ~Kind Love And Punish~ Fun Party +PCSB01409 Knightin'+ +PCSB00929 Knock-knock +PCSB00169 Knytt Underground +PCSE00092 Knytt Underground +PCSE01040 KOI +PCSG01299 Koisuru Otome to Shugo no Tate: Bara no Seibo +PCSG00761 Kono Aozora ni Yakusoku o +PCSG00345 Kono Uta ga Owattara: When This Song is Over +PCSG00996 Kono Yo no Hate de Koi wo Utau Shoujo YU-NO Original +PCSG01093 Konosuba - Attack of the Destroyer +PCSG01265 KonoSuba: Give Education to this Useless Goddess! +PCSG01028 KonoSuba: Judgment on this Greedy Game! +PCSG01258 Konosuba: Labyrinth of Hope and the Gathering Adventurers +PCSG01213 Koshotengai no Hashihime Noma +PCSG00273 Kud Wafter: Converted Edition +PCSG00894 Kujiragami no Tearstilla +PCSE00256 Kung Fu Rabbit +PCSE01036 Kung Fury: Street Rage +PCSG01158 Kurenai no Homura Sanada Ninpou Chou +PCSG00609 Kurogane Kaikijong +PCSG00641 Kurogane Kaikitan: Ichigoichie +PCSG90129 Kurogane Kaikitan: Senya Ichiya +PCSG01288 L'Phalcia no Genei +PCSE00567 LA-MULANA EX +PCSE00985 Lara Croft GO +PCSE00856 Last Wings +PCSE01085 League of Evil +PCSH10082 Legend of Heroes: Trails in the Sky 3rd Evolution +PCSH00178 Legend of Heroes: Trails in the Sky FC Evolution +PCSE01426 Legend of the Skyfish +PCSB01392 Legend of the Skyfish +PCSE00061 LEGO Batman 2: DC Super Heroes +PCSE00442 Lego Batman 3 Beyond Gotham +PCSE00057 Lego Harry Potter Years 5-7 +PCSE00587 Lego Jurassic World +PCSE00237 Lego Legends of Chima Laval’s Journey +PCSB00764 Lego Marvel's Avengers +PCSE00384 Lego Ninjago Nindroids +PCSE00534 Lego Ninjago Shadow Of Ronin +PCSE00791 Lego Star Wars The Force Awakens +PCSE00390 Lego The Hobbit +PCSE00067 Lego The Lord Of The Rings +PCSB00315 LEGO® MARVEL Super Heroes: Universe in Peril +PCSE00670 LEGO® MARVEL's Avengers +PCSA00138 Lemmings™ Touch +PCSG00405 Lend fleur +PCSE00216 Let's Fish ! Hooked On +PCSB00230 Let's Fish! Hooked On +PCSG00028 Let's Try Bass Fishing FISH ON NEXT +PCSB00879 Letter Quest Remastered +PCSB00845 LEVEL 22 +PCSE01010 Lichtspeer +PCSB01154 Licky The Lucky Lizard Lives Again +PCSB00336 Limbo +PCSE00268 Limbo +PCSE01285 Link-a-Pix Deluxe +PCSG01319 Link-a-Pix Deluxe +PCSE01231 Little Adventure on the Prairie +PCSG00007 Little Busters! Converted Edition (リトルバスターズ! Converted Edition) +PCSF00017 Little Deviants +PCSA00010 Little Deviants™ +PCSB01215 Little Red Lie +PCSE01218 Little Red Lie +PCSF00021 LittleBigPlanet™ PlayStation®Vita +PCSA00017 LittleBigPlanet™ PlayStation®Vita +PCSA00549 LittleBigPlanet™ PlayStation®Vita Marvel Super Hero Edition +PCSB00494 Llamasoft TxK +PCSE01187 London Detective Mysteria +PCSB00361 Lone Survivor +PCSE00301 Lone Survivor +PCSF00441 Looney Tunes™ Galactic Sports +PCSG00008 Lord of Apocalypse +PCSG90001 Lord Of Apocalypse ロードの誘い +PCSE00673 Lost Dimension +PCSG01314 LOVE CLEAR +PCSG00422 Love Live! School idol paradise Vol.1 Printemps +PCSG00423 Love Live! School idol paradise Vol.2 BiBi +PCSG00424 Love Live! School idol paradise Vol.3 lily white +PCSG01004 Love of Ren'ai Koutei of LOVE! +PCSG00667 LOVE:QUIZ - Koisuru Shoujo no Final Answer +PCSG00336 LOVELY QUEST Unlimited +PCSG00556 LOVELY×CATION 1&2 +PCSH10290 Luckslinger +PCSG01165 Lucky Dog 1 +PCSE00247 LUFTRAUSERS +PCSE00009 Lumines Electronic Symphony +PCSG00444 Luminous Arc Infinity +PCSE00857 Lumo +PCSG00475 M3: Sono Kuroki Hagane /// Mission Memento Mori +PCSE00212 Machinarium +PCSG00947 Macross Delta: Scramble +PCSE00084 Madden NFL 13 +PCSG00221 Magical Beat +PCSE00464 Magical Beat (DEMO) +PCSE00749 Mahjong Carnival +PCSG00029 Mahjong Fight Club: Shinsei Zenkoku Taisen Han +PCSG00368 Mahou Shoujo Taisen Zanbatsu +PCSG00456 Mahouka Koukou no Rettousei: Out of Order +PCSG00856 Maison de Maou +PCSG00852 Maji-Kyun! Renaissance +PCSG00652 Majin Shoujo - Chronicle 2D ACT (Japan) (En,Ja,Zh) (PSN) +PCSG00770 Majo Koi Nikki: Dragon x Caravan +PCSG01284 Making*Lovers +PCSG00130 MALICIOUS REBIRTH +PCSA00127 MALICIOUS™ REBIRTH +PCSE00736 Maliya +PCSG00340 MANGA-KA-KERU +PCSG00448 MARGINAL#4 IDOL OF SUPERNOVA +PCSG01008 MARGINAL#4 ROAD TO GALAXY +PCSG00662 Maru Goukaku! Takken Shiken - Heisei 27 Nendohan +PCSG00898 Mary Skelter: Nightmares +PCSB01059 Mary Skelter: Nightmares +PCSE01158 Mecho Tales +PCSE01264 Mecho Wars: Desert Ashes +PCSH10177 Mecho Wars: Desert Ashes +PCSB00921 MegaTagmension Blanc Neptune VS Zombies +PCSG00578 MegaTagmension Blanc + Neptune VS Zombies +PCSH00236 MegaTagmension Blanc + Neptune VS Zombies (Asia) +PCSE00832 MegaTagmension Blanc Neptune VS Zombies +PCSG00398 Meikyuu Cross Blood: Infinity Ultimate +PCSG00258 MeiQ +PCSE00918 MeiQ: Labyrinth of Death +PCSB00990 MeiQ: Labyrinth of Death +PCSG00606 MeiQ: Labyrinth of Death +PCSE01428 Mekabolt +PCSB01348 MEKORAMA +PCSG01285 MELLKISS +PCSG00733 Melty Moment +PCSG00176 Memories Off 6 Complete +PCSH10133 Memories Off Innocent Fille +PCSG01264 Memories Off Innocent Fille for Dearest +PCSB00313 Men's Room Mayhem +PCSE00252 Men's Room Mayhem +PCSE00956 Mercenary Kings +PCSH10097 METAGAL +PCSE01080 METAGAL +PCSE00078 Metal Gear Solid 2: Sons of Liberty HD Edition +PCSG00081 Metal Gear Solid 3 HD Edition +PCSE00079 Metal Gear Solid 3: Snake Eater HD Edition +PCSB00118 Metal Gear Solid HD Collection +PCSG00972 METAL MAX Xeno +PCSE00665 METAL SLUG 3 +PCSB00772 METAL SLUG 3 +PCSE00406 Metrico +PCSH10242 Metropolis: Lux Obscura +PCSE00010 Michael Jackson The Experience HD +PCSG00198 Midnight Deluxe +PCSE01194 Midnight Deluxe +PCSG01193 Mikagami Sumika no Seifuku Katsudou +PCSC00052 Miku Miku Hockey +PCSC00081 Miku Miku Hockey 2.0 +PCSB01393 Miles & Kilo +PCSE01425 Miles & Kilo +PCSB01414 Milo's Quest +PCSE01501 Mind Maze +PCSG00184 MIND≒0 +PCSE00491 Minecraft: Playstation Vita Edition +PCSG00302 Minecraft: Playstation Vita Edition +PCSB00560 Minecraft: PlayStation Vita Edition +PCSG00581 Minna de Spelunker Z +PCSC00055 Minna to Issho +PCSB00544 Minutes™ +PCSG00610 Miracle Girls Festival +PCSH10169 Mixups by POWGI +PCSB01332 Mixups by POWGI +PCSE01378 Mixups by POWGI +PCSA00002 MLB 12 The Show +PCSA00065 MLB 13: The Show +PCSA00511 MLB15 THE SHOW +PCSB00983 Mobile Suit Gundam Extreme Versus Force +PCSG00579 Mobile Suit Gundam: Battle Fortress +PCSG00738 Mobile Suit Gundam: Extreme VS Force +PCSE00915 Mobile Suit Gundam: Extreme VS-Force +PCSE01414 Mochi Mochi Boy +PCSA00001 ModNation™ Racers: Road Trip +PCSF00002 ModNation™ Racers: Road Trip +PCSG00989 Moe Moe 2-Ji Daisenryaku 3 +PCSG00065 Moe Moe Daisensou Gendai Ban Plus Plus +PCSG00378 Monobeno -pure smile- +PCSB00473 Monster Monpiece +PCSG00148 Monster Monpiece +PCSF00651 MonsterBag - +PCSE00838 MOP: Operation Cleanup +PCSB00106 Mortal Kombat +PCSE00023 Mortal Kombat +PCSG00706 Moshi, Kono Sekai ni Kami-sama ga Iru to suru Naraba. +PCSB00498 MotoGP 14 +PCSB00316 MotoGP™13 +PCSC00014 MOTORSTORM® RC +PCSF00046 MotorStorm®RC - +PCSG00247 Motto Nee, Chanto Shouyo! +Plus +PCSG00854 Moujuu-tachi to Ohime-sama +PCSB00530 MouseCraft +PCSE01002 Mr.Pumpkin Adventure +PCSB00367 Ms. Germinator +PCSB00182 MUD - FIM Motocross World Championship™ +PCSB00685 Multiplayer.it +PCSE00240 Muramasa Rebirth +PCSB00404 Muramasa Rebirth +PCSA00153 Murasaki Baby +PCSF00435 Murasaki Baby™ +PCSC00043 Muryou-ban E-Channel NEW Paint Park +PCSE01479 Mushroom Heroes +PCSH10037 Musou Stars +PCSE01184 Musynx +PCSB00979 Mutant Mudds Super Challenge +PCSB01234 Muv-Luv +PCSE01259 Muv-Luv +PCSG00776 Muv-Luv +PCSG00777 Muv-Luv Alternative +PCSG90203 Muv-Luv Alternative Total Eclipse: Teito Moyu +PCSE00530 MXGP - The Official Motocross Videogame +PCSB01463 My Aunt is a Witch +PCSE01386 My Big Sister +PCSE00982 My Name Is Mayo +PCSE00459 My Singing Monsters +PCSB00958 Mystery Chronicle: One Way Heroics +PCSG01178 NadeRevo! Nadeshiko Revolution +PCSG00664 Nanairo Reincarnation +PCSG01185 Natsuiro Kokoro Log +PCSG00650 Natsumegu +PCSB00594 NAtURAL DOCtRINE +PCSE00460 NAtURAL DOCtRINE +PCSG00030 NAX Music Player +PCSB01321 Necrosphere +PCSE01413 Need a packet? +PCSE00089 Need For Speed™ Most Wanted +PCSG00106 Need For Speed™ Most Wanted +PCSB00183 Need For Speed™ Most Wanted +PCSG00410 Nekketsu Inou Bukatsu: Trigger Kiss +PCSG01068 Neo Angelique: Tenshi no Namida +PCSG00877 Neo ATLAS 1469 +PCSB00910 Neon Chrome +PCSE01398 Neon Junctions +PCSG00951 Nep-Nep Connect: Chaos Chanpuru +PCSG00656 Net High +PCSE00070 Netflix +PCSE01236 NeuroVoider +PCSE01137 NeverEnd +PCSE00847 Neverending Nightmares +PCSB00940 Neverending Nightmares +PCSG00903 New Game! -The Challenge Stage!- +PCSH10101 New Game! -The Challenge Stage!- Chinese Version +PCSB00109 New Little King's Story +PCSE00066 New Little King's Story +PCSG01204 NG +PCSG80001 niconico +PCSE00514 Nidhogg +PCSH00254 Night of Azure / Yoru no Nai Kuni (無夜國度) +PCSG00986 Night of Azure 2 / Yoru no Nai Kuni 2 +PCSE01149 Night Trap - 25th Anniversary Edition +PCSE00895 NightCry +PCSG00557 Nights of Azure / Yoru no Nai Kuni +PCSB00705 Nihilumbra +PCSE00620 Nihilumbra +PCSG00586 Nihilumbra +PCSG00082 Nikoli no Puzzle V: Akari +PCSG00095 Nikoli no Puzzle V: Hashi o Kakero +PCSG00067 Nikoli no Puzzle V: Heyawake +PCSG00098 Nikoli no Puzzle V: Hitori ni Shitekure +PCSG00060 Nikoli no Puzzle V: Kakuro +PCSG00083 Nikoli no Puzzle V: Masyu +PCSG00097 Nikoli no Puzzle V: Number Link +PCSG00068 Nikoli no Puzzle V: Nurikabe +PCSG00096 Nikoli no Puzzle V: Shikaku ni Kire +PCSG00061 Nikoli no Puzzle V: Slither Link +PCSG00094 Nikoli no Puzzle V: Yajilin +PCSG00044 Nikoli no Sudoku V: Shugyoku no 12 Puzzle +PCSG01014 Nil Admirari's Balance Kuroyuri Enyoutan +PCSG00766 Nil Admirari's Balance Teito Illusion Kitan +PCSE00021 Ninja Gaiden Sigma Plus +PCSB00097 NINJA GAIDEN Σ PLUS +PCSG00157 NINJA GAIDEN Σ2 PLUS +PCSB00294 NINJA GAIDEN Σ2 PLUS +PCSB00903 Ninja Senki DX +PCSG01099 Ninja Usagimaru: Two Tails of Adventure +PCSG01111 Ninki Seiyuu no Tsukurikata +PCSG00397 Nisekoi: Yomeiri! +PCSA00150 No Heroes Allowed: No Puzzles Either!™ +PCSG00803 Nobunaga no Yabou 201X +PCSG00374 Nobunaga no Yabou: Souzou +PCSG00607 Nobunaga no Yabou: Souzou with Power-Up Kit +PCSG00741 Nobunaga no Yabou: Tenshouki with Power-Up Kit HD Version +PCSH00291 Nobunaga's Ambition: Souzou Sengoku Risshiden +PCSH00171 Nobunaga's Ambition: Sphere of Influence with Power-Up Kit +PCSG01107 Nora to Oujo to Noraneko Heart +PCSE01496 Norman's Great Illusion +PCSG00833 NORN9 ACT TUNE +PCSG00429 NORN9 LAST ERA +PCSB00847 NORN9 VAR COMMONS +PCSE00762 NORN9 VAR COMMONS +PCSE01173 NORTH +PCSE00686 Nova-111 +PCSE00828 Nuclear Throne +PCSE00220 Nun Attack +PCSE01004 Nurse Love Addiction +PCSB01054 Nurse Love Addiction +PCSE01318 Nurse Love Syndrome +PCSG00150 Oboro Muramasa +PCSG01021 Occultic;Nine +PCSE01097 Oceanhorn +PCSB00825 Octodad: Dadliest Catch +PCSE00623 Octodad: Dadliest Catch +PCSE00369 Oddworld: Munch's Oddysee HD +PCSE00899 Odin Sphere Leifthrasir +PCSH00218 Odin Sphere Leifthrasir +PCSB00986 Odin Sphere Leifthrasir +PCSE00341 OlliOlli +PCSE00479 OlliOlli2: Welcome to Olliwood +PCSG00550 Omega Labyrinth +PCSG00939 Omega Labyrinth Z +PCSH10044 Omega Labyrinth Z +PCSE00275 OMG HD Zombies! +PCSB01213 One Eyed Kutkh +PCSH10094 One More Dungeon +PCSG00358 ONE PIECE UNLIMITED WORLD R +PCSB00557 ONE PIECE Unlimited World Red +PCSH00034 ONE PIECE 海賊無雙2 +PCSG00743 One Piece: Burning Blood +PCSE00808 One Piece: Burning Blood +PCSG00142 One Piece: Pirate Warriors 2 +PCSG00544 One Piece: Pirate Warriors 3 +PCSE00638 ONE PIECE: PIRATE WARRIORS 3 +PCSH00205 One Tap Hero +PCSB01306 One Word by POWGI +PCSH10167 One Word by POWGI +PCSE01338 One Word by POWGI +PCSG00377 Ooedo Blacksmith +PCSA00118 OPEN ME!™ +PCSE00579 Operation Abyss: New Tokyo Legacy +PCSG00387 Operation Abyss: New Tokyo Legacy +PCSE01047 Operation Babel: New Tokyo Legacy +PCSG00514 Operation Babel: New Tokyo Legacy +PCSG00289 Ore ni Hatarakette Iwaretemo Otsu HD +PCSG00623 Ore ni Hatarakette Iwaretemo Tori +PCSF00536 Oreshika: Tainted Bloodlines +PCSC00060 Oreshika: Tainted Bloodlines +PCSA00155 Oreshika™: Tainted Bloodlines +PCSG00299 Oretachi ni Tsubasa wa Nai +PCSG01076 Oretachi no Sekai wa Owatteiru +PCSG00919 Orfleurs: Koufuku no Hanataba +PCSB00924 Organ Trail Complete Edition +PCSG00057 orgarhythm +PCSE00116 Orgarhythm +PCSG00427 Othello +PCSG00487 Otoko Yuukaku +PCSG00942 Otome Riron to Sono Shuuhen: Bon Voyage +PCSG01105 Ouka Sabaki Zan +PCSG00254 Oukaranman +PCSG00769 Ouma ga Toki: Kakuriyo no Enishi +PCSG90304 Our World is Ended +PCSG00728 Owari no Seraph: Unmei no Hajimari +PCSG00967 Owaru sekai to birthday +PCSG00496 OZMAFIA!! -vivace- +PCSB01462 Pachi Pachi +PCSA00059 Paint Park +PCSF00137 Paint Park +PCSA00111 Paint Park Plus +PCSE00489 Panda Run +PCSG01247 Panic Palette +PCSE01056 Papers, Please +PCSB01084 Papers, Please +PCSE01401 Paradox Soul +PCSE00821 Paranautical Activity +PCSG00549 Parfait +PCSE01082 Peasant Knight +PCSE01143 Penny-Punching Princess +PCSB01060 Period Cube ~Shackle of Amadeus~ +PCSG00853 Period Cube ~Shackle of Amadeus~ +PCSE01012 Period Cube ~Shackles of Amadeus~ +PCSG01031 Persona 3 Dancing in Moonlight +PCSE01274 Persona 3: Dancing in Moonlight +PCSB00245 Persona 4 Golden +PCSE00120 Persona 4 Golden +PCSG00563 Persona 4 Golden +PCSG00004 Persona 4 Golden +PCSH00021 Persona 4 The GOLDEN +PCSE00764 Persona 4: Dancing All Night +PCSB00867 Persona 4: Dancing All Night +PCSG00364 Persona 4: Dancing All Night +PCSG01030 Persona 5: Dancing in Starlight +PCSE01275 Persona 5: Dancing in Starlight +PCSB01257 Persona 5: Dancing in Starlight +PCSG00351 Phantasy Star Nova +PCSH00143 Phantasy Star Nova +PCSG90131 Phantasy Star Nova (DEMO) +PCSG90130 Phantasy Star Nova Battle (DEMO) +PCSG00141 Phantasy Star Online 2 +PCSF00718 Phineas and Ferb: Day of Doofenshmirtz +PCSG00139 PhotoKano Kiss +PCSG01071 Photon3 +PCSE01376 Pic-a-Pix Classic +PCSE01435 Pic-a-Pix Classic 2 +PCSE01253 Pic-a-Pix Color +PCSE01422 Pic-a-Pix Color 2 +PCSE01357 Pic-a-Pix Pieces +PCSE01466 Pic-a-Pix Pieces 2 +PCSE00065 Pinball Arcade +PCSA00109 Pinball Heroes: Complete +PCSF00167 Pinball Heroes: Complete +PCSE00751 Pirate Solitaire +PCSB00645 Pix The Cat +PCSE00553 Pix The Cat +PCSE00874 Pixel Hunter +PCSG00269 PixelJunk™ Monsters Ultimate HD +PCSE00307 PixelJunk™ Monsters Ultimate HD +PCSG00384 PixelJunk™ Shooter Ultimate +PCSE00064 Plants vs Zombies +PCSG00931 Plastic Memories +PCSA00069 PlayStation All-Stars Battle Royale +PCSC00032 PlayStation® All-Stars Battle Royale +PCSF00228 PlayStation® Home Arcade +PCSA00083 PlayStation® Home Arcade +PCSA00139 PlayStation®Vita Pets +PCSE00682 Pocket God vs Desert Ashes +PCSE00558 Pocket RPG +PCSG00672 POLARA +PCSE01050 POLARA +PCSG00509 Possession Magenta +PCSG00262 Power Pro Stadium +PCSG00006 Power Smash 4 +PCSE00961 Pox Nora +PCSG00905 Priministar +PCSG00491 Prince of Stride +PCSG00271 Princess Arthur +PCSG00188 Princess Strike! +PCSG00031 Pro Yakyuu Spirits 2012 +PCSG00151 Pro Yakyuu Spirits 2013 +PCSG00288 Pro Yakyuu Spirits 2014 +PCSG00541 Pro Yakyuu Spirits 2015 +PCSG01248 Pro Yakyuu Spirits 2019 +PCSG00572 Project Discovery +PCSE00311 Proteus +PCSH10091 Psychedelica of the Ashen Hawk +PCSE01166 Psychedelica of the Ashen Hawk +PCSE01164 Psychedelica of the black butterfly +PCSG00815 PsychicEmotion6 +PCSE00904 PSYCHO-PASS MANDATORY HAPPINESS +PCSB00985 PSYCHO-PASS MANDATORY HAPPINESS +PCSE00042 Puddle +PCSC00021 Puls-AR +PCSE00702 Pumped BMX + +PCSG00904 Puramai Wars V +PCSE00389 Putty Squad +PCSG00224 Puyo Puyo Tetris +PCSE00108 Puzzle by Nikoli V Slitherlink +PCSE00101 Puzzle by Nikoli V Sudoku +PCSG00045 Puzzle by Nikoli V: Sudoku +PCSE00561 Q*bert Rebooted +PCSE00143 Quell Memento +PCSG01037 Rabi Laby: Puzzle Out Stories +PCSE01111 Rabi-Ribi +PCSB00643 Race The Sun +PCSG01209 Radio Hammer Station +PCSG00958 Raging Loop +PCSG00025 Ragnarok Odyssey +PCSE00300 Ragnarok Odyssey ACE +PCSG00140 Ragnarok Odyssey ACE +PCSE00273 Rainbow Moon +PCSE00318 Rainbow Skies +PCSE01351 Random Heroes: Gold Edition +PCSF00484 Ratchet & Clank +PCSF00485 Ratchet & Clank 2 +PCSF00486 Ratchet & Clank 3 +PCSF00482 Ratchet & Clank Trilogy +PCSA00086 Ratchet & Clank: Full Frontal Assault +PCSF00191 Ratchet and Clank : QForce +PCSE00843 Ray Gigant +PCSB00928 RAYGIGANT +PCSE00277 Rayman Legends +PCSE00052 Rayman® Origins +PCSG00382 RE:VICE[D] +PCSG00933 Re:Zero - kara Hajimeru Isekai Seikatsu - Death or Kiss +PCSE00325 Real Boxing™ +PCSA00012 Reality Fighters™ +PCSG00663 Rear Pheles: Red of Another +PCSG00782 Reco Love: Gold Beach +PCSG00781 RecoLove: Blue Ocean +PCSE01434 Red Bow +PCSG90210 Red Sand Falling Moon Trial Version +PCSE01471 Reed 2 +PCSE01456 Reed Remastered +PCSG00795 Refrain no Chika Meikyuu to Majo no Ryodan +PCSG00426 Ren’ai 0 Kilometer V +PCSG00718 Renai Revenge +PCSG00990 RepKiss +PCSE00608 Resident Evil: Revelations 2 +PCSF00728 Resident Evil: Revelations 2 +PCSA00008 Resistance: Burning Skies +PCSF00142 Resistance: Burning Skies™ +PCSA00103 RESOGUN +PCSF00262 RESOGUN™ +PCSE00075 Retro City Rampage +PCSE00546 Retro City Rampage DX +PCSE01322 Revenant Dogma +PCSE01065 Revenant Saga +PCSE01229 Reverie +PCSG00414 Rewrite +PCSG01043 Rewrite Harvest festa! +PCSE01251 Riddled Corpses EX +PCSE00001 Ridge Racer +PCSG00001 RIDGE RACER +PCSB00048 RIDGE RACER +PCSG90003 Ridge Racer 2011 E3 Interactive Demo +PCSE00548 Ring Run Circus +PCSG00257 RisingStar +PCSE00850 Risk of Rain +PCSG00287 Ro-Kyu-Bu! Naisho no Shutter Chance +PCSG00352 Robotics;Notes Elite +PCSH00165 Robotics;Notes Elite +PCSG90115 Robotics;Notes Elite Demo +PCSE00761 Rocketbirds 2: Evolution +PCSE00112 Rocketbirds HBC +PCSB00571 Rogue Legacy +PCSE00449 Rogue Legacy +PCSG00616 Rollers of the Realm +PCSH00308 Romance of the Three Kingdoms XIII: Fame and Strategy +PCSG00870 Romancing SaGa 2 +PCSE01094 Romancing SaGa 2 +PCSE01337 Romancing SaGa 3 +PCSE01055 Root Double -Before Crime After Days Xtend Edition +PCSG01238 Root Letter Last Answer +PCSG90224 Rosé and the Old Castle of Twilight +PCSE00699 Roundabout +PCSE00750 Royal Defense +PCSE00753 Royal Defense Invisible Threat +PCSG00229 Rozen Maiden -Wechseln sie welt ab- +PCSG00216 Rui wa Tomo o Yobu +PCSA00490 Run Sackboy! Run! +PCSF00562 Run Sackboy! Run! +PCSE01387 Rush Rover +PCSB01464 Russian Subway Dogs +PCSG00503 Ryū ga Gotoku 0 Free app for PlayStation®Vita +PCSG00275 Ryū ga Gotoku: Ishin! Free app for PlayStation®Vita +PCSG00732 Ryuuyoku no Melodia: Diva with the Blessed Dragonol +PCSG00640 SA7 - Silent Ability Seven - +PCSG00543 Saenai Heroine no Sodatekata: 〜blessing flowers〜 +PCSG00802 SaGa: Scarlet Grace +PCSG00906 Saka Agari Hurricane Portable +PCSG90088 Saka-Ban +PCSG00646 Saki Zenkoku Hen +PCSG00908 Saki: Zenkoku-hen Plus +PCSG01231 Sakura Sakura +PCSG00129 Sakura-Sou no Pet na Kanojo +PCSB01072 Salt and Sanctuary +PCSE01023 Salt and Sanctuary +PCSG00041 Samurai & Dragons +PCSE01113 SAMURAI SHODOWN V SPECIAL +PCSG00279 Samurai Warriors 4 +PCSE00503 Samurai Warriors 4 +PCSE00827 SAMURAI WARRIORS 4 Empires +PCSE00737 SAMURAI WARRIORS 4-Ⅱ +PCSE00714 Samurai Warriors: Chronicles 3 +PCSH00152 Samurai Warriors: Chronicles 3 +PCSG00211 San Goku Shi 12 Taisenban +PCSG00210 San Goku Shi 12 with Power-Up Kit +PCSG00949 San Goku Shi 13 with Power-Up Kit +PCSG00863 Sangoku Hime 4: Tenka Ryouran - Tenmei no Koi Emaki +PCSG00183 Sangoku Rensenki: Otome no Heihou! +PCSG00785 Sangoku Rensenki: Otome no Heihou! Omoide Gaeshi - CS Edition +PCSG01194 Sanzen Sekai Yuugi: Re Multi Universe Myself +PCSC00007 Sawari Makuru! +PCSG00554 Sayonara UmiharaKawase + +PCSB00782 Sayonara UmiharaKawase + +PCSG00745 Scared Rider Xechs Rev. +PCSG01036 Scarlet Fragments ~Omoiiro no Memories~ +PCSE01355 Scintillatron4096 +PCSE01505 ScourgeBringer +PCSE00642 Scram Kitty DX +PCSG00793 SD Gundam G Generation Genesis +PCSH00241 SD GUNDAM G GENERATION GENESIS +PCSH00242 SD GUNDAM G GENERATION GENESIS +PCSE01153 Secret of Mana +PCSB01163 Secret of Mana +PCSG00168 Sei Madou Monogatari +PCSG00460 Seiken Densetsu: Rise of Mana (聖剣伝説RISE of MANA) +PCSG01127 Sen no Hatou, Tsukisome no Kouki +PCSG01104 Sengo Muramasa DX: Guren no Kettou +PCSG00132 Sengoku Hime 3: Tenka o Kirisaku Hikari to Kage +PCSG00232 Sengoku Hime 4: Souha Hyakkei, Hana Mamoru Chikai +PCSG00466 Sengoku Hime 5: Senkatatsu Haoh no Keifu +PCSG01034 Sengoku Hime 7: Sen'un Tsuranuku Guren no Ishi +PCSG00233 Sengoku Musou 2 with Moushouden & Empires HD Version +PCSG00471 Sengoku Musou Chronicle 3 +PCSG00867 Sengoku Otome: Legend Battle +PCSG00428 Senjou no Waltz +PCSB00602 SENRAN KAGURA Bon Appetit! (Hanzo x Crimson Squad) +PCSB00882 SENRAN KAGURA ESTIVAL VERSUS +PCSB00601 SENRAN KAGURA SHINOVI VERSUS +PCSG00133 Senran Kagura: Shinovi Versus +PCSE01480 Sense - A Cyberpunk Ghost Story +PCSG01210 Seven Days: Anata to Sugosu Nanokakan +PCSE00589 Severed +PCSE01125 Shakedown Hawaii +PCSE00950 Shantae: Half-Genie Hero +PCSG90111 She (That Girl) Can't Leave Me Trial Version +PCSG01177 Shikihime no Niwa +PCSG00278 Shin Gundam Musou +PCSG00380 Shin Hayarigami +PCSG00897 Shin Hayarigami 2 +PCSG00010 Shin Kamaitachi no Yoru 11 Hitome no Suspect +PCSG00452 Shin Sangoku Musou 7 Empires +PCSH00052 Shin Sangoku Musou 7 with Moushouden +PCSG00893 Shin Sangoku Musou Eiketsuden +PCSG00764 Shin Sangoku Musou Online Z +PCSG01282 Shinigami to Shoujo +PCSG00255 ShinobiAshi +PCSE00015 Shinobido 2: Revenge of Zen +PCSG00019 Shinobido 2: Revenge of Zen +PCSH00001 Shinobido 2: Revenge of Zen +PCSB00049 Shinobido 2: Revenge of Zen +PCSG00580 Shinsou-ban Mahou-tsukai to Goshujin-sama +PCSE00845 Shiren the Wanderer: The Tower of Fortune and the Dice of Fate +PCSG00944 Shiro to Kuro no Alice +PCSG01192 Shiro to Kuro no Alice -Twilight line- +PCSG00846 Shirogane x Spirits! +PCSG00822 Shitsuji ga Aruji o Erabu Toki +PCSB00743 Shovel Knight +PCSE00640 Shovel Knight +PCSE00923 Shu +PCSE00705 Shütshimi +PCSG00588 Sid Meier's Civilization Revolution 2+ +PCSG01001 Side Kicks! +PCSE00011 Silent Hill: Book of Memories +PCSB00115 Silent Hill: Book of Memories +PCSG01259 Silverio Trinity: Beyond the Horizon +PCSG00329 Simple V Series Vol.2: The Tousou Highway Full Boost: Nagoya +PCSB00161 Sine Mora +PCSE00090 Sine Mora +PCSE01240 Sir Eatsalot +PCSE00773 Siralim +PCSB00588 Skeleton Rider +PCSG00583 Skullgirls 2nd Encore +PCSE00865 Sky Force Anniversary +PCSE01054 Skylight Freerange +PCSE00862 Skylight Freerange 2: Gachduine +PCSC80009 Skype +PCSG00048 Slotter Mania V: Black Lagoon +PCSF00338 Sly 1 & 2 +PCSA00098 Sly 3: Honor Among Thieves™ +PCSF00209 Sly Cooper: Thieves in Time +PCSF00269 Sly Raccoon™ +PCSF00216 Smart as +PCSG00787 Snow White in the Mirror Realm +PCSG01254 Soi Kano: Gyutto Dakishimete +PCSG01070 Song of Heiligenstadt +PCSE00056 Sonic & All-Stars Racing Transformed +PCSB00190 Sonic & All-Stars Racing Transformed™ +PCSE00221 Sonic & All-Stars Racing Transformed™ Demo +PCSE00314 Sorcery Saga: Curse of the Great Curry God +PCSG90074 Sorcery Saga: Curse of the Great Curry God +PCSG00296 Soukai Buccaneers! +PCSC00039 SOUL SACRIFICE +PCSC00049 SOUL SACRIFICE DELTA +PCSD00079 SOUL SACRIFICE DELTA™ +PCSA00152 Soul Sacrifice™ Delta +PCSF00532 Soul Sacrifice™ Delta +PCSA00003 Sound Shapes +PCSF00076 Sound Shapes™ +PCSG00993 Sousei no Onmyouji +PCSE00295 Sparkle +PCSE01089 Spellspire +PCSG00145 Spelunker Collection +PCSE00288 Spelunky +PCSB00359 Spelunky +PCSB00789 Spider: Rite of the Shrouded Moon +PCSE00577 SpongeBob HeroPants +PCSE00068 Spy Hunter +PCSG00128 Spy Hunter™ +PCSG00714 Star Ocean Second Evolution +PCSC00008 STAR STRIKE DELTA +PCSB00254 Star Wars Pinball +PCSE01235 Stardew Valley +PCSB01226 Stardew Valley +PCSE00029 StarDrone Extreme +PCSG00917 Starry☆Sky ~Autumn Stories~ +PCSG00510 Starry☆Sky ~Spring Stories~ +PCSG00916 Starry☆Sky ~Summer Stories~ +PCSG00918 Starry☆Sky ~Winter Stories~ +PCSE01277 STAY +PCSB01254 STAY +PCSG01237 STAY +PCSB00690 Stealth Inc 2: A Game of Clones +PCSE00575 Stealth Inc 2: A Game of Clones +PCSB00317 Stealth Inc: A Clone in the Dark +PCSE00280 Stealth Inc: A Clone in the Dark +PCSG01062 Steam Prison: Nanatsu no Bitoku +PCSE01391 Steam Tactics +PCSB00542 SteamWorld Dig +PCSE00430 SteamWorld Dig +PCSE01101 SteamWorld Dig 2 +PCSE00583 SteamWorld Heist +PCSB00693 SteamWorld Heist +PCSE00644 Steins;Gate +PCSG00147 STEINS;GATE +PCSE00949 Steins;Gate 0 +PCSB01012 STEINS;GATE 0 +PCSG00673 STEINS;GATE 0 +PCSG01166 STEINS;GATE ELITE +PCSG00250 Steins;Gate Senkei Kousoku no Phenogram +PCSG00146 Steins;Gate: My Darling's Embrace(比翼恋理のだーりん) +PCSE00290 Stick it to the Man +PCSE01098 Still Time +PCSG00736 STORM LOVER 2nd V +PCSG00735 STORM LOVER V +PCSB00908 Stranger of Sword City +PCSE00818 Stranger of Sword City +PCSG00878 Stranger of Sword City +PCSG00907 Strawberry Nauts +PCSE00005 STREET FIGHTER X TEKKEN +PCSB00144 STREET FIGHTER X TEKKEN +PCSE00688 Strike Solitaire +PCSE01514 SturmFront - The Mutant War +PCSH00006 Sudoku by Nikoli V +PCSG01250 Suki to Suki to de Sankaku Ren’ai +PCSG90008 Sumioni Trial Version +PCSE00062 SUMIONI:DEMON ARTS +PCSB01013 Summon Night 6: Lost borders +PCSG00827 Summon Night 6: Lost borders +PCSH00225 Summon Night 6: Lost borders +PCSE00951 Summon Night 6: Lost Borders +PCSE00047 SunFlowers +PCSE00784 Super Blackout +PCSE01433 Super Box Land Demake +PCSG01240 Super Destronaut DX: Intruders Edition +PCSE01460 Super Destronaut: Land Wars +PCSB00362 Super Exploding Zoo +PCSE00734 Super Exploding Zoo +PCSG00069 Super Hero Generation +PCSB01193 Super Hydorah +PCSB01152 Super Life of Pixel +PCSE01077 Super Life of Pixel +PCSE00942 Super Magical +PCSE00769 Super Meat Boy! +PCSE00017 Super Monkey Ball Banana Splitz +PCSG00032 Super Monkey Ball Banana Splitz +PCSB01100 Super Mutant Alien Assault +PCSE01072 Super Mutant Alien Assault +PCSG00260 Super Robot Taisen +PCSG01128 Super Robot Taisen X +PCSH10001 Super Robot Wars V +PCSH10089 Super Robot Wars X +PCSH10088 SUPER ROBOT WARS X +PCSG00495 Super Robot Wars3 Z Jigoku Hen +PCSB01271 Super Skull Smash Go! 2 Turbo +PCSE00802 Super Star Wars +PCSA00006 Super Stardust Delta +PCSF00019 Super Stardust™ Delta +PCSE00698 Super Time Force ULTRA +PCSE01374 Super Weekend Mode +PCSE01415 Super Wiloo Demake +PCSE00717 SUPERBEAT XONiC +PCSE00898 Superdimension Neptune vs Sega Hard Girls +PCSB00305 Superfrog HD +PCSG01207 SuperZangyura +PCSE00012 Supremacy MMA: Unrestricted +PCSG00948 Suran digit +PCSB00439 Surge Deluxe +PCSE00860 Swap Quest +PCSB00923 SwapQuest +PCSG01196 sweet pool +PCSB00507 Switch Galaxy Ultra +PCSE00493 Switch Galaxy Ultra +PCSE00465 Sword Art Online -Hollow Fragment- +PCSG00868 Sword Art Online : Hollow Realization +PCSB00618 Sword Art Online Hollow Fragment +PCSE00740 Sword Art Online Lost Song +PCSH00134 SWORD ART ONLINE Lost Song +PCSG00294 Sword Art Online: Hollow Fragment +PCSB00972 SWORD ART ONLINE: HOLLOW REALIZATION +PCSE00903 SWORD ART ONLINE: HOLLOW REALIZATION +PCSB00830 Sword Art Online: Lost Song +PCSE01484 Swordbreaker The Game +PCSE01508 Synergia +PCSE01451 Syrup and the Ultimate Sweet +PCSF00064 t@g +PCSF00062 Table Football +PCSA00064 Table Ice Hockey +PCSD00047 Table Ice Hockey™ +PCSC00028 Table Play Golf +PCSB00416 Table Top Racing +PCSB00912 Tachyon Project +PCSE00836 Tachyon Project +PCSE00771 Taco Master +PCSB00458 Tadeo Jones: The game +PCSG00945 Taiheiyou no Arashi: Koukoku no Kouhai Koko ni Ari, 1942 Senkan Yamato Hankou no Gouhou +PCSG00637 Taiheiyou no Arashi: Shijousaidai no Gekisen Normandy Koubousen +PCSG00551 Taiko no Tatsujin V (太鼓の達人 Vバージョン) +PCSG00726 Taishou Mebiusline: Vitable +PCSG00869 Taishou x Alice: All in One +PCSG01141 Taishou x Alice: Heads & Tails +PCSE00034 Tales From Space: Mutant Blobs Attack +PCSB00096 Tales from Space: Mutant Blobs Attack!!! +PCSE00429 Tales of Hearts R +PCSG00125 Tales of Hearts R +PCSB00550 TALES OF HEARTS R +PCSG00163 Tales of Hearts R: Infinite Evolve +PCSG00009 Tales Of Innocence R +PCSE01468 Task Force Kampas +PCSG01203 Tayutama2 -you're the only one- +PCSA00099 Tearaway™ +PCSF00476 Tearaway™ +PCSG00547 Teikoku Kaigun Koi Bojou: Meiji Yokosuka Koushinkyoku +PCSG01064 Teikoku Kaleido: Kakumei no Rondo +PCSG01180 Tengai ni Mau, Iki na Hana +PCSG00137 Tenshi Tsuki no Shoujo +PCSE00317 Terraria +PCSB00722 Teslagrad +PCSE00814 Teslagrad +PCSE01238 TETRA's Escape +PCSB00642 Tetris® Ultimate +PCSE00521 Tetris® Ultimate +PCSE00333 The Amazing Spider-Man +PCSB00428 The Amazing Spider-Man™ +PCSB00676 The Binding of Isaac: Rebirth +PCSE00507 The Binding of Isaac: Rebirth +PCSE00735 THE BIT.TRIP +PCSE01037 The Caligula Effect +PCSG00687 The Caligula Effect +PCSE01112 The Count Lucanor +PCSE01021 The Deer God +PCSE01344 The Demon Rush: Legends Corrupt +PCSE01241 The Dreamlands: Aisling's Quest +PCSG01095 The Fruit of Grisaia: Side Episode +PCSE01305 The House in Fata Morgana +PCSG00677 The IdolM@ster Must Songs - Aka-Ban +PCSG00678 The IdolM@ster Must Songs - Ao-Ban +PCSE00441 The Keeper of 4 Elements +PCSE01224 THE KING OF FIGHTERS '97 GLOBAL MATCH +PCSG00508 The Labyrinth of Grisaia -LE EDEN DE LA GRISAIA- +PCSH10113 The Legend of Heroes AO NO KISEKI Evolution +PCSH10111 The Legend of Heroes ZERO NO KISEKI Evolution +PCSG00490 The Legend of Heroes: Trails in the Sky the Third Evolution +PCSG00195 The Legend of Heroes: Trails of Cold Steel +PCSE00786 THE LEGEND OF HEROES: TRAILS OF COLD STEEL +PCSB00866 THE LEGEND OF HEROES: TRAILS OF COLD STEEL +PCSG00354 The Legend of Heroes: Trails of Cold Steel II +PCSE00896 THE LEGEND OF HEROES: TRAILS OF COLD STEEL II +PCSG00246 The Legend of Heroes: Trails to Azure Evolution +PCSG90069 The Legend of Heroes: Zero no Kiseki Evolution Free Version +PCSE00353 The Lego Movie Videogame +PCSE01162 The Long Reach +PCSE00993 The Longest Five Minutes +PCSE01179 The Lost Child +PCSF00558 The Muppets Movie Adventures +PCSG01163 The Princess Guide +PCSG01235 The Princess, the Stray Cat, and Matters of the Heart 2 +PCSE00775 The Quiet Collection +PCSE00631 The Sun and Moon +PCSB00489 The Swapper +PCSE01388 The Tower of Beatrice +PCSB01347 The Tower of Beatrice +PCSE00436 The Treasures of Montezuma 4 +PCSE00027 The Treasures of Montezuma Blitz +PCSA00158 The Unfinished Swan +PCSE00316 The Walking Dead +PCSB00411 The Walking Dead +PCSE00556 The Walking Dead Season 2 +PCSE00352 The Wolf Among Us +PCSE00258 Thomas Was Alone +PCSE00774 Three Fourths Home (Extended Edition) +PCSE01463 Thunder Paw +PCSE01416 Thy Sword +PCSB01396 Tic-Tac-Letters by POWGI +PCSE01430 Tic-Tac-Letters by POWGI +PCSH10212 Tic-Tac-Letters by POWGI +PCSG90164 Time Avengers Demo +PCSE01186 Time Recoil +PCSG00062 TIME TRAVELERS +PCSG00966 Timepiece Ensemble +PCSE01246 Timespinner +PCSB00552 Tiny Troopers Joint Ops +PCSE00388 Titan Attacks! +PCSE00597 Titan Souls +PCSG00575 To Heart 2: Dungeon Travelers +PCSG00330 To Love-Ru Trouble Darkness: Battle Ecstasy +PCSG00689 To Love-Ru Trouble Darkness: True Princess +PCSG01089 Toaru Majutsu no Virtual-On +PCSG01015 Tokeijikake no Ley Line: Kagerou ni Samayou Majo +PCSG00087 Tokushu Houdoubu +PCSG01103 Tokyo Clanpool +PCSG90298 Tokyo Clanpool Trial +PCSG00615 Tokyo Ghoul: Jail +PCSG00631 Tokyo Onmyouji: Tengen Jibashi - Rei no Baai - V Edition +PCSE01150 TOKYO TATTOO GIRLS +PCSB01161 TOKYO TATTOO GIRLS +PCSE00924 Tokyo Twilight Ghost Hunters Daybreak: Special Gigs +PCSG00634 Tokyo Twilight Ghost Hunters: Daybreak Special Gigs +PCSE00893 Tokyo Xanadu +PCSG00608 Tokyo Xanadu +PCSB01062 Tokyo Xanadu +PCSG01048 TOKYO YAMANOTE BOYS for V MAIN DISC +PCSG01049 Tokyo Yamanote Boys for V: Fan Disc +PCSG01135 Tonari ni Kanojo no Iru Shiawase: Two Farce +PCSG01201 Tonari ni Kanojo no Iru Shiawase: Winter Guest +PCSF00011 Top Darts +PCSB00791 Top Trumps Turbo +PCSG00902 Torikago no Marriage: Hatsukoi no Tsubasa +PCSA00112 Toro's Friend Network +PCSE00671 TorqueL +PCSB00355 Total Recoil +PCSG00113 Tottemo E Mahjong +PCSG00593 Touch Battle Sensha SP +PCSE00016 Touch My Katamari +PCSB00047 Touch My Katamari +PCSE01015 TOUHOU DOUBLE FOCUS +PCSG00977 Touhou Genso Maroku W: The Devil of Decline +PCSE00990 TOUHOU Genso Wanderer +PCSG00985 Touhou Genso Wanderer TOD -RELOADED- +PCSE01104 Touhou Kobuto V: Burst Battle +PCSG00999 Touhou Koubuto V: Burst Battle +PCSG00752 Touhou Soujinengi V +PCSE00940 Toukiden 2 +PCSG00834 Toukiden 2 co-op version +PCSG00379 Toukiden: Kiwami +PCSB00574 Toukiden: Kiwami +PCSE00467 Toukiden: Kiwami +PCSG00193 Toukiden: The Age of Demons +PCSE00381 Toukiden: The Age of Demons +PCSB00918 Towerfall Ascension +PCSG00488 Trails in the Sky FC Evolution +PCSG00489 Trails In the Sky SC Evolution +PCSA00060 Treasure Park +PCSC80006 Treasure Park +PCSB00422 Treasures of Montezuma Arena +PCSG00515 Trillion : God Of Destruction +PCSB00904 Trillion: God of Destruction +PCSE00813 Trillion: God of Destruction +PCSG01023 Tsuihou Senkyo +PCSG00648 Tsuki ni Yorisou Otome no Sahou: Hidamari no Hibi +PCSG00152 Tsukiei Academy -kou- +PCSG01025 Tsukitomo. Tsukiuta 12 Memories +PCSG01019 Tsumikui: Sen no Noroi, Sen no Inori for V +PCSE01452 Twin Breaker: A Sacred Symbols Adventure +PCSE01081 Twin Robots +PCSE00397 TxK +PCSE00837 Type:Rider +PCSC00080 U-NEXT +PCSG00480 Ukiyo no Roushi +PCSB00070 ULTIMATE MARVEL VS. CAPCOM 3 +PCSG00011 ULTIMATE MARVEL VS. CAPCOM 3 +PCSE00004 ULTIMATE MARVEL VS. CAPCOM 3 +PCSE01487 Ultracore +PCSE00414 Ultratron +PCSG00912 Un:BIRTHDAY SONG: Ai o Utau Shinigami - Another Record +PCSE00822 Uncanny Valley +PCSF00220 Uncharted: Fight for Fortune™ +PCSC00005 UNCHARTED: Golden Abyss +PCSF00001 Uncharted: Golden Abyss™ +PCSF00012 Uncharted: Golden Abyss™ +PCSA00029 Uncharted: Golden Abyss™ +PCSD00001 UNCHARTED: Golden Abyss™ +PCSA00088 Uncharted™ Fight for Fortune +PCSE01144 Under Night In-Birth Exe:Late(st) +PCSG00964 UNDER NIGHT IN-BIRTH Exe:Late[st] +PCSB01157 Undertale +PCSE01116 Undertale +PCSG01112 UNDERTALE +PCSE00840 Unepic +PCSB00841 Unepic +PCSF00034 Unit 13 +PCSA00014 Unit 13™ +PCSH10310 UnMetal +PCSG00633 Uppers +PCSB00038 Urban Trial Freestyle +PCSE00051 Urban Trial Freestyle +PCSG01191 Usotsuki Hime to Moumoku Ouji +PCSG01046 Usotsuki Shangri-La +PCSG00199 Uta Kumi 575 +PCSG00651 Uta no * Prince-Sama: Music 3 +PCSG00914 Uta no * Prince-Sama: Repeat LOVE +PCSG00617 Utawarerumono: Mask of Deception +PCSG00838 Utawarerumono: Mask of Truth (うたわれるもの 二人の白皇) +PCSE01409 Utawarerumono: Prelude to the Fallen +PCSG01011 Utsusemi no Meguri +PCSE00756 VA-11 HALL-A +PCSB01166 VA-11 HALL-A +PCSE01223 VA-11 HALL-A +PCSG01072 VA-11 HALL-A +PCSE00244 Valhalla Knights 3 +PCSG00307 Valhalla Knights 3 Gold +PCSE01003 Valkyria Revolution +PCSB01011 VALKYRIE DRIVE -BHIKKHUNI- +PCSE00948 VALKYRIE DRIVE -BHIKKHUNI- +PCSG00467 Vamwolf Cross† +PCSG01159 Variable Barricade +PCSE01314 VASARA Collection +PCSB01133 Vegas Party +PCSE00712 Velocibox +PCSB00302 Velocity Ultra +PCSE00038 Velocity Ultra +PCSB00410 Velocity®2X +PCSE00374 Velocity®2X +PCSG00531 VENUS PROJECT +PCSE00621 Vertical Drop Heroes HD +PCSB00031 Virtua Tennis 4 +PCSE00003 Virtua Tennis 4 +PCSB00205 Virtue's Last Reward +PCSE00506 Vitamin Z +PCSG01115 VitaminX Destination +PCSE00913 Volgarr the Viking +PCSE00760 Volume +PCSB00810 VVVVVV +PCSG01084 Wagamama High Spec (ワガママハイスペック) +PCSE01266 Waking Violet +PCSG00768 Walpurgis no Uta +PCSG00790 Wand of Fortune R +PCSG00938 Wand of Fortune R2 +PCSE00938 Wanderjahr TryAgainOrWalkAway +PCSE01248 War Theatre +PCSE01045 Warlock's Tower +PCSG01018 Warriors All-Stars +PCSG00209 Warriors Orochi 2 Ultimate +PCSB00873 WE ARE DOOMED +NPXS10007 Welcome Park +PCSC00047 What Did I Do to Deserve This, My Lord? +PCSB00727 Whispering Willows +PCSG00249 White Album 2: Shiawase no Mukougawa +PCSE01032 Windjammers +PCSG00194 Winning Post 7 2013 +PCSG00545 Winning Post 8 2015 +PCSG00804 Winning Post 8 2016 +PCSG01174 Winning Post 8 2018 +PCSF00007 WipEout® 2048 +PCSA00015 WipEout® 2048 +PCSD00005 WipEout® 2048 +PCSE01516 Witchcrafty +PCSE01445 Without Escape +PCSG00511 Wizardry: Torawareshi Bourei no Machi +PCSG00512 Wizardry: Torawareshi Tomashii no Meikyuu +PCSE01432 Wizards of Brandel +PCSE00519 Woah Dave! +PCSE01453 Word Maze by POWGI +PCSH10228 Word Maze by POWGI +PCSB01418 Word Maze by POWGI +PCSE01286 Word Search by POWGI +PCSH10166 Word Search by POWGI +PCSB01267 Word Search by POWGI +PCSH10168 Word Sudoku by POWGI +PCSE01339 Word Sudoku by POWGI +PCSB01307 Word Sudoku by POWGI +PCSH10179 Word Wheel by POWGI +PCSB01367 Word Wheel by POWGI +PCSE01394 Word Wheel by POWGI +PCSH10180 Wordsweeper by POWGI +PCSB01366 Wordsweeper by POWGI +PCSE01395 Wordsweeper by POWGI +PCSG01088 World Election +PCSG01114 World End Syndrome +PCSG00709 World of Final Fantasy +PCSE00880 WORLD OF FINAL FANTASY +PCSG00647 World Trigger Borderless Mission +PCSG00832 World Trigger: Smash Borders +PCSB00332 WORMS REVOLUTION EXTREME +PCSE00286 WORMS REVOLUTION EXTREME +PCSB00204 WRC 3: FIA World Rally Championship +PCSB00345 WRC 4 FIA WORLD RALLY CHAMPIONSHIP +PCSE00667 WRC 5 FIA World Rally Championship +PCSE01477 Wurroom +PCSE00346 XBLAZE CODE : EMBRYO +PCSG00463 XBLAZE LOST : MEMORIES +PCSG00589 XCOM: Enemy Unknown Plus +PCSE01481 Xeno Crisis +PCSE01191 Xenon Valkyrie+ +PCSE00897 Xenoraid +PCSE00694 Xeodrifter™ +PCSG00215 Yahari Game Demo Ore no Seishun Love-Kome wa Machigatteiru. +PCSG00895 Yahari Game Demo Ore no Seishun Love-Kome wa Machigatteiru. Zoku +PCSG00800 Yaken no Rodem +PCSH00147 Yakuza 0! Companion App +PCSG01080 Yomawari: Midnight Shadows +PCSB01144 YOMAWARI: MIDNIGHT SHADOWS +PCSG01120 Yoshiwara Higanbana Kuon no Chigiri +PCSG01267 your diary + +PCSC80010 YouTube +PCSE01033 Ys Origin +PCSH10049 Ys Origins +PCSE01103 Ys VIII -Lacrimosa of DANA- +PCSH00297 Ys VIII -Lacrimosa of DANA- +PCSG00105 Ys: Memories of Celceta +PCSH00181 Ys: Memories of Celceta +PCSG00567 YU-NO: Konoyo no Hate de Koi o Utau Shoujo +PCSE01462 Yumeutsutsu Re:After +PCSG01317 Yumeutsutsu Re:After +PCSG00393 Yumeutsutsu Re:After +PCSE01461 Yumeutsutsu Re:Master +PCSG00653 Yunohana SpRING! +PCSG00909 Yunohana SpRING! ~Cherising Time~ +PCSG00502 Yuuki Yuuna wa Yuusha de Aru: Jukai no Kioku +PCSG01075 Yuukyuu no Tierblade: Fragments of Memory +PCSG00808 Yuukyuu no Tierblade: Lost Chronicle +PCSG00693 Yuusha Shisu +PCSB00390 Z-Run +PCSG90316 Zanki Zero trial version +PCSG01113 Zanki Zero: Last Beginning +PCSB00094 Zen Pinball 2 +PCSE00050 Zen Pinball 2 +PCSG00883 Zero Escape: 9 Jikan 9 nin 9 no Tobira Zennin Shibo Dos Double Pack +PCSE01006 Zero Escape: The Nonary Games +PCSE00085 Zero Escape: Virtue's Last Reward +PCSE00781 Zero Escape: Zero Time Dilemma +PCSE01088 Zero Zero Zero Zero +PCSE01371 Zeroptian Invasion +PCSG00880 Zettai Kaikyuu Gakuen: Eden with Roses and Phantasm +PCSG00611 Zettai Meikyuu: Himitsu no Oyayubi Hime +PCSE00102 Zombie Tycoon 2 : Brainhov's Revenge diff --git a/packages/emulators/tools/control-gen/control-gen.cpp b/packages/emulators/tools/control-gen/control-gen.cpp index 62cfc1b1c0..3c06b15215 100644 --- a/packages/emulators/tools/control-gen/control-gen.cpp +++ b/packages/emulators/tools/control-gen/control-gen.cpp @@ -7,7 +7,9 @@ int main() { - SDL_Init(SDL_INIT_JOYSTICK); + + SDL_GameControllerAddMappingsFromFile("/storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt"); + SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER); atexit(SDL_Quit); int num_joysticks = SDL_NumJoysticks(); @@ -18,13 +20,17 @@ int main() if (js) { SDL_JoystickGUID guid = SDL_JoystickGetGUID(js); + bool is_controller = SDL_IsGameController(i); + char guid_str[1024]; SDL_JoystickGetGUIDString(guid, guid_str, sizeof(guid_str)); - const char* name = SDL_JoystickName(js); - - printf("controlfolder=\"/storage/.config/gptokeyb\"\nESUDO=\"sudo\"\nESUDOKILL=\"-sudokill\"\nexport SDL_GAMECONTROLLERCONFIG_FILE=\"$controlfolder/gamecontrollerdb.txt\"\nSDLDBFILE=\"${SDL_GAMECONTROLLERCONFIG_FILE}\"\n[ -z \"${SDLDBFILE}\" ] && SDLDBFILE=\"${controlfolder}/gamecontrollerdb.txt\"\nSDLDBUSERFILE=\"/storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt\"\nget_controls() {\nANALOGSTICKS=\"2\"\nDEVICE=\"%s\"\nparam_device=\"%s\"\n}\nGPTOKEYB=\"$controlfolder/gptokeyb $ESUDOKILL\"", - guid_str, name); + if (is_controller) + { + const char* name = SDL_JoystickName(js); + printf("controlfolder=\"/storage/.config/gptokeyb\"\nESUDO=\"sudo\"\nESUDOKILL=\"-sudokill\"\nexport SDL_GAMECONTROLLERCONFIG_FILE=\"$controlfolder/gamecontrollerdb.txt\"\nSDLDBFILE=\"${SDL_GAMECONTROLLERCONFIG_FILE}\"\n[ -z \"${SDLDBFILE}\" ] && SDLDBFILE=\"${controlfolder}/gamecontrollerdb.txt\"\nSDLDBUSERFILE=\"/storage/.config/SDL-GameControllerDB/gamecontrollerdb.txt\"\nget_controls() {\nANALOGSTICKS=\"2\"\nDEVICE=\"%s\"\nparam_device=\"%s\"\n}\nGPTOKEYB=\"$controlfolder/gptokeyb $ESUDOKILL\"", + guid_str, name); + } SDL_JoystickClose(js); } } diff --git a/packages/emulators/tools/gamecontrollerdb/config/gamecontrollerdb.txt b/packages/emulators/tools/gamecontrollerdb/config/gamecontrollerdb.txt index 3cfab694c9..6a2b268a62 100644 --- a/packages/emulators/tools/gamecontrollerdb/config/gamecontrollerdb.txt +++ b/packages/emulators/tools/gamecontrollerdb/config/gamecontrollerdb.txt @@ -6,6 +6,7 @@ 1900c3ea010000000100000001010000,odroidgo3_joypad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,start:b13,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b15,rightstick:b16,leftx:a0,lefty:a1,rightx:a2,righty:a3, 19009b4d4b4800000111000000020000,retrogame_joypad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b8,start:b9,dpleft:b15,dpdown:b14,dpright:b16,dpup:b13,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3, 19009b4d4b4800000111000000010000,retrogame_joypad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b8,start:b9,dpleft:b15,dpdown:b14,dpright:b16,dpup:b13,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3, +0300fcb7341200007856000000000000,JELOS Gamepad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b8,start:b9,dpleft:b15,dpdown:b14,dpright:b16,dpup:b13,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4, 19009321b0c300000002000010000000,XU10 Gamepad,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,guide:b16,start:b9,dpleft:b14,dpdown:b13,dpright:b15,dpup:b12,leftshoulder:b4,lefttrigger:b7,rightshoulder:b5,righttrigger:b6,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3, 190014b3010000009178000000050000,r33s_joypad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b8,start:b9,dpleft:b12,dpdown:b11,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7, 1900e5914b4800007711000077010000,RGB20S Gamepad,platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,start:b13,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b14,rightstick:b15,leftx:a0,lefty:a1,rightx:a2,righty:a3, diff --git a/packages/emulators/tools/retroarch-joypads/gamepads/JELOS Gamepad.cfg b/packages/emulators/tools/retroarch-joypads/gamepads/JELOS Gamepad.cfg new file mode 100644 index 0000000000..5347137952 --- /dev/null +++ b/packages/emulators/tools/retroarch-joypads/gamepads/JELOS Gamepad.cfg @@ -0,0 +1,29 @@ +input_driver = "udev" +input_device = "JELOS Gamepad" +input_vendor_id = "1234" +input_product_id = "5648" +input_b_btn = "0" +input_y_btn = "3" +input_select_btn = "8" +input_start_btn = "9" +input_up_btn = "13" +input_down_btn = "14" +input_left_btn = "15" +input_right_btn = "16" +input_a_btn = "1" +input_x_btn = "2" +input_l_btn = "4" +input_r_btn = "5" +input_l2_btn = "6" +input_r2_btn = "7" +input_l3_btn = "11" +input_r3_btn = "12" +input_l_x_plus_axis = "+0" +input_l_x_minus_axis = "-0" +input_l_y_plus_axis = "+1" +input_l_y_minus_axis = "-1" +input_r_x_plus_axis = "+3" +input_r_x_minus_axis = "-3" +input_r_y_plus_axis = "+4" +input_r_y_minus_axis = "-4" +input_gun_trigger_mbtn = "1" diff --git a/packages/emulators/tools/virtualgamepad/package.mk b/packages/emulators/tools/virtualgamepad/package.mk new file mode 100644 index 0000000000..7e19e63471 --- /dev/null +++ b/packages/emulators/tools/virtualgamepad/package.mk @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) + +PKG_NAME="virtualgamepad" +PKG_VERSION="a6e8459" +PKG_LICENSE="GPLv2" +PKG_SITE="https://github.com/macromorgan/input-wrapper" +PKG_URL="${PKG_SITE}.git" +PKG_DEPENDS_TARGET="toolchain linux" +PKG_TOOLCHAIN="make" + +makeinstall_target() { + mkdir -p ${INSTALL}/usr/bin + cp wrap ${INSTALL}/usr/bin/virtualgamepad + chmod 0755 ${INSTALL}/usr/bin/virtualgamepad +} + +post_install() { + enable_service virtualgamepad.service +} diff --git a/packages/emulators/tools/virtualgamepad/system.d/virtualgamepad.service b/packages/emulators/tools/virtualgamepad/system.d/virtualgamepad.service new file mode 100644 index 0000000000..23af44bb57 --- /dev/null +++ b/packages/emulators/tools/virtualgamepad/system.d/virtualgamepad.service @@ -0,0 +1,9 @@ +[Unit] +Description=Virtual Gamepad Driver + +[Service] +Type=simple +ExecStart=/usr/bin/virtualgamepad + +[Install] +WantedBy=multi-user.target diff --git a/packages/graphics/libdrm/package.mk b/packages/graphics/libdrm/package.mk index 88f646f6e8..6eb36e16bb 100644 --- a/packages/graphics/libdrm/package.mk +++ b/packages/graphics/libdrm/package.mk @@ -34,12 +34,6 @@ listcontains "${GRAPHIC_DRIVERS}" "(r200|r300|r600|radeonsi)" && listcontains "${GRAPHIC_DRIVERS}" "radeonsi" && PKG_MESON_OPTS_TARGET+=" -Damdgpu=enabled" || PKG_MESON_OPTS_TARGET+=" -Damdgpu=disabled" -listcontains "${GRAPHIC_DRIVERS}" "vmware" && - PKG_MESON_OPTS_TARGET+=" -Dvmwgfx=enabled" || PKG_MESON_OPTS_TARGET+=" -Dvmwgfx=disabled" - -listcontains "${GRAPHIC_DRIVERS}" "vc4" && - PKG_MESON_OPTS_TARGET+=" -Dvc4=enabled" || PKG_MESON_OPTS_TARGET+=" -Dvc4=disabled" - listcontains "${GRAPHIC_DRIVERS}" "freedreno" && PKG_MESON_OPTS_TARGET+=" -Dfreedreno=enabled" || PKG_MESON_OPTS_TARGET+=" -Dfreedreno=disabled" diff --git a/packages/graphics/mesa/package.mk b/packages/graphics/mesa/package.mk index 2b1a7b09e6..5c300599c6 100644 --- a/packages/graphics/mesa/package.mk +++ b/packages/graphics/mesa/package.mk @@ -10,11 +10,17 @@ PKG_TOOLCHAIN="meson" PKG_PATCH_DIRS+=" ${DEVICE}" case ${DEVICE} in - RK3588*) - PKG_VERSION="120202c675749c5ef81ae4c8cdc30019b4de08f4" - PKG_SITE="https://gitlab.com/panfork/mesa" - PKG_URL="${PKG_SITE}.git" - PKG_GIT_CLONE_BRANCH="csf" + RK3588) + PKG_VERSION="120202c675749c5ef81ae4c8cdc30019b4de08f4" + PKG_SITE="https://gitlab.com/panfork/mesa" + PKG_URL="${PKG_SITE}.git" + PKG_GIT_CLONE_BRANCH="csf" + ;; + RK33*|RK3566) #Using upstream dev for panfrost + PKG_VERSION="7adc7678a88edccfbd20af2307e7f50e9ed48e47" + PKG_SITE="https://gitlab.freedesktop.org/mesa/mesa" + PKG_URL="${PKG_SITE}.git" + PKG_PATCH_DIRS+=" panfrost" ;; *) PKG_VERSION="24.0.0" @@ -30,6 +36,7 @@ PKG_MESON_OPTS_TARGET="-Dgallium-drivers=${GALLIUM_DRIVERS// /,} \ -Dgallium-omx=disabled \ -Dgallium-nine=false \ -Dgallium-opencl=disabled \ + -Dgallium-xa=disabled \ -Dshader-cache=enabled \ -Dshared-glapi=enabled \ -Dopengl=true \ @@ -85,12 +92,6 @@ else PKG_MESON_OPTS_TARGET+=" -Dgallium-va=disabled" fi -if listcontains "${GRAPHIC_DRIVERS}" "vmware"; then - PKG_MESON_OPTS_TARGET+=" -Dgallium-xa=enabled" -else - PKG_MESON_OPTS_TARGET+=" -Dgallium-xa=disabled" -fi - if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_MESON_OPTS_TARGET+=" -Dgles1=enabled -Dgles2=enabled" else diff --git a/packages/graphics/qt6/qt6base/package.mk b/packages/graphics/qt6/qt6base/package.mk index 95059d3497..7e5b3e1990 100644 --- a/packages/graphics/qt6/qt6base/package.mk +++ b/packages/graphics/qt6/qt6base/package.mk @@ -34,7 +34,7 @@ PKG_CMAKE_OPTS_HOST+=" pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" -GNinja \ - -DQT_HOST_PATH=${PKG_BUILD}/.x86_64-linux-gnu \ + -DQT_HOST_PATH=${PKG_BUILD}/.x86_64-jelos-linux-gnu \ -DFEATURE_gui=ON \ -DFEATURE_concurrent=OFF \ -DFEATURE_xml=OFF \ diff --git a/packages/graphics/qt6/qt6tools/package.mk b/packages/graphics/qt6/qt6tools/package.mk index 7474accab0..34b52fccc5 100644 --- a/packages/graphics/qt6/qt6tools/package.mk +++ b/packages/graphics/qt6/qt6tools/package.mk @@ -23,7 +23,7 @@ pre_configure_host() { pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" -GNinja \ - -DQT_HOST_PATH=${PKG_BUILD}/.x86_64-linux-gnu \ + -DQT_HOST_PATH=${PKG_BUILD}/.x86_64-jelos-linux-gnu \ -DQT_FEATURE_linguist=ON \ -DQT_FEATURE_qdbus=ON \ -DQT_DEBUG_FIND_PACKAGE=ON diff --git a/packages/graphics/qt6/qt6wayland/package.mk b/packages/graphics/qt6/qt6wayland/package.mk index fc2178e90b..84a7f9ae7d 100644 --- a/packages/graphics/qt6/qt6wayland/package.mk +++ b/packages/graphics/qt6/qt6wayland/package.mk @@ -21,7 +21,7 @@ pre_configure_host() { pre_configure_target() { PKG_CMAKE_OPTS_TARGET+=" -GNinja \ - -DQT_HOST_PATH=${PKG_BUILD}/.x86_64-linux-gnu \ + -DQT_HOST_PATH=${PKG_BUILD}/.x86_64-jelos-linux-gnu \ -DQT_DEBUG_FIND_PACKAGE=ON \ -DBUILD_WITH_PCH=OFF \ -DQT_BUILD_EXAMPLES=OFF \ diff --git a/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/post/001-fan b/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/post/001-fan new file mode 100644 index 0000000000..84c1f62856 --- /dev/null +++ b/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/post/001-fan @@ -0,0 +1,7 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) + +. /etc/profile + +systemctl restart fancontrol diff --git a/packages/hardware/quirks/platforms/RK3566/sleep.d/post/002-freq b/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/post/002-freq similarity index 67% rename from packages/hardware/quirks/platforms/RK3566/sleep.d/post/002-freq rename to packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/post/002-freq index d5c06cc41f..b8527a4172 100644 --- a/packages/hardware/quirks/platforms/RK3566/sleep.d/post/002-freq +++ b/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/post/002-freq @@ -12,12 +12,11 @@ if [ ! -n "${OLD_CPU_FREQ}" ]; then OLD_CPU_FREQ="schedutil" fi -OLD_GPU_FREQ=$(get_setting "sleep.gpugovernor") -if [ ! -n "${OLD_GPU_FREQ}" ]; then - OLD_GPU_FREQ="simple_ondemand" -fi +OLD_GPU_LEVEL=$(get_setting "sleep.gpulevel") +if [ ! -n "${OLD_GPU_LEVEL}" ]; then + OLD_GPU_LEVEL="balanced" +fi # Restore old governors. set_cpu_gov "${OLD_CPU_FREQ}" -set_dmc_gov "${OLD_CPU_FREQ}" -set_gpu_gov "${OLD_GPU_FREQ}" +gpu_performance_level "${OLD_GPU_LEVEL}" diff --git a/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/pre/001-fan b/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/pre/001-fan new file mode 100644 index 0000000000..df3ee2647b --- /dev/null +++ b/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/pre/001-fan @@ -0,0 +1,8 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) + +. /etc/profile + +echo 1 >${DEVICE_PWM_FAN} +echo 0 >${DEVICE_FAN_INPUT} diff --git a/packages/hardware/quirks/platforms/RK3566/sleep.d/pre/002-freq b/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/pre/002-freq similarity index 76% rename from packages/hardware/quirks/platforms/RK3566/sleep.d/pre/002-freq rename to packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/pre/002-freq index 4fbe8c64f0..44f3f67bd0 100644 --- a/packages/hardware/quirks/platforms/RK3566/sleep.d/pre/002-freq +++ b/packages/hardware/quirks/devices/AYANEO AYANEO 2S/sleep.d/pre/002-freq @@ -8,12 +8,10 @@ ### Get the current cpu and gpu governor, save for when the device wakes from sleep. CUR_CPU_FREQ="$(cat ${CPU_FREQ}/scaling_governor)" -CUR_GPU_FREQ="$(cat ${GPU_FREQ}/governor)" - +CUR_GPU_LEVEL="$(get_gpu_performance_level)" set_setting sleep.cpugovernor "${CUR_CPU_FREQ}" -set_setting sleep.gpugovernor "${CUR_GPU_FREQ}" +set_setting sleep.gpulevel "${CUR_GPU_LEVEL}" ### Set all governors to powersave set_cpu_gov powersave -set_dmc_gov powersave -set_gpu_gov powersave +gpu_performance_level low diff --git a/packages/hardware/quirks/devices/Anbernic RG353P/010-governors b/packages/hardware/quirks/devices/Anbernic RG353P/010-governors deleted file mode 100755 index e1a4622419..0000000000 --- a/packages/hardware/quirks/devices/Anbernic RG353P/010-governors +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -cat </storage/.config/profile.d/010-governors -CPU_FREQ=("/sys/devices/system/cpu/cpufreq/policy0") -GPU_FREQ="/sys/devices/platform/fde60000.gpu/devfreq/fde60000.gpu" -DMC_FREQ="/sys/devices/platform/dmc/devfreq/dmc" -EOF diff --git a/packages/hardware/quirks/devices/Anbernic RG353P/030-suspend_mode b/packages/hardware/quirks/devices/Anbernic RG353P/030-suspend_mode deleted file mode 100755 index 523d9736bb..0000000000 --- a/packages/hardware/quirks/devices/Anbernic RG353P/030-suspend_mode +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile.d/001-functions - -MYSLEEPMODE=$(get_setting system.suspendmode) -if [ -z "${MYSLEEPMODE}" ] -then - /usr/bin/suspendmode mem -fi - -echo s2idle >/sys/power/mem_sleep - diff --git a/packages/hardware/quirks/devices/Anbernic RG353P/050-game_configs b/packages/hardware/quirks/devices/Anbernic RG353P/050-game_configs deleted file mode 100755 index 50b56be0c0..0000000000 --- a/packages/hardware/quirks/devices/Anbernic RG353P/050-game_configs +++ /dev/null @@ -1,14 +0,0 @@ - -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile - -#Set up gzdoom -if [ ! -d "/storage/.config/gzdoom/" ]; then - cp -rf /usr/config/gzdoom /storage/.config/ - sed -i '/Joy10=/c\Joy10=togglemap; - /Joy9=/c\Joy9=menu_main; - /vid_defheight=/c\vid_defheight=480; - /vid_defwidth=/c\vid_defwidth=640' /storage/.config/gzdoom/gzdoom.ini -fi diff --git a/packages/hardware/quirks/devices/Anbernic RG353P/info.d/001-panel b/packages/hardware/quirks/devices/Anbernic RG353P/info.d/001-panel index 16eacd8a5b..da49dae9de 100755 --- a/packages/hardware/quirks/devices/Anbernic RG353P/info.d/001-panel +++ b/packages/hardware/quirks/devices/Anbernic RG353P/info.d/001-panel @@ -1,11 +1,11 @@ #!/bin/sh -ID=$(dmesg | grep "panel id:" | sed "s#^.*panel id: ##g") +ID=$(dmesg | grep "panel") case ${ID} in - "30 52") - ID="v1 (${ID})" + *newvision*) + ID="v1" ;; - "38 21") - ID="v2 (${ID})" + *sitronix*) + ID="v2" ;; *) ID="Unknown" @@ -15,4 +15,4 @@ esac if [ -n "${ID}" ] then echo "PANEL VERSION: ${ID}" -fi +fi diff --git a/packages/hardware/quirks/devices/Anbernic RG353V/030-suspend_mode b/packages/hardware/quirks/devices/Anbernic RG353V/030-suspend_mode deleted file mode 100755 index 523d9736bb..0000000000 --- a/packages/hardware/quirks/devices/Anbernic RG353V/030-suspend_mode +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile.d/001-functions - -MYSLEEPMODE=$(get_setting system.suspendmode) -if [ -z "${MYSLEEPMODE}" ] -then - /usr/bin/suspendmode mem -fi - -echo s2idle >/sys/power/mem_sleep - diff --git a/packages/hardware/quirks/devices/Anbernic RG353V/info.d/001-panel b/packages/hardware/quirks/devices/Anbernic RG353V/info.d/001-panel index e4cf3cb554..da49dae9de 100755 --- a/packages/hardware/quirks/devices/Anbernic RG353V/info.d/001-panel +++ b/packages/hardware/quirks/devices/Anbernic RG353V/info.d/001-panel @@ -1,10 +1,10 @@ #!/bin/sh -ID=$(dmesg | grep "panel id:" | sed "s#^.*panel id: ##g") +ID=$(dmesg | grep "panel") case ${ID} in - "30 52") + *newvision*) ID="v1" ;; - "38 21") + *sitronix*) ID="v2" ;; *) @@ -15,4 +15,4 @@ esac if [ -n "${ID}" ] then echo "PANEL VERSION: ${ID}" -fi +fi diff --git a/packages/hardware/quirks/devices/Anbernic RG353VS b/packages/hardware/quirks/devices/Anbernic RG353VS new file mode 120000 index 0000000000..13b73acc27 --- /dev/null +++ b/packages/hardware/quirks/devices/Anbernic RG353VS @@ -0,0 +1 @@ +Anbernic RG353V \ No newline at end of file diff --git a/packages/hardware/quirks/devices/Anbernic RG503/010-governors b/packages/hardware/quirks/devices/Anbernic RG503/010-governors deleted file mode 100755 index e1a4622419..0000000000 --- a/packages/hardware/quirks/devices/Anbernic RG503/010-governors +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -cat </storage/.config/profile.d/010-governors -CPU_FREQ=("/sys/devices/system/cpu/cpufreq/policy0") -GPU_FREQ="/sys/devices/platform/fde60000.gpu/devfreq/fde60000.gpu" -DMC_FREQ="/sys/devices/platform/dmc/devfreq/dmc" -EOF diff --git a/packages/hardware/quirks/devices/Anbernic RG503/030-suspend_mode b/packages/hardware/quirks/devices/Anbernic RG503/030-suspend_mode deleted file mode 100755 index a7a9cbb02e..0000000000 --- a/packages/hardware/quirks/devices/Anbernic RG503/030-suspend_mode +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile.d/001-functions - -MYSLEEPMODE=$(get_setting system.suspendmode) -if [ -z "${MYSLEEPMODE}" ] -then - /usr/bin/suspendmode mem -fi - -echo s2idle >/sys/power/mem_sleep - diff --git a/packages/hardware/quirks/devices/Game Console R33S/001-device_config b/packages/hardware/quirks/devices/Game Console R33S/001-device_config index e326155a6a..4c9d00e3be 100644 --- a/packages/hardware/quirks/devices/Game Console R33S/001-device_config +++ b/packages/hardware/quirks/devices/Game Console R33S/001-device_config @@ -11,4 +11,5 @@ DEVICE_PLAYBACK_PATH_HP="SPK" DEVICE_BRIGHTNESS="128" DEVICE_PWR_LED_GPIO="77" DEVICE_TEMP_SENSOR="/sys/devices/virtual/thermal/thermal_zone0/temp" +DEVICE_DTB_SWITCH="true" EOF diff --git a/packages/hardware/quirks/devices/Game Console R36S/001-device_config b/packages/hardware/quirks/devices/Game Console R36S/001-device_config new file mode 100644 index 0000000000..4c9d00e3be --- /dev/null +++ b/packages/hardware/quirks/devices/Game Console R36S/001-device_config @@ -0,0 +1,15 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) + +cat </storage/.config/profile.d/001-device_config +# Device Features +DEVICE_VOLUMECTL="true" +DEVICE_POWER_LED="false" +DEVICE_PLAYBACK_PATH_SPK="HP" +DEVICE_PLAYBACK_PATH_HP="SPK" +DEVICE_BRIGHTNESS="128" +DEVICE_PWR_LED_GPIO="77" +DEVICE_TEMP_SENSOR="/sys/devices/virtual/thermal/thermal_zone0/temp" +DEVICE_DTB_SWITCH="true" +EOF diff --git a/packages/hardware/quirks/devices/Game Console R36S/002-disable-led b/packages/hardware/quirks/devices/Game Console R36S/002-disable-led new file mode 100644 index 0000000000..d917e34827 --- /dev/null +++ b/packages/hardware/quirks/devices/Game Console R36S/002-disable-led @@ -0,0 +1,15 @@ +#!/bin/bash + +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) + +. /etc/profile + +# Set export GPIO for Power LED +if [ ! -d "/sys/class/gpio/gpio${DEVICE_PWR_LED_GPIO}" ]; then + echo ${DEVICE_PWR_LED_GPIO} > /sys/class/gpio/export +fi + +#Disable blue led on R33S +echo out >/sys/class/gpio/gpio${DEVICE_PWR_LED_GPIO}/direction +echo 1 >/sys/class/gpio/gpio${DEVICE_PWR_LED_GPIO}/value diff --git a/packages/hardware/quirks/devices/Game Console R36S/050-game-configs b/packages/hardware/quirks/devices/Game Console R36S/050-game-configs new file mode 100644 index 0000000000..cd90a67759 --- /dev/null +++ b/packages/hardware/quirks/devices/Game Console R36S/050-game-configs @@ -0,0 +1,59 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) + +. /etc/profile + +#Set mupen64-plus-sa config for R36S, can use same profile as OGS +if [ ! -d "/storage/.config/mupen64plus" ]; then + mkdir -p "/storage/.config/mupen64plus/" + cp -r /usr/local/share/mupen64plus/mupen64plus.cfg* /storage/.config/mupen64plus/ +fi +if [ -f "/storage/.config/mupen64plus/mupen64plus.cfg.ogs" ]; then + rm /storage/.config/mupen64plus/mupen64plus.cfg + mv /storage/.config/mupen64plus/mupen64plus.cfg.ogs /storage/.config/mupen64plus/mupen64plus.cfg +fi + +#Set drastic-sa config for R36S (think it can use the same as RG20S) +if [ ! -d "/storage/.config/drastic" ]; then + mkdir -p "/storage/.config/drastic" + cp -r "/usr/config/drastic" "/storage/.config/" +fi +if [ -f "/storage/.config/drastic/config/drastic.cfg.rgb20s" ]; then + rm /storage/.config/drastic/config/drastic.cfg + mv /storage/.config/drastic/config/drastic.cfg.rgb20s /storage/.config/drastic/config/drastic.cfg +fi + +#Map ppsspp controls +if grep R36S -q "/storage/.config/ppsspp/PSP/SYSTEM/controls.ini" +then + exit 1 +else +cat </storage/.config/ppsspp/PSP/SYSTEM/controls.ini +#R36S +[ControlMapping] +Up = 10-19 +Down = 10-20 +Left = 10-21 +Right = 10-22 +Circle = 10-189 +Cross = 10-190 +Square = 10-188 +Triangle = 10-191 +Start = 10-197 +Select = 10-196 +L = 10-193 +R = 10-192 +An.Up = 10-4003 +An.Down = 10-4002 +An.Left = 10-4001 +An.Right = 10-4000 +Pause = 10-106 +Save State = 10-4010 +Load State = 10-4008 +RightAn.Up = 10-4007 +RightAn.Down = 10-4006 +RightAn.Left = 10-4005 +RightAn.Right = 10-4004 +EOF +fi diff --git a/packages/hardware/quirks/devices/Powkiddy RGB10 Max 3/010-governors b/packages/hardware/quirks/devices/Powkiddy RGB10 Max 3/010-governors deleted file mode 100755 index e1a4622419..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RGB10 Max 3/010-governors +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -cat </storage/.config/profile.d/010-governors -CPU_FREQ=("/sys/devices/system/cpu/cpufreq/policy0") -GPU_FREQ="/sys/devices/platform/fde60000.gpu/devfreq/fde60000.gpu" -DMC_FREQ="/sys/devices/platform/dmc/devfreq/dmc" -EOF diff --git a/packages/hardware/quirks/devices/Powkiddy RGB10 Max 3/030-suspend_mode b/packages/hardware/quirks/devices/Powkiddy RGB10 Max 3/030-suspend_mode deleted file mode 100755 index 523d9736bb..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RGB10 Max 3/030-suspend_mode +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile.d/001-functions - -MYSLEEPMODE=$(get_setting system.suspendmode) -if [ -z "${MYSLEEPMODE}" ] -then - /usr/bin/suspendmode mem -fi - -echo s2idle >/sys/power/mem_sleep - diff --git a/packages/hardware/quirks/devices/Powkiddy RGB10 Max 3/050-game_configs b/packages/hardware/quirks/devices/Powkiddy RGB10 Max 3/050-game_configs deleted file mode 100755 index 8fc2c5134d..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RGB10 Max 3/050-game_configs +++ /dev/null @@ -1,17 +0,0 @@ - -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile - -#Set up gzdoom -if [ ! -d "/storage/.config/gzdoom/" ]; then - cp -rf /usr/config/gzdoom /storage/.config/ - sed -i '/Joy10=/c\Joy10=togglemap; - /Joy9=/c\Joy9=menu_main; - /vid_defheight=/c\vid_defheight=480; - /vid_defwidth=/c\vid_defwidth=640' /storage/.config/gzdoom/gzdoom.ini -fi - -#Set Duckstastion SA to rotate -sed -i '/^Rotate =/c\Rotate = 1' /storage/.config/duckstation/settings.ini diff --git a/packages/hardware/quirks/devices/Powkiddy RGB30/010-governors b/packages/hardware/quirks/devices/Powkiddy RGB30/010-governors deleted file mode 100755 index e1a4622419..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RGB30/010-governors +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -cat </storage/.config/profile.d/010-governors -CPU_FREQ=("/sys/devices/system/cpu/cpufreq/policy0") -GPU_FREQ="/sys/devices/platform/fde60000.gpu/devfreq/fde60000.gpu" -DMC_FREQ="/sys/devices/platform/dmc/devfreq/dmc" -EOF diff --git a/packages/hardware/quirks/devices/Powkiddy RGB30/050-audio_path b/packages/hardware/quirks/devices/Powkiddy RGB30/050-audio_path deleted file mode 100755 index f5860cdb57..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RGB30/050-audio_path +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -cat </storage/.config/profile.d/002-audio_path -DEVICE_PLAYBACK_PATH_SPK="HP" -DEVICE_PLAYBACK_PATH_HP="SPK" -DEVICE_PLAYBACK_PATH="Playback Path" -EOF diff --git a/packages/hardware/quirks/devices/Powkiddy RGB30/050-game_configs b/packages/hardware/quirks/devices/Powkiddy RGB30/050-game_configs deleted file mode 100755 index 50b56be0c0..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RGB30/050-game_configs +++ /dev/null @@ -1,14 +0,0 @@ - -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile - -#Set up gzdoom -if [ ! -d "/storage/.config/gzdoom/" ]; then - cp -rf /usr/config/gzdoom /storage/.config/ - sed -i '/Joy10=/c\Joy10=togglemap; - /Joy9=/c\Joy9=menu_main; - /vid_defheight=/c\vid_defheight=480; - /vid_defwidth=/c\vid_defwidth=640' /storage/.config/gzdoom/gzdoom.ini -fi diff --git a/packages/hardware/quirks/devices/Powkiddy RK2023/010-governors b/packages/hardware/quirks/devices/Powkiddy RK2023/010-governors deleted file mode 100755 index e1a4622419..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RK2023/010-governors +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -cat </storage/.config/profile.d/010-governors -CPU_FREQ=("/sys/devices/system/cpu/cpufreq/policy0") -GPU_FREQ="/sys/devices/platform/fde60000.gpu/devfreq/fde60000.gpu" -DMC_FREQ="/sys/devices/platform/dmc/devfreq/dmc" -EOF diff --git a/packages/hardware/quirks/devices/Powkiddy RK2023/030-suspend_mode b/packages/hardware/quirks/devices/Powkiddy RK2023/030-suspend_mode deleted file mode 100755 index 523d9736bb..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RK2023/030-suspend_mode +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile.d/001-functions - -MYSLEEPMODE=$(get_setting system.suspendmode) -if [ -z "${MYSLEEPMODE}" ] -then - /usr/bin/suspendmode mem -fi - -echo s2idle >/sys/power/mem_sleep - diff --git a/packages/hardware/quirks/devices/Powkiddy RK2023/050-audio_path b/packages/hardware/quirks/devices/Powkiddy RK2023/050-audio_path deleted file mode 100755 index f5860cdb57..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RK2023/050-audio_path +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -cat </storage/.config/profile.d/002-audio_path -DEVICE_PLAYBACK_PATH_SPK="HP" -DEVICE_PLAYBACK_PATH_HP="SPK" -DEVICE_PLAYBACK_PATH="Playback Path" -EOF diff --git a/packages/hardware/quirks/devices/Powkiddy RK2023/050-game_configs b/packages/hardware/quirks/devices/Powkiddy RK2023/050-game_configs deleted file mode 100755 index 50b56be0c0..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy RK2023/050-game_configs +++ /dev/null @@ -1,14 +0,0 @@ - -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile - -#Set up gzdoom -if [ ! -d "/storage/.config/gzdoom/" ]; then - cp -rf /usr/config/gzdoom /storage/.config/ - sed -i '/Joy10=/c\Joy10=togglemap; - /Joy9=/c\Joy9=menu_main; - /vid_defheight=/c\vid_defheight=480; - /vid_defwidth=/c\vid_defwidth=640' /storage/.config/gzdoom/gzdoom.ini -fi diff --git a/packages/hardware/quirks/devices/Powkiddy x55/050-game_configs b/packages/hardware/quirks/devices/Powkiddy x55/050-game_configs deleted file mode 100755 index 50b56be0c0..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy x55/050-game_configs +++ /dev/null @@ -1,14 +0,0 @@ - -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS) - -. /etc/profile - -#Set up gzdoom -if [ ! -d "/storage/.config/gzdoom/" ]; then - cp -rf /usr/config/gzdoom /storage/.config/ - sed -i '/Joy10=/c\Joy10=togglemap; - /Joy9=/c\Joy9=menu_main; - /vid_defheight=/c\vid_defheight=480; - /vid_defwidth=/c\vid_defwidth=640' /storage/.config/gzdoom/gzdoom.ini -fi diff --git a/packages/hardware/quirks/devices/Powkiddy x55/sleep.d/post/001-audio b/packages/hardware/quirks/devices/Powkiddy x55/sleep.d/post/001-audio deleted file mode 100644 index bc699e4522..0000000000 --- a/packages/hardware/quirks/devices/Powkiddy x55/sleep.d/post/001-audio +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) - -# Workaround for no audio on wake from sleep. - -. /etc/profile - -DEVICE_HEADPHONE_DEV="/sys/devices/platform/rk-headset/extcon/extcon3/state" -HEADPHONE_STATE=$(awk 'BEGIN {FS="="} /HEADPHONE/ {print $2}' ${DEVICE_HEADPHONE_DEV}) - -amixer -c 0 set "MUTE" "MUTE" - -amixer -c 0 set "Capture MIC Path" "Main Mic" -amixer -c 0 set "Capture MIC Path" "MIC OFF" - -case ${HEADPHONE_STATE} in - 1) - amixer -c 0 set "Playback Path" "${DEVICE_PLAYBACK_PATH_SPK}" - amixer -c 0 set "Playback Path" "${DEVICE_PLAYBACK_PATH_HP}" - ;; - 0) - amixer -c 0 set "Playback Path" "${DEVICE_PLAYBACK_PATH_HP}" - amixer -c 0 set "Playback Path" "${DEVICE_PLAYBACK_PATH_SPK}" - ;; -esac - -amixer -c 0 set "MUTE" "UNMUTE" diff --git a/packages/hardware/quirks/platforms/RK3399/060-game_settings b/packages/hardware/quirks/platforms/RK3399/060-game_settings index fa5cd7d07b..f718e077d4 100755 --- a/packages/hardware/quirks/platforms/RK3399/060-game_settings +++ b/packages/hardware/quirks/platforms/RK3399/060-game_settings @@ -5,7 +5,7 @@ . /etc/profile.d/001-functions ### Set the default performance scaling mode for a few systems. -for SYSTEM in dreamcast n64 ports psp psx saturn pcfx cdi +for SYSTEM in dreamcast n64 ports psp psx saturn pcfx cdi ps2 gamecube do CPU_SETTING=$(get_setting ${SYSTEM}.cpugovernor) if [ -z "${CPU_SETTING}" ] diff --git a/packages/hardware/quirks/platforms/RK3566/001-device_config b/packages/hardware/quirks/platforms/RK3566/001-device_config index 1647feaab3..b146a74af3 100755 --- a/packages/hardware/quirks/platforms/RK3566/001-device_config +++ b/packages/hardware/quirks/platforms/RK3566/001-device_config @@ -1,6 +1,6 @@ #!/bin/bash -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) +# SPDX-License-Identifier: Apache-2.0 +# Copyright (C) 2021-present Fewtarius (https://github.com/fewtarius) cat </storage/.config/profile.d/001-device_config DEVICE_FAKE_JACKSENSE="false" diff --git a/packages/hardware/quirks/devices/Anbernic RG353V/010-governors b/packages/hardware/quirks/platforms/RK3566/010-governors similarity index 67% rename from packages/hardware/quirks/devices/Anbernic RG353V/010-governors rename to packages/hardware/quirks/platforms/RK3566/010-governors index 437984c283..64a383e66b 100755 --- a/packages/hardware/quirks/devices/Anbernic RG353V/010-governors +++ b/packages/hardware/quirks/platforms/RK3566/010-governors @@ -5,6 +5,5 @@ cat </storage/.config/profile.d/010-governors # FREQ governors CPU_FREQ=("/sys/devices/system/cpu/cpufreq/policy0") -GPU_FREQ="/sys/devices/platform/ff400000.gpu/devfreq/ff400000.gpu" -DMC_FREQ="/sys/devices/platform/dmc/devfreq/dmc" +GPU_FREQ="$(find /sys/devices/platform/*gpu/devfreq -name '*.gpu')" EOF diff --git a/packages/hardware/quirks/devices/Powkiddy RGB30/030-suspend_mode b/packages/hardware/quirks/platforms/RK3566/030-suspend_mode similarity index 87% rename from packages/hardware/quirks/devices/Powkiddy RGB30/030-suspend_mode rename to packages/hardware/quirks/platforms/RK3566/030-suspend_mode index 523d9736bb..a5b3d79e5d 100755 --- a/packages/hardware/quirks/devices/Powkiddy RGB30/030-suspend_mode +++ b/packages/hardware/quirks/platforms/RK3566/030-suspend_mode @@ -10,5 +10,3 @@ then /usr/bin/suspendmode mem fi -echo s2idle >/sys/power/mem_sleep - diff --git a/packages/hardware/quirks/platforms/RK3566/050-audio_path b/packages/hardware/quirks/platforms/RK3566/050-audio_path index 5feee6024f..f12a3983e0 100755 --- a/packages/hardware/quirks/platforms/RK3566/050-audio_path +++ b/packages/hardware/quirks/platforms/RK3566/050-audio_path @@ -1,9 +1,9 @@ #!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) +# SPDX-License-Identifier: Apache-2.0 +# Copyright (C) 2021-present Fewtarius (https://github.com/fewtarius) cat </storage/.config/profile.d/002-audio_path DEVICE_PLAYBACK_PATH_SPK="SPK" DEVICE_PLAYBACK_PATH_HP="HP" -DEVICE_PLAYBACK_PATH="Playback Path" +DEVICE_PLAYBACK_PATH="Playback Mux" EOF diff --git a/packages/hardware/quirks/platforms/RK3566/050-modifiers b/packages/hardware/quirks/platforms/RK3566/050-modifiers index e135998332..0796f20fb4 100755 --- a/packages/hardware/quirks/platforms/RK3566/050-modifiers +++ b/packages/hardware/quirks/platforms/RK3566/050-modifiers @@ -1,10 +1,10 @@ #!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) +# SPDX-License-Identifier: Apache-2.0 +# Copyright (C) 2022-present Fewtarius cat </storage/.config/profile.d/050-modifiers DEVICE_KEY_VOLUMEDOWN=114 DEVICE_KEY_VOLUMEUP=115 DEVICE_FUNC_KEYA_MODIFIER="BTN_SELECT" -DEVICE_FUNC_KEYB_MODIFIER="BTN_MODE" +DEVICE_FUNC_KEYB_MODIFIER="BTN_START" EOF diff --git a/packages/hardware/quirks/platforms/RK3566/050-volume b/packages/hardware/quirks/platforms/RK3566/050-volume new file mode 100755 index 0000000000..df8bd341e4 --- /dev/null +++ b/packages/hardware/quirks/platforms/RK3566/050-volume @@ -0,0 +1,8 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) + +. /storage/.config/profile.d/001-device_config + +# RK3566 devices have a master volume attached to card 0 that needs to be set to 100% on startup. +amixer -c 1 set "Master" "100%" diff --git a/packages/hardware/quirks/platforms/RK3566/060-game_settings b/packages/hardware/quirks/platforms/RK3566/060-game_settings index e4193f877d..3e5395a1d9 100755 --- a/packages/hardware/quirks/platforms/RK3566/060-game_settings +++ b/packages/hardware/quirks/platforms/RK3566/060-game_settings @@ -1,6 +1,6 @@ #!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) +# SPDX-License-Identifier: Apache-2.0 +# Copyright (C) 2023-present Fewtarius (https://github.com/fewtarius) . /etc/profile.d/001-functions . /storage/.config/profile.d/010-governors diff --git a/packages/hardware/quirks/platforms/RK3566/090-ui_service b/packages/hardware/quirks/platforms/RK3566/090-ui_service index accf1e59db..eeafb89b2b 100755 --- a/packages/hardware/quirks/platforms/RK3566/090-ui_service +++ b/packages/hardware/quirks/platforms/RK3566/090-ui_service @@ -1,8 +1,8 @@ #!/bin/sh -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) +# SPDX-License-Identifier: Apache-2.0 +# Copyright (C) 2022-present Fewtarius ### Set the default device configuration cat </storage/.config/profile.d/090-ui_service -UI_SERVICE="emustation.service" +UI_SERVICE="weston.service" EOF diff --git a/packages/hardware/quirks/platforms/RK3588/060-game_settings b/packages/hardware/quirks/platforms/RK3588/060-game_settings new file mode 100644 index 0000000000..4d0f5b34ac --- /dev/null +++ b/packages/hardware/quirks/platforms/RK3588/060-game_settings @@ -0,0 +1,35 @@ + +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) + +. /etc/profile.d/001-functions + +### Set the default performance scaling mode for a few systems. +for SYSTEM in dreamcast n64 ports psp saturn ps2 gamecube +do + CPU_SETTING=$(get_setting ${SYSTEM}.cpugovernor) + if [ -z "${CPU_SETTING}" ] + then + set_setting ${SYSTEM}.cpugovernor performance + fi + GPU_SETTING=$(get_setting ${SYSTEM}.gpuperf) + if [ -z "${GPU_SETTING}" ] + then + set_setting ${SYSTEM}.gpuperf profile_peak + fi +done + +for SYSTEM in gb gbc gba snes nes sms gamegear genesis mastersystem sega32x megadrive segacd megacd +do + CPU_SETTING=$(get_setting ${SYSTEM}.cpugovernor) + if [ -z ${CPU_SETTING} ] + then + set_setting ${SYSTEM}.cpugovernor powersave + fi + GPU_SETTING=$(get_setting ${SYSTEM}.gpuperf) + if [ -z ${GPU_SETTING} ] + then + set_setting ${SYSTEM}.gpuperf low + fi +done diff --git a/packages/hardware/quirks/profile.d/999-export b/packages/hardware/quirks/profile.d/999-export index 816e5bafea..326dd49ee9 100755 --- a/packages/hardware/quirks/profile.d/999-export +++ b/packages/hardware/quirks/profile.d/999-export @@ -14,6 +14,7 @@ export SLOW_CORES \ DEVICE_BASE_TDP \ DEVICE_BRIGHTNESS \ DEVICE_BATTERY_LED_STATUS \ + DEVICE_DTB_SWITCH \ DEVICE_FAKE_JACKSENSE \ DEVICE_FUNC_KEYA_MODIFIER \ DEVICE_FUNC_KEYB_MODIFIER \ diff --git a/packages/jelos/autostart/001-wifi b/packages/jelos/autostart/001-wifi new file mode 100755 index 0000000000..a61b8c0bca --- /dev/null +++ b/packages/jelos/autostart/001-wifi @@ -0,0 +1,2 @@ +echo "mmc3:0001:1" > /sys/bus/sdio/drivers/rtw_8821cs/unbind +echo "mmc3:0001:1" > /sys/bus/sdio/drivers/rtw_8821cs/bind \ No newline at end of file diff --git a/packages/jelos/sources/post-update b/packages/jelos/sources/post-update index be8bfa8ece..d4933eab70 100644 --- a/packages/jelos/sources/post-update +++ b/packages/jelos/sources/post-update @@ -69,77 +69,12 @@ ln -sf /usr/share/locale /storage/.config/emulationstation/locale >>/var/log/con ### Add items below this line that are safe to remove after a period of time. ################################################################################ -### 20231114 - Update hosts.conf -grep "127.0.0.1" /storage/.config/hosts.conf >/dev/null 2>&1 || cp /usr/config/hosts.conf /storage/.config/ - -### 20231127 - Migrate games to overlayfs (updated 20231203) -NULL=$(cat /proc/mounts | grep -v -e "/storage/roms" 2>/dev/null | grep ${1}) -if [ ! "$?" = 0 ] -then - umount /storage/roms -fi -GAMECOUNT=$(find /storage/roms -type f | wc -l) -if [ "${GAMECOUNT}" -gt 20 ] && \ - [ ! -e "/storage/.migrated_games" ] -then - echo "Migrating games to overlayfs" >>${LOG} - tocon "Migrate games to new storage model..." - if [ -d "/storage/games-internal" ] - then - echo "Backing up games-internal" >>${LOG} - mv /storage/games-internal /storage/games-internal.backup - fi - mv /storage/roms /storage/games-internal - mkdir /storage/roms - touch /storage/.migrated_games -else - echo "Game weight too low (${GAMECOUNT}) or content already migrated." >>${LOG} -fi - -### Migration part 2 -if [ ! -e "/storage/.migrated_games2" ] -then - for GAMES in /storage/games-internal /storage/games-external - do - if [ ! -d "${GAMES}/roms" ] - then - mkdir -p "${GAMES}/roms" 2>/dev/null - fi - tocon "Migrate games to new storage model..." - mv "${GAMES}"/* "${GAMES}/roms/" - done - touch /storage/.migrated_games2 -fi - -### 20231129 - Don't default to performance. -EPP=$(get_setting system.power.epp) -if [ -z "${EPP}" ] || \ - [ "${EPP}" = "performance" ] -then - EPP="balance_performance" - set_setting system.power.epp ${EPP} -fi - -### 20231130 - Replace smb.conf for new overlay mechanism. -cp -f /usr/config/smb.conf /storage/.config - -### 20231202 - Remove stale profile bits if they exist. -for FILE in 001-deviceconfig 99-mixer -do - rm -f /storage/.config/profile.d/${FILE} 2>/dev/null -done - -### 20231203 - Disable merged storage by default. -MERGED_STORAGE=$(get_setting system.merged.storage) -if [ -z "${MERGED_STORAGE}" ] -then - set_setting system.merged.storage 0 -fi - -systemctl restart jelos-automount - ### 20240111 - Add new jslisten hotkey if [ -e "/storage/.config/jslisten_hotkeys" ] then grep BTN_VOLBRIGHT_HOTKEY /storage/.config/jslisten_hotkeys || echo -e "\nBTN_VOLBRIGHT_HOTKEY=999" >>/storage/.config/jslisten_hotkeys fi + +### 20240207 - Update Vita launchers and data. +rsync -ah --update /usr/config/vita3k/* /storage/.config/vita3k 2>/dev/null +rm -f "/storage/.config/vita3k/launcher/Start Vita3K.sh" diff --git a/packages/jelos/sources/scripts/automount b/packages/jelos/sources/scripts/automount index 22767b92ff..77c6ce3291 100755 --- a/packages/jelos/sources/scripts/automount +++ b/packages/jelos/sources/scripts/automount @@ -75,6 +75,26 @@ function start_ms() { fi } +start_overlay() { + if [ -e "/storage/.overlay_unsupported" ] + then + # If we're not using the overlay, bind mount the external storage path + # so we don't need to change any configs. + grep ${MOUNT_PATH} /proc/mounts >/dev/null 2>&1 + if [ ! $? = 0 ] + then + MOUNT_PATH="/storage/games-internal" + fi + log $0 "Executing bind mount of ${MOUNT_PATH} to ${OVERLAY_PATH}" + mount --bind ${MOUNT_PATH} ${OVERLAY_PATH} + exit 0 + else + log $0 "Enabling overlay." + systemctl enable storage-roms.mount >/dev/null 2>&1 + systemctl start storage-roms.mount >/dev/null 2>&1 + fi +} + if [[ ! "${MOUNT_GAMES}" =~ [0-9] ]] then set_setting system.automount 1 diff --git a/packages/jelos/sources/scripts/factoryreset b/packages/jelos/sources/scripts/factoryreset index 0f28cd0a44..3c2e0a2d84 100755 --- a/packages/jelos/sources/scripts/factoryreset +++ b/packages/jelos/sources/scripts/factoryreset @@ -21,6 +21,11 @@ case "${1}" in sync systemctl reboot ;; + "audio") + systemctl stop pipewire-pulse pipewire-pulse.socket pipewire pipewire.socket wireplumber + rm -rf /storage/.local/state /storage/.config/pulse /storage/asound* + systemctl reboot + ;; "ALL") swapoff -a 2>/dev/null umount /storage/roms 2>/dev/null ||: diff --git a/packages/jelos/sources/scripts/usbgadget b/packages/jelos/sources/scripts/usbgadget index 7dd5d22c09..9bd431f576 100755 --- a/packages/jelos/sources/scripts/usbgadget +++ b/packages/jelos/sources/scripts/usbgadget @@ -46,6 +46,7 @@ usb_start() { echo $VENDOR > gadget/strings/0x409/manufacturer echo $MACHINE > gadget/strings/0x409/product + if [ "${USB_MODE}" = mtp ] ; then echo 0x1d6b > gadget/idVendor echo 0x0100 > gadget/idProduct @@ -55,19 +56,20 @@ usb_start() { mount mtp -t functionfs /dev/ffs-umtp /usr/sbin/umtprd & sleep 1 + echo "${UDC_NAME}" > gadget/UDC elif [ "${USB_MODE}" = cdc ] ; then echo cdc > gadget/configs/c.1/strings/0x409/configuration echo 0x1d6b > gadget/idVendor echo 0x104 > gadget/idProduct ln -s gadget/functions/ecm.usb0 gadget/configs/c.1 + echo "${UDC_NAME}" > gadget/UDC ifconfig usb0 $IP up /usr/sbin/udhcpd -S /storage/.cache/usbgadget/udhcpd.conf else exit 0 fi - echo "${UDC_NAME}" > /sys/kernel/config/usb_gadget/gadget/UDC echo "USB_MODE=$(cat gadget/configs/c.1/strings/0x409/configuration)" > /storage/.cache/usbgadget/usbgadget.conf } diff --git a/packages/kernel/linux-drivers/RTL8188EU/package.mk b/packages/kernel/linux-drivers/RTL8188EU/package.mk index ef2ef24869..d3c539f977 100644 --- a/packages/kernel/linux-drivers/RTL8188EU/package.mk +++ b/packages/kernel/linux-drivers/RTL8188EU/package.mk @@ -3,7 +3,7 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8188EU" -PKG_VERSION="306f3e62cf7cddf8cee74f70f88a7a7b3af46f56" +PKG_VERSION="f42fc9c45d2086c415dce70d3018031b54a7beef" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lwfinger/rtl8188eu" PKG_URL="https://github.com/lwfinger/rtl8188eu/archive/${PKG_VERSION}.tar.gz" diff --git a/packages/kernel/linux-drivers/RTL8812AU/package.mk b/packages/kernel/linux-drivers/RTL8812AU/package.mk index 3f248dc559..3ed9d0509c 100644 --- a/packages/kernel/linux-drivers/RTL8812AU/package.mk +++ b/packages/kernel/linux-drivers/RTL8812AU/package.mk @@ -4,7 +4,7 @@ # Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="RTL8812AU" -PKG_VERSION="fe35eddb562bba0d6b3dfaa5991fca0ea22ff915" +PKG_VERSION="2c4567a67b7aac1d6920af7c0928687553059305" PKG_LICENSE="GPL" PKG_SITE="https://github.com/morrownr/8812au-20210629" PKG_URL="${PKG_SITE}.git" diff --git a/packages/kernel/linux-drivers/RTL8821AU/package.mk b/packages/kernel/linux-drivers/RTL8821AU/package.mk index 4da99ae91a..6cdf3dc86d 100644 --- a/packages/kernel/linux-drivers/RTL8821AU/package.mk +++ b/packages/kernel/linux-drivers/RTL8821AU/package.mk @@ -4,7 +4,7 @@ # Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="RTL8821AU" -PKG_VERSION="cf0f873b795806f755d92e0bac063c26b3b31f12" +PKG_VERSION="6cd61cfce48218c26b57db4733aa0d3cbf9a2f2c" PKG_LICENSE="GPL" PKG_SITE="https://github.com/morrownr/8821au-20210708" PKG_URL="${PKG_SITE}.git" diff --git a/packages/kernel/linux-drivers/RTL8821CU/package.mk b/packages/kernel/linux-drivers/RTL8821CU/package.mk index 12c0a1eec5..13f1e5dbd9 100644 --- a/packages/kernel/linux-drivers/RTL8821CU/package.mk +++ b/packages/kernel/linux-drivers/RTL8821CU/package.mk @@ -4,7 +4,7 @@ # Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="RTL8821CU" -PKG_VERSION="eb52ece92607394ecc22e96b41671ec3e5b1fa30" +PKG_VERSION="5b39398e2de146edeb76716420f3288f508bea61" PKG_LICENSE="GPL" PKG_SITE="https://github.com/morrownr/8821cu-20210916" PKG_URL="${PKG_SITE}.git" diff --git a/packages/kernel/linux-drivers/RTL88x2BU/package.mk b/packages/kernel/linux-drivers/RTL88x2BU/package.mk index 65bb57416f..d5f8282f40 100644 --- a/packages/kernel/linux-drivers/RTL88x2BU/package.mk +++ b/packages/kernel/linux-drivers/RTL88x2BU/package.mk @@ -4,7 +4,7 @@ # Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="RTL88x2BU" -PKG_VERSION="cd2b6cbd9c8fbfebee8a1f28fab8e4434450456c" +PKG_VERSION="cb741f8b773b76c4eb1858f489b4b141ff586365" PKG_LICENSE="GPL" PKG_SITE="https://github.com/morrownr/88x2bu-20210702" PKG_URL="${PKG_SITE}.git" diff --git a/packages/kernel/linux-firmware/RTL8723DS-firmware/package.mk b/packages/kernel/linux-firmware/RTL8723DS-firmware/package.mk index 585976a8f9..3b975ef626 100644 --- a/packages/kernel/linux-firmware/RTL8723DS-firmware/package.mk +++ b/packages/kernel/linux-firmware/RTL8723DS-firmware/package.mk @@ -4,7 +4,7 @@ PKG_NAME="RTL8723DS-firmware" PKG_VERSION="" PKG_LICENSE="Apache-2.0" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_LONGDESC="Realtek RTL8723DS Linux firmware" PKG_DEPENDS_TARGET="linux rtk_hciattach" PKG_TOOLCHAIN="manual" diff --git a/packages/kernel/linux-firmware/RTL8821CS-firmware/package.mk b/packages/kernel/linux-firmware/RTL8821CS-firmware/package.mk index 838d310ac0..458f5ea9b9 100644 --- a/packages/kernel/linux-firmware/RTL8821CS-firmware/package.mk +++ b/packages/kernel/linux-firmware/RTL8821CS-firmware/package.mk @@ -4,7 +4,7 @@ PKG_NAME="RTL8821CS-firmware" PKG_VERSION="" PKG_LICENSE="Apache-2.0" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_LONGDESC="Realtek RTL8821CS Linux firmware" PKG_DEPENDS_TARGET="linux rtk_hciattach" PKG_TOOLCHAIN="manual" diff --git a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/package.mk b/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/package.mk deleted file mode 100644 index 4d81eb6294..0000000000 --- a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/package.mk +++ /dev/null @@ -1,27 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) -# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="brcmfmac_sdio-firmware-rpi" -PKG_VERSION="688531da4bcf802a814d9cb0c8b6d62e3b8a3327" -PKG_SHA256="51a33d23127300dffd6ac088f372b83ab862053f5e4dc7130676ebaaa824e626" -PKG_LICENSE="GPL" -PKG_SITE="https://github.com/LibreELEC/LibreELEC.tv" -PKG_URL="https://github.com/LibreELEC/${PKG_NAME}/archive/${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="toolchain kernel-firmware" -PKG_LONGDESC="Firmware for brcm bluetooth chips used on RaspberryPi devices." -PKG_TOOLCHAIN="manual" - -makeinstall_target() { - DESTDIR=${INSTALL}/$(get_kernel_overlay_dir) ./install -} - -post_makeinstall_target() { - # Install rpi btuart script to bring up Bluetooth - mkdir -p ${INSTALL}/usr/bin - cp -P ${PKG_DIR}/scripts/rpi-btuart ${INSTALL}/usr/bin -} - -post_install() { - enable_service brcmfmac_sdio-firmware.service -} diff --git a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/scripts/rpi-btuart b/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/scripts/rpi-btuart deleted file mode 100755 index b9c6cee09d..0000000000 --- a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/scripts/rpi-btuart +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -HCIATTACH=/usr/bin/hciattach -if grep -q "Pi 4" /proc/device-tree/model; then - BDADDR= -else - SERIAL=$(cat /proc/device-tree/serial-number | cut -c9-) - B1=${SERIAL:2:2} - B2=${SERIAL:4:2} - B3=${SERIAL:6:2} - BDADDR=$(printf b8:27:eb:%02x:%02x:%02x $((0x$B1 ^ 0xaa)) $((0x$B2 ^ 0xaa)) $((0x$B3 ^ 0xaa))) -fi - -uart0="$(cat /proc/device-tree/aliases/uart0)" -serial1="$(cat /proc/device-tree/aliases/serial1)" - -if [ "$uart0" = "$serial1" ] ; then - uart0_pins="$(wc -c /proc/device-tree/soc/gpio@7e200000/uart0_pins/brcm\,pins | cut -f 1 -d ' ')" - if [ "$uart0_pins" = "16" ] ; then - $HCIATTACH /dev/serial1 bcm43xx 3000000 flow - $BDADDR - else - $HCIATTACH /dev/serial1 bcm43xx 921600 noflow - $BDADDR - fi -else - $HCIATTACH /dev/serial1 bcm43xx 460800 noflow - $BDADDR -fi diff --git a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/system.d/brcmfmac_sdio-firmware.service b/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/system.d/brcmfmac_sdio-firmware.service deleted file mode 100644 index 97809c744e..0000000000 --- a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/system.d/brcmfmac_sdio-firmware.service +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=Broadcom sdio firmware update for BCM43430A1 -ConditionFileNotEmpty=/proc/device-tree/soc/gpio@7e200000/bt_pins/brcm,pins -Requires=dev-serial1.device -After=dev-serial1.device network.target - -[Service] -Type=simple -RemainAfterExit=yes -ExecStart=/usr/bin/rpi-btuart - -[Install] -WantedBy=network.target diff --git a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/udev.d/90-rpi-add-serial.rules b/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/udev.d/90-rpi-add-serial.rules deleted file mode 100755 index 334bd37d4b..0000000000 --- a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware-rpi/udev.d/90-rpi-add-serial.rules +++ /dev/null @@ -1,21 +0,0 @@ -KERNEL=="ttyAMA[01]", PROGRAM="/bin/sh -c '\ - ALIASES=/proc/device-tree/aliases; \ - if [ $(cat $ALIASES/uart0) = $(cat $ALIASES/serial0) ]; then \ - echo 0;\ - elif [ $(cat $ALIASES/uart0) = $(cat $ALIASES/serial1) ]; then \ - echo 1; \ - else \ - exit 1; \ - fi\ - '", SYMLINK+="serial%c" - -KERNEL=="ttyS0", PROGRAM="/bin/sh -c '\ - ALIASES=/proc/device-tree/aliases; \ - if [ $(cat $ALIASES/uart1) = $(cat $ALIASES/serial0) ]; then \ - echo 0; \ - elif [ $(cat $ALIASES/uart1) = $(cat $ALIASES/serial1) ]; then \ - echo 1; \ - else \ - exit 1; \ - fi \ - '", SYMLINK+="serial%c" diff --git a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware/package.mk b/packages/kernel/linux-firmware/brcmfmac_sdio-firmware/package.mk index 6f3279598b..0b85537615 100644 --- a/packages/kernel/linux-firmware/brcmfmac_sdio-firmware/package.mk +++ b/packages/kernel/linux-firmware/brcmfmac_sdio-firmware/package.mk @@ -6,7 +6,7 @@ PKG_VERSION="c70355f9ec6d015b91a5c3199aa08b433e2f7caf" PKG_LICENSE="GPL" PKG_SITE="https://github.com/LibreELEC/brcmfmac_sdio-firmware" PKG_URL="https://github.com/LibreELEC/brcmfmac_sdio-firmware/archive/${PKG_VERSION}.tar.gz" -PKG_LONGDESC="Broadcom SDIO firmware used with LibreELEC" +PKG_LONGDESC="Broadcom SDIO firmware used with JELOS" PKG_TOOLCHAIN="manual" post_makeinstall_target() { diff --git a/packages/kernel/linux-firmware/kernel-firmware/firmwares/any.dat b/packages/kernel/linux-firmware/kernel-firmware/firmwares/any.dat index 8ad5768aab..d7bae2171e 100644 --- a/packages/kernel/linux-firmware/kernel-firmware/firmwares/any.dat +++ b/packages/kernel/linux-firmware/kernel-firmware/firmwares/any.dat @@ -21,3 +21,5 @@ brcm/* rtl_bt/* rtlwifi/* rtw*/* + +rtl_nic/* diff --git a/packages/kernel/linux-firmware/kernel-firmware/package.mk b/packages/kernel/linux-firmware/kernel-firmware/package.mk index e7f40b7813..ebc338e4b5 100644 --- a/packages/kernel/linux-firmware/kernel-firmware/package.mk +++ b/packages/kernel/linux-firmware/kernel-firmware/package.mk @@ -8,6 +8,7 @@ PKG_SITE="https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmwar PKG_URL="https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/snapshot/linux-firmware-${PKG_VERSION}.tar.gz" PKG_NEED_UNPACK="${PROJECT_DIR}/${PROJECT}/packages/${PKG_NAME} ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/packages/${PKG_NAME}" PKG_LONGDESC="kernel-firmware: kernel related firmware" +PKG_DEPENDS_HOST="toolchain" PKG_TOOLCHAIN="manual" configure_package() { @@ -67,14 +68,6 @@ makeinstall_target() { PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die - # The following files are RPi specific and installed by brcmfmac_sdio-firmware-rpi instead. - # They are also not required at all if the kernel is not suitably configured. - if listcontains "${FIRMWARE}" "brcmfmac_sdio-firmware-rpi" || \ - ! grep -q "^CONFIG_BRCMFMAC_SDIO=y" ${PKG_KERNEL_CFG_FILE}; then - rm -fr ${FW_TARGET_DIR}/brcm/brcmfmac43430*-sdio.* - rm -fr ${FW_TARGET_DIR}/brcm/brcmfmac43455*-sdio.* - fi - # brcm pcie firmware is only needed by x86_64 [ "${TARGET_ARCH}" != "x86_64" ] && rm -fr ${FW_TARGET_DIR}/brcm/*-pcie.* diff --git a/packages/kernel/linux/package.mk b/packages/kernel/linux/package.mk index 3fdef6a22a..edb340d9e5 100644 --- a/packages/kernel/linux/package.mk +++ b/packages/kernel/linux/package.mk @@ -4,7 +4,7 @@ PKG_NAME="linux" PKG_LICENSE="GPL" -PKG_VERSION="6.7.3" +PKG_VERSION="6.7.4" PKG_URL="https://www.kernel.org/pub/linux/kernel/v6.x/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_SITE="http://www.kernel.org" PKG_DEPENDS_HOST="ccache:host rdfind:host rsync:host openssl:host" @@ -19,8 +19,8 @@ PKG_PATCH_DIRS+="${LINUX} ${DEVICE} default" PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die if [ -n "${KERNEL_TOOLCHAIN}" ]; then - PKG_DEPENDS_HOST="${PKG_DEPENDS_HOST} gcc-${KERNEL_TOOLCHAIN}:host" - PKG_DEPENDS_TARGET="${PKG_DEPENDS_TARGET} gcc-${KERNEL_TOOLCHAIN}:host" + PKG_DEPENDS_HOST+=" gcc-${KERNEL_TOOLCHAIN}:host" + PKG_DEPENDS_TARGET+=" gcc-${KERNEL_TOOLCHAIN}:host" HEADERS_ARCH=${TARGET_ARCH} fi @@ -30,10 +30,9 @@ if [ "${PKG_BUILD_PERF}" != "no" ] && grep -q ^CONFIG_PERF_EVENTS= ${PKG_KERNEL_ fi if [[ "${TARGET_ARCH}" =~ i*86|x86_64 ]]; then - PKG_DEPENDS_TARGET+=" elfutils:host pciutils" - PKG_DEPENDS_UNPACK+=" intel-ucode kernel-firmware" + PKG_DEPENDS_TARGET+=" elfutils:host pciutils intel-ucode kernel-firmware" elif [ "${TARGET_ARCH}" = "arm" -a "${DEVICE}" = "iMX6" ]; then - PKG_DEPENDS_UNPACK+=" firmware-imx" + PKG_DEPENDS_TARGET+=" firmware-imx" fi if [[ "${KERNEL_TARGET}" = uImage* ]]; then @@ -286,32 +285,6 @@ makeinstall_target() { cp arch/${TARGET_KERNEL_ARCH}/boot/*dtb.img ${INSTALL}/usr/share/bootloader/ 2>/dev/null || : [ "${DEVICE}" = "Amlogic-ng" ] && cp arch/${TARGET_KERNEL_ARCH}/boot/dts/amlogic/*.dtb ${INSTALL}/usr/share/bootloader/device_trees 2>/dev/null || : fi - elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then - # RPi firmware will decompress gzipped kernels prior to booting - if [ "${TARGET_KERNEL_ARCH}" = "arm64" ]; then - pigz --best --force ${INSTALL}/.image/${KERNEL_TARGET} - mv ${INSTALL}/.image/${KERNEL_TARGET}.gz ${INSTALL}/.image/${KERNEL_TARGET} - fi - - mkdir -p ${INSTALL}/usr/share/bootloader/overlays - - # install platform dtbs, but remove upstream kernel dtbs (i.e. without downstream - # drivers and decent USB support) as these are not required by LibreELEC - for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*.dtb; do - if [ -f ${dtb} ]; then - cp -v ${dtb} ${INSTALL}/usr/share/bootloader - fi - done - rm -f ${INSTALL}/usr/share/bootloader/bcm283*.dtb - # duplicated in overlays below - safe_remove ${INSTALL}/usr/share/bootloader/overlay_map.dtb - - # install overlay dtbs - for dtb in arch/arm/boot/dts/overlays/*.dtb \ - arch/arm/boot/dts/overlays/*.dtbo; do - cp ${dtb} ${INSTALL}/usr/share/bootloader/overlays 2>/dev/null || : - done - cp -p arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/README ${INSTALL}/usr/share/bootloader/overlays fi makeinstall_host } diff --git a/packages/lang/Python3/patches/0029-configure.ac-fixup-CC-print-multiarch-output-for-mus.patch b/packages/lang/Python3/patches/0029-configure.ac-fixup-CC-print-multiarch-output-for-mus.patch index 5253076d90..f544b9d397 100644 --- a/packages/lang/Python3/patches/0029-configure.ac-fixup-CC-print-multiarch-output-for-mus.patch +++ b/packages/lang/Python3/patches/0029-configure.ac-fixup-CC-print-multiarch-output-for-mus.patch @@ -6,17 +6,17 @@ Subject: [PATCH] configure.ac: fixup $CC --print-multiarch output for GCC commit 6834b83784dcf0364eb820e8 (multiarch support for non-glibc linux systems), which is part of GCC 8+, changed the multiarch logic to use -$arch-linux-musl / $arch-linux-uclibc rather than $arch-linux-gnu. +$arch-linux-musl / $arch-linux-uclibc rather than $arch-jelos-linux-gnu. This then causes the python3 configure script to error out: -checking for the platform triplet based on compiler characteristics... powerpc-linux-gnu +checking for the platform triplet based on compiler characteristics... powerpc-jelos-linux-gnu configure: error: internal configure error for the platform triplet, please file a bug report http://autobuild.buildroot.net/results/cb4/cb49c539501342e45cbe5ade82e588fcdf51f05b As it requires that the --print-multiarch output (if not empty) matches the -deduced triplet (which always uses -linux-gnu). +deduced triplet (which always uses -jelos-linux-gnu). It isn't quite clear why --print-multiarch returns something for a non-multiarch toolchain on some architectures (E.G. PowerPC), but as a @@ -41,7 +41,7 @@ index ed03b27fb1..841fd6732c 100644 + [ + # GCC 8+ returns $arch-linux-{musl,uclibc} for musl/uClibc based + # toolchains confusing python. Fix that up -+ MULTIARCH=$($CC --print-multiarch 2>/dev/null | sed -E 's/-linux-(musl|uclibc)*$/-linux-gnu/') ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null | sed -E 's/-linux-(musl|uclibc)*$/-jelos-linux-gnu/') + ] ) AC_SUBST([MULTIARCH]) diff --git a/packages/lang/go/patches/go-0001-add-ca-cert-location.patch b/packages/lang/go/patches/go-0001-add-ca-cert-location.patch index 0ea8d6db6b..fd26bf0b42 100644 --- a/packages/lang/go/patches/go-0001-add-ca-cert-location.patch +++ b/packages/lang/go/patches/go-0001-add-ca-cert-location.patch @@ -6,5 +6,5 @@ index ad6ce5cae7..763c686fed 100644 "/etc/ssl/certs", // SLES10/SLES11, https://golang.org/issue/12139 "/etc/pki/tls/certs", // Fedora/RHEL "/system/etc/security/cacerts", // Android -+ "/etc/ssl", // LibreELEC ++ "/etc/ssl", // JELOS } diff --git a/packages/multimedia/ffmpeg/package.mk b/packages/multimedia/ffmpeg/package.mk index 218df9a777..adbefe418f 100644 --- a/packages/multimedia/ffmpeg/package.mk +++ b/packages/multimedia/ffmpeg/package.mk @@ -10,7 +10,7 @@ PKG_LONGDESC="FFmpeg is a complete, cross-platform solution to record, convert a PKG_VERSION="6.0" PKG_URL="http://ffmpeg.org/releases/ffmpeg-${PKG_VERSION}.tar.xz" -PKG_PATCH_DIRS="kodi libreelec" +PKG_PATCH_DIRS="jelos" PKG_PATCH_DIRS+=" v4l2-request v4l2-drmprime" @@ -133,9 +133,6 @@ pre_configure_target() { if [ "${FFMPEG_TESTING}" = "yes" ]; then PKG_FFMPEG_TESTING="--enable-encoder=wrapped_avframe --enable-muxer=null" - if [ "${PROJECT}" = "RPi" ]; then - PKG_FFMPEG_TESTING+=" --enable-vout-drm --enable-outdev=vout_drm" - fi else PKG_FFMPEG_TESTING="--disable-programs" fi @@ -191,7 +188,6 @@ configure_target() { ${PKG_FFMPEG_V4L2} \ ${PKG_FFMPEG_VAAPI} \ ${PKG_FFMPEG_VDPAU} \ - ${PKG_FFMPEG_RPI} \ --enable-runtime-cpudetect \ --disable-hardcoded-tables \ --disable-encoders \ diff --git a/packages/multimedia/ffmpeg/patches/libreelec/ffmpeg-001-libreelec.patch b/packages/multimedia/ffmpeg/patches/jelos/ffmpeg-001-jelos.patch similarity index 100% rename from packages/multimedia/ffmpeg/patches/libreelec/ffmpeg-001-libreelec.patch rename to packages/multimedia/ffmpeg/patches/jelos/ffmpeg-001-jelos.patch diff --git a/packages/multimedia/ffmpeg/patches/rpi/ffmpeg-001-rpi.patch b/packages/multimedia/ffmpeg/patches/rpi/ffmpeg-001-rpi.patch deleted file mode 100644 index 72cacc605c..0000000000 --- a/packages/multimedia/ffmpeg/patches/rpi/ffmpeg-001-rpi.patch +++ /dev/null @@ -1,37792 +0,0 @@ -From 504df93cfe5416b394755e79b7b81ee0119cf09c Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 26 Apr 2021 12:34:50 +0100 -Subject: [PATCH 001/151] Add pi configs and scripts - ---- - pi-util/BUILD.txt | 59 ++++++++ - pi-util/NOTES.txt | 69 +++++++++ - pi-util/TESTMESA.txt | 82 +++++++++++ - pi-util/clean_usr_libs.sh | 26 ++++ - pi-util/conf_arm64_native.sh | 45 ++++++ - pi-util/conf_h265.2016.csv | 195 ++++++++++++++++++++++++++ - pi-util/conf_h265.2016_HEVC_v1.csv | 147 ++++++++++++++++++++ - pi-util/conf_h265.csv | 144 +++++++++++++++++++ - pi-util/conf_native.sh | 108 +++++++++++++++ - pi-util/ffconf.py | 215 +++++++++++++++++++++++++++++ - pi-util/ffperf.py | 128 +++++++++++++++++ - pi-util/genpatch.sh | 35 +++++ - pi-util/make_array.py | 23 +++ - pi-util/mkinst.sh | 5 + - pi-util/patkodi.sh | 9 ++ - pi-util/perfcmp.py | 101 ++++++++++++++ - pi-util/qem.sh | 9 ++ - pi-util/v3dusage.py | 128 +++++++++++++++++ - 18 files changed, 1528 insertions(+) - create mode 100644 pi-util/BUILD.txt - create mode 100644 pi-util/NOTES.txt - create mode 100644 pi-util/TESTMESA.txt - create mode 100755 pi-util/clean_usr_libs.sh - create mode 100644 pi-util/conf_arm64_native.sh - create mode 100644 pi-util/conf_h265.2016.csv - create mode 100644 pi-util/conf_h265.2016_HEVC_v1.csv - create mode 100644 pi-util/conf_h265.csv - create mode 100755 pi-util/conf_native.sh - create mode 100755 pi-util/ffconf.py - create mode 100755 pi-util/ffperf.py - create mode 100755 pi-util/genpatch.sh - create mode 100755 pi-util/make_array.py - create mode 100755 pi-util/mkinst.sh - create mode 100644 pi-util/patkodi.sh - create mode 100755 pi-util/perfcmp.py - create mode 100755 pi-util/qem.sh - create mode 100755 pi-util/v3dusage.py - -diff --git a/pi-util/BUILD.txt b/pi-util/BUILD.txt -new file mode 100644 -index 0000000000..b050971f63 ---- /dev/null -+++ b/pi-util/BUILD.txt -@@ -0,0 +1,59 @@ -+Building Pi FFmpeg -+================== -+ -+Current only building on a Pi is supported. -+This builds ffmpeg the way I've tested it -+ -+Get all dependencies - the current package dependencies are good enough -+ -+$ sudo apt-get build-dep ffmpeg -+ -+Configure using the pi-util/conf_native.sh script -+------------------------------------------------- -+ -+This sets the normal release options and creates an ouutput dir to build into -+The directory name will depend on system and options but will be under out/ -+ -+There are a few choices here -+ --mmal build including the legacy mmal-based decoders and zero-copy code -+ this requires appropriate libraries which currently will exist for -+ armv7 but not arm64 -+ --noshared -+ Build a static image rather than a shared library one. Static is -+ easier for testing as there is no need to worry about library -+ paths being confused and therefore running the wrong code, Shared -+ is what is needed, in most cases, when building for use by other -+ programs. -+ -+So for a static build -+--------------------- -+ -+$ pi-util/conf_native.sh --noshared -+ -+$ make -j8 -C out/ -+ -+You can now run ffmpeg directly from where it was built -+ -+For a shared build -+------------------ -+ -+$ pi-util/conf_native.sh -+ -+You will normally want an install target if shared. Note that the script has -+set this up to be generated in out//install, you don't have to worry -+about overwriting your system libs. -+ -+$ make -j8 -C out/ install -+ -+You can now set LD_LIBRARY_PATH appropriately and run ffmpeg from where it was -+built or install the image on the system - you have to be careful to get rid -+of all other ffmpeg libs or confusion may result. There is a little script -+that wipes all other versions - obviously use with care! -+ -+$ sudo pi-util/clean_usr_libs.sh -+ -+Then simply copying from the install to /usr works -+ -+$ sudo cp -r out//install/* /usr -+ -+ -diff --git a/pi-util/NOTES.txt b/pi-util/NOTES.txt -new file mode 100644 -index 0000000000..fcce72226a ---- /dev/null -+++ b/pi-util/NOTES.txt -@@ -0,0 +1,69 @@ -+Notes on the hevc_rpi decoder & associated support code -+------------------------------------------------------- -+ -+There are 3 main parts to the existing code: -+ -+1) The decoder - this is all in libavcodec as rpi_hevc*. -+ -+2) A few filters to deal with Sand frames and a small patch to -+automatically select the sand->i420 converter when required. -+ -+3) A kludge in ffmpeg.c to display the decoded video. This could & should -+be converted into a proper ffmpeg display module. -+ -+ -+Decoder -+------- -+ -+The decoder is a modified version of the existing ffmpeg hevc decoder. -+Generally it is ~100% faster than the existing ffmpeg hevc s/w decoder. -+More complex bitstreams can be up to ~200% faster but particularly easy -+streams can cut its advantage down to ~50%. This means that a Pi3+ can -+display nearly all 8-bit 1080p30 streams and with some overclocking it can -+display most lower bitrate 10-bit 1080p30 streams - this latter case is -+not helped by the requirement to downsample to 8-bit before display on a -+Pi. -+ -+It has had co-processor offload added for inter-pred and large block -+residual transform. Various parts have had optimized ARM NEON assembler -+added and the existing ARM asm sections have been profiled and -+re-optimized for A53. The main C code has been substantially reworked at -+its lower levels in an attempt to optimize it and minimize memory -+bandwidth. To some extent code paths that deal with frame types that it -+doesn't support have been pruned. -+ -+It outputs frames in Broadcom Sand format. This is a somewhat annoying -+layout that doesn't fit into ffmpegs standard frame descriptions. It has -+vertical stripes of 128 horizontal pixels (64 in 10 bit forms) with Y for -+the stripe followed by interleaved U & V, that is then followed by the Y -+for the next stripe, etc. The final stripe is always padded to -+stripe-width. This is used in an attempt to help with cache locality and -+cut down on the number of dram bank switches. It is annoying to use for -+inter-pred with conventional processing but the way the Pi QPU (which is -+used for inter-pred) works means that it has negligible downsides here and -+the improved memory performance exceeds the overhead of the increased -+complexity in the rest of the code. -+ -+Frames must be allocated out of GPU memory (as otherwise they can't be -+accessed by the co-processors). Utility functions (in rpi_zc.c) have been -+written to make this easier. As the frames are already in GPU memory they -+can be displayed by the Pi h/w without any further copying. -+ -+ -+Known non-features -+------------------ -+ -+Frame allocation should probably be done in some other way in order to fit -+into the standard framework better. -+ -+Sand frames are currently declared as software frames, there is an -+argument that they should be hardware frames but they aren't really. -+ -+There must be a better way of auto-selecting the hevc_rpi decoder over the -+normal s/w hevc decoder, but I became confused by the existing h/w -+acceleration framework and what I wanted to do didn't seem to fit in -+neatly. -+ -+Display should be a proper device rather than a kludge in ffmpeg.c -+ -+ -diff --git a/pi-util/TESTMESA.txt b/pi-util/TESTMESA.txt -new file mode 100644 -index 0000000000..92bc13a3df ---- /dev/null -+++ b/pi-util/TESTMESA.txt -@@ -0,0 +1,82 @@ -+# Setup & Build instructions for testing Argon30 mesa support (on Pi4) -+ -+# These assume that the drm_mmal test for Sand8 has been built on this Pi -+# as build relies on many of the same files -+ -+# 1st get everything required to build ffmpeg -+# If sources aren't already enabled on your Pi then enable them -+sudo su -+sed "s/#deb-src/deb-src/" /etc/apt/sources.list > /tmp/sources.list -+sed "s/#deb-src/deb-src/" /etc/apt/sources.list.d/raspi.list > /tmp/raspi.list -+mv /tmp/sources.list /etc/apt/ -+mv /tmp/raspi.list /etc/apt/sources.list.d/ -+apt update -+ -+# Get dependancies -+sudo apt build-dep ffmpeg -+ -+sudo apt install meson libepoxy-dev libxcb-dri3-dev libxcb1-dev libx11-dev libx11-xcb-dev libdrm-dev -+ -+# Enable H265 V4L2 request decoder -+sudo su -+echo dtoverlay=rpivid-v4l2 >> /boot/config.txt -+# You may also want to add more CMA if you are going to try 4k videos -+# Change the dtoverlay=vc4-fkms-v3d line in config.txt to read -+# dtoverlay=vc4-fkms-v3d,cma-512 -+reboot -+# Check it has turned up -+ls -la /dev/video* -+# This should include video19 -+# crw-rw----+ 1 root video 81, 7 Aug 4 17:25 /dev/video19 -+ -+# Currently on the Pi the linux headers from the debian distro don't match -+# the kernel that we ship and we need to update them - hopefully this step -+# will be unneeded in the future -+sudo apt install git bc bison flex libssl-dev make -+git clone --depth=1 https://github.com/raspberrypi/linux --branch rpi-5.10.y -+cd linux -+KERNEL=kernel7l -+make bcm2711_defconfig -+make headers_install -+sudo cp -r usr/include/linux /usr/include -+cd .. -+ -+# Config - this builds a staticly linked ffmpeg which is easier for testing -+pi-util/conf_native.sh --noshared -+ -+# Build (this is a bit dull) -+# If you want to poke the source the libavdevice/egl_vout.c contains the -+# output code - -+cd out/armv7-static-rel -+ -+# Check that you have actually configured V4L2 request -+grep HEVC_V4L2REQUEST config.h -+# You are hoping for -+# #define CONFIG_HEVC_V4L2REQUEST_HWACCEL 1 -+# if you get 0 then the config has failed -+ -+make -j6 -+ -+# Grab test streams -+wget http://www.jell.yfish.us/media/jellyfish-3-mbps-hd-h264.mkv -+wget http://www.jell.yfish.us/media/jellyfish-3-mbps-hd-hevc.mkv -+wget http://www.jell.yfish.us/media/jellyfish-3-mbps-hd-hevc-10bit.mkv -+ -+# Test i420 output (works currently) -+./ffmpeg -no_cvt_hw -vcodec h264_v4l2m2m -i jellyfish-3-mbps-hd-h264.mkv -f vout_egl - -+ -+# Test Sand8 output - doesn't currently work but should once you have -+# Sand8 working in drm_mmal. I can't guarantee that this will work as -+# I can't test this path with a known working format, but the debug looks -+# good. If this doesn't work & drm_mmal does with sand8 then come back to me -+# The "show_all 1" forces vout to display every frame otherwise it drops any -+# frame that would cause it to block -+./ffmpeg -no_cvt_hw -hwaccel drm -vcodec hevc -i jellyfish-3-mbps-hd-hevc.mkv -show_all 1 -f vout_egl - -+ -+# Test Sand30 - doesn't currently work -+# (Beware that when FFmpeg errors out it often leaves your teminal window -+# in a state where you need to reset it) -+./ffmpeg -no_cvt_hw -hwaccel drm -vcodec hevc -i jellyfish-3-mbps-hd-hevc-10bit.mkv -f vout_egl - -+ -+ -+ -diff --git a/pi-util/clean_usr_libs.sh b/pi-util/clean_usr_libs.sh -new file mode 100755 -index 0000000000..b3b2d5509d ---- /dev/null -+++ b/pi-util/clean_usr_libs.sh -@@ -0,0 +1,26 @@ -+set -e -+U=/usr/lib/arm-linux-gnueabihf -+rm -f $U/libavcodec.* -+rm -f $U/libavdevice.* -+rm -f $U/libavfilter.* -+rm -f $U/libavformat.* -+rm -f $U/libavutil.* -+rm -f $U/libswresample.* -+rm -f $U/libswscale.* -+U=/usr/lib/arm-linux-gnueabihf/neon/vfp -+rm -f $U/libavcodec.* -+rm -f $U/libavdevice.* -+rm -f $U/libavfilter.* -+rm -f $U/libavformat.* -+rm -f $U/libavutil.* -+rm -f $U/libswresample.* -+rm -f $U/libswscale.* -+U=/usr/lib/aarch64-linux-gnu -+rm -f $U/libavcodec.* -+rm -f $U/libavdevice.* -+rm -f $U/libavfilter.* -+rm -f $U/libavformat.* -+rm -f $U/libavutil.* -+rm -f $U/libswresample.* -+rm -f $U/libswscale.* -+ -diff --git a/pi-util/conf_arm64_native.sh b/pi-util/conf_arm64_native.sh -new file mode 100644 -index 0000000000..9e3bbfa190 ---- /dev/null -+++ b/pi-util/conf_arm64_native.sh -@@ -0,0 +1,45 @@ -+echo "Configure for ARM64 native build" -+ -+#RPI_KEEPS="-save-temps=obj" -+ -+SHARED_LIBS="--enable-shared" -+if [ "$1" == "--noshared" ]; then -+ SHARED_LIBS="--disable-shared" -+ echo Static libs -+ OUT=out/arm64-static-rel -+else -+ echo Shared libs -+ OUT=out/arm64-shared-rel -+fi -+ -+mkdir -p $OUT -+cd $OUT -+ -+A=aarch64-linux-gnu -+USR_PREFIX=`pwd`/install -+LIB_PREFIX=$USR_PREFIX/lib/$A -+INC_PREFIX=$USR_PREFIX/include/$A -+ -+../../configure \ -+ --prefix=$USR_PREFIX\ -+ --libdir=$LIB_PREFIX\ -+ --incdir=$INC_PREFIX\ -+ --disable-stripping\ -+ --disable-thumb\ -+ --disable-mmal\ -+ --enable-sand\ -+ --enable-v4l2-request\ -+ --enable-libdrm\ -+ --enable-epoxy\ -+ --enable-libudev\ -+ --enable-vout-drm\ -+ --enable-vout-egl\ -+ $SHARED_LIBS\ -+ --extra-cflags="-ggdb" -+ -+# --enable-decoder=hevc_rpi\ -+# --enable-extra-warnings\ -+# --arch=armv71\ -+ -+# gcc option for getting asm listing -+# -Wa,-ahls -diff --git a/pi-util/conf_h265.2016.csv b/pi-util/conf_h265.2016.csv -new file mode 100644 -index 0000000000..4efd5d1c67 ---- /dev/null -+++ b/pi-util/conf_h265.2016.csv -@@ -0,0 +1,195 @@ -+1,HEVC_v1/AMP_A_Samsung_7,AMP_A_Samsung_7.bin,AMP_A_Samsung_7.md5,8 -+1,HEVC_v1/AMP_B_Samsung_7,AMP_B_Samsung_7.bin,AMP_B_Samsung_7.md5,8 -+1,HEVC_v1/AMP_D_Hisilicon_3,AMP_D_Hisilicon.bit,AMP_D_Hisilicon_3.yuv.md5,8 -+1,HEVC_v1/AMP_E_Hisilicon_3,AMP_E_Hisilicon.bit,AMP_E_Hisilicon_3.yuv.md5,8 -+1,HEVC_v1/AMP_F_Hisilicon_3,AMP_F_Hisilicon_3.bit,AMP_F_Hisilicon_3.yuv.md5,8 -+1,HEVC_v1/AMVP_A_MTK_4,AMVP_A_MTK_4.bit,AMVP_A_MTK_4.md5,8 -+1,HEVC_v1/AMVP_B_MTK_4,AMVP_B_MTK_4.bit,AMVP_B_MTK_4.md5,8 -+1,HEVC_v1/AMVP_C_Samsung_7,AMVP_C_Samsung_7.bin,AMVP_C_Samsung_7.md5,8 -+1,HEVC_v1/BUMPING_A_ericsson_1,BUMPING_A_ericsson_1.bit,BUMPING_A_ericsson_1.md5,8 -+1,HEVC_v1/CAINIT_A_SHARP_4,CAINIT_A_SHARP_4.bit,CAINIT_A_SHARP_4.md5,8 -+1,HEVC_v1/CAINIT_B_SHARP_4,CAINIT_B_SHARP_4.bit,CAINIT_B_SHARP_4.md5,8 -+1,HEVC_v1/CAINIT_C_SHARP_3,CAINIT_C_SHARP_3.bit,CAINIT_C_SHARP_3.md5,8 -+1,HEVC_v1/CAINIT_D_SHARP_3,CAINIT_D_SHARP_3.bit,CAINIT_D_SHARP_3.md5,8 -+1,HEVC_v1/CAINIT_E_SHARP_3,CAINIT_E_SHARP_3.bit,CAINIT_E_SHARP_3.md5,8 -+1,HEVC_v1/CAINIT_F_SHARP_3,CAINIT_F_SHARP_3.bit,CAINIT_F_SHARP_3.md5,8 -+1,HEVC_v1/CAINIT_G_SHARP_3,CAINIT_G_SHARP_3.bit,CAINIT_G_SHARP_3.md5,8 -+1,HEVC_v1/CAINIT_H_SHARP_3,CAINIT_H_SHARP_3.bit,CAINIT_H_SHARP_3.md5,8 -+1,HEVC_v1/CIP_A_Panasonic_3,CIP_A_Panasonic_3.bit,CIP_A_Panasonic_3_yuv.md5,8 -+1,HEVC_v1/cip_B_NEC_3,cip_B_NEC_3.bit,cip_B_NEC_3.md5,8 -+1,HEVC_v1/CIP_C_Panasonic_2,CIP_C_Panasonic_2.bit,CIP_C_Panasonic_2_yuv.md5,8 -+1,HEVC_v1/CONFWIN_A_Sony_1,CONFWIN_A_Sony_1.bit,CONFWIN_A_Sony_1.md5,8 -+1,HEVC_v1/DBLK_A_MAIN10_VIXS_4,DBLK_A_MAIN10_VIXS_4.bit,DBLK_A_MAIN10_VIXS_4.md5,10 -+1,HEVC_v1/DBLK_A_SONY_3,DBLK_A_SONY_3.bit,DBLK_A_SONY_3.bit.yuv.md5,8 -+1,HEVC_v1/DBLK_B_SONY_3,DBLK_B_SONY_3.bit,DBLK_B_SONY_3.bit.yuv.md5,8 -+1,HEVC_v1/DBLK_C_SONY_3,DBLK_C_SONY_3.bit,DBLK_C_SONY_3.bit.yuv.md5,8 -+1,HEVC_v1/DBLK_D_VIXS_2,DBLK_D_VIXS_2.bit,DBLK_D_VIXS_2_yuv.md5,8 -+1,HEVC_v1/DBLK_E_VIXS_2,DBLK_E_VIXS_2.bit,DBLK_E_VIXS_2_yuv.md5,8 -+1,HEVC_v1/DBLK_F_VIXS_2,DBLK_F_VIXS_2.bit,DBLK_F_VIXS_2_yuv.md5,8 -+1,HEVC_v1/DBLK_G_VIXS_2,DBLK_G_VIXS_2.bit,DBLK_G_VIXS_2_yuv.md5,8 -+1,HEVC_v1/DELTAQP_A_BRCM_4,DELTAQP_A_BRCM_4.bit,DELTAQP_A_BRCM_4_yuv.md5,8 -+1,HEVC_v1/DELTAQP_B_SONY_3,DELTAQP_B_SONY_3.bit,DELTAQP_B_SONY_3.bit.yuv.md5,8 -+1,HEVC_v1/DELTAQP_C_SONY_3,DELTAQP_C_SONY_3.bit,DELTAQP_C_SONY_3.bit.yuv.md5,8 -+1,HEVC_v1/DSLICE_A_HHI_5,DSLICE_A_HHI_5.bin,DSLICE_A_HHI_5.md5,8 -+1,HEVC_v1/DSLICE_B_HHI_5,DSLICE_B_HHI_5.bin,DSLICE_B_HHI_5.md5,8 -+1,HEVC_v1/DSLICE_C_HHI_5,DSLICE_C_HHI_5.bin,DSLICE_C_HHI_5.md5,8 -+1,HEVC_v1/ENTP_A_QUALCOMM_1,ENTP_A_Qualcomm_1.bit,ENTP_A_Qualcomm_1.md5,8 -+1,HEVC_v1/ENTP_B_Qualcomm_1,ENTP_B_Qualcomm_1.bit,ENTP_B_Qualcomm_1.md5,8 -+1,HEVC_v1/ENTP_C_Qualcomm_1,ENTP_C_Qualcomm_1.bit,ENTP_C_Qualcomm_1.md5,8 -+1,HEVC_v1/EXT_A_ericsson_4,EXT_A_ericsson_4.bit,EXT_A_ericsson_4.md5,8 -+1,HEVC_v1/FILLER_A_Sony_1,FILLER_A_Sony_1.bit,FILLER_A_Sony_1.md5,8 -+1,HEVC_v1/HRD_A_Fujitsu_3,HRD_A_Fujitsu_3.bin,HRD_A_Fujitsu_3.md5,8 -+1,HEVC_v1/INITQP_A_Sony_1,INITQP_A_Sony_1.bit,INITQP_A_Sony_1.md5,8 -+1,HEVC_v1/INITQP_B_Main10_Sony_1,INITQP_B_Main10_Sony_1.bit,INITQP_B_Main10_Sony_1.md5,10 -+1,HEVC_v1/ipcm_A_NEC_3,ipcm_A_NEC_3.bit,ipcm_A_NEC_3.md5,8 -+1,HEVC_v1/ipcm_B_NEC_3,ipcm_B_NEC_3.bit,ipcm_B_NEC_3.md5,8 -+1,HEVC_v1/ipcm_C_NEC_3,ipcm_C_NEC_3.bit,ipcm_C_NEC_3.md5,8 -+1,HEVC_v1/ipcm_D_NEC_3,ipcm_D_NEC_3.bit,ipcm_D_NEC_3.md5,8 -+1,HEVC_v1/ipcm_E_NEC_2,ipcm_E_NEC_2.bit,ipcm_E_NEC_2.md5,8 -+1,HEVC_v1/IPRED_A_docomo_2,IPRED_A_docomo_2.bit,IPRED_A_docomo_2.md5,8 -+1,HEVC_v1/IPRED_B_Nokia_3,IPRED_B_Nokia_3.bit,IPRED_B_Nokia_3_yuv.md5,8 -+1,HEVC_v1/IPRED_C_Mitsubishi_3,IPRED_C_Mitsubishi_3.bit,IPRED_C_Mitsubishi_3_yuv.md5,8 -+1,HEVC_v1/LS_A_Orange_2,LS_A_Orange_2.bit,LS_A_Orange_2_yuv.md5,8 -+1,HEVC_v1/LS_B_Orange_4,LS_B_Orange_4.bit,LS_B_Orange_4_yuv.md5,8 -+1,HEVC_v1/LTRPSPS_A_Qualcomm_1,LTRPSPS_A_Qualcomm_1.bit,LTRPSPS_A_Qualcomm_1.md5,8 -+1,HEVC_v1/MAXBINS_A_TI_5,MAXBINS_A_TI_5.bit,MAXBINS_A_TI_5_yuv.md5,8 -+1,HEVC_v1/MAXBINS_B_TI_5,MAXBINS_B_TI_5.bit,MAXBINS_B_TI_5_yuv.md5,8 -+1,HEVC_v1/MAXBINS_C_TI_5,MAXBINS_C_TI_5.bit,MAXBINS_C_TI_5_yuv.md5,8 -+1,HEVC_v1/MERGE_A_TI_3,MERGE_A_TI_3.bit,MERGE_A_TI_3.md5,8 -+1,HEVC_v1/MERGE_B_TI_3,MERGE_B_TI_3.bit,MERGE_B_TI_3.md5,8 -+1,HEVC_v1/MERGE_C_TI_3,MERGE_C_TI_3.bit,MERGE_C_TI_3.md5,8 -+1,HEVC_v1/MERGE_D_TI_3,MERGE_D_TI_3.bit,MERGE_D_TI_3.md5,8 -+1,HEVC_v1/MERGE_E_TI_3,MERGE_E_TI_3.bit,MERGE_E_TI_3.md5,8 -+1,HEVC_v1/MERGE_F_MTK_4,MERGE_F_MTK_4.bit,MERGE_F_MTK_4.md5,8 -+1,HEVC_v1/MERGE_G_HHI_4,MERGE_G_HHI_4.bit,MERGE_G_HHI_4.md5,8 -+1,HEVC_v1/MVCLIP_A_qualcomm_3,MVCLIP_A_qualcomm_3.bit,MVCLIP_A_qualcomm_3.yuv.md5,8 -+1,HEVC_v1/MVDL1ZERO_A_docomo_4,MVDL1ZERO_A_docomo_4.bit,MVDL1ZERO_A_docomo_4.md5,8 -+1,HEVC_v1/MVEDGE_A_qualcomm_3,MVEDGE_A_qualcomm_3.bit,MVEDGE_A_qualcomm_3.yuv.md5,8 -+1,HEVC_v1/NoOutPrior_A_Qualcomm_1,NoOutPrior_A_Qualcomm_1.bit,NoOutPrior_A_Qualcomm_1.md5,8 -+1,HEVC_v1/NoOutPrior_B_Qualcomm_1,NoOutPrior_B_Qualcomm_1.bit,NoOutPrior_B_Qualcomm_1.md5,8 -+1,HEVC_v1/NUT_A_ericsson_5,NUT_A_ericsson_5.bit,NUT_A_ericsson_5.md5,8 -+1,HEVC_v1/OPFLAG_A_Qualcomm_1,OPFLAG_A_Qualcomm_1.bit,OPFLAG_A_Qualcomm_1.md5,8 -+1,HEVC_v1/OPFLAG_B_Qualcomm_1,OPFLAG_B_Qualcomm_1.bit,OPFLAG_B_Qualcomm_1.md5,8 -+1,HEVC_v1/OPFLAG_C_Qualcomm_1,OPFLAG_C_Qualcomm_1.bit,OPFLAG_C_Qualcomm_1.md5,8 -+1,HEVC_v1/PICSIZE_A_Bossen_1,PICSIZE_A_Bossen_1.bin,PICSIZE_A_Bossen_1.md5,8 -+1,HEVC_v1/PICSIZE_B_Bossen_1,PICSIZE_B_Bossen_1.bin,PICSIZE_B_Bossen_1.md5,8 -+1,HEVC_v1/PICSIZE_C_Bossen_1,PICSIZE_C_Bossen_1.bin,PICSIZE_C_Bossen_1.md5,8 -+1,HEVC_v1/PICSIZE_D_Bossen_1,PICSIZE_D_Bossen_1.bin,PICSIZE_D_Bossen_1.md5,8 -+1,HEVC_v1/PMERGE_A_TI_3,PMERGE_A_TI_3.bit,PMERGE_A_TI_3.md5,8 -+1,HEVC_v1/PMERGE_B_TI_3,PMERGE_B_TI_3.bit,PMERGE_B_TI_3.md5,8 -+1,HEVC_v1/PMERGE_C_TI_3,PMERGE_C_TI_3.bit,PMERGE_C_TI_3.md5,8 -+1,HEVC_v1/PMERGE_D_TI_3,PMERGE_D_TI_3.bit,PMERGE_D_TI_3.md5,8 -+1,HEVC_v1/PMERGE_E_TI_3,PMERGE_E_TI_3.bit,PMERGE_E_TI_3.md5,8 -+1,HEVC_v1/POC_A_Bossen_3,POC_A_Bossen_3.bin,POC_A_Bossen_3.md5,8 -+1,HEVC_v1/PPS_A_qualcomm_7,PPS_A_qualcomm_7.bit,PPS_A_qualcomm_7.yuv.md5,8 -+1,HEVC_v1/PS_B_VIDYO_3,PS_B_VIDYO_3.bit,PS_B_VIDYO_3_yuv.md5,8 -+1,HEVC_v1/RAP_A_docomo_6,RAP_A_docomo_6.bit,RAP_A_docomo_6.md5,8 -+1,HEVC_v1/RAP_B_Bossen_2,RAP_B_Bossen_2.bit,RAP_B_Bossen_2.md5,8 -+1,HEVC_v1/RPLM_A_qualcomm_4,RPLM_A_qualcomm_4.bit,RPLM_A_qualcomm_4.yuv.md5,8 -+1,HEVC_v1/RPLM_B_qualcomm_4,RPLM_B_qualcomm_4.bit,RPLM_B_qualcomm_4.yuv.md5,8 -+1,HEVC_v1/RPS_A_docomo_5,RPS_A_docomo_5.bit,RPS_A_docomo_5.md5,8 -+1,HEVC_v1/RPS_B_qualcomm_5,RPS_B_qualcomm_5.bit,RPS_B_qualcomm_5.yuv.md5,8 -+1,HEVC_v1/RPS_C_ericsson_5,RPS_C_ericsson_5.bit,RPS_C_ericsson_5.md5,8 -+1,HEVC_v1/RPS_D_ericsson_6,RPS_D_ericsson_6.bit,RPS_D_ericsson_6.md5,8 -+1,HEVC_v1/RPS_E_qualcomm_5,RPS_E_qualcomm_5.bit,RPS_E_qualcomm_5.yuv.md5,8 -+1,HEVC_v1/RPS_F_docomo_2,RPS_F_docomo_2.bit,RPS_F_docomo_2.md5,8 -+1,HEVC_v1/RQT_A_HHI_4,RQT_A_HHI_4.bit,RQT_A_HHI_4.md5,8 -+1,HEVC_v1/RQT_B_HHI_4,RQT_B_HHI_4.bit,RQT_B_HHI_4.md5,8 -+1,HEVC_v1/RQT_C_HHI_4,RQT_C_HHI_4.bit,RQT_C_HHI_4.md5,8 -+1,HEVC_v1/RQT_D_HHI_4,RQT_D_HHI_4.bit,RQT_D_HHI_4.md5,8 -+1,HEVC_v1/RQT_E_HHI_4,RQT_E_HHI_4.bit,RQT_E_HHI_4.md5,8 -+1,HEVC_v1/RQT_F_HHI_4,RQT_F_HHI_4.bit,RQT_F_HHI_4.md5,8 -+1,HEVC_v1/RQT_G_HHI_4,RQT_G_HHI_4.bit,RQT_G_HHI_4.md5,8 -+1,HEVC_v1/SAO_A_MediaTek_4,SAO_A_MediaTek_4.bit,SAO_A_MediaTek_4.md5,8 -+1,HEVC_v1/SAO_B_MediaTek_5,SAO_B_MediaTek_5.bit,SAO_B_MediaTek_5.md5,8 -+1,HEVC_v1/SAO_C_Samsung_5,SAO_C_Samsung_5.bin,SAO_C_Samsung_5.md5,8 -+1,HEVC_v1/SAO_D_Samsung_5,SAO_D_Samsung_5.bin,SAO_D_Samsung_5.md5,8 -+1,HEVC_v1/SAO_E_Canon_4,SAO_E_Canon_4.bit,SAO_E_Canon_4.md5,8 -+1,HEVC_v1/SAO_F_Canon_3,SAO_F_Canon_3.bit,SAO_F_Canon_3.md5,8 -+1,HEVC_v1/SAO_G_Canon_3,SAO_G_Canon_3.bit,SAO_G_Canon_3.md5,8 -+1,HEVC_v1/SAO_H_Parabola_1,SAO_H_Parabola_1.bit,SAO_H_Parabola_1.md5,8 -+1,HEVC_v1/SAODBLK_A_MainConcept_4,SAODBLK_A_MainConcept_4.bin,SAODBLK_A_MainConcept_4_md5.txt,8 -+1,HEVC_v1/SAODBLK_B_MainConcept_4,SAODBLK_B_MainConcept_4.bin,SAODBLK_B_MainConcept_4_md5.txt,8 -+1,HEVC_v1/SDH_A_Orange_4,SDH_A_Orange_4.bit,SDH_A_Orange_4_yuv.md5,8 -+1,HEVC_v1/SLICES_A_Rovi_3,SLICES_A_Rovi_3.bin,SLICES_A_Rovi_3.md5,8 -+1,HEVC_v1/SLIST_A_Sony_5,SLIST_A_Sony_5.bin,SLIST_A_Sony_5_yuv.md5,8 -+1,HEVC_v1/SLIST_B_Sony_9,SLIST_B_Sony_9.bin,SLIST_B_Sony_9_yuv.md5,8 -+1,HEVC_v1/SLIST_C_Sony_4,SLIST_C_Sony_4.bin,SLIST_C_Sony_4_yuv.md5,8 -+1,HEVC_v1/SLIST_D_Sony_9,str.bin,SLIST_D_Sony_9_yuv.md5,8 -+1,HEVC_v1/SLPPLP_A_VIDYO_2,SLPPLP_A_VIDYO_2.bit,SLPPLP_A_VIDYO_2_yuv.md5,8 -+1,HEVC_v1/STRUCT_A_Samsung_7,STRUCT_A_Samsung_7.bin,STRUCT_A_Samsung_7.md5,8 -+1,HEVC_v1/STRUCT_B_Samsung_7,STRUCT_B_Samsung_7.bin,STRUCT_B_Samsung_7.md5,8 -+1,HEVC_v1/TILES_A_Cisco_2,TILES_A_Cisco_2.bin,TILES_A_Cisco_2_yuv.md5,8 -+1,HEVC_v1/TILES_B_Cisco_1,TILES_B_Cisco_1.bin,TILES_B_Cisco_1_yuv.md5,8 -+1,HEVC_v1/TMVP_A_MS_3,TMVP_A_MS_3.bit,TMVP_A_MS_3.yuv.md5,8 -+1,HEVC_v1/TSCL_A_VIDYO_5,TSCL_A_VIDYO_5.bit,TSCL_A_VIDYO_5_yuv.md5,8 -+1,HEVC_v1/TSCL_B_VIDYO_4,TSCL_B_VIDYO_4.bit,TSCL_B_VIDYO_4_yuv.md5,8 -+1,HEVC_v1/TSKIP_A_MS_3,TSKIP_A_MS_3.bit,TSKIP_A_MS_3.yuv.md5,8 -+3,HEVC_v1/TSUNEQBD_A_MAIN10_Technicolor_2,TSUNEQBD_A_MAIN10_Technicolor_2.bit,TSUNEQBD_A_MAIN10_Technicolor_2_yuv.md5, # unequal bit depth,10 -+1,HEVC_v1/TUSIZE_A_Samsung_1,TUSIZE_A_Samsung_1.bin,TUSIZE_A_Samsung_1.md5,8 -+1,HEVC_v1/VPSID_A_VIDYO_2,VPSID_A_VIDYO_2.bit,VPSID_A_VIDYO_2_yuv.md5,8 -+3,HEVC_v1/VPSSPSPPS_A_MainConcept_1,VPSSPSPPS_A_MainConcept_1.bin,VPSSPSPPS_A_MainConcept_1_md5.txt, # ???,8 -+1,HEVC_v1/WP_A_MAIN10_Toshiba_3,WP_A_MAIN10_Toshiba_3.bit,WP_A_MAIN10_Toshiba_3_yuv.md5,10 -+1,HEVC_v1/WP_A_Toshiba_3,WP_A_Toshiba_3.bit,WP_A_Toshiba_3_yuv.md5,8 -+1,HEVC_v1/WP_B_Toshiba_3,WP_B_Toshiba_3.bit,WP_B_Toshiba_3_yuv.md5,8 -+1,HEVC_v1/WP_MAIN10_B_Toshiba_3,WP_MAIN10_B_Toshiba_3.bit,WP_MAIN10_B_Toshiba_3_yuv.md5,10 -+1,HEVC_v1/WPP_A_ericsson_MAIN10_2,WPP_A_ericsson_MAIN10_2.bit,WPP_A_ericsson_MAIN10_yuv.md5,10 -+1,HEVC_v1/WPP_A_ericsson_MAIN_2,WPP_A_ericsson_MAIN_2.bit,WPP_A_ericsson_MAIN_2_yuv.md5,8 -+1,HEVC_v1/WPP_B_ericsson_MAIN10_2,WPP_B_ericsson_MAIN10_2.bit,WPP_B_ericsson_MAIN10_yuv.md5,10 -+1,HEVC_v1/WPP_B_ericsson_MAIN_2,WPP_B_ericsson_MAIN_2.bit,WPP_B_ericsson_MAIN_2_yuv.md5,8 -+1,HEVC_v1/WPP_C_ericsson_MAIN10_2,WPP_C_ericsson_MAIN10_2.bit,WPP_C_ericsson_MAIN10_yuv.md5,10 -+1,HEVC_v1/WPP_C_ericsson_MAIN_2,WPP_C_ericsson_MAIN_2.bit,WPP_C_ericsson_MAIN_2_yuv.md5,8 -+1,HEVC_v1/WPP_D_ericsson_MAIN10_2,WPP_D_ericsson_MAIN10_2.bit,WPP_D_ericsson_MAIN10_yuv.md5,10 -+1,HEVC_v1/WPP_D_ericsson_MAIN_2,WPP_D_ericsson_MAIN_2.bit,WPP_D_ericsson_MAIN_2_yuv.md5,8 -+1,HEVC_v1/WPP_E_ericsson_MAIN10_2,WPP_E_ericsson_MAIN10_2.bit,WPP_E_ericsson_MAIN10_yuv.md5,10 -+1,HEVC_v1/WPP_E_ericsson_MAIN_2,WPP_E_ericsson_MAIN_2.bit,WPP_E_ericsson_MAIN_2_yuv.md5,8 -+1,HEVC_v1/WPP_F_ericsson_MAIN10_2,WPP_F_ericsson_MAIN10_2.bit,WPP_F_ericsson_MAIN10_yuv.md5,10 -+1,HEVC_v1/WPP_F_ericsson_MAIN_2,WPP_F_ericsson_MAIN_2.bit,WPP_F_ericsson_MAIN_2_yuv.md5,8 -+1,RExt/ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2.bit,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_yuv_2.md5,0 -+0,RExt/Bitdepth_A_RExt_Sony_1,Bitdepth_A_RExt_Sony_1.bin,md5sum.txt,8 -+0,RExt/Bitdepth_B_RExt_Sony_1,Bitdepth_B_RExt_Sony_1.bin,md5sum.txt,8 -+0,RExt/CCP_10bit_RExt_QCOM,CCP_10bit_RExt_QCOM.bin,CCP_10bit_RExt_QCOM_md5sum.txt,10 -+0,RExt/CCP_12bit_RExt_QCOM,CCP_12bit_RExt_QCOM.bin,CCP_12bit_RExt_QCOM_md5sum.txt,8 -+0,RExt/CCP_8bit_RExt_QCOM,CCP_8bit_RExt_QCOM.bin,CCP_8bit_RExt_QCOM_md5sum.txt,8 -+1,RExt/ExplicitRdpcm_A_BBC_1,ExplicitRdpcm_A_BBC_1.bit,md5sum.txt,0 -+0,RExt/ExplicitRdpcm_B_BBC_2,ExplicitRdpcm_B_BBC_1.bit,md5sum.txt,8 -+0,RExt/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1.bit,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1.md5,10 -+0,RExt/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1.bit,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1.md5,8 -+0,RExt/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_16BIT_RExt_Sony_1,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_16BIT_RExt_Sony_1.bit,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_16BIT_RExt_Sony_1.md5,8 -+0,RExt/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1.bit,EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1.md5,8 -+0,RExt/EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1,EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1.bit,EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1.md5,10 -+0,RExt/EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1,EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1.bit,EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1.md5,8 -+0,RExt/EXTPREC_MAIN_444_16_INTRA_16BIT_RExt_Sony_1,EXTPREC_MAIN_444_16_INTRA_16BIT_RExt_Sony_1.bit,EXTPREC_MAIN_444_16_INTRA_16BIT_RExt_Sony_1.md5,8 -+0,RExt/EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1,EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1.bit,EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1.md5,8 -+1,RExt/GENERAL_10b_420_RExt_Sony_1,GENERAL_10b_420_RExt_Sony_1.bit,GENERAL_10b_420_RExt_Sony_1.md5,10 -+1,RExt/GENERAL_10b_422_RExt_Sony_1,GENERAL_10b_422_RExt_Sony_1.bit,GENERAL_10b_422_RExt_Sony_1.md5,0 -+1,RExt/GENERAL_10b_444_RExt_Sony_2,GENERAL_10b_444_RExt_Sony_2.bit,GENERAL_10b_444_RExt_Sony_2.md5,0 -+1,RExt/GENERAL_12b_400_RExt_Sony_1,GENERAL_12b_400_RExt_Sony_1.bit,GENERAL_12b_400_RExt_Sony_1.md5,0 -+1,RExt/GENERAL_12b_420_RExt_Sony_1,GENERAL_12b_420_RExt_Sony_1.bit,GENERAL_12b_420_RExt_Sony_1.md5,0 -+1,RExt/GENERAL_12b_422_RExt_Sony_1,GENERAL_12b_422_RExt_Sony_1.bit,GENERAL_12b_422_RExt_Sony_1.md5,0 -+1,RExt/GENERAL_12b_444_RExt_Sony_2,GENERAL_12b_444_RExt_Sony_2.bit,GENERAL_12b_444_RExt_Sony_2.md5,0 -+0,RExt/GENERAL_16b_400_RExt_Sony_1,GENERAL_16b_400_RExt_Sony_1.bit,GENERAL_16b_400_RExt_Sony_1.md5,0 -+0,RExt/GENERAL_16b_444_highThroughput_RExt_Sony_2,GENERAL_16b_444_highThroughput_RExt_Sony_2.bit,GENERAL_16b_444_highThroughput_RExt_Sony_2.md5,8 -+0,RExt/GENERAL_16b_444_RExt_Sony_2,GENERAL_16b_444_RExt_Sony_2.bit,GENERAL_16b_444_RExt_Sony_2.md5,8 -+1,RExt/GENERAL_8b_400_RExt_Sony_1,GENERAL_8b_400_RExt_Sony_1.bit,GENERAL_8b_400_RExt_Sony_1.md5,0 -+1,RExt/GENERAL_8b_420_RExt_Sony_1,GENERAL_8b_420_RExt_Sony_1.bit,GENERAL_8b_420_RExt_Sony_1.md5,8 -+1,RExt/GENERAL_8b_444_RExt_Sony_2,GENERAL_8b_444_RExt_Sony_2.bit,GENERAL_8b_444_RExt_Sony_2.md5,0 -+1,RExt/IPCM_A_RExt_NEC_2,IPCM_A_RExt_NEC_2.bit,IPCM_A_RExt_NEC_2_yuv.md5,0 -+1,RExt/IPCM_B_RExt_NEC,IPCM_B_RExt_NEC.bit,IPCM_B_RExt_NEC_yuv.md5,0 -+1,RExt/Main_422_10_A_RExt_Sony_2,Main_422_10_A_RExt_Sony_2.bin,md5sum.txt,0 -+1,RExt/Main_422_10_B_RExt_Sony_2,Main_422_10_B_RExt_Sony_2.bin,md5sum.txt,0 -+1,RExt/PERSIST_RPARAM_A_RExt_Sony_3,PERSIST_RPARAM_A_RExt_Sony_3.bit,PERSIST_RPARAM_A_RExt_Sony_3.md5,0 -+1,RExt/QMATRIX_A_RExt_Sony_1,QMATRIX_A_RExt_Sony_1.bit,QMATRIX_A_RExt_Sony_1.md5,0 -+0,RExt/SAO_A_RExt_MediaTek_1,SAO_A_RExt_MediaTek_1.bit,SAO_A_RExt_MediaTek_1.md5, # Runs out of memory - could be fixed,8 -+0,RExt/TSCTX_10bit_I_RExt_SHARP_1,TSCTX_10bit_I_RExt_SHARP_1.bin,TSCTX_10bit_I_RExt_SHARP_1.md5,10 -+0,RExt/TSCTX_10bit_RExt_SHARP_1,TSCTX_10bit_RExt_SHARP_1.bin,TSCTX_10bit_RExt_SHARP_1.md5,10 -+0,RExt/TSCTX_12bit_I_RExt_SHARP_1,TSCTX_12bit_I_RExt_SHARP_1.bin,TSCTX_12bit_I_RExt_SHARP_1.md5,8 -+0,RExt/TSCTX_12bit_RExt_SHARP_1,TSCTX_12bit_RExt_SHARP_1.bin,TSCTX_12bit_RExt_SHARP_1.md5,8 -+0,RExt/TSCTX_8bit_I_RExt_SHARP_1,TSCTX_8bit_I_RExt_SHARP_1.bin,TSCTX_8bit_I_RExt_SHARP_1.md5,8 -+0,RExt/TSCTX_8bit_RExt_SHARP_1,TSCTX_8bit_RExt_SHARP_1.bin,TSCTX_8bit_RExt_SHARP_1.md5,8 -+0,RExt/WAVETILES_RExt_Sony_2,WAVETILES_RExt_Sony_2.bit,WAVETILES_RExt_Sony_2.md5,8 -+1,local/sao_cu16_mobile_344x280,sao_cu16_mobile_344x280.265,sao_cu16_mobile_344x280.md5,8 -+1,local/dblk_cu16_mobile_344x280,dblk_cu16_mobile_344x280.265,dblk_cu16_mobile_344x280.md5,8 -+1,local/dblksao_cu16_mobile_344x280,dblksao_cu16_mobile_344x280.265,dblksao_cu16_mobile_344x280.md5,8 -+1,local/dblk_pu32_horses_832x448,dblk_pu32_horses_832x448.265,dblk_pu32_horses_832x448.md5,8 -+1,local/intra_pred_21_laps,intra_pred_21_laps.265,intra_pred_21_laps.md5,8 -diff --git a/pi-util/conf_h265.2016_HEVC_v1.csv b/pi-util/conf_h265.2016_HEVC_v1.csv -new file mode 100644 -index 0000000000..6082641271 ---- /dev/null -+++ b/pi-util/conf_h265.2016_HEVC_v1.csv -@@ -0,0 +1,147 @@ -+1,AMP_A_Samsung_7,AMP_A_Samsung_7.bin,AMP_A_Samsung_7.md5 -+1,AMP_B_Samsung_7,AMP_B_Samsung_7.bin,AMP_B_Samsung_7.md5 -+1,AMP_D_Hisilicon_3,AMP_D_Hisilicon.bit,AMP_D_Hisilicon_3.yuv.md5 -+1,AMP_E_Hisilicon_3,AMP_E_Hisilicon.bit,AMP_E_Hisilicon_3.yuv.md5 -+1,AMP_F_Hisilicon_3,AMP_F_Hisilicon_3.bit,AMP_F_Hisilicon_3.yuv.md5 -+1,AMVP_A_MTK_4,AMVP_A_MTK_4.bit,AMVP_A_MTK_4.md5 -+1,AMVP_B_MTK_4,AMVP_B_MTK_4.bit,AMVP_B_MTK_4.md5 -+1,AMVP_C_Samsung_7,AMVP_C_Samsung_7.bin,AMVP_C_Samsung_7.md5 -+1,BUMPING_A_ericsson_1,BUMPING_A_ericsson_1.bit,BUMPING_A_ericsson_1.md5 -+1,CAINIT_A_SHARP_4,CAINIT_A_SHARP_4.bit,CAINIT_A_SHARP_4.md5 -+1,CAINIT_B_SHARP_4,CAINIT_B_SHARP_4.bit,CAINIT_B_SHARP_4.md5 -+1,CAINIT_C_SHARP_3,CAINIT_C_SHARP_3.bit,CAINIT_C_SHARP_3.md5 -+1,CAINIT_D_SHARP_3,CAINIT_D_SHARP_3.bit,CAINIT_D_SHARP_3.md5 -+1,CAINIT_E_SHARP_3,CAINIT_E_SHARP_3.bit,CAINIT_E_SHARP_3.md5 -+1,CAINIT_F_SHARP_3,CAINIT_F_SHARP_3.bit,CAINIT_F_SHARP_3.md5 -+1,CAINIT_G_SHARP_3,CAINIT_G_SHARP_3.bit,CAINIT_G_SHARP_3.md5 -+1,CAINIT_H_SHARP_3,CAINIT_H_SHARP_3.bit,CAINIT_H_SHARP_3.md5 -+1,CIP_A_Panasonic_3,CIP_A_Panasonic_3.bit,CIP_A_Panasonic_3_yuv.md5 -+1,cip_B_NEC_3,cip_B_NEC_3.bit,cip_B_NEC_3.md5 -+1,CIP_C_Panasonic_2,CIP_C_Panasonic_2.bit,CIP_C_Panasonic_2_yuv.md5 -+1,CONFWIN_A_Sony_1,CONFWIN_A_Sony_1.bit,CONFWIN_A_Sony_1.md5 -+1,DBLK_A_MAIN10_VIXS_4,DBLK_A_MAIN10_VIXS_4.bit,DBLK_A_MAIN10_VIXS_4.md5 -+1,DBLK_A_SONY_3,DBLK_A_SONY_3.bit,DBLK_A_SONY_3.bit.yuv.md5 -+1,DBLK_B_SONY_3,DBLK_B_SONY_3.bit,DBLK_B_SONY_3.bit.yuv.md5 -+1,DBLK_C_SONY_3,DBLK_C_SONY_3.bit,DBLK_C_SONY_3.bit.yuv.md5 -+1,DBLK_D_VIXS_2,DBLK_D_VIXS_2.bit,DBLK_D_VIXS_2_yuv.md5 -+1,DBLK_E_VIXS_2,DBLK_E_VIXS_2.bit,DBLK_E_VIXS_2_yuv.md5 -+1,DBLK_F_VIXS_2,DBLK_F_VIXS_2.bit,DBLK_F_VIXS_2_yuv.md5 -+1,DBLK_G_VIXS_2,DBLK_G_VIXS_2.bit,DBLK_G_VIXS_2_yuv.md5 -+1,DELTAQP_A_BRCM_4,DELTAQP_A_BRCM_4.bit,DELTAQP_A_BRCM_4_yuv.md5 -+1,DELTAQP_B_SONY_3,DELTAQP_B_SONY_3.bit,DELTAQP_B_SONY_3.bit.yuv.md5 -+1,DELTAQP_C_SONY_3,DELTAQP_C_SONY_3.bit,DELTAQP_C_SONY_3.bit.yuv.md5 -+1,DSLICE_A_HHI_5,DSLICE_A_HHI_5.bin,DSLICE_A_HHI_5.md5 -+1,DSLICE_B_HHI_5,DSLICE_B_HHI_5.bin,DSLICE_B_HHI_5.md5 -+1,DSLICE_C_HHI_5,DSLICE_C_HHI_5.bin,DSLICE_C_HHI_5.md5 -+1,ENTP_A_QUALCOMM_1,ENTP_A_Qualcomm_1.bit,ENTP_A_Qualcomm_1.md5 -+1,ENTP_B_Qualcomm_1,ENTP_B_Qualcomm_1.bit,ENTP_B_Qualcomm_1.md5 -+1,ENTP_C_Qualcomm_1,ENTP_C_Qualcomm_1.bit,ENTP_C_Qualcomm_1.md5 -+1,EXT_A_ericsson_4,EXT_A_ericsson_4.bit,EXT_A_ericsson_4.md5 -+1,FILLER_A_Sony_1,FILLER_A_Sony_1.bit,FILLER_A_Sony_1.md5 -+1,HRD_A_Fujitsu_3,HRD_A_Fujitsu_3.bin,HRD_A_Fujitsu_3.md5 -+1,INITQP_A_Sony_1,INITQP_A_Sony_1.bit,INITQP_A_Sony_1.md5 -+1,INITQP_B_Main10_Sony_1,INITQP_B_Main10_Sony_1.bit,INITQP_B_Main10_Sony_1.md5 -+1,ipcm_A_NEC_3,ipcm_A_NEC_3.bit,ipcm_A_NEC_3.md5 -+1,ipcm_B_NEC_3,ipcm_B_NEC_3.bit,ipcm_B_NEC_3.md5 -+1,ipcm_C_NEC_3,ipcm_C_NEC_3.bit,ipcm_C_NEC_3.md5 -+1,ipcm_D_NEC_3,ipcm_D_NEC_3.bit,ipcm_D_NEC_3.md5 -+1,ipcm_E_NEC_2,ipcm_E_NEC_2.bit,ipcm_E_NEC_2.md5 -+1,IPRED_A_docomo_2,IPRED_A_docomo_2.bit,IPRED_A_docomo_2.md5 -+1,IPRED_B_Nokia_3,IPRED_B_Nokia_3.bit,IPRED_B_Nokia_3_yuv.md5 -+1,IPRED_C_Mitsubishi_3,IPRED_C_Mitsubishi_3.bit,IPRED_C_Mitsubishi_3_yuv.md5 -+1,LS_A_Orange_2,LS_A_Orange_2.bit,LS_A_Orange_2_yuv.md5 -+1,LS_B_Orange_4,LS_B_Orange_4.bit,LS_B_Orange_4_yuv.md5 -+1,LTRPSPS_A_Qualcomm_1,LTRPSPS_A_Qualcomm_1.bit,LTRPSPS_A_Qualcomm_1.md5 -+1,MAXBINS_A_TI_5,MAXBINS_A_TI_5.bit,MAXBINS_A_TI_5_yuv.md5 -+1,MAXBINS_B_TI_5,MAXBINS_B_TI_5.bit,MAXBINS_B_TI_5_yuv.md5 -+1,MAXBINS_C_TI_5,MAXBINS_C_TI_5.bit,MAXBINS_C_TI_5_yuv.md5 -+1,MERGE_A_TI_3,MERGE_A_TI_3.bit,MERGE_A_TI_3.md5 -+1,MERGE_B_TI_3,MERGE_B_TI_3.bit,MERGE_B_TI_3.md5 -+1,MERGE_C_TI_3,MERGE_C_TI_3.bit,MERGE_C_TI_3.md5 -+1,MERGE_D_TI_3,MERGE_D_TI_3.bit,MERGE_D_TI_3.md5 -+1,MERGE_E_TI_3,MERGE_E_TI_3.bit,MERGE_E_TI_3.md5 -+1,MERGE_F_MTK_4,MERGE_F_MTK_4.bit,MERGE_F_MTK_4.md5 -+1,MERGE_G_HHI_4,MERGE_G_HHI_4.bit,MERGE_G_HHI_4.md5 -+1,MVCLIP_A_qualcomm_3,MVCLIP_A_qualcomm_3.bit,MVCLIP_A_qualcomm_3.yuv.md5 -+1,MVDL1ZERO_A_docomo_4,MVDL1ZERO_A_docomo_4.bit,MVDL1ZERO_A_docomo_4.md5 -+1,MVEDGE_A_qualcomm_3,MVEDGE_A_qualcomm_3.bit,MVEDGE_A_qualcomm_3.yuv.md5 -+1,NoOutPrior_A_Qualcomm_1,NoOutPrior_A_Qualcomm_1.bit,NoOutPrior_A_Qualcomm_1.md5 -+1,NoOutPrior_B_Qualcomm_1,NoOutPrior_B_Qualcomm_1.bit,NoOutPrior_B_Qualcomm_1.md5 -+1,NUT_A_ericsson_5,NUT_A_ericsson_5.bit,NUT_A_ericsson_5.md5 -+1,OPFLAG_A_Qualcomm_1,OPFLAG_A_Qualcomm_1.bit,OPFLAG_A_Qualcomm_1.md5 -+1,OPFLAG_B_Qualcomm_1,OPFLAG_B_Qualcomm_1.bit,OPFLAG_B_Qualcomm_1.md5 -+1,OPFLAG_C_Qualcomm_1,OPFLAG_C_Qualcomm_1.bit,OPFLAG_C_Qualcomm_1.md5 -+1,PICSIZE_A_Bossen_1,PICSIZE_A_Bossen_1.bin,PICSIZE_A_Bossen_1.md5 -+1,PICSIZE_B_Bossen_1,PICSIZE_B_Bossen_1.bin,PICSIZE_B_Bossen_1.md5 -+1,PICSIZE_C_Bossen_1,PICSIZE_C_Bossen_1.bin,PICSIZE_C_Bossen_1.md5 -+1,PICSIZE_D_Bossen_1,PICSIZE_D_Bossen_1.bin,PICSIZE_D_Bossen_1.md5 -+1,PMERGE_A_TI_3,PMERGE_A_TI_3.bit,PMERGE_A_TI_3.md5 -+1,PMERGE_B_TI_3,PMERGE_B_TI_3.bit,PMERGE_B_TI_3.md5 -+1,PMERGE_C_TI_3,PMERGE_C_TI_3.bit,PMERGE_C_TI_3.md5 -+1,PMERGE_D_TI_3,PMERGE_D_TI_3.bit,PMERGE_D_TI_3.md5 -+1,PMERGE_E_TI_3,PMERGE_E_TI_3.bit,PMERGE_E_TI_3.md5 -+1,POC_A_Bossen_3,POC_A_Bossen_3.bin,POC_A_Bossen_3.md5 -+1,PPS_A_qualcomm_7,PPS_A_qualcomm_7.bit,PPS_A_qualcomm_7.yuv.md5 -+1,PS_B_VIDYO_3,PS_B_VIDYO_3.bit,PS_B_VIDYO_3_yuv.md5 -+1,RAP_A_docomo_6,RAP_A_docomo_6.bit,RAP_A_docomo_6.md5 -+1,RAP_B_Bossen_2,RAP_B_Bossen_2.bit,RAP_B_Bossen_2.md5 -+1,RPLM_A_qualcomm_4,RPLM_A_qualcomm_4.bit,RPLM_A_qualcomm_4.yuv.md5 -+1,RPLM_B_qualcomm_4,RPLM_B_qualcomm_4.bit,RPLM_B_qualcomm_4.yuv.md5 -+1,RPS_A_docomo_5,RPS_A_docomo_5.bit,RPS_A_docomo_5.md5 -+1,RPS_B_qualcomm_5,RPS_B_qualcomm_5.bit,RPS_B_qualcomm_5.yuv.md5 -+1,RPS_C_ericsson_5,RPS_C_ericsson_5.bit,RPS_C_ericsson_5.md5 -+1,RPS_D_ericsson_6,RPS_D_ericsson_6.bit,RPS_D_ericsson_6.md5 -+1,RPS_E_qualcomm_5,RPS_E_qualcomm_5.bit,RPS_E_qualcomm_5.yuv.md5 -+1,RPS_F_docomo_2,RPS_F_docomo_2.bit,RPS_F_docomo_2.md5 -+1,RQT_A_HHI_4,RQT_A_HHI_4.bit,RQT_A_HHI_4.md5 -+1,RQT_B_HHI_4,RQT_B_HHI_4.bit,RQT_B_HHI_4.md5 -+1,RQT_C_HHI_4,RQT_C_HHI_4.bit,RQT_C_HHI_4.md5 -+1,RQT_D_HHI_4,RQT_D_HHI_4.bit,RQT_D_HHI_4.md5 -+1,RQT_E_HHI_4,RQT_E_HHI_4.bit,RQT_E_HHI_4.md5 -+1,RQT_F_HHI_4,RQT_F_HHI_4.bit,RQT_F_HHI_4.md5 -+1,RQT_G_HHI_4,RQT_G_HHI_4.bit,RQT_G_HHI_4.md5 -+1,SAO_A_MediaTek_4,SAO_A_MediaTek_4.bit,SAO_A_MediaTek_4.md5 -+1,SAO_B_MediaTek_5,SAO_B_MediaTek_5.bit,SAO_B_MediaTek_5.md5 -+1,SAO_C_Samsung_5,SAO_C_Samsung_5.bin,SAO_C_Samsung_5.md5 -+1,SAO_D_Samsung_5,SAO_D_Samsung_5.bin,SAO_D_Samsung_5.md5 -+1,SAO_E_Canon_4,SAO_E_Canon_4.bit,SAO_E_Canon_4.md5 -+1,SAO_F_Canon_3,SAO_F_Canon_3.bit,SAO_F_Canon_3.md5 -+1,SAO_G_Canon_3,SAO_G_Canon_3.bit,SAO_G_Canon_3.md5 -+1,SAO_H_Parabola_1,SAO_H_Parabola_1.bit,SAO_H_Parabola_1.md5 -+2,SAODBLK_A_MainConcept_4,SAODBLK_A_MainConcept_4.bin,SAODBLK_A_MainConcept_4_md5.txt -+2,SAODBLK_B_MainConcept_4,SAODBLK_B_MainConcept_4.bin,SAODBLK_B_MainConcept_4_md5.txt -+1,SDH_A_Orange_4,SDH_A_Orange_4.bit,SDH_A_Orange_4_yuv.md5 -+1,SLICES_A_Rovi_3,SLICES_A_Rovi_3.bin,SLICES_A_Rovi_3.md5 -+1,SLIST_A_Sony_5,SLIST_A_Sony_5.bin,SLIST_A_Sony_5_yuv.md5 -+1,SLIST_B_Sony_9,SLIST_B_Sony_9.bin,SLIST_B_Sony_9_yuv.md5 -+1,SLIST_C_Sony_4,SLIST_C_Sony_4.bin,SLIST_C_Sony_4_yuv.md5 -+1,SLIST_D_Sony_9,str.bin,SLIST_D_Sony_9_yuv.md5 -+1,SLPPLP_A_VIDYO_2,SLPPLP_A_VIDYO_2.bit,SLPPLP_A_VIDYO_2_yuv.md5 -+1,STRUCT_A_Samsung_7,STRUCT_A_Samsung_7.bin,STRUCT_A_Samsung_7.md5 -+1,STRUCT_B_Samsung_7,STRUCT_B_Samsung_7.bin,STRUCT_B_Samsung_7.md5 -+1,TILES_A_Cisco_2,TILES_A_Cisco_2.bin,TILES_A_Cisco_2_yuv.md5 -+1,TILES_B_Cisco_1,TILES_B_Cisco_1.bin,TILES_B_Cisco_1_yuv.md5 -+1,TMVP_A_MS_3,TMVP_A_MS_3.bit,TMVP_A_MS_3.yuv.md5 -+1,TSCL_A_VIDYO_5,TSCL_A_VIDYO_5.bit,TSCL_A_VIDYO_5_yuv.md5 -+1,TSCL_B_VIDYO_4,TSCL_B_VIDYO_4.bit,TSCL_B_VIDYO_4_yuv.md5 -+1,TSKIP_A_MS_3,TSKIP_A_MS_3.bit,TSKIP_A_MS_3.yuv.md5 -+3,TSUNEQBD_A_MAIN10_Technicolor_2,TSUNEQBD_A_MAIN10_Technicolor_2.bit,TSUNEQBD_A_MAIN10_Technicolor_2_yuv.md5, # unequal bit depth -+1,TUSIZE_A_Samsung_1,TUSIZE_A_Samsung_1.bin,TUSIZE_A_Samsung_1.md5 -+1,VPSID_A_VIDYO_2,VPSID_A_VIDYO_2.bit,VPSID_A_VIDYO_2_yuv.md5 -+3,VPSSPSPPS_A_MainConcept_1,VPSSPSPPS_A_MainConcept_1.bin,VPSSPSPPS_A_MainConcept_1_md5.txt, # ??? -+1,WP_A_MAIN10_Toshiba_3,WP_A_MAIN10_Toshiba_3.bit,WP_A_MAIN10_Toshiba_3_yuv.md5 -+1,WP_A_Toshiba_3,WP_A_Toshiba_3.bit,WP_A_Toshiba_3_yuv.md5 -+1,WP_B_Toshiba_3,WP_B_Toshiba_3.bit,WP_B_Toshiba_3_yuv.md5 -+1,WP_MAIN10_B_Toshiba_3,WP_MAIN10_B_Toshiba_3.bit,WP_MAIN10_B_Toshiba_3_yuv.md5 -+1,WPP_A_ericsson_MAIN10_2,WPP_A_ericsson_MAIN10_2.bit,WPP_A_ericsson_MAIN10_yuv.md5 -+1,WPP_A_ericsson_MAIN_2,WPP_A_ericsson_MAIN_2.bit,WPP_A_ericsson_MAIN_2_yuv.md5 -+1,WPP_B_ericsson_MAIN10_2,WPP_B_ericsson_MAIN10_2.bit,WPP_B_ericsson_MAIN10_yuv.md5 -+1,WPP_B_ericsson_MAIN_2,WPP_B_ericsson_MAIN_2.bit,WPP_B_ericsson_MAIN_2_yuv.md5 -+1,WPP_C_ericsson_MAIN10_2,WPP_C_ericsson_MAIN10_2.bit,WPP_C_ericsson_MAIN10_yuv.md5 -+1,WPP_C_ericsson_MAIN_2,WPP_C_ericsson_MAIN_2.bit,WPP_C_ericsson_MAIN_2_yuv.md5 -+1,WPP_D_ericsson_MAIN10_2,WPP_D_ericsson_MAIN10_2.bit,WPP_D_ericsson_MAIN10_yuv.md5 -+1,WPP_D_ericsson_MAIN_2,WPP_D_ericsson_MAIN_2.bit,WPP_D_ericsson_MAIN_2_yuv.md5 -+1,WPP_E_ericsson_MAIN10_2,WPP_E_ericsson_MAIN10_2.bit,WPP_E_ericsson_MAIN10_yuv.md5 -+1,WPP_E_ericsson_MAIN_2,WPP_E_ericsson_MAIN_2.bit,WPP_E_ericsson_MAIN_2_yuv.md5 -+1,WPP_F_ericsson_MAIN10_2,WPP_F_ericsson_MAIN10_2.bit,WPP_F_ericsson_MAIN10_yuv.md5 -+1,WPP_F_ericsson_MAIN_2,WPP_F_ericsson_MAIN_2.bit,WPP_F_ericsson_MAIN_2_yuv.md5 -diff --git a/pi-util/conf_h265.csv b/pi-util/conf_h265.csv -new file mode 100644 -index 0000000000..fc14f2a3c2 ---- /dev/null -+++ b/pi-util/conf_h265.csv -@@ -0,0 +1,144 @@ -+1,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_1,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_1.bit,ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_1.md5 -+1,AMP_A_Samsung_6,AMP_A_Samsung_6.bin,AMP_A_Samsung_6.md5 -+1,AMP_B_Samsung_6,AMP_B_Samsung_6.bin,AMP_B_Samsung_6.md5 -+1,AMP_D_Hisilicon_3,AMP_D_Hisilicon.bit,AMP_D_Hisilicon_3.yuv.md5 -+1,AMP_E_Hisilicon_3,AMP_E_Hisilicon.bit,AMP_E_Hisilicon_3.yuv.md5 -+1,AMP_F_Hisilicon_3,AMP_F_Hisilicon_3.bit,AMP_F_Hisilicon_3.yuv.md5 -+1,AMVP_A_MTK_4,AMVP_A_MTK_4.bit,AMVP_A_MTK_4.md5 -+1,AMVP_B_MTK_4,AMVP_B_MTK_4.bit,AMVP_B_MTK_4.md5 -+1,AMVP_C_Samsung_6,AMVP_C_Samsung_6.bin,AMVP_C_Samsung_6.md5 -+1,BUMPING_A_ericsson_1,BUMPING_A_ericsson_1.bit,BUMPING_A_ericsson_1.md5 -+1,CAINIT_A_SHARP_4,CAINIT_A_SHARP_4.bit,CAINIT_A_SHARP_4.md5 -+1,CAINIT_B_SHARP_4,CAINIT_B_SHARP_4.bit,CAINIT_B_SHARP_4.md5 -+1,CAINIT_C_SHARP_3,CAINIT_C_SHARP_3.bit,CAINIT_C_SHARP_3.md5 -+1,CAINIT_D_SHARP_3,CAINIT_D_SHARP_3.bit,CAINIT_D_SHARP_3.md5 -+1,CAINIT_E_SHARP_3,CAINIT_E_SHARP_3.bit,CAINIT_E_SHARP_3.md5 -+1,CAINIT_F_SHARP_3,CAINIT_F_SHARP_3.bit,CAINIT_F_SHARP_3.md5 -+1,CAINIT_G_SHARP_3,CAINIT_G_SHARP_3.bit,CAINIT_G_SHARP_3.md5 -+1,CAINIT_H_SHARP_3,CAINIT_H_SHARP_3.bit,CAINIT_H_SHARP_3.md5 -+1,CIP_A_Panasonic_3,CIP_A_Panasonic_3.bit,CIP_A_Panasonic_3_yuv.md5 -+1,cip_B_NEC_3,cip_B_NEC_3.bit,cip_B_NEC_3.md5 -+1,CIP_C_Panasonic_2,CIP_C_Panasonic_2.bit,CIP_C_Panasonic_2_yuv.md5 -+1,CONFWIN_A_Sony_1,CONFWIN_A_Sony_1.bit,CONFWIN_A_Sony_1.md5 -+1,DBLK_A_MAIN10_VIXS_3,DBLK_A_MAIN10_VIXS_3.bit,DBLK_A_MAIN10_VIXS_3.md5 -+1,DBLK_A_SONY_3,DBLK_A_SONY_3.bit,DBLK_A_SONY_3.bit.yuv.md5 -+1,DBLK_B_SONY_3,DBLK_B_SONY_3.bit,DBLK_B_SONY_3.bit.yuv.md5 -+1,DBLK_C_SONY_3,DBLK_C_SONY_3.bit,DBLK_C_SONY_3.bit.yuv.md5 -+1,DBLK_D_VIXS_2,DBLK_D_VIXS_2.bit,DBLK_D_VIXS_2_yuv.md5 -+1,DBLK_E_VIXS_2,DBLK_E_VIXS_2.bit,DBLK_E_VIXS_2_yuv.md5 -+1,DBLK_F_VIXS_2,DBLK_F_VIXS_2.bit,DBLK_F_VIXS_2_yuv.md5 -+1,DBLK_G_VIXS_2,DBLK_G_VIXS_2.bit,DBLK_G_VIXS_2_yuv.md5 -+1,DELTAQP_A_BRCM_4,DELTAQP_A_BRCM_4.bit,DELTAQP_A_BRCM_4_yuv.md5 -+1,DELTAQP_B_SONY_3,DELTAQP_B_SONY_3.bit,DELTAQP_B_SONY_3.bit.yuv.md5 -+1,DELTAQP_C_SONY_3,DELTAQP_C_SONY_3.bit,DELTAQP_C_SONY_3.bit.yuv.md5 -+1,DSLICE_A_HHI_5,DSLICE_A_HHI_5.bin,DSLICE_A_HHI_5.md5 -+1,DSLICE_B_HHI_5,DSLICE_B_HHI_5.bin,DSLICE_B_HHI_5.md5 -+1,DSLICE_C_HHI_5,DSLICE_C_HHI_5.bin,DSLICE_C_HHI_5.md5 -+1,ENTP_A_QUALCOMM_1,ENTP_A_Qualcomm_1.bit,ENTP_A_Qualcomm_1.md5 -+1,ENTP_B_Qualcomm_1,ENTP_B_Qualcomm_1.bit,ENTP_B_Qualcomm_1.md5 -+1,ENTP_C_Qualcomm_1,ENTP_C_Qualcomm_1.bit,ENTP_C_Qualcomm_1.md5 -+1,EXT_A_ericsson_4,EXT_A_ericsson_4.bit,EXT_A_ericsson_4.md5 -+1,FILLER_A_Sony_1,FILLER_A_Sony_1.bit,FILLER_A_Sony_1.md5 -+1,HRD_A_Fujitsu_3,HRD_A_Fujitsu_3.bin,HRD_A_Fujitsu_3.md5 -+1,INITQP_A_Sony_1,INITQP_A_Sony_1.bit,INITQP_A_Sony_1.md5 -+1,INITQP_B_Main10_Sony_1,INITQP_B_Main10_Sony_1.bit,INITQP_B_Main10_Sony_1.md5 -+1,ipcm_A_NEC_3,ipcm_A_NEC_3.bit,ipcm_A_NEC_3.md5 -+1,ipcm_B_NEC_3,ipcm_B_NEC_3.bit,ipcm_B_NEC_3.md5 -+1,ipcm_C_NEC_3,ipcm_C_NEC_3.bit,ipcm_C_NEC_3.md5 -+1,ipcm_D_NEC_3,ipcm_D_NEC_3.bit,ipcm_D_NEC_3.md5 -+1,ipcm_E_NEC_2,ipcm_E_NEC_2.bit,ipcm_E_NEC_2.md5 -+1,IPRED_A_docomo_2,IPRED_A_docomo_2.bit,IPRED_A_docomo_2.md5 -+1,IPRED_B_Nokia_3,IPRED_B_Nokia_3.bit,IPRED_B_Nokia_3_yuv.md5 -+1,IPRED_C_Mitsubishi_3,IPRED_C_Mitsubishi_3.bit,IPRED_C_Mitsubishi_3_yuv.md5 -+1,LS_A_Orange_2,LS_A_Orange_2.bit,LS_A_Orange_2_yuv.md5 -+1,LS_B_Orange_4,LS_B_Orange_4.bit,LS_B_Orange_4_yuv.md5 -+1,LTRPSPS_A_Qualcomm_1,LTRPSPS_A_Qualcomm_1.bit,LTRPSPS_A_Qualcomm_1.md5 -+1,MAXBINS_A_TI_4,MAXBINS_A_TI_4.bit,MAXBINS_A_TI_4.md5 -+1,MAXBINS_B_TI_4,MAXBINS_B_TI_4.bit,MAXBINS_B_TI_4.md5 -+1,MAXBINS_C_TI_4,MAXBINS_C_TI_4.bit,MAXBINS_C_TI_4.md5 -+1,MERGE_A_TI_3,MERGE_A_TI_3.bit,MERGE_A_TI_3.md5 -+1,MERGE_B_TI_3,MERGE_B_TI_3.bit,MERGE_B_TI_3.md5 -+1,MERGE_C_TI_3,MERGE_C_TI_3.bit,MERGE_C_TI_3.md5 -+1,MERGE_D_TI_3,MERGE_D_TI_3.bit,MERGE_D_TI_3.md5 -+1,MERGE_E_TI_3,MERGE_E_TI_3.bit,MERGE_E_TI_3.md5 -+1,MERGE_F_MTK_4,MERGE_F_MTK_4.bit,MERGE_F_MTK_4.md5 -+1,MERGE_G_HHI_4,MERGE_G_HHI_4.bit,MERGE_G_HHI_4.md5 -+1,MVCLIP_A_qualcomm_3,MVCLIP_A_qualcomm_3.bit,MVCLIP_A_qualcomm_3.yuv.md5 -+1,MVDL1ZERO_A_docomo_4,MVDL1ZERO_A_docomo_4.bit,MVDL1ZERO_A_docomo_4.md5 -+1,MVEDGE_A_qualcomm_3,MVEDGE_A_qualcomm_3.bit,MVEDGE_A_qualcomm_3.yuv.md5 -+1,NoOutPrior_A_Qualcomm_1,NoOutPrior_A_Qualcomm_1.bit,NoOutPrior_A_Qualcomm_1.md5 -+1,NoOutPrior_B_Qualcomm_1,NoOutPrior_B_Qualcomm_1.bit,NoOutPrior_B_Qualcomm_1.md5 -+1,NUT_A_ericsson_5,NUT_A_ericsson_5.bit,NUT_A_ericsson_5.md5 -+1,OPFLAG_A_Qualcomm_1,OPFLAG_A_Qualcomm_1.bit,OPFLAG_A_Qualcomm_1.md5 -+1,OPFLAG_B_Qualcomm_1,OPFLAG_B_Qualcomm_1.bit,OPFLAG_B_Qualcomm_1.md5 -+1,OPFLAG_C_Qualcomm_1,OPFLAG_C_Qualcomm_1.bit,OPFLAG_C_Qualcomm_1.md5 -+1,PICSIZE_A_Bossen_1,PICSIZE_A_Bossen_1.bin,PICSIZE_A_Bossen_1.md5 -+1,PICSIZE_B_Bossen_1,PICSIZE_B_Bossen_1.bin,PICSIZE_B_Bossen_1.md5 -+1,PICSIZE_C_Bossen_1,PICSIZE_C_Bossen_1.bin,PICSIZE_C_Bossen_1.md5 -+1,PICSIZE_D_Bossen_1,PICSIZE_D_Bossen_1.bin,PICSIZE_D_Bossen_1.md5 -+1,PMERGE_A_TI_3,PMERGE_A_TI_3.bit,PMERGE_A_TI_3.md5 -+1,PMERGE_B_TI_3,PMERGE_B_TI_3.bit,PMERGE_B_TI_3.md5 -+1,PMERGE_C_TI_3,PMERGE_C_TI_3.bit,PMERGE_C_TI_3.md5 -+1,PMERGE_D_TI_3,PMERGE_D_TI_3.bit,PMERGE_D_TI_3.md5 -+1,PMERGE_E_TI_3,PMERGE_E_TI_3.bit,PMERGE_E_TI_3.md5 -+1,POC_A_Bossen_3,POC_A_Bossen_3.bin,POC_A_Bossen_3.md5 -+1,PPS_A_qualcomm_7,PPS_A_qualcomm_7.bit,PPS_A_qualcomm_7.yuv.md5 -+1,PS_B_VIDYO_3,PS_B_VIDYO_3.bit,PS_B_VIDYO_3_yuv.md5 -+1,RAP_A_docomo_6,RAP_A_docomo_6.bit,RAP_A_docomo_6.md5 -+1,RAP_B_Bossen_2,RAP_B_Bossen_2.bit,RAP_B_Bossen_2.md5 -+1,RPLM_A_qualcomm_4,RPLM_A_qualcomm_4.bit,RPLM_A_qualcomm_4.yuv.md5 -+1,RPLM_B_qualcomm_4,RPLM_B_qualcomm_4.bit,RPLM_B_qualcomm_4.yuv.md5 -+1,RPS_A_docomo_5,RPS_A_docomo_5.bit,RPS_A_docomo_5.md5 -+1,RPS_B_qualcomm_5,RPS_B_qualcomm_5.bit,RPS_B_qualcomm_5.yuv.md5 -+1,RPS_C_ericsson_5,RPS_C_ericsson_5.bit,RPS_C_ericsson_5.md5 -+1,RPS_D_ericsson_6,RPS_D_ericsson_6.bit,RPS_D_ericsson_6.md5 -+1,RPS_E_qualcomm_5,RPS_E_qualcomm_5.bit,RPS_E_qualcomm_5.yuv.md5 -+1,RPS_F_docomo_2,RPS_F_docomo_2.bit,RPS_F_docomo_2.md5 -+1,RQT_A_HHI_4,RQT_A_HHI_4.bit,RQT_A_HHI_4.md5 -+1,RQT_B_HHI_4,RQT_B_HHI_4.bit,RQT_B_HHI_4.md5 -+1,RQT_C_HHI_4,RQT_C_HHI_4.bit,RQT_C_HHI_4.md5 -+1,RQT_D_HHI_4,RQT_D_HHI_4.bit,RQT_D_HHI_4.md5 -+1,RQT_E_HHI_4,RQT_E_HHI_4.bit,RQT_E_HHI_4.md5 -+1,RQT_F_HHI_4,RQT_F_HHI_4.bit,RQT_F_HHI_4.md5 -+1,RQT_G_HHI_4,RQT_G_HHI_4.bit,RQT_G_HHI_4.md5 -+1,SAO_A_MediaTek_4,SAO_A_MediaTek_4.bit,SAO_A_MediaTek_4.md5 -+1,SAO_B_MediaTek_5,SAO_B_MediaTek_5.bit,SAO_B_MediaTek_5.md5 -+1,SAO_C_Samsung_5,SAO_C_Samsung_5.bin,SAO_C_Samsung_5.md5 -+1,SAO_D_Samsung_5,SAO_D_Samsung_5.bin,SAO_D_Samsung_5.md5 -+1,SAO_E_Canon_4,SAO_E_Canon_4.bit,SAO_E_Canon_4.md5 -+1,SAO_F_Canon_3,SAO_F_Canon_3.bit,SAO_F_Canon_3.md5 -+1,SAO_G_Canon_3,SAO_G_Canon_3.bit,SAO_G_Canon_3.md5 -+1,SDH_A_Orange_4,SDH_A_Orange_4.bit,SDH_A_Orange_4_yuv.md5 -+1,SLICES_A_Rovi_3,SLICES_A_Rovi_3.bin,SLICES_A_Rovi_3.md5 -+1,SLIST_A_Sony_4,str.bin,SLIST_A_Sony_4_yuv.md5 -+1,SLIST_B_Sony_8,str.bin,SLIST_B_Sony_8_yuv.md5 -+1,SLIST_C_Sony_3,str.bin,SLIST_C_Sony_3_yuv.md5 -+1,SLIST_D_Sony_9,str.bin,SLIST_D_Sony_9_yuv.md5 -+1,SLPPLP_A_VIDYO_2,SLPPLP_A_VIDYO_2.bit,SLPPLP_A_VIDYO_2_yuv.md5 -+1,STRUCT_A_Samsung_6,STRUCT_A_Samsung_6.bin,STRUCT_A_Samsung_6.md5 -+1,STRUCT_B_Samsung_6,STRUCT_B_Samsung_6.bin,STRUCT_B_Samsung_6.md5 -+1,TILES_A_Cisco_2,TILES_A_Cisco_2.bin,TILES_A_Cisco_2_yuv.md5 -+1,TILES_B_Cisco_1,TILES_B_Cisco_1.bin,TILES_B_Cisco_1_yuv.md5 -+1,TMVP_A_MS_3,TMVP_A_MS_3.bit,TMVP_A_MS_3.yuv.md5 -+1,TSCL_A_VIDYO_5,TSCL_A_VIDYO_5.bit,TSCL_A_VIDYO_5_yuv.md5 -+1,TSCL_B_VIDYO_4,TSCL_B_VIDYO_4.bit,TSCL_B_VIDYO_4_yuv.md5 -+1,TSKIP_A_MS_3,TSKIP_A_MS_3.bit,TSKIP_A_MS_3.yuv.md5 -+0,TSUNEQBD_A_MAIN10_Technicolor_2,TSUNEQBD_A_MAIN10_Technicolor_2.bit,TSUNEQBD_A_MAIN10_Technicolor_2_yuv.md5, # Y/C bit depth unmatched -+1,TUSIZE_A_Samsung_1,TUSIZE_A_Samsung_1.bin,TUSIZE_A_Samsung_1.md5 -+1,VPSID_A_VIDYO_2,VPSID_A_VIDYO_2.bit,VPSID_A_VIDYO_2_yuv.md5 -+1,WP_A_MAIN10_Toshiba_3,WP_A_MAIN10_Toshiba_3.bit,WP_A_MAIN10_Toshiba_3_yuv.md5 -+1,WP_A_Toshiba_3,WP_A_Toshiba_3.bit,WP_A_Toshiba_3_yuv.md5 -+1,WP_B_Toshiba_3,WP_B_Toshiba_3.bit,WP_B_Toshiba_3_yuv.md5 -+1,WP_MAIN10_B_Toshiba_3,WP_MAIN10_B_Toshiba_3.bit,WP_MAIN10_B_Toshiba_3_yuv.md5 -+1,WPP_A_ericsson_MAIN10_2,WPP_A_ericsson_MAIN10_2.bit,WPP_A_ericsson_MAIN10_yuv.md5 -+1,WPP_A_ericsson_MAIN_2,WPP_A_ericsson_MAIN_2.bit,WPP_A_ericsson_MAIN_2_yuv.md5 -+1,WPP_B_ericsson_MAIN10_2,WPP_B_ericsson_MAIN10_2.bit,WPP_B_ericsson_MAIN10_yuv.md5 -+1,WPP_B_ericsson_MAIN_2,WPP_B_ericsson_MAIN_2.bit,WPP_B_ericsson_MAIN_2_yuv.md5 -+1,WPP_C_ericsson_MAIN10_2,WPP_C_ericsson_MAIN10_2.bit,WPP_C_ericsson_MAIN10_yuv.md5 -+1,WPP_C_ericsson_MAIN_2,WPP_C_ericsson_MAIN_2.bit,WPP_C_ericsson_MAIN_2_yuv.md5 -+1,WPP_D_ericsson_MAIN10_2,WPP_D_ericsson_MAIN10_2.bit,WPP_D_ericsson_MAIN10_yuv.md5 -+1,WPP_D_ericsson_MAIN_2,WPP_D_ericsson_MAIN_2.bit,WPP_D_ericsson_MAIN_2_yuv.md5 -+1,WPP_E_ericsson_MAIN10_2,WPP_E_ericsson_MAIN10_2.bit,WPP_E_ericsson_MAIN10_yuv.md5 -+1,WPP_E_ericsson_MAIN_2,WPP_E_ericsson_MAIN_2.bit,WPP_E_ericsson_MAIN_2_yuv.md5 -+1,WPP_F_ericsson_MAIN10_2,WPP_F_ericsson_MAIN10_2.bit,WPP_F_ericsson_MAIN10_yuv.md5 -+1,WPP_F_ericsson_MAIN_2,WPP_F_ericsson_MAIN_2.bit,WPP_F_ericsson_MAIN_2_yuv.md5 -diff --git a/pi-util/conf_native.sh b/pi-util/conf_native.sh -new file mode 100755 -index 0000000000..65576846e8 ---- /dev/null -+++ b/pi-util/conf_native.sh -@@ -0,0 +1,108 @@ -+echo "Configure for native build" -+ -+FFSRC=`pwd` -+MC=`dpkg --print-architecture` -+BUILDBASE=$FFSRC/out -+ -+#RPI_KEEPS="-save-temps=obj" -+RPI_KEEPS="" -+ -+NOSHARED= -+MMAL= -+ -+while [ "$1" != "" ] ; do -+ case $1 in -+ --noshared) -+ NOSHARED=1 -+ ;; -+ --mmal) -+ MMAL=1 -+ ;; -+ *) -+ echo "Usage $0: [--noshared] [--mmal]" -+ exit 1 -+ ;; -+ esac -+ shift -+done -+ -+ -+MCOPTS= -+RPI_INCLUDES= -+RPI_LIBDIRS= -+RPI_DEFINES= -+RPI_EXTRALIBS= -+ -+if [ "$MC" == "arm64" ]; then -+ echo "M/C aarch64" -+ A=aarch64-linux-gnu -+ B=arm64 -+elif [ "$MC" == "armhf" ]; then -+ echo "M/C armv7" -+ A=arm-linux-gnueabihf -+ B=armv7 -+ MCOPTS="--arch=armv6t2 --cpu=cortex-a7" -+ RPI_DEFINES=-mfpu=neon-vfpv4 -+else -+ echo Unexpected architecture $MC -+ exit 1 -+fi -+ -+if [ $MMAL ]; then -+ RPI_OPT_VC=/opt/vc -+ RPI_INCLUDES="-I$RPI_OPT_VC/include -I$RPI_OPT_VC/include/interface/vcos/pthreads -I$RPI_OPT_VC/include/interface/vmcs_host/linux" -+ RPI_LIBDIRS="-L$RPI_OPT_VC/lib" -+ RPI_DEFINES="$RPI_DEFINES -D__VCCOREVER__=0x4000000" -+ RPI_EXTRALIBS="-Wl,--start-group -lbcm_host -lmmal -lmmal_util -lmmal_core -lvcos -lvcsm -lvchostif -lvchiq_arm -Wl,--end-group" -+ RPIOPTS="--enable-mmal --enable-rpi" -+else -+ RPIOPTS="--disable-mmal --enable-sand" -+fi -+ -+C=`lsb_release -sc` -+V=`cat RELEASE` -+ -+SHARED_LIBS="--enable-shared" -+if [ $NOSHARED ]; then -+ SHARED_LIBS="--disable-shared" -+ OUT=$BUILDBASE/$B-$C-$V-static-rel -+ echo Static libs -+else -+ echo Shared libs -+ OUT=$BUILDBASE/$B-$C-$V-shared-rel -+fi -+ -+USR_PREFIX=$OUT/install -+LIB_PREFIX=$USR_PREFIX/lib/$A -+INC_PREFIX=$USR_PREFIX/include/$A -+ -+echo Destination directory: $OUT -+mkdir -p $OUT -+# Nothing under here need worry git - including this .gitignore! -+echo "**" > $BUILDBASE/.gitignore -+cd $OUT -+ -+$FFSRC/configure \ -+ --prefix=$USR_PREFIX\ -+ --libdir=$LIB_PREFIX\ -+ --incdir=$INC_PREFIX\ -+ $MCOPTS\ -+ --disable-stripping\ -+ --disable-thumb\ -+ --enable-v4l2-request\ -+ --enable-libdrm\ -+ --enable-epoxy\ -+ --enable-libudev\ -+ --enable-vout-egl\ -+ --enable-vout-drm\ -+ $SHARED_LIBS\ -+ $RPIOPTS\ -+ --extra-cflags="-ggdb $RPI_KEEPS $RPI_DEFINES $RPI_INCLUDES"\ -+ --extra-cxxflags="$RPI_DEFINES $RPI_INCLUDES"\ -+ --extra-ldflags="$RPI_LIBDIRS"\ -+ --extra-libs="$RPI_EXTRALIBS"\ -+ --extra-version="rpi" -+ -+ -+# gcc option for getting asm listing -+# -Wa,-ahls -diff --git a/pi-util/ffconf.py b/pi-util/ffconf.py -new file mode 100755 -index 0000000000..657568014e ---- /dev/null -+++ b/pi-util/ffconf.py -@@ -0,0 +1,215 @@ -+#!/usr/bin/env python3 -+ -+import string -+import os -+import subprocess -+import re -+import argparse -+import sys -+import csv -+from stat import * -+ -+CODEC_HEVC_RPI = 1 -+HWACCEL_RPI = 2 -+HWACCEL_DRM = 3 -+HWACCEL_VAAPI = 4 -+ -+def testone(fileroot, srcname, es_file, md5_file, pix, dectype, vcodec, ffmpeg_exec): -+ hwaccel = "" -+ if dectype == HWACCEL_RPI: -+ hwaccel = "rpi" -+ elif dectype == HWACCEL_DRM: -+ hwaccel = "drm" -+ elif dectype == HWACCEL_VAAPI: -+ hwaccel = "vaapi" -+ -+ pix_fmt = [] -+ if pix == "8": -+ pix_fmt = ["-pix_fmt", "yuv420p"] -+ elif pix == "10": -+ pix_fmt = ["-pix_fmt", "yuv420p10le"] -+ elif pix == "12": -+ pix_fmt = ["-pix_fmt", "yuv420p12le"] -+ -+ tmp_root = "/tmp" -+ -+ names = srcname.split('/') -+ while len(names) > 1: -+ tmp_root = os.path.join(tmp_root, names[0]) -+ del names[0] -+ name = names[0] -+ -+ if not os.path.exists(tmp_root): -+ os.makedirs(tmp_root) -+ -+ dec_file = os.path.join(tmp_root, name + ".dec.md5") -+ try: -+ os.remove(dec_file) -+ except: -+ pass -+ -+ flog = open(os.path.join(tmp_root, name + ".log"), "wt") -+ -+ ffargs = [ffmpeg_exec, "-flags", "unaligned", "-hwaccel", hwaccel, "-vcodec", "hevc", "-i", os.path.join(fileroot, es_file)] + pix_fmt + ["-f", "md5", dec_file] -+ -+ # Unaligned needed for cropping conformance -+ if hwaccel: -+ rstr = subprocess.call(ffargs, stdout=flog, stderr=subprocess.STDOUT) -+ else: -+ rstr = subprocess.call( -+ [ffmpeg_exec, "-flags", "unaligned", "-vcodec", vcodec, "-i", os.path.join(fileroot, es_file), "-f", "md5", dec_file], -+ stdout=flog, stderr=subprocess.STDOUT) -+ -+ try: -+ m1 = None -+ m2 = None -+ with open(os.path.join(fileroot, md5_file)) as f: -+ for line in f: -+ m1 = re.search("[0-9a-f]{32}", line.lower()) -+ if m1: -+ break -+ -+ with open(dec_file) as f: -+ m2 = re.search("[0-9a-f]{32}", f.readline()) -+ except: -+ pass -+ -+ if m1 and m2 and m1.group() == m2.group(): -+ print("Match: " + m1.group(), file=flog) -+ rv = 0 -+ elif not m1: -+ print("****** Cannot find m1", file=flog) -+ rv = 3 -+ elif not m2: -+ print("****** Cannot find m2", file=flog) -+ rv = 2 -+ else: -+ print("****** Mismatch: " + m1.group() + " != " + m2.group(), file=flog) -+ rv = 1 -+ flog.close() -+ return rv -+ -+def scandir(root): -+ aconf = [] -+ ents = os.listdir(root) -+ ents.sort(key=str.lower) -+ for name in ents: -+ test_path = os.path.join(root, name) -+ if S_ISDIR(os.stat(test_path).st_mode): -+ files = os.listdir(test_path) -+ es_file = "?" -+ md5_file = "?" -+ for f in files: -+ (base, ext) = os.path.splitext(f) -+ if base[0] == '.': -+ pass -+ elif ext == ".bit" or ext == ".bin": -+ es_file = f -+ elif ext == ".md5" or (ext == ".txt" and (base[-4:] == "_md5" or base[-6:] == "md5sum")): -+ if md5_file == "?": -+ md5_file = f -+ elif base[-3:] == "yuv": -+ md5_file = f -+ aconf.append((1, name, es_file, md5_file)) -+ return aconf -+ -+def runtest(name, tests): -+ if not tests: -+ return True -+ for t in tests: -+ if name[0:len(t)] == t or name.find("/" + t) != -1: -+ return True -+ return False -+ -+def doconf(csva, tests, test_root, vcodec, dectype, ffmpeg_exec): -+ unx_failures = [] -+ unx_success = [] -+ failures = 0 -+ successes = 0 -+ for a in csva: -+ exp_test = int(a[0]) -+ if (exp_test and runtest(a[1], tests)): -+ name = a[1] -+ print ("==== ", name, end="") -+ sys.stdout.flush() -+ -+ rv = testone(os.path.join(test_root, name), name, a[2], a[3], a[4], dectype=dectype, vcodec=vcodec, ffmpeg_exec=ffmpeg_exec) -+ if (rv == 0): -+ successes += 1 -+ else: -+ failures += 1 -+ -+ if (rv == 0): -+ if exp_test == 2: -+ print(": * OK *") -+ unx_success.append(name) -+ else: -+ print(": ok") -+ elif exp_test == 2 and rv == 1: -+ print(": fail") -+ elif exp_test == 3 and rv == 2: -+ # Call an expected "crash" an abort -+ print(": abort") -+ else: -+ unx_failures.append(name) -+ if rv == 1: -+ print(": * FAIL *") -+ elif (rv == 2) : -+ print(": * CRASH *") -+ elif (rv == 3) : -+ print(": * MD5 MISSING *") -+ else : -+ print(": * BANG *") -+ -+ if unx_failures or unx_success: -+ print("Unexpected Failures:", unx_failures) -+ print("Unexpected Success: ", unx_success) -+ else: -+ print("All tests normal:", successes, "ok,", failures, "failed") -+ -+ -+class ConfCSVDialect(csv.Dialect): -+ delimiter = ',' -+ doublequote = True -+ lineterminator = '\n' -+ quotechar='"' -+ quoting = csv.QUOTE_MINIMAL -+ skipinitialspace = True -+ strict = True -+ -+if __name__ == '__main__': -+ -+ argp = argparse.ArgumentParser(description="FFmpeg h265 conformance tester") -+ argp.add_argument("tests", nargs='*') -+ argp.add_argument("--pi4", action='store_true', help="Force pi4 cmd line") -+ argp.add_argument("--drm", action='store_true', help="Force v4l2 drm cmd line") -+ argp.add_argument("--vaapi", action='store_true', help="Force vaapi cmd line") -+ argp.add_argument("--test_root", default="/opt/conform/h265.2016", help="Root dir for test") -+ argp.add_argument("--csvgen", action='store_true', help="Generate CSV file for dir") -+ argp.add_argument("--csv", default="pi-util/conf_h265.2016.csv", help="CSV filename") -+ argp.add_argument("--vcodec", default="hevc_rpi", help="vcodec name to use") -+ argp.add_argument("--ffmpeg", default="./ffmpeg", help="ffmpeg exec name") -+ args = argp.parse_args() -+ -+ if args.csvgen: -+ csv.writer(sys.stdout).writerows(scandir(args.test_root)) -+ exit(0) -+ -+ with open(args.csv, 'rt') as csvfile: -+ csva = [a for a in csv.reader(csvfile, ConfCSVDialect())] -+ -+ dectype = CODEC_HEVC_RPI -+ if os.path.exists("/dev/rpivid-hevcmem"): -+ dectype = HWACCEL_RPI -+ if args.drm or os.path.exists("/sys/module/rpivid_hevc"): -+ dectype = HWACCEL_DRM -+ -+ if args.pi4: -+ dectype = HWACCEL_RPI -+ elif args.drm: -+ dectype = HWACCEL_DRM -+ elif args.vaapi: -+ dectype = HWACCEL_VAAPI -+ -+ doconf(csva, args.tests, args.test_root, args.vcodec, dectype, args.ffmpeg) -+ -diff --git a/pi-util/ffperf.py b/pi-util/ffperf.py -new file mode 100755 -index 0000000000..65c5224cd8 ---- /dev/null -+++ b/pi-util/ffperf.py -@@ -0,0 +1,128 @@ -+#!/usr/bin/env python3 -+ -+import time -+import string -+import os -+import tempfile -+import subprocess -+import re -+import argparse -+import sys -+import csv -+from stat import * -+ -+class tstats: -+ close_threshold = 0.01 -+ -+ def __init__(self, stats_dict=None): -+ if stats_dict != None: -+ self.name = stats_dict["name"] -+ self.elapsed = float(stats_dict["elapsed"]) -+ self.user = float(stats_dict["user"]) -+ self.sys = float(stats_dict["sys"]) -+ -+ def times_str(self): -+ ctime = self.sys + self.user -+ return "time=%6.2f, cpu=%6.2f (%4.2f%%)" % (self.elapsed, ctime, (ctime * 100.0) / self.elapsed) -+ -+ def dict(self): -+ return {"name":self.name, "elapsed":self.elapsed, "user":self.user, "sys":self.sys} -+ -+ def is_close(self, other): -+ return abs(self.elapsed - other.elapsed) / self.elapsed < self.close_threshold -+ -+ def __lt__(self, other): -+ return self.elapsed < other.elapsed -+ def __gt__(self, other): -+ return self.elapsed > other.elapsed -+ -+ def time_file(name, prefix, ffmpeg="./ffmpeg"): -+ stats = tstats() -+ stats.name = name -+ start_time = time.clock_gettime(time.CLOCK_MONOTONIC); -+ cproc = subprocess.Popen([ffmpeg, "-no_cvt_hw", -+ "-vcodec", "hevc_rpi", -+ "-t", "30", "-i", prefix + name, -+ "-f", "vout_rpi", os.devnull], bufsize=-1, stdout=flog, stderr=flog); -+ pinfo = os.wait4(cproc.pid, 0) -+ end_time = time.clock_gettime(time.CLOCK_MONOTONIC); -+ stats.elapsed = end_time - start_time -+ stats.user = pinfo[2].ru_utime -+ stats.sys = pinfo[2].ru_stime -+ return stats -+ -+ -+def common_prefix(s1, s2): -+ for i in range(min(len(s1),len(s2))): -+ if s1[i] != s2[i]: -+ return s1[:i] -+ return s1[:i+1] -+ -+def main(): -+ global flog -+ -+ argp = argparse.ArgumentParser(description="FFmpeg performance tester", epilog=""" -+To blank the screen before starting use "xdg-screensaver activate" -+(For some reason this doesn't seem to work from within python). -+""") -+ -+ argp.add_argument("streams", nargs='*') -+ argp.add_argument("--csv_out", default="ffperf_out.csv", help="CSV output filename") -+ argp.add_argument("--csv_in", help="CSV input filename") -+ argp.add_argument("--prefix", help="Filename prefix (include terminal '/' if a directory).") -+ argp.add_argument("--repeat", default=3, type=int, help="Run repeat count") -+ argp.add_argument("--ffmpeg", default="./ffmpeg", help="FFmpeg executable") -+ -+ args = argp.parse_args() -+ -+ csv_out = csv.DictWriter(open(args.csv_out, 'w', newline=''), ["name", "elapsed", "user", "sys"]) -+ csv_out.writeheader() -+ -+ stats_in = {} -+ if args.csv_in != None: -+ with open(args.csv_in, 'r', newline='') as f_in: -+ stats_in = {x["name"]:tstats(x) for x in csv.DictReader(f_in)} -+ -+ flog = open(os.path.join(tempfile.gettempdir(), "ffperf.log"), "wt") -+ -+ streams = args.streams -+ if not streams: -+ if not stats_in: -+ print ("No source streams specified") -+ return 1 -+ prefix = "" if args.prefix == None else args.prefix -+ streams = [k for k in stats_in] -+ elif args.prefix != None: -+ prefix = args.prefix -+ else: -+ prefix = streams[0] -+ for f in streams[1:]: -+ prefix = common_prefix(prefix, f) -+ pp = prefix.rpartition(os.sep) -+ prefix = pp[0] + pp[1] -+ streams = [s[len(prefix):] for s in streams] -+ -+ for f in sorted(streams, key=lambda x : "~" * x.count(os.sep) + x.lower()): -+ print ("====", f) -+ -+ t0 = tstats({"name":f, "elapsed":999, "user":999, "sys":999}) -+ for i in range(args.repeat): -+ t = tstats.time_file(f, prefix, args.ffmpeg) -+ print ("...", t.times_str()) -+ if t0 > t: -+ t0 = t -+ -+ if t0.name in stats_in: -+ pstat = stats_in[t0.name] -+ print("---" if pstat.is_close(t0) else "<<<" if t0 < pstat else ">>>", pstat.times_str()) -+ -+ csv_out.writerow(t0.dict()) -+ -+ print () -+ -+ return 0 -+ -+ -+if __name__ == '__main__': -+ exit(main()) -+ -diff --git a/pi-util/genpatch.sh b/pi-util/genpatch.sh -new file mode 100755 -index 0000000000..0948a68a7a ---- /dev/null -+++ b/pi-util/genpatch.sh -@@ -0,0 +1,35 @@ -+set -e -+ -+NOPATCH= -+if [ "$1" == "--notag" ]; then -+ shift -+ NOPATCH=1 -+fi -+ -+if [ "$1" == "" ]; then -+ echo Usage: $0 [--notag] \ -+ echo e.g.: $0 mmal_4 -+ exit 1 -+fi -+ -+VERSION=`cat RELEASE` -+if [ "$VERSION" == "" ]; then -+ echo Can\'t find version RELEASE -+ exit 1 -+fi -+ -+PATCHFILE=../ffmpeg-$VERSION-$1.patch -+ -+if [ $NOPATCH ]; then -+ echo Not tagged -+else -+ # Only continue if we are all comitted -+ git diff --name-status --exit-code -+ -+ PATCHTAG=pi/$VERSION/$1 -+ echo Tagging: $PATCHTAG -+ -+ git tag $PATCHTAG -+fi -+echo Generating patch: $PATCHFILE -+git diff n$VERSION -- > $PATCHFILE -diff --git a/pi-util/make_array.py b/pi-util/make_array.py -new file mode 100755 -index 0000000000..67b22d2d51 ---- /dev/null -+++ b/pi-util/make_array.py -@@ -0,0 +1,23 @@ -+#!/usr/bin/env python -+ -+# Usage -+# make_array file.bin -+# Produces file.h with array of bytes. -+# -+import sys -+for file in sys.argv[1:]: -+ prefix,suffix = file.split('.') -+ assert suffix=='bin' -+ name=prefix.split('/')[-1] -+ print 'Converting',file -+ with open(prefix+'.h','wb') as out: -+ print >>out, 'static const unsigned char',name,'[] = {' -+ with open(file,'rb') as fd: -+ i = 0 -+ for byte in fd.read(): -+ print >>out, '0x%02x, ' % ord(byte), -+ i = i + 1 -+ if i % 8 == 0: -+ print >>out, ' // %04x' % (i - 8) -+ print >>out,'};' -+ -diff --git a/pi-util/mkinst.sh b/pi-util/mkinst.sh -new file mode 100755 -index 0000000000..271a39e846 ---- /dev/null -+++ b/pi-util/mkinst.sh -@@ -0,0 +1,5 @@ -+set -e -+ -+make install -+ -+cp -r install/* ../vlc/sysroot/raspian_stretch_pi1-sysroot/usr -diff --git a/pi-util/patkodi.sh b/pi-util/patkodi.sh -new file mode 100644 -index 0000000000..dcd05a606e ---- /dev/null -+++ b/pi-util/patkodi.sh -@@ -0,0 +1,9 @@ -+set -e -+KODIBASE=/home/jc/rpi/kodi/xbmc -+JOBS=-j20 -+make $JOBS -+git diff xbmc/release/4.3-kodi > $KODIBASE/tools/depends/target/ffmpeg/pfcd_hevc_optimisations.patch -+make -C $KODIBASE/tools/depends/target/ffmpeg $JOBS -+make -C $KODIBASE/build install -+ -+ -diff --git a/pi-util/perfcmp.py b/pi-util/perfcmp.py -new file mode 100755 -index 0000000000..e44cfa0c3c ---- /dev/null -+++ b/pi-util/perfcmp.py -@@ -0,0 +1,101 @@ -+#!/usr/bin/env python3 -+ -+import time -+import string -+import os -+import tempfile -+import subprocess -+import re -+import argparse -+import sys -+import csv -+from stat import * -+ -+class tstats: -+ close_threshold = 0.01 -+ -+ def __init__(self, stats_dict=None): -+ if stats_dict != None: -+ self.name = stats_dict["name"] -+ self.elapsed = float(stats_dict["elapsed"]) -+ self.user = float(stats_dict["user"]) -+ self.sys = float(stats_dict["sys"]) -+ -+ def times_str(self): -+ ctime = self.sys + self.user -+ return "time=%6.2f, cpu=%6.2f (%4.2f%%)" % (self.elapsed, ctime, (ctime * 100.0) / self.elapsed) -+ -+ def dict(self): -+ return {"name":self.name, "elapsed":self.elapsed, "user":self.user, "sys":self.sys} -+ -+ def is_close(self, other): -+ return abs(self.elapsed - other.elapsed) / self.elapsed < self.close_threshold -+ -+ def __lt__(self, other): -+ return self.elapsed < other.elapsed -+ def __gt__(self, other): -+ return self.elapsed > other.elapsed -+ -+ def time_file(name, prefix): -+ stats = tstats() -+ stats.name = name -+ start_time = time.clock_gettime(time.CLOCK_MONOTONIC); -+ cproc = subprocess.Popen(["./ffmpeg", "-t", "30", "-i", prefix + name, -+ "-f", "null", os.devnull], bufsize=-1, stdout=flog, stderr=flog); -+ pinfo = os.wait4(cproc.pid, 0) -+ end_time = time.clock_gettime(time.CLOCK_MONOTONIC); -+ stats.elapsed = end_time - start_time -+ stats.user = pinfo[2].ru_utime -+ stats.sys = pinfo[2].ru_stime -+ return stats -+ -+ -+def common_prefix(s1, s2): -+ for i in range(min(len(s1),len(s2))): -+ if s1[i] != s2[i]: -+ return s1[:i] -+ return s1[:i+1] -+ -+def main(): -+ argp = argparse.ArgumentParser(description="FFmpeg performance compare") -+ -+ argp.add_argument("stream0", help="CSV to compare") -+ argp.add_argument("stream1", nargs='?', default="ffperf_out.csv", help="CSV to compare") -+ -+ args = argp.parse_args() -+ -+ with open(args.stream0, 'r', newline='') as f_in: -+ stats0 = {x["name"]:tstats(x) for x in csv.DictReader(f_in)} -+ with open(args.stream1, 'r', newline='') as f_in: -+ stats1 = {x["name"]:tstats(x) for x in csv.DictReader(f_in)} -+ -+ print (args.stream0, "<<-->>", args.stream1) -+ print () -+ -+ for f in sorted(stats0.keys() | stats1.keys(), key=lambda x : "~" * x.count(os.sep) + x.lower()): -+ if not (f in stats0) : -+ print (" XX :", f) -+ continue -+ if not (f in stats1) : -+ print (" XX :", f) -+ continue -+ -+ s0 = stats0[f] -+ s1 = stats1[f] -+ -+ pcent = ((s0.elapsed - s1.elapsed) / s0.elapsed) * 100.0 -+ thresh = 0.3 -+ tc = 6 -+ -+ nchar = min(tc - 1, int(abs(pcent) / thresh)) -+ cc = " -- " if nchar == 0 else "<" * nchar + " " * (tc - nchar) if pcent < 0 else " " * (tc - nchar) + ">" * nchar -+ -+ print ("%6.2f %s%6.2f (%+5.2f) : %s" % -+ (s0.elapsed, cc, s1.elapsed, pcent, f)) -+ -+ return 0 -+ -+ -+if __name__ == '__main__': -+ exit(main()) -+ -diff --git a/pi-util/qem.sh b/pi-util/qem.sh -new file mode 100755 -index 0000000000..a4dbb6eacd ---- /dev/null -+++ b/pi-util/qem.sh -@@ -0,0 +1,9 @@ -+TARGET_DIR=../src/eupton_vc4dev_2012a/software/vc4/DEV/applications/tutorials/user_shader_example_tex -+QASM=python\ ../local/bin/qasm.py -+SRC_FILE=libavcodec/rpi_hevc_shader.qasm -+DST_BASE=shader -+ -+cp libavcodec/rpi_hevc_shader_cmd.h $TARGET_DIR -+$QASM -mc_c:$DST_BASE,$DST_BASE,$DST_BASE $SRC_FILE > $TARGET_DIR/$DST_BASE.c -+$QASM -mc_h:$DST_BASE,$DST_BASE,$DST_BASE $SRC_FILE > $TARGET_DIR/$DST_BASE.h -+ -diff --git a/pi-util/v3dusage.py b/pi-util/v3dusage.py -new file mode 100755 -index 0000000000..5935a11ca5 ---- /dev/null -+++ b/pi-util/v3dusage.py -@@ -0,0 +1,128 @@ -+#!/usr/bin/env python -+ -+import sys -+import argparse -+import re -+ -+def do_logparse(logname): -+ -+ rmatch = re.compile(r'^([0-9]+\.[0-9]{3}): (done )?((vpu0)|(vpu1)|(qpu1)) ([A-Z_]+) cb:([0-9a-f]+) ') -+ rqcycle = re.compile(r'^([0-9]+\.[0-9]{3}): v3d: QPU Total clock cycles for all QPUs doing vertex/coordinate shading +([0-9]+)$') -+ rqtscycle = re.compile(r'^([0-9]+\.[0-9]{3}): v3d: QPU Total clock cycles for all QPUs stalled waiting for TMUs +([0-9]+)$') -+ rl2hits = re.compile(r'^([0-9]+\.[0-9]{3}): v3d: L2C Total Level 2 cache ([a-z]+) +([0-9]+)$') -+ -+ ttotal = {'idle':0.0} -+ tstart = {} -+ qctotal = {} -+ qtstotal = {} -+ l2hits = {} -+ l2total = {} -+ time0 = None -+ idle_start = None -+ qpu_op_no = 0 -+ op_count = 0 -+ -+ with open(logname, "rt") as infile: -+ for line in infile: -+ match = rmatch.match(line) -+ if match: -+# print match.group(1), ":", match.group(2), ":", match.group(3), ":", match.group(7), ":" -+ time = float(match.group(1)) -+ unit = match.group(3) -+ opstart = not match.group(2) -+ optype = match.group(7) -+ hascb = match.group(8) != "0" -+ -+ if unit == 'qpu1': -+ unit = unit + "." + str(qpu_op_no) -+ if not opstart: -+ if hascb or optype == 'EXECUTE_SYNC': -+ qpu_op_no = 0 -+ else: -+ qpu_op_no += 1 -+ -+ # Ignore sync type -+ if optype == 'EXECUTE_SYNC': -+ continue -+ -+ if not time0: -+ time0 = time -+ -+ if opstart: -+ tstart[unit] = time; -+ elif unit in tstart: -+ op_count += 1 -+ if not unit in ttotal: -+ ttotal[unit] = 0.0 -+ ttotal[unit] += time - tstart[unit] -+ del tstart[unit] -+ -+ if not idle_start and not tstart: -+ idle_start = time -+ elif idle_start and tstart: -+ ttotal['idle'] += time - idle_start -+ idle_start = None -+ -+ match = rqcycle.match(line) -+ if match: -+ unit = "qpu1." + str(qpu_op_no) -+ if not unit in qctotal: -+ qctotal[unit] = 0 -+ qctotal[unit] += int(match.group(2)) -+ -+ match = rqtscycle.match(line) -+ if match: -+ unit = "qpu1." + str(qpu_op_no) -+ if not unit in qtstotal: -+ qtstotal[unit] = 0 -+ qtstotal[unit] += int(match.group(2)) -+ -+ match = rl2hits.match(line) -+ if match: -+ unit = "qpu1." + str(qpu_op_no) -+ if not unit in l2total: -+ l2total[unit] = 0 -+ l2hits[unit] = 0 -+ l2total[unit] += int(match.group(3)) -+ if match.group(2) == "hits": -+ l2hits[unit] += int(match.group(3)) -+ -+ -+ if not time0: -+ print "No v3d profile records found" -+ else: -+ tlogged = time - time0 -+ -+ print "Logged time:", tlogged, " Op count:", op_count -+ for unit in sorted(ttotal): -+ print b'%6s: %10.3f %7.3f%%' % (unit, ttotal[unit], ttotal[unit] * 100.0 / tlogged) -+ print -+ for unit in sorted(qctotal): -+ if not unit in qtstotal: -+ qtstotal[unit] = 0; -+ print b'%6s: Qcycles: %10d, TMU stall: %10d (%7.3f%%)' % (unit, qctotal[unit], qtstotal[unit], (qtstotal[unit] * 100.0)/qctotal[unit]) -+ if unit in l2total: -+ print b' L2Total: %10d, hits: %10d (%7.3f%%)' % (l2total[unit], l2hits[unit], (l2hits[unit] * 100.0)/l2total[unit]) -+ -+ -+ -+if __name__ == '__main__': -+ argp = argparse.ArgumentParser( -+ formatter_class=argparse.RawDescriptionHelpFormatter, -+ description="QPU/VPU perf summary from VC logging", -+ epilog = """ -+Will also summarise TMU stalls if logging requests set in qpu noflush param -+in the profiled code. -+ -+Example use: -+ vcgencmd set_logging level=0xc0 -+ -+ sudo vcdbg log msg >& t.log -+ v3dusage.py t.log -+""") -+ -+ argp.add_argument("logfile") -+ args = argp.parse_args() -+ -+ do_logparse(args.logfile) -+ - -From f3eaadb27a5bc6db07d33ce0814d796e8cee623e Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 11:27:39 +0100 -Subject: [PATCH 002/151] Add sand pix fmts & conversion fns - ---- - configure | 3 + - libavutil/Makefile | 3 + - libavutil/arm/Makefile | 1 + - libavutil/arm/rpi_sand_neon.S | 768 ++++++++++++++++++++++++++++++++++ - libavutil/arm/rpi_sand_neon.h | 99 +++++ - libavutil/pixdesc.c | 44 ++ - libavutil/pixfmt.h | 6 + - libavutil/rpi_sand_fn_pw.h | 227 ++++++++++ - libavutil/rpi_sand_fns.c | 353 ++++++++++++++++ - libavutil/rpi_sand_fns.h | 183 ++++++++ - 10 files changed, 1687 insertions(+) - create mode 100644 libavutil/arm/rpi_sand_neon.S - create mode 100644 libavutil/arm/rpi_sand_neon.h - create mode 100644 libavutil/rpi_sand_fn_pw.h - create mode 100644 libavutil/rpi_sand_fns.c - create mode 100644 libavutil/rpi_sand_fns.h - -diff --git a/configure b/configure -index b6616f00b6..27112ced58 100755 ---- a/configure -+++ b/configure -@@ -344,6 +344,7 @@ External library support: - --enable-libvpl enable Intel oneVPL code via libvpl if libmfx is not used [no] - --enable-libnpp enable Nvidia Performance Primitives-based code [no] - --enable-mmal enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no] -+ --enable-sand enable sand video formats [rpi] - --disable-nvdec disable Nvidia video decoding acceleration (via hwaccel) [autodetect] - --disable-nvenc disable Nvidia video encoding code [autodetect] - --enable-omx enable OpenMAX IL code [no] -@@ -1930,6 +1931,7 @@ FEATURE_LIST=" - omx_rpi - runtime_cpudetect - safe_bitstream_reader -+ sand - shared - small - static -@@ -2495,6 +2497,7 @@ CONFIG_EXTRA=" - rtpdec - rtpenc_chain - rv34dsp -+ sand - scene_sad - sinewin - snappy -diff --git a/libavutil/Makefile b/libavutil/Makefile -index dc9012f9a8..e33f5db099 100644 ---- a/libavutil/Makefile -+++ b/libavutil/Makefile -@@ -73,6 +73,7 @@ HEADERS = adler32.h \ - rational.h \ - replaygain.h \ - ripemd.h \ -+ rpi_sand_fns.h \ - samplefmt.h \ - sha.h \ - sha512.h \ -@@ -192,6 +193,7 @@ OBJS-$(CONFIG_MACOS_KPERF) += macos_kperf.o - OBJS-$(CONFIG_MEDIACODEC) += hwcontext_mediacodec.o - OBJS-$(CONFIG_OPENCL) += hwcontext_opencl.o - OBJS-$(CONFIG_QSV) += hwcontext_qsv.o -+OBJS-$(CONFIG_SAND) += rpi_sand_fns.o - OBJS-$(CONFIG_VAAPI) += hwcontext_vaapi.o - OBJS-$(CONFIG_VIDEOTOOLBOX) += hwcontext_videotoolbox.o - OBJS-$(CONFIG_VDPAU) += hwcontext_vdpau.o -@@ -212,6 +214,7 @@ SKIPHEADERS-$(CONFIG_D3D11VA) += hwcontext_d3d11va.h - SKIPHEADERS-$(CONFIG_DXVA2) += hwcontext_dxva2.h - SKIPHEADERS-$(CONFIG_QSV) += hwcontext_qsv.h - SKIPHEADERS-$(CONFIG_OPENCL) += hwcontext_opencl.h -+SKIPHEADERS-$(CONFIG-RPI) += rpi_sand_fn_pw.h - SKIPHEADERS-$(CONFIG_VAAPI) += hwcontext_vaapi.h - SKIPHEADERS-$(CONFIG_VIDEOTOOLBOX) += hwcontext_videotoolbox.h - SKIPHEADERS-$(CONFIG_VDPAU) += hwcontext_vdpau.h -diff --git a/libavutil/arm/Makefile b/libavutil/arm/Makefile -index 5da44b0542..b74b7c4e2f 100644 ---- a/libavutil/arm/Makefile -+++ b/libavutil/arm/Makefile -@@ -6,3 +6,4 @@ VFP-OBJS += arm/float_dsp_init_vfp.o \ - - NEON-OBJS += arm/float_dsp_init_neon.o \ - arm/float_dsp_neon.o \ -+ arm/rpi_sand_neon.o \ -diff --git a/libavutil/arm/rpi_sand_neon.S b/libavutil/arm/rpi_sand_neon.S -new file mode 100644 -index 0000000000..80890fe985 ---- /dev/null -+++ b/libavutil/arm/rpi_sand_neon.S -@@ -0,0 +1,768 @@ -+/* -+Copyright (c) 2018 Raspberry Pi (Trading) Ltd. -+All rights reserved. -+ -+Redistribution and use in source and binary forms, with or without -+modification, are permitted provided that the following conditions are met: -+ * Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+ * Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+ * Neither the name of the copyright holder nor the -+ names of its contributors may be used to endorse or promote products -+ derived from this software without specific prior written permission. -+ -+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY -+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+Authors: John Cox -+*/ -+ -+#include "libavutil/arm/asm.S" -+ -+ -+@ General notes: -+@ Having done some timing on this in sand8->y8 (Pi4) -+@ vst1 (680fps) is a bit faster than vstm (660fps) -+@ vldm (680fps) is noticably faster than vld1 (480fps) -+@ (or it might be that a mix is what is required) -+@ -+@ At least on a Pi4 it is no more expensive to have a single auto-inc register -+@ for dest address than it is to have 2 used alternately (On Pi3 Ben asserted -+@ the latter was better) -+@ -+@ vstm will bus error on unaligned access (so will vldm), vst1 is safe unless -+@ the memory is uncached. -+@ As these are Sand -> planar we can assume that src is going to be aligned but -+@ it is possible that dest isn't (converting to .yuv or other packed format). -+@ Luckily vst1 is faster than vstm :-) so all is well -+@ vst1 has alignment requirements of el size so maybe splitting vst1.32 into 4 -+@ .8 stores would let us do non-word aligned stores into uncached but it -+@ probably isn't worth it. -+ -+ -+ -+ -+@ void ff_rpi_sand128b_stripe_to_8_10( -+@ uint8_t * dest, // [r0] -+@ const uint8_t * src1, // [r1] -+@ const uint8_t * src2, // [r2] -+@ unsigned int lines); // [r3] -+ -+.macro stripe2_to_8, bit_depth -+ vpush {q4-q7} -+1: -+ vldm r1!, {q0-q7} -+ subs r3, #1 -+ vldm r2!, {q8-q15} -+ vqrshrn.u16 d0, q0, #\bit_depth - 8 -+ vqrshrn.u16 d1, q1, #\bit_depth - 8 -+ vqrshrn.u16 d2, q2, #\bit_depth - 8 -+ vqrshrn.u16 d3, q3, #\bit_depth - 8 -+ vqrshrn.u16 d4, q4, #\bit_depth - 8 -+ vqrshrn.u16 d5, q5, #\bit_depth - 8 -+ vqrshrn.u16 d6, q6, #\bit_depth - 8 -+ vqrshrn.u16 d7, q7, #\bit_depth - 8 -+ vqrshrn.u16 d8, q8, #\bit_depth - 8 -+ vqrshrn.u16 d9, q9, #\bit_depth - 8 -+ vqrshrn.u16 d10, q10, #\bit_depth - 8 -+ vqrshrn.u16 d11, q11, #\bit_depth - 8 -+ vqrshrn.u16 d12, q12, #\bit_depth - 8 -+ vqrshrn.u16 d13, q13, #\bit_depth - 8 -+ vqrshrn.u16 d14, q14, #\bit_depth - 8 -+ vqrshrn.u16 d15, q15, #\bit_depth - 8 -+ vstm r0!, {q0-q7} -+ bne 1b -+ vpop {q4-q7} -+ bx lr -+.endm -+ -+function ff_rpi_sand128b_stripe_to_8_10, export=1 -+ stripe2_to_8 10 -+endfunc -+ -+@ void ff_rpi_sand8_lines_to_planar_y8( -+@ uint8_t * dest, // [r0] -+@ unsigned int dst_stride, // [r1] -+@ const uint8_t * src, // [r2] -+@ unsigned int src_stride1, // [r3] Ignored - assumed 128 -+@ unsigned int src_stride2, // [sp, #0] -> r3 -+@ unsigned int _x, // [sp, #4] Ignored - 0 -+@ unsigned int y, // [sp, #8] (r7 in prefix) -+@ unsigned int _w, // [sp, #12] -> r6 (cur r5) -+@ unsigned int h); // [sp, #16] -> r7 -+@ -+@ Assumes that we are starting on a stripe boundary and that overreading -+@ within the stripe is OK. However it does respect the dest size for writing -+ -+function ff_rpi_sand8_lines_to_planar_y8, export=1 -+ push {r4-r8, lr} @ +24 L -+ ldr r3, [sp, #24] -+ ldr r6, [sp, #36] -+ ldr r7, [sp, #32] @ y -+ lsl r3, #7 -+ sub r1, r6 -+ add r8, r2, r7, lsl #7 -+ ldr r7, [sp, #40] -+ -+10: -+ mov r2, r8 -+ add r4, r0, #24 -+ mov r5, r6 -+ mov lr, #0 -+1: -+ vldm r2, {q8-q15} -+ add r2, r3 -+ subs r5, #128 -+ blt 2f -+ vst1.8 {d16, d17, d18, d19}, [r0]! -+ vst1.8 {d20, d21, d22, d23}, [r0]! -+ vst1.8 {d24, d25, d26, d27}, [r0]! -+ vst1.8 {d28, d29, d30, d31}, [r0]! -+ bne 1b -+11: -+ subs r7, #1 -+ add r0, r1 -+ add r8, #128 -+ bne 10b -+ -+ pop {r4-r8, pc} -+ -+@ Partial final write -+2: -+ cmp r5, #64-128 -+ blt 1f -+ vst1.8 {d16, d17, d18, d19}, [r0]! -+ vst1.8 {d20, d21, d22, d23}, [r0]! -+ beq 11b -+ vmov q8, q12 -+ vmov q9, q13 -+ sub r5, #64 -+ vmov q10, q14 -+ vmov q11, q15 -+1: -+ cmp r5, #32-128 -+ blt 1f -+ vst1.8 {d16, d17, d18, d19}, [r0]! -+ beq 11b -+ vmov q8, q10 -+ sub r5, #32 -+ vmov q9, q11 -+1: -+ cmp r5, #16-128 -+ blt 1f -+ vst1.8 {d16, d17}, [r0]! -+ beq 11b -+ sub r5, #16 -+ vmov q8, q9 -+1: -+ cmp r5, #8-128 -+ blt 1f -+ vst1.8 {d16}, [r0]! -+ beq 11b -+ sub r5, #8 -+ vmov d16, d17 -+1: -+ cmp r5, #4-128 -+ blt 1f -+ vst1.32 {d16[0]}, [r0]! -+ beq 11b -+ sub r5, #4 -+ vshr.u64 d16, #32 -+1: -+ cmp r5, #2-128 -+ blt 1f -+ vst1.16 {d16[0]}, [r0]! -+ beq 11b -+ vst1.8 {d16[2]}, [r0]! -+ b 11b -+1: -+ vst1.8 {d16[0]}, [r0]! -+ b 11b -+endfunc -+ -+@ void ff_rpi_sand8_lines_to_planar_c8( -+@ uint8_t * dst_u, // [r0] -+@ unsigned int dst_stride_u, // [r1] -+@ uint8_t * dst_v, // [r2] -+@ unsigned int dst_stride_v, // [r3] -+@ const uint8_t * src, // [sp, #0] -> r4, r5 -+@ unsigned int stride1, // [sp, #4] 128 -+@ unsigned int stride2, // [sp, #8] -> r8 -+@ unsigned int _x, // [sp, #12] 0 -+@ unsigned int y, // [sp, #16] (r7 in prefix) -+@ unsigned int _w, // [sp, #20] -> r12, r6 -+@ unsigned int h); // [sp, #24] -> r7 -+@ -+@ Assumes that we are starting on a stripe boundary and that overreading -+@ within the stripe is OK. However it does respect the dest size for writing -+ -+function ff_rpi_sand8_lines_to_planar_c8, export=1 -+ push {r4-r8, lr} @ +24 -+ -+ ldr r5, [sp, #24] -+ ldr r8, [sp, #32] -+ ldr r7, [sp, #40] -+ ldr r6, [sp, #44] -+ lsl r8, #7 -+ add r5, r5, r7, lsl #7 -+ sub r1, r1, r6 -+ sub r3, r3, r6 -+ ldr r7, [sp, #48] -+ vpush {q4-q7} -+ -+10: -+ mov r4, r5 -+ mov r12, r6 -+1: -+ subs r12, #64 -+ vldm r4, {q0-q7} -+ add r4, r8 -+ it gt -+ vldmgt r4, {q8-q15} -+ add r4, r8 -+ -+ vuzp.8 q0, q1 -+ vuzp.8 q2, q3 -+ vuzp.8 q4, q5 -+ vuzp.8 q6, q7 -+ -+ vuzp.8 q8, q9 -+ vuzp.8 q10, q11 -+ vuzp.8 q12, q13 -+ vuzp.8 q14, q15 -+ subs r12, #64 -+ -+ @ Rearrange regs so we can use vst1 with 4 regs -+ vswp q1, q2 -+ vswp q5, q6 -+ vswp q9, q10 -+ vswp q13, q14 -+ blt 2f -+ -+ vst1.8 {d0, d1, d2, d3 }, [r0]! -+ vst1.8 {d8, d9, d10, d11}, [r0]! -+ vst1.8 {d16, d17, d18, d19}, [r0]! -+ vst1.8 {d24, d25, d26, d27}, [r0]! -+ -+ vst1.8 {d4, d5, d6, d7 }, [r2]! -+ vst1.8 {d12, d13, d14, d15}, [r2]! -+ vst1.8 {d20, d21, d22, d23}, [r2]! -+ vst1.8 {d28, d29, d30, d31}, [r2]! -+ bne 1b -+11: -+ subs r7, #1 -+ add r5, #128 -+ add r0, r1 -+ add r2, r3 -+ bne 10b -+ vpop {q4-q7} -+ pop {r4-r8,pc} -+ -+2: -+ cmp r12, #64-128 -+ blt 1f -+ vst1.8 {d0, d1, d2, d3 }, [r0]! -+ vst1.8 {d8, d9, d10, d11}, [r0]! -+ vst1.8 {d4, d5, d6, d7 }, [r2]! -+ vst1.8 {d12, d13, d14, d15}, [r2]! -+ beq 11b -+ sub r12, #64 -+ vmov q0, q8 -+ vmov q1, q9 -+ vmov q2, q10 -+ vmov q3, q11 -+ vmov q4, q12 -+ vmov q5, q13 -+ vmov q6, q14 -+ vmov q7, q15 -+1: -+ cmp r12, #32-128 -+ blt 1f -+ vst1.8 {d0, d1, d2, d3 }, [r0]! -+ vst1.8 {d4, d5, d6, d7 }, [r2]! -+ beq 11b -+ sub r12, #32 -+ vmov q0, q4 -+ vmov q1, q5 -+ vmov q2, q6 -+ vmov q3, q7 -+1: -+ cmp r12, #16-128 -+ blt 1f -+ vst1.8 {d0, d1 }, [r0]! -+ vst1.8 {d4, d5 }, [r2]! -+ beq 11b -+ sub r12, #16 -+ vmov q0, q1 -+ vmov q2, q3 -+1: -+ cmp r12, #8-128 -+ blt 1f -+ vst1.8 {d0}, [r0]! -+ vst1.8 {d4}, [r2]! -+ beq 11b -+ sub r12, #8 -+ vmov d0, d1 -+ vmov d4, d5 -+1: -+ cmp r12, #4-128 -+ blt 1f -+ vst1.32 {d0[0]}, [r0]! -+ vst1.32 {d4[0]}, [r2]! -+ beq 11b -+ sub r12, #4 -+ vmov s0, s1 -+ vmov s8, s9 -+1: -+ cmp r12, #2-128 -+ blt 1f -+ vst1.16 {d0[0]}, [r0]! -+ vst1.16 {d4[0]}, [r2]! -+ beq 11b -+ vst1.8 {d0[2]}, [r0]! -+ vst1.8 {d4[2]}, [r2]! -+ b 11b -+1: -+ vst1.8 {d0[0]}, [r0]! -+ vst1.8 {d4[0]}, [r2]! -+ b 11b -+endfunc -+ -+ -+ -+@ void ff_rpi_sand30_lines_to_planar_y16( -+@ uint8_t * dest, // [r0] -+@ unsigned int dst_stride, // [r1] -+@ const uint8_t * src, // [r2] -+@ unsigned int src_stride1, // [r3] Ignored - assumed 128 -+@ unsigned int src_stride2, // [sp, #0] -> r3 -+@ unsigned int _x, // [sp, #4] Ignored - 0 -+@ unsigned int y, // [sp, #8] (r7 in prefix) -+@ unsigned int _w, // [sp, #12] -> r6 (cur r5) -+@ unsigned int h); // [sp, #16] -> r7 -+@ -+@ Assumes that we are starting on a stripe boundary and that overreading -+@ within the stripe is OK. However it does respect the dest size for writing -+ -+function ff_rpi_sand30_lines_to_planar_y16, export=1 -+ push {r4-r8, lr} @ +24 -+ ldr r3, [sp, #24] -+ ldr r6, [sp, #36] -+ ldr r7, [sp, #32] @ y -+ mov r12, #48 -+ vmov.u16 q15, #0x3ff -+ sub r3, #1 -+ lsl r3, #7 -+ sub r1, r1, r6, lsl #1 -+ add r8, r2, r7, lsl #7 -+ ldr r7, [sp, #40] -+ -+10: -+ mov r2, r8 -+ add r4, r0, #24 -+ mov r5, r6 -+ mov lr, #0 -+1: -+ vldm r2!, {q10-q13} -+ add lr, #64 -+ -+ vshr.u32 q14, q10, #20 @ Cannot vshrn.u32 #20! -+ ands lr, #127 -+ vshrn.u32 d2, q10, #10 -+ vmovn.u32 d0, q10 -+ vmovn.u32 d4, q14 -+ -+ vshr.u32 q14, q11, #20 -+ it eq -+ addeq r2, r3 -+ vshrn.u32 d3, q11, #10 -+ vmovn.u32 d1, q11 -+ vmovn.u32 d5, q14 -+ -+ subs r5, #48 -+ vand q0, q15 -+ vand q1, q15 -+ vand q2, q15 -+ -+ vshr.u32 q14, q12, #20 -+ vshrn.u32 d18, q12, #10 -+ vmovn.u32 d16, q12 -+ vmovn.u32 d20, q14 -+ -+ vshr.u32 q14, q13, #20 -+ vshrn.u32 d19, q13, #10 -+ vmovn.u32 d17, q13 -+ vmovn.u32 d21, q14 -+ -+ vand q8, q15 -+ vand q9, q15 -+ vand q10, q15 -+ blt 2f -+ -+ vst3.16 {d0, d2, d4}, [r0], r12 -+ vst3.16 {d1, d3, d5}, [r4], r12 -+ vst3.16 {d16, d18, d20}, [r0], r12 -+ vst3.16 {d17, d19, d21}, [r4], r12 -+ -+ bne 1b -+ -+11: -+ subs r7, #1 -+ add r0, r1 -+ add r8, #128 -+ bne 10b -+ -+ pop {r4-r8, pc} -+ -+@ Partial final write -+2: -+ cmp r5, #24-48 -+ blt 1f -+ vst3.16 {d0, d2, d4}, [r0], r12 -+ vst3.16 {d1, d3, d5}, [r4] -+ beq 11b -+ vmov q0, q8 -+ sub r5, #24 -+ vmov q1, q9 -+ vmov q2, q10 -+1: -+ cmp r5, #12-48 -+ blt 1f -+ vst3.16 {d0, d2, d4}, [r0]! -+ beq 11b -+ vmov d0, d1 -+ sub r5, #12 -+ vmov d2, d3 -+ vmov d4, d5 -+1: -+ cmp r5, #6-48 -+ add r4, r0, #6 @ avoid [r0]! on sequential instructions -+ blt 1f -+ vst3.16 {d0[0], d2[0], d4[0]}, [r0] -+ vst3.16 {d0[1], d2[1], d4[1]}, [r4] -+ add r0, #12 -+ beq 11b -+ vmov s0, s1 -+ sub r5, #6 -+ vmov s4, s5 -+ vmov s8, s9 -+1: -+ cmp r5, #3-48 -+ blt 1f -+ vst3.16 {d0[0], d2[0], d4[0]}, [r0]! -+ beq 11b -+ sub r5, #3 -+ vshr.u32 d0, #16 -+ vshr.u32 d2, #16 -+1: -+ cmp r5, #2-48 -+ blt 1f -+ vst2.16 {d0[0], d2[0]}, [r0]! -+ b 11b -+1: -+ vst1.16 {d0[0]}, [r0]! -+ b 11b -+ -+endfunc -+ -+ -+@ void ff_rpi_sand30_lines_to_planar_c16( -+@ uint8_t * dst_u, // [r0] -+@ unsigned int dst_stride_u, // [r1] -+@ uint8_t * dst_v, // [r2] -+@ unsigned int dst_stride_v, // [r3] -+@ const uint8_t * src, // [sp, #0] -> r4, r5 -+@ unsigned int stride1, // [sp, #4] 128 -+@ unsigned int stride2, // [sp, #8] -> r8 -+@ unsigned int _x, // [sp, #12] 0 -+@ unsigned int y, // [sp, #16] (r7 in prefix) -+@ unsigned int _w, // [sp, #20] -> r6, r9 -+@ unsigned int h); // [sp, #24] -> r7 -+@ -+@ Assumes that we are starting on a stripe boundary and that overreading -+@ within the stripe is OK. However it does respect the dest size for writing -+ -+function ff_rpi_sand30_lines_to_planar_c16, export=1 -+ push {r4-r10, lr} @ +32 -+ ldr r5, [sp, #32] -+ ldr r8, [sp, #40] -+ ldr r7, [sp, #48] -+ ldr r9, [sp, #52] -+ mov r12, #48 -+ vmov.u16 q15, #0x3ff -+ sub r8, #1 -+ lsl r8, #7 -+ add r5, r5, r7, lsl #7 -+ sub r1, r1, r9, lsl #1 -+ sub r3, r3, r9, lsl #1 -+ ldr r7, [sp, #56] -+10: -+ mov lr, #0 -+ mov r4, r5 -+ mov r6, r9 -+1: -+ vldm r4!, {q0-q3} -+ add lr, #64 -+ -+ @ N.B. unpack [0,1,2] -> (reg order) 1, 0, 2 -+ vshr.u32 q14, q0, #20 -+ vshrn.u32 d16, q0, #10 -+ vmovn.u32 d18, q0 -+ ands lr, #127 -+ vmovn.u32 d20, q14 -+ -+ vshr.u32 q14, q1, #20 -+ vshrn.u32 d17, q1, #10 -+ vmovn.u32 d19, q1 -+ vmovn.u32 d21, q14 -+ -+ vshr.u32 q14, q2, #20 -+ vshrn.u32 d22, q2, #10 -+ vmovn.u32 d24, q2 -+ vmovn.u32 d26, q14 -+ -+ vshr.u32 q14, q3, #20 -+ vshrn.u32 d23, q3, #10 -+ vmovn.u32 d25, q3 -+ add r10, r0, #24 -+ vmovn.u32 d27, q14 -+ -+ it eq -+ addeq r4, r8 -+ vuzp.16 q8, q11 -+ vuzp.16 q9, q12 -+ vuzp.16 q10, q13 -+ -+ @ q8 V0, V3,.. -> q0 -+ @ q9 U0, U3... -+ @ q10 U1, U4... -+ @ q11 U2, U5,.. -+ @ q12 V1, V4,.. -> q1 -+ @ q13 V2, V5,.. -> q2 -+ -+ subs r6, #24 -+ vand q11, q15 -+ vand q9, q15 -+ vand q10, q15 -+ vand q0, q8, q15 -+ vand q1, q12, q15 -+ vand q2, q13, q15 -+ -+ blt 2f -+ -+ vst3.16 {d18, d20, d22}, [r0], r12 -+ vst3.16 {d19, d21, d23}, [r10] -+ add r10, r2, #24 -+ vst3.16 {d0, d2, d4}, [r2], r12 -+ vst3.16 {d1, d3, d5}, [r10] -+ -+ bne 1b -+ -+11: -+ subs r7, #1 -+ add r5, #128 -+ add r0, r1 -+ add r2, r3 -+ bne 10b -+ -+ pop {r4-r10, pc} -+ -+@ Partial final write -+2: -+ cmp r6, #-12 -+ blt 1f -+ vst3.16 {d18, d20, d22}, [r0]! -+ vst3.16 {d0, d2, d4}, [r2]! -+ beq 11b -+ vmov d18, d19 -+ vmov d20, d21 -+ vmov d22, d23 -+ sub r6, #12 -+ vmov d0, d1 -+ vmov d2, d3 -+ vmov d4, d5 -+1: -+ cmp r6, #-18 -+ @ Rezip here as it makes the remaining tail handling easier -+ vzip.16 d0, d18 -+ vzip.16 d2, d20 -+ vzip.16 d4, d22 -+ blt 1f -+ vst3.16 {d0[1], d2[1], d4[1]}, [r0]! -+ vst3.16 {d0[0], d2[0], d4[0]}, [r2]! -+ vst3.16 {d0[3], d2[3], d4[3]}, [r0]! -+ vst3.16 {d0[2], d2[2], d4[2]}, [r2]! -+ beq 11b -+ vmov d0, d18 -+ vmov d2, d20 -+ sub r6, #6 -+ vmov d4, d22 -+1: -+ cmp r6, #-21 -+ blt 1f -+ vst3.16 {d0[1], d2[1], d4[1]}, [r0]! -+ vst3.16 {d0[0], d2[0], d4[0]}, [r2]! -+ beq 11b -+ vmov s4, s5 -+ sub r6, #3 -+ vmov s0, s1 -+1: -+ cmp r6, #-22 -+ blt 1f -+ vst2.16 {d0[1], d2[1]}, [r0]! -+ vst2.16 {d0[0], d2[0]}, [r2]! -+ b 11b -+1: -+ vst1.16 {d0[1]}, [r0]! -+ vst1.16 {d0[0]}, [r2]! -+ b 11b -+ -+endfunc -+ -+@ void ff_rpi_sand30_lines_to_planar_p010( -+@ uint8_t * dest, // [r0] -+@ unsigned int dst_stride, // [r1] -+@ const uint8_t * src, // [r2] -+@ unsigned int src_stride1, // [r3] Ignored - assumed 128 -+@ unsigned int src_stride2, // [sp, #0] -> r3 -+@ unsigned int _x, // [sp, #4] Ignored - 0 -+@ unsigned int y, // [sp, #8] (r7 in prefix) -+@ unsigned int _w, // [sp, #12] -> r6 (cur r5) -+@ unsigned int h); // [sp, #16] -> r7 -+@ -+@ Assumes that we are starting on a stripe boundary and that overreading -+@ within the stripe is OK. However it does respect the dest size for writing -+ -+function ff_rpi_sand30_lines_to_planar_p010, export=1 -+ push {r4-r8, lr} @ +24 -+ ldr r3, [sp, #24] -+ ldr r6, [sp, #36] -+ ldr r7, [sp, #32] @ y -+ mov r12, #48 -+ vmov.u16 q15, #0xffc0 -+ sub r3, #1 -+ lsl r3, #7 -+ sub r1, r1, r6, lsl #1 -+ add r8, r2, r7, lsl #7 -+ ldr r7, [sp, #40] -+ -+10: -+ mov r2, r8 -+ add r4, r0, #24 -+ mov r5, r6 -+ mov lr, #0 -+1: -+ vldm r2!, {q10-q13} -+ add lr, #64 -+ -+ vshl.u32 q14, q10, #6 -+ ands lr, #127 -+ vshrn.u32 d4, q10, #14 -+ vshrn.u32 d2, q10, #4 -+ vmovn.u32 d0, q14 -+ -+ vshl.u32 q14, q11, #6 -+ it eq -+ addeq r2, r3 -+ vshrn.u32 d5, q11, #14 -+ vshrn.u32 d3, q11, #4 -+ vmovn.u32 d1, q14 -+ -+ subs r5, #48 -+ vand q2, q15 -+ vand q1, q15 -+ vand q0, q15 -+ -+ vshl.u32 q14, q12, #6 -+ vshrn.u32 d20, q12, #14 -+ vshrn.u32 d18, q12, #4 -+ vmovn.u32 d16, q14 -+ -+ vshl.u32 q14, q13, #6 -+ vshrn.u32 d21, q13, #14 -+ vshrn.u32 d19, q13, #4 -+ vmovn.u32 d17, q14 -+ -+ vand q10, q15 -+ vand q9, q15 -+ vand q8, q15 -+ blt 2f -+ -+ vst3.16 {d0, d2, d4}, [r0], r12 -+ vst3.16 {d1, d3, d5}, [r4], r12 -+ vst3.16 {d16, d18, d20}, [r0], r12 -+ vst3.16 {d17, d19, d21}, [r4], r12 -+ -+ bne 1b -+ -+11: -+ subs r7, #1 -+ add r0, r1 -+ add r8, #128 -+ bne 10b -+ -+ pop {r4-r8, pc} -+ -+@ Partial final write -+2: -+ cmp r5, #24-48 -+ blt 1f -+ vst3.16 {d0, d2, d4}, [r0], r12 -+ vst3.16 {d1, d3, d5}, [r4] -+ beq 11b -+ vmov q0, q8 -+ sub r5, #24 -+ vmov q1, q9 -+ vmov q2, q10 -+1: -+ cmp r5, #12-48 -+ blt 1f -+ vst3.16 {d0, d2, d4}, [r0]! -+ beq 11b -+ vmov d0, d1 -+ sub r5, #12 -+ vmov d2, d3 -+ vmov d4, d5 -+1: -+ cmp r5, #6-48 -+ add r4, r0, #6 @ avoid [r0]! on sequential instructions -+ blt 1f -+ vst3.16 {d0[0], d2[0], d4[0]}, [r0] -+ vst3.16 {d0[1], d2[1], d4[1]}, [r4] -+ add r0, #12 -+ beq 11b -+ vmov s0, s1 -+ sub r5, #6 -+ vmov s4, s5 -+ vmov s8, s9 -+1: -+ cmp r5, #3-48 -+ blt 1f -+ vst3.16 {d0[0], d2[0], d4[0]}, [r0]! -+ beq 11b -+ sub r5, #3 -+ vshr.u32 d0, #16 -+ vshr.u32 d2, #16 -+1: -+ cmp r5, #2-48 -+ blt 1f -+ vst2.16 {d0[0], d2[0]}, [r0]! -+ b 11b -+1: -+ vst1.16 {d0[0]}, [r0]! -+ b 11b -+ -+endfunc -+ -+ -+ -diff --git a/libavutil/arm/rpi_sand_neon.h b/libavutil/arm/rpi_sand_neon.h -new file mode 100644 -index 0000000000..447f367bea ---- /dev/null -+++ b/libavutil/arm/rpi_sand_neon.h -@@ -0,0 +1,99 @@ -+/* -+Copyright (c) 2020 Raspberry Pi (Trading) Ltd. -+All rights reserved. -+ -+Redistribution and use in source and binary forms, with or without -+modification, are permitted provided that the following conditions are met: -+ * Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+ * Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+ * Neither the name of the copyright holder nor the -+ names of its contributors may be used to endorse or promote products -+ derived from this software without specific prior written permission. -+ -+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY -+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+Authors: John Cox -+*/ -+ -+#ifndef AVUTIL_ARM_SAND_NEON_H -+#define AVUTIL_ARM_SAND_NEON_H -+ -+void ff_rpi_sand128b_stripe_to_8_10( -+ uint8_t * dest, // [r0] -+ const uint8_t * src1, // [r1] -+ const uint8_t * src2, // [r2] -+ unsigned int lines); // [r3] -+ -+void ff_rpi_sand8_lines_to_planar_y8( -+ uint8_t * dest, // [r0] -+ unsigned int dst_stride, // [r1] -+ const uint8_t * src, // [r2] -+ unsigned int src_stride1, // [r3] Ignored - assumed 128 -+ unsigned int src_stride2, // [sp, #0] -> r3 -+ unsigned int _x, // [sp, #4] Ignored - 0 -+ unsigned int y, // [sp, #8] (r7 in prefix) -+ unsigned int _w, // [sp, #12] -> r6 (cur r5) -+ unsigned int h); // [sp, #16] -> r7 -+ -+void ff_rpi_sand8_lines_to_planar_c8( -+ uint8_t * dst_u, // [r0] -+ unsigned int dst_stride_u, // [r1] -+ uint8_t * dst_v, // [r2] -+ unsigned int dst_stride_v, // [r3] -+ const uint8_t * src, // [sp, #0] -> r4, r5 -+ unsigned int stride1, // [sp, #4] 128 -+ unsigned int stride2, // [sp, #8] -> r8 -+ unsigned int _x, // [sp, #12] 0 -+ unsigned int y, // [sp, #16] (r7 in prefix) -+ unsigned int _w, // [sp, #20] -> r12, r6 -+ unsigned int h); // [sp, #24] -> r7 -+ -+void ff_rpi_sand30_lines_to_planar_y16( -+ uint8_t * dest, // [r0] -+ unsigned int dst_stride, // [r1] -+ const uint8_t * src, // [r2] -+ unsigned int src_stride1, // [r3] Ignored - assumed 128 -+ unsigned int src_stride2, // [sp, #0] -> r3 -+ unsigned int _x, // [sp, #4] Ignored - 0 -+ unsigned int y, // [sp, #8] (r7 in prefix) -+ unsigned int _w, // [sp, #12] -> r6 (cur r5) -+ unsigned int h); // [sp, #16] -> r7 -+ -+void ff_rpi_sand30_lines_to_planar_c16( -+ uint8_t * dst_u, // [r0] -+ unsigned int dst_stride_u, // [r1] -+ uint8_t * dst_v, // [r2] -+ unsigned int dst_stride_v, // [r3] -+ const uint8_t * src, // [sp, #0] -> r4, r5 -+ unsigned int stride1, // [sp, #4] 128 -+ unsigned int stride2, // [sp, #8] -> r8 -+ unsigned int _x, // [sp, #12] 0 -+ unsigned int y, // [sp, #16] (r7 in prefix) -+ unsigned int _w, // [sp, #20] -> r6, r9 -+ unsigned int h); // [sp, #24] -> r7 -+ -+void ff_rpi_sand30_lines_to_planar_p010( -+ uint8_t * dest, // [r0] -+ unsigned int dst_stride, // [r1] -+ const uint8_t * src, // [r2] -+ unsigned int src_stride1, // [r3] Ignored - assumed 128 -+ unsigned int src_stride2, // [sp, #0] -> r3 -+ unsigned int _x, // [sp, #4] Ignored - 0 -+ unsigned int y, // [sp, #8] (r7 in prefix) -+ unsigned int _w, // [sp, #12] -> r6 (cur r5) -+ unsigned int h); // [sp, #16] -> r7 -+ -+#endif // AVUTIL_ARM_SAND_NEON_H -+ -diff --git a/libavutil/pixdesc.c b/libavutil/pixdesc.c -index 62a2ae08d9..cb73521ea7 100644 ---- a/libavutil/pixdesc.c -+++ b/libavutil/pixdesc.c -@@ -2717,6 +2717,50 @@ static const AVPixFmtDescriptor av_pix_fmt_descriptors[AV_PIX_FMT_NB] = { - .flags = AV_PIX_FMT_FLAG_RGB | AV_PIX_FMT_FLAG_FLOAT | - AV_PIX_FMT_FLAG_ALPHA, - }, -+ [AV_PIX_FMT_SAND128] = { -+ .name = "sand128", -+ .nb_components = 3, -+ .log2_chroma_w = 1, -+ .log2_chroma_h = 1, -+ .comp = { -+ { 0, 1, 0, 0, 8 }, /* Y */ -+ { 1, 2, 0, 0, 8 }, /* U */ -+ { 1, 2, 1, 0, 8 }, /* V */ -+ }, -+ .flags = 0, -+ }, -+ [AV_PIX_FMT_SAND64_10] = { -+ .name = "sand64_10", -+ .nb_components = 3, -+ .log2_chroma_w = 1, -+ .log2_chroma_h = 1, -+ .comp = { -+ { 0, 2, 0, 0, 10 }, /* Y */ -+ { 1, 4, 0, 0, 10 }, /* U */ -+ { 1, 4, 2, 0, 10 }, /* V */ -+ }, -+ .flags = 0, -+ }, -+ [AV_PIX_FMT_SAND64_16] = { -+ .name = "sand64_16", -+ .nb_components = 3, -+ .log2_chroma_w = 1, -+ .log2_chroma_h = 1, -+ .comp = { -+ { 0, 2, 0, 0, 16 }, /* Y */ -+ { 1, 4, 0, 0, 16 }, /* U */ -+ { 1, 4, 2, 0, 16 }, /* V */ -+ }, -+ .flags = 0, -+ }, -+ [AV_PIX_FMT_RPI4_8] = { -+ .name = "rpi4_8", -+ .flags = AV_PIX_FMT_FLAG_HWACCEL, -+ }, -+ [AV_PIX_FMT_RPI4_10] = { -+ .name = "rpi4_10", -+ .flags = AV_PIX_FMT_FLAG_HWACCEL, -+ }, - }; - - static const char * const color_range_names[] = { -diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h -index 37c2c79e01..22f70007c3 100644 ---- a/libavutil/pixfmt.h -+++ b/libavutil/pixfmt.h -@@ -377,6 +377,12 @@ enum AVPixelFormat { - - AV_PIX_FMT_Y210BE, ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, big-endian - AV_PIX_FMT_Y210LE, ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, little-endian -+// RPI - not on ifdef so can be got at by calling progs -+ AV_PIX_FMT_SAND128, ///< 4:2:0 8-bit 128x*Y stripe, 64x*UV stripe, then next x stripe, mysterious padding -+ AV_PIX_FMT_SAND64_10, ///< 4:2:0 10-bit 64x*Y stripe, 32x*UV stripe, then next x stripe, mysterious padding -+ AV_PIX_FMT_SAND64_16, ///< 4:2:0 16-bit 64x*Y stripe, 32x*UV stripe, then next x stripe, mysterious padding -+ AV_PIX_FMT_RPI4_8, -+ AV_PIX_FMT_RPI4_10, - - AV_PIX_FMT_X2RGB10LE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined - AV_PIX_FMT_X2RGB10BE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), big-endian, X=unused/undefined -diff --git a/libavutil/rpi_sand_fn_pw.h b/libavutil/rpi_sand_fn_pw.h -new file mode 100644 -index 0000000000..0324f6826d ---- /dev/null -+++ b/libavutil/rpi_sand_fn_pw.h -@@ -0,0 +1,227 @@ -+/* -+Copyright (c) 2018 Raspberry Pi (Trading) Ltd. -+All rights reserved. -+ -+Redistribution and use in source and binary forms, with or without -+modification, are permitted provided that the following conditions are met: -+ * Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+ * Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+ * Neither the name of the copyright holder nor the -+ names of its contributors may be used to endorse or promote products -+ derived from this software without specific prior written permission. -+ -+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY -+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+Authors: John Cox -+*/ -+ -+// * Included twice from rpi_sand_fn with different PW -+ -+#define STRCAT(x,y) x##y -+ -+#if PW == 1 -+#define pixel uint8_t -+#define FUNC(f) STRCAT(f, 8) -+#elif PW == 2 -+#define pixel uint16_t -+#define FUNC(f) STRCAT(f, 16) -+#else -+#error Unexpected PW -+#endif -+ -+// Fetches a single patch - offscreen fixup not done here -+// w <= stride1 -+// unclipped -+void FUNC(av_rpi_sand_to_planar_y)(uint8_t * dst, const unsigned int dst_stride, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h) -+{ -+ const unsigned int x = _x; -+ const unsigned int w = _w; -+ const unsigned int mask = stride1 - 1; -+ -+#if PW == 1 && (HAVE_SAND_ASM || HAVE_SAND_ASM64) -+ if (_x == 0) { -+ ff_rpi_sand8_lines_to_planar_y8(dst, dst_stride, -+ src, stride1, stride2, _x, y, _w, h); -+ return; -+ } -+#endif -+ -+ if ((x & ~mask) == ((x + w) & ~mask)) { -+ // All in one sand stripe -+ const uint8_t * p = src + (x & mask) + y * stride1 + (x & ~mask) * stride2; -+ for (unsigned int i = 0; i != h; ++i, dst += dst_stride, p += stride1) { -+ memcpy(dst, p, w); -+ } -+ } -+ else -+ { -+ // Two+ stripe -+ const unsigned int sstride = stride1 * stride2; -+ const uint8_t * p1 = src + (x & mask) + y * stride1 + (x & ~mask) * stride2; -+ const uint8_t * p2 = p1 + sstride - (x & mask); -+ const unsigned int w1 = stride1 - (x & mask); -+ const unsigned int w3 = (x + w) & mask; -+ const unsigned int w2 = w - (w1 + w3); -+ -+ for (unsigned int i = 0; i != h; ++i, dst += dst_stride, p1 += stride1, p2 += stride1) { -+ unsigned int j; -+ const uint8_t * p = p2; -+ uint8_t * d = dst; -+ memcpy(d, p1, w1); -+ d += w1; -+ for (j = 0; j < w2; j += stride1, d += stride1, p += sstride) { -+ memcpy(d, p, stride1); -+ } -+ memcpy(d, p, w3); -+ } -+ } -+} -+ -+// x & w in bytes but not of interleave (i.e. offset = x*2 for U&V) -+ -+void FUNC(av_rpi_sand_to_planar_c)(uint8_t * dst_u, const unsigned int dst_stride_u, -+ uint8_t * dst_v, const unsigned int dst_stride_v, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h) -+{ -+ const unsigned int x = _x * 2; -+ const unsigned int w = _w * 2; -+ const unsigned int mask = stride1 - 1; -+ -+#if PW == 1 && (HAVE_SAND_ASM || HAVE_SAND_ASM64) -+ if (_x == 0) { -+ ff_rpi_sand8_lines_to_planar_c8(dst_u, dst_stride_u, dst_v, dst_stride_v, -+ src, stride1, stride2, _x, y, _w, h); -+ return; -+ } -+#endif -+ -+ if ((x & ~mask) == ((x + w) & ~mask)) { -+ // All in one sand stripe -+ const uint8_t * p1 = src + (x & mask) + y * stride1 + (x & ~mask) * stride2; -+ for (unsigned int i = 0; i != h; ++i, dst_u += dst_stride_u, dst_v += dst_stride_v, p1 += stride1) { -+ pixel * du = (pixel *)dst_u; -+ pixel * dv = (pixel *)dst_v; -+ const pixel * p = (const pixel *)p1; -+ for (unsigned int k = 0; k < w; k += 2 * PW) { -+ *du++ = *p++; -+ *dv++ = *p++; -+ } -+ } -+ } -+ else -+ { -+ // Two+ stripe -+ const unsigned int sstride = stride1 * stride2; -+ const unsigned int sstride_p = (sstride - stride1) / PW; -+ -+ const uint8_t * p1 = src + (x & mask) + y * stride1 + (x & ~mask) * stride2; -+ const uint8_t * p2 = p1 + sstride - (x & mask); -+ const unsigned int w1 = stride1 - (x & mask); -+ const unsigned int w3 = (x + w) & mask; -+ const unsigned int w2 = w - (w1 + w3); -+ -+ for (unsigned int i = 0; i != h; ++i, dst_u += dst_stride_u, dst_v += dst_stride_v, p1 += stride1, p2 += stride1) { -+ unsigned int j; -+ const pixel * p = (const pixel *)p1; -+ pixel * du = (pixel *)dst_u; -+ pixel * dv = (pixel *)dst_v; -+ for (unsigned int k = 0; k < w1; k += 2 * PW) { -+ *du++ = *p++; -+ *dv++ = *p++; -+ } -+ for (j = 0, p = (const pixel *)p2; j < w2; j += stride1, p += sstride_p) { -+ for (unsigned int k = 0; k < stride1; k += 2 * PW) { -+ *du++ = *p++; -+ *dv++ = *p++; -+ } -+ } -+ for (unsigned int k = 0; k < w3; k += 2 * PW) { -+ *du++ = *p++; -+ *dv++ = *p++; -+ } -+ } -+ } -+} -+ -+void FUNC(av_rpi_planar_to_sand_c)(uint8_t * dst_c, -+ unsigned int stride1, unsigned int stride2, -+ const uint8_t * src_u, const unsigned int src_stride_u, -+ const uint8_t * src_v, const unsigned int src_stride_v, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h) -+{ -+ const unsigned int x = _x * 2; -+ const unsigned int w = _w * 2; -+ const unsigned int mask = stride1 - 1; -+ if ((x & ~mask) == ((x + w) & ~mask)) { -+ // All in one sand stripe -+ uint8_t * p1 = dst_c + (x & mask) + y * stride1 + (x & ~mask) * stride2; -+ for (unsigned int i = 0; i != h; ++i, src_u += src_stride_u, src_v += src_stride_v, p1 += stride1) { -+ const pixel * su = (const pixel *)src_u; -+ const pixel * sv = (const pixel *)src_v; -+ pixel * p = (pixel *)p1; -+ for (unsigned int k = 0; k < w; k += 2 * PW) { -+ *p++ = *su++; -+ *p++ = *sv++; -+ } -+ } -+ } -+ else -+ { -+ // Two+ stripe -+ const unsigned int sstride = stride1 * stride2; -+ const unsigned int sstride_p = (sstride - stride1) / PW; -+ -+ const uint8_t * p1 = dst_c + (x & mask) + y * stride1 + (x & ~mask) * stride2; -+ const uint8_t * p2 = p1 + sstride - (x & mask); -+ const unsigned int w1 = stride1 - (x & mask); -+ const unsigned int w3 = (x + w) & mask; -+ const unsigned int w2 = w - (w1 + w3); -+ -+ for (unsigned int i = 0; i != h; ++i, src_u += src_stride_u, src_v += src_stride_v, p1 += stride1, p2 += stride1) { -+ unsigned int j; -+ const pixel * su = (const pixel *)src_u; -+ const pixel * sv = (const pixel *)src_v; -+ pixel * p = (pixel *)p1; -+ for (unsigned int k = 0; k < w1; k += 2 * PW) { -+ *p++ = *su++; -+ *p++ = *sv++; -+ } -+ for (j = 0, p = (pixel *)p2; j < w2; j += stride1, p += sstride_p) { -+ for (unsigned int k = 0; k < stride1; k += 2 * PW) { -+ *p++ = *su++; -+ *p++ = *sv++; -+ } -+ } -+ for (unsigned int k = 0; k < w3; k += 2 * PW) { -+ *p++ = *su++; -+ *p++ = *sv++; -+ } -+ } -+ } -+} -+ -+ -+#undef pixel -+#undef STRCAT -+#undef FUNC -+ -diff --git a/libavutil/rpi_sand_fns.c b/libavutil/rpi_sand_fns.c -new file mode 100644 -index 0000000000..ed0261b02f ---- /dev/null -+++ b/libavutil/rpi_sand_fns.c -@@ -0,0 +1,353 @@ -+/* -+Copyright (c) 2018 Raspberry Pi (Trading) Ltd. -+All rights reserved. -+ -+Redistribution and use in source and binary forms, with or without -+modification, are permitted provided that the following conditions are met: -+ * Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+ * Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+ * Neither the name of the copyright holder nor the -+ names of its contributors may be used to endorse or promote products -+ derived from this software without specific prior written permission. -+ -+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY -+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+Authors: John Cox -+*/ -+ -+#include "config.h" -+#include -+#include -+#include "rpi_sand_fns.h" -+#include "avassert.h" -+#include "frame.h" -+ -+#if ARCH_ARM && HAVE_NEON -+#include "arm/rpi_sand_neon.h" -+#define HAVE_SAND_ASM 1 -+#else -+#define HAVE_SAND_ASM 0 -+#endif -+ -+#define PW 1 -+#include "rpi_sand_fn_pw.h" -+#undef PW -+ -+#define PW 2 -+#include "rpi_sand_fn_pw.h" -+#undef PW -+ -+#if 1 -+// Simple round -+static void cpy16_to_8(uint8_t * dst, const uint8_t * _src, unsigned int n, const unsigned int shr) -+{ -+ const unsigned int rnd = (1 << shr) >> 1; -+ const uint16_t * src = (const uint16_t *)_src; -+ -+ for (; n != 0; --n) { -+ *dst++ = (*src++ + rnd) >> shr; -+ } -+} -+#else -+// Dithered variation -+static void cpy16_to_8(uint8_t * dst, const uint8_t * _src, unsigned int n, const unsigned int shr) -+{ -+ unsigned int rnd = (1 << shr) >> 1; -+ const unsigned int mask = ((1 << shr) - 1); -+ const uint16_t * src = (const uint16_t *)_src; -+ -+ for (; n != 0; --n) { -+ rnd = *src++ + (rnd & mask); -+ *dst++ = rnd >> shr; -+ } -+} -+#endif -+ -+// Fetches a single patch - offscreen fixup not done here -+// w <= stride1 -+// unclipped -+// _x & _w in pixels, strides in bytes -+void av_rpi_sand30_to_planar_y16(uint8_t * dst, const unsigned int dst_stride, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h) -+{ -+ const unsigned int x0 = (_x / 3) * 4; // Byte offset of the word -+ const unsigned int xskip0 = _x - (x0 >> 2) * 3; -+ const unsigned int x1 = ((_x + _w) / 3) * 4; -+ const unsigned int xrem1 = _x + _w - (x1 >> 2) * 3; -+ const unsigned int mask = stride1 - 1; -+ const uint8_t * p0 = src + (x0 & mask) + y * stride1 + (x0 & ~mask) * stride2; -+ const unsigned int slice_inc = ((stride2 - 1) * stride1) >> 2; // RHS of a stripe to LHS of next in words -+ -+#if HAVE_SAND_ASM -+ if (_x == 0) { -+ ff_rpi_sand30_lines_to_planar_y16(dst, dst_stride, src, stride1, stride2, _x, y, _w, h); -+ return; -+ } -+#endif -+ -+ if (x0 == x1) { -+ // ******************* -+ // Partial single word xfer -+ return; -+ } -+ -+ for (unsigned int i = 0; i != h; ++i, dst += dst_stride, p0 += stride1) -+ { -+ unsigned int x = x0; -+ const uint32_t * p = (const uint32_t *)p0; -+ uint16_t * d = (uint16_t *)dst; -+ -+ if (xskip0 != 0) { -+ const uint32_t p3 = *p++; -+ -+ if (xskip0 == 1) -+ *d++ = (p3 >> 10) & 0x3ff; -+ *d++ = (p3 >> 20) & 0x3ff; -+ -+ if (((x += 4) & mask) == 0) -+ p += slice_inc; -+ } -+ -+ while (x != x1) { -+ const uint32_t p3 = *p++; -+ *d++ = p3 & 0x3ff; -+ *d++ = (p3 >> 10) & 0x3ff; -+ *d++ = (p3 >> 20) & 0x3ff; -+ -+ if (((x += 4) & mask) == 0) -+ p += slice_inc; -+ } -+ -+ if (xrem1 != 0) { -+ const uint32_t p3 = *p; -+ -+ *d++ = p3 & 0x3ff; -+ if (xrem1 == 2) -+ *d++ = (p3 >> 10) & 0x3ff; -+ } -+ } -+} -+ -+ -+void av_rpi_sand30_to_planar_c16(uint8_t * dst_u, const unsigned int dst_stride_u, -+ uint8_t * dst_v, const unsigned int dst_stride_v, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h) -+{ -+ const unsigned int x0 = (_x / 3) * 8; // Byte offset of the word -+ const unsigned int xskip0 = _x - (x0 >> 3) * 3; -+ const unsigned int x1 = ((_x + _w) / 3) * 8; -+ const unsigned int xrem1 = _x + _w - (x1 >> 3) * 3; -+ const unsigned int mask = stride1 - 1; -+ const uint8_t * p0 = src + (x0 & mask) + y * stride1 + (x0 & ~mask) * stride2; -+ const unsigned int slice_inc = ((stride2 - 1) * stride1) >> 2; // RHS of a stripe to LHS of next in words -+ -+#if HAVE_SAND_ASM -+ if (_x == 0) { -+ ff_rpi_sand30_lines_to_planar_c16(dst_u, dst_stride_u, dst_v, dst_stride_v, -+ src, stride1, stride2, _x, y, _w, h); -+ return; -+ } -+#endif -+ -+ if (x0 == x1) { -+ // ******************* -+ // Partial single word xfer -+ return; -+ } -+ -+ for (unsigned int i = 0; i != h; ++i, dst_u += dst_stride_u, dst_v += dst_stride_v, p0 += stride1) -+ { -+ unsigned int x = x0; -+ const uint32_t * p = (const uint32_t *)p0; -+ uint16_t * du = (uint16_t *)dst_u; -+ uint16_t * dv = (uint16_t *)dst_v; -+ -+ if (xskip0 != 0) { -+ const uint32_t p3a = *p++; -+ const uint32_t p3b = *p++; -+ -+ if (xskip0 == 1) -+ { -+ *du++ = (p3a >> 20) & 0x3ff; -+ *dv++ = (p3b >> 0) & 0x3ff; -+ } -+ *du++ = (p3b >> 10) & 0x3ff; -+ *dv++ = (p3b >> 20) & 0x3ff; -+ -+ if (((x += 8) & mask) == 0) -+ p += slice_inc; -+ } -+ -+ while (x != x1) { -+ const uint32_t p3a = *p++; -+ const uint32_t p3b = *p++; -+ -+ *du++ = p3a & 0x3ff; -+ *dv++ = (p3a >> 10) & 0x3ff; -+ *du++ = (p3a >> 20) & 0x3ff; -+ *dv++ = p3b & 0x3ff; -+ *du++ = (p3b >> 10) & 0x3ff; -+ *dv++ = (p3b >> 20) & 0x3ff; -+ -+ if (((x += 8) & mask) == 0) -+ p += slice_inc; -+ } -+ -+ if (xrem1 != 0) { -+ const uint32_t p3a = *p++; -+ const uint32_t p3b = *p++; -+ -+ *du++ = p3a & 0x3ff; -+ *dv++ = (p3a >> 10) & 0x3ff; -+ if (xrem1 == 2) -+ { -+ *du++ = (p3a >> 20) & 0x3ff; -+ *dv++ = p3b & 0x3ff; -+ } -+ } -+ } -+} -+ -+ -+// w/h in pixels -+void av_rpi_sand16_to_sand8(uint8_t * dst, const unsigned int dst_stride1, const unsigned int dst_stride2, -+ const uint8_t * src, const unsigned int src_stride1, const unsigned int src_stride2, -+ unsigned int w, unsigned int h, const unsigned int shr) -+{ -+ const unsigned int n = dst_stride1 / 2; -+ unsigned int j; -+ -+ // This is true for our current layouts -+ av_assert0(dst_stride1 == src_stride1); -+ -+ // As we have the same stride1 for src & dest and src is wider than dest -+ // then if we loop on src we can always write contiguously to dest -+ // We make no effort to copy an exact width - round up to nearest src stripe -+ // as we will always have storage in dest for that -+ -+#if ARCH_ARM && HAVE_NEON -+ if (shr == 3 && src_stride1 == 128) { -+ for (j = 0; j + n < w; j += dst_stride1) { -+ uint8_t * d = dst + j * dst_stride2; -+ const uint8_t * s1 = src + j * 2 * src_stride2; -+ const uint8_t * s2 = s1 + src_stride1 * src_stride2; -+ -+ ff_rpi_sand128b_stripe_to_8_10(d, s1, s2, h); -+ } -+ } -+ else -+#endif -+ { -+ for (j = 0; j + n < w; j += dst_stride1) { -+ uint8_t * d = dst + j * dst_stride2; -+ const uint8_t * s1 = src + j * 2 * src_stride2; -+ const uint8_t * s2 = s1 + src_stride1 * src_stride2; -+ -+ for (unsigned int i = 0; i != h; ++i, s1 += src_stride1, s2 += src_stride1, d += dst_stride1) { -+ cpy16_to_8(d, s1, n, shr); -+ cpy16_to_8(d + n, s2, n, shr); -+ } -+ } -+ } -+ -+ // Fix up a trailing dest half stripe -+ if (j < w) { -+ uint8_t * d = dst + j * dst_stride2; -+ const uint8_t * s1 = src + j * 2 * src_stride2; -+ -+ for (unsigned int i = 0; i != h; ++i, s1 += src_stride1, d += dst_stride1) { -+ cpy16_to_8(d, s1, n, shr); -+ } -+ } -+} -+ -+int av_rpi_sand_to_planar_frame(AVFrame * const dst, const AVFrame * const src) -+{ -+ const int w = av_frame_cropped_width(src); -+ const int h = av_frame_cropped_height(src); -+ const int x = src->crop_left; -+ const int y = src->crop_top; -+ -+ // We will crop as part of the conversion -+ dst->crop_top = 0; -+ dst->crop_left = 0; -+ dst->crop_bottom = 0; -+ dst->crop_right = 0; -+ -+ switch (src->format){ -+ case AV_PIX_FMT_SAND128: -+ case AV_PIX_FMT_RPI4_8: -+ switch (dst->format){ -+ case AV_PIX_FMT_YUV420P: -+ av_rpi_sand_to_planar_y8(dst->data[0], dst->linesize[0], -+ src->data[0], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x, y, w, h); -+ av_rpi_sand_to_planar_c8(dst->data[1], dst->linesize[1], -+ dst->data[2], dst->linesize[2], -+ src->data[1], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x/2, y/2, w/2, h/2); -+ break; -+ default: -+ return -1; -+ } -+ break; -+ case AV_PIX_FMT_SAND64_10: -+ switch (dst->format){ -+ case AV_PIX_FMT_YUV420P10: -+ av_rpi_sand_to_planar_y16(dst->data[0], dst->linesize[0], -+ src->data[0], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x*2, y, w*2, h); -+ av_rpi_sand_to_planar_c16(dst->data[1], dst->linesize[1], -+ dst->data[2], dst->linesize[2], -+ src->data[1], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x, y/2, w, h/2); -+ break; -+ default: -+ return -1; -+ } -+ break; -+ case AV_PIX_FMT_RPI4_10: -+ switch (dst->format){ -+ case AV_PIX_FMT_YUV420P10: -+ av_rpi_sand30_to_planar_y16(dst->data[0], dst->linesize[0], -+ src->data[0], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x, y, w, h); -+ av_rpi_sand30_to_planar_c16(dst->data[1], dst->linesize[1], -+ dst->data[2], dst->linesize[2], -+ src->data[1], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x/2, y/2, w/2, h/2); -+ break; -+ default: -+ return -1; -+ } -+ break; -+ default: -+ return -1; -+ } -+ -+ return av_frame_copy_props(dst, src); -+} -diff --git a/libavutil/rpi_sand_fns.h b/libavutil/rpi_sand_fns.h -new file mode 100644 -index 0000000000..634b55e800 ---- /dev/null -+++ b/libavutil/rpi_sand_fns.h -@@ -0,0 +1,183 @@ -+/* -+Copyright (c) 2018 Raspberry Pi (Trading) Ltd. -+All rights reserved. -+ -+Redistribution and use in source and binary forms, with or without -+modification, are permitted provided that the following conditions are met: -+ * Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+ * Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+ * Neither the name of the copyright holder nor the -+ names of its contributors may be used to endorse or promote products -+ derived from this software without specific prior written permission. -+ -+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY -+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+Authors: John Cox -+*/ -+ -+#ifndef AVUTIL_RPI_SAND_FNS -+#define AVUTIL_RPI_SAND_FNS -+ -+#include "libavutil/frame.h" -+ -+// For all these fns _x & _w are measured as coord * PW -+// For the C fns coords are in chroma pels (so luma / 2) -+// Strides are in bytes -+ -+void av_rpi_sand_to_planar_y8(uint8_t * dst, const unsigned int dst_stride, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+void av_rpi_sand_to_planar_y16(uint8_t * dst, const unsigned int dst_stride, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+ -+void av_rpi_sand_to_planar_c8(uint8_t * dst_u, const unsigned int dst_stride_u, -+ uint8_t * dst_v, const unsigned int dst_stride_v, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+void av_rpi_sand_to_planar_c16(uint8_t * dst_u, const unsigned int dst_stride_u, -+ uint8_t * dst_v, const unsigned int dst_stride_v, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+ -+void av_rpi_planar_to_sand_c8(uint8_t * dst_c, -+ unsigned int stride1, unsigned int stride2, -+ const uint8_t * src_u, const unsigned int src_stride_u, -+ const uint8_t * src_v, const unsigned int src_stride_v, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+void av_rpi_planar_to_sand_c16(uint8_t * dst_c, -+ unsigned int stride1, unsigned int stride2, -+ const uint8_t * src_u, const unsigned int src_stride_u, -+ const uint8_t * src_v, const unsigned int src_stride_v, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+ -+void av_rpi_sand30_to_planar_y16(uint8_t * dst, const unsigned int dst_stride, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+void av_rpi_sand30_to_planar_c16(uint8_t * dst_u, const unsigned int dst_stride_u, -+ uint8_t * dst_v, const unsigned int dst_stride_v, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+ -+ -+// w/h in pixels -+void av_rpi_sand16_to_sand8(uint8_t * dst, const unsigned int dst_stride1, const unsigned int dst_stride2, -+ const uint8_t * src, const unsigned int src_stride1, const unsigned int src_stride2, -+ unsigned int w, unsigned int h, const unsigned int shr); -+ -+ -+// dst must contain required pixel format & allocated data buffers -+// Cropping on the src buffer will be honoured and dst crop will be set to zero -+int av_rpi_sand_to_planar_frame(AVFrame * const dst, const AVFrame * const src); -+ -+ -+static inline unsigned int av_rpi_sand_frame_stride1(const AVFrame * const frame) -+{ -+#ifdef RPI_ZC_SAND128_ONLY -+ // If we are sure we only only support 128 byte sand formats replace the -+ // var with a constant which should allow for better optimisation -+ return 128; -+#else -+ return frame->linesize[0]; -+#endif -+} -+ -+static inline unsigned int av_rpi_sand_frame_stride2(const AVFrame * const frame) -+{ -+ return frame->linesize[3]; -+} -+ -+ -+static inline int av_rpi_is_sand_format(const int format) -+{ -+ return (format >= AV_PIX_FMT_SAND128 && format <= AV_PIX_FMT_RPI4_10); -+} -+ -+static inline int av_rpi_is_sand_frame(const AVFrame * const frame) -+{ -+ return av_rpi_is_sand_format(frame->format); -+} -+ -+static inline int av_rpi_is_sand8_frame(const AVFrame * const frame) -+{ -+ return (frame->format == AV_PIX_FMT_SAND128 || frame->format == AV_PIX_FMT_RPI4_8); -+} -+ -+static inline int av_rpi_is_sand16_frame(const AVFrame * const frame) -+{ -+ return (frame->format >= AV_PIX_FMT_SAND64_10 && frame->format <= AV_PIX_FMT_SAND64_16); -+} -+ -+static inline int av_rpi_is_sand30_frame(const AVFrame * const frame) -+{ -+ return (frame->format == AV_PIX_FMT_RPI4_10); -+} -+ -+static inline int av_rpi_sand_frame_xshl(const AVFrame * const frame) -+{ -+ return av_rpi_is_sand8_frame(frame) ? 0 : 1; -+} -+ -+// If x is measured in bytes (not pixels) then this works for sand64_16 as -+// well as sand128 - but in the general case we work that out -+ -+static inline unsigned int av_rpi_sand_frame_off_y(const AVFrame * const frame, const unsigned int x_y, const unsigned int y) -+{ -+ const unsigned int stride1 = av_rpi_sand_frame_stride1(frame); -+ const unsigned int stride2 = av_rpi_sand_frame_stride2(frame); -+ const unsigned int x = x_y << av_rpi_sand_frame_xshl(frame); -+ const unsigned int x1 = x & (stride1 - 1); -+ const unsigned int x2 = x ^ x1; -+ -+ return x1 + stride1 * y + stride2 * x2; -+} -+ -+static inline unsigned int av_rpi_sand_frame_off_c(const AVFrame * const frame, const unsigned int x_c, const unsigned int y_c) -+{ -+ const unsigned int stride1 = av_rpi_sand_frame_stride1(frame); -+ const unsigned int stride2 = av_rpi_sand_frame_stride2(frame); -+ const unsigned int x = x_c << (av_rpi_sand_frame_xshl(frame) + 1); -+ const unsigned int x1 = x & (stride1 - 1); -+ const unsigned int x2 = x ^ x1; -+ -+ return x1 + stride1 * y_c + stride2 * x2; -+} -+ -+static inline uint8_t * av_rpi_sand_frame_pos_y(const AVFrame * const frame, const unsigned int x, const unsigned int y) -+{ -+ return frame->data[0] + av_rpi_sand_frame_off_y(frame, x, y); -+} -+ -+static inline uint8_t * av_rpi_sand_frame_pos_c(const AVFrame * const frame, const unsigned int x, const unsigned int y) -+{ -+ return frame->data[1] + av_rpi_sand_frame_off_c(frame, x, y); -+} -+ -+#endif -+ - -From 89b8d6ac2a886749d4594656083753e682de05a7 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 11:36:47 +0100 -Subject: [PATCH 003/151] Add aarch64 asm sand conv functions - -Many thanks to eiler.mike@gmail.com (Michael Eiler) for these -optimizations ---- - libavutil/aarch64/Makefile | 2 + - libavutil/aarch64/rpi_sand_neon.S | 676 ++++++++++++++++++++++++++++++ - libavutil/aarch64/rpi_sand_neon.h | 55 +++ - libavutil/rpi_sand_fn_pw.h | 4 +- - libavutil/rpi_sand_fns.c | 3 + - 5 files changed, 738 insertions(+), 2 deletions(-) - create mode 100644 libavutil/aarch64/rpi_sand_neon.S - create mode 100644 libavutil/aarch64/rpi_sand_neon.h - -diff --git a/libavutil/aarch64/Makefile b/libavutil/aarch64/Makefile -index eba0151337..1b44beab39 100644 ---- a/libavutil/aarch64/Makefile -+++ b/libavutil/aarch64/Makefile -@@ -4,3 +4,5 @@ OBJS += aarch64/cpu.o \ - - NEON-OBJS += aarch64/float_dsp_neon.o \ - aarch64/tx_float_neon.o \ -+ aarch64/rpi_sand_neon.o \ -+ -diff --git a/libavutil/aarch64/rpi_sand_neon.S b/libavutil/aarch64/rpi_sand_neon.S -new file mode 100644 -index 0000000000..cdcf71ee67 ---- /dev/null -+++ b/libavutil/aarch64/rpi_sand_neon.S -@@ -0,0 +1,676 @@ -+/* -+Copyright (c) 2021 Michael Eiler -+ -+Redistribution and use in source and binary forms, with or without -+modification, are permitted provided that the following conditions are met: -+ * Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+ * Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+ * Neither the name of the copyright holder nor the -+ names of its contributors may be used to endorse or promote products -+ derived from this software without specific prior written permission. -+ -+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY -+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+Authors: Michael Eiler -+*/ -+ -+#include "asm.S" -+ -+// void ff_rpi_sand8_lines_to_planar_y8( -+// uint8_t * dest, : x0 -+// unsigned int dst_stride, : w1 -+// const uint8_t * src, : x2 -+// unsigned int src_stride1, : w3, always 128 -+// unsigned int src_stride2, : w4 -+// unsigned int _x, : w5 -+// unsigned int y, : w6 -+// unsigned int _w, : w7 -+// unsigned int h); : [sp, #0] -+ -+function ff_rpi_sand8_lines_to_planar_y8, export=1 -+ // w15 contains the number of rows we need to process -+ ldr w15, [sp, #0] -+ -+ // w8 will contain the number of blocks per row -+ // w8 = floor(_w/stride1) -+ // stride1 is assumed to always be 128 -+ mov w8, w1 -+ lsr w8, w8, #7 -+ -+ // in case the width of the image is not a multiple of 128, there will -+ // be an incomplete block at the end of every row -+ // w9 contains the number of pixels stored within this block -+ // w9 = _w - w8 * 128 -+ lsl w9, w8, #7 -+ sub w9, w7, w9 -+ -+ // this is the value we have to add to the src pointer after reading a complete block -+ // it will move the address to the start of the next block -+ // w10 = stride2 * stride1 - stride1 -+ mov w10, w4 -+ lsl w10, w10, #7 -+ sub w10, w10, #128 -+ -+ // w11 is the row offset, meaning the start offset of the first block of every collumn -+ // this will be increased with stride1 within every iteration of the row_loop -+ eor w11, w11, w11 -+ -+ // w12 = 0, processed row count -+ eor w12, w12, w12 -+row_loop: -+ // start of the first block within the current row -+ // x13 = row offset + src -+ mov x13, x2 -+ add x13, x13, x11 -+ -+ // w14 = 0, processed block count -+ eor w14, w14, w14 -+ -+ cmp w8, #0 -+ beq no_main_y8 -+ -+block_loop: -+ // copy 128 bytes (a full block) into the vector registers v0-v7 and increase the src address by 128 -+ // fortunately these aren't callee saved ones, meaning we don't need to backup them -+ ld1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x13], #64 -+ ld1 { v4.16b, v5.16b, v6.16b, v7.16b}, [x13], #64 -+ -+ // write these registers back to the destination vector and increase the dst address by 128 -+ st1 { v0.16b, v1.16b, v2.16b, v3.16b }, [x0], #64 -+ st1 { v4.16b, v5.16b, v6.16b, v7.16b }, [x0], #64 -+ -+ // move the source register to the beginning of the next block (x13 = src + block offset) -+ add x13, x13, x10 -+ // increase the block counter -+ add w14, w14, #1 -+ -+ // continue with the block_loop if we haven't copied all full blocks yet -+ cmp w8, w14 -+ bgt block_loop -+ -+ // handle the last block at the end of each row -+ // at most 127 byte values copied from src to dst -+no_main_y8: -+ eor w5, w5, w5 // i = 0 -+incomplete_block_loop_y8: -+ cmp w5, w9 -+ bge incomplete_block_loop_end_y8 -+ -+ ldrb w6, [x13] -+ strb w6, [x0] -+ add x13, x13, #1 -+ add x0, x0, #1 -+ -+ add w5, w5, #1 -+ b incomplete_block_loop_y8 -+incomplete_block_loop_end_y8: -+ -+ -+ // increase the row offset by 128 (stride1) -+ add w11, w11, #128 -+ // increment the row counter -+ add w12, w12, #1 -+ -+ // process the next row if we haven't finished yet -+ cmp w15, w12 -+ bgt row_loop -+ -+ ret -+endfunc -+ -+ -+ -+// void ff_rpi_sand8_lines_to_planar_c8( -+// uint8_t * dst_u, : x0 -+// unsigned int dst_stride_u, : w1 == width -+// uint8_t * dst_v, : x2 -+// unsigned int dst_stride_v, : w3 == width -+// const uint8_t * src, : x4 -+// unsigned int stride1, : w5 == 128 -+// unsigned int stride2, : w6 -+// unsigned int _x, : w7 -+// unsigned int y, : [sp, #0] -+// unsigned int _w, : [sp, #8] -+// unsigned int h); : [sp, #16] -+ -+function ff_rpi_sand8_lines_to_planar_c8, export=1 -+ // w7 = width -+ ldr w7, [sp, #8] -+ -+ // w15 contains the number of rows we need to process -+ // counts down -+ ldr w15, [sp, #16] -+ -+ // number of full blocks, w8 = _w / (stride1 >> 1) == _w / 64 == _w >> 6 -+ mov w8, w7 -+ lsr w8, w8, #6 -+ -+ // number of pixels in block at the end of every row -+ // w9 = _w - (w8 * 64) -+ lsl w9, w8, #6 -+ sub w9, w7, w9 -+ -+ // Skip at the end of the line to account for stride -+ sub w12, w1, w7 -+ -+ // address delta to the beginning of the next block -+ // w10 = (stride2 * stride1 - stride1) = stride2 * 128 - 128 -+ lsl w10, w6, #7 -+ sub w10, w10, #128 -+ -+ // w11 = row address start offset = 0 -+ eor w11, w11, w11 -+ -+row_loop_c8: -+ // start of the first block within the current row -+ // x13 = row offset + src -+ mov x13, x4 -+ add x13, x13, x11 -+ -+ // w14 = 0, processed block count -+ eor w14, w14, w14 -+ -+ cmp w8, #0 -+ beq no_main_c8 -+ -+block_loop_c8: -+ // load the full block -> 128 bytes, the block contains 64 interleaved U and V values -+ ld2 { v0.16b, v1.16b }, [x13], #32 -+ ld2 { v2.16b, v3.16b }, [x13], #32 -+ ld2 { v4.16b, v5.16b }, [x13], #32 -+ ld2 { v6.16b, v7.16b }, [x13], #32 -+ -+ // swap register so that we can write them out with a single instruction -+ mov v16.16b, v1.16b -+ mov v17.16b, v3.16b -+ mov v18.16b, v5.16b -+ mov v1.16b, v2.16b -+ mov v2.16b, v4.16b -+ mov v3.16b, v6.16b -+ mov v4.16b, v16.16b -+ mov v5.16b, v17.16b -+ mov v6.16b, v18.16b -+ -+ st1 { v0.16b, v1.16b, v2.16b, v3.16b }, [x0], #64 -+ st1 { v4.16b, v5.16b, v6.16b, v7.16b }, [x2], #64 -+ -+ // increment row counter and move src to the beginning of the next block -+ add w14, w14, #1 -+ add x13, x13, x10 -+ -+ // jump to block_loop_c8 iff the block count is smaller than the number of full blocks -+ cmp w8, w14 -+ bgt block_loop_c8 -+ -+no_main_c8: -+ // handle incomplete block at the end of every row -+ eor w5, w5, w5 // point counter, this might be -+incomplete_block_loop_c8: -+ cmp w5, w9 -+ bge incomplete_block_loop_end_c8 -+ -+ ldrb w1, [x13] -+ strb w1, [x0] -+ add x13, x13, #1 -+ -+ ldrb w1, [x13] -+ strb w1, [x2] -+ add x13, x13, #1 -+ -+ add x0, x0, #1 -+ add x2, x2, #1 -+ -+ add w5, w5, #1 -+ b incomplete_block_loop_c8 -+incomplete_block_loop_end_c8: -+ -+ // increase row_offset by stride1 -+ add w11, w11, #128 -+ add x0, x0, w12, sxtw -+ add x2, x2, w12, sxtw -+ -+ // jump to row_Loop_c8 iff the row count is small than the height -+ subs w15, w15, #1 -+ bgt row_loop_c8 -+ -+ ret -+endfunc -+ -+//void ff_rpi_sand30_lines_to_planar_y16( -+// uint8_t * dest, // [x0] -+// unsigned int dst_stride, // [w1] -> assumed to be equal to _w -+// const uint8_t * src, // [x2] -+// unsigned int src_stride1, // [w3] -> 128 -+// unsigned int src_stride2, // [w4] -+// unsigned int _x, // [w5] -+// unsigned int y, // [w6] -+// unsigned int _w, // [w7] -+// unsigned int h); // [sp, #0] -+ -+function ff_rpi_sand30_lines_to_planar_y16, export=1 -+ stp x19, x20, [sp, #-48]! -+ stp x21, x22, [sp, #16] -+ stp x23, x24, [sp, #32] -+ -+ // w6 = argument h -+ ldr w6, [sp, #48] -+ -+ // slice_inc = ((stride2 - 1) * stride1) -+ mov w5, w4 -+ sub w5, w5, #1 -+ lsl w5, w5, #7 -+ -+ // total number of bytes per row = (width / 3) * 4 -+ mov w8, w7 -+ mov w9, #3 -+ udiv w8, w8, w9 -+ lsl w8, w8, #2 -+ -+ // number of full 128 byte blocks to be processed -+ mov w9, #96 -+ udiv w9, w7, w9 // = (width * 4) / (3*128) = width/96 -+ -+ // w10 = number of full integers to process (4 bytes) -+ // w11 = remaning zero to two 10bit values still to copy over -+ mov w12, #96 -+ mul w12, w9, w12 -+ sub w12, w7, w12 // width - blocks*96 = remaining points per row -+ mov w11, #3 -+ udiv w10, w12, w11 // full integers to process = w12 / 3 -+ mul w11, w10, w11 // #integers *3 -+ sub w11, w12, w11 // remaining 0-2 points = remaining points - integers*3 -+ -+ // increase w9 by one if w10+w11 is not zero, and decrease the row count by one -+ // this is to efficiently copy incomplete blocks at the end of the rows -+ // the last row is handled explicitly to avoid writing out of bounds -+ add w22, w10, w11 -+ cmp w22, #0 -+ cset w22, ne // 1 iff w10+w11 not zero, 0 otherwise -+ add w9, w9, w22 -+ sub w6, w6, #1 -+ -+ // store the number of bytes in w20 which we copy too much for every row -+ // when the width of the frame is not a multiple of 96 (128bytes storing 96 10bit values) -+ mov w20, #96*2 -+ mul w20, w20, w9 -+ sub w20, w1, w20 -+ -+ mov w23, #0 // flag to check whether the last line had already been processed -+ -+ // bitmask to clear the uppper 6bits of the result values -+ mov x19, #0x03ff03ff03ff03ff -+ dup v22.2d, x19 -+ -+ // row counter = 0 -+ eor w12, w12, w12 -+row_loop_y16: -+ cmp w12, w6 // jump to row_loop_y16_fin if we processed all rows -+ bge row_loop_y16_fin -+ -+ mov x13, x2 // row src -+ eor w14, w14, w14 // full block counter -+block_loop_y16: -+ cmp w14, w9 -+ bge block_loop_y16_fin -+ -+ // load 64 bytes -+ ld1 { v0.4s, v1.4s, v2.4s, v3.4s }, [x13], #64 -+ -+ // process v0 and v1 -+ xtn v16.4h, v0.4s -+ ushr v0.4s, v0.4s, #10 -+ xtn v17.4h, v0.4s -+ ushr v0.4s, v0.4s, #10 -+ xtn v18.4h, v0.4s -+ -+ xtn2 v16.8h, v1.4s -+ and v16.16b, v16.16b, v22.16b -+ ushr v1.4s, v1.4s, #10 -+ xtn2 v17.8h, v1.4s -+ and v17.16b, v17.16b, v22.16b -+ ushr v1.4s, v1.4s, #10 -+ xtn2 v18.8h, v1.4s -+ and v18.16b, v18.16b, v22.16b -+ -+ st3 { v16.8h, v17.8h, v18.8h }, [x0], #48 -+ -+ // process v2 and v3 -+ xtn v23.4h, v2.4s -+ ushr v2.4s, v2.4s, #10 -+ xtn v24.4h, v2.4s -+ ushr v2.4s, v2.4s, #10 -+ xtn v25.4h, v2.4s -+ -+ xtn2 v23.8h, v3.4s -+ and v23.16b, v23.16b, v22.16b -+ ushr v3.4s, v3.4s, #10 -+ xtn2 v24.8h, v3.4s -+ and v24.16b, v24.16b, v22.16b -+ ushr v3.4s, v3.4s, #10 -+ xtn2 v25.8h, v3.4s -+ and v25.16b, v25.16b, v22.16b -+ -+ st3 { v23.8h, v24.8h, v25.8h }, [x0], #48 -+ -+ // load the second half of the block -> 64 bytes into registers v4-v7 -+ ld1 { v4.4s, v5.4s, v6.4s, v7.4s }, [x13], #64 -+ -+ // process v4 and v5 -+ xtn v16.4h, v4.4s -+ ushr v4.4s, v4.4s, #10 -+ xtn v17.4h, v4.4s -+ ushr v4.4s, v4.4s, #10 -+ xtn v18.4h, v4.4s -+ -+ xtn2 v16.8h, v5.4s -+ and v16.16b, v16.16b, v22.16b -+ ushr v5.4s, v5.4s, #10 -+ xtn2 v17.8h, v5.4s -+ and v17.16b, v17.16b, v22.16b -+ ushr v5.4s, v5.4s, #10 -+ xtn2 v18.8h, v5.4s -+ and v18.16b, v18.16b, v22.16b -+ -+ st3 { v16.8h, v17.8h, v18.8h }, [x0], #48 -+ -+ // v6 and v7 -+ xtn v23.4h, v6.4s -+ ushr v6.4s, v6.4s, #10 -+ xtn v24.4h, v6.4s -+ ushr v6.4s, v6.4s, #10 -+ xtn v25.4h, v6.4s -+ -+ xtn2 v23.8h, v7.4s -+ and v23.16b, v23.16b, v22.16b -+ ushr v7.4s, v7.4s, #10 -+ xtn2 v24.8h, v7.4s -+ and v24.16b, v24.16b, v22.16b -+ ushr v7.4s, v7.4s, #10 -+ xtn2 v25.8h, v7.4s -+ and v25.16b, v25.16b, v22.16b -+ -+ st3 { v23.8h, v24.8h, v25.8h }, [x0], #48 -+ -+ add x13, x13, x5 // row src += slice_inc -+ add w14, w14, #1 -+ b block_loop_y16 -+block_loop_y16_fin: -+ -+ -+ -+ -+ add x2, x2, #128 // src += stride1 (start of the next row) -+ add x0, x0, w20, sxtw // subtract the bytes we copied too much from dst -+ add w12, w12, #1 -+ b row_loop_y16 -+row_loop_y16_fin: -+ -+ // check whether we have incomplete blocks at the end of every row -+ // in that case decrease row block count by one -+ // change height back to it's original value (meaning increase it by 1) -+ // and jump back to another iteration of row_loop_y16 -+ -+ cmp w23, #1 -+ beq row_loop_y16_fin2 // don't continue here if we already processed the last row -+ add w6, w6, #1 // increase height to the original value -+ sub w9, w9, w22 // block count - 1 or 0, depending on the remaining bytes count -+ mov w23, #1 -+ b row_loop_y16 -+row_loop_y16_fin2: -+ -+ sub x0, x0, w20, sxtw // with the last row we didn't actually move the dst ptr to far ahead, therefore readd the diference -+ -+ // now we've got to handle the last block in the last row -+ eor w12, w12, w12 // w12 = 0 = counter -+integer_loop_y16: -+ cmp w12, w10 -+ bge integer_loop_y16_fin -+ ldr w14, [x13], #4 -+ and w15, w14, #0x3ff -+ strh w15, [x0], #2 -+ lsr w14, w14, #10 -+ and w15, w14, #0x3ff -+ strh w15, [x0], #2 -+ lsr w14, w14, #10 -+ and w15, w14, #0x3ff -+ strh w15, [x0], #2 -+ add w12, w12, #1 -+ b integer_loop_y16 -+integer_loop_y16_fin: -+ -+final_values_y16: -+ // remaining point count = w11 -+ ldr w14, [x13], #4 -+ cmp w11, #0 -+ beq final_values_y16_fin -+ and w15, w14, #0x3ff -+ strh w15, [x0], #2 -+ cmp w11, #1 -+ beq final_values_y16_fin -+ lsr w14, w14, #10 -+ and w15, w14, #0x3ff -+ strh w15, [x0], #2 -+final_values_y16_fin: -+ -+ ldp x23, x24, [sp, #32] -+ ldp x21, x22, [sp, #16] -+ ldp x19, x20, [sp], #48 -+ ret -+endfunc -+ -+//void ff_rpi_sand30_lines_to_planar_c16( -+// uint8_t * dst_u, // [x0] -+// unsigned int dst_stride_u, // [w1] == _w*2 -+// uint8_t * dst_v, // [x2] -+// unsigned int dst_stride_v, // [w3] == _w*2 -+// const uint8_t * src, // [x4] -+// unsigned int stride1, // [w5] == 128 -+// unsigned int stride2, // [w6] -+// unsigned int _x, // [w7] == 0 -+// unsigned int y, // [sp, #0] == 0 -+// unsigned int _w, // [sp, #8] -> w3 -+// unsigned int h); // [sp, #16] -> w7 -+ -+.macro rpi_sand30_lines_to_planar_c16_block_half -+ ld1 { v0.4s, v1.4s, v2.4s, v3.4s }, [x13], #64 -+ -+ xtn v4.4h, v0.4s -+ ushr v0.4s, v0.4s, #10 -+ xtn v5.4h, v0.4s -+ ushr v0.4s, v0.4s, #10 -+ xtn v6.4h, v0.4s -+ xtn2 v4.8h, v1.4s -+ ushr v1.4s, v1.4s, #10 -+ xtn2 v5.8h, v1.4s -+ ushr v1.4s, v1.4s, #10 -+ xtn2 v6.8h, v1.4s -+ and v4.16b, v4.16b, v16.16b -+ and v5.16b, v5.16b, v16.16b -+ and v6.16b, v6.16b, v16.16b -+ st3 { v4.8h, v5.8h, v6.8h }, [sp], #48 -+ -+ xtn v4.4h, v2.4s -+ ushr v2.4s, v2.4s, #10 -+ xtn v5.4h, v2.4s -+ ushr v2.4s, v2.4s, #10 -+ xtn v6.4h, v2.4s -+ xtn2 v4.8h, v3.4s -+ ushr v3.4s, v3.4s, #10 -+ xtn2 v5.8h, v3.4s -+ ushr v3.4s, v3.4s, #10 -+ xtn2 v6.8h, v3.4s -+ and v4.16b, v4.16b, v16.16b -+ and v5.16b, v5.16b, v16.16b -+ and v6.16b, v6.16b, v16.16b -+ st3 { v4.8h, v5.8h, v6.8h }, [sp] -+ sub sp, sp, #48 -+.endm -+ -+function ff_rpi_sand30_lines_to_planar_c16, export=1 -+ stp x19, x20, [sp, #-48]! -+ stp x21, x22, [sp, #16] -+ stp x23, x24, [sp, #32] -+ -+ ldr w3, [sp, #48+8] // w3 = width -+ ldr w7, [sp, #48+16] // w7 = height -+ -+ // reserve space on the stack for intermediate results -+ sub sp, sp, #256 -+ -+ // number of 128byte blocks per row, w8 = width / 48 -+ mov w9, #48 -+ udiv w8, w3, w9 -+ -+ // remaining pixels (rem_pix) per row, w9 = width - w8 * 48 -+ mul w9, w8, w9 -+ sub w9, w3, w9 -+ -+ // row offset, the beginning of the next row to process -+ eor w10, w10, w10 -+ -+ // offset to the beginning of the next block, w11 = stride2 * 128 - 128 -+ lsl w11, w6, #7 -+ sub w11, w11, #128 -+ -+ // decrease the height by one and in case of remaining pixels increase the block count by one -+ sub w7, w7, #1 -+ cmp w9, #0 -+ cset w19, ne // w19 == 1 iff reamining pixels != 0 -+ add w8, w8, w19 -+ -+ // bytes we have to move dst back by at the end of every row -+ mov w21, #48*2 -+ mul w21, w21, w8 -+ sub w21, w1, w21 -+ -+ mov w20, #0 // w20 = flag, last row processed -+ -+ mov x12, #0x03ff03ff03ff03ff -+ dup v16.2d, x12 -+ -+ // iterate through rows, row counter = w12 = 0 -+ eor w12, w12, w12 -+row_loop_c16: -+ cmp w12, w7 -+ bge row_loop_c16_fin -+ -+ // address of row data = src + row_offset -+ mov x13, x4 -+ add x13, x13, x10 -+ -+ eor w14, w14, w14 -+block_loop_c16: -+ cmp w14, w8 -+ bge block_loop_c16_fin -+ -+ rpi_sand30_lines_to_planar_c16_block_half -+ -+ ld2 { v0.8h, v1.8h }, [sp], #32 -+ ld2 { v2.8h, v3.8h }, [sp], #32 -+ ld2 { v4.8h, v5.8h }, [sp] -+ sub sp, sp, #64 -+ -+ st1 { v0.8h }, [x0], #16 -+ st1 { v2.8h }, [x0], #16 -+ st1 { v4.8h }, [x0], #16 -+ st1 { v1.8h }, [x2], #16 -+ st1 { v3.8h }, [x2], #16 -+ st1 { v5.8h }, [x2], #16 -+ -+ rpi_sand30_lines_to_planar_c16_block_half -+ -+ ld2 { v0.8h, v1.8h }, [sp], #32 -+ ld2 { v2.8h, v3.8h }, [sp], #32 -+ ld2 { v4.8h, v5.8h }, [sp] -+ sub sp, sp, #64 -+ -+ st1 { v0.8h }, [x0], #16 -+ st1 { v2.8h }, [x0], #16 -+ st1 { v4.8h }, [x0], #16 -+ st1 { v1.8h }, [x2], #16 -+ st1 { v3.8h }, [x2], #16 -+ st1 { v5.8h }, [x2], #16 -+ -+ add x13, x13, x11 // offset to next block -+ add w14, w14, #1 -+ b block_loop_c16 -+block_loop_c16_fin: -+ -+ add w10, w10, #128 -+ add w12, w12, #1 -+ add x0, x0, w21, sxtw // move dst pointers back by x21 -+ add x2, x2, w21, sxtw -+ b row_loop_c16 -+row_loop_c16_fin: -+ -+ cmp w20, #1 -+ beq row_loop_c16_fin2 -+ mov w20, #1 -+ sub w8, w8, w19 // decrease block count by w19 -+ add w7, w7, #1 // increase height -+ b row_loop_c16 -+ -+row_loop_c16_fin2: -+ sub x0, x0, w21, sxtw // readd x21 in case of the last row -+ sub x2, x2, w21, sxtw // so that we can write out the few remaining pixels -+ -+ // last incomplete block to be finished -+ // read operations are fine, stride2 is more than large enough even if rem_pix is 0 -+ rpi_sand30_lines_to_planar_c16_block_half -+ ld2 { v0.8h, v1.8h }, [sp], #32 -+ ld2 { v2.8h, v3.8h }, [sp], #32 -+ ld2 { v4.8h, v5.8h }, [sp], #32 -+ rpi_sand30_lines_to_planar_c16_block_half -+ ld2 { v0.8h, v1.8h }, [sp], #32 -+ ld2 { v2.8h, v3.8h }, [sp], #32 -+ ld2 { v4.8h, v5.8h }, [sp] -+ sub sp, sp, #160 -+ -+ mov x4, sp -+ eor w20, w20, w20 -+rem_pix_c16_loop: -+ cmp w20, w9 -+ bge rem_pix_c16_fin -+ -+ ldr w22, [x4], #4 -+ str w22, [x0], #2 -+ lsr w22, w22, #16 -+ str w22, [x2], #2 -+ -+ add w20, w20, #1 -+ b rem_pix_c16_loop -+rem_pix_c16_fin: -+ -+ add sp, sp, #256 -+ -+ ldp x23, x24, [sp, #32] -+ ldp x21, x22, [sp, #16] -+ ldp x19, x20, [sp], #48 -+ ret -+endfunc -+ -+ -+ -+//void ff_rpi_sand30_lines_to_planar_p010( -+// uint8_t * dest, -+// unsigned int dst_stride, -+// const uint8_t * src, -+// unsigned int src_stride1, -+// unsigned int src_stride2, -+// unsigned int _x, -+// unsigned int y, -+// unsigned int _w, -+// unsigned int h); -+ -diff --git a/libavutil/aarch64/rpi_sand_neon.h b/libavutil/aarch64/rpi_sand_neon.h -new file mode 100644 -index 0000000000..b3aa481ea4 ---- /dev/null -+++ b/libavutil/aarch64/rpi_sand_neon.h -@@ -0,0 +1,55 @@ -+/* -+Copyright (c) 2021 Michael Eiler -+ -+Redistribution and use in source and binary forms, with or without -+modification, are permitted provided that the following conditions are met: -+ * Redistributions of source code must retain the above copyright -+ notice, this list of conditions and the following disclaimer. -+ * Redistributions in binary form must reproduce the above copyright -+ notice, this list of conditions and the following disclaimer in the -+ documentation and/or other materials provided with the distribution. -+ * Neither the name of the copyright holder nor the -+ names of its contributors may be used to endorse or promote products -+ derived from this software without specific prior written permission. -+ -+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY -+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ -+Authors: Michael Eiler -+*/ -+ -+#pragma once -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+void ff_rpi_sand8_lines_to_planar_y8(uint8_t * dest, unsigned int dst_stride, -+ const uint8_t * src, unsigned int src_stride1, unsigned int src_stride2, -+ unsigned int _x, unsigned int y, unsigned int _w, unsigned int h); -+ -+void ff_rpi_sand8_lines_to_planar_c8(uint8_t * dst_u, unsigned int dst_stride_u, -+ uint8_t * dst_v, unsigned int dst_stride_v, const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+ -+void ff_rpi_sand30_lines_to_planar_y16(uint8_t * dest, unsigned int dst_stride, -+ const uint8_t * src, unsigned int src_stride1, unsigned int src_stride2, -+ unsigned int _x, unsigned int y, unsigned int _w, unsigned int h); -+ -+void ff_rpi_sand30_lines_to_planar_c16(uint8_t * dst_u, unsigned int dst_stride_u, -+ uint8_t * dst_v, unsigned int dst_stride_v, const uint8_t * src, unsigned int stride1, -+ unsigned int stride2, unsigned int _x, unsigned int y, unsigned int _w, unsigned int h); -+ -+#ifdef __cplusplus -+} -+#endif -+ -diff --git a/libavutil/rpi_sand_fn_pw.h b/libavutil/rpi_sand_fn_pw.h -index 0324f6826d..0d5d203dc3 100644 ---- a/libavutil/rpi_sand_fn_pw.h -+++ b/libavutil/rpi_sand_fn_pw.h -@@ -54,7 +54,7 @@ void FUNC(av_rpi_sand_to_planar_y)(uint8_t * dst, const unsigned int dst_stride, - const unsigned int w = _w; - const unsigned int mask = stride1 - 1; - --#if PW == 1 && (HAVE_SAND_ASM || HAVE_SAND_ASM64) -+#if PW == 1 && HAVE_SAND_ASM - if (_x == 0) { - ff_rpi_sand8_lines_to_planar_y8(dst, dst_stride, - src, stride1, stride2, _x, y, _w, h); -@@ -106,7 +106,7 @@ void FUNC(av_rpi_sand_to_planar_c)(uint8_t * dst_u, const unsigned int dst_strid - const unsigned int w = _w * 2; - const unsigned int mask = stride1 - 1; - --#if PW == 1 && (HAVE_SAND_ASM || HAVE_SAND_ASM64) -+#if PW == 1 && HAVE_SAND_ASM - if (_x == 0) { - ff_rpi_sand8_lines_to_planar_c8(dst_u, dst_stride_u, dst_v, dst_stride_v, - src, stride1, stride2, _x, y, _w, h); -diff --git a/libavutil/rpi_sand_fns.c b/libavutil/rpi_sand_fns.c -index ed0261b02f..1f543e9357 100644 ---- a/libavutil/rpi_sand_fns.c -+++ b/libavutil/rpi_sand_fns.c -@@ -37,6 +37,9 @@ Authors: John Cox - #if ARCH_ARM && HAVE_NEON - #include "arm/rpi_sand_neon.h" - #define HAVE_SAND_ASM 1 -+#elif ARCH_AARCH64 && HAVE_NEON -+#include "aarch64/rpi_sand_neon.h" -+#define HAVE_SAND_ASM 1 - #else - #define HAVE_SAND_ASM 0 - #endif - -From 247025a42ae09d6c9c5d4128a5e4b288b7b3047c Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 11:56:02 +0100 -Subject: [PATCH 004/151] Add raw encoding for sand - ---- - libavcodec/raw.c | 6 +++ - libavcodec/rawenc.c | 92 ++++++++++++++++++++++++++++++++++++++++++++- - 2 files changed, 96 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/raw.c b/libavcodec/raw.c -index 1e5b48d1e0..1e689f9ee0 100644 ---- a/libavcodec/raw.c -+++ b/libavcodec/raw.c -@@ -295,6 +295,12 @@ static const PixelFormatTag raw_pix_fmt_tags[] = { - { AV_PIX_FMT_RGB565LE,MKTAG( 3 , 0 , 0 , 0 ) }, /* flipped RGB565LE */ - { AV_PIX_FMT_YUV444P, MKTAG('Y', 'V', '2', '4') }, /* YUV444P, swapped UV */ - -+ /* RPI (Might as well define for everything) */ -+ { AV_PIX_FMT_SAND128, MKTAG('S', 'A', 'N', 'D') }, -+ { AV_PIX_FMT_RPI4_8, MKTAG('S', 'A', 'N', 'D') }, -+ { AV_PIX_FMT_SAND64_10, MKTAG('S', 'N', 'D', 'A') }, -+ { AV_PIX_FMT_RPI4_10, MKTAG('S', 'N', 'D', 'B') }, -+ - { AV_PIX_FMT_NONE, 0 }, - }; - -diff --git a/libavcodec/rawenc.c b/libavcodec/rawenc.c -index 8c577006d9..594a77c42a 100644 ---- a/libavcodec/rawenc.c -+++ b/libavcodec/rawenc.c -@@ -24,6 +24,7 @@ - * Raw Video Encoder - */ - -+#include "config.h" - #include "avcodec.h" - #include "codec_internal.h" - #include "encode.h" -@@ -33,6 +34,10 @@ - #include "libavutil/intreadwrite.h" - #include "libavutil/imgutils.h" - #include "libavutil/internal.h" -+#include "libavutil/avassert.h" -+#if CONFIG_SAND -+#include "libavutil/rpi_sand_fns.h" -+#endif - - static av_cold int raw_encode_init(AVCodecContext *avctx) - { -@@ -46,12 +51,95 @@ static av_cold int raw_encode_init(AVCodecContext *avctx) - return 0; - } - -+#if CONFIG_SAND -+static int raw_sand8_as_yuv420(AVCodecContext *avctx, AVPacket *pkt, -+ const AVFrame *frame) -+{ -+ const int width = av_frame_cropped_width(frame); -+ const int height = av_frame_cropped_height(frame); -+ const int x0 = frame->crop_left; -+ const int y0 = frame->crop_top; -+ const int size = width * height * 3 / 2; -+ uint8_t * dst; -+ int ret; -+ -+ if ((ret = ff_get_encode_buffer(avctx, pkt, size, 0)) < 0) -+ return ret; -+ -+ dst = pkt->data; -+ -+ av_rpi_sand_to_planar_y8(dst, width, frame->data[0], frame->linesize[0], frame->linesize[3], x0, y0, width, height); -+ dst += width * height; -+ av_rpi_sand_to_planar_c8(dst, width / 2, dst + width * height / 4, width / 2, -+ frame->data[1], frame->linesize[1], av_rpi_sand_frame_stride2(frame), x0 / 2, y0 / 2, width / 2, height / 2); -+ return 0; -+} -+ -+static int raw_sand16_as_yuv420(AVCodecContext *avctx, AVPacket *pkt, -+ const AVFrame *frame) -+{ -+ const int width = av_frame_cropped_width(frame); -+ const int height = av_frame_cropped_height(frame); -+ const int x0 = frame->crop_left; -+ const int y0 = frame->crop_top; -+ const int size = width * height * 3; -+ uint8_t * dst; -+ int ret; -+ -+ if ((ret = ff_get_encode_buffer(avctx, pkt, size, 0)) < 0) -+ return ret; -+ -+ dst = pkt->data; -+ -+ av_rpi_sand_to_planar_y16(dst, width * 2, frame->data[0], frame->linesize[0], frame->linesize[3], x0 * 2, y0, width * 2, height); -+ dst += width * height * 2; -+ av_rpi_sand_to_planar_c16(dst, width, dst + width * height / 2, width, -+ frame->data[1], frame->linesize[1], av_rpi_sand_frame_stride2(frame), x0, y0 / 2, width, height / 2); -+ return 0; -+} -+ -+static int raw_sand30_as_yuv420(AVCodecContext *avctx, AVPacket *pkt, -+ const AVFrame *frame) -+{ -+ const int width = av_frame_cropped_width(frame); -+ const int height = av_frame_cropped_height(frame); -+ const int x0 = frame->crop_left; -+ const int y0 = frame->crop_top; -+ const int size = width * height * 3; -+ uint8_t * dst; -+ int ret; -+ -+ if ((ret = ff_get_encode_buffer(avctx, pkt, size, 0)) < 0) -+ return ret; -+ -+ dst = pkt->data; -+ -+ av_rpi_sand30_to_planar_y16(dst, width * 2, frame->data[0], frame->linesize[0], frame->linesize[3], x0, y0, width, height); -+ dst += width * height * 2; -+ av_rpi_sand30_to_planar_c16(dst, width, dst + width * height / 2, width, -+ frame->data[1], frame->linesize[1], av_rpi_sand_frame_stride2(frame), x0/2, y0 / 2, width/2, height / 2); -+ return 0; -+} -+#endif -+ -+ - static int raw_encode(AVCodecContext *avctx, AVPacket *pkt, - const AVFrame *frame, int *got_packet) - { -- int ret = av_image_get_buffer_size(frame->format, -- frame->width, frame->height, 1); -+ int ret; - -+#if CONFIG_SAND -+ if (av_rpi_is_sand_frame(frame)) { -+ ret = av_rpi_is_sand8_frame(frame) ? raw_sand8_as_yuv420(avctx, pkt, frame) : -+ av_rpi_is_sand16_frame(frame) ? raw_sand16_as_yuv420(avctx, pkt, frame) : -+ av_rpi_is_sand30_frame(frame) ? raw_sand30_as_yuv420(avctx, pkt, frame) : -1; -+ *got_packet = (ret == 0); -+ return ret; -+ } -+#endif -+ -+ ret = av_image_get_buffer_size(frame->format, -+ frame->width, frame->height, 1); - if (ret < 0) - return ret; - - -From ac6961f424b56563dc793b6bc002a8c04cb1bc36 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 12:02:09 +0100 -Subject: [PATCH 005/151] Deal with the lack of trivial sand cropping - ---- - fftools/ffmpeg.c | 4 ++-- - fftools/ffmpeg_filter.c | 4 ++-- - libavutil/frame.c | 11 +++++++++++ - libavutil/frame.h | 10 ++++++++++ - 4 files changed, 25 insertions(+), 4 deletions(-) - -diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c -index d721a5e721..15e084f0b2 100644 ---- a/fftools/ffmpeg.c -+++ b/fftools/ffmpeg.c -@@ -1993,8 +1993,8 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame, int keep_ref - av_channel_layout_compare(&ifilter->ch_layout, &frame->ch_layout); - break; - case AVMEDIA_TYPE_VIDEO: -- need_reinit |= ifilter->width != frame->width || -- ifilter->height != frame->height; -+ need_reinit |= ifilter->width != av_frame_cropped_width(frame) || -+ ifilter->height != av_frame_cropped_height(frame); - break; - } - -diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c -index 1f5bbf6c4d..f888307762 100644 ---- a/fftools/ffmpeg_filter.c -+++ b/fftools/ffmpeg_filter.c -@@ -1281,8 +1281,8 @@ int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame) - - ifilter->format = frame->format; - -- ifilter->width = frame->width; -- ifilter->height = frame->height; -+ ifilter->width = av_frame_cropped_width(frame); -+ ifilter->height = av_frame_cropped_height(frame); - ifilter->sample_aspect_ratio = frame->sample_aspect_ratio; - - ifilter->sample_rate = frame->sample_rate; -diff --git a/libavutil/frame.c b/libavutil/frame.c -index 9545477acc..48621e4098 100644 ---- a/libavutil/frame.c -+++ b/libavutil/frame.c -@@ -16,6 +16,8 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -+#include "config.h" -+ - #include "channel_layout.h" - #include "avassert.h" - #include "buffer.h" -@@ -27,6 +29,9 @@ - #include "mem.h" - #include "samplefmt.h" - #include "hwcontext.h" -+#if CONFIG_SAND -+#include "rpi_sand_fns.h" -+#endif - - #if FF_API_OLD_CHANNEL_LAYOUT - #define CHECK_CHANNELS_CONSISTENCY(frame) \ -@@ -874,6 +879,12 @@ int av_frame_apply_cropping(AVFrame *frame, int flags) - (frame->crop_top + frame->crop_bottom) >= frame->height) - return AVERROR(ERANGE); - -+#if CONFIG_SAND -+ // Sand cannot be cropped - do not try -+ if (av_rpi_is_sand_format(frame->format)) -+ return 0; -+#endif -+ - desc = av_pix_fmt_desc_get(frame->format); - if (!desc) - return AVERROR_BUG; -diff --git a/libavutil/frame.h b/libavutil/frame.h -index 2580269549..3a9d323325 100644 ---- a/libavutil/frame.h -+++ b/libavutil/frame.h -@@ -957,6 +957,16 @@ int av_frame_apply_cropping(AVFrame *frame, int flags); - */ - const char *av_frame_side_data_name(enum AVFrameSideDataType type); - -+ -+static inline int av_frame_cropped_width(const AVFrame * const frame) -+{ -+ return frame->width - (frame->crop_left + frame->crop_right); -+} -+static inline int av_frame_cropped_height(const AVFrame * const frame) -+{ -+ return frame->height - (frame->crop_top + frame->crop_bottom); -+} -+ - /** - * @} - */ - -From 9a08431f7790507b0374d9585dfc736000c1bd42 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 12:31:16 +0100 -Subject: [PATCH 006/151] Add an unsand filter - ---- - configure | 1 + - libavfilter/Makefile | 1 + - libavfilter/allfilters.c | 1 + - libavfilter/buffersrc.c | 2 +- - libavfilter/vf_unsand.c | 228 +++++++++++++++++++++++++++++++++++++++ - 5 files changed, 232 insertions(+), 1 deletion(-) - create mode 100644 libavfilter/vf_unsand.c - -diff --git a/configure b/configure -index 27112ced58..7712482bd5 100755 ---- a/configure -+++ b/configure -@@ -3754,6 +3754,7 @@ tonemap_opencl_filter_deps="opencl const_nan" - transpose_opencl_filter_deps="opencl" - transpose_vaapi_filter_deps="vaapi VAProcPipelineCaps_rotation_flags" - transpose_vulkan_filter_deps="vulkan spirv_compiler" -+unsand_filter_select="sand" - unsharp_opencl_filter_deps="opencl" - uspp_filter_deps="gpl avcodec" - vaguedenoiser_filter_deps="gpl" -diff --git a/libavfilter/Makefile b/libavfilter/Makefile -index b3d3d981dd..c14fc995a0 100644 ---- a/libavfilter/Makefile -+++ b/libavfilter/Makefile -@@ -518,6 +518,7 @@ OBJS-$(CONFIG_TRANSPOSE_VAAPI_FILTER) += vf_transpose_vaapi.o vaapi_vpp.o - OBJS-$(CONFIG_TRANSPOSE_VULKAN_FILTER) += vf_transpose_vulkan.o vulkan.o vulkan_filter.o - OBJS-$(CONFIG_TRIM_FILTER) += trim.o - OBJS-$(CONFIG_UNPREMULTIPLY_FILTER) += vf_premultiply.o framesync.o -+OBJS-$(CONFIG_UNSAND_FILTER) += vf_unsand.o - OBJS-$(CONFIG_UNSHARP_FILTER) += vf_unsharp.o - OBJS-$(CONFIG_UNSHARP_OPENCL_FILTER) += vf_unsharp_opencl.o opencl.o \ - opencl/unsharp.o -diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c -index d7db46c2af..b990a00152 100644 ---- a/libavfilter/allfilters.c -+++ b/libavfilter/allfilters.c -@@ -490,6 +490,7 @@ extern const AVFilter ff_vf_trim; - extern const AVFilter ff_vf_unpremultiply; - extern const AVFilter ff_vf_unsharp; - extern const AVFilter ff_vf_unsharp_opencl; -+extern const AVFilter ff_vf_unsand; - extern const AVFilter ff_vf_untile; - extern const AVFilter ff_vf_uspp; - extern const AVFilter ff_vf_v360; -diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c -index ba17450b93..0dbe5d2335 100644 ---- a/libavfilter/buffersrc.c -+++ b/libavfilter/buffersrc.c -@@ -201,7 +201,7 @@ FF_ENABLE_DEPRECATION_WARNINGS - - switch (ctx->outputs[0]->type) { - case AVMEDIA_TYPE_VIDEO: -- CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height, -+ CHECK_VIDEO_PARAM_CHANGE(ctx, s, av_frame_cropped_width(frame), av_frame_cropped_height(frame), - frame->format, frame->pts); - break; - case AVMEDIA_TYPE_AUDIO: -diff --git a/libavfilter/vf_unsand.c b/libavfilter/vf_unsand.c -new file mode 100644 -index 0000000000..7100f2fc9b ---- /dev/null -+++ b/libavfilter/vf_unsand.c -@@ -0,0 +1,228 @@ -+/* -+ * Copyright (c) 2007 Bobby Bingham -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * format and noformat video filters -+ */ -+ -+#include -+ -+#include "libavutil/internal.h" -+#include "libavutil/mem.h" -+#include "libavutil/pixdesc.h" -+#include "libavutil/opt.h" -+#include "libavutil/rpi_sand_fns.h" -+ -+#include "avfilter.h" -+#include "formats.h" -+#include "internal.h" -+#include "video.h" -+ -+typedef struct UnsandContext { -+ const AVClass *class; -+} UnsandContext; -+ -+static av_cold void uninit(AVFilterContext *ctx) -+{ -+// UnsandContext *s = ctx->priv; -+} -+ -+static av_cold int init(AVFilterContext *ctx) -+{ -+// UnsandContext *s = ctx->priv; -+ -+ return 0; -+} -+ -+ -+static int filter_frame(AVFilterLink *link, AVFrame *in) -+{ -+ AVFilterLink * const outlink = link->dst->outputs[0]; -+ AVFrame *out = NULL; -+ int rv = 0; -+ -+ if (outlink->format == in->format) { -+ // If nothing to do then do nothing -+ out = in; -+ } -+ else -+ { -+ if ((out = ff_get_video_buffer(outlink, av_frame_cropped_width(in), av_frame_cropped_height(in))) == NULL) -+ { -+ rv = AVERROR(ENOMEM); -+ goto fail; -+ } -+ if (av_rpi_sand_to_planar_frame(out, in) != 0) -+ { -+ rv = -1; -+ goto fail; -+ } -+ -+ av_frame_free(&in); -+ } -+ -+ return ff_filter_frame(outlink, out); -+ -+fail: -+ av_frame_free(&out); -+ av_frame_free(&in); -+ return rv; -+} -+ -+#if 0 -+static void dump_fmts(const AVFilterFormats * fmts) -+{ -+ int i; -+ if (fmts== NULL) { -+ printf("NULL\n"); -+ return; -+ } -+ for (i = 0; i < fmts->nb_formats; ++i) { -+ printf(" %d", fmts->formats[i]); -+ } -+ printf("\n"); -+} -+#endif -+ -+static int query_formats(AVFilterContext *ctx) -+{ -+// UnsandContext *s = ctx->priv; -+ int ret; -+ -+ // If we aren't connected at both ends then just do nothing -+ if (ctx->inputs[0] == NULL || ctx->outputs[0] == NULL) -+ return 0; -+ -+ // Our output formats depend on our input formats and we can't/don't -+ // want to convert between bit depths so we need to wait for the source -+ // to have an opinion before we do -+ if (ctx->inputs[0]->incfg.formats == NULL) -+ return AVERROR(EAGAIN); -+ -+ // Accept anything -+ if (ctx->inputs[0]->outcfg.formats == NULL && -+ (ret = ff_formats_ref(ctx->inputs[0]->incfg.formats, &ctx->inputs[0]->outcfg.formats)) < 0) -+ return ret; -+ -+ // Filter out sand formats -+ -+ // Generate a container if we don't already have one -+ if (ctx->outputs[0]->incfg.formats == NULL) -+ { -+ // Somewhat rubbish way of ensuring we have a good structure -+ const static enum AVPixelFormat out_fmts[] = {AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE}; -+ AVFilterFormats *formats = ff_make_format_list(out_fmts); -+ -+ if (formats == NULL) -+ return AVERROR(ENOMEM); -+ if ((ret = ff_formats_ref(formats, &ctx->outputs[0]->incfg.formats)) < 0) -+ return ret; -+ } -+ -+ // Replace old format list with new filtered list derived from what our -+ // input says it can do -+ { -+ const AVFilterFormats * const src_ff = ctx->inputs[0]->outcfg.formats; -+ AVFilterFormats * const dst_ff = ctx->outputs[0]->incfg.formats; -+ enum AVPixelFormat *dst_fmts = av_malloc(sizeof(enum AVPixelFormat) * src_ff->nb_formats); -+ int i; -+ int n = 0; -+ int seen_420p = 0; -+ int seen_420p10 = 0; -+ -+ for (i = 0; i < src_ff->nb_formats; ++i) { -+ const enum AVPixelFormat f = src_ff->formats[i]; -+ -+ switch (f){ -+ case AV_PIX_FMT_YUV420P: -+ case AV_PIX_FMT_SAND128: -+ case AV_PIX_FMT_RPI4_8: -+ if (!seen_420p) { -+ seen_420p = 1; -+ dst_fmts[n++] = AV_PIX_FMT_YUV420P; -+ } -+ break; -+ case AV_PIX_FMT_SAND64_10: -+ case AV_PIX_FMT_YUV420P10: -+ case AV_PIX_FMT_RPI4_10: -+ if (!seen_420p10) { -+ seen_420p10 = 1; -+ dst_fmts[n++] = AV_PIX_FMT_YUV420P10; -+ } -+ break; -+ default: -+ dst_fmts[n++] = f; -+ break; -+ } -+ } -+ -+ av_freep(&dst_ff->formats); -+ dst_ff->formats = dst_fmts; -+ dst_ff->nb_formats = n; -+ } -+ -+// printf("Unsand: %s calc: ", __func__); -+// dump_fmts(ctx->outputs[0]->incfg.formats); -+ -+ return 0; -+} -+ -+ -+#define OFFSET(x) offsetof(UnsandContext, x) -+static const AVOption unsand_options[] = { -+ { NULL } -+}; -+ -+ -+AVFILTER_DEFINE_CLASS(unsand); -+ -+static const AVFilterPad avfilter_vf_unsand_inputs[] = { -+ { -+ .name = "default", -+ .type = AVMEDIA_TYPE_VIDEO, -+ .filter_frame = filter_frame, -+ }, -+ { NULL } -+}; -+ -+static const AVFilterPad avfilter_vf_unsand_outputs[] = { -+ { -+ .name = "default", -+ .type = AVMEDIA_TYPE_VIDEO -+ }, -+}; -+ -+AVFilter ff_vf_unsand = { -+ .name = "unsand", -+ .description = NULL_IF_CONFIG_SMALL("Convert sand pix fmt to yuv"), -+ -+ .init = init, -+ .uninit = uninit, -+ -+ FILTER_QUERY_FUNC(query_formats), -+ -+ .priv_size = sizeof(UnsandContext), -+ .priv_class = &unsand_class, -+ -+ FILTER_INPUTS(avfilter_vf_unsand_inputs), -+ FILTER_OUTPUTS(avfilter_vf_unsand_outputs), -+}; -+ - -From 6e61007b19544c573f1c2a4c6060d3d24b8d500e Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 12:37:07 +0100 -Subject: [PATCH 007/151] Reduce mmal compile warnings - ---- - libavcodec/mmaldec.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c -index 3092f58510..6f41b41ac4 100644 ---- a/libavcodec/mmaldec.c -+++ b/libavcodec/mmaldec.c -@@ -24,6 +24,9 @@ - * MMAL Video Decoder - */ - -+#pragma GCC diagnostic push -+// Many many redundant decls in the header files -+#pragma GCC diagnostic ignored "-Wredundant-decls" - #include - #include - #include -@@ -31,6 +34,7 @@ - #include - #include - #include -+#pragma GCC diagnostic pop - #include - - #include "avcodec.h" - -From 01aff455665e8f889330519096912ad0005add3c Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 17:56:16 +0100 -Subject: [PATCH 008/151] Add chroma location to hevc parse - ---- - libavcodec/hevc_parser.c | 13 +++++++++++++ - libavcodec/hevcdec.c | 13 +++++++++++++ - 2 files changed, 26 insertions(+) - -diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c -index 59f9a0ff3e..4ae7222e8b 100644 ---- a/libavcodec/hevc_parser.c -+++ b/libavcodec/hevc_parser.c -@@ -97,6 +97,19 @@ static int hevc_parse_slice_header(AVCodecParserContext *s, H2645NAL *nal, - avctx->profile = ps->sps->ptl.general_ptl.profile_idc; - avctx->level = ps->sps->ptl.general_ptl.level_idc; - -+ if (ps->sps->chroma_format_idc == 1) { -+ avctx->chroma_sample_location = ps->sps->vui.common.chroma_loc_info_present_flag ? -+ ps->sps->vui.common.chroma_sample_loc_type_top_field + 1 : -+ AVCHROMA_LOC_LEFT; -+ } -+ else if (ps->sps->chroma_format_idc == 2 || -+ ps->sps->chroma_format_idc == 3) { -+ avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;; -+ } -+ else { -+ avctx->chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED; -+ } -+ - if (ps->vps->vps_timing_info_present_flag) { - num = ps->vps->vps_num_units_in_tick; - den = ps->vps->vps_time_scale; -diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c -index 567e8d81d4..b6cfea64d3 100644 ---- a/libavcodec/hevcdec.c -+++ b/libavcodec/hevcdec.c -@@ -347,6 +347,19 @@ static void export_stream_params(HEVCContext *s, const HEVCSPS *sps) - else - avctx->color_range = AVCOL_RANGE_MPEG; - -+ if (sps->chroma_format_idc == 1) { -+ avctx->chroma_sample_location = sps->vui.common.chroma_loc_info_present_flag ? -+ sps->vui.common.chroma_sample_loc_type_top_field + 1 : -+ AVCHROMA_LOC_LEFT; -+ } -+ else if (sps->chroma_format_idc == 2 || -+ sps->chroma_format_idc == 3) { -+ avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;; -+ } -+ else { -+ avctx->chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED; -+ } -+ - if (sps->vui.common.colour_description_present_flag) { - avctx->color_primaries = sps->vui.common.colour_primaries; - avctx->color_trc = sps->vui.common.transfer_characteristics; - -From c80aad5d2fb373f7564e4257b1272f2decb06dd0 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 26 Sep 2022 18:20:50 +0100 -Subject: [PATCH 009/151] hwaccel: Add .abort_frame & use in hevcdec - ---- - libavcodec/avcodec.h | 11 +++++++++++ - libavcodec/hevcdec.c | 7 ++++++- - 2 files changed, 17 insertions(+), 1 deletion(-) - -diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h -index 39881a1d2b..32bc78e2be 100644 ---- a/libavcodec/avcodec.h -+++ b/libavcodec/avcodec.h -@@ -2221,6 +2221,17 @@ typedef struct AVHWAccel { - * that avctx->hwaccel_priv_data is invalid. - */ - int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); -+ -+ /** -+ * Called if parsing fails -+ * -+ * An error has occured, end_frame will not be called -+ * start_frame & decode_slice may or may not have been called -+ * Optional -+ * -+ * @param avctx the codec context -+ */ -+ void (*abort_frame)(AVCodecContext *avctx); - } AVHWAccel; - - /** -diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c -index b6cfea64d3..8a0246fa21 100644 ---- a/libavcodec/hevcdec.c -+++ b/libavcodec/hevcdec.c -@@ -3375,8 +3375,13 @@ static int hevc_decode_frame(AVCodecContext *avctx, AVFrame *rframe, - - s->ref = NULL; - ret = decode_nal_units(s, avpkt->data, avpkt->size); -- if (ret < 0) -+ if (ret < 0) { -+ // Ensure that hwaccel knows this frame is over -+ if (s->avctx->hwaccel && s->avctx->hwaccel->abort_frame) -+ s->avctx->hwaccel->abort_frame(s->avctx); -+ - return ret; -+ } - - if (avctx->hwaccel) { - if (s->ref && (ret = avctx->hwaccel->end_frame(avctx)) < 0) { - -From 317722fd652d9a1c1700319c80fc71acf68ddde6 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 26 Sep 2022 18:26:17 +0100 -Subject: [PATCH 010/151] hwaccel: Add CAP_MT_SAFE for accels that can use - multi-thread - ---- - libavcodec/hwconfig.h | 1 + - libavcodec/pthread_frame.c | 7 +++++-- - 2 files changed, 6 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h -index 721424912c..c43ad55245 100644 ---- a/libavcodec/hwconfig.h -+++ b/libavcodec/hwconfig.h -@@ -24,6 +24,7 @@ - - - #define HWACCEL_CAP_ASYNC_SAFE (1 << 0) -+#define HWACCEL_CAP_MT_SAFE (1 << 1) - - - typedef struct AVCodecHWConfigInternal { -diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c -index d9d5afaa82..2cc89a41f5 100644 ---- a/libavcodec/pthread_frame.c -+++ b/libavcodec/pthread_frame.c -@@ -204,7 +204,8 @@ static attribute_align_arg void *frame_worker_thread(void *arg) - - /* if the previous thread uses hwaccel then we take the lock to ensure - * the threads don't run concurrently */ -- if (avctx->hwaccel) { -+ if (avctx->hwaccel && -+ !(avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE)) { - pthread_mutex_lock(&p->parent->hwaccel_mutex); - p->hwaccel_serializing = 1; - } -@@ -590,7 +591,9 @@ void ff_thread_finish_setup(AVCodecContext *avctx) { - - if (!(avctx->active_thread_type&FF_THREAD_FRAME)) return; - -- if (avctx->hwaccel && !p->hwaccel_serializing) { -+ if (avctx->hwaccel && -+ !(avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE) && -+ !p->hwaccel_serializing) { - pthread_mutex_lock(&p->parent->hwaccel_mutex); - p->hwaccel_serializing = 1; - } - -From 9005b263450e154a5ec5258fda17d5998fe7896b Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 17:59:08 +0100 -Subject: [PATCH 011/151] Weak link utils - ---- - libavcodec/weak_link.c | 102 +++++++++++++++++++++++++++++++++++++++++ - libavcodec/weak_link.h | 23 ++++++++++ - 2 files changed, 125 insertions(+) - create mode 100644 libavcodec/weak_link.c - create mode 100644 libavcodec/weak_link.h - -diff --git a/libavcodec/weak_link.c b/libavcodec/weak_link.c -new file mode 100644 -index 0000000000..f234a985b9 ---- /dev/null -+++ b/libavcodec/weak_link.c -@@ -0,0 +1,102 @@ -+#include -+#include -+#include -+#include "weak_link.h" -+ -+struct ff_weak_link_master { -+ atomic_int ref_count; /* 0 is single ref for easier atomics */ -+ pthread_rwlock_t lock; -+ void * ptr; -+}; -+ -+static inline struct ff_weak_link_master * weak_link_x(struct ff_weak_link_client * c) -+{ -+ return (struct ff_weak_link_master *)c; -+} -+ -+struct ff_weak_link_master * ff_weak_link_new(void * p) -+{ -+ struct ff_weak_link_master * w = malloc(sizeof(*w)); -+ if (!w) -+ return NULL; -+ w->ptr = p; -+ if (pthread_rwlock_init(&w->lock, NULL)) { -+ free(w); -+ return NULL; -+ } -+ return w; -+} -+ -+static void weak_link_do_unref(struct ff_weak_link_master * const w) -+{ -+ int n = atomic_fetch_sub(&w->ref_count, 1); -+ if (n) -+ return; -+ -+ pthread_rwlock_destroy(&w->lock); -+ free(w); -+} -+ -+// Unref & break link -+void ff_weak_link_break(struct ff_weak_link_master ** ppLink) -+{ -+ struct ff_weak_link_master * const w = *ppLink; -+ if (!w) -+ return; -+ -+ *ppLink = NULL; -+ pthread_rwlock_wrlock(&w->lock); -+ w->ptr = NULL; -+ pthread_rwlock_unlock(&w->lock); -+ -+ weak_link_do_unref(w); -+} -+ -+struct ff_weak_link_client* ff_weak_link_ref(struct ff_weak_link_master * w) -+{ -+ if (!w) -+ return NULL; -+ atomic_fetch_add(&w->ref_count, 1); -+ return (struct ff_weak_link_client*)w; -+} -+ -+void ff_weak_link_unref(struct ff_weak_link_client ** ppLink) -+{ -+ struct ff_weak_link_master * const w = weak_link_x(*ppLink); -+ if (!w) -+ return; -+ -+ *ppLink = NULL; -+ weak_link_do_unref(w); -+} -+ -+void * ff_weak_link_lock(struct ff_weak_link_client ** ppLink) -+{ -+ struct ff_weak_link_master * const w = weak_link_x(*ppLink); -+ -+ if (!w) -+ return NULL; -+ -+ if (pthread_rwlock_rdlock(&w->lock)) -+ goto broken; -+ -+ if (w->ptr) -+ return w->ptr; -+ -+ pthread_rwlock_unlock(&w->lock); -+ -+broken: -+ *ppLink = NULL; -+ weak_link_do_unref(w); -+ return NULL; -+} -+ -+// Ignores a NULL c (so can be on the return path of both broken & live links) -+void ff_weak_link_unlock(struct ff_weak_link_client * c) -+{ -+ struct ff_weak_link_master * const w = weak_link_x(c); -+ if (w) -+ pthread_rwlock_unlock(&w->lock); -+} -+ -+ -diff --git a/libavcodec/weak_link.h b/libavcodec/weak_link.h -new file mode 100644 -index 0000000000..415b6a27a0 ---- /dev/null -+++ b/libavcodec/weak_link.h -@@ -0,0 +1,23 @@ -+struct ff_weak_link_master; -+struct ff_weak_link_client; -+ -+struct ff_weak_link_master * ff_weak_link_new(void * p); -+void ff_weak_link_break(struct ff_weak_link_master ** ppLink); -+ -+struct ff_weak_link_client* ff_weak_link_ref(struct ff_weak_link_master * w); -+void ff_weak_link_unref(struct ff_weak_link_client ** ppLink); -+ -+// Returns NULL if link broken - in this case it will also zap -+// *ppLink and unref the weak_link. -+// Returns NULL if *ppLink is NULL (so a link once broken stays broken) -+// -+// The above does mean that there is a race if this is called simultainiously -+// by two threads using the same weak_link_client (so don't do that) -+void * ff_weak_link_lock(struct ff_weak_link_client ** ppLink); -+void ff_weak_link_unlock(struct ff_weak_link_client * c); -+ -+ -+ -+ -+ -+ - -From 824be1710ca96d97c86836fdac0e7dcd28a4b92e Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 19:23:26 +0100 -Subject: [PATCH 012/151] Add v4l2_req V4L2 request H265 drm_prime decode - -Has the abiliy to switch between kernel API versions at runtime. This -could be removed later once teher is no chance of usage on an old -kernel. ---- - configure | 14 + - libavcodec/Makefile | 4 + - libavcodec/hevc-ctrls-v1.h | 229 +++++ - libavcodec/hevc-ctrls-v2.h | 257 +++++ - libavcodec/hevcdec.c | 10 + - libavcodec/hwaccels.h | 1 + - libavcodec/hwconfig.h | 2 + - libavcodec/v4l2_req_decode_q.c | 84 ++ - libavcodec/v4l2_req_decode_q.h | 25 + - libavcodec/v4l2_req_devscan.c | 449 +++++++++ - libavcodec/v4l2_req_devscan.h | 23 + - libavcodec/v4l2_req_dmabufs.c | 266 ++++++ - libavcodec/v4l2_req_dmabufs.h | 40 + - libavcodec/v4l2_req_hevc_v1.c | 3 + - libavcodec/v4l2_req_hevc_v2.c | 3 + - libavcodec/v4l2_req_hevc_vx.c | 1213 +++++++++++++++++++++++ - libavcodec/v4l2_req_media.c | 1596 +++++++++++++++++++++++++++++++ - libavcodec/v4l2_req_media.h | 151 +++ - libavcodec/v4l2_req_pollqueue.c | 361 +++++++ - libavcodec/v4l2_req_pollqueue.h | 18 + - libavcodec/v4l2_req_utils.h | 27 + - libavcodec/v4l2_request_hevc.c | 297 ++++++ - libavcodec/v4l2_request_hevc.h | 102 ++ - 23 files changed, 5175 insertions(+) - create mode 100644 libavcodec/hevc-ctrls-v1.h - create mode 100644 libavcodec/hevc-ctrls-v2.h - create mode 100644 libavcodec/v4l2_req_decode_q.c - create mode 100644 libavcodec/v4l2_req_decode_q.h - create mode 100644 libavcodec/v4l2_req_devscan.c - create mode 100644 libavcodec/v4l2_req_devscan.h - create mode 100644 libavcodec/v4l2_req_dmabufs.c - create mode 100644 libavcodec/v4l2_req_dmabufs.h - create mode 100644 libavcodec/v4l2_req_hevc_v1.c - create mode 100644 libavcodec/v4l2_req_hevc_v2.c - create mode 100644 libavcodec/v4l2_req_hevc_vx.c - create mode 100644 libavcodec/v4l2_req_media.c - create mode 100644 libavcodec/v4l2_req_media.h - create mode 100644 libavcodec/v4l2_req_pollqueue.c - create mode 100644 libavcodec/v4l2_req_pollqueue.h - create mode 100644 libavcodec/v4l2_req_utils.h - create mode 100644 libavcodec/v4l2_request_hevc.c - create mode 100644 libavcodec/v4l2_request_hevc.h - -diff --git a/configure b/configure -index 7712482bd5..199aa2b3d5 100755 ---- a/configure -+++ b/configure -@@ -281,6 +281,7 @@ External library support: - if openssl, gnutls or mbedtls is not used [no] - --enable-libtwolame enable MP2 encoding via libtwolame [no] - --enable-libuavs3d enable AVS3 decoding via libuavs3d [no] -+ --enable-libudev enable libudev [no] - --enable-libv4l2 enable libv4l2/v4l-utils [no] - --enable-libvidstab enable video stabilization using vid.stab [no] - --enable-libvmaf enable vmaf filter via libvmaf [no] -@@ -351,6 +352,7 @@ External library support: - --enable-omx-rpi enable OpenMAX IL code for Raspberry Pi [no] - --enable-rkmpp enable Rockchip Media Process Platform code [no] - --disable-v4l2-m2m disable V4L2 mem2mem code [autodetect] -+ --enable-v4l2-request enable V4L2 request API code [no] - --disable-vaapi disable Video Acceleration API (mainly Unix/Intel) code [autodetect] - --disable-vdpau disable Nvidia Video Decode and Presentation API for Unix code [autodetect] - --disable-videotoolbox disable VideoToolbox code [autodetect] -@@ -1858,6 +1860,7 @@ EXTERNAL_LIBRARY_LIST=" - libtheora - libtwolame - libuavs3d -+ libudev - libv4l2 - libvmaf - libvorbis -@@ -1914,6 +1917,7 @@ HWACCEL_LIBRARY_LIST=" - mmal - omx - opencl -+ v4l2_request - " - - DOCUMENT_LIST=" -@@ -3002,6 +3006,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext" - dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32 user32" - ffnvcodec_deps_any="libdl LoadLibrary" - nvdec_deps="ffnvcodec" -+v4l2_request_deps="linux_videodev2_h linux_media_h v4l2_timeval_to_ns libdrm libudev" - vaapi_x11_deps="xlib_x11" - videotoolbox_hwaccel_deps="videotoolbox pthreads" - videotoolbox_hwaccel_extralibs="-framework QuartzCore" -@@ -3045,6 +3050,8 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" - hevc_dxva2_hwaccel_select="hevc_decoder" - hevc_nvdec_hwaccel_deps="nvdec" - hevc_nvdec_hwaccel_select="hevc_decoder" -+hevc_v4l2request_hwaccel_deps="v4l2_request" -+hevc_v4l2request_hwaccel_select="hevc_decoder" - hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC" - hevc_vaapi_hwaccel_select="hevc_decoder" - hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC" -@@ -6696,6 +6703,7 @@ enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame - { check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame || - die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; } - enabled libuavs3d && require_pkg_config libuavs3d "uavs3d >= 1.1.41" uavs3d.h uavs3d_decode -+enabled libudev && require_pkg_config libudev libudev libudev.h udev_new - enabled libv4l2 && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl - enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit - enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 2.0.0" libvmaf.h vmaf_init -@@ -6798,6 +6806,10 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r - { enabled libdrm || - die "ERROR: rkmpp requires --enable-libdrm"; } - } -+enabled v4l2_request && { enabled libdrm || -+ die "ERROR: v4l2-request requires --enable-libdrm"; } && -+ { enabled libudev || -+ die "ERROR: v4l2-request requires --enable-libudev"; } - enabled vapoursynth && require_pkg_config vapoursynth "vapoursynth-script >= 42" VSScript.h vsscript_init - - -@@ -6880,6 +6892,8 @@ if enabled v4l2_m2m; then - check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" - fi - -+check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns -+check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;" - check_headers sys/videoio.h - test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete - -diff --git a/libavcodec/Makefile b/libavcodec/Makefile -index 389253f5d0..2d440b5648 100644 ---- a/libavcodec/Makefile -+++ b/libavcodec/Makefile -@@ -170,6 +170,8 @@ OBJS-$(CONFIG_VP3DSP) += vp3dsp.o - OBJS-$(CONFIG_VP56DSP) += vp56dsp.o - OBJS-$(CONFIG_VP8DSP) += vp8dsp.o - OBJS-$(CONFIG_V4L2_M2M) += v4l2_m2m.o v4l2_context.o v4l2_buffers.o v4l2_fmt.o -+OBJS-$(CONFIG_V4L2_REQUEST) += v4l2_req_media.o v4l2_req_pollqueue.o v4l2_req_dmabufs.o\ -+ v4l2_req_devscan.o weak_link.o - OBJS-$(CONFIG_WMA_FREQS) += wma_freqs.o - OBJS-$(CONFIG_WMV2DSP) += wmv2dsp.o - -@@ -996,6 +998,8 @@ OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o - OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o - OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o - OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o -+OBJS-$(CONFIG_HEVC_V4L2REQUEST_HWACCEL) += v4l2_request_hevc.o v4l2_req_decode_q.o\ -+ v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o - OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o - OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o - OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o -diff --git a/libavcodec/hevc-ctrls-v1.h b/libavcodec/hevc-ctrls-v1.h -new file mode 100644 -index 0000000000..72cbba0953 ---- /dev/null -+++ b/libavcodec/hevc-ctrls-v1.h -@@ -0,0 +1,229 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * These are the HEVC state controls for use with stateless HEVC -+ * codec drivers. -+ * -+ * It turns out that these structs are not stable yet and will undergo -+ * more changes. So keep them private until they are stable and ready to -+ * become part of the official public API. -+ */ -+ -+#ifndef _HEVC_CTRLS_H_ -+#define _HEVC_CTRLS_H_ -+ -+#include -+ -+/* The pixel format isn't stable at the moment and will likely be renamed. */ -+#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ -+ -+#define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 1008) -+#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 1009) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 1010) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_MPEG_BASE + 1011) -+#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_MPEG_BASE + 1015) -+#define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_MPEG_BASE + 1016) -+ -+/* enum v4l2_ctrl_type type values */ -+#define V4L2_CTRL_TYPE_HEVC_SPS 0x0120 -+#define V4L2_CTRL_TYPE_HEVC_PPS 0x0121 -+#define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122 -+#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0123 -+ -+enum v4l2_mpeg_video_hevc_decode_mode { -+ V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED, -+ V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED, -+}; -+ -+enum v4l2_mpeg_video_hevc_start_code { -+ V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE, -+ V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B, -+}; -+ -+#define V4L2_HEVC_SLICE_TYPE_B 0 -+#define V4L2_HEVC_SLICE_TYPE_P 1 -+#define V4L2_HEVC_SLICE_TYPE_I 2 -+ -+#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) -+#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) -+#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) -+#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) -+#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) -+#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) -+#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) -+#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) -+#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) -+ -+/* The controls are not stable at the moment and will likely be reworked. */ -+struct v4l2_ctrl_hevc_sps { -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */ -+ __u16 pic_width_in_luma_samples; -+ __u16 pic_height_in_luma_samples; -+ __u8 bit_depth_luma_minus8; -+ __u8 bit_depth_chroma_minus8; -+ __u8 log2_max_pic_order_cnt_lsb_minus4; -+ __u8 sps_max_dec_pic_buffering_minus1; -+ __u8 sps_max_num_reorder_pics; -+ __u8 sps_max_latency_increase_plus1; -+ __u8 log2_min_luma_coding_block_size_minus3; -+ __u8 log2_diff_max_min_luma_coding_block_size; -+ __u8 log2_min_luma_transform_block_size_minus2; -+ __u8 log2_diff_max_min_luma_transform_block_size; -+ __u8 max_transform_hierarchy_depth_inter; -+ __u8 max_transform_hierarchy_depth_intra; -+ __u8 pcm_sample_bit_depth_luma_minus1; -+ __u8 pcm_sample_bit_depth_chroma_minus1; -+ __u8 log2_min_pcm_luma_coding_block_size_minus3; -+ __u8 log2_diff_max_min_pcm_luma_coding_block_size; -+ __u8 num_short_term_ref_pic_sets; -+ __u8 num_long_term_ref_pics_sps; -+ __u8 chroma_format_idc; -+ __u8 sps_max_sub_layers_minus1; -+ -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT (1ULL << 0) -+#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) -+#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) -+#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) -+#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) -+#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) -+#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) -+#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) -+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) -+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) -+#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) -+#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) -+#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) -+#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) -+#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) -+#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) -+#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) -+#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) -+#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) -+ -+struct v4l2_ctrl_hevc_pps { -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ -+ __u8 num_extra_slice_header_bits; -+ __s8 init_qp_minus26; -+ __u8 diff_cu_qp_delta_depth; -+ __s8 pps_cb_qp_offset; -+ __s8 pps_cr_qp_offset; -+ __u8 num_tile_columns_minus1; -+ __u8 num_tile_rows_minus1; -+ __u8 column_width_minus1[20]; -+ __u8 row_height_minus1[22]; -+ __s8 pps_beta_offset_div2; -+ __s8 pps_tc_offset_div2; -+ __u8 log2_parallel_merge_level_minus2; -+ -+ __u8 padding[4]; -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE 0x01 -+#define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_AFTER 0x02 -+#define V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR 0x03 -+ -+#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 -+ -+struct v4l2_hevc_dpb_entry { -+ __u64 timestamp; -+ __u8 rps; -+ __u8 field_pic; -+ __u16 pic_order_cnt[2]; -+ __u8 padding[2]; -+}; -+ -+struct v4l2_hevc_pred_weight_table { -+ __s8 delta_luma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 luma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 delta_chroma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ __s8 chroma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ -+ __s8 delta_luma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 luma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 delta_chroma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ __s8 chroma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ -+ __u8 padding[6]; -+ -+ __u8 luma_log2_weight_denom; -+ __s8 delta_chroma_log2_weight_denom; -+}; -+ -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) -+#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; -+ __u32 data_bit_offset; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u32 slice_segment_addr; -+ __u32 num_entry_point_offsets; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ -+ __u8 nal_unit_type; -+ __u8 nuh_temporal_id_plus1; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u8 slice_type; -+ __u8 colour_plane_id; -+ __u16 slice_pic_order_cnt; -+ __u8 num_ref_idx_l0_active_minus1; -+ __u8 num_ref_idx_l1_active_minus1; -+ __u8 collocated_ref_idx; -+ __u8 five_minus_max_num_merge_cand; -+ __s8 slice_qp_delta; -+ __s8 slice_cb_qp_offset; -+ __s8 slice_cr_qp_offset; -+ __s8 slice_act_y_qp_offset; -+ __s8 slice_act_cb_qp_offset; -+ __s8 slice_act_cr_qp_offset; -+ __s8 slice_beta_offset_div2; -+ __s8 slice_tc_offset_div2; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ -+ __u8 pic_struct; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u8 num_active_dpb_entries; -+ __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ -+ __u8 num_rps_poc_st_curr_before; -+ __u8 num_rps_poc_st_curr_after; -+ __u8 num_rps_poc_lt_curr; -+ -+ __u8 padding; -+ -+ __u32 entry_point_offset_minus1[256]; -+ -+ /* 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]; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ -+ struct v4l2_hevc_pred_weight_table pred_weight_table; -+ -+ __u64 flags; -+}; -+ -+struct v4l2_ctrl_hevc_scaling_matrix { -+ __u8 scaling_list_4x4[6][16]; -+ __u8 scaling_list_8x8[6][64]; -+ __u8 scaling_list_16x16[6][64]; -+ __u8 scaling_list_32x32[2][64]; -+ __u8 scaling_list_dc_coef_16x16[6]; -+ __u8 scaling_list_dc_coef_32x32[2]; -+}; -+ -+#endif -diff --git a/libavcodec/hevc-ctrls-v2.h b/libavcodec/hevc-ctrls-v2.h -new file mode 100644 -index 0000000000..7cbbbf055f ---- /dev/null -+++ b/libavcodec/hevc-ctrls-v2.h -@@ -0,0 +1,257 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * These are the HEVC state controls for use with stateless HEVC -+ * codec drivers. -+ * -+ * It turns out that these structs are not stable yet and will undergo -+ * more changes. So keep them private until they are stable and ready to -+ * become part of the official public API. -+ */ -+ -+#ifndef _HEVC_CTRLS_H_ -+#define _HEVC_CTRLS_H_ -+ -+#include -+ -+/* The pixel format isn't stable at the moment and will likely be renamed. */ -+#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ -+ -+#define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_CODEC_BASE + 1008) -+#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_CODEC_BASE + 1009) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_BASE + 1010) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_CODEC_BASE + 1011) -+#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS (V4L2_CID_CODEC_BASE + 1012) -+#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_CODEC_BASE + 1015) -+#define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_CODEC_BASE + 1016) -+ -+/* enum v4l2_ctrl_type type values */ -+#define V4L2_CTRL_TYPE_HEVC_SPS 0x0120 -+#define V4L2_CTRL_TYPE_HEVC_PPS 0x0121 -+#define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122 -+#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0123 -+#define V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS 0x0124 -+ -+enum v4l2_mpeg_video_hevc_decode_mode { -+ V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED, -+ V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED, -+}; -+ -+enum v4l2_mpeg_video_hevc_start_code { -+ V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE, -+ V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B, -+}; -+ -+#define V4L2_HEVC_SLICE_TYPE_B 0 -+#define V4L2_HEVC_SLICE_TYPE_P 1 -+#define V4L2_HEVC_SLICE_TYPE_I 2 -+ -+#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) -+#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) -+#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) -+#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) -+#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) -+#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) -+#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) -+#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) -+#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) -+ -+/* The controls are not stable at the moment and will likely be reworked. */ -+struct v4l2_ctrl_hevc_sps { -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */ -+ __u16 pic_width_in_luma_samples; -+ __u16 pic_height_in_luma_samples; -+ __u8 bit_depth_luma_minus8; -+ __u8 bit_depth_chroma_minus8; -+ __u8 log2_max_pic_order_cnt_lsb_minus4; -+ __u8 sps_max_dec_pic_buffering_minus1; -+ __u8 sps_max_num_reorder_pics; -+ __u8 sps_max_latency_increase_plus1; -+ __u8 log2_min_luma_coding_block_size_minus3; -+ __u8 log2_diff_max_min_luma_coding_block_size; -+ __u8 log2_min_luma_transform_block_size_minus2; -+ __u8 log2_diff_max_min_luma_transform_block_size; -+ __u8 max_transform_hierarchy_depth_inter; -+ __u8 max_transform_hierarchy_depth_intra; -+ __u8 pcm_sample_bit_depth_luma_minus1; -+ __u8 pcm_sample_bit_depth_chroma_minus1; -+ __u8 log2_min_pcm_luma_coding_block_size_minus3; -+ __u8 log2_diff_max_min_pcm_luma_coding_block_size; -+ __u8 num_short_term_ref_pic_sets; -+ __u8 num_long_term_ref_pics_sps; -+ __u8 chroma_format_idc; -+ __u8 sps_max_sub_layers_minus1; -+ -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED (1ULL << 0) -+#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) -+#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) -+#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) -+#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) -+#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) -+#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) -+#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) -+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) -+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) -+#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) -+#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) -+#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) -+#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) -+#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) -+#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) -+#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) -+#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) -+#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) -+#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT (1ULL << 19) -+#define V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING (1ULL << 20) -+ -+struct v4l2_ctrl_hevc_pps { -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ -+ __u8 num_extra_slice_header_bits; -+ __u8 num_ref_idx_l0_default_active_minus1; -+ __u8 num_ref_idx_l1_default_active_minus1; -+ __s8 init_qp_minus26; -+ __u8 diff_cu_qp_delta_depth; -+ __s8 pps_cb_qp_offset; -+ __s8 pps_cr_qp_offset; -+ __u8 num_tile_columns_minus1; -+ __u8 num_tile_rows_minus1; -+ __u8 column_width_minus1[20]; -+ __u8 row_height_minus1[22]; -+ __s8 pps_beta_offset_div2; -+ __s8 pps_tc_offset_div2; -+ __u8 log2_parallel_merge_level_minus2; -+ -+ __u8 padding[4]; -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE 0x01 -+#define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_AFTER 0x02 -+#define V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR 0x03 -+ -+#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 -+ -+struct v4l2_hevc_dpb_entry { -+ __u64 timestamp; -+ __u8 rps; -+ __u8 field_pic; -+ __u16 pic_order_cnt[2]; -+ __u8 padding[2]; -+}; -+ -+struct v4l2_hevc_pred_weight_table { -+ __s8 delta_luma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 luma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 delta_chroma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ __s8 chroma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ -+ __s8 delta_luma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 luma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 delta_chroma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ __s8 chroma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ -+ __u8 padding[6]; -+ -+ __u8 luma_log2_weight_denom; -+ __s8 delta_chroma_log2_weight_denom; -+}; -+ -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) -+#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; -+ __u32 data_bit_offset; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u32 slice_segment_addr; -+ __u32 num_entry_point_offsets; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ -+ __u8 nal_unit_type; -+ __u8 nuh_temporal_id_plus1; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u8 slice_type; -+ __u8 colour_plane_id; -+ __u16 slice_pic_order_cnt; -+ __u8 num_ref_idx_l0_active_minus1; -+ __u8 num_ref_idx_l1_active_minus1; -+ __u8 collocated_ref_idx; -+ __u8 five_minus_max_num_merge_cand; -+ __s8 slice_qp_delta; -+ __s8 slice_cb_qp_offset; -+ __s8 slice_cr_qp_offset; -+ __s8 slice_act_y_qp_offset; -+ __s8 slice_act_cb_qp_offset; -+ __s8 slice_act_cr_qp_offset; -+ __s8 slice_beta_offset_div2; -+ __s8 slice_tc_offset_div2; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ -+ __u8 pic_struct; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ -+ __u8 padding[5]; -+ -+ __u32 entry_point_offset_minus1[256]; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ -+ struct v4l2_hevc_pred_weight_table pred_weight_table; -+ -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC 0x1 -+#define V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC 0x2 -+#define V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR 0x4 -+ -+struct v4l2_ctrl_hevc_decode_params { -+ __s32 pic_order_cnt_val; -+ __u8 num_active_dpb_entries; -+ struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 num_poc_st_curr_before; -+ __u8 num_poc_st_curr_after; -+ __u8 num_poc_lt_curr; -+ __u8 poc_st_curr_before[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 poc_st_curr_after[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u64 flags; -+}; -+ -+/* MPEG-class control IDs specific to the Hantro driver as defined by V4L2 */ -+#define V4L2_CID_CODEC_HANTRO_BASE (V4L2_CTRL_CLASS_CODEC | 0x1200) -+/* -+ * V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP - -+ * the number of data (in bits) to skip in the -+ * slice segment header. -+ * If non-IDR, the bits to be skipped go from syntax element "pic_output_flag" -+ * to before syntax element "slice_temporal_mvp_enabled_flag". -+ * If IDR, the skipped bits are just "pic_output_flag" -+ * (separate_colour_plane_flag is not supported). -+ */ -+#define V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP (V4L2_CID_CODEC_HANTRO_BASE + 0) -+ -+struct v4l2_ctrl_hevc_scaling_matrix { -+ __u8 scaling_list_4x4[6][16]; -+ __u8 scaling_list_8x8[6][64]; -+ __u8 scaling_list_16x16[6][64]; -+ __u8 scaling_list_32x32[2][64]; -+ __u8 scaling_list_dc_coef_16x16[6]; -+ __u8 scaling_list_dc_coef_32x32[2]; -+}; -+ -+#endif -diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c -index 8a0246fa21..2867cb2e16 100644 ---- a/libavcodec/hevcdec.c -+++ b/libavcodec/hevcdec.c -@@ -416,6 +416,7 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) - #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \ - CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \ - CONFIG_HEVC_NVDEC_HWACCEL + \ -+ CONFIG_HEVC_V4L2REQUEST_HWACCEL + \ - CONFIG_HEVC_VAAPI_HWACCEL + \ - CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \ - CONFIG_HEVC_VDPAU_HWACCEL) -@@ -442,6 +443,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) - #endif - #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL - *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX; -+#endif -+#if CONFIG_HEVC_V4L2REQUEST_HWACCEL -+ *fmt++ = AV_PIX_FMT_DRM_PRIME; - #endif - break; - case AV_PIX_FMT_YUV420P10: -@@ -463,6 +467,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) - #endif - #if CONFIG_HEVC_NVDEC_HWACCEL - *fmt++ = AV_PIX_FMT_CUDA; -+#endif -+#if CONFIG_HEVC_V4L2REQUEST_HWACCEL -+ *fmt++ = AV_PIX_FMT_DRM_PRIME; - #endif - break; - case AV_PIX_FMT_YUV444P: -@@ -3749,6 +3756,9 @@ const FFCodec ff_hevc_decoder = { - #if CONFIG_HEVC_NVDEC_HWACCEL - HWACCEL_NVDEC(hevc), - #endif -+#if CONFIG_HEVC_V4L2REQUEST_HWACCEL -+ HWACCEL_V4L2REQUEST(hevc), -+#endif - #if CONFIG_HEVC_VAAPI_HWACCEL - HWACCEL_VAAPI(hevc), - #endif -diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h -index aca55831f3..f32d1c4ec4 100644 ---- a/libavcodec/hwaccels.h -+++ b/libavcodec/hwaccels.h -@@ -40,6 +40,7 @@ extern const AVHWAccel ff_hevc_d3d11va_hwaccel; - extern const AVHWAccel ff_hevc_d3d11va2_hwaccel; - extern const AVHWAccel ff_hevc_dxva2_hwaccel; - extern const AVHWAccel ff_hevc_nvdec_hwaccel; -+extern const AVHWAccel ff_hevc_v4l2request_hwaccel; - extern const AVHWAccel ff_hevc_vaapi_hwaccel; - extern const AVHWAccel ff_hevc_vdpau_hwaccel; - extern const AVHWAccel ff_hevc_videotoolbox_hwaccel; -diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h -index c43ad55245..b8aa383071 100644 ---- a/libavcodec/hwconfig.h -+++ b/libavcodec/hwconfig.h -@@ -71,6 +71,8 @@ typedef struct AVCodecHWConfigInternal { - HW_CONFIG_HWACCEL(1, 1, 0, D3D11, D3D11VA, ff_ ## codec ## _d3d11va2_hwaccel) - #define HWACCEL_NVDEC(codec) \ - HW_CONFIG_HWACCEL(1, 1, 0, CUDA, CUDA, ff_ ## codec ## _nvdec_hwaccel) -+#define HWACCEL_V4L2REQUEST(codec) \ -+ HW_CONFIG_HWACCEL(1, 0, 0, DRM_PRIME, DRM, ff_ ## codec ## _v4l2request_hwaccel) - #define HWACCEL_VAAPI(codec) \ - HW_CONFIG_HWACCEL(1, 1, 1, VAAPI, VAAPI, ff_ ## codec ## _vaapi_hwaccel) - #define HWACCEL_VDPAU(codec) \ -diff --git a/libavcodec/v4l2_req_decode_q.c b/libavcodec/v4l2_req_decode_q.c -new file mode 100644 -index 0000000000..5b3fb958fa ---- /dev/null -+++ b/libavcodec/v4l2_req_decode_q.c -@@ -0,0 +1,84 @@ -+#include -+#include -+#include -+ -+#include "v4l2_req_decode_q.h" -+ -+int decode_q_in_q(const req_decode_ent * const d) -+{ -+ return d->in_q; -+} -+ -+void decode_q_add(req_decode_q * const q, req_decode_ent * const d) -+{ -+ pthread_mutex_lock(&q->q_lock); -+ if (!q->head) { -+ q->head = d; -+ q->tail = d; -+ d->prev = NULL; -+ } -+ else { -+ q->tail->next = d; -+ d->prev = q->tail; -+ q->tail = d; -+ } -+ d->next = NULL; -+ d->in_q = 1; -+ pthread_mutex_unlock(&q->q_lock); -+} -+ -+// Remove entry from Q - if head wake-up anything that was waiting -+void decode_q_remove(req_decode_q * const q, req_decode_ent * const d) -+{ -+ int try_signal = 0; -+ -+ if (!d->in_q) -+ return; -+ -+ pthread_mutex_lock(&q->q_lock); -+ if (d->prev) -+ d->prev->next = d->next; -+ else { -+ try_signal = 1; // Only need to signal if we were head -+ q->head = d->next; -+ } -+ -+ if (d->next) -+ d->next->prev = d->prev; -+ else -+ q->tail = d->prev; -+ -+ // Not strictly needed but makes debug easier -+ d->next = NULL; -+ d->prev = NULL; -+ d->in_q = 0; -+ pthread_mutex_unlock(&q->q_lock); -+ -+ if (try_signal) -+ pthread_cond_broadcast(&q->q_cond); -+} -+ -+void decode_q_wait(req_decode_q * const q, req_decode_ent * const d) -+{ -+ pthread_mutex_lock(&q->q_lock); -+ -+ while (q->head != d) -+ pthread_cond_wait(&q->q_cond, &q->q_lock); -+ -+ pthread_mutex_unlock(&q->q_lock); -+} -+ -+void decode_q_uninit(req_decode_q * const q) -+{ -+ pthread_mutex_destroy(&q->q_lock); -+ pthread_cond_destroy(&q->q_cond); -+} -+ -+void decode_q_init(req_decode_q * const q) -+{ -+ memset(q, 0, sizeof(*q)); -+ pthread_mutex_init(&q->q_lock, NULL); -+ pthread_cond_init(&q->q_cond, NULL); -+} -+ -+ -diff --git a/libavcodec/v4l2_req_decode_q.h b/libavcodec/v4l2_req_decode_q.h -new file mode 100644 -index 0000000000..af7bbe1de4 ---- /dev/null -+++ b/libavcodec/v4l2_req_decode_q.h -@@ -0,0 +1,25 @@ -+#ifndef AVCODEC_V4L2_REQ_DECODE_Q_H -+#define AVCODEC_V4L2_REQ_DECODE_Q_H -+ -+typedef struct req_decode_ent { -+ struct req_decode_ent * next; -+ struct req_decode_ent * prev; -+ int in_q; -+} req_decode_ent; -+ -+typedef struct req_decode_q { -+ pthread_mutex_t q_lock; -+ pthread_cond_t q_cond; -+ req_decode_ent * head; -+ req_decode_ent * tail; -+} req_decode_q; -+ -+int decode_q_in_q(const req_decode_ent * const d); -+void decode_q_add(req_decode_q * const q, req_decode_ent * const d); -+void decode_q_remove(req_decode_q * const q, req_decode_ent * const d); -+void decode_q_wait(req_decode_q * const q, req_decode_ent * const d); -+void decode_q_uninit(req_decode_q * const q); -+void decode_q_init(req_decode_q * const q); -+ -+#endif -+ -diff --git a/libavcodec/v4l2_req_devscan.c b/libavcodec/v4l2_req_devscan.c -new file mode 100644 -index 0000000000..cfa94d55c4 ---- /dev/null -+++ b/libavcodec/v4l2_req_devscan.c -@@ -0,0 +1,449 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include -+#include -+ -+#include "v4l2_req_devscan.h" -+#include "v4l2_req_utils.h" -+ -+struct decdev { -+ enum v4l2_buf_type src_type; -+ uint32_t src_fmt_v4l2; -+ const char * vname; -+ const char * mname; -+}; -+ -+struct devscan { -+ struct decdev env; -+ unsigned int dev_size; -+ unsigned int dev_count; -+ struct decdev *devs; -+}; -+ -+static int video_src_pixfmt_supported(uint32_t fmt) -+{ -+ return 1; -+} -+ -+static void v4l2_setup_format(struct v4l2_format *format, unsigned int type, -+ unsigned int width, unsigned int height, -+ unsigned int pixelformat) -+{ -+ unsigned int sizeimage; -+ -+ memset(format, 0, sizeof(*format)); -+ format->type = type; -+ -+ sizeimage = V4L2_TYPE_IS_OUTPUT(type) ? 4 * 1024 * 1024 : 0; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(type)) { -+ format->fmt.pix_mp.width = width; -+ format->fmt.pix_mp.height = height; -+ format->fmt.pix_mp.plane_fmt[0].sizeimage = sizeimage; -+ format->fmt.pix_mp.pixelformat = pixelformat; -+ } else { -+ format->fmt.pix.width = width; -+ format->fmt.pix.height = height; -+ format->fmt.pix.sizeimage = sizeimage; -+ format->fmt.pix.pixelformat = pixelformat; -+ } -+} -+ -+static int v4l2_set_format(int video_fd, unsigned int type, unsigned int pixelformat, -+ unsigned int width, unsigned int height) -+{ -+ struct v4l2_format format; -+ -+ v4l2_setup_format(&format, type, width, height, pixelformat); -+ -+ return ioctl(video_fd, VIDIOC_S_FMT, &format) ? -errno : 0; -+} -+ -+static int v4l2_query_capabilities(int video_fd, unsigned int *capabilities) -+{ -+ struct v4l2_capability capability = { 0 }; -+ int rc; -+ -+ rc = ioctl(video_fd, VIDIOC_QUERYCAP, &capability); -+ if (rc < 0) -+ return -errno; -+ -+ if (capabilities != NULL) { -+ if ((capability.capabilities & V4L2_CAP_DEVICE_CAPS) != 0) -+ *capabilities = capability.device_caps; -+ else -+ *capabilities = capability.capabilities; -+ } -+ -+ return 0; -+} -+ -+static int devscan_add(struct devscan *const scan, -+ enum v4l2_buf_type src_type, -+ uint32_t src_fmt_v4l2, -+ const char * vname, -+ const char * mname) -+{ -+ struct decdev *d; -+ -+ if (scan->dev_size <= scan->dev_count) { -+ unsigned int n = !scan->dev_size ? 4 : scan->dev_size * 2; -+ d = realloc(scan->devs, n * sizeof(*d)); -+ if (!d) -+ return -ENOMEM; -+ scan->devs = d; -+ scan->dev_size = n; -+ } -+ -+ d = scan->devs + scan->dev_count; -+ d->src_type = src_type; -+ d->src_fmt_v4l2 = src_fmt_v4l2; -+ d->vname = strdup(vname); -+ if (!d->vname) -+ return -ENOMEM; -+ d->mname = strdup(mname); -+ if (!d->mname) { -+ free((char *)d->vname); -+ return -ENOMEM; -+ } -+ ++scan->dev_count; -+ return 0; -+} -+ -+void devscan_delete(struct devscan **const pScan) -+{ -+ unsigned int i; -+ struct devscan * const scan = *pScan; -+ -+ if (!scan) -+ return; -+ *pScan = NULL; -+ -+ for (i = 0; i < scan->dev_count; ++i) { -+ free((char*)scan->devs[i].mname); -+ free((char*)scan->devs[i].vname); -+ } -+ free(scan->devs); -+ free(scan); -+} -+ -+#define REQ_BUF_CAPS (\ -+ V4L2_BUF_CAP_SUPPORTS_DMABUF |\ -+ V4L2_BUF_CAP_SUPPORTS_REQUESTS |\ -+ V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF) -+ -+static void probe_formats(void * const dc, -+ struct devscan *const scan, -+ const int fd, -+ const unsigned int type_v4l2, -+ const char *const mpath, -+ const char *const vpath) -+{ -+ unsigned int i; -+ for (i = 0;; ++i) { -+ struct v4l2_fmtdesc fmtdesc = { -+ .index = i, -+ .type = type_v4l2 -+ }; -+ struct v4l2_requestbuffers rbufs = { -+ .count = 0, -+ .type = type_v4l2, -+ .memory = V4L2_MEMORY_MMAP -+ }; -+ while (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc)) { -+ if (errno == EINTR) -+ continue; -+ if (errno != EINVAL) -+ request_err(dc, "Enum[%d] failed for type=%d\n", i, type_v4l2); -+ return; -+ } -+ if (!video_src_pixfmt_supported(fmtdesc.pixelformat)) -+ continue; -+ -+ if (v4l2_set_format(fd, type_v4l2, fmtdesc.pixelformat, 720, 480)) { -+ request_debug(dc, "Set failed for type=%d, pf=%.4s\n", type_v4l2, (char*)&fmtdesc.pixelformat); -+ continue; -+ } -+ -+ while (ioctl(fd, VIDIOC_REQBUFS, &rbufs)) { -+ if (errno != EINTR) { -+ request_debug(dc, "%s: Reqbufs failed\n", vpath); -+ continue; -+ } -+ } -+ -+ if ((rbufs.capabilities & REQ_BUF_CAPS) != REQ_BUF_CAPS) { -+ request_debug(dc, "%s: Buf caps %#x insufficient\n", vpath, rbufs.capabilities); -+ continue; -+ } -+ -+ request_debug(dc, "Adding: %s,%s pix=%#x, type=%d\n", -+ mpath, vpath, fmtdesc.pixelformat, type_v4l2); -+ devscan_add(scan, type_v4l2, fmtdesc.pixelformat, vpath, mpath); -+ } -+} -+ -+ -+static int probe_video_device(void * const dc, -+ struct udev_device *const device, -+ struct devscan *const scan, -+ const char *const mpath) -+{ -+ int ret; -+ unsigned int capabilities = 0; -+ int video_fd = -1; -+ -+ const char *path = udev_device_get_devnode(device); -+ if (!path) { -+ request_err(dc, "%s: get video device devnode failed\n", __func__); -+ ret = -EINVAL; -+ goto fail; -+ } -+ -+ video_fd = open(path, O_RDWR, 0); -+ if (video_fd == -1) { -+ ret = -errno; -+ request_err(dc, "%s: opening %s failed, %s (%d)\n", __func__, path, strerror(errno), errno); -+ goto fail; -+ } -+ -+ ret = v4l2_query_capabilities(video_fd, &capabilities); -+ if (ret < 0) { -+ request_err(dc, "%s: get video capability failed, %s (%d)\n", __func__, strerror(-ret), -ret); -+ goto fail; -+ } -+ -+ request_debug(dc, "%s: path=%s capabilities=%#x\n", __func__, path, capabilities); -+ -+ if (!(capabilities & V4L2_CAP_STREAMING)) { -+ request_debug(dc, "%s: missing required streaming capability\n", __func__); -+ ret = -EINVAL; -+ goto fail; -+ } -+ -+ if (!(capabilities & (V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_VIDEO_M2M))) { -+ request_debug(dc, "%s: missing required mem2mem capability\n", __func__); -+ ret = -EINVAL; -+ goto fail; -+ } -+ -+ /* Should check capture formats too... */ -+ if ((capabilities & V4L2_CAP_VIDEO_M2M) != 0) -+ probe_formats(dc, scan, video_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT, mpath, path); -+ if ((capabilities & V4L2_CAP_VIDEO_M2M_MPLANE) != 0) -+ probe_formats(dc, scan, video_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, mpath, path); -+ -+ close(video_fd); -+ return 0; -+ -+fail: -+ if (video_fd >= 0) -+ close(video_fd); -+ return ret; -+} -+ -+static int probe_media_device(void * const dc, -+ struct udev_device *const device, -+ struct devscan *const scan) -+{ -+ int ret; -+ int rv; -+ struct media_device_info device_info = { 0 }; -+ struct media_v2_topology topology = { 0 }; -+ struct media_v2_interface *interfaces = NULL; -+ struct udev *udev = udev_device_get_udev(device); -+ struct udev_device *video_device; -+ dev_t devnum; -+ int media_fd = -1; -+ -+ const char *path = udev_device_get_devnode(device); -+ if (!path) { -+ request_err(dc, "%s: get media device devnode failed\n", __func__); -+ ret = -EINVAL; -+ goto fail; -+ } -+ -+ media_fd = open(path, O_RDWR, 0); -+ if (media_fd < 0) { -+ ret = -errno; -+ request_err(dc, "%s: opening %s failed, %s (%d)\n", __func__, path, strerror(-ret), -ret); -+ goto fail; -+ } -+ -+ rv = ioctl(media_fd, MEDIA_IOC_DEVICE_INFO, &device_info); -+ if (rv < 0) { -+ ret = -errno; -+ request_err(dc, "%s: get media device info failed, %s (%d)\n", __func__, strerror(-ret), -ret); -+ goto fail; -+ } -+ -+ rv = ioctl(media_fd, MEDIA_IOC_G_TOPOLOGY, &topology); -+ if (rv < 0) { -+ ret = -errno; -+ request_err(dc, "%s: get media topology failed, %s (%d)\n", __func__, strerror(-ret), -ret); -+ goto fail; -+ } -+ -+ if (topology.num_interfaces <= 0) { -+ request_err(dc, "%s: media device has no interfaces\n", __func__); -+ ret = -EINVAL; -+ goto fail; -+ } -+ -+ interfaces = calloc(topology.num_interfaces, sizeof(*interfaces)); -+ if (!interfaces) { -+ request_err(dc, "%s: allocating media interface struct failed\n", __func__); -+ ret = -ENOMEM; -+ goto fail; -+ } -+ -+ topology.ptr_interfaces = (__u64)(uintptr_t)interfaces; -+ rv = ioctl(media_fd, MEDIA_IOC_G_TOPOLOGY, &topology); -+ if (rv < 0) { -+ ret = -errno; -+ request_err(dc, "%s: get media topology failed, %s (%d)\n", __func__, strerror(-ret), -ret); -+ goto fail; -+ } -+ -+ for (int i = 0; i < topology.num_interfaces; i++) { -+ if (interfaces[i].intf_type != MEDIA_INTF_T_V4L_VIDEO) -+ continue; -+ -+ devnum = makedev(interfaces[i].devnode.major, interfaces[i].devnode.minor); -+ video_device = udev_device_new_from_devnum(udev, 'c', devnum); -+ if (!video_device) { -+ ret = -errno; -+ request_err(dc, "%s: video_device[%d]=%p\n", __func__, i, video_device); -+ continue; -+ } -+ -+ ret = probe_video_device(dc, video_device, scan, path); -+ udev_device_unref(video_device); -+ -+ if (ret != 0) -+ goto fail; -+ } -+ -+fail: -+ free(interfaces); -+ if (media_fd != -1) -+ close(media_fd); -+ return ret; -+} -+ -+const char *decdev_media_path(const struct decdev *const dev) -+{ -+ return !dev ? NULL : dev->mname; -+} -+ -+const char *decdev_video_path(const struct decdev *const dev) -+{ -+ return !dev ? NULL : dev->vname; -+} -+ -+enum v4l2_buf_type decdev_src_type(const struct decdev *const dev) -+{ -+ return !dev ? 0 : dev->src_type; -+} -+ -+uint32_t decdev_src_pixelformat(const struct decdev *const dev) -+{ -+ return !dev ? 0 : dev->src_fmt_v4l2; -+} -+ -+ -+const struct decdev *devscan_find(struct devscan *const scan, -+ const uint32_t src_fmt_v4l2) -+{ -+ unsigned int i; -+ -+ if (scan->env.mname && scan->env.vname) -+ return &scan->env; -+ -+ if (!src_fmt_v4l2) -+ return scan->dev_count ? scan->devs + 0 : NULL; -+ -+ for (i = 0; i != scan->dev_count; ++i) { -+ if (scan->devs[i].src_fmt_v4l2 == src_fmt_v4l2) -+ return scan->devs + i; -+ } -+ return NULL; -+} -+ -+int devscan_build(void * const dc, struct devscan **pscan) -+{ -+ int ret; -+ struct udev *udev; -+ struct udev_enumerate *enumerate; -+ struct udev_list_entry *devices; -+ struct udev_list_entry *entry; -+ struct udev_device *device; -+ struct devscan * scan; -+ -+ *pscan = NULL; -+ -+ scan = calloc(1, sizeof(*scan)); -+ if (!scan) { -+ ret = -ENOMEM; -+ goto fail; -+ } -+ -+ scan->env.mname = getenv("LIBVA_V4L2_REQUEST_MEDIA_PATH"); -+ scan->env.vname = getenv("LIBVA_V4L2_REQUEST_VIDEO_PATH"); -+ if (scan->env.mname && scan->env.vname) { -+ request_info(dc, "Media/video device env overrides found: %s,%s\n", -+ scan->env.mname, scan->env.vname); -+ *pscan = scan; -+ return 0; -+ } -+ -+ udev = udev_new(); -+ if (!udev) { -+ request_err(dc, "%s: allocating udev context failed\n", __func__); -+ ret = -ENOMEM; -+ goto fail; -+ } -+ -+ enumerate = udev_enumerate_new(udev); -+ if (!enumerate) { -+ request_err(dc, "%s: allocating udev enumerator failed\n", __func__); -+ ret = -ENOMEM; -+ goto fail; -+ } -+ -+ udev_enumerate_add_match_subsystem(enumerate, "media"); -+ udev_enumerate_scan_devices(enumerate); -+ -+ devices = udev_enumerate_get_list_entry(enumerate); -+ udev_list_entry_foreach(entry, devices) { -+ const char *path = udev_list_entry_get_name(entry); -+ if (!path) -+ continue; -+ -+ device = udev_device_new_from_syspath(udev, path); -+ if (!device) -+ continue; -+ -+ probe_media_device(dc, device, scan); -+ udev_device_unref(device); -+ } -+ -+ udev_enumerate_unref(enumerate); -+ -+ *pscan = scan; -+ return 0; -+ -+fail: -+ udev_unref(udev); -+ devscan_delete(&scan); -+ return ret; -+} -+ -diff --git a/libavcodec/v4l2_req_devscan.h b/libavcodec/v4l2_req_devscan.h -new file mode 100644 -index 0000000000..956d9234f1 ---- /dev/null -+++ b/libavcodec/v4l2_req_devscan.h -@@ -0,0 +1,23 @@ -+#ifndef _DEVSCAN_H_ -+#define _DEVSCAN_H_ -+ -+#include -+ -+struct devscan; -+struct decdev; -+enum v4l2_buf_type; -+ -+/* These return pointers to data in the devscan structure and so are vaild -+ * for the lifetime of that -+ */ -+const char *decdev_media_path(const struct decdev *const dev); -+const char *decdev_video_path(const struct decdev *const dev); -+enum v4l2_buf_type decdev_src_type(const struct decdev *const dev); -+uint32_t decdev_src_pixelformat(const struct decdev *const dev); -+ -+const struct decdev *devscan_find(struct devscan *const scan, const uint32_t src_fmt_v4l2); -+ -+int devscan_build(void * const dc, struct devscan **pscan); -+void devscan_delete(struct devscan **const pScan); -+ -+#endif -diff --git a/libavcodec/v4l2_req_dmabufs.c b/libavcodec/v4l2_req_dmabufs.c -new file mode 100644 -index 0000000000..ae6c648369 ---- /dev/null -+++ b/libavcodec/v4l2_req_dmabufs.c -@@ -0,0 +1,266 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "v4l2_req_dmabufs.h" -+#include "v4l2_req_utils.h" -+ -+#define DMABUF_NAME1 "/dev/dma_heap/linux,cma" -+#define DMABUF_NAME2 "/dev/dma_heap/reserved" -+ -+#define TRACE_ALLOC 0 -+ -+struct dmabufs_ctl { -+ int fd; -+ size_t page_size; -+}; -+ -+struct dmabuf_h { -+ int fd; -+ size_t size; -+ size_t len; -+ void * mapptr; -+}; -+ -+#if TRACE_ALLOC -+static unsigned int total_bufs = 0; -+static size_t total_size = 0; -+#endif -+ -+struct dmabuf_h * dmabuf_import(int fd, size_t size) -+{ -+ struct dmabuf_h *dh; -+ -+ fd = dup(fd); -+ if (fd < 0 || size == 0) -+ return NULL; -+ -+ dh = malloc(sizeof(*dh)); -+ if (!dh) { -+ close(fd); -+ return NULL; -+ } -+ -+ *dh = (struct dmabuf_h) { -+ .fd = fd, -+ .size = size, -+ .mapptr = MAP_FAILED -+ }; -+ -+#if TRACE_ALLOC -+ ++total_bufs; -+ total_size += dh->size; -+ request_log("%s: Import: %zd, total=%zd, bufs=%d\n", __func__, dh->size, total_size, total_bufs); -+#endif -+ -+ return dh; -+} -+ -+struct dmabuf_h * dmabuf_realloc(struct dmabufs_ctl * dbsc, struct dmabuf_h * old, size_t size) -+{ -+ struct dmabuf_h * dh; -+ struct dma_heap_allocation_data data = { -+ .len = (size + dbsc->page_size - 1) & ~(dbsc->page_size - 1), -+ .fd = 0, -+ .fd_flags = O_RDWR, -+ .heap_flags = 0 -+ }; -+ -+ if (old != NULL) { -+ if (old->size == data.len) { -+ return old; -+ } -+ dmabuf_free(old); -+ } -+ -+ if (size == 0 || -+ (dh = malloc(sizeof(*dh))) == NULL) -+ return NULL; -+ -+ while (ioctl(dbsc->fd, DMA_HEAP_IOCTL_ALLOC, &data)) { -+ int err = errno; -+ request_log("Failed to alloc %" PRIu64 " from dma-heap(fd=%d): %d (%s)\n", -+ (uint64_t)data.len, -+ dbsc->fd, -+ err, -+ strerror(err)); -+ if (err == EINTR) -+ continue; -+ goto fail; -+ } -+ -+ *dh = (struct dmabuf_h){ -+ .fd = data.fd, -+ .size = (size_t)data.len, -+ .mapptr = MAP_FAILED -+ }; -+ -+#if TRACE_ALLOC -+ ++total_bufs; -+ total_size += dh->size; -+ request_log("%s: Alloc: %zd, total=%zd, bufs=%d\n", __func__, dh->size, total_size, total_bufs); -+#endif -+ -+ return dh; -+ -+fail: -+ free(dh); -+ return NULL; -+} -+ -+int dmabuf_sync(struct dmabuf_h * const dh, unsigned int flags) -+{ -+ struct dma_buf_sync sync = { -+ .flags = flags -+ }; -+ while (ioctl(dh->fd, DMA_BUF_IOCTL_SYNC, &sync) == -1) { -+ const int err = errno; -+ if (errno == EINTR) -+ continue; -+ request_log("%s: ioctl failed: flags=%#x\n", __func__, flags); -+ return -err; -+ } -+ return 0; -+} -+ -+int dmabuf_write_start(struct dmabuf_h * const dh) -+{ -+ return dmabuf_sync(dh, DMA_BUF_SYNC_START | DMA_BUF_SYNC_WRITE); -+} -+ -+int dmabuf_write_end(struct dmabuf_h * const dh) -+{ -+ return dmabuf_sync(dh, DMA_BUF_SYNC_END | DMA_BUF_SYNC_WRITE); -+} -+ -+int dmabuf_read_start(struct dmabuf_h * const dh) -+{ -+ if (!dmabuf_map(dh)) -+ return -1; -+ return dmabuf_sync(dh, DMA_BUF_SYNC_START | DMA_BUF_SYNC_READ); -+} -+ -+int dmabuf_read_end(struct dmabuf_h * const dh) -+{ -+ return dmabuf_sync(dh, DMA_BUF_SYNC_END | DMA_BUF_SYNC_READ); -+} -+ -+ -+void * dmabuf_map(struct dmabuf_h * const dh) -+{ -+ if (!dh) -+ return NULL; -+ if (dh->mapptr != MAP_FAILED) -+ return dh->mapptr; -+ dh->mapptr = mmap(NULL, dh->size, -+ PROT_READ | PROT_WRITE, -+ MAP_SHARED | MAP_POPULATE, -+ dh->fd, 0); -+ if (dh->mapptr == MAP_FAILED) { -+ request_log("%s: Map failed\n", __func__); -+ return NULL; -+ } -+ return dh->mapptr; -+} -+ -+int dmabuf_fd(const struct dmabuf_h * const dh) -+{ -+ if (!dh) -+ return -1; -+ return dh->fd; -+} -+ -+size_t dmabuf_size(const struct dmabuf_h * const dh) -+{ -+ if (!dh) -+ return 0; -+ return dh->size; -+} -+ -+size_t dmabuf_len(const struct dmabuf_h * const dh) -+{ -+ if (!dh) -+ return 0; -+ return dh->len; -+} -+ -+void dmabuf_len_set(struct dmabuf_h * const dh, const size_t len) -+{ -+ dh->len = len; -+} -+ -+ -+ -+void dmabuf_free(struct dmabuf_h * dh) -+{ -+ if (!dh) -+ return; -+ -+#if TRACE_ALLOC -+ --total_bufs; -+ total_size -= dh->size; -+ request_log("%s: Free: %zd, total=%zd, bufs=%d\n", __func__, dh->size, total_size, total_bufs); -+#endif -+ -+ if (dh->mapptr != MAP_FAILED) -+ munmap(dh->mapptr, dh->size); -+ while (close(dh->fd) == -1 && errno == EINTR) -+ /* loop */; -+ free(dh); -+} -+ -+struct dmabufs_ctl * dmabufs_ctl_new(void) -+{ -+ struct dmabufs_ctl * dbsc = malloc(sizeof(*dbsc)); -+ -+ if (!dbsc) -+ return NULL; -+ -+ while ((dbsc->fd = open(DMABUF_NAME1, O_RDWR)) == -1 && -+ errno == EINTR) -+ /* Loop */; -+ -+ if (dbsc->fd == -1) { -+ while ((dbsc->fd = open(DMABUF_NAME2, O_RDWR)) == -1 && -+ errno == EINTR) -+ /* Loop */; -+ if (dbsc->fd == -1) { -+ request_log("Unable to open either %s or %s\n", -+ DMABUF_NAME1, DMABUF_NAME2); -+ goto fail; -+ } -+ } -+ -+ dbsc->page_size = (size_t)sysconf(_SC_PAGE_SIZE); -+ -+ return dbsc; -+ -+fail: -+ free(dbsc); -+ return NULL; -+} -+ -+void dmabufs_ctl_delete(struct dmabufs_ctl ** const pDbsc) -+{ -+ struct dmabufs_ctl * const dbsc = *pDbsc; -+ -+ if (!dbsc) -+ return; -+ *pDbsc = NULL; -+ -+ while (close(dbsc->fd) == -1 && errno == EINTR) -+ /* loop */; -+ -+ free(dbsc); -+} -+ -+ -diff --git a/libavcodec/v4l2_req_dmabufs.h b/libavcodec/v4l2_req_dmabufs.h -new file mode 100644 -index 0000000000..cfb17e801d ---- /dev/null -+++ b/libavcodec/v4l2_req_dmabufs.h -@@ -0,0 +1,40 @@ -+#ifndef DMABUFS_H -+#define DMABUFS_H -+ -+#include -+ -+struct dmabufs_ctl; -+struct dmabuf_h; -+ -+struct dmabufs_ctl * dmabufs_ctl_new(void); -+void dmabufs_ctl_delete(struct dmabufs_ctl ** const pdbsc); -+ -+// Need not preserve old contents -+// On NULL return old buffer is freed -+struct dmabuf_h * dmabuf_realloc(struct dmabufs_ctl * dbsc, struct dmabuf_h *, size_t size); -+ -+static inline struct dmabuf_h * dmabuf_alloc(struct dmabufs_ctl * dbsc, size_t size) { -+ return dmabuf_realloc(dbsc, NULL, size); -+} -+/* Create from existing fd - dups(fd) */ -+struct dmabuf_h * dmabuf_import(int fd, size_t size); -+void * dmabuf_map(struct dmabuf_h * const dh); -+ -+/* flags from linux/dmabuf.h DMA_BUF_SYNC_xxx */ -+int dmabuf_sync(struct dmabuf_h * const dh, unsigned int flags); -+ -+int dmabuf_write_start(struct dmabuf_h * const dh); -+int dmabuf_write_end(struct dmabuf_h * const dh); -+int dmabuf_read_start(struct dmabuf_h * const dh); -+int dmabuf_read_end(struct dmabuf_h * const dh); -+ -+int dmabuf_fd(const struct dmabuf_h * const dh); -+/* Allocated size */ -+size_t dmabuf_size(const struct dmabuf_h * const dh); -+/* Bytes in use */ -+size_t dmabuf_len(const struct dmabuf_h * const dh); -+/* Set bytes in use */ -+void dmabuf_len_set(struct dmabuf_h * const dh, const size_t len); -+void dmabuf_free(struct dmabuf_h * dh); -+ -+#endif -diff --git a/libavcodec/v4l2_req_hevc_v1.c b/libavcodec/v4l2_req_hevc_v1.c -new file mode 100644 -index 0000000000..169b532832 ---- /dev/null -+++ b/libavcodec/v4l2_req_hevc_v1.c -@@ -0,0 +1,3 @@ -+#define HEVC_CTRLS_VERSION 1 -+#include "v4l2_req_hevc_vx.c" -+ -diff --git a/libavcodec/v4l2_req_hevc_v2.c b/libavcodec/v4l2_req_hevc_v2.c -new file mode 100644 -index 0000000000..42af98e156 ---- /dev/null -+++ b/libavcodec/v4l2_req_hevc_v2.c -@@ -0,0 +1,3 @@ -+#define HEVC_CTRLS_VERSION 2 -+#include "v4l2_req_hevc_vx.c" -+ -diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c -new file mode 100644 -index 0000000000..0ae03b10c4 ---- /dev/null -+++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -0,0 +1,1213 @@ -+// File included by v4l2_req_hevc_v* - not compiled on its own -+ -+#include "decode.h" -+#include "hevcdec.h" -+#include "hwconfig.h" -+#include "internal.h" -+#include "thread.h" -+ -+#include "v4l2_request_hevc.h" -+ -+#if HEVC_CTRLS_VERSION == 1 -+#include "hevc-ctrls-v1.h" -+ -+// Fixup renamed entries -+#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT -+ -+#elif HEVC_CTRLS_VERSION == 2 -+#include "hevc-ctrls-v2.h" -+#else -+#error Unknown HEVC_CTRLS_VERSION -+#endif -+ -+#include "libavutil/hwcontext_drm.h" -+ -+#include -+#include -+ -+#include "v4l2_req_devscan.h" -+#include "v4l2_req_dmabufs.h" -+#include "v4l2_req_pollqueue.h" -+#include "v4l2_req_media.h" -+#include "v4l2_req_utils.h" -+ -+// Attached to buf[0] in frame -+// Pooled in hwcontext so generally create once - 1/frame -+typedef struct V4L2MediaReqDescriptor { -+ AVDRMFrameDescriptor drm; -+ -+ // Media -+ uint64_t timestamp; -+ struct qent_dst * qe_dst; -+ -+ // Decode only - should be NULL by the time we emit the frame -+ struct req_decode_ent decode_ent; -+ -+ struct media_request *req; -+ struct qent_src *qe_src; -+ -+#if HEVC_CTRLS_VERSION >= 2 -+ struct v4l2_ctrl_hevc_decode_params dec; -+#endif -+ -+ size_t num_slices; -+ size_t alloced_slices; -+ struct v4l2_ctrl_hevc_slice_params * slice_params; -+ struct slice_info * slices; -+ -+} V4L2MediaReqDescriptor; -+ -+struct slice_info { -+ const uint8_t * ptr; -+ size_t len; // bytes -+}; -+ -+// Handy container for accumulating controls before setting -+struct req_controls { -+ int has_scaling; -+ struct timeval tv; -+ struct v4l2_ctrl_hevc_sps sps; -+ struct v4l2_ctrl_hevc_pps pps; -+ struct v4l2_ctrl_hevc_scaling_matrix scaling_matrix; -+}; -+ -+//static uint8_t nalu_slice_start_code[] = { 0x00, 0x00, 0x01 }; -+ -+ -+// Get an FFmpeg format from the v4l2 format -+static enum AVPixelFormat pixel_format_from_format(const struct v4l2_format *const format) -+{ -+ switch (V4L2_TYPE_IS_MULTIPLANAR(format->type) ? -+ format->fmt.pix_mp.pixelformat : format->fmt.pix.pixelformat) { -+ case V4L2_PIX_FMT_YUV420: -+ return AV_PIX_FMT_YUV420P; -+ case V4L2_PIX_FMT_NV12: -+ return AV_PIX_FMT_NV12; -+#if CONFIG_SAND -+ case V4L2_PIX_FMT_NV12_COL128: -+ return AV_PIX_FMT_RPI4_8; -+ case V4L2_PIX_FMT_NV12_10_COL128: -+ return AV_PIX_FMT_RPI4_10; -+#endif -+ default: -+ break; -+ } -+ return AV_PIX_FMT_NONE; -+} -+ -+static inline uint64_t frame_capture_dpb(const AVFrame * const frame) -+{ -+ const V4L2MediaReqDescriptor *const rd = (V4L2MediaReqDescriptor *)frame->data[0]; -+ return rd->timestamp; -+} -+ -+static inline void frame_set_capture_dpb(AVFrame * const frame, const uint64_t dpb_stamp) -+{ -+ V4L2MediaReqDescriptor *const rd = (V4L2MediaReqDescriptor *)frame->data[0]; -+ rd->timestamp = dpb_stamp; -+} -+ -+static void fill_pred_table(const HEVCContext *h, struct v4l2_hevc_pred_weight_table *table) -+{ -+ int32_t luma_weight_denom, chroma_weight_denom; -+ const SliceHeader *sh = &h->sh; -+ -+ if (sh->slice_type == HEVC_SLICE_I || -+ (sh->slice_type == HEVC_SLICE_P && !h->ps.pps->weighted_pred_flag) || -+ (sh->slice_type == HEVC_SLICE_B && !h->ps.pps->weighted_bipred_flag)) -+ return; -+ -+ table->luma_log2_weight_denom = sh->luma_log2_weight_denom; -+ -+ if (h->ps.sps->chroma_format_idc) -+ table->delta_chroma_log2_weight_denom = sh->chroma_log2_weight_denom - sh->luma_log2_weight_denom; -+ -+ luma_weight_denom = (1 << sh->luma_log2_weight_denom); -+ chroma_weight_denom = (1 << sh->chroma_log2_weight_denom); -+ -+ for (int i = 0; i < 15 && i < sh->nb_refs[L0]; i++) { -+ table->delta_luma_weight_l0[i] = sh->luma_weight_l0[i] - luma_weight_denom; -+ table->luma_offset_l0[i] = sh->luma_offset_l0[i]; -+ table->delta_chroma_weight_l0[i][0] = sh->chroma_weight_l0[i][0] - chroma_weight_denom; -+ table->delta_chroma_weight_l0[i][1] = sh->chroma_weight_l0[i][1] - chroma_weight_denom; -+ table->chroma_offset_l0[i][0] = sh->chroma_offset_l0[i][0]; -+ table->chroma_offset_l0[i][1] = sh->chroma_offset_l0[i][1]; -+ } -+ -+ if (sh->slice_type != HEVC_SLICE_B) -+ return; -+ -+ for (int i = 0; i < 15 && i < sh->nb_refs[L1]; i++) { -+ table->delta_luma_weight_l1[i] = sh->luma_weight_l1[i] - luma_weight_denom; -+ table->luma_offset_l1[i] = sh->luma_offset_l1[i]; -+ table->delta_chroma_weight_l1[i][0] = sh->chroma_weight_l1[i][0] - chroma_weight_denom; -+ table->delta_chroma_weight_l1[i][1] = sh->chroma_weight_l1[i][1] - chroma_weight_denom; -+ table->chroma_offset_l1[i][0] = sh->chroma_offset_l1[i][0]; -+ table->chroma_offset_l1[i][1] = sh->chroma_offset_l1[i][1]; -+ } -+} -+ -+static int find_frame_rps_type(const HEVCContext *h, uint64_t timestamp) -+{ -+ const HEVCFrame *frame; -+ int i; -+ -+ for (i = 0; i < h->rps[ST_CURR_BEF].nb_refs; i++) { -+ frame = h->rps[ST_CURR_BEF].ref[i]; -+ if (frame && timestamp == frame_capture_dpb(frame->frame)) -+ return V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE; -+ } -+ -+ for (i = 0; i < h->rps[ST_CURR_AFT].nb_refs; i++) { -+ frame = h->rps[ST_CURR_AFT].ref[i]; -+ if (frame && timestamp == frame_capture_dpb(frame->frame)) -+ return V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_AFTER; -+ } -+ -+ for (i = 0; i < h->rps[LT_CURR].nb_refs; i++) { -+ frame = h->rps[LT_CURR].ref[i]; -+ if (frame && timestamp == frame_capture_dpb(frame->frame)) -+ return V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR; -+ } -+ -+ return 0; -+} -+ -+static unsigned int -+get_ref_pic_index(const HEVCContext *h, const HEVCFrame *frame, -+ const struct v4l2_hevc_dpb_entry * const entries, -+ const unsigned int num_entries) -+{ -+ uint64_t timestamp; -+ -+ if (!frame) -+ return 0; -+ -+ timestamp = frame_capture_dpb(frame->frame); -+ -+ for (unsigned int i = 0; i < num_entries; i++) { -+ if (entries[i].timestamp == timestamp) -+ return i; -+ } -+ -+ return 0; -+} -+ -+static const uint8_t * ptr_from_index(const uint8_t * b, unsigned int idx) -+{ -+ unsigned int z = 0; -+ while (idx--) { -+ if (*b++ == 0) { -+ ++z; -+ if (z >= 2 && *b == 3) { -+ ++b; -+ z = 0; -+ } -+ } -+ else { -+ z = 0; -+ } -+ } -+ return b; -+} -+ -+static int slice_add(V4L2MediaReqDescriptor * const rd) -+{ -+ if (rd->num_slices >= rd->alloced_slices) { -+ struct v4l2_ctrl_hevc_slice_params * p2; -+ struct slice_info * s2; -+ size_t n2 = rd->num_slices == 0 ? 8 : rd->num_slices * 2; -+ -+ p2 = av_realloc_array(rd->slice_params, n2, sizeof(*p2)); -+ if (p2 == NULL) -+ return AVERROR(ENOMEM); -+ rd->slice_params = p2; -+ -+ s2 = av_realloc_array(rd->slices, n2, sizeof(*s2)); -+ if (s2 == NULL) -+ return AVERROR(ENOMEM); -+ rd->slices = s2; -+ -+ rd->alloced_slices = n2; -+ } -+ ++rd->num_slices; -+ return 0; -+} -+ -+static unsigned int -+fill_dpb_entries(const HEVCContext * const h, struct v4l2_hevc_dpb_entry * const entries) -+{ -+ unsigned int i; -+ unsigned int n = 0; -+ const HEVCFrame * const pic = h->ref; -+ -+ for (i = 0; i < FF_ARRAY_ELEMS(h->DPB); i++) { -+ const HEVCFrame * const frame = &h->DPB[i]; -+ if (frame != pic && (frame->flags & (HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF))) { -+ struct v4l2_hevc_dpb_entry * const entry = entries + n++; -+ -+ entry->timestamp = frame_capture_dpb(frame->frame); -+ entry->rps = find_frame_rps_type(h, entry->timestamp); -+ entry->field_pic = frame->frame->interlaced_frame; -+ -+ /* TODO: Interleaved: Get the POC for each field. */ -+ entry->pic_order_cnt[0] = frame->poc; -+ entry->pic_order_cnt[1] = frame->poc; -+ } -+ } -+ return n; -+} -+ -+static void fill_slice_params(const HEVCContext * const h, -+#if HEVC_CTRLS_VERSION >= 2 -+ const struct v4l2_ctrl_hevc_decode_params * const dec, -+#endif -+ struct v4l2_ctrl_hevc_slice_params *slice_params, -+ uint32_t bit_size, uint32_t bit_offset) -+{ -+ const SliceHeader * const sh = &h->sh; -+#if HEVC_CTRLS_VERSION >= 2 -+ const struct v4l2_hevc_dpb_entry *const dpb = dec->dpb; -+ const unsigned int dpb_n = dec->num_active_dpb_entries; -+#else -+ struct v4l2_hevc_dpb_entry *const dpb = slice_params->dpb; -+ unsigned int dpb_n; -+#endif -+ unsigned int i; -+ RefPicList *rpl; -+ -+ *slice_params = (struct v4l2_ctrl_hevc_slice_params) { -+ .bit_size = bit_size, -+ .data_bit_offset = bit_offset, -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ .slice_segment_addr = sh->slice_segment_addr, -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ -+ .nal_unit_type = h->nal_unit_type, -+ .nuh_temporal_id_plus1 = h->temporal_id + 1, -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ .slice_type = sh->slice_type, -+ .colour_plane_id = sh->colour_plane_id, -+ .slice_pic_order_cnt = h->ref->poc, -+ .num_ref_idx_l0_active_minus1 = sh->nb_refs[L0] ? sh->nb_refs[L0] - 1 : 0, -+ .num_ref_idx_l1_active_minus1 = sh->nb_refs[L1] ? sh->nb_refs[L1] - 1 : 0, -+ .collocated_ref_idx = sh->slice_temporal_mvp_enabled_flag ? sh->collocated_ref_idx : 0, -+ .five_minus_max_num_merge_cand = sh->slice_type == HEVC_SLICE_I ? 0 : 5 - sh->max_num_merge_cand, -+ .slice_qp_delta = sh->slice_qp_delta, -+ .slice_cb_qp_offset = sh->slice_cb_qp_offset, -+ .slice_cr_qp_offset = sh->slice_cr_qp_offset, -+ .slice_act_y_qp_offset = 0, -+ .slice_act_cb_qp_offset = 0, -+ .slice_act_cr_qp_offset = 0, -+ .slice_beta_offset_div2 = sh->beta_offset / 2, -+ .slice_tc_offset_div2 = sh->tc_offset / 2, -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ -+ .pic_struct = h->sei.picture_timing.picture_struct, -+ -+#if HEVC_CTRLS_VERSION < 2 -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ .num_rps_poc_st_curr_before = h->rps[ST_CURR_BEF].nb_refs, -+ .num_rps_poc_st_curr_after = h->rps[ST_CURR_AFT].nb_refs, -+ .num_rps_poc_lt_curr = h->rps[LT_CURR].nb_refs, -+#endif -+ }; -+ -+ if (sh->slice_sample_adaptive_offset_flag[0]) -+ slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA; -+ -+ if (sh->slice_sample_adaptive_offset_flag[1]) -+ slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA; -+ -+ if (sh->slice_temporal_mvp_enabled_flag) -+ slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED; -+ -+ if (sh->mvd_l1_zero_flag) -+ slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO; -+ -+ if (sh->cabac_init_flag) -+ slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT; -+ -+ if (sh->collocated_list == L0) -+ slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0; -+ -+ if (sh->disable_deblocking_filter_flag) -+ slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED; -+ -+ if (sh->slice_loop_filter_across_slices_enabled_flag) -+ slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED; -+ -+ if (sh->dependent_slice_segment_flag) -+ slice_params->flags |= V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT; -+ -+#if HEVC_CTRLS_VERSION < 2 -+ dpb_n = fill_dpb_entries(h, dpb); -+ slice_params->num_active_dpb_entries = dpb_n; -+#endif -+ -+ if (sh->slice_type != HEVC_SLICE_I) { -+ rpl = &h->ref->refPicList[0]; -+ for (i = 0; i < rpl->nb_refs; i++) -+ slice_params->ref_idx_l0[i] = get_ref_pic_index(h, rpl->ref[i], dpb, dpb_n); -+ } -+ -+ if (sh->slice_type == HEVC_SLICE_B) { -+ rpl = &h->ref->refPicList[1]; -+ for (i = 0; i < rpl->nb_refs; i++) -+ slice_params->ref_idx_l1[i] = get_ref_pic_index(h, rpl->ref[i], dpb, dpb_n); -+ } -+ -+ fill_pred_table(h, &slice_params->pred_weight_table); -+ -+ slice_params->num_entry_point_offsets = sh->num_entry_point_offsets; -+ if (slice_params->num_entry_point_offsets > 256) { -+ slice_params->num_entry_point_offsets = 256; -+ av_log(NULL, AV_LOG_ERROR, "%s: Currently only 256 entry points are supported, but slice has %d entry points.\n", __func__, sh->num_entry_point_offsets); -+ } -+ -+ for (i = 0; i < slice_params->num_entry_point_offsets; i++) -+ slice_params->entry_point_offset_minus1[i] = sh->entry_point_offset[i] - 1; -+} -+ -+#if HEVC_CTRLS_VERSION >= 2 -+static void -+fill_decode_params(const HEVCContext * const h, -+ struct v4l2_ctrl_hevc_decode_params * const dec) -+{ -+ unsigned int i; -+ -+ *dec = (struct v4l2_ctrl_hevc_decode_params){ -+ .pic_order_cnt_val = h->poc, -+ .num_poc_st_curr_before = h->rps[ST_CURR_BEF].nb_refs, -+ .num_poc_st_curr_after = h->rps[ST_CURR_AFT].nb_refs, -+ .num_poc_lt_curr = h->rps[LT_CURR].nb_refs, -+ }; -+ -+ dec->num_active_dpb_entries = fill_dpb_entries(h, dec->dpb); -+ -+ // The docn does seem to ask that we fit our 32 bit signed POC into -+ // a U8 so... (To be fair 16 bits would be enough) -+ // Luckily we (Pi) don't use these fields -+ for (i = 0; i != h->rps[ST_CURR_BEF].nb_refs; ++i) -+ dec->poc_st_curr_before[i] = h->rps[ST_CURR_BEF].ref[i]->poc; -+ for (i = 0; i != h->rps[ST_CURR_AFT].nb_refs; ++i) -+ dec->poc_st_curr_after[i] = h->rps[ST_CURR_AFT].ref[i]->poc; -+ for (i = 0; i != h->rps[LT_CURR].nb_refs; ++i) -+ dec->poc_lt_curr[i] = h->rps[LT_CURR].ref[i]->poc; -+ -+ if (IS_IRAP(h)) -+ dec->flags |= V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC; -+ if (IS_IDR(h)) -+ dec->flags |= V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC; -+ if (h->sh.no_output_of_prior_pics_flag) -+ dec->flags |= V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR; -+ -+} -+#endif -+ -+static void fill_sps(struct v4l2_ctrl_hevc_sps *ctrl, const HEVCSPS *sps) -+{ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */ -+ *ctrl = (struct v4l2_ctrl_hevc_sps) { -+ .chroma_format_idc = sps->chroma_format_idc, -+ .pic_width_in_luma_samples = sps->width, -+ .pic_height_in_luma_samples = sps->height, -+ .bit_depth_luma_minus8 = sps->bit_depth - 8, -+ .bit_depth_chroma_minus8 = sps->bit_depth - 8, -+ .log2_max_pic_order_cnt_lsb_minus4 = sps->log2_max_poc_lsb - 4, -+ .sps_max_dec_pic_buffering_minus1 = sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering - 1, -+ .sps_max_num_reorder_pics = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics, -+ .sps_max_latency_increase_plus1 = sps->temporal_layer[sps->max_sub_layers - 1].max_latency_increase + 1, -+ .log2_min_luma_coding_block_size_minus3 = sps->log2_min_cb_size - 3, -+ .log2_diff_max_min_luma_coding_block_size = sps->log2_diff_max_min_coding_block_size, -+ .log2_min_luma_transform_block_size_minus2 = sps->log2_min_tb_size - 2, -+ .log2_diff_max_min_luma_transform_block_size = sps->log2_max_trafo_size - sps->log2_min_tb_size, -+ .max_transform_hierarchy_depth_inter = sps->max_transform_hierarchy_depth_inter, -+ .max_transform_hierarchy_depth_intra = sps->max_transform_hierarchy_depth_intra, -+ .pcm_sample_bit_depth_luma_minus1 = sps->pcm.bit_depth - 1, -+ .pcm_sample_bit_depth_chroma_minus1 = sps->pcm.bit_depth_chroma - 1, -+ .log2_min_pcm_luma_coding_block_size_minus3 = sps->pcm.log2_min_pcm_cb_size - 3, -+ .log2_diff_max_min_pcm_luma_coding_block_size = sps->pcm.log2_max_pcm_cb_size - sps->pcm.log2_min_pcm_cb_size, -+ .num_short_term_ref_pic_sets = sps->nb_st_rps, -+ .num_long_term_ref_pics_sps = sps->num_long_term_ref_pics_sps, -+ .chroma_format_idc = sps->chroma_format_idc, -+ .sps_max_sub_layers_minus1 = sps->max_sub_layers - 1, -+ }; -+ -+ if (sps->separate_colour_plane_flag) -+ ctrl->flags |= V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE; -+ -+ if (sps->scaling_list_enable_flag) -+ ctrl->flags |= V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED; -+ -+ if (sps->amp_enabled_flag) -+ ctrl->flags |= V4L2_HEVC_SPS_FLAG_AMP_ENABLED; -+ -+ if (sps->sao_enabled) -+ ctrl->flags |= V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET; -+ -+ if (sps->pcm_enabled_flag) -+ ctrl->flags |= V4L2_HEVC_SPS_FLAG_PCM_ENABLED; -+ -+ if (sps->pcm.loop_filter_disable_flag) -+ ctrl->flags |= V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED; -+ -+ if (sps->long_term_ref_pics_present_flag) -+ ctrl->flags |= V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT; -+ -+ if (sps->sps_temporal_mvp_enabled_flag) -+ ctrl->flags |= V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED; -+ -+ if (sps->sps_strong_intra_smoothing_enable_flag) -+ ctrl->flags |= V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED; -+} -+ -+static void fill_scaling_matrix(const ScalingList * const sl, -+ struct v4l2_ctrl_hevc_scaling_matrix * const sm) -+{ -+ unsigned int i; -+ -+ for (i = 0; i < 6; i++) { -+ unsigned int j; -+ -+ for (j = 0; j < 16; j++) -+ sm->scaling_list_4x4[i][j] = sl->sl[0][i][j]; -+ for (j = 0; j < 64; j++) { -+ sm->scaling_list_8x8[i][j] = sl->sl[1][i][j]; -+ sm->scaling_list_16x16[i][j] = sl->sl[2][i][j]; -+ if (i < 2) -+ sm->scaling_list_32x32[i][j] = sl->sl[3][i * 3][j]; -+ } -+ sm->scaling_list_dc_coef_16x16[i] = sl->sl_dc[0][i]; -+ if (i < 2) -+ sm->scaling_list_dc_coef_32x32[i] = sl->sl_dc[1][i * 3]; -+ } -+} -+ -+static void fill_pps(struct v4l2_ctrl_hevc_pps * const ctrl, const HEVCPPS * const pps) -+{ -+ uint64_t flags = 0; -+ -+ if (pps->dependent_slice_segments_enabled_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED; -+ -+ if (pps->output_flag_present_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT; -+ -+ if (pps->sign_data_hiding_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED; -+ -+ if (pps->cabac_init_present_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT; -+ -+ if (pps->constrained_intra_pred_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED; -+ -+ if (pps->transform_skip_enabled_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED; -+ -+ if (pps->cu_qp_delta_enabled_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED; -+ -+ if (pps->pic_slice_level_chroma_qp_offsets_present_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT; -+ -+ if (pps->weighted_pred_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED; -+ -+ if (pps->weighted_bipred_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED; -+ -+ if (pps->transquant_bypass_enable_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED; -+ -+ if (pps->tiles_enabled_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_TILES_ENABLED; -+ -+ if (pps->entropy_coding_sync_enabled_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED; -+ -+ if (pps->loop_filter_across_tiles_enabled_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED; -+ -+ if (pps->seq_loop_filter_across_slices_enabled_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED; -+ -+ if (pps->deblocking_filter_override_enabled_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED; -+ -+ if (pps->disable_dbf) -+ flags |= V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER; -+ -+ if (pps->lists_modification_present_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT; -+ -+ if (pps->slice_header_extension_present_flag) -+ flags |= V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ -+ *ctrl = (struct v4l2_ctrl_hevc_pps) { -+ .num_extra_slice_header_bits = pps->num_extra_slice_header_bits, -+ .init_qp_minus26 = pps->pic_init_qp_minus26, -+ .diff_cu_qp_delta_depth = pps->diff_cu_qp_delta_depth, -+ .pps_cb_qp_offset = pps->cb_qp_offset, -+ .pps_cr_qp_offset = pps->cr_qp_offset, -+ .pps_beta_offset_div2 = pps->beta_offset / 2, -+ .pps_tc_offset_div2 = pps->tc_offset / 2, -+ .log2_parallel_merge_level_minus2 = pps->log2_parallel_merge_level - 2, -+ .flags = flags -+ }; -+ -+ -+ if (pps->tiles_enabled_flag) { -+ ctrl->num_tile_columns_minus1 = pps->num_tile_columns - 1; -+ ctrl->num_tile_rows_minus1 = pps->num_tile_rows - 1; -+ -+ for (int i = 0; i < pps->num_tile_columns; i++) -+ ctrl->column_width_minus1[i] = pps->column_width[i] - 1; -+ -+ for (int i = 0; i < pps->num_tile_rows; i++) -+ ctrl->row_height_minus1[i] = pps->row_height[i] - 1; -+ } -+} -+ -+// Called before finally returning the frame to the user -+// Set corrupt flag here as this is actually the frame structure that -+// is going to the user (in MT land each thread has its own pool) -+static int frame_post_process(void *logctx, AVFrame *frame) -+{ -+ V4L2MediaReqDescriptor *rd = (V4L2MediaReqDescriptor*)frame->data[0]; -+ -+// av_log(NULL, AV_LOG_INFO, "%s\n", __func__); -+ frame->flags &= ~AV_FRAME_FLAG_CORRUPT; -+ if (rd->qe_dst) { -+ MediaBufsStatus stat = qent_dst_wait(rd->qe_dst); -+ if (stat != MEDIABUFS_STATUS_SUCCESS) { -+ av_log(logctx, AV_LOG_ERROR, "%s: Decode fail\n", __func__); -+ frame->flags |= AV_FRAME_FLAG_CORRUPT; -+ } -+ } -+ -+ return 0; -+} -+ -+static inline struct timeval cvt_dpb_to_tv(uint64_t t) -+{ -+ t /= 1000; -+ return (struct timeval){ -+ .tv_usec = t % 1000000, -+ .tv_sec = t / 1000000 -+ }; -+} -+ -+static inline uint64_t cvt_timestamp_to_dpb(const unsigned int t) -+{ -+ return (uint64_t)t * 1000; -+} -+ -+static int v4l2_request_hevc_start_frame(AVCodecContext *avctx, -+ av_unused const uint8_t *buffer, -+ av_unused uint32_t size) -+{ -+ const HEVCContext *h = avctx->priv_data; -+ V4L2MediaReqDescriptor *const rd = (V4L2MediaReqDescriptor *)h->ref->frame->data[0]; -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ -+// av_log(NULL, AV_LOG_INFO, "%s\n", __func__); -+ decode_q_add(&ctx->decode_q, &rd->decode_ent); -+ -+ rd->num_slices = 0; -+ ctx->timestamp++; -+ rd->timestamp = cvt_timestamp_to_dpb(ctx->timestamp); -+ -+ { -+ FrameDecodeData * const fdd = (FrameDecodeData*)h->ref->frame->private_ref->data; -+ fdd->post_process = frame_post_process; -+ } -+ -+ // qe_dst needs to be bound to the data buffer and only returned when that is -+ if (!rd->qe_dst) -+ { -+ if ((rd->qe_dst = mediabufs_dst_qent_alloc(ctx->mbufs, ctx->dbufs)) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "%s: Failed to get dst buffer\n", __func__); -+ return AVERROR(ENOMEM); -+ } -+ } -+ -+ ff_thread_finish_setup(avctx); // Allow next thread to enter rpi_hevc_start_frame -+ -+ return 0; -+} -+ -+// Object fd & size will be zapped by this & need setting later -+static int drm_from_format(AVDRMFrameDescriptor * const desc, const struct v4l2_format * const format) -+{ -+ AVDRMLayerDescriptor *layer = &desc->layers[0]; -+ unsigned int width; -+ unsigned int height; -+ unsigned int bpl; -+ uint32_t pixelformat; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(format->type)) { -+ width = format->fmt.pix_mp.width; -+ height = format->fmt.pix_mp.height; -+ pixelformat = format->fmt.pix_mp.pixelformat; -+ bpl = format->fmt.pix_mp.plane_fmt[0].bytesperline; -+ } -+ else { -+ width = format->fmt.pix.width; -+ height = format->fmt.pix.height; -+ pixelformat = format->fmt.pix.pixelformat; -+ bpl = format->fmt.pix.bytesperline; -+ } -+ -+ switch (pixelformat) { -+ case V4L2_PIX_FMT_NV12: -+ layer->format = DRM_FORMAT_NV12; -+ desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ break; -+#if CONFIG_SAND -+ case V4L2_PIX_FMT_NV12_COL128: -+ layer->format = DRM_FORMAT_NV12; -+ desc->objects[0].format_modifier = DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(bpl); -+ break; -+ case V4L2_PIX_FMT_NV12_10_COL128: -+ layer->format = DRM_FORMAT_P030; -+ desc->objects[0].format_modifier = DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(bpl); -+ break; -+#endif -+#ifdef DRM_FORMAT_MOD_ALLWINNER_TILED -+ case V4L2_PIX_FMT_SUNXI_TILED_NV12: -+ layer->format = DRM_FORMAT_NV12; -+ desc->objects[0].format_modifier = DRM_FORMAT_MOD_ALLWINNER_TILED; -+ break; -+#endif -+#if defined(V4L2_PIX_FMT_NV15) && defined(DRM_FORMAT_NV15) -+ case V4L2_PIX_FMT_NV15: -+ layer->format = DRM_FORMAT_NV15; -+ desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ break; -+#endif -+ case V4L2_PIX_FMT_NV16: -+ layer->format = DRM_FORMAT_NV16; -+ desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ break; -+#if defined(V4L2_PIX_FMT_NV20) && defined(DRM_FORMAT_NV20) -+ case V4L2_PIX_FMT_NV20: -+ layer->format = DRM_FORMAT_NV20; -+ desc->objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ break; -+#endif -+ default: -+ return -1; -+ } -+ -+ desc->nb_objects = 1; -+ desc->objects[0].fd = -1; -+ desc->objects[0].size = 0; -+ -+ desc->nb_layers = 1; -+ layer->nb_planes = 2; -+ -+ layer->planes[0].object_index = 0; -+ layer->planes[0].offset = 0; -+ layer->planes[0].pitch = bpl; -+#if CONFIG_SAND -+ if (pixelformat == V4L2_PIX_FMT_NV12_COL128) { -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = height * 128; -+ layer->planes[0].pitch = width; -+ layer->planes[1].pitch = width; -+ } -+ else if (pixelformat == V4L2_PIX_FMT_NV12_10_COL128) { -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = height * 128; -+ layer->planes[0].pitch = width * 2; // Lies but it keeps DRM import happy -+ layer->planes[1].pitch = width * 2; -+ } -+ else -+#endif -+ { -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = layer->planes[0].pitch * height; -+ layer->planes[1].pitch = layer->planes[0].pitch; -+ } -+ -+ return 0; -+} -+ -+static int -+set_req_ctls(V4L2RequestContextHEVC *ctx, struct media_request * const mreq, -+ struct req_controls *const controls, -+#if HEVC_CTRLS_VERSION >= 2 -+ struct v4l2_ctrl_hevc_decode_params * const dec, -+#endif -+ struct v4l2_ctrl_hevc_slice_params * const slices, -+ const unsigned int slice_no, -+ const unsigned int slice_count) -+{ -+ int rv; -+ -+ struct v4l2_ext_control control[] = { -+ { -+ .id = V4L2_CID_MPEG_VIDEO_HEVC_SPS, -+ .ptr = &controls->sps, -+ .size = sizeof(controls->sps), -+ }, -+ { -+ .id = V4L2_CID_MPEG_VIDEO_HEVC_PPS, -+ .ptr = &controls->pps, -+ .size = sizeof(controls->pps), -+ }, -+#if HEVC_CTRLS_VERSION >= 2 -+ { -+ .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS, -+ .ptr = dec, -+ .size = sizeof(*dec), -+ }, -+#endif -+ { -+ .id = V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS, -+ .ptr = slices + slice_no, -+ .size = sizeof(*slices) * slice_count, -+ }, -+ // Optional -+ { -+ .id = V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX, -+ .ptr = &controls->scaling_matrix, -+ .size = sizeof(controls->scaling_matrix), -+ }, -+ }; -+ -+ rv = mediabufs_ctl_set_ext_ctrls(ctx->mbufs, mreq, control, -+ controls->has_scaling ? -+ FF_ARRAY_ELEMS(control) : -+ FF_ARRAY_ELEMS(control) - 1); -+ -+ return rv; -+} -+ -+static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) -+{ -+ const HEVCContext * const h = avctx->priv_data; -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ V4L2MediaReqDescriptor * const rd = (V4L2MediaReqDescriptor*)h->ref->frame->data[0]; -+ int bcount = get_bits_count(&h->HEVClc->gb); -+ uint32_t boff = (ptr_from_index(buffer, bcount/8 + 1) - (buffer + bcount/8 + 1)) * 8 + bcount; -+ -+ int rv; -+ struct slice_info * si; -+ -+ if ((rv = slice_add(rd)) != 0) -+ return rv; -+ -+ si = rd->slices + rd->num_slices - 1; -+ si->ptr = buffer; -+ si->len = size; -+ -+ if (ctx->multi_slice && rd->num_slices > 1) { -+ struct slice_info *const si0 = rd->slices; -+ const size_t offset = (buffer - si0->ptr); -+ boff += offset * 8; -+ size += offset; -+ si0->len = si->len + offset; -+ } -+ -+#if HEVC_CTRLS_VERSION >= 2 -+ if (rd->num_slices == 1) -+ fill_decode_params(h, &rd->dec); -+ fill_slice_params(h, &rd->dec, rd->slice_params + rd->num_slices - 1, size * 8, boff); -+#else -+ fill_slice_params(h, rd->slice_params + rd->num_slices - 1, size * 8, boff); -+#endif -+ -+ return 0; -+} -+ -+static void v4l2_request_hevc_abort_frame(AVCodecContext * const avctx) -+{ -+ const HEVCContext * const h = avctx->priv_data; -+ if (h->ref != NULL) { -+ V4L2MediaReqDescriptor *const rd = (V4L2MediaReqDescriptor *)h->ref->frame->data[0]; -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ -+ media_request_abort(&rd->req); -+ mediabufs_src_qent_abort(ctx->mbufs, &rd->qe_src); -+ -+ decode_q_remove(&ctx->decode_q, &rd->decode_ent); -+ } -+} -+ -+static int send_slice(AVCodecContext * const avctx, -+ V4L2MediaReqDescriptor * const rd, -+ struct req_controls *const controls, -+ const unsigned int i, const unsigned int j) -+{ -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ -+ struct slice_info *const si = rd->slices + i; -+ struct media_request * req = NULL; -+ struct qent_src * src = NULL; -+ MediaBufsStatus stat; -+ -+ if ((req = media_request_get(ctx->mpool)) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "%s: Failed to alloc media request\n", __func__); -+ return AVERROR(ENOMEM); -+ } -+ -+ if (set_req_ctls(ctx, req, -+ controls, -+#if HEVC_CTRLS_VERSION >= 2 -+ &rd->dec, -+#endif -+ rd->slice_params, -+ i, j - i)) { -+ av_log(avctx, AV_LOG_ERROR, "%s: Failed to set req ctls\n", __func__); -+ goto fail1; -+ } -+ -+ if ((src = mediabufs_src_qent_get(ctx->mbufs)) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "%s: Failed to get src buffer\n", __func__); -+ goto fail1; -+ } -+ -+ if (qent_src_data_copy(src, 0, si->ptr, si->len, ctx->dbufs) != 0) { -+ av_log(avctx, AV_LOG_ERROR, "%s: Failed data copy\n", __func__); -+ goto fail2; -+ } -+ -+ if (qent_src_params_set(src, &controls->tv)) { -+ av_log(avctx, AV_LOG_ERROR, "%s: Failed src param set\n", __func__); -+ goto fail2; -+ } -+ -+#warning ANNEX_B start code -+// if (ctx->start_code == V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B) { -+// } -+ -+ stat = mediabufs_start_request(ctx->mbufs, &req, &src, -+ i == 0 ? rd->qe_dst : NULL, -+ j == rd->num_slices); -+ -+ if (stat != MEDIABUFS_STATUS_SUCCESS) { -+ av_log(avctx, AV_LOG_ERROR, "%s: Failed to start request\n", __func__); -+ return AVERROR_UNKNOWN; -+ } -+ return 0; -+ -+fail2: -+ mediabufs_src_qent_abort(ctx->mbufs, &src); -+fail1: -+ media_request_abort(&req); -+ return AVERROR_UNKNOWN; -+} -+ -+static int v4l2_request_hevc_end_frame(AVCodecContext *avctx) -+{ -+ const HEVCContext * const h = avctx->priv_data; -+ V4L2MediaReqDescriptor *rd = (V4L2MediaReqDescriptor*)h->ref->frame->data[0]; -+ V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; -+ struct req_controls rc; -+ unsigned int i; -+ int rv; -+ -+ // It is possible, though maybe a bug, to get an end_frame without -+ // a previous start_frame. If we do then give up. -+ if (!decode_q_in_q(&rd->decode_ent)) { -+ av_log(avctx, AV_LOG_DEBUG, "%s: Frame not in decode Q\n", __func__); -+ return AVERROR_INVALIDDATA; -+ } -+ -+ { -+ const ScalingList *sl = h->ps.pps->scaling_list_data_present_flag ? -+ &h->ps.pps->scaling_list : -+ h->ps.sps->scaling_list_enable_flag ? -+ &h->ps.sps->scaling_list : NULL; -+ -+ -+ memset(&rc, 0, sizeof(rc)); -+ rc.tv = cvt_dpb_to_tv(rd->timestamp); -+ fill_sps(&rc.sps, h->ps.sps); -+ fill_pps(&rc.pps, h->ps.pps); -+ if (sl) { -+ rc.has_scaling = 1; -+ fill_scaling_matrix(sl, &rc.scaling_matrix); -+ } -+ } -+ -+ decode_q_wait(&ctx->decode_q, &rd->decode_ent); -+ -+ // qe_dst needs to be bound to the data buffer and only returned when that is -+ // Alloc almost certainly wants to be serialised if there is any chance of blocking -+ // so we get the next frame to be free in the thread that needs it for decode first. -+ // -+ // In our current world this probably isn't a concern but put it here anyway -+ if (!rd->qe_dst) -+ { -+ if ((rd->qe_dst = mediabufs_dst_qent_alloc(ctx->mbufs, ctx->dbufs)) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "%s: Failed to get dst buffer\n", __func__); -+ rv = AVERROR(ENOMEM); -+ goto fail; -+ } -+ } -+ -+ // Send as slices -+ if (ctx->multi_slice) -+ { -+ if ((rv = send_slice(avctx, rd, &rc, 0, rd->num_slices)) != 0) -+ goto fail; -+ } -+ else -+ { -+ for (i = 0; i != rd->num_slices; ++i) { -+ if ((rv = send_slice(avctx, rd, &rc, i, i + 1)) != 0) -+ goto fail; -+ } -+ } -+ -+ // Set the drm_prime desriptor -+ drm_from_format(&rd->drm, mediabufs_dst_fmt(ctx->mbufs)); -+ rd->drm.objects[0].fd = dmabuf_fd(qent_dst_dmabuf(rd->qe_dst, 0)); -+ rd->drm.objects[0].size = dmabuf_size(qent_dst_dmabuf(rd->qe_dst, 0)); -+ -+ decode_q_remove(&ctx->decode_q, &rd->decode_ent); -+ return 0; -+ -+fail: -+ decode_q_remove(&ctx->decode_q, &rd->decode_ent); -+ return rv; -+} -+ -+// Initial check & init -+static int -+probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) -+{ -+ const HEVCContext *h = avctx->priv_data; -+ const HEVCSPS * const sps = h->ps.sps; -+ struct v4l2_ctrl_hevc_sps ctrl_sps; -+ unsigned int i; -+ -+ // Check for var slice array -+ struct v4l2_query_ext_ctrl qc[] = { -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS }, -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_SPS }, -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_PPS }, -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX }, -+#if HEVC_CTRLS_VERSION >= 2 -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS }, -+#endif -+ }; -+ // Order & size must match! -+ static const size_t ctrl_sizes[] = { -+ sizeof(struct v4l2_ctrl_hevc_slice_params), -+ sizeof(struct v4l2_ctrl_hevc_sps), -+ sizeof(struct v4l2_ctrl_hevc_pps), -+ sizeof(struct v4l2_ctrl_hevc_scaling_matrix), -+#if HEVC_CTRLS_VERSION >= 2 -+ sizeof(struct v4l2_ctrl_hevc_decode_params), -+#endif -+ }; -+ const unsigned int noof_ctrls = FF_ARRAY_ELEMS(qc); -+ -+ if (mediabufs_ctl_query_ext_ctrls(ctx->mbufs, qc, noof_ctrls)) { -+ av_log(avctx, AV_LOG_DEBUG, "Probed V%d control missing\n", HEVC_CTRLS_VERSION); -+ return AVERROR(EINVAL); -+ } -+ for (i = 0; i != noof_ctrls; ++i) { -+ if (ctrl_sizes[i] != (size_t)qc[i].elem_size) { -+ av_log(avctx, AV_LOG_DEBUG, "Probed V%d control %d size mismatch %zu != %zu\n", -+ HEVC_CTRLS_VERSION, i, ctrl_sizes[i], (size_t)qc[i].elem_size); -+ return AVERROR(EINVAL); -+ } -+ } -+ -+ fill_sps(&ctrl_sps, sps); -+ -+ if (mediabufs_set_ext_ctrl(ctx->mbufs, NULL, V4L2_CID_MPEG_VIDEO_HEVC_SPS, &ctrl_sps, sizeof(ctrl_sps))) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to set initial SPS\n"); -+ return AVERROR(EINVAL); -+ } -+ -+ ctx->multi_slice = (qc[0].flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY) != 0; -+ return 0; -+} -+ -+// Final init -+static int -+set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) -+{ -+ int ret; -+ -+ struct v4l2_query_ext_ctrl querys[] = { -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE, }, -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_START_CODE, }, -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS, }, -+ }; -+ -+ struct v4l2_ext_control ctrls[] = { -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE, }, -+ { .id = V4L2_CID_MPEG_VIDEO_HEVC_START_CODE, }, -+ }; -+ -+ mediabufs_ctl_query_ext_ctrls(ctx->mbufs, querys, FF_ARRAY_ELEMS(querys)); -+ -+ ctx->decode_mode = querys[0].default_value; -+ -+ if (ctx->decode_mode != V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED && -+ ctx->decode_mode != V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED) { -+ av_log(avctx, AV_LOG_ERROR, "%s: unsupported decode mode, %d\n", __func__, ctx->decode_mode); -+ return AVERROR(EINVAL); -+ } -+ -+ ctx->start_code = querys[1].default_value; -+ if (ctx->start_code != V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE && -+ ctx->start_code != V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B) { -+ av_log(avctx, AV_LOG_ERROR, "%s: unsupported start code, %d\n", __func__, ctx->start_code); -+ return AVERROR(EINVAL); -+ } -+ -+ ctx->max_slices = querys[2].elems; -+ if (ctx->max_slices > MAX_SLICES) { -+ av_log(avctx, AV_LOG_ERROR, "%s: unsupported max slices, %d\n", __func__, ctx->max_slices); -+ return AVERROR(EINVAL); -+ } -+ -+ ctrls[0].value = ctx->decode_mode; -+ ctrls[1].value = ctx->start_code; -+ -+ ret = mediabufs_ctl_set_ext_ctrls(ctx->mbufs, NULL, ctrls, FF_ARRAY_ELEMS(ctrls)); -+ return !ret ? 0 : AVERROR(-ret); -+} -+ -+static void v4l2_req_frame_free(void *opaque, uint8_t *data) -+{ -+ AVCodecContext *avctx = opaque; -+ V4L2MediaReqDescriptor * const rd = (V4L2MediaReqDescriptor*)data; -+ -+ av_log(NULL, AV_LOG_DEBUG, "%s: avctx=%p data=%p\n", __func__, avctx, data); -+ -+ qent_dst_unref(&rd->qe_dst); -+ -+ // We don't expect req or qe_src to be set -+ if (rd->req || rd->qe_src) -+ av_log(NULL, AV_LOG_ERROR, "%s: qe_src %p or req %p not NULL\n", __func__, rd->req, rd->qe_src); -+ -+ av_freep(&rd->slices); -+ av_freep(&rd->slice_params); -+ -+ av_free(rd); -+} -+ -+static AVBufferRef *v4l2_req_frame_alloc(void *opaque, int size) -+{ -+ AVCodecContext *avctx = opaque; -+// V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; -+// V4L2MediaReqDescriptor *req; -+ AVBufferRef *ref; -+ uint8_t *data; -+// int ret; -+ -+ data = av_mallocz(size); -+ if (!data) -+ return NULL; -+ -+ av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p size=%d data=%p\n", __func__, avctx, size, data); -+ ref = av_buffer_create(data, size, v4l2_req_frame_free, avctx, 0); -+ if (!ref) { -+ av_freep(&data); -+ return NULL; -+ } -+ return ref; -+} -+ -+#if 0 -+static void v4l2_req_pool_free(void *opaque) -+{ -+ av_log(NULL, AV_LOG_DEBUG, "%s: opaque=%p\n", __func__, opaque); -+} -+ -+static void v4l2_req_hwframe_ctx_free(AVHWFramesContext *hwfc) -+{ -+ av_log(NULL, AV_LOG_DEBUG, "%s: hwfc=%p pool=%p\n", __func__, hwfc, hwfc->pool); -+ -+ av_buffer_pool_uninit(&hwfc->pool); -+} -+#endif -+ -+static int frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx) -+{ -+ V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; -+ AVHWFramesContext *hwfc = (AVHWFramesContext*)hw_frames_ctx->data; -+ const struct v4l2_format *vfmt = mediabufs_dst_fmt(ctx->mbufs); -+ -+ hwfc->format = AV_PIX_FMT_DRM_PRIME; -+ hwfc->sw_format = pixel_format_from_format(vfmt); -+ if (V4L2_TYPE_IS_MULTIPLANAR(vfmt->type)) { -+ hwfc->width = vfmt->fmt.pix_mp.width; -+ hwfc->height = vfmt->fmt.pix_mp.height; -+ } else { -+ hwfc->width = vfmt->fmt.pix.width; -+ hwfc->height = vfmt->fmt.pix.height; -+ } -+#if 0 -+ hwfc->pool = av_buffer_pool_init2(sizeof(V4L2MediaReqDescriptor), avctx, v4l2_req_frame_alloc, v4l2_req_pool_free); -+ if (!hwfc->pool) -+ return AVERROR(ENOMEM); -+ -+ hwfc->free = v4l2_req_hwframe_ctx_free; -+ -+ hwfc->initial_pool_size = 1; -+ -+ switch (avctx->codec_id) { -+ case AV_CODEC_ID_VP9: -+ hwfc->initial_pool_size += 8; -+ break; -+ case AV_CODEC_ID_VP8: -+ hwfc->initial_pool_size += 3; -+ break; -+ default: -+ hwfc->initial_pool_size += 2; -+ } -+#endif -+ av_log(avctx, AV_LOG_DEBUG, "%s: avctx=%p ctx=%p hw_frames_ctx=%p hwfc=%p pool=%p width=%d height=%d initial_pool_size=%d\n", __func__, avctx, ctx, hw_frames_ctx, hwfc, hwfc->pool, hwfc->width, hwfc->height, hwfc->initial_pool_size); -+ -+ return 0; -+} -+ -+static int alloc_frame(AVCodecContext * avctx, AVFrame *frame) -+{ -+ int rv; -+ -+ frame->buf[0] = v4l2_req_frame_alloc(avctx, sizeof(V4L2MediaReqDescriptor)); -+ if (!frame->buf[0]) -+ return AVERROR(ENOMEM); -+ -+ frame->data[0] = frame->buf[0]->data; -+ -+ frame->hw_frames_ctx = av_buffer_ref(avctx->hw_frames_ctx); -+ -+ if ((rv = ff_attach_decode_data(frame)) != 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to attach decode data to frame\n"); -+ av_frame_unref(frame); -+ return rv; -+ } -+ -+ return 0; -+} -+ -+const v4l2_req_decode_fns V(ff_v4l2_req_hevc) = { -+ .src_pix_fmt_v4l2 = V4L2_PIX_FMT_HEVC_SLICE, -+ .name = "V4L2 HEVC stateless V" STR(HEVC_CTRLS_VERSION), -+ .probe = probe, -+ .set_controls = set_controls, -+ -+ .start_frame = v4l2_request_hevc_start_frame, -+ .decode_slice = v4l2_request_hevc_decode_slice, -+ .end_frame = v4l2_request_hevc_end_frame, -+ .abort_frame = v4l2_request_hevc_abort_frame, -+ .frame_params = frame_params, -+ .alloc_frame = alloc_frame, -+}; -+ -diff --git a/libavcodec/v4l2_req_media.c b/libavcodec/v4l2_req_media.c -new file mode 100644 -index 0000000000..eb00ecb406 ---- /dev/null -+++ b/libavcodec/v4l2_req_media.c -@@ -0,0 +1,1596 @@ -+/* -+ * Copyright (C) 2018 Paul Kocialkowski -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sub license, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial portions -+ * of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. -+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR -+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include "v4l2_req_dmabufs.h" -+#include "v4l2_req_media.h" -+#include "v4l2_req_pollqueue.h" -+#include "v4l2_req_utils.h" -+#include "weak_link.h" -+ -+ -+/* floor(log2(x)) */ -+static unsigned int log2_size(size_t x) -+{ -+ unsigned int n = 0; -+ -+ if (x & ~0xffff) { -+ n += 16; -+ x >>= 16; -+ } -+ if (x & ~0xff) { -+ n += 8; -+ x >>= 8; -+ } -+ if (x & ~0xf) { -+ n += 4; -+ x >>= 4; -+ } -+ if (x & ~3) { -+ n += 2; -+ x >>= 2; -+ } -+ return (x & ~1) ? n + 1 : n; -+} -+ -+static size_t round_up_size(const size_t x) -+{ -+ /* Admit no size < 256 */ -+ const unsigned int n = x < 256 ? 8 : log2_size(x) - 1; -+ -+ return x >= (3 << n) ? 4 << n : (3 << n); -+} -+ -+struct media_request; -+ -+struct media_pool { -+ int fd; -+ sem_t sem; -+ pthread_mutex_t lock; -+ struct media_request * free_reqs; -+ struct pollqueue * pq; -+}; -+ -+struct media_request { -+ struct media_request * next; -+ struct media_pool * mp; -+ int fd; -+ struct polltask * pt; -+}; -+ -+ -+static inline int do_trywait(sem_t *const sem) -+{ -+ while (sem_trywait(sem)) { -+ if (errno != EINTR) -+ return -errno; -+ } -+ return 0; -+} -+ -+static inline int do_wait(sem_t *const sem) -+{ -+ while (sem_wait(sem)) { -+ if (errno != EINTR) -+ return -errno; -+ } -+ return 0; -+} -+ -+static int request_buffers(int video_fd, unsigned int type, -+ enum v4l2_memory memory, unsigned int buffers_count) -+{ -+ struct v4l2_requestbuffers buffers; -+ int rc; -+ -+ memset(&buffers, 0, sizeof(buffers)); -+ buffers.type = type; -+ buffers.memory = memory; -+ buffers.count = buffers_count; -+ -+ rc = ioctl(video_fd, VIDIOC_REQBUFS, &buffers); -+ if (rc < 0) { -+ rc = -errno; -+ request_log("Unable to request %d type %d buffers: %s\n", buffers_count, type, strerror(-rc)); -+ return rc; -+ } -+ -+ return 0; -+} -+ -+ -+static int set_stream(int video_fd, unsigned int type, bool enable) -+{ -+ enum v4l2_buf_type buf_type = type; -+ int rc; -+ -+ rc = ioctl(video_fd, enable ? VIDIOC_STREAMON : VIDIOC_STREAMOFF, -+ &buf_type); -+ if (rc < 0) { -+ rc = -errno; -+ request_log("Unable to %sable stream: %s\n", -+ enable ? "en" : "dis", strerror(-rc)); -+ return rc; -+ } -+ -+ return 0; -+} -+ -+ -+ -+struct media_request * media_request_get(struct media_pool * const mp) -+{ -+ struct media_request *req = NULL; -+ -+ /* Timeout handled by poll code */ -+ if (do_wait(&mp->sem)) -+ return NULL; -+ -+ pthread_mutex_lock(&mp->lock); -+ req = mp->free_reqs; -+ if (req) { -+ mp->free_reqs = req->next; -+ req->next = NULL; -+ } -+ pthread_mutex_unlock(&mp->lock); -+ return req; -+} -+ -+int media_request_fd(const struct media_request * const req) -+{ -+ return req->fd; -+} -+ -+int media_request_start(struct media_request * const req) -+{ -+ while (ioctl(req->fd, MEDIA_REQUEST_IOC_QUEUE, NULL) == -1) -+ { -+ const int err = errno; -+ if (err == EINTR) -+ continue; -+ request_log("%s: Failed to Q media: (%d) %s\n", __func__, err, strerror(err)); -+ return -err; -+ } -+ -+ pollqueue_add_task(req->pt, 2000); -+ return 0; -+} -+ -+static void media_request_done(void *v, short revents) -+{ -+ struct media_request *const req = v; -+ struct media_pool *const mp = req->mp; -+ -+ /* ** Not sure what to do about timeout */ -+ -+ if (ioctl(req->fd, MEDIA_REQUEST_IOC_REINIT, NULL) < 0) -+ request_log("Unable to reinit media request: %s\n", -+ strerror(errno)); -+ -+ pthread_mutex_lock(&mp->lock); -+ req->next = mp->free_reqs; -+ mp->free_reqs = req; -+ pthread_mutex_unlock(&mp->lock); -+ sem_post(&mp->sem); -+} -+ -+int media_request_abort(struct media_request ** const preq) -+{ -+ struct media_request * const req = *preq; -+ -+ if (req == NULL) -+ return 0; -+ *preq = NULL; -+ -+ media_request_done(req, 0); -+ return 0; -+} -+ -+static void delete_req_chain(struct media_request * const chain) -+{ -+ struct media_request * next = chain; -+ while (next) { -+ struct media_request * const req = next; -+ next = req->next; -+ if (req->pt) -+ polltask_delete(&req->pt); -+ if (req->fd != -1) -+ close(req->fd); -+ free(req); -+ } -+} -+ -+struct media_pool * media_pool_new(const char * const media_path, -+ struct pollqueue * const pq, -+ const unsigned int n) -+{ -+ struct media_pool * const mp = calloc(1, sizeof(*mp)); -+ unsigned int i; -+ -+ if (!mp) -+ goto fail0; -+ -+ mp->pq = pq; -+ pthread_mutex_init(&mp->lock, NULL); -+ mp->fd = open(media_path, O_RDWR | O_NONBLOCK); -+ if (mp->fd == -1) { -+ request_log("Failed to open '%s': %s\n", media_path, strerror(errno)); -+ goto fail1; -+ } -+ -+ for (i = 0; i != n; ++i) { -+ struct media_request * req = malloc(sizeof(*req)); -+ if (!req) -+ goto fail4; -+ -+ *req = (struct media_request){ -+ .next = mp->free_reqs, -+ .mp = mp, -+ .fd = -1 -+ }; -+ mp->free_reqs = req; -+ -+ if (ioctl(mp->fd, MEDIA_IOC_REQUEST_ALLOC, &req->fd) == -1) { -+ request_log("Failed to alloc request %d: %s\n", i, strerror(errno)); -+ goto fail4; -+ } -+ -+ req->pt = polltask_new(pq, req->fd, POLLPRI, media_request_done, req); -+ if (!req->pt) -+ goto fail4; -+ } -+ -+ sem_init(&mp->sem, 0, n); -+ -+ return mp; -+ -+fail4: -+ delete_req_chain(mp->free_reqs); -+ close(mp->fd); -+ pthread_mutex_destroy(&mp->lock); -+fail1: -+ free(mp); -+fail0: -+ return NULL; -+} -+ -+void media_pool_delete(struct media_pool ** pMp) -+{ -+ struct media_pool * const mp = *pMp; -+ -+ if (!mp) -+ return; -+ *pMp = NULL; -+ -+ delete_req_chain(mp->free_reqs); -+ close(mp->fd); -+ sem_destroy(&mp->sem); -+ pthread_mutex_destroy(&mp->lock); -+ free(mp); -+} -+ -+ -+#define INDEX_UNSET (~(uint32_t)0) -+ -+enum qent_status { -+ QENT_NEW = 0, // Initial state - shouldn't last -+ QENT_FREE, // On free chain -+ QENT_PENDING, // User has ent -+ QENT_WAITING, // On inuse -+ QENT_DONE, // Frame rx -+ QENT_ERROR, // Error -+ QENT_IMPORT -+}; -+ -+struct qent_base { -+ atomic_int ref_count; -+ struct qent_base *next; -+ struct qent_base *prev; -+ enum qent_status status; -+ uint32_t index; -+ struct dmabuf_h *dh[VIDEO_MAX_PLANES]; -+ struct timeval timestamp; -+}; -+ -+struct qent_src { -+ struct qent_base base; -+ int fixed_size; -+}; -+ -+struct qent_dst { -+ struct qent_base base; -+ bool waiting; -+ pthread_mutex_t lock; -+ pthread_cond_t cond; -+ struct ff_weak_link_client * mbc_wl; -+}; -+ -+struct qe_list_head { -+ struct qent_base *head; -+ struct qent_base *tail; -+}; -+ -+struct buf_pool { -+ pthread_mutex_t lock; -+ sem_t free_sem; -+ enum v4l2_buf_type buf_type; -+ struct qe_list_head free; -+ struct qe_list_head inuse; -+}; -+ -+ -+static inline struct qent_dst *base_to_dst(struct qent_base *be) -+{ -+ return (struct qent_dst *)be; -+} -+ -+static inline struct qent_src *base_to_src(struct qent_base *be) -+{ -+ return (struct qent_src *)be; -+} -+ -+ -+#define QENT_BASE_INITIALIZER {\ -+ .ref_count = ATOMIC_VAR_INIT(0),\ -+ .status = QENT_NEW,\ -+ .index = INDEX_UNSET\ -+} -+ -+static void qe_base_uninit(struct qent_base *const be) -+{ -+ unsigned int i; -+ for (i = 0; i != VIDEO_MAX_PLANES; ++i) { -+ dmabuf_free(be->dh[i]); -+ be->dh[i] = NULL; -+ } -+} -+ -+static void qe_src_free(struct qent_src *const be_src) -+{ -+ if (!be_src) -+ return; -+ qe_base_uninit(&be_src->base); -+ free(be_src); -+} -+ -+static struct qent_src * qe_src_new(void) -+{ -+ struct qent_src *const be_src = malloc(sizeof(*be_src)); -+ if (!be_src) -+ return NULL; -+ *be_src = (struct qent_src){ -+ .base = QENT_BASE_INITIALIZER -+ }; -+ return be_src; -+} -+ -+static void qe_dst_free(struct qent_dst *const be_dst) -+{ -+ if (!be_dst) -+ return; -+ -+ ff_weak_link_unref(&be_dst->mbc_wl); -+ pthread_cond_destroy(&be_dst->cond); -+ pthread_mutex_destroy(&be_dst->lock); -+ qe_base_uninit(&be_dst->base); -+ free(be_dst); -+} -+ -+static struct qent_dst* qe_dst_new(struct ff_weak_link_master * const wl) -+{ -+ struct qent_dst *const be_dst = malloc(sizeof(*be_dst)); -+ if (!be_dst) -+ return NULL; -+ *be_dst = (struct qent_dst){ -+ .base = QENT_BASE_INITIALIZER, -+ .lock = PTHREAD_MUTEX_INITIALIZER, -+ .cond = PTHREAD_COND_INITIALIZER, -+ .mbc_wl = ff_weak_link_ref(wl) -+ }; -+ return be_dst; -+} -+ -+static void ql_add_tail(struct qe_list_head * const ql, struct qent_base * be) -+{ -+ if (ql->tail) -+ ql->tail->next = be; -+ else -+ ql->head = be; -+ be->prev = ql->tail; -+ be->next = NULL; -+ ql->tail = be; -+} -+ -+static struct qent_base * ql_extract(struct qe_list_head * const ql, struct qent_base * be) -+{ -+ if (!be) -+ return NULL; -+ -+ if (be->next) -+ be->next->prev = be->prev; -+ else -+ ql->tail = be->prev; -+ if (be->prev) -+ be->prev->next = be->next; -+ else -+ ql->head = be->next; -+ be->next = NULL; -+ be->prev = NULL; -+ return be; -+} -+ -+ -+static void bq_put_free(struct buf_pool *const bp, struct qent_base * be) -+{ -+ ql_add_tail(&bp->free, be); -+} -+ -+static struct qent_base * bq_get_free(struct buf_pool *const bp) -+{ -+ return ql_extract(&bp->free, bp->free.head); -+} -+ -+static struct qent_base * bq_extract_inuse(struct buf_pool *const bp, struct qent_base *const be) -+{ -+ return ql_extract(&bp->inuse, be); -+} -+ -+static struct qent_base * bq_get_inuse(struct buf_pool *const bp) -+{ -+ return ql_extract(&bp->inuse, bp->inuse.head); -+} -+ -+static void bq_free_all_free_src(struct buf_pool *const bp) -+{ -+ struct qent_base *be; -+ while ((be = bq_get_free(bp)) != NULL) -+ qe_src_free(base_to_src(be)); -+} -+ -+static void bq_free_all_inuse_src(struct buf_pool *const bp) -+{ -+ struct qent_base *be; -+ while ((be = bq_get_inuse(bp)) != NULL) -+ qe_src_free(base_to_src(be)); -+} -+ -+static void bq_free_all_free_dst(struct buf_pool *const bp) -+{ -+ struct qent_base *be; -+ while ((be = bq_get_free(bp)) != NULL) -+ qe_dst_free(base_to_dst(be)); -+} -+ -+static void queue_put_free(struct buf_pool *const bp, struct qent_base *be) -+{ -+ unsigned int i; -+ -+ pthread_mutex_lock(&bp->lock); -+ /* Clear out state vars */ -+ be->timestamp.tv_sec = 0; -+ be->timestamp.tv_usec = 0; -+ be->status = QENT_FREE; -+ for (i = 0; i < VIDEO_MAX_PLANES && be->dh[i]; ++i) -+ dmabuf_len_set(be->dh[i], 0); -+ bq_put_free(bp, be); -+ pthread_mutex_unlock(&bp->lock); -+ sem_post(&bp->free_sem); -+} -+ -+static bool queue_is_inuse(const struct buf_pool *const bp) -+{ -+ return bp->inuse.tail != NULL; -+} -+ -+static void queue_put_inuse(struct buf_pool *const bp, struct qent_base *be) -+{ -+ if (!be) -+ return; -+ pthread_mutex_lock(&bp->lock); -+ ql_add_tail(&bp->inuse, be); -+ be->status = QENT_WAITING; -+ pthread_mutex_unlock(&bp->lock); -+} -+ -+static struct qent_base *queue_get_free(struct buf_pool *const bp) -+{ -+ struct qent_base *buf; -+ -+ if (do_wait(&bp->free_sem)) -+ return NULL; -+ pthread_mutex_lock(&bp->lock); -+ buf = bq_get_free(bp); -+ pthread_mutex_unlock(&bp->lock); -+ return buf; -+} -+ -+static struct qent_base *queue_tryget_free(struct buf_pool *const bp) -+{ -+ struct qent_base *buf; -+ -+ if (do_trywait(&bp->free_sem)) -+ return NULL; -+ pthread_mutex_lock(&bp->lock); -+ buf = bq_get_free(bp); -+ pthread_mutex_unlock(&bp->lock); -+ return buf; -+} -+ -+static struct qent_base * queue_find_extract_fd(struct buf_pool *const bp, const int fd) -+{ -+ struct qent_base *be; -+ -+ pthread_mutex_lock(&bp->lock); -+ /* Expect 1st in Q, but allow anywhere */ -+ for (be = bp->inuse.head; be; be = be->next) { -+ if (dmabuf_fd(be->dh[0]) == fd) { -+ bq_extract_inuse(bp, be); -+ break; -+ } -+ } -+ pthread_mutex_unlock(&bp->lock); -+ -+ return be; -+} -+ -+static void queue_delete(struct buf_pool *const bp) -+{ -+ sem_destroy(&bp->free_sem); -+ pthread_mutex_destroy(&bp->lock); -+ free(bp); -+} -+ -+static struct buf_pool* queue_new(const int vfd) -+{ -+ struct buf_pool *bp = calloc(1, sizeof(*bp)); -+ if (!bp) -+ return NULL; -+ pthread_mutex_init(&bp->lock, NULL); -+ sem_init(&bp->free_sem, 0, 0); -+ return bp; -+} -+ -+ -+struct mediabufs_ctl { -+ atomic_int ref_count; /* 0 is single ref for easier atomics */ -+ void * dc; -+ int vfd; -+ bool stream_on; -+ bool polling; -+ bool dst_fixed; // Dst Q is fixed size -+ pthread_mutex_t lock; -+ struct buf_pool * src; -+ struct buf_pool * dst; -+ struct polltask * pt; -+ struct pollqueue * pq; -+ struct ff_weak_link_master * this_wlm; -+ -+ struct v4l2_format src_fmt; -+ struct v4l2_format dst_fmt; -+}; -+ -+static int qe_v4l2_queue(struct qent_base *const be, -+ const int vfd, struct media_request *const mreq, -+ const struct v4l2_format *const fmt, -+ const bool is_dst, const bool hold_flag) -+{ -+ struct v4l2_buffer buffer = { -+ .type = fmt->type, -+ .memory = V4L2_MEMORY_DMABUF, -+ .index = be->index -+ }; -+ struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ unsigned int i; -+ for (i = 0; i < VIDEO_MAX_PLANES && be->dh[i]; ++i) { -+ if (is_dst) -+ dmabuf_len_set(be->dh[i], 0); -+ -+ /* *** Really need a pixdesc rather than a format so we can fill in data_offset */ -+ planes[i].length = dmabuf_size(be->dh[i]); -+ planes[i].bytesused = dmabuf_len(be->dh[i]); -+ planes[i].m.fd = dmabuf_fd(be->dh[i]); -+ } -+ buffer.m.planes = planes; -+ buffer.length = i; -+ } -+ else { -+ if (is_dst) -+ dmabuf_len_set(be->dh[0], 0); -+ -+ buffer.bytesused = dmabuf_len(be->dh[0]); -+ buffer.length = dmabuf_size(be->dh[0]); -+ buffer.m.fd = dmabuf_fd(be->dh[0]); -+ } -+ -+ if (!is_dst && mreq) { -+ buffer.flags |= V4L2_BUF_FLAG_REQUEST_FD; -+ buffer.request_fd = media_request_fd(mreq); -+ if (hold_flag) -+ buffer.flags |= V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF; -+ } -+ -+ if (is_dst) -+ be->timestamp = (struct timeval){0,0}; -+ -+ buffer.timestamp = be->timestamp; -+ -+ while (ioctl(vfd, VIDIOC_QBUF, &buffer)) { -+ const int err = errno; -+ if (err != EINTR) { -+ request_log("%s: Failed to Q buffer: err=%d (%s)\n", __func__, err, strerror(err)); -+ return -err; -+ } -+ } -+ return 0; -+} -+ -+static struct qent_base * qe_dequeue(struct buf_pool *const bp, -+ const int vfd, -+ const struct v4l2_format * const f) -+{ -+ int fd; -+ struct qent_base *be; -+ int rc; -+ const bool mp = V4L2_TYPE_IS_MULTIPLANAR(f->type); -+ struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; -+ struct v4l2_buffer buffer = { -+ .type = f->type, -+ .memory = V4L2_MEMORY_DMABUF -+ }; -+ if (mp) { -+ buffer.length = f->fmt.pix_mp.num_planes; -+ buffer.m.planes = planes; -+ } -+ -+ while ((rc = ioctl(vfd, VIDIOC_DQBUF, &buffer)) != 0 && -+ errno == EINTR) -+ /* Loop */; -+ if (rc) { -+ request_log("Error DQing buffer type %d: %s\n", f->type, strerror(errno)); -+ return NULL; -+ } -+ -+ fd = mp ? planes[0].m.fd : buffer.m.fd; -+ be = queue_find_extract_fd(bp, fd); -+ if (!be) { -+ request_log("Failed to find fd %d in Q\n", fd); -+ return NULL; -+ } -+ -+ be->timestamp = buffer.timestamp; -+ be->status = (buffer.flags & V4L2_BUF_FLAG_ERROR) ? QENT_ERROR : QENT_DONE; -+ return be; -+} -+ -+static void qe_dst_done(struct qent_dst * dst_be) -+{ -+ pthread_mutex_lock(&dst_be->lock); -+ dst_be->waiting = false; -+ pthread_cond_broadcast(&dst_be->cond); -+ pthread_mutex_unlock(&dst_be->lock); -+ -+ qent_dst_unref(&dst_be); -+} -+ -+static bool qe_dst_waiting(struct qent_dst *const dst_be) -+{ -+ bool waiting; -+ pthread_mutex_lock(&dst_be->lock); -+ waiting = dst_be->waiting; -+ dst_be->waiting = true; -+ pthread_mutex_unlock(&dst_be->lock); -+ return waiting; -+} -+ -+ -+static bool mediabufs_wants_poll(const struct mediabufs_ctl *const mbc) -+{ -+ return queue_is_inuse(mbc->src) || queue_is_inuse(mbc->dst); -+} -+ -+static void mediabufs_poll_cb(void * v, short revents) -+{ -+ struct mediabufs_ctl *mbc = v; -+ struct qent_src *src_be = NULL; -+ struct qent_dst *dst_be = NULL; -+ -+ if (!revents) -+ request_err(mbc->dc, "%s: Timeout\n", __func__); -+ -+ pthread_mutex_lock(&mbc->lock); -+ mbc->polling = false; -+ -+ if ((revents & POLLOUT) != 0) -+ src_be = base_to_src(qe_dequeue(mbc->src, mbc->vfd, &mbc->src_fmt)); -+ if ((revents & POLLIN) != 0) -+ dst_be = base_to_dst(qe_dequeue(mbc->dst, mbc->vfd, &mbc->dst_fmt)); -+ -+ /* Reschedule */ -+ if (mediabufs_wants_poll(mbc)) { -+ mbc->polling = true; -+ pollqueue_add_task(mbc->pt, 2000); -+ } -+ pthread_mutex_unlock(&mbc->lock); -+ -+ if (src_be) -+ queue_put_free(mbc->src, &src_be->base); -+ if (dst_be) -+ qe_dst_done(dst_be); -+} -+ -+int qent_src_params_set(struct qent_src *const be_src, const struct timeval * timestamp) -+{ -+ struct qent_base *const be = &be_src->base; -+ -+ be->timestamp = *timestamp; -+ return 0; -+} -+ -+struct timeval qent_dst_timestamp_get(const struct qent_dst *const be_dst) -+{ -+ return be_dst->base.timestamp; -+} -+ -+static int qent_base_realloc(struct qent_base *const be, const size_t len, struct dmabufs_ctl * dbsc) -+{ -+ if (!be->dh[0] || len > dmabuf_size(be->dh[0])) { -+ size_t newsize = round_up_size(len); -+ request_log("%s: Overrun %zd > %zd; trying %zd\n", __func__, len, dmabuf_size(be->dh[0]), newsize); -+ if (!dbsc) { -+ request_log("%s: No dmbabuf_ctrl for realloc\n", __func__); -+ return -ENOMEM; -+ } -+ if ((be->dh[0] = dmabuf_realloc(dbsc, be->dh[0], newsize)) == NULL) { -+ request_log("%s: Realloc %zd failed\n", __func__, newsize); -+ return -ENOMEM; -+ } -+ } -+ return 0; -+} -+ -+int qent_src_alloc(struct qent_src *const be_src, const size_t len, struct dmabufs_ctl * dbsc) -+{ -+ struct qent_base *const be = &be_src->base; -+ return qent_base_realloc(be, len, dbsc); -+} -+ -+ -+int qent_src_data_copy(struct qent_src *const be_src, const size_t offset, const void *const src, const size_t len, struct dmabufs_ctl * dbsc) -+{ -+ void * dst; -+ struct qent_base *const be = &be_src->base; -+ int rv; -+ -+ // Realloc doesn't copy so don't alloc if offset != 0 -+ if ((rv = qent_base_realloc(be, offset + len, -+ be_src->fixed_size || offset ? NULL : dbsc)) != 0) -+ return rv; -+ -+ dmabuf_write_start(be->dh[0]); -+ dst = dmabuf_map(be->dh[0]); -+ if (!dst) -+ return -1; -+ memcpy((char*)dst + offset, src, len); -+ dmabuf_len_set(be->dh[0], len); -+ dmabuf_write_end(be->dh[0]); -+ return 0; -+} -+ -+const struct dmabuf_h * qent_dst_dmabuf(const struct qent_dst *const be_dst, unsigned int plane) -+{ -+ const struct qent_base *const be = &be_dst->base; -+ -+ return (plane >= sizeof(be->dh)/sizeof(be->dh[0])) ? NULL : be->dh[plane]; -+} -+ -+int qent_dst_dup_fd(const struct qent_dst *const be_dst, unsigned int plane) -+{ -+ return dup(dmabuf_fd(qent_dst_dmabuf(be_dst, plane))); -+} -+ -+MediaBufsStatus mediabufs_start_request(struct mediabufs_ctl *const mbc, -+ struct media_request **const pmreq, -+ struct qent_src **const psrc_be, -+ struct qent_dst *const dst_be, -+ const bool is_final) -+{ -+ struct media_request * mreq = *pmreq; -+ struct qent_src *const src_be = *psrc_be; -+ -+ // Req & src are always both "consumed" -+ *pmreq = NULL; -+ *psrc_be = NULL; -+ -+ pthread_mutex_lock(&mbc->lock); -+ -+ if (!src_be) -+ goto fail1; -+ -+ if (dst_be) { -+ if (qe_dst_waiting(dst_be)) { -+ request_info(mbc->dc, "Request buffer already waiting on start\n"); -+ goto fail1; -+ } -+ dst_be->base.timestamp = (struct timeval){0,0}; -+ if (qe_v4l2_queue(&dst_be->base, mbc->vfd, NULL, &mbc->dst_fmt, true, false)) -+ goto fail1; -+ -+ qent_dst_ref(dst_be); -+ queue_put_inuse(mbc->dst, &dst_be->base); -+ } -+ -+ if (qe_v4l2_queue(&src_be->base, mbc->vfd, mreq, &mbc->src_fmt, false, !is_final)) -+ goto fail1; -+ queue_put_inuse(mbc->src, &src_be->base); -+ -+ if (!mbc->polling && mediabufs_wants_poll(mbc)) { -+ mbc->polling = true; -+ pollqueue_add_task(mbc->pt, 2000); -+ } -+ pthread_mutex_unlock(&mbc->lock); -+ -+ if (media_request_start(mreq)) -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ -+ return MEDIABUFS_STATUS_SUCCESS; -+ -+fail1: -+ media_request_abort(&mreq); -+ if (src_be) -+ queue_put_free(mbc->src, &src_be->base); -+ -+// *** TODO: If src Q fails this doesnt unwind properly - separate dst Q from src Q -+ if (dst_be) { -+ dst_be->base.status = QENT_ERROR; -+ qe_dst_done(dst_be); -+ } -+ pthread_mutex_unlock(&mbc->lock); -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+} -+ -+ -+static int qe_alloc_from_fmt(struct qent_base *const be, -+ struct dmabufs_ctl *const dbsc, -+ const struct v4l2_format *const fmt) -+{ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ unsigned int i; -+ for (i = 0; i != fmt->fmt.pix_mp.num_planes; ++i) { -+ be->dh[i] = dmabuf_realloc(dbsc, be->dh[i], -+ fmt->fmt.pix_mp.plane_fmt[i].sizeimage); -+ /* On failure tidy up and die */ -+ if (!be->dh[i]) { -+ while (i--) { -+ dmabuf_free(be->dh[i]); -+ be->dh[i] = NULL; -+ } -+ return -1; -+ } -+ } -+ } -+ else { -+// be->dh[0] = dmabuf_alloc(dbsc, fmt->fmt.pix.sizeimage); -+ size_t size = fmt->fmt.pix.sizeimage; -+ be->dh[0] = dmabuf_realloc(dbsc, be->dh[0], size); -+ if (!be->dh[0]) -+ return -1; -+ } -+ return 0; -+} -+ -+static MediaBufsStatus fmt_set(struct v4l2_format *const fmt, const int fd, -+ const enum v4l2_buf_type buftype, -+ uint32_t pixfmt, -+ const unsigned int width, const unsigned int height, -+ const size_t bufsize) -+{ -+ *fmt = (struct v4l2_format){.type = buftype}; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(buftype)) { -+ fmt->fmt.pix_mp.width = width; -+ fmt->fmt.pix_mp.height = height; -+ fmt->fmt.pix_mp.pixelformat = pixfmt; -+ if (bufsize) { -+ fmt->fmt.pix_mp.num_planes = 1; -+ fmt->fmt.pix_mp.plane_fmt[0].sizeimage = bufsize; -+ } -+ } -+ else { -+ fmt->fmt.pix.width = width; -+ fmt->fmt.pix.height = height; -+ fmt->fmt.pix.pixelformat = pixfmt; -+ fmt->fmt.pix.sizeimage = bufsize; -+ } -+ -+ while (ioctl(fd, VIDIOC_S_FMT, fmt)) -+ if (errno != EINTR) -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ -+ // Treat anything where we don't get at least what we asked for as a fail -+ if (V4L2_TYPE_IS_MULTIPLANAR(buftype)) { -+ if (fmt->fmt.pix_mp.width < width || -+ fmt->fmt.pix_mp.height < height || -+ fmt->fmt.pix_mp.pixelformat != pixfmt) { -+ return MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE; -+ } -+ } -+ else { -+ if (fmt->fmt.pix.width < width || -+ fmt->fmt.pix.height < height || -+ fmt->fmt.pix.pixelformat != pixfmt) { -+ return MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE; -+ } -+ } -+ -+ return MEDIABUFS_STATUS_SUCCESS; -+} -+ -+static MediaBufsStatus find_fmt_flags(struct v4l2_format *const fmt, -+ const int fd, -+ const unsigned int type_v4l2, -+ const uint32_t flags_must, -+ const uint32_t flags_not, -+ const unsigned int width, -+ const unsigned int height, -+ mediabufs_dst_fmt_accept_fn *const accept_fn, -+ void *const accept_v) -+{ -+ unsigned int i; -+ -+ for (i = 0;; ++i) { -+ struct v4l2_fmtdesc fmtdesc = { -+ .index = i, -+ .type = type_v4l2 -+ }; -+ while (ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc)) { -+ if (errno != EINTR) -+ return MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE; -+ } -+ if ((fmtdesc.flags & flags_must) != flags_must || -+ (fmtdesc.flags & flags_not)) -+ continue; -+ if (!accept_fn(accept_v, &fmtdesc)) -+ continue; -+ -+ if (fmt_set(fmt, fd, fmtdesc.type, fmtdesc.pixelformat, -+ width, height, 0) == MEDIABUFS_STATUS_SUCCESS) -+ return MEDIABUFS_STATUS_SUCCESS; -+ } -+ return 0; -+} -+ -+ -+/* Wait for qent done */ -+ -+MediaBufsStatus qent_dst_wait(struct qent_dst *const be_dst) -+{ -+ struct qent_base *const be = &be_dst->base; -+ enum qent_status estat; -+ -+ pthread_mutex_lock(&be_dst->lock); -+ while (be_dst->waiting && -+ !pthread_cond_wait(&be_dst->cond, &be_dst->lock)) -+ /* Loop */; -+ estat = be->status; -+ pthread_mutex_unlock(&be_dst->lock); -+ -+ return estat == QENT_DONE ? MEDIABUFS_STATUS_SUCCESS : -+ estat == QENT_ERROR ? MEDIABUFS_ERROR_DECODING_ERROR : -+ MEDIABUFS_ERROR_OPERATION_FAILED; -+} -+ -+const uint8_t * qent_dst_data(struct qent_dst *const be_dst, unsigned int buf_no) -+{ -+ struct qent_base *const be = &be_dst->base; -+ return dmabuf_map(be->dh[buf_no]); -+} -+ -+MediaBufsStatus qent_dst_read_start(struct qent_dst *const be_dst) -+{ -+ struct qent_base *const be = &be_dst->base; -+ unsigned int i; -+ for (i = 0; i != VIDEO_MAX_PLANES && be->dh[i]; ++i) { -+ if (dmabuf_read_start(be->dh[i])) { -+ while (i--) -+ dmabuf_read_end(be->dh[i]); -+ return MEDIABUFS_ERROR_ALLOCATION_FAILED; -+ } -+ } -+ return MEDIABUFS_STATUS_SUCCESS; -+} -+ -+MediaBufsStatus qent_dst_read_stop(struct qent_dst *const be_dst) -+{ -+ struct qent_base *const be = &be_dst->base; -+ unsigned int i; -+ MediaBufsStatus status = MEDIABUFS_STATUS_SUCCESS; -+ -+ for (i = 0; i != VIDEO_MAX_PLANES && be->dh[i]; ++i) { -+ if (dmabuf_read_end(be->dh[i])) -+ status = MEDIABUFS_ERROR_OPERATION_FAILED; -+ } -+ return status; -+} -+ -+struct qent_dst * qent_dst_ref(struct qent_dst * const be_dst) -+{ -+ if (be_dst) -+ atomic_fetch_add(&be_dst->base.ref_count, 1); -+ return be_dst; -+} -+ -+void qent_dst_unref(struct qent_dst ** const pbe_dst) -+{ -+ struct qent_dst * const be_dst = *pbe_dst; -+ struct mediabufs_ctl * mbc; -+ if (!be_dst) -+ return; -+ *pbe_dst = NULL; -+ -+ if (atomic_fetch_sub(&be_dst->base.ref_count, 1) != 0) -+ return; -+ -+ if ((mbc = ff_weak_link_lock(&be_dst->mbc_wl)) != NULL) { -+ queue_put_free(mbc->dst, &be_dst->base); -+ ff_weak_link_unlock(be_dst->mbc_wl); -+ } -+ else { -+ qe_dst_free(be_dst); -+ } -+} -+ -+MediaBufsStatus qent_dst_import_fd(struct qent_dst *const be_dst, -+ unsigned int plane, -+ int fd, size_t size) -+{ -+ struct qent_base *const be = &be_dst->base; -+ struct dmabuf_h * dh; -+ -+ if (be->status != QENT_IMPORT || be->dh[plane]) -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ -+ dh = dmabuf_import(fd, size); -+ if (!dh) -+ return MEDIABUFS_ERROR_ALLOCATION_FAILED; -+ -+ be->dh[plane] = dh; -+ return MEDIABUFS_STATUS_SUCCESS; -+} -+ -+// Returns noof buffers created, -ve for error -+static int create_dst_bufs(struct mediabufs_ctl *const mbc, unsigned int n, struct qent_dst * const qes[]) -+{ -+ unsigned int i; -+ -+ struct v4l2_create_buffers cbuf = { -+ .count = n, -+ .memory = V4L2_MEMORY_DMABUF, -+ .format = mbc->dst_fmt, -+ }; -+ -+ while (ioctl(mbc->vfd, VIDIOC_CREATE_BUFS, &cbuf)) { -+ const int err = -errno; -+ if (err != EINTR) { -+ request_err(mbc->dc, "%s: Failed to create V4L2 buffer\n", __func__); -+ return -err; -+ } -+ } -+ -+ if (cbuf.count != n) -+ request_warn(mbc->dc, "%s: Created %d of %d V4L2 buffers requested\n", __func__, cbuf.count, n); -+ -+ for (i = 0; i != cbuf.count; ++i) -+ qes[i]->base.index = cbuf.index + i; -+ -+ return cbuf.count; -+} -+ -+struct qent_dst* mediabufs_dst_qent_alloc(struct mediabufs_ctl *const mbc, struct dmabufs_ctl *const dbsc) -+{ -+ struct qent_dst * be_dst; -+ -+ if (mbc == NULL) { -+ be_dst = qe_dst_new(NULL); -+ if (be_dst) -+ be_dst->base.status = QENT_IMPORT; -+ return be_dst; -+ } -+ -+ if (mbc->dst_fixed) { -+ be_dst = base_to_dst(queue_get_free(mbc->dst)); -+ if (!be_dst) -+ return NULL; -+ } -+ else { -+ be_dst = base_to_dst(queue_tryget_free(mbc->dst)); -+ if (!be_dst) { -+ be_dst = qe_dst_new(mbc->this_wlm); -+ if (!be_dst) -+ return NULL; -+ -+ if (create_dst_bufs(mbc, 1, &be_dst) != 1) { -+ qe_dst_free(be_dst); -+ return NULL; -+ } -+ } -+ } -+ -+ if (qe_alloc_from_fmt(&be_dst->base, dbsc, &mbc->dst_fmt)) { -+ /* Given how create buf works we can't uncreate it on alloc failure -+ * all we can do is put it on the free Q -+ */ -+ queue_put_free(mbc->dst, &be_dst->base); -+ return NULL; -+ } -+ -+ be_dst->base.status = QENT_PENDING; -+ atomic_store(&be_dst->base.ref_count, 0); -+ return be_dst; -+} -+ -+const struct v4l2_format *mediabufs_dst_fmt(struct mediabufs_ctl *const mbc) -+{ -+ return &mbc->dst_fmt; -+} -+ -+MediaBufsStatus mediabufs_dst_fmt_set(struct mediabufs_ctl *const mbc, -+ const unsigned int width, -+ const unsigned int height, -+ mediabufs_dst_fmt_accept_fn *const accept_fn, -+ void *const accept_v) -+{ -+ MediaBufsStatus status; -+ unsigned int i; -+ const enum v4l2_buf_type buf_type = mbc->dst_fmt.type; -+ static const struct { -+ unsigned int flags_must; -+ unsigned int flags_not; -+ } trys[] = { -+ {0, V4L2_FMT_FLAG_EMULATED}, -+ {V4L2_FMT_FLAG_EMULATED, 0}, -+ }; -+ for (i = 0; i != sizeof(trys)/sizeof(trys[0]); ++i) { -+ status = find_fmt_flags(&mbc->dst_fmt, mbc->vfd, -+ buf_type, -+ trys[i].flags_must, -+ trys[i].flags_not, -+ width, height, accept_fn, accept_v); -+ if (status != MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE) -+ return status; -+ } -+ -+ if (status != MEDIABUFS_STATUS_SUCCESS) -+ return status; -+ -+ /* Try to create a buffer - don't alloc */ -+ return status; -+} -+ -+// ** This is a mess if we get partial alloc but without any way to remove -+// individual V4L2 Q members we are somewhat stuffed -+MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed) -+{ -+ unsigned int i; -+ int a = 0; -+ unsigned int qc; -+ struct qent_dst * qes[32]; -+ -+ if (n > 32) -+ return MEDIABUFS_ERROR_ALLOCATION_FAILED; -+ -+ // Create qents first as it is hard to get rid of the V4L2 buffers on error -+ for (qc = 0; qc != n; ++qc) -+ { -+ if ((qes[qc] = qe_dst_new(mbc->this_wlm)) == NULL) -+ goto fail; -+ } -+ -+ if ((a = create_dst_bufs(mbc, n, qes)) < 0) -+ goto fail; -+ -+ for (i = 0; i != a; ++i) -+ queue_put_free(mbc->dst, &qes[i]->base); -+ -+ if (a != n) -+ goto fail; -+ -+ mbc->dst_fixed = fixed; -+ return MEDIABUFS_STATUS_SUCCESS; -+ -+fail: -+ for (i = (a < 0 ? 0 : a); i != qc; ++i) -+ qe_dst_free(qes[i]); -+ -+ return MEDIABUFS_ERROR_ALLOCATION_FAILED; -+} -+ -+struct qent_src *mediabufs_src_qent_get(struct mediabufs_ctl *const mbc) -+{ -+ struct qent_base * buf = queue_get_free(mbc->src); -+ buf->status = QENT_PENDING; -+ return base_to_src(buf); -+} -+ -+void mediabufs_src_qent_abort(struct mediabufs_ctl *const mbc, struct qent_src **const pqe_src) -+{ -+ struct qent_src *const qe_src = *pqe_src; -+ if (!qe_src) -+ return; -+ *pqe_src = NULL; -+ queue_put_free(mbc->src, &qe_src->base); -+} -+ -+/* src format must have been set up before this */ -+MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const mbc, -+ struct dmabufs_ctl * const dbsc, -+ unsigned int n) -+{ -+ unsigned int i; -+ struct v4l2_requestbuffers req = { -+ .count = n, -+ .type = mbc->src_fmt.type, -+ .memory = V4L2_MEMORY_DMABUF -+ }; -+ -+ bq_free_all_free_src(mbc->src); -+ while (ioctl(mbc->vfd, VIDIOC_REQBUFS, &req) == -1) { -+ if (errno != EINTR) { -+ request_err(mbc->dc, "%s: Failed to request src bufs\n", __func__); -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ } -+ } -+ -+ if (n > req.count) { -+ request_info(mbc->dc, "Only allocated %d of %d src buffers requested\n", req.count, n); -+ n = req.count; -+ } -+ -+ for (i = 0; i != n; ++i) { -+ struct qent_src *const be_src = qe_src_new(); -+ if (!be_src) { -+ request_err(mbc->dc, "Failed to create src be %d\n", i); -+ goto fail; -+ } -+ if (qe_alloc_from_fmt(&be_src->base, dbsc, &mbc->src_fmt)) { -+ qe_src_free(be_src); -+ goto fail; -+ } -+ be_src->base.index = i; -+ be_src->fixed_size = !mediabufs_src_resizable(mbc); -+ -+ queue_put_free(mbc->src, &be_src->base); -+ } -+ -+ return MEDIABUFS_STATUS_SUCCESS; -+ -+fail: -+ bq_free_all_free_src(mbc->src); -+ req.count = 0; -+ while (ioctl(mbc->vfd, VIDIOC_REQBUFS, &req) == -1 && -+ errno == EINTR) -+ /* Loop */; -+ -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+} -+ -+ -+ -+/* -+ * Set stuff order: -+ * Set src fmt -+ * Set parameters (sps) on vfd -+ * Negotiate dst format (dst_fmt_set) -+ * Create src buffers -+ * Alloc a dst buffer or Create dst slots -+*/ -+MediaBufsStatus mediabufs_stream_on(struct mediabufs_ctl *const mbc) -+{ -+ if (mbc->stream_on) -+ return MEDIABUFS_STATUS_SUCCESS; -+ -+ if (set_stream(mbc->vfd, mbc->src_fmt.type, true) < 0) { -+ request_log("Failed to set stream on src type %d\n", mbc->src_fmt.type); -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ } -+ -+ if (set_stream(mbc->vfd, mbc->dst_fmt.type, true) < 0) { -+ request_log("Failed to set stream on dst type %d\n", mbc->dst_fmt.type); -+ set_stream(mbc->vfd, mbc->src_fmt.type, false); -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ } -+ -+ mbc->stream_on = true; -+ return MEDIABUFS_STATUS_SUCCESS; -+} -+ -+MediaBufsStatus mediabufs_stream_off(struct mediabufs_ctl *const mbc) -+{ -+ MediaBufsStatus status = MEDIABUFS_STATUS_SUCCESS; -+ -+ if (!mbc->stream_on) -+ return MEDIABUFS_STATUS_SUCCESS; -+ -+ if (set_stream(mbc->vfd, mbc->dst_fmt.type, false) < 0) { -+ request_log("Failed to set stream off dst type %d\n", mbc->dst_fmt.type); -+ status = MEDIABUFS_ERROR_OPERATION_FAILED; -+ } -+ -+ if (set_stream(mbc->vfd, mbc->src_fmt.type, false) < 0) { -+ request_log("Failed to set stream off src type %d\n", mbc->src_fmt.type); -+ status = MEDIABUFS_ERROR_OPERATION_FAILED; -+ } -+ -+ mbc->stream_on = false; -+ return status; -+} -+ -+int mediabufs_ctl_set_ext_ctrls(struct mediabufs_ctl * mbc, struct media_request * const mreq, struct v4l2_ext_control control_array[], unsigned int n) -+{ -+ struct v4l2_ext_controls controls = { -+ .controls = control_array, -+ .count = n -+ }; -+ -+ if (mreq) { -+ controls.which = V4L2_CTRL_WHICH_REQUEST_VAL; -+ controls.request_fd = media_request_fd(mreq); -+ } -+ -+ while (ioctl(mbc->vfd, VIDIOC_S_EXT_CTRLS, &controls)) -+ { -+ const int err = errno; -+ if (err != EINTR) { -+ request_err(mbc->dc, "Unable to set controls: %s\n", strerror(err)); -+ return -err; -+ } -+ } -+ -+ return 0; -+} -+ -+MediaBufsStatus mediabufs_set_ext_ctrl(struct mediabufs_ctl *const mbc, -+ struct media_request * const mreq, -+ unsigned int id, void *data, -+ unsigned int size) -+{ -+ struct v4l2_ext_control control = { -+ .id = id, -+ .ptr = data, -+ .size = size -+ }; -+ -+ int rv = mediabufs_ctl_set_ext_ctrls(mbc, mreq, &control, 1); -+ return !rv ? MEDIABUFS_STATUS_SUCCESS : MEDIABUFS_ERROR_OPERATION_FAILED; -+} -+ -+MediaBufsStatus mediabufs_src_fmt_set(struct mediabufs_ctl *const mbc, -+ enum v4l2_buf_type buf_type, -+ const uint32_t pixfmt, -+ const uint32_t width, const uint32_t height, -+ const size_t bufsize) -+{ -+ MediaBufsStatus rv = fmt_set(&mbc->src_fmt, mbc->vfd, buf_type, pixfmt, width, height, bufsize); -+ if (rv != MEDIABUFS_STATUS_SUCCESS) -+ request_err(mbc->dc, "Failed to set src buftype %d, format %#x %dx%d\n", buf_type, pixfmt, width, height); -+ -+ return rv; -+} -+ -+int mediabufs_ctl_query_ext_ctrls(struct mediabufs_ctl * mbc, struct v4l2_query_ext_ctrl ctrls[], unsigned int n) -+{ -+ int rv = 0; -+ while (n--) { -+ while (ioctl(mbc->vfd, VIDIOC_QUERY_EXT_CTRL, ctrls)) { -+ const int err = errno; -+ if (err != EINTR) { -+ // Often used for probing - errors are to be expected -+ request_debug(mbc->dc, "Failed to query ext id=%#x, err=%d\n", ctrls->id, err); -+ ctrls->type = 0; // 0 is invalid -+ rv = -err; -+ break; -+ } -+ } -+ ++ctrls; -+ } -+ return rv; -+} -+ -+int mediabufs_src_resizable(const struct mediabufs_ctl *const mbc) -+{ -+ // Single planar OUTPUT can only take exact size buffers -+ // Multiplanar will take larger than negotiated -+ return V4L2_TYPE_IS_MULTIPLANAR(mbc->src_fmt.type); -+} -+ -+static void mediabufs_ctl_delete(struct mediabufs_ctl *const mbc) -+{ -+ if (!mbc) -+ return; -+ -+ // Break the weak link first -+ ff_weak_link_break(&mbc->this_wlm); -+ -+ polltask_delete(&mbc->pt); -+ -+ mediabufs_stream_off(mbc); -+ -+ // Empty v4l2 buffer stash -+ request_buffers(mbc->vfd, mbc->src_fmt.type, V4L2_MEMORY_MMAP, 0); -+ request_buffers(mbc->vfd, mbc->dst_fmt.type, V4L2_MEMORY_MMAP, 0); -+ -+ bq_free_all_free_src(mbc->src); -+ bq_free_all_inuse_src(mbc->src); -+ bq_free_all_free_dst(mbc->dst); -+ -+ { -+ struct qent_dst *dst_be; -+ while ((dst_be = base_to_dst(bq_get_inuse(mbc->dst))) != NULL) { -+ dst_be->base.timestamp = (struct timeval){0}; -+ dst_be->base.status = QENT_ERROR; -+ qe_dst_done(dst_be); -+ } -+ } -+ -+ queue_delete(mbc->dst); -+ queue_delete(mbc->src); -+ close(mbc->vfd); -+ pthread_mutex_destroy(&mbc->lock); -+ -+ free(mbc); -+} -+ -+struct mediabufs_ctl * mediabufs_ctl_ref(struct mediabufs_ctl *const mbc) -+{ -+ atomic_fetch_add(&mbc->ref_count, 1); -+ return mbc; -+} -+ -+void mediabufs_ctl_unref(struct mediabufs_ctl **const pmbc) -+{ -+ struct mediabufs_ctl *const mbc = *pmbc; -+ int n; -+ -+ if (!mbc) -+ return; -+ *pmbc = NULL; -+ n = atomic_fetch_sub(&mbc->ref_count, 1); -+ if (n) -+ return; -+ mediabufs_ctl_delete(mbc); -+} -+ -+static int set_capabilities(struct mediabufs_ctl *const mbc) -+{ -+ struct v4l2_capability capability = { 0 }; -+ uint32_t caps; -+ -+ if (ioctl(mbc->vfd, VIDIOC_QUERYCAP, &capability)) { -+ int err = errno; -+ request_err(mbc->dc, "Failed to get capabilities: %s\n", strerror(err)); -+ return -err; -+ } -+ -+ caps = (capability.capabilities & V4L2_CAP_DEVICE_CAPS) != 0 ? -+ capability.device_caps : -+ capability.capabilities; -+ -+ if ((caps & V4L2_CAP_VIDEO_M2M_MPLANE) != 0) { -+ mbc->src_fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; -+ mbc->dst_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; -+ } -+ else if ((caps & V4L2_CAP_VIDEO_M2M) != 0) { -+ mbc->src_fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; -+ mbc->dst_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; -+ } -+ else { -+ request_err(mbc->dc, "No M2M capabilities (%#x)\n", caps); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+/* One of these per context */ -+struct mediabufs_ctl * mediabufs_ctl_new(void * const dc, const char * vpath, struct pollqueue *const pq) -+{ -+ struct mediabufs_ctl *const mbc = calloc(1, sizeof(*mbc)); -+ -+ if (!mbc) -+ return NULL; -+ -+ mbc->dc = dc; -+ // Default mono planar -+ mbc->pq = pq; -+ pthread_mutex_init(&mbc->lock, NULL); -+ -+ /* Pick a default - could we scan for this? */ -+ if (vpath == NULL) -+ vpath = "/dev/media0"; -+ -+ while ((mbc->vfd = open(vpath, O_RDWR)) == -1) -+ { -+ const int err = errno; -+ if (err != EINTR) { -+ request_err(dc, "Failed to open video dev '%s': %s\n", vpath, strerror(err)); -+ goto fail0; -+ } -+ } -+ -+ if (set_capabilities(mbc)) { -+ request_err(dc, "Bad capabilities for video dev '%s'\n", vpath); -+ goto fail1; -+ } -+ -+ mbc->src = queue_new(mbc->vfd); -+ if (!mbc->src) -+ goto fail1; -+ mbc->dst = queue_new(mbc->vfd); -+ if (!mbc->dst) -+ goto fail2; -+ mbc->pt = polltask_new(pq, mbc->vfd, POLLIN | POLLOUT, mediabufs_poll_cb, mbc); -+ if (!mbc->pt) -+ goto fail3; -+ mbc->this_wlm = ff_weak_link_new(mbc); -+ if (!mbc->this_wlm) -+ goto fail4; -+ -+ /* Cannot add polltask now - polling with nothing pending -+ * generates infinite error polls -+ */ -+ return mbc; -+ -+fail4: -+ polltask_delete(&mbc->pt); -+fail3: -+ queue_delete(mbc->dst); -+fail2: -+ queue_delete(mbc->src); -+fail1: -+ close(mbc->vfd); -+fail0: -+ free(mbc); -+ request_info(dc, "%s: FAILED\n", __func__); -+ return NULL; -+} -+ -+ -+ -diff --git a/libavcodec/v4l2_req_media.h b/libavcodec/v4l2_req_media.h -new file mode 100644 -index 0000000000..2f826cfb14 ---- /dev/null -+++ b/libavcodec/v4l2_req_media.h -@@ -0,0 +1,151 @@ -+/* -+e.h -+* -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sub license, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the -+ * next paragraph) shall be included in all copies or substantial portions -+ * of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. -+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR -+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ */ -+ -+#ifndef _MEDIA_H_ -+#define _MEDIA_H_ -+ -+#include -+#include -+ -+struct v4l2_format; -+struct v4l2_fmtdesc; -+struct v4l2_query_ext_ctrl; -+ -+struct pollqueue; -+struct media_request; -+struct media_pool; -+ -+typedef enum media_buf_status { -+ MEDIABUFS_STATUS_SUCCESS = 0, -+ MEDIABUFS_ERROR_OPERATION_FAILED, -+ MEDIABUFS_ERROR_DECODING_ERROR, -+ MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE, -+ MEDIABUFS_ERROR_UNSUPPORTED_RT_FORMAT, -+ MEDIABUFS_ERROR_ALLOCATION_FAILED, -+} MediaBufsStatus; -+ -+struct media_pool * media_pool_new(const char * const media_path, -+ struct pollqueue * const pq, -+ const unsigned int n); -+void media_pool_delete(struct media_pool ** pmp); -+ -+// Obtain a media request -+// Will block if none availible - has a 2sec timeout -+struct media_request * media_request_get(struct media_pool * const mp); -+int media_request_fd(const struct media_request * const req); -+ -+// Start this request -+// Request structure is returned to pool once done -+int media_request_start(struct media_request * const req); -+ -+// Return an *unstarted* media_request to the pool -+// May later be upgraded to allow for aborting a started req -+int media_request_abort(struct media_request ** const preq); -+ -+ -+struct mediabufs_ctl; -+struct qent_src; -+struct qent_dst; -+struct dmabuf_h; -+struct dmabufs_ctl; -+ -+int qent_src_params_set(struct qent_src *const be, const struct timeval * timestamp); -+struct timeval qent_dst_timestamp_get(const struct qent_dst *const be_dst); -+ -+// prealloc -+int qent_src_alloc(struct qent_src *const be_src, const size_t len, struct dmabufs_ctl * dbsc); -+// dbsc may be NULL if realloc not required -+int qent_src_data_copy(struct qent_src *const be_src, const size_t offset, const void *const src, const size_t len, struct dmabufs_ctl * dbsc); -+const struct dmabuf_h * qent_dst_dmabuf(const struct qent_dst *const be, unsigned int plane); -+int qent_dst_dup_fd(const struct qent_dst *const be, unsigned int plane); -+MediaBufsStatus qent_dst_wait(struct qent_dst *const be); -+void qent_dst_delete(struct qent_dst *const be); -+// Returns a qent_dst to its mbc free Q or deletes it if the mbc is dead -+void qent_dst_unref(struct qent_dst ** const pbe_dst); -+struct qent_dst * qent_dst_ref(struct qent_dst * const be_dst); -+ -+const uint8_t * qent_dst_data(struct qent_dst *const be, unsigned int buf_no); -+MediaBufsStatus qent_dst_read_start(struct qent_dst *const be); -+MediaBufsStatus qent_dst_read_stop(struct qent_dst *const be); -+/* Import an fd unattached to any mediabuf */ -+MediaBufsStatus qent_dst_import_fd(struct qent_dst *const be_dst, -+ unsigned int plane, -+ int fd, size_t size); -+ -+MediaBufsStatus mediabufs_start_request(struct mediabufs_ctl *const mbc, -+ struct media_request **const pmreq, -+ struct qent_src **const psrc_be, -+ struct qent_dst *const dst_be, -+ const bool is_final); -+// Get / alloc a dst buffer & associate with a slot -+// If the dst pool is empty then behaviour depends on the fixed flag passed to -+// dst_slots_create. Default is !fixed = unlimited alloc -+struct qent_dst* mediabufs_dst_qent_alloc(struct mediabufs_ctl *const mbc, -+ struct dmabufs_ctl *const dbsc); -+// Create dst slots without alloc -+// If fixed true then qent_alloc will only get slots from this pool and will -+// block until a qent has been unrefed -+MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed); -+ -+MediaBufsStatus mediabufs_stream_on(struct mediabufs_ctl *const mbc); -+MediaBufsStatus mediabufs_stream_off(struct mediabufs_ctl *const mbc); -+const struct v4l2_format *mediabufs_dst_fmt(struct mediabufs_ctl *const mbc); -+ -+typedef int mediabufs_dst_fmt_accept_fn(void * v, const struct v4l2_fmtdesc *fmtdesc); -+ -+MediaBufsStatus mediabufs_dst_fmt_set(struct mediabufs_ctl *const mbc, -+ const unsigned int width, -+ const unsigned int height, -+ mediabufs_dst_fmt_accept_fn *const accept_fn, -+ void *const accept_v); -+struct qent_src *mediabufs_src_qent_get(struct mediabufs_ctl *const mbc); -+void mediabufs_src_qent_abort(struct mediabufs_ctl *const mbc, struct qent_src **const pqe_src); -+ -+int mediabufs_ctl_set_ext_ctrls(struct mediabufs_ctl * mbc, struct media_request * const mreq, -+ struct v4l2_ext_control control_array[], unsigned int n); -+MediaBufsStatus mediabufs_set_ext_ctrl(struct mediabufs_ctl *const mbc, -+ struct media_request * const mreq, -+ unsigned int id, void *data, -+ unsigned int size); -+int mediabufs_ctl_query_ext_ctrls(struct mediabufs_ctl * mbc, struct v4l2_query_ext_ctrl ctrls[], unsigned int n); -+ -+int mediabufs_src_resizable(const struct mediabufs_ctl *const mbc); -+ -+MediaBufsStatus mediabufs_src_fmt_set(struct mediabufs_ctl *const mbc, -+ enum v4l2_buf_type buf_type, -+ const uint32_t pixfmt, -+ const uint32_t width, const uint32_t height, -+ const size_t bufsize); -+ -+MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const rw, -+ struct dmabufs_ctl * const dbsc, -+ unsigned int n); -+ -+struct mediabufs_ctl * mediabufs_ctl_new(void * const dc, -+ const char *vpath, struct pollqueue *const pq); -+void mediabufs_ctl_unref(struct mediabufs_ctl **const pmbc); -+struct mediabufs_ctl * mediabufs_ctl_ref(struct mediabufs_ctl *const mbc); -+ -+ -+#endif -diff --git a/libavcodec/v4l2_req_pollqueue.c b/libavcodec/v4l2_req_pollqueue.c -new file mode 100644 -index 0000000000..cc8a5d4001 ---- /dev/null -+++ b/libavcodec/v4l2_req_pollqueue.c -@@ -0,0 +1,361 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "v4l2_req_pollqueue.h" -+#include "v4l2_req_utils.h" -+ -+ -+struct pollqueue; -+ -+enum polltask_state { -+ POLLTASK_UNQUEUED = 0, -+ POLLTASK_QUEUED, -+ POLLTASK_RUNNING, -+ POLLTASK_Q_KILL, -+ POLLTASK_RUN_KILL, -+}; -+ -+struct polltask { -+ struct polltask *next; -+ struct polltask *prev; -+ struct pollqueue *q; -+ enum polltask_state state; -+ -+ int fd; -+ short events; -+ -+ void (*fn)(void *v, short revents); -+ void * v; -+ -+ uint64_t timeout; /* CLOCK_MONOTONIC time, 0 => never */ -+ sem_t kill_sem; -+}; -+ -+struct pollqueue { -+ atomic_int ref_count; -+ pthread_mutex_t lock; -+ -+ struct polltask *head; -+ struct polltask *tail; -+ -+ bool kill; -+ bool no_prod; -+ int prod_fd; -+ struct polltask *prod_pt; -+ pthread_t worker; -+}; -+ -+struct polltask *polltask_new(struct pollqueue *const pq, -+ const int fd, const short events, -+ void (*const fn)(void *v, short revents), -+ void *const v) -+{ -+ struct polltask *pt; -+ -+ if (!events) -+ return NULL; -+ -+ pt = malloc(sizeof(*pt)); -+ if (!pt) -+ return NULL; -+ -+ *pt = (struct polltask){ -+ .next = NULL, -+ .prev = NULL, -+ .q = pollqueue_ref(pq), -+ .fd = fd, -+ .events = events, -+ .fn = fn, -+ .v = v -+ }; -+ -+ sem_init(&pt->kill_sem, 0, 0); -+ -+ return pt; -+} -+ -+static void pollqueue_rem_task(struct pollqueue *const pq, struct polltask *const pt) -+{ -+ if (pt->prev) -+ pt->prev->next = pt->next; -+ else -+ pq->head = pt->next; -+ if (pt->next) -+ pt->next->prev = pt->prev; -+ else -+ pq->tail = pt->prev; -+ pt->next = NULL; -+ pt->prev = NULL; -+} -+ -+static void polltask_free(struct polltask * const pt) -+{ -+ sem_destroy(&pt->kill_sem); -+ free(pt); -+} -+ -+static int pollqueue_prod(const struct pollqueue *const pq) -+{ -+ static const uint64_t one = 1; -+ return write(pq->prod_fd, &one, sizeof(one)); -+} -+ -+void polltask_delete(struct polltask **const ppt) -+{ -+ struct polltask *const pt = *ppt; -+ struct pollqueue * pq; -+ enum polltask_state state; -+ bool prodme; -+ -+ if (!pt) -+ return; -+ -+ pq = pt->q; -+ pthread_mutex_lock(&pq->lock); -+ state = pt->state; -+ pt->state = (state == POLLTASK_RUNNING) ? POLLTASK_RUN_KILL : POLLTASK_Q_KILL; -+ prodme = !pq->no_prod; -+ pthread_mutex_unlock(&pq->lock); -+ -+ if (state != POLLTASK_UNQUEUED) { -+ if (prodme) -+ pollqueue_prod(pq); -+ while (sem_wait(&pt->kill_sem) && errno == EINTR) -+ /* loop */; -+ } -+ -+ // Leave zapping the ref until we have DQed the PT as might well be -+ // legitimately used in it -+ *ppt = NULL; -+ polltask_free(pt); -+ pollqueue_unref(&pq); -+} -+ -+static uint64_t pollqueue_now(int timeout) -+{ -+ struct timespec now; -+ uint64_t now_ms; -+ -+ if (clock_gettime(CLOCK_MONOTONIC, &now)) -+ return 0; -+ now_ms = (now.tv_nsec / 1000000) + (uint64_t)now.tv_sec * 1000 + timeout; -+ return now_ms ? now_ms : (uint64_t)1; -+} -+ -+void pollqueue_add_task(struct polltask *const pt, const int timeout) -+{ -+ bool prodme = false; -+ struct pollqueue * const pq = pt->q; -+ -+ pthread_mutex_lock(&pq->lock); -+ if (pt->state != POLLTASK_Q_KILL && pt->state != POLLTASK_RUN_KILL) { -+ if (pq->tail) -+ pq->tail->next = pt; -+ else -+ pq->head = pt; -+ pt->prev = pq->tail; -+ pt->next = NULL; -+ pt->state = POLLTASK_QUEUED; -+ pt->timeout = timeout < 0 ? 0 : pollqueue_now(timeout); -+ pq->tail = pt; -+ prodme = !pq->no_prod; -+ } -+ pthread_mutex_unlock(&pq->lock); -+ if (prodme) -+ pollqueue_prod(pq); -+} -+ -+static void *poll_thread(void *v) -+{ -+ struct pollqueue *const pq = v; -+ struct pollfd *a = NULL; -+ size_t asize = 0; -+ -+ pthread_mutex_lock(&pq->lock); -+ do { -+ unsigned int i; -+ unsigned int n = 0; -+ struct polltask *pt; -+ struct polltask *pt_next; -+ uint64_t now = pollqueue_now(0); -+ int timeout = -1; -+ int rv; -+ -+ for (pt = pq->head; pt; pt = pt_next) { -+ int64_t t; -+ -+ pt_next = pt->next; -+ -+ if (pt->state == POLLTASK_Q_KILL) { -+ pollqueue_rem_task(pq, pt); -+ sem_post(&pt->kill_sem); -+ continue; -+ } -+ -+ if (n >= asize) { -+ asize = asize ? asize * 2 : 4; -+ a = realloc(a, asize * sizeof(*a)); -+ if (!a) { -+ request_log("Failed to realloc poll array to %zd\n", asize); -+ goto fail_locked; -+ } -+ } -+ -+ a[n++] = (struct pollfd){ -+ .fd = pt->fd, -+ .events = pt->events -+ }; -+ -+ t = (int64_t)(pt->timeout - now); -+ if (pt->timeout && t < INT_MAX && -+ (timeout < 0 || (int)t < timeout)) -+ timeout = (t < 0) ? 0 : (int)t; -+ } -+ pthread_mutex_unlock(&pq->lock); -+ -+ if ((rv = poll(a, n, timeout)) == -1) { -+ if (errno != EINTR) { -+ request_log("Poll error: %s\n", strerror(errno)); -+ goto fail_unlocked; -+ } -+ } -+ -+ pthread_mutex_lock(&pq->lock); -+ now = pollqueue_now(0); -+ -+ /* Prodding in this loop is pointless and might lead to -+ * infinite looping -+ */ -+ pq->no_prod = true; -+ for (i = 0, pt = pq->head; i < n; ++i, pt = pt_next) { -+ pt_next = pt->next; -+ -+ /* Pending? */ -+ if (a[i].revents || -+ (pt->timeout && (int64_t)(now - pt->timeout) >= 0)) { -+ pollqueue_rem_task(pq, pt); -+ if (pt->state == POLLTASK_QUEUED) -+ pt->state = POLLTASK_RUNNING; -+ if (pt->state == POLLTASK_Q_KILL) -+ pt->state = POLLTASK_RUN_KILL; -+ pthread_mutex_unlock(&pq->lock); -+ -+ /* This can add new entries to the Q but as -+ * those are added to the tail our existing -+ * chain remains intact -+ */ -+ pt->fn(pt->v, a[i].revents); -+ -+ pthread_mutex_lock(&pq->lock); -+ if (pt->state == POLLTASK_RUNNING) -+ pt->state = POLLTASK_UNQUEUED; -+ if (pt->state == POLLTASK_RUN_KILL) -+ sem_post(&pt->kill_sem); -+ } -+ } -+ pq->no_prod = false; -+ -+ } while (!pq->kill); -+ -+fail_locked: -+ pthread_mutex_unlock(&pq->lock); -+fail_unlocked: -+ free(a); -+ return NULL; -+} -+ -+static void prod_fn(void *v, short revents) -+{ -+ struct pollqueue *const pq = v; -+ char buf[8]; -+ if (revents) -+ read(pq->prod_fd, buf, 8); -+ if (!pq->kill) -+ pollqueue_add_task(pq->prod_pt, -1); -+} -+ -+struct pollqueue * pollqueue_new(void) -+{ -+ struct pollqueue *pq = malloc(sizeof(*pq)); -+ if (!pq) -+ return NULL; -+ *pq = (struct pollqueue){ -+ .ref_count = ATOMIC_VAR_INIT(0), -+ .lock = PTHREAD_MUTEX_INITIALIZER, -+ .head = NULL, -+ .tail = NULL, -+ .kill = false, -+ .prod_fd = -1 -+ }; -+ -+ pq->prod_fd = eventfd(0, EFD_NONBLOCK); -+ if (pq->prod_fd == 1) -+ goto fail1; -+ pq->prod_pt = polltask_new(pq, pq->prod_fd, POLLIN, prod_fn, pq); -+ if (!pq->prod_pt) -+ goto fail2; -+ pollqueue_add_task(pq->prod_pt, -1); -+ if (pthread_create(&pq->worker, NULL, poll_thread, pq)) -+ goto fail3; -+ // Reset ref count which will have been inced by the add_task -+ atomic_store(&pq->ref_count, 0); -+ return pq; -+ -+fail3: -+ polltask_free(pq->prod_pt); -+fail2: -+ close(pq->prod_fd); -+fail1: -+ free(pq); -+ return NULL; -+} -+ -+static void pollqueue_free(struct pollqueue *const pq) -+{ -+ void *rv; -+ -+ pthread_mutex_lock(&pq->lock); -+ pq->kill = true; -+ pollqueue_prod(pq); -+ pthread_mutex_unlock(&pq->lock); -+ -+ pthread_join(pq->worker, &rv); -+ polltask_free(pq->prod_pt); -+ pthread_mutex_destroy(&pq->lock); -+ close(pq->prod_fd); -+ free(pq); -+} -+ -+struct pollqueue * pollqueue_ref(struct pollqueue *const pq) -+{ -+ atomic_fetch_add(&pq->ref_count, 1); -+ return pq; -+} -+ -+void pollqueue_unref(struct pollqueue **const ppq) -+{ -+ struct pollqueue * const pq = *ppq; -+ -+ if (!pq) -+ return; -+ *ppq = NULL; -+ -+ if (atomic_fetch_sub(&pq->ref_count, 1) != 0) -+ return; -+ -+ pollqueue_free(pq); -+} -+ -+ -+ -diff --git a/libavcodec/v4l2_req_pollqueue.h b/libavcodec/v4l2_req_pollqueue.h -new file mode 100644 -index 0000000000..e1182cb2fc ---- /dev/null -+++ b/libavcodec/v4l2_req_pollqueue.h -@@ -0,0 +1,18 @@ -+#ifndef POLLQUEUE_H_ -+#define POLLQUEUE_H_ -+ -+struct polltask; -+struct pollqueue; -+ -+struct polltask *polltask_new(struct pollqueue *const pq, -+ const int fd, const short events, -+ void (*const fn)(void *v, short revents), -+ void *const v); -+void polltask_delete(struct polltask **const ppt); -+ -+void pollqueue_add_task(struct polltask *const pt, const int timeout); -+struct pollqueue * pollqueue_new(void); -+void pollqueue_unref(struct pollqueue **const ppq); -+struct pollqueue * pollqueue_ref(struct pollqueue *const pq); -+ -+#endif /* POLLQUEUE_H_ */ -diff --git a/libavcodec/v4l2_req_utils.h b/libavcodec/v4l2_req_utils.h -new file mode 100644 -index 0000000000..a31cc1f4ec ---- /dev/null -+++ b/libavcodec/v4l2_req_utils.h -@@ -0,0 +1,27 @@ -+#ifndef AVCODEC_V4L2_REQ_UTILS_H -+#define AVCODEC_V4L2_REQ_UTILS_H -+ -+#include -+#include "libavutil/log.h" -+ -+#define request_log(...) av_log(NULL, AV_LOG_INFO, __VA_ARGS__) -+ -+#define request_err(_ctx, ...) av_log(_ctx, AV_LOG_ERROR, __VA_ARGS__) -+#define request_warn(_ctx, ...) av_log(_ctx, AV_LOG_WARNING, __VA_ARGS__) -+#define request_info(_ctx, ...) av_log(_ctx, AV_LOG_INFO, __VA_ARGS__) -+#define request_debug(_ctx, ...) av_log(_ctx, AV_LOG_DEBUG, __VA_ARGS__) -+ -+static inline char safechar(char c) { -+ return c > 0x20 && c < 0x7f ? c : '.'; -+} -+ -+static inline const char * strfourcc(char tbuf[5], uint32_t fcc) { -+ tbuf[0] = safechar((fcc >> 0) & 0xff); -+ tbuf[1] = safechar((fcc >> 8) & 0xff); -+ tbuf[2] = safechar((fcc >> 16) & 0xff); -+ tbuf[3] = safechar((fcc >> 24) & 0xff); -+ tbuf[4] = '\0'; -+ return tbuf; -+} -+ -+#endif -diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -new file mode 100644 -index 0000000000..b0a5930844 ---- /dev/null -+++ b/libavcodec/v4l2_request_hevc.c -@@ -0,0 +1,297 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+ -+ -+#include "decode.h" -+#include "hevcdec.h" -+#include "hwconfig.h" -+#include "internal.h" -+ -+#include "v4l2_request_hevc.h" -+ -+#include "libavutil/hwcontext_drm.h" -+ -+#include "v4l2_req_devscan.h" -+#include "v4l2_req_dmabufs.h" -+#include "v4l2_req_pollqueue.h" -+#include "v4l2_req_media.h" -+#include "v4l2_req_utils.h" -+ -+static size_t bit_buf_size(unsigned int w, unsigned int h, unsigned int bits_minus8) -+{ -+ const size_t wxh = w * h; -+ size_t bits_alloc; -+ -+ /* Annex A gives a min compression of 2 @ lvl 3.1 -+ * (wxh <= 983040) and min 4 thereafter but avoid -+ * the odity of 983041 having a lower limit than -+ * 983040. -+ * Multiply by 3/2 for 4:2:0 -+ */ -+ bits_alloc = wxh < 983040 ? wxh * 3 / 4 : -+ wxh < 983040 * 2 ? 983040 * 3 / 4 : -+ wxh * 3 / 8; -+ /* Allow for bit depth */ -+ bits_alloc += (bits_alloc * bits_minus8) / 8; -+ /* Add a few bytes (16k) for overhead */ -+ bits_alloc += 0x4000; -+ return bits_alloc; -+} -+ -+static int v4l2_req_hevc_start_frame(AVCodecContext *avctx, -+ av_unused const uint8_t *buffer, -+ av_unused uint32_t size) -+{ -+ const V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ return ctx->fns->start_frame(avctx, buffer, size); -+} -+ -+static int v4l2_req_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) -+{ -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ return ctx->fns->decode_slice(avctx, buffer, size); -+} -+ -+static int v4l2_req_hevc_end_frame(AVCodecContext *avctx) -+{ -+ V4L2RequestContextHEVC *ctx = avctx->internal->hwaccel_priv_data; -+ return ctx->fns->end_frame(avctx); -+} -+ -+static void v4l2_req_hevc_abort_frame(AVCodecContext * const avctx) -+{ -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ ctx->fns->abort_frame(avctx); -+} -+ -+static int v4l2_req_hevc_frame_params(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx) -+{ -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ return ctx->fns->frame_params(avctx, hw_frames_ctx); -+} -+ -+static int v4l2_req_hevc_alloc_frame(AVCodecContext * avctx, AVFrame *frame) -+{ -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ return ctx->fns->alloc_frame(avctx, frame); -+} -+ -+ -+static int v4l2_request_hevc_uninit(AVCodecContext *avctx) -+{ -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ -+ av_log(avctx, AV_LOG_DEBUG, "<<< %s\n", __func__); -+ -+ decode_q_wait(&ctx->decode_q, NULL); // Wait for all other threads to be out of decode -+ -+ mediabufs_ctl_unref(&ctx->mbufs); -+ media_pool_delete(&ctx->mpool); -+ pollqueue_unref(&ctx->pq); -+ dmabufs_ctl_delete(&ctx->dbufs); -+ devscan_delete(&ctx->devscan); -+ -+ decode_q_uninit(&ctx->decode_q); -+ -+// if (avctx->hw_frames_ctx) { -+// AVHWFramesContext *hwfc = (AVHWFramesContext*)avctx->hw_frames_ctx->data; -+// av_buffer_pool_flush(hwfc->pool); -+// } -+ return 0; -+} -+ -+static int dst_fmt_accept_cb(void * v, const struct v4l2_fmtdesc *fmtdesc) -+{ -+ AVCodecContext *const avctx = v; -+ const HEVCContext *const h = avctx->priv_data; -+ -+ if (h->ps.sps->bit_depth == 8) { -+ if (fmtdesc->pixelformat == V4L2_PIX_FMT_NV12_COL128 || -+ fmtdesc->pixelformat == V4L2_PIX_FMT_NV12) { -+ return 1; -+ } -+ } -+ else if (h->ps.sps->bit_depth == 10) { -+ if (fmtdesc->pixelformat == V4L2_PIX_FMT_NV12_10_COL128) { -+ return 1; -+ } -+ } -+ return 0; -+} -+ -+static int v4l2_request_hevc_init(AVCodecContext *avctx) -+{ -+ const HEVCContext *h = avctx->priv_data; -+ V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; -+ const HEVCSPS * const sps = h->ps.sps; -+ int ret; -+ const struct decdev * decdev; -+ const uint32_t src_pix_fmt = V2(ff_v4l2_req_hevc, 1).src_pix_fmt_v4l2; // Assuming constant for all APIs but avoiding V4L2 includes -+ size_t src_size; -+ -+ av_log(avctx, AV_LOG_DEBUG, "<<< %s\n", __func__); -+ -+ if ((ret = devscan_build(avctx, &ctx->devscan)) != 0) { -+ av_log(avctx, AV_LOG_WARNING, "Failed to find any V4L2 devices\n"); -+ return (AVERROR(-ret)); -+ } -+ ret = AVERROR(ENOMEM); // Assume mem fail by default for these -+ -+ if ((decdev = devscan_find(ctx->devscan, src_pix_fmt)) == NULL) -+ { -+ av_log(avctx, AV_LOG_WARNING, "Failed to find a V4L2 device for H265\n"); -+ ret = AVERROR(ENODEV); -+ goto fail0; -+ } -+ av_log(avctx, AV_LOG_DEBUG, "Trying V4L2 devices: %s,%s\n", -+ decdev_media_path(decdev), decdev_video_path(decdev)); -+ -+ if ((ctx->dbufs = dmabufs_ctl_new()) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "Unable to open dmabufs\n"); -+ goto fail0; -+ } -+ -+ if ((ctx->pq = pollqueue_new()) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "Unable to create pollqueue\n"); -+ goto fail1; -+ } -+ -+ if ((ctx->mpool = media_pool_new(decdev_media_path(decdev), ctx->pq, 4)) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "Unable to create media pool\n"); -+ goto fail2; -+ } -+ -+ if ((ctx->mbufs = mediabufs_ctl_new(avctx, decdev_video_path(decdev), ctx->pq)) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "Unable to create media controls\n"); -+ goto fail3; -+ } -+ -+ // Ask for an initial bitbuf size of max size / 4 -+ // We will realloc if we need more -+ // Must use sps->h/w as avctx contains cropped size -+ src_size = bit_buf_size(sps->width, sps->height, sps->bit_depth - 8); -+ if (mediabufs_src_resizable(ctx->mbufs)) -+ src_size /= 4; -+ // Kludge for conformance tests which break Annex A limits -+ else if (src_size < 0x40000) -+ src_size = 0x40000; -+ -+ if (mediabufs_src_fmt_set(ctx->mbufs, decdev_src_type(decdev), src_pix_fmt, -+ sps->width, sps->height, src_size)) { -+ char tbuf1[5]; -+ av_log(avctx, AV_LOG_ERROR, "Failed to set source format: %s %dx%d\n", strfourcc(tbuf1, src_pix_fmt), sps->width, sps->height); -+ goto fail4; -+ } -+ -+ if (V2(ff_v4l2_req_hevc, 2).probe(avctx, ctx) == 0) { -+ av_log(avctx, AV_LOG_DEBUG, "HEVC API version 2 probed successfully\n"); -+ ctx->fns = &V2(ff_v4l2_req_hevc, 2); -+ } -+ else if (V2(ff_v4l2_req_hevc, 1).probe(avctx, ctx) == 0) { -+ av_log(avctx, AV_LOG_DEBUG, "HEVC API version 1 probed successfully\n"); -+ ctx->fns = &V2(ff_v4l2_req_hevc, 1); -+ } -+ else { -+ av_log(avctx, AV_LOG_ERROR, "No HEVC version probed successfully\n"); -+ ret = AVERROR(EINVAL); -+ goto fail4; -+ } -+ -+ if (mediabufs_dst_fmt_set(ctx->mbufs, sps->width, sps->height, dst_fmt_accept_cb, avctx)) { -+ char tbuf1[5]; -+ av_log(avctx, AV_LOG_ERROR, "Failed to set destination format: %s %dx%d\n", strfourcc(tbuf1, src_pix_fmt), sps->width, sps->height); -+ goto fail4; -+ } -+ -+ if (mediabufs_src_pool_create(ctx->mbufs, ctx->dbufs, 6)) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to create source pool\n"); -+ goto fail4; -+ } -+ -+ { -+ unsigned int dst_slots = sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering + -+ avctx->thread_count + (avctx->extra_hw_frames > 0 ? avctx->extra_hw_frames : 6); -+ av_log(avctx, AV_LOG_DEBUG, "Slots=%d: Reordering=%d, threads=%d, hw+=%d\n", dst_slots, -+ sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering, -+ avctx->thread_count, avctx->extra_hw_frames); -+ -+ // extra_hw_frames is -1 if unset -+ if (mediabufs_dst_slots_create(ctx->mbufs, dst_slots, (avctx->extra_hw_frames > 0))) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to create destination slots\n"); -+ goto fail4; -+ } -+ } -+ -+ if (mediabufs_stream_on(ctx->mbufs)) { -+ av_log(avctx, AV_LOG_ERROR, "Failed stream on\n"); -+ goto fail4; -+ } -+ -+ if ((ret = ff_decode_get_hw_frames_ctx(avctx, AV_HWDEVICE_TYPE_DRM)) != 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to create frame ctx\n"); -+ goto fail4; -+ } -+ -+ if ((ret = ctx->fns->set_controls(avctx, ctx)) != 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed set controls\n"); -+ goto fail5; -+ } -+ -+ decode_q_init(&ctx->decode_q); -+ -+ // Set our s/w format -+ avctx->sw_pix_fmt = ((AVHWFramesContext *)avctx->hw_frames_ctx->data)->sw_format; -+ -+ av_log(avctx, AV_LOG_INFO, "Hwaccel %s; devices: %s,%s\n", -+ ctx->fns->name, -+ decdev_media_path(decdev), decdev_video_path(decdev)); -+ -+ return 0; -+ -+fail5: -+ av_buffer_unref(&avctx->hw_frames_ctx); -+fail4: -+ mediabufs_ctl_unref(&ctx->mbufs); -+fail3: -+ media_pool_delete(&ctx->mpool); -+fail2: -+ pollqueue_unref(&ctx->pq); -+fail1: -+ dmabufs_ctl_delete(&ctx->dbufs); -+fail0: -+ devscan_delete(&ctx->devscan); -+ return ret; -+} -+ -+const AVHWAccel ff_hevc_v4l2request_hwaccel = { -+ .name = "hevc_v4l2request", -+ .type = AVMEDIA_TYPE_VIDEO, -+ .id = AV_CODEC_ID_HEVC, -+ .pix_fmt = AV_PIX_FMT_DRM_PRIME, -+ .alloc_frame = v4l2_req_hevc_alloc_frame, -+ .start_frame = v4l2_req_hevc_start_frame, -+ .decode_slice = v4l2_req_hevc_decode_slice, -+ .end_frame = v4l2_req_hevc_end_frame, -+ .abort_frame = v4l2_req_hevc_abort_frame, -+ .init = v4l2_request_hevc_init, -+ .uninit = v4l2_request_hevc_uninit, -+ .priv_data_size = sizeof(V4L2RequestContextHEVC), -+ .frame_params = v4l2_req_hevc_frame_params, -+ .caps_internal = HWACCEL_CAP_ASYNC_SAFE | HWACCEL_CAP_MT_SAFE, -+}; -diff --git a/libavcodec/v4l2_request_hevc.h b/libavcodec/v4l2_request_hevc.h -new file mode 100644 -index 0000000000..f14f594564 ---- /dev/null -+++ b/libavcodec/v4l2_request_hevc.h -@@ -0,0 +1,102 @@ -+#ifndef AVCODEC_V4L2_REQUEST_HEVC_H -+#define AVCODEC_V4L2_REQUEST_HEVC_H -+ -+#include -+#include -+#include "v4l2_req_decode_q.h" -+ -+#ifndef DRM_FORMAT_NV15 -+#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') -+#endif -+ -+#ifndef DRM_FORMAT_NV20 -+#define DRM_FORMAT_NV20 fourcc_code('N', 'V', '2', '0') -+#endif -+ -+// P030 should be defined in drm_fourcc.h and hopefully will be sometime -+// in the future but until then... -+#ifndef DRM_FORMAT_P030 -+#define DRM_FORMAT_P030 fourcc_code('P', '0', '3', '0') -+#endif -+ -+#ifndef DRM_FORMAT_NV15 -+#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') -+#endif -+ -+#ifndef DRM_FORMAT_NV20 -+#define DRM_FORMAT_NV20 fourcc_code('N', 'V', '2', '0') -+#endif -+ -+#include -+#ifndef V4L2_CID_CODEC_BASE -+#define V4L2_CID_CODEC_BASE V4L2_CID_MPEG_BASE -+#endif -+ -+// V4L2_PIX_FMT_NV12_10_COL128 and V4L2_PIX_FMT_NV12_COL128 should be defined -+// in drm_fourcc.h hopefully will be sometime in the future but until then... -+#ifndef V4L2_PIX_FMT_NV12_10_COL128 -+#define V4L2_PIX_FMT_NV12_10_COL128 v4l2_fourcc('N', 'C', '3', '0') -+#endif -+ -+#ifndef V4L2_PIX_FMT_NV12_COL128 -+#define V4L2_PIX_FMT_NV12_COL128 v4l2_fourcc('N', 'C', '1', '2') /* 12 Y/CbCr 4:2:0 128 pixel wide column */ -+#endif -+ -+#ifndef V4L2_CTRL_FLAG_DYNAMIC_ARRAY -+#define V4L2_CTRL_FLAG_DYNAMIC_ARRAY 0x0800 -+#endif -+ -+#define MAX_SLICES 128 -+ -+#define VCAT(name, version) name##_v##version -+#define V2(n,v) VCAT(n, v) -+#define V(n) V2(n, HEVC_CTRLS_VERSION) -+ -+#define S2(x) #x -+#define STR(x) S2(x) -+ -+// 1 per decoder -+struct v4l2_req_decode_fns; -+ -+typedef struct V4L2RequestContextHEVC { -+// V4L2RequestContext base; -+ const struct v4l2_req_decode_fns * fns; -+ -+ unsigned int timestamp; // ?? maybe uint64_t -+ -+ int multi_slice; -+ int decode_mode; -+ int start_code; -+ int max_slices; -+ -+ req_decode_q decode_q; -+ -+ struct devscan *devscan; -+ struct dmabufs_ctl *dbufs; -+ struct pollqueue *pq; -+ struct media_pool * mpool; -+ struct mediabufs_ctl *mbufs; -+} V4L2RequestContextHEVC; -+ -+typedef struct v4l2_req_decode_fns { -+ int src_pix_fmt_v4l2; -+ const char * name; -+ -+ // Init setup -+ int (*probe)(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx); -+ int (*set_controls)(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx); -+ -+ // Passthrough of hwaccel fns -+ int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); -+ int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size); -+ int (*end_frame)(AVCodecContext *avctx); -+ void (*abort_frame)(AVCodecContext *avctx); -+ int (*frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx); -+ int (*alloc_frame)(AVCodecContext * avctx, AVFrame *frame); -+} v4l2_req_decode_fns; -+ -+ -+extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 1); -+extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 2); -+ -+#endif - -From c99a0fe4d59212079de9bed222114abf95f7c989 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 27 Apr 2021 19:30:36 +0100 -Subject: [PATCH 013/151] Add no_cvt_hw option to ffmpeg - ---- - fftools/ffmpeg.c | 6 ++++-- - fftools/ffmpeg.h | 2 ++ - fftools/ffmpeg_opt.c | 3 +++ - 3 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c -index 15e084f0b2..5dc2cd73c1 100644 ---- a/fftools/ffmpeg.c -+++ b/fftools/ffmpeg.c -@@ -2005,6 +2005,9 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame, int keep_ref - (ifilter->hw_frames_ctx && ifilter->hw_frames_ctx->data != frame->hw_frames_ctx->data)) - need_reinit = 1; - -+ if (no_cvt_hw && fg->graph) -+ need_reinit = 0; -+ - if (sd = av_frame_get_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX)) { - if (!ifilter->displaymatrix || memcmp(sd->data, ifilter->displaymatrix, sizeof(int32_t) * 9)) - need_reinit = 1; -@@ -2274,8 +2277,7 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_ - decoded_frame->top_field_first = ist->top_field_first; - - ist->frames_decoded++; -- -- if (ist->hwaccel_retrieve_data && decoded_frame->format == ist->hwaccel_pix_fmt) { -+ if (!no_cvt_hw && ist->hwaccel_retrieve_data && decoded_frame->format == ist->hwaccel_pix_fmt) { - err = ist->hwaccel_retrieve_data(ist->dec_ctx, decoded_frame); - if (err < 0) - goto fail; -diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h -index f1412f6446..8f478619b3 100644 ---- a/fftools/ffmpeg.h -+++ b/fftools/ffmpeg.h -@@ -729,6 +729,8 @@ extern enum VideoSyncMethod video_sync_method; - extern float frame_drop_threshold; - extern int do_benchmark; - extern int do_benchmark_all; -+extern int no_cvt_hw; -+extern int do_deinterlace; - extern int do_hex_dump; - extern int do_pkt_dump; - extern int copy_ts; -diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c -index 055275d813..761db36588 100644 ---- a/fftools/ffmpeg_opt.c -+++ b/fftools/ffmpeg_opt.c -@@ -71,6 +71,7 @@ enum VideoSyncMethod video_sync_method = VSYNC_AUTO; - float frame_drop_threshold = 0; - int do_benchmark = 0; - int do_benchmark_all = 0; -+int no_cvt_hw = 0; - int do_hex_dump = 0; - int do_pkt_dump = 0; - int copy_ts = 0; -@@ -1427,6 +1428,8 @@ const OptionDef options[] = { - "add timings for benchmarking" }, - { "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all }, - "add timings for each task" }, -+ { "no_cvt_hw", OPT_BOOL | OPT_EXPERT, { &no_cvt_hw }, -+ "do not auto-convert hw frames to sw" }, - { "progress", HAS_ARG | OPT_EXPERT, { .func_arg = opt_progress }, - "write program-readable progress information", "url" }, - { "stdin", OPT_BOOL | OPT_EXPERT, { &stdin_interaction }, - -From 27e0c78a2df53fb2337bee4c383cdb58cbbc717e Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 28 Apr 2021 10:16:39 +0100 -Subject: [PATCH 014/151] Add vout_drm - ---- - configure | 4 + - libavdevice/Makefile | 1 + - libavdevice/alldevices.c | 1 + - libavdevice/drm_vout.c | 638 +++++++++++++++++++++++++++++++++++++++ - 4 files changed, 644 insertions(+) - create mode 100644 libavdevice/drm_vout.c - -diff --git a/configure b/configure -index 199aa2b3d5..49744cab19 100755 ---- a/configure -+++ b/configure -@@ -346,6 +346,7 @@ External library support: - --enable-libnpp enable Nvidia Performance Primitives-based code [no] - --enable-mmal enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no] - --enable-sand enable sand video formats [rpi] -+ --enable-vout-drm enable the vout_drm module - for internal testing only [no] - --disable-nvdec disable Nvidia video decoding acceleration (via hwaccel) [autodetect] - --disable-nvenc disable Nvidia video encoding code [autodetect] - --enable-omx enable OpenMAX IL code [no] -@@ -1940,6 +1941,7 @@ FEATURE_LIST=" - small - static - swscale_alpha -+ vout_drm - " - - # this list should be kept in linking order -@@ -3559,8 +3561,10 @@ sndio_indev_deps="sndio" - sndio_outdev_deps="sndio" - v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" - v4l2_indev_suggest="libv4l2" -+v4l2_outdev_deps="libdrm" - v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h" - v4l2_outdev_suggest="libv4l2" -+vout_drm_outdev_deps="libdrm vout_drm" - vfwcap_indev_deps="vfw32 vfwcap_defines" - xcbgrab_indev_deps="libxcb" - xcbgrab_indev_suggest="libxcb_shm libxcb_shape libxcb_xfixes" -diff --git a/libavdevice/Makefile b/libavdevice/Makefile -index 8a62822b69..36aac30186 100644 ---- a/libavdevice/Makefile -+++ b/libavdevice/Makefile -@@ -48,6 +48,7 @@ OBJS-$(CONFIG_SNDIO_OUTDEV) += sndio_enc.o sndio.o - OBJS-$(CONFIG_V4L2_INDEV) += v4l2.o v4l2-common.o timefilter.o - OBJS-$(CONFIG_V4L2_OUTDEV) += v4l2enc.o v4l2-common.o - OBJS-$(CONFIG_VFWCAP_INDEV) += vfwcap.o -+OBJS-$(CONFIG_VOUT_DRM_OUTDEV) += drm_vout.o - OBJS-$(CONFIG_XCBGRAB_INDEV) += xcbgrab.o - OBJS-$(CONFIG_XV_OUTDEV) += xv.o - -diff --git a/libavdevice/alldevices.c b/libavdevice/alldevices.c -index 8a90fcb5d7..e2a8669f27 100644 ---- a/libavdevice/alldevices.c -+++ b/libavdevice/alldevices.c -@@ -52,6 +52,7 @@ extern const FFOutputFormat ff_sndio_muxer; - extern const AVInputFormat ff_v4l2_demuxer; - extern const FFOutputFormat ff_v4l2_muxer; - extern const AVInputFormat ff_vfwcap_demuxer; -+extern const FFOutputFormat ff_vout_drm_muxer; - extern const AVInputFormat ff_xcbgrab_demuxer; - extern const FFOutputFormat ff_xv_muxer; - -diff --git a/libavdevice/drm_vout.c b/libavdevice/drm_vout.c -new file mode 100644 -index 0000000000..cfb33ce7c3 ---- /dev/null -+++ b/libavdevice/drm_vout.c -@@ -0,0 +1,638 @@ -+/* -+ * Copyright (c) 2020 John Cox for Raspberry Pi Trading -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+ -+// *** This module is a work in progress and its utility is strictly -+// limited to testing. -+ -+#include "libavutil/opt.h" -+#include "libavutil/pixdesc.h" -+#include "libavutil/hwcontext_drm.h" -+#include "libavformat/mux.h" -+#include "avdevice.h" -+ -+#include "pthread.h" -+#include -+#include -+ -+#include -+#include -+ -+#define TRACE_ALL 0 -+ -+#define DRM_MODULE "vc4" -+ -+#define ERRSTR strerror(errno) -+ -+struct drm_setup { -+ int conId; -+ uint32_t crtcId; -+ int crtcIdx; -+ uint32_t planeId; -+ unsigned int out_fourcc; -+ struct { -+ int x, y, width, height; -+ } compose; -+}; -+ -+typedef struct drm_aux_s { -+ unsigned int fb_handle; -+ uint32_t bo_handles[AV_DRM_MAX_PLANES]; -+ AVFrame * frame; -+} drm_aux_t; -+ -+// Aux size should only need to be 2, but on a few streams (Hobbit) under FKMS -+// we get initial flicker probably due to dodgy drm timing -+#define AUX_SIZE 3 -+typedef struct drm_display_env_s -+{ -+ AVClass *class; -+ -+ int drm_fd; -+ uint32_t con_id; -+ struct drm_setup setup; -+ enum AVPixelFormat avfmt; -+ int show_all; -+ -+ unsigned int ano; -+ drm_aux_t aux[AUX_SIZE]; -+ -+ pthread_t q_thread; -+ sem_t q_sem_in; -+ sem_t q_sem_out; -+ int q_terminate; -+ AVFrame * q_next; -+ -+} drm_display_env_t; -+ -+ -+static int drm_vout_write_trailer(AVFormatContext *s) -+{ -+#if TRACE_ALL -+ av_log(s, AV_LOG_DEBUG, "%s\n", __func__); -+#endif -+ -+ return 0; -+} -+ -+static int drm_vout_write_header(AVFormatContext *s) -+{ -+ const AVCodecParameters * const par = s->streams[0]->codecpar; -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_DEBUG, "%s\n", __func__); -+#endif -+ if ( s->nb_streams > 1 -+ || par->codec_type != AVMEDIA_TYPE_VIDEO -+ || par->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME) { -+ av_log(s, AV_LOG_ERROR, "Only supports one wrapped avframe stream\n"); -+ return AVERROR(EINVAL); -+ } -+ -+ return 0; -+} -+ -+static int find_plane(struct AVFormatContext * const avctx, -+ const int drmfd, const int crtcidx, const uint32_t format, -+ uint32_t * const pplane_id) -+{ -+ drmModePlaneResPtr planes; -+ drmModePlanePtr plane; -+ unsigned int i; -+ unsigned int j; -+ int ret = 0; -+ -+ planes = drmModeGetPlaneResources(drmfd); -+ if (!planes) -+ { -+ av_log(avctx, AV_LOG_WARNING, "drmModeGetPlaneResources failed: %s\n", ERRSTR); -+ return -1; -+ } -+ -+ for (i = 0; i < planes->count_planes; ++i) { -+ plane = drmModeGetPlane(drmfd, planes->planes[i]); -+ if (!planes) -+ { -+ av_log(avctx, AV_LOG_WARNING, "drmModeGetPlane failed: %s\n", ERRSTR); -+ break; -+ } -+ -+ if (!(plane->possible_crtcs & (1 << crtcidx))) { -+ drmModeFreePlane(plane); -+ continue; -+ } -+ -+ for (j = 0; j < plane->count_formats; ++j) { -+ if (plane->formats[j] == format) -+ break; -+ } -+ -+ if (j == plane->count_formats) { -+ drmModeFreePlane(plane); -+ continue; -+ } -+ -+ *pplane_id = plane->plane_id; -+ drmModeFreePlane(plane); -+ break; -+ } -+ -+ if (i == planes->count_planes) -+ ret = -1; -+ -+ drmModeFreePlaneResources(planes); -+ return ret; -+} -+ -+static void da_uninit(drm_display_env_t * const de, drm_aux_t * da) -+{ -+ if (da->fb_handle != 0) { -+ drmModeRmFB(de->drm_fd, da->fb_handle); -+ da->fb_handle = 0; -+ } -+ -+ for (unsigned int i = 0; i != AV_DRM_MAX_PLANES; ++i) { -+ if (da->bo_handles[i]) { -+ struct drm_gem_close gem_close = {.handle = da->bo_handles[i]}; -+ drmIoctl(de->drm_fd, DRM_IOCTL_GEM_CLOSE, &gem_close); -+ da->bo_handles[i] = 0; -+ } -+ } -+ av_frame_free(&da->frame); -+} -+ -+static int do_display(AVFormatContext * const s, drm_display_env_t * const de, AVFrame * frame) -+{ -+ const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor*)frame->data[0]; -+ drm_aux_t * da = de->aux + de->ano; -+ const uint32_t format = desc->layers[0].format; -+ int ret = 0; -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_DEBUG, "<<< %s: fd=%d\n", __func__, desc->objects[0].fd); -+#endif -+ -+ if (de->setup.out_fourcc != format) { -+ if (find_plane(s, de->drm_fd, de->setup.crtcIdx, format, &de->setup.planeId)) { -+ av_frame_free(&frame); -+ av_log(s, AV_LOG_WARNING, "No plane for format: %#x\n", format); -+ return -1; -+ } -+ de->setup.out_fourcc = format; -+ } -+ -+ { -+ drmVBlank vbl = { -+ .request = { -+ .type = DRM_VBLANK_RELATIVE, -+ .sequence = 0 -+ } -+ }; -+ -+ while (drmWaitVBlank(de->drm_fd, &vbl)) { -+ if (errno != EINTR) { -+// av_log(s, AV_LOG_WARNING, "drmWaitVBlank failed: %s\n", ERRSTR); -+ break; -+ } -+ } -+ } -+ -+ da_uninit(de, da); -+ -+ { -+ uint32_t pitches[4] = {0}; -+ uint32_t offsets[4] = {0}; -+ uint64_t modifiers[4] = {0}; -+ uint32_t bo_handles[4] = {0}; -+ int i, j, n; -+ -+ da->frame = frame; -+ -+ for (i = 0; i < desc->nb_objects; ++i) { -+ if (drmPrimeFDToHandle(de->drm_fd, desc->objects[i].fd, da->bo_handles + i) != 0) { -+ av_log(s, AV_LOG_WARNING, "drmPrimeFDToHandle[%d](%d) failed: %s\n", i, desc->objects[i].fd, ERRSTR); -+ return -1; -+ } -+ } -+ -+ n = 0; -+ for (i = 0; i < desc->nb_layers; ++i) { -+ for (j = 0; j < desc->layers[i].nb_planes; ++j) { -+ const AVDRMPlaneDescriptor * const p = desc->layers[i].planes + j; -+ const AVDRMObjectDescriptor * const obj = desc->objects + p->object_index; -+ pitches[n] = p->pitch; -+ offsets[n] = p->offset; -+ modifiers[n] = obj->format_modifier; -+ bo_handles[n] = da->bo_handles[p->object_index]; -+ ++n; -+ } -+ } -+ -+#if 1 && TRACE_ALL -+ av_log(s, AV_LOG_DEBUG, "%dx%d, fmt: %x, boh=%d,%d,%d,%d, pitch=%d,%d,%d,%d," -+ " offset=%d,%d,%d,%d, mod=%llx,%llx,%llx,%llx\n", -+ av_frame_cropped_width(frame), -+ av_frame_cropped_height(frame), -+ desc->layers[0].format, -+ bo_handles[0], -+ bo_handles[1], -+ bo_handles[2], -+ bo_handles[3], -+ pitches[0], -+ pitches[1], -+ pitches[2], -+ pitches[3], -+ offsets[0], -+ offsets[1], -+ offsets[2], -+ offsets[3], -+ (long long)modifiers[0], -+ (long long)modifiers[1], -+ (long long)modifiers[2], -+ (long long)modifiers[3] -+ ); -+#endif -+ -+ if (drmModeAddFB2WithModifiers(de->drm_fd, -+ av_frame_cropped_width(frame), -+ av_frame_cropped_height(frame), -+ desc->layers[0].format, bo_handles, -+ pitches, offsets, modifiers, -+ &da->fb_handle, DRM_MODE_FB_MODIFIERS /** 0 if no mods */) != 0) { -+ av_log(s, AV_LOG_WARNING, "drmModeAddFB2WithModifiers failed: %s\n", ERRSTR); -+ return -1; -+ } -+ } -+ -+ ret = drmModeSetPlane(de->drm_fd, de->setup.planeId, de->setup.crtcId, -+ da->fb_handle, 0, -+ de->setup.compose.x, de->setup.compose.y, -+ de->setup.compose.width, -+ de->setup.compose.height, -+ 0, 0, -+ av_frame_cropped_width(frame) << 16, -+ av_frame_cropped_height(frame) << 16); -+ -+ if (ret != 0) { -+ av_log(s, AV_LOG_WARNING, "drmModeSetPlane failed: %s\n", ERRSTR); -+ } -+ -+ de->ano = de->ano + 1 >= AUX_SIZE ? 0 : de->ano + 1; -+ -+ return ret; -+} -+ -+static int do_sem_wait(sem_t * const sem, const int nowait) -+{ -+ while (nowait ? sem_trywait(sem) : sem_wait(sem)) { -+ if (errno != EINTR) -+ return -errno; -+ } -+ return 0; -+} -+ -+static void * display_thread(void * v) -+{ -+ AVFormatContext * const s = v; -+ drm_display_env_t * const de = s->priv_data; -+ int i; -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); -+#endif -+ -+ sem_post(&de->q_sem_out); -+ -+ for (;;) { -+ AVFrame * frame; -+ -+ do_sem_wait(&de->q_sem_in, 0); -+ -+ if (de->q_terminate) -+ break; -+ -+ frame = de->q_next; -+ de->q_next = NULL; -+ sem_post(&de->q_sem_out); -+ -+ do_display(s, de, frame); -+ } -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); -+#endif -+ -+ for (i = 0; i != AUX_SIZE; ++i) -+ da_uninit(de, de->aux + i); -+ -+ av_frame_free(&de->q_next); -+ -+ return NULL; -+} -+ -+static int drm_vout_write_packet(AVFormatContext *s, AVPacket *pkt) -+{ -+ const AVFrame * const src_frame = (AVFrame *)pkt->data; -+ AVFrame * frame; -+ drm_display_env_t * const de = s->priv_data; -+ int ret; -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_DEBUG, "%s\n", __func__); -+#endif -+ -+ if ((src_frame->flags & AV_FRAME_FLAG_CORRUPT) != 0) { -+ av_log(s, AV_LOG_WARNING, "Discard corrupt frame: fmt=%d, ts=%" PRId64 "\n", src_frame->format, src_frame->pts); -+ return 0; -+ } -+ -+ if (src_frame->format == AV_PIX_FMT_DRM_PRIME) { -+ frame = av_frame_alloc(); -+ av_frame_ref(frame, src_frame); -+ } -+ else if (src_frame->format == AV_PIX_FMT_VAAPI) { -+ frame = av_frame_alloc(); -+ frame->format = AV_PIX_FMT_DRM_PRIME; -+ if (av_hwframe_map(frame, src_frame, 0) != 0) -+ { -+ av_log(s, AV_LOG_WARNING, "Failed to map frame (format=%d) to DRM_PRiME\n", src_frame->format); -+ av_frame_free(&frame); -+ return AVERROR(EINVAL); -+ } -+ } -+ else { -+ av_log(s, AV_LOG_WARNING, "Frame (format=%d) not DRM_PRiME\n", src_frame->format); -+ return AVERROR(EINVAL); -+ } -+ -+ ret = do_sem_wait(&de->q_sem_out, !de->show_all); -+ if (ret) { -+ av_frame_free(&frame); -+ } -+ else { -+ de->q_next = frame; -+ sem_post(&de->q_sem_in); -+ } -+ -+ return 0; -+} -+ -+static int drm_vout_write_frame(AVFormatContext *s, int stream_index, AVFrame **ppframe, -+ unsigned flags) -+{ -+ av_log(s, AV_LOG_ERROR, "%s: NIF: idx=%d, flags=%#x\n", __func__, stream_index, flags); -+ return AVERROR_PATCHWELCOME; -+} -+ -+static int drm_vout_control_message(AVFormatContext *s, int type, void *data, size_t data_size) -+{ -+#if TRACE_ALL -+ av_log(s, AV_LOG_DEBUG, "%s: %d\n", __func__, type); -+#endif -+ switch(type) { -+ case AV_APP_TO_DEV_WINDOW_REPAINT: -+ return 0; -+ default: -+ break; -+ } -+ return AVERROR(ENOSYS); -+} -+ -+static int find_crtc(struct AVFormatContext * const avctx, int drmfd, struct drm_setup *s, uint32_t * const pConId) -+{ -+ int ret = -1; -+ int i; -+ drmModeRes *res = drmModeGetResources(drmfd); -+ drmModeConnector *c; -+ -+ if(!res) -+ { -+ printf( "drmModeGetResources failed: %s\n", ERRSTR); -+ return -1; -+ } -+ -+ if (res->count_crtcs <= 0) -+ { -+ printf( "drm: no crts\n"); -+ goto fail_res; -+ } -+ -+ if (!s->conId) { -+ fprintf(stderr, -+ "No connector ID specified. Choosing default from list:\n"); -+ -+ for (i = 0; i < res->count_connectors; i++) { -+ drmModeConnector *con = -+ drmModeGetConnector(drmfd, res->connectors[i]); -+ drmModeEncoder *enc = NULL; -+ drmModeCrtc *crtc = NULL; -+ -+ if (con->encoder_id) { -+ enc = drmModeGetEncoder(drmfd, con->encoder_id); -+ if (enc->crtc_id) { -+ crtc = drmModeGetCrtc(drmfd, enc->crtc_id); -+ } -+ } -+ -+ if (!s->conId && crtc) { -+ s->conId = con->connector_id; -+ s->crtcId = crtc->crtc_id; -+ } -+ -+ av_log(avctx, AV_LOG_DEBUG, "Connector %d (crtc %d): type %d, %dx%d%s\n", -+ con->connector_id, -+ crtc ? crtc->crtc_id : 0, -+ con->connector_type, -+ crtc ? crtc->width : 0, -+ crtc ? crtc->height : 0, -+ (s->conId == (int)con->connector_id ? -+ " (chosen)" : "")); -+ } -+ -+ if (!s->conId) { -+ av_log(avctx, AV_LOG_ERROR, -+ "No suitable enabled connector found.\n"); -+ return -1;; -+ } -+ } -+ -+ s->crtcIdx = -1; -+ -+ for (i = 0; i < res->count_crtcs; ++i) { -+ if (s->crtcId == res->crtcs[i]) { -+ s->crtcIdx = i; -+ break; -+ } -+ } -+ -+ if (s->crtcIdx == -1) -+ { -+ av_log(avctx, AV_LOG_WARNING, "drm: CRTC %u not found\n", s->crtcId); -+ goto fail_res; -+ } -+ -+ if (res->count_connectors <= 0) -+ { -+ av_log(avctx, AV_LOG_WARNING, "drm: no connectors\n"); -+ goto fail_res; -+ } -+ -+ c = drmModeGetConnector(drmfd, s->conId); -+ if (!c) -+ { -+ av_log(avctx, AV_LOG_WARNING, "drmModeGetConnector failed: %s\n", ERRSTR); -+ goto fail_res; -+ } -+ -+ if (!c->count_modes) -+ { -+ av_log(avctx, AV_LOG_WARNING, "connector supports no mode\n"); -+ goto fail_conn; -+ } -+ -+ { -+ drmModeCrtc *crtc = drmModeGetCrtc(drmfd, s->crtcId); -+ s->compose.x = crtc->x; -+ s->compose.y = crtc->y; -+ s->compose.width = crtc->width; -+ s->compose.height = crtc->height; -+ drmModeFreeCrtc(crtc); -+ } -+ -+ if (pConId) -+ *pConId = c->connector_id; -+ ret = 0; -+ -+fail_conn: -+ drmModeFreeConnector(c); -+ -+fail_res: -+ drmModeFreeResources(res); -+ -+ return ret; -+} -+ -+// deinit is called if init fails so no need to clean up explicity here -+static int drm_vout_init(struct AVFormatContext * s) -+{ -+ drm_display_env_t * const de = s->priv_data; -+ int rv; -+ const char * drm_module = DRM_MODULE; -+ -+ av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); -+ -+ de->drm_fd = -1; -+ de->con_id = 0; -+ de->setup = (struct drm_setup){0}; -+ de->q_terminate = 0; -+ -+ if ((de->drm_fd = drmOpen(drm_module, NULL)) < 0) -+ { -+ rv = AVERROR(errno); -+ av_log(s, AV_LOG_ERROR, "Failed to drmOpen %s: %s\n", drm_module, av_err2str(rv)); -+ return rv; -+ } -+ -+ if (find_crtc(s, de->drm_fd, &de->setup, &de->con_id) != 0) -+ { -+ av_log(s, AV_LOG_ERROR, "failed to find valid mode\n"); -+ rv = AVERROR(EINVAL); -+ goto fail_close; -+ } -+ -+ sem_init(&de->q_sem_in, 0, 0); -+ sem_init(&de->q_sem_out, 0, 0); -+ if (pthread_create(&de->q_thread, NULL, display_thread, s)) { -+ rv = AVERROR(errno); -+ av_log(s, AV_LOG_ERROR, "Failed to creatye display thread: %s\n", av_err2str(rv)); -+ goto fail_close; -+ } -+ -+ av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); -+ -+ return 0; -+ -+fail_close: -+ close(de->drm_fd); -+ de->drm_fd = -1; -+ av_log(s, AV_LOG_DEBUG, ">>> %s: FAIL\n", __func__); -+ -+ return rv; -+} -+ -+static void drm_vout_deinit(struct AVFormatContext * s) -+{ -+ drm_display_env_t * const de = s->priv_data; -+ -+ av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); -+ -+ de->q_terminate = 1; -+ sem_post(&de->q_sem_in); -+ pthread_join(de->q_thread, NULL); -+ sem_destroy(&de->q_sem_in); -+ sem_destroy(&de->q_sem_out); -+ -+ for (unsigned int i = 0; i != AUX_SIZE; ++i) -+ da_uninit(de, de->aux + i); -+ -+ av_frame_free(&de->q_next); -+ -+ if (de->drm_fd >= 0) { -+ close(de->drm_fd); -+ de->drm_fd = -1; -+ } -+ -+ av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); -+} -+ -+ -+#define OFFSET(x) offsetof(drm_display_env_t, x) -+static const AVOption options[] = { -+ { "show_all", "show all frames", OFFSET(show_all), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, -+ { NULL } -+}; -+ -+static const AVClass drm_vout_class = { -+ .class_name = "drm vid outdev", -+ .item_name = av_default_item_name, -+ .option = options, -+ .version = LIBAVUTIL_VERSION_INT, -+ .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, -+}; -+ -+FFOutputFormat ff_vout_drm_muxer = { -+ .p = { -+ .name = "vout_drm", -+ .long_name = NULL_IF_CONFIG_SMALL("Drm video output device"), -+ .audio_codec = AV_CODEC_ID_NONE, -+ .video_codec = AV_CODEC_ID_WRAPPED_AVFRAME, -+ .flags = AVFMT_NOFILE | AVFMT_VARIABLE_FPS | AVFMT_NOTIMESTAMPS, -+ .priv_class = &drm_vout_class, -+ }, -+ .priv_data_size = sizeof(drm_display_env_t), -+ .write_header = drm_vout_write_header, -+ .write_packet = drm_vout_write_packet, -+ .write_uncoded_frame = drm_vout_write_frame, -+ .write_trailer = drm_vout_write_trailer, -+ .control_message = drm_vout_control_message, -+ .init = drm_vout_init, -+ .deinit = drm_vout_deinit, -+}; -+ - -From cc536672adf4eefeaec16e9808f583c693ad7819 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 28 Apr 2021 11:34:18 +0100 -Subject: [PATCH 015/151] Add vout_egl - ---- - configure | 6 + - libavdevice/Makefile | 1 + - libavdevice/alldevices.c | 1 + - libavdevice/egl_vout.c | 811 +++++++++++++++++++++++++++++++++++++++ - 4 files changed, 819 insertions(+) - create mode 100644 libavdevice/egl_vout.c - -diff --git a/configure b/configure -index 49744cab19..b41663c794 100755 ---- a/configure -+++ b/configure -@@ -347,6 +347,7 @@ External library support: - --enable-mmal enable Broadcom Multi-Media Abstraction Layer (Raspberry Pi) via MMAL [no] - --enable-sand enable sand video formats [rpi] - --enable-vout-drm enable the vout_drm module - for internal testing only [no] -+ --enable-vout-egl enable the vout_egl module - for internal testing only [no] - --disable-nvdec disable Nvidia video decoding acceleration (via hwaccel) [autodetect] - --disable-nvenc disable Nvidia video encoding code [autodetect] - --enable-omx enable OpenMAX IL code [no] -@@ -1818,6 +1819,7 @@ EXTERNAL_LIBRARY_LIST=" - libdav1d - libdc1394 - libdrm -+ epoxy - libflite - libfontconfig - libfreetype -@@ -1942,6 +1944,7 @@ FEATURE_LIST=" - static - swscale_alpha - vout_drm -+ vout_egl - " - - # this list should be kept in linking order -@@ -3565,6 +3568,8 @@ v4l2_outdev_deps="libdrm" - v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h" - v4l2_outdev_suggest="libv4l2" - vout_drm_outdev_deps="libdrm vout_drm" -+vout_egl_outdev_deps="xlib" -+vout_egl_outdev_select="epoxy" - vfwcap_indev_deps="vfw32 vfwcap_defines" - xcbgrab_indev_deps="libxcb" - xcbgrab_indev_suggest="libxcb_shm libxcb_shape libxcb_xfixes" -@@ -6596,6 +6601,7 @@ enabled libdav1d && require_pkg_config libdav1d "dav1d >= 0.5.0" "dav1d - enabled libdavs2 && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2.h davs2_decoder_open - enabled libdc1394 && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new - enabled libdrm && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion -+enabled epoxy && require_pkg_config epoxy epoxy epoxy/egl.h epoxy_egl_version - enabled libfdk_aac && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen || - { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac && - warn "using libfdk without pkg-config"; } } -diff --git a/libavdevice/Makefile b/libavdevice/Makefile -index 36aac30186..0989cb895f 100644 ---- a/libavdevice/Makefile -+++ b/libavdevice/Makefile -@@ -49,6 +49,7 @@ OBJS-$(CONFIG_V4L2_INDEV) += v4l2.o v4l2-common.o timefilter.o - OBJS-$(CONFIG_V4L2_OUTDEV) += v4l2enc.o v4l2-common.o - OBJS-$(CONFIG_VFWCAP_INDEV) += vfwcap.o - OBJS-$(CONFIG_VOUT_DRM_OUTDEV) += drm_vout.o -+OBJS-$(CONFIG_VOUT_EGL_OUTDEV) += egl_vout.o - OBJS-$(CONFIG_XCBGRAB_INDEV) += xcbgrab.o - OBJS-$(CONFIG_XV_OUTDEV) += xv.o - -diff --git a/libavdevice/alldevices.c b/libavdevice/alldevices.c -index e2a8669f27..ffb410b92d 100644 ---- a/libavdevice/alldevices.c -+++ b/libavdevice/alldevices.c -@@ -53,6 +53,7 @@ extern const AVInputFormat ff_v4l2_demuxer; - extern const FFOutputFormat ff_v4l2_muxer; - extern const AVInputFormat ff_vfwcap_demuxer; - extern const FFOutputFormat ff_vout_drm_muxer; -+extern const FFOutputFormat ff_vout_egl_muxer; - extern const AVInputFormat ff_xcbgrab_demuxer; - extern const FFOutputFormat ff_xv_muxer; - -diff --git a/libavdevice/egl_vout.c b/libavdevice/egl_vout.c -new file mode 100644 -index 0000000000..7b9c610ace ---- /dev/null -+++ b/libavdevice/egl_vout.c -@@ -0,0 +1,811 @@ -+/* -+ * Copyright (c) 2020 John Cox for Raspberry Pi Trading -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+ -+// *** This module is a work in progress and its utility is strictly -+// limited to testing. -+// Amongst other issues it doesn't wait for the pic to be displayed before -+// returning the buffer so flikering does occur. -+ -+#include -+#include -+ -+#include "libavutil/opt.h" -+#include "libavutil/avassert.h" -+#include "libavutil/pixdesc.h" -+#include "libavutil/imgutils.h" -+#include "libavutil/hwcontext_drm.h" -+#include "libavformat/mux.h" -+#include "avdevice.h" -+ -+#include "pthread.h" -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "libavutil/rpi_sand_fns.h" -+ -+#define TRACE_ALL 0 -+ -+struct egl_setup { -+ int conId; -+ -+ Display *dpy; -+ EGLDisplay egl_dpy; -+ EGLContext ctx; -+ EGLSurface surf; -+ Window win; -+ -+ uint32_t crtcId; -+ int crtcIdx; -+ uint32_t planeId; -+ struct { -+ int x, y, width, height; -+ } compose; -+}; -+ -+typedef struct egl_aux_s { -+ int fd; -+ GLuint texture; -+ -+} egl_aux_t; -+ -+typedef struct egl_display_env_s -+{ -+ AVClass *class; -+ -+ struct egl_setup setup; -+ enum AVPixelFormat avfmt; -+ -+ int show_all; -+ int window_width, window_height; -+ int window_x, window_y; -+ int fullscreen; -+ -+ egl_aux_t aux[32]; -+ -+ pthread_t q_thread; -+ pthread_mutex_t q_lock; -+ sem_t display_start_sem; -+ sem_t q_sem; -+ int q_terminate; -+ AVFrame * q_this; -+ AVFrame * q_next; -+ -+} egl_display_env_t; -+ -+ -+/** -+ * Remove window border/decorations. -+ */ -+static void -+no_border( Display *dpy, Window w) -+{ -+ static const unsigned MWM_HINTS_DECORATIONS = (1 << 1); -+ static const int PROP_MOTIF_WM_HINTS_ELEMENTS = 5; -+ -+ typedef struct -+ { -+ unsigned long flags; -+ unsigned long functions; -+ unsigned long decorations; -+ long inputMode; -+ unsigned long status; -+ } PropMotifWmHints; -+ -+ PropMotifWmHints motif_hints; -+ Atom prop, proptype; -+ unsigned long flags = 0; -+ -+ /* setup the property */ -+ motif_hints.flags = MWM_HINTS_DECORATIONS; -+ motif_hints.decorations = flags; -+ -+ /* get the atom for the property */ -+ prop = XInternAtom( dpy, "_MOTIF_WM_HINTS", True ); -+ if (!prop) { -+ /* something went wrong! */ -+ return; -+ } -+ -+ /* not sure this is correct, seems to work, XA_WM_HINTS didn't work */ -+ proptype = prop; -+ -+ XChangeProperty( dpy, w, /* display, window */ -+ prop, proptype, /* property, type */ -+ 32, /* format: 32-bit datums */ -+ PropModeReplace, /* mode */ -+ (unsigned char *) &motif_hints, /* data */ -+ PROP_MOTIF_WM_HINTS_ELEMENTS /* nelements */ -+ ); -+} -+ -+ -+/* -+ * Create an RGB, double-buffered window. -+ * Return the window and context handles. -+ */ -+static int -+make_window(struct AVFormatContext * const s, -+ egl_display_env_t * const de, -+ Display *dpy, EGLDisplay egl_dpy, const char *name, -+ Window *winRet, EGLContext *ctxRet, EGLSurface *surfRet) -+{ -+ int scrnum = DefaultScreen( dpy ); -+ XSetWindowAttributes attr; -+ unsigned long mask; -+ Window root = RootWindow( dpy, scrnum ); -+ Window win; -+ EGLContext ctx; -+ const int fullscreen = de->fullscreen; -+ EGLConfig config; -+ int x = de->window_x; -+ int y = de->window_y; -+ int width = de->window_width ? de->window_width : 1280; -+ int height = de->window_height ? de->window_height : 720; -+ -+ -+ if (fullscreen) { -+ int scrnum = DefaultScreen(dpy); -+ -+ x = 0; y = 0; -+ width = DisplayWidth(dpy, scrnum); -+ height = DisplayHeight(dpy, scrnum); -+ } -+ -+ { -+ EGLint num_configs; -+ static const EGLint attribs[] = { -+ EGL_RED_SIZE, 1, -+ EGL_GREEN_SIZE, 1, -+ EGL_BLUE_SIZE, 1, -+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, -+ EGL_NONE -+ }; -+ -+ if (!eglChooseConfig(egl_dpy, attribs, &config, 1, &num_configs)) { -+ av_log(s, AV_LOG_ERROR, "Error: couldn't get an EGL visual config\n"); -+ return -1; -+ } -+ } -+ -+ { -+ EGLint vid; -+ if (!eglGetConfigAttrib(egl_dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) { -+ av_log(s, AV_LOG_ERROR, "Error: eglGetConfigAttrib() failed\n"); -+ return -1; -+ } -+ -+ { -+ XVisualInfo visTemplate = { -+ .visualid = vid, -+ }; -+ int num_visuals; -+ XVisualInfo *visinfo = XGetVisualInfo(dpy, VisualIDMask, -+ &visTemplate, &num_visuals); -+ -+ /* window attributes */ -+ attr.background_pixel = 0; -+ attr.border_pixel = 0; -+ attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); -+ attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; -+ /* XXX this is a bad way to get a borderless window! */ -+ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; -+ -+ win = XCreateWindow( dpy, root, x, y, width, height, -+ 0, visinfo->depth, InputOutput, -+ visinfo->visual, mask, &attr ); -+ XFree(visinfo); -+ } -+ } -+ -+ if (fullscreen) -+ no_border(dpy, win); -+ -+ /* set hints and properties */ -+ { -+ XSizeHints sizehints; -+ sizehints.x = x; -+ sizehints.y = y; -+ sizehints.width = width; -+ sizehints.height = height; -+ sizehints.flags = USSize | USPosition; -+ XSetNormalHints(dpy, win, &sizehints); -+ XSetStandardProperties(dpy, win, name, name, -+ None, (char **)NULL, 0, &sizehints); -+ } -+ -+ eglBindAPI(EGL_OPENGL_ES_API); -+ -+ { -+ static const EGLint ctx_attribs[] = { -+ EGL_CONTEXT_CLIENT_VERSION, 2, -+ EGL_NONE -+ }; -+ ctx = eglCreateContext(egl_dpy, config, EGL_NO_CONTEXT, ctx_attribs ); -+ if (!ctx) { -+ av_log(s, AV_LOG_ERROR, "Error: eglCreateContext failed\n"); -+ return -1; -+ } -+ } -+ -+ -+ XMapWindow(dpy, win); -+ -+ { -+ EGLSurface surf = eglCreateWindowSurface(egl_dpy, config, (EGLNativeWindowType)win, NULL); -+ if (!surf) { -+ av_log(s, AV_LOG_ERROR, "Error: eglCreateWindowSurface failed\n"); -+ return -1; -+ } -+ -+ if (!eglMakeCurrent(egl_dpy, surf, surf, ctx)) { -+ av_log(s, AV_LOG_ERROR, "Error: eglCreateContext failed\n"); -+ return -1; -+ } -+ -+ *winRet = win; -+ *ctxRet = ctx; -+ *surfRet = surf; -+ } -+ -+ return 0; -+} -+ -+static GLint -+compile_shader(struct AVFormatContext * const avctx, GLenum target, const char *source) -+{ -+ GLuint s = glCreateShader(target); -+ -+ if (s == 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to create shader\n"); -+ return 0; -+ } -+ -+ glShaderSource(s, 1, (const GLchar **) &source, NULL); -+ glCompileShader(s); -+ -+ { -+ GLint ok; -+ glGetShaderiv(s, GL_COMPILE_STATUS, &ok); -+ -+ if (!ok) { -+ GLchar *info; -+ GLint size; -+ -+ glGetShaderiv(s, GL_INFO_LOG_LENGTH, &size); -+ info = malloc(size); -+ -+ glGetShaderInfoLog(s, size, NULL, info); -+ av_log(avctx, AV_LOG_ERROR, "Failed to compile shader: %ssource:\n%s\n", info, source); -+ -+ return 0; -+ } -+ } -+ -+ return s; -+} -+ -+static GLuint link_program(struct AVFormatContext * const s, GLint vs, GLint fs) -+{ -+ GLuint prog = glCreateProgram(); -+ -+ if (prog == 0) { -+ av_log(s, AV_LOG_ERROR, "Failed to create program\n"); -+ return 0; -+ } -+ -+ glAttachShader(prog, vs); -+ glAttachShader(prog, fs); -+ glLinkProgram(prog); -+ -+ { -+ GLint ok; -+ glGetProgramiv(prog, GL_LINK_STATUS, &ok); -+ if (!ok) { -+ /* Some drivers return a size of 1 for an empty log. This is the size -+ * of a log that contains only a terminating NUL character. -+ */ -+ GLint size; -+ GLchar *info = NULL; -+ glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &size); -+ if (size > 1) { -+ info = malloc(size); -+ glGetProgramInfoLog(prog, size, NULL, info); -+ } -+ -+ av_log(s, AV_LOG_ERROR, "Failed to link: %s\n", -+ (info != NULL) ? info : ""); -+ return 0; -+ } -+ } -+ -+ return prog; -+} -+ -+static int -+gl_setup(struct AVFormatContext * const s) -+{ -+ const char *vs = -+ "attribute vec4 pos;\n" -+ "varying vec2 texcoord;\n" -+ "\n" -+ "void main() {\n" -+ " gl_Position = pos;\n" -+ " texcoord.x = (pos.x + 1.0) / 2.0;\n" -+ " texcoord.y = (-pos.y + 1.0) / 2.0;\n" -+ "}\n"; -+ const char *fs = -+ "#extension GL_OES_EGL_image_external : enable\n" -+ "precision mediump float;\n" -+ "uniform samplerExternalOES s;\n" -+ "varying vec2 texcoord;\n" -+ "void main() {\n" -+ " gl_FragColor = texture2D(s, texcoord);\n" -+ "}\n"; -+ -+ GLuint vs_s; -+ GLuint fs_s; -+ GLuint prog; -+ -+ if (!(vs_s = compile_shader(s, GL_VERTEX_SHADER, vs)) || -+ !(fs_s = compile_shader(s, GL_FRAGMENT_SHADER, fs)) || -+ !(prog = link_program(s, vs_s, fs_s))) -+ return -1; -+ -+ glUseProgram(prog); -+ -+ { -+ static const float verts[] = { -+ -1, -1, -+ 1, -1, -+ 1, 1, -+ -1, 1, -+ }; -+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, verts); -+ } -+ -+ glEnableVertexAttribArray(0); -+ return 0; -+} -+ -+static int egl_vout_write_trailer(AVFormatContext *s) -+{ -+#if TRACE_ALL -+ av_log(s, AV_LOG_INFO, "%s\n", __func__); -+#endif -+ -+ return 0; -+} -+ -+static int egl_vout_write_header(AVFormatContext *s) -+{ -+ const AVCodecParameters * const par = s->streams[0]->codecpar; -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_INFO, "%s\n", __func__); -+#endif -+ if ( s->nb_streams > 1 -+ || par->codec_type != AVMEDIA_TYPE_VIDEO -+ || par->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME) { -+ av_log(s, AV_LOG_ERROR, "Only supports one wrapped avframe stream\n"); -+ return AVERROR(EINVAL); -+ } -+ -+ return 0; -+} -+ -+ -+static int do_display(AVFormatContext * const s, egl_display_env_t * const de, AVFrame * const frame) -+{ -+ const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor*)frame->data[0]; -+ egl_aux_t * da = NULL; -+ unsigned int i; -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_INFO, "<<< %s\n", __func__); -+#endif -+ -+ for (i = 0; i != 32; ++i) { -+ if (de->aux[i].fd == -1 || de->aux[i].fd == desc->objects[0].fd) { -+ da = de->aux + i; -+ break; -+ } -+ } -+ -+ if (da == NULL) { -+ av_log(s, AV_LOG_INFO, "%s: Out of handles\n", __func__); -+ return AVERROR(EINVAL); -+ } -+ -+ if (da->texture == 0) { -+ EGLint attribs[50]; -+ EGLint * a = attribs; -+ int i, j; -+ static const EGLint anames[] = { -+ EGL_DMA_BUF_PLANE0_FD_EXT, -+ EGL_DMA_BUF_PLANE0_OFFSET_EXT, -+ EGL_DMA_BUF_PLANE0_PITCH_EXT, -+ EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, -+ EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT, -+ EGL_DMA_BUF_PLANE1_FD_EXT, -+ EGL_DMA_BUF_PLANE1_OFFSET_EXT, -+ EGL_DMA_BUF_PLANE1_PITCH_EXT, -+ EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT, -+ EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT, -+ EGL_DMA_BUF_PLANE2_FD_EXT, -+ EGL_DMA_BUF_PLANE2_OFFSET_EXT, -+ EGL_DMA_BUF_PLANE2_PITCH_EXT, -+ EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT, -+ EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT, -+ }; -+ const EGLint * b = anames; -+ -+ *a++ = EGL_WIDTH; -+ *a++ = av_frame_cropped_width(frame); -+ *a++ = EGL_HEIGHT; -+ *a++ = av_frame_cropped_height(frame); -+ *a++ = EGL_LINUX_DRM_FOURCC_EXT; -+ *a++ = desc->layers[0].format; -+ -+ for (i = 0; i < desc->nb_layers; ++i) { -+ for (j = 0; j < desc->layers[i].nb_planes; ++j) { -+ const AVDRMPlaneDescriptor * const p = desc->layers[i].planes + j; -+ const AVDRMObjectDescriptor * const obj = desc->objects + p->object_index; -+ *a++ = *b++; -+ *a++ = obj->fd; -+ *a++ = *b++; -+ *a++ = p->offset; -+ *a++ = *b++; -+ *a++ = p->pitch; -+ if (obj->format_modifier == 0) { -+ b += 2; -+ } -+ else { -+ *a++ = *b++; -+ *a++ = (EGLint)(obj->format_modifier & 0xFFFFFFFF); -+ *a++ = *b++; -+ *a++ = (EGLint)(obj->format_modifier >> 32); -+ } -+ } -+ } -+ -+ *a = EGL_NONE; -+ -+#if TRACE_ALL -+ for (a = attribs, i = 0; *a != EGL_NONE; a += 2, ++i) { -+ av_log(s, AV_LOG_INFO, "[%2d] %4x: %d\n", i, a[0], a[1]); -+ } -+#endif -+ { -+ const EGLImage image = eglCreateImageKHR(de->setup.egl_dpy, -+ EGL_NO_CONTEXT, -+ EGL_LINUX_DMA_BUF_EXT, -+ NULL, attribs); -+ if (!image) { -+ av_log(s, AV_LOG_ERROR, "Failed to import fd %d\n", desc->objects[0].fd); -+ return -1; -+ } -+ -+ glGenTextures(1, &da->texture); -+ glBindTexture(GL_TEXTURE_EXTERNAL_OES, da->texture); -+ glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -+ glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -+ glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image); -+ -+ eglDestroyImageKHR(de->setup.egl_dpy, image); -+ } -+ -+ da->fd = desc->objects[0].fd; -+ -+#if 0 -+ av_log(s, AV_LOG_INFO, "%dx%d, fmt: %x, boh=%d,%d,%d,%d, pitch=%d,%d,%d,%d," -+ " offset=%d,%d,%d,%d, mod=%llx,%llx,%llx,%llx\n", -+ av_frame_cropped_width(frame), -+ av_frame_cropped_height(frame), -+ desc->layers[0].format, -+ bo_plane_handles[0], -+ bo_plane_handles[1], -+ bo_plane_handles[2], -+ bo_plane_handles[3], -+ pitches[0], -+ pitches[1], -+ pitches[2], -+ pitches[3], -+ offsets[0], -+ offsets[1], -+ offsets[2], -+ offsets[3], -+ (long long)modifiers[0], -+ (long long)modifiers[1], -+ (long long)modifiers[2], -+ (long long)modifiers[3] -+ ); -+#endif -+ } -+ -+ glClearColor(0.5, 0.5, 0.5, 0.5); -+ glClear(GL_COLOR_BUFFER_BIT); -+ -+ glBindTexture(GL_TEXTURE_EXTERNAL_OES, da->texture); -+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4); -+ eglSwapBuffers(de->setup.egl_dpy, de->setup.surf); -+ -+ glDeleteTextures(1, &da->texture); -+ da->texture = 0; -+ da->fd = -1; -+ -+ return 0; -+} -+ -+static void * display_thread(void * v) -+{ -+ AVFormatContext * const s = v; -+ egl_display_env_t * const de = s->priv_data; -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_INFO, "<<< %s\n", __func__); -+#endif -+ { -+ EGLint egl_major, egl_minor; -+ -+ de->setup.dpy = XOpenDisplay(NULL); -+ if (!de->setup.dpy) { -+ av_log(s, AV_LOG_ERROR, "Couldn't open X display\n"); -+ goto fail; -+ } -+ -+ de->setup.egl_dpy = eglGetDisplay(de->setup.dpy); -+ if (!de->setup.egl_dpy) { -+ av_log(s, AV_LOG_ERROR, "eglGetDisplay() failed\n"); -+ goto fail; -+ } -+ -+ if (!eglInitialize(de->setup.egl_dpy, &egl_major, &egl_minor)) { -+ av_log(s, AV_LOG_ERROR, "Error: eglInitialize() failed\n"); -+ goto fail; -+ } -+ -+ av_log(s, AV_LOG_INFO, "EGL version %d.%d\n", egl_major, egl_minor); -+ -+ if (!epoxy_has_egl_extension(de->setup.egl_dpy, "EGL_KHR_image_base")) { -+ av_log(s, AV_LOG_ERROR, "Missing EGL KHR image extension\n"); -+ goto fail; -+ } -+ } -+ -+ if (!de->window_width || !de->window_height) { -+ de->window_width = 1280; -+ de->window_height = 720; -+ } -+ if (make_window(s, de, de->setup.dpy, de->setup.egl_dpy, "ffmpeg-vout", -+ &de->setup.win, &de->setup.ctx, &de->setup.surf)) { -+ av_log(s, AV_LOG_ERROR, "%s: make_window failed\n", __func__); -+ goto fail; -+ } -+ -+ if (gl_setup(s)) { -+ av_log(s, AV_LOG_ERROR, "%s: gl_setup failed\n", __func__); -+ goto fail; -+ } -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_INFO, "--- %s: Start done\n", __func__); -+#endif -+ sem_post(&de->display_start_sem); -+ -+ for (;;) { -+ AVFrame * frame; -+ -+ while (sem_wait(&de->q_sem) != 0) { -+ av_assert0(errno == EINTR); -+ } -+ -+ if (de->q_terminate) -+ break; -+ -+ pthread_mutex_lock(&de->q_lock); -+ frame = de->q_next; -+ de->q_next = NULL; -+ pthread_mutex_unlock(&de->q_lock); -+ -+ do_display(s, de, frame); -+ -+ av_frame_free(&de->q_this); -+ de->q_this = frame; -+ } -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_INFO, ">>> %s\n", __func__); -+#endif -+ -+ return NULL; -+ -+fail: -+#if TRACE_ALL -+ av_log(s, AV_LOG_INFO, ">>> %s: FAIL\n", __func__); -+#endif -+ de->q_terminate = 1; -+ sem_post(&de->display_start_sem); -+ -+ return NULL; -+} -+ -+static int egl_vout_write_packet(AVFormatContext *s, AVPacket *pkt) -+{ -+ const AVFrame * const src_frame = (AVFrame *)pkt->data; -+ AVFrame * frame; -+ egl_display_env_t * const de = s->priv_data; -+ -+#if TRACE_ALL -+ av_log(s, AV_LOG_INFO, "%s\n", __func__); -+#endif -+ -+ if (src_frame->format == AV_PIX_FMT_DRM_PRIME) { -+ frame = av_frame_alloc(); -+ av_frame_ref(frame, src_frame); -+ } -+ else if (src_frame->format == AV_PIX_FMT_VAAPI) { -+ frame = av_frame_alloc(); -+ frame->format = AV_PIX_FMT_DRM_PRIME; -+ if (av_hwframe_map(frame, src_frame, 0) != 0) -+ { -+ av_log(s, AV_LOG_WARNING, "Failed to map frame (format=%d) to DRM_PRiME\n", src_frame->format); -+ av_frame_free(&frame); -+ return AVERROR(EINVAL); -+ } -+ } -+ else { -+ av_log(s, AV_LOG_WARNING, "Frame (format=%d) not DRM_PRiME\n", src_frame->format); -+ return AVERROR(EINVAL); -+ } -+ -+ // Really hacky sync -+ while (de->show_all && de->q_next) { -+ usleep(3000); -+ } -+ -+ pthread_mutex_lock(&de->q_lock); -+ { -+ AVFrame * const t = de->q_next; -+ de->q_next = frame; -+ frame = t; -+ } -+ pthread_mutex_unlock(&de->q_lock); -+ -+ if (frame == NULL) -+ sem_post(&de->q_sem); -+ else -+ av_frame_free(&frame); -+ -+ return 0; -+} -+ -+static int egl_vout_write_frame(AVFormatContext *s, int stream_index, AVFrame **ppframe, -+ unsigned flags) -+{ -+ av_log(s, AV_LOG_ERROR, "%s: NIF: idx=%d, flags=%#x\n", __func__, stream_index, flags); -+ return AVERROR_PATCHWELCOME; -+} -+ -+static int egl_vout_control_message(AVFormatContext *s, int type, void *data, size_t data_size) -+{ -+#if TRACE_ALL -+ av_log(s, AV_LOG_INFO, "%s: %d\n", __func__, type); -+#endif -+ switch(type) { -+ case AV_APP_TO_DEV_WINDOW_REPAINT: -+ return 0; -+ default: -+ break; -+ } -+ return AVERROR(ENOSYS); -+} -+ -+// deinit is called if init fails so no need to clean up explicity here -+static int egl_vout_init(struct AVFormatContext * s) -+{ -+ egl_display_env_t * const de = s->priv_data; -+ unsigned int i; -+ -+ av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); -+ -+ de->setup = (struct egl_setup){0}; -+ -+ for (i = 0; i != 32; ++i) { -+ de->aux[i].fd = -1; -+ } -+ -+ de->q_terminate = 0; -+ pthread_mutex_init(&de->q_lock, NULL); -+ sem_init(&de->q_sem, 0, 0); -+ sem_init(&de->display_start_sem, 0, 0); -+ av_assert0(pthread_create(&de->q_thread, NULL, display_thread, s) == 0); -+ -+ sem_wait(&de->display_start_sem); -+ if (de->q_terminate) { -+ av_log(s, AV_LOG_ERROR, "%s: Display startup failure\n", __func__); -+ return -1; -+ } -+ -+ av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); -+ -+ return 0; -+} -+ -+static void egl_vout_deinit(struct AVFormatContext * s) -+{ -+ egl_display_env_t * const de = s->priv_data; -+ -+ av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); -+ -+ de->q_terminate = 1; -+ sem_post(&de->q_sem); -+ pthread_join(de->q_thread, NULL); -+ sem_destroy(&de->q_sem); -+ pthread_mutex_destroy(&de->q_lock); -+ -+ av_frame_free(&de->q_next); -+ av_frame_free(&de->q_this); -+ -+ av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); -+} -+ -+#define OFFSET(x) offsetof(egl_display_env_t, x) -+static const AVOption options[] = { -+ { "show_all", "show all frames", OFFSET(show_all), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "window_size", "set window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "window_x", "set window x offset", OFFSET(window_x), AV_OPT_TYPE_INT, {.i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "window_y", "set window y offset", OFFSET(window_y), AV_OPT_TYPE_INT, {.i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "fullscreen", "set fullscreen display", OFFSET(fullscreen), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, -+ { NULL } -+ -+}; -+ -+static const AVClass egl_vout_class = { -+ .class_name = "egl vid outdev", -+ .item_name = av_default_item_name, -+ .option = options, -+ .version = LIBAVUTIL_VERSION_INT, -+ .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, -+}; -+ -+FFOutputFormat ff_vout_egl_muxer = { -+ .p = { -+ .name = "vout_egl", -+ .long_name = NULL_IF_CONFIG_SMALL("Egl video output device"), -+ .audio_codec = AV_CODEC_ID_NONE, -+ .video_codec = AV_CODEC_ID_WRAPPED_AVFRAME, -+ .flags = AVFMT_NOFILE | AVFMT_VARIABLE_FPS | AVFMT_NOTIMESTAMPS, -+ .priv_class = &egl_vout_class, -+ }, -+ .priv_data_size = sizeof(egl_display_env_t), -+ .write_header = egl_vout_write_header, -+ .write_packet = egl_vout_write_packet, -+ .write_uncoded_frame = egl_vout_write_frame, -+ .write_trailer = egl_vout_write_trailer, -+ .control_message = egl_vout_control_message, -+ .init = egl_vout_init, -+ .deinit = egl_vout_deinit, -+}; -+ - -From 867bd7c243e66a1c1756878e20df8f35db8025ec Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 28 Apr 2021 12:51:22 +0100 -Subject: [PATCH 016/151] V4L2 stateful rework - ---- - libavcodec/Makefile | 3 +- - libavcodec/v4l2_buffers.c | 556 +++++++++++++++++++++++++++----------- - libavcodec/v4l2_buffers.h | 28 +- - libavcodec/v4l2_context.c | 536 +++++++++++++++++++++++++++--------- - libavcodec/v4l2_context.h | 20 +- - libavcodec/v4l2_m2m.c | 20 +- - libavcodec/v4l2_m2m.h | 31 +++ - libavcodec/v4l2_m2m_dec.c | 446 ++++++++++++++++++++++++++---- - 8 files changed, 1286 insertions(+), 354 deletions(-) - -diff --git a/libavcodec/Makefile b/libavcodec/Makefile -index 2d440b5648..e1aa0ba014 100644 ---- a/libavcodec/Makefile -+++ b/libavcodec/Makefile -@@ -169,7 +169,8 @@ OBJS-$(CONFIG_VIDEODSP) += videodsp.o - OBJS-$(CONFIG_VP3DSP) += vp3dsp.o - OBJS-$(CONFIG_VP56DSP) += vp56dsp.o - OBJS-$(CONFIG_VP8DSP) += vp8dsp.o --OBJS-$(CONFIG_V4L2_M2M) += v4l2_m2m.o v4l2_context.o v4l2_buffers.o v4l2_fmt.o -+OBJS-$(CONFIG_V4L2_M2M) += v4l2_m2m.o v4l2_context.o v4l2_buffers.o v4l2_fmt.o\ -+ weak_link.o - OBJS-$(CONFIG_V4L2_REQUEST) += v4l2_req_media.o v4l2_req_pollqueue.o v4l2_req_dmabufs.o\ - v4l2_req_devscan.o weak_link.o - OBJS-$(CONFIG_WMA_FREQS) += wma_freqs.o -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 3f5471067a..a003934ca1 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -21,6 +21,7 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -+#include - #include - #include - #include -@@ -29,12 +30,14 @@ - #include - #include "libavcodec/avcodec.h" - #include "libavutil/pixdesc.h" -+#include "libavutil/hwcontext.h" - #include "v4l2_context.h" - #include "v4l2_buffers.h" - #include "v4l2_m2m.h" -+#include "weak_link.h" - - #define USEC_PER_SEC 1000000 --static AVRational v4l2_timebase = { 1, USEC_PER_SEC }; -+static const AVRational v4l2_timebase = { 1, USEC_PER_SEC }; - - static inline V4L2m2mContext *buf_to_m2mctx(V4L2Buffer *buf) - { -@@ -51,34 +54,44 @@ static inline AVCodecContext *logger(V4L2Buffer *buf) - static inline AVRational v4l2_get_timebase(V4L2Buffer *avbuf) - { - V4L2m2mContext *s = buf_to_m2mctx(avbuf); -- -- if (s->avctx->pkt_timebase.num) -- return s->avctx->pkt_timebase; -- return s->avctx->time_base; -+ const AVRational tb = s->avctx->pkt_timebase.num ? -+ s->avctx->pkt_timebase : -+ s->avctx->time_base; -+ return tb.num && tb.den ? tb : v4l2_timebase; - } - --static inline void v4l2_set_pts(V4L2Buffer *out, int64_t pts) -+static inline void v4l2_set_pts(V4L2Buffer *out, int64_t pts, int no_rescale) - { -- int64_t v4l2_pts; -- -- if (pts == AV_NOPTS_VALUE) -- pts = 0; -- - /* convert pts to v4l2 timebase */ -- v4l2_pts = av_rescale_q(pts, v4l2_get_timebase(out), v4l2_timebase); -+ const int64_t v4l2_pts = -+ no_rescale ? pts : -+ pts == AV_NOPTS_VALUE ? 0 : -+ av_rescale_q(pts, v4l2_get_timebase(out), v4l2_timebase); - out->buf.timestamp.tv_usec = v4l2_pts % USEC_PER_SEC; - out->buf.timestamp.tv_sec = v4l2_pts / USEC_PER_SEC; - } - --static inline int64_t v4l2_get_pts(V4L2Buffer *avbuf) -+static inline int64_t v4l2_get_pts(V4L2Buffer *avbuf, int no_rescale) - { -- int64_t v4l2_pts; -- - /* convert pts back to encoder timebase */ -- v4l2_pts = (int64_t)avbuf->buf.timestamp.tv_sec * USEC_PER_SEC + -+ const int64_t v4l2_pts = (int64_t)avbuf->buf.timestamp.tv_sec * USEC_PER_SEC + - avbuf->buf.timestamp.tv_usec; - -- return av_rescale_q(v4l2_pts, v4l2_timebase, v4l2_get_timebase(avbuf)); -+ return -+ no_rescale ? v4l2_pts : -+ v4l2_pts == 0 ? AV_NOPTS_VALUE : -+ av_rescale_q(v4l2_pts, v4l2_timebase, v4l2_get_timebase(avbuf)); -+} -+ -+static void set_buf_length(V4L2Buffer *out, unsigned int plane, uint32_t bytesused, uint32_t length) -+{ -+ if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) { -+ out->planes[plane].bytesused = bytesused; -+ out->planes[plane].length = length; -+ } else { -+ out->buf.bytesused = bytesused; -+ out->buf.length = length; -+ } - } - - static enum AVColorPrimaries v4l2_get_color_primaries(V4L2Buffer *buf) -@@ -209,68 +222,143 @@ static enum AVColorTransferCharacteristic v4l2_get_color_trc(V4L2Buffer *buf) - return AVCOL_TRC_UNSPECIFIED; - } - --static void v4l2_free_buffer(void *opaque, uint8_t *unused) -+static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf) - { -- V4L2Buffer* avbuf = opaque; -- V4L2m2mContext *s = buf_to_m2mctx(avbuf); -+ AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; -+ AVDRMLayerDescriptor *layer; - -- if (atomic_fetch_sub(&avbuf->context_refcount, 1) == 1) { -- atomic_fetch_sub_explicit(&s->refcount, 1, memory_order_acq_rel); -+ /* fill the DRM frame descriptor */ -+ drm_desc->nb_objects = avbuf->num_planes; -+ drm_desc->nb_layers = 1; - -- if (s->reinit) { -- if (!atomic_load(&s->refcount)) -- sem_post(&s->refsync); -- } else { -- if (s->draining && V4L2_TYPE_IS_OUTPUT(avbuf->context->type)) { -- /* no need to queue more buffers to the driver */ -- avbuf->status = V4L2BUF_AVAILABLE; -- } -- else if (avbuf->context->streamon) -- ff_v4l2_buffer_enqueue(avbuf); -- } -+ layer = &drm_desc->layers[0]; -+ layer->nb_planes = avbuf->num_planes; -+ -+ for (int i = 0; i < avbuf->num_planes; i++) { -+ layer->planes[i].object_index = i; -+ layer->planes[i].offset = 0; -+ layer->planes[i].pitch = avbuf->plane_info[i].bytesperline; -+ } -+ -+ switch (avbuf->context->av_pix_fmt) { -+ case AV_PIX_FMT_YUYV422: -+ -+ layer->format = DRM_FORMAT_YUYV; -+ layer->nb_planes = 1; -+ -+ break; -+ -+ case AV_PIX_FMT_NV12: -+ case AV_PIX_FMT_NV21: -+ -+ layer->format = avbuf->context->av_pix_fmt == AV_PIX_FMT_NV12 ? -+ DRM_FORMAT_NV12 : DRM_FORMAT_NV21; -+ -+ if (avbuf->num_planes > 1) -+ break; -+ -+ layer->nb_planes = 2; -+ -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = avbuf->plane_info[0].bytesperline * -+ avbuf->context->format.fmt.pix.height; -+ layer->planes[1].pitch = avbuf->plane_info[0].bytesperline; -+ break; -+ -+ case AV_PIX_FMT_YUV420P: -+ -+ layer->format = DRM_FORMAT_YUV420; -+ -+ if (avbuf->num_planes > 1) -+ break; -+ -+ layer->nb_planes = 3; -+ -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = avbuf->plane_info[0].bytesperline * -+ avbuf->context->format.fmt.pix.height; -+ layer->planes[1].pitch = avbuf->plane_info[0].bytesperline >> 1; -+ -+ layer->planes[2].object_index = 0; -+ layer->planes[2].offset = layer->planes[1].offset + -+ ((avbuf->plane_info[0].bytesperline * -+ avbuf->context->format.fmt.pix.height) >> 2); -+ layer->planes[2].pitch = avbuf->plane_info[0].bytesperline >> 1; -+ break; - -- av_buffer_unref(&avbuf->context_ref); -+ default: -+ drm_desc->nb_layers = 0; -+ break; - } -+ -+ return (uint8_t *) drm_desc; - } - --static int v4l2_buf_increase_ref(V4L2Buffer *in) -+static void v4l2_free_bufref(void *opaque, uint8_t *data) - { -- V4L2m2mContext *s = buf_to_m2mctx(in); -+ AVBufferRef * bufref = (AVBufferRef *)data; -+ V4L2Buffer *avbuf = (V4L2Buffer *)bufref->data; -+ struct V4L2Context *ctx = ff_weak_link_lock(&avbuf->context_wl); - -- if (in->context_ref) -- atomic_fetch_add(&in->context_refcount, 1); -- else { -- in->context_ref = av_buffer_ref(s->self_ref); -- if (!in->context_ref) -- return AVERROR(ENOMEM); -+ if (ctx != NULL) { -+ // Buffer still attached to context -+ V4L2m2mContext *s = buf_to_m2mctx(avbuf); - -- in->context_refcount = 1; -- } -+ ff_mutex_lock(&ctx->lock); - -- in->status = V4L2BUF_RET_USER; -- atomic_fetch_add_explicit(&s->refcount, 1, memory_order_relaxed); -+ avbuf->status = V4L2BUF_AVAILABLE; - -- return 0; -+ if (s->draining && V4L2_TYPE_IS_OUTPUT(ctx->type)) { -+ av_log(logger(avbuf), AV_LOG_DEBUG, "%s: Buffer avail\n", ctx->name); -+ /* no need to queue more buffers to the driver */ -+ } -+ else if (ctx->streamon) { -+ av_log(logger(avbuf), AV_LOG_DEBUG, "%s: Buffer requeue\n", ctx->name); -+ avbuf->buf.timestamp.tv_sec = 0; -+ avbuf->buf.timestamp.tv_usec = 0; -+ ff_v4l2_buffer_enqueue(avbuf); // will set to IN_DRIVER -+ } -+ else { -+ av_log(logger(avbuf), AV_LOG_DEBUG, "%s: Buffer freed but streamoff\n", ctx->name); -+ } -+ -+ ff_mutex_unlock(&ctx->lock); -+ } -+ -+ ff_weak_link_unlock(avbuf->context_wl); -+ av_buffer_unref(&bufref); - } - --static int v4l2_buf_to_bufref(V4L2Buffer *in, int plane, AVBufferRef **buf) -+static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) - { -- int ret; -+ struct v4l2_exportbuffer expbuf; -+ int i, ret; - -- if (plane >= in->num_planes) -- return AVERROR(EINVAL); -+ for (i = 0; i < avbuf->num_planes; i++) { -+ memset(&expbuf, 0, sizeof(expbuf)); - -- /* even though most encoders return 0 in data_offset encoding vp8 does require this value */ -- *buf = av_buffer_create((char *)in->plane_info[plane].mm_addr + in->planes[plane].data_offset, -- in->plane_info[plane].length, v4l2_free_buffer, in, 0); -- if (!*buf) -- return AVERROR(ENOMEM); -+ expbuf.index = avbuf->buf.index; -+ expbuf.type = avbuf->buf.type; -+ expbuf.plane = i; - -- ret = v4l2_buf_increase_ref(in); -- if (ret) -- av_buffer_unref(buf); -+ ret = ioctl(buf_to_m2mctx(avbuf)->fd, VIDIOC_EXPBUF, &expbuf); -+ if (ret < 0) -+ return AVERROR(errno); - -- return ret; -+ if (V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type)) { -+ /* drm frame */ -+ avbuf->drm_frame.objects[i].size = avbuf->buf.m.planes[i].length; -+ avbuf->drm_frame.objects[i].fd = expbuf.fd; -+ avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ } else { -+ /* drm frame */ -+ avbuf->drm_frame.objects[0].size = avbuf->buf.length; -+ avbuf->drm_frame.objects[0].fd = expbuf.fd; -+ avbuf->drm_frame.objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ } -+ } -+ -+ return 0; - } - - static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, int size, int offset) -@@ -285,30 +373,50 @@ static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, i - - memcpy((uint8_t*)out->plane_info[plane].mm_addr+offset, data, FFMIN(size, length-offset)); - -- if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) { -- out->planes[plane].bytesused = bytesused; -- out->planes[plane].length = length; -- } else { -- out->buf.bytesused = bytesused; -- out->buf.length = length; -- } -+ set_buf_length(out, plane, bytesused, length); - - return 0; - } - -+static AVBufferRef * wrap_avbuf(V4L2Buffer * const avbuf) -+{ -+ AVBufferRef * bufref = av_buffer_ref(avbuf->context->bufrefs[avbuf->buf.index]); -+ AVBufferRef * newbuf; -+ -+ if (!bufref) -+ return NULL; -+ -+ newbuf = av_buffer_create((uint8_t *)bufref, sizeof(*bufref), v4l2_free_bufref, NULL, 0); -+ if (newbuf == NULL) -+ av_buffer_unref(&bufref); -+ -+ avbuf->status = V4L2BUF_RET_USER; -+ return newbuf; -+} -+ - static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) - { -- int i, ret; -+ int i; - - frame->format = avbuf->context->av_pix_fmt; - -- for (i = 0; i < avbuf->num_planes; i++) { -- ret = v4l2_buf_to_bufref(avbuf, i, &frame->buf[i]); -- if (ret) -- return ret; -+ frame->buf[0] = wrap_avbuf(avbuf); -+ if (frame->buf[0] == NULL) -+ return AVERROR(ENOMEM); -+ -+ if (buf_to_m2mctx(avbuf)->output_drm) { -+ /* 1. get references to the actual data */ -+ frame->data[0] = (uint8_t *) v4l2_get_drm_frame(avbuf); -+ frame->format = AV_PIX_FMT_DRM_PRIME; -+ frame->hw_frames_ctx = av_buffer_ref(avbuf->context->frames_ref); -+ return 0; -+ } -+ - -+ /* 1. get references to the actual data */ -+ for (i = 0; i < avbuf->num_planes; i++) { -+ frame->data[i] = (uint8_t *)avbuf->plane_info[i].mm_addr + avbuf->planes[i].data_offset; - frame->linesize[i] = avbuf->plane_info[i].bytesperline; -- frame->data[i] = frame->buf[i]->data; - } - - /* fixup special cases */ -@@ -337,68 +445,95 @@ static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) - return 0; - } - -+static void cpy_2d(uint8_t * dst, int dst_stride, const uint8_t * src, int src_stride, int w, int h) -+{ -+ if (dst_stride == src_stride && w + 32 >= dst_stride) { -+ memcpy(dst, src, dst_stride * h); -+ } -+ else { -+ while (--h >= 0) { -+ memcpy(dst, src, w); -+ dst += dst_stride; -+ src += src_stride; -+ } -+ } -+} -+ -+static int is_chroma(const AVPixFmtDescriptor *desc, int i, int num_planes) -+{ -+ return i != 0 && !(i == num_planes - 1 && (desc->flags & AV_PIX_FMT_FLAG_ALPHA)); -+} -+ - static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - { -- int i, ret; -- struct v4l2_format fmt = out->context->format; -- int pixel_format = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ? -- fmt.fmt.pix_mp.pixelformat : fmt.fmt.pix.pixelformat; -- int height = V4L2_TYPE_IS_MULTIPLANAR(fmt.type) ? -- fmt.fmt.pix_mp.height : fmt.fmt.pix.height; -- int is_planar_format = 0; -- -- switch (pixel_format) { -- case V4L2_PIX_FMT_YUV420M: -- case V4L2_PIX_FMT_YVU420M: --#ifdef V4L2_PIX_FMT_YUV422M -- case V4L2_PIX_FMT_YUV422M: --#endif --#ifdef V4L2_PIX_FMT_YVU422M -- case V4L2_PIX_FMT_YVU422M: --#endif --#ifdef V4L2_PIX_FMT_YUV444M -- case V4L2_PIX_FMT_YUV444M: --#endif --#ifdef V4L2_PIX_FMT_YVU444M -- case V4L2_PIX_FMT_YVU444M: --#endif -- case V4L2_PIX_FMT_NV12M: -- case V4L2_PIX_FMT_NV21M: -- case V4L2_PIX_FMT_NV12MT_16X16: -- case V4L2_PIX_FMT_NV12MT: -- case V4L2_PIX_FMT_NV16M: -- case V4L2_PIX_FMT_NV61M: -- is_planar_format = 1; -- } -- -- if (!is_planar_format) { -- const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); -- int planes_nb = 0; -- int offset = 0; -- -- for (i = 0; i < desc->nb_components; i++) -- planes_nb = FFMAX(planes_nb, desc->comp[i].plane + 1); -- -- for (i = 0; i < planes_nb; i++) { -- int size, h = height; -- if (i == 1 || i == 2) { -+ int i; -+ int num_planes = 0; -+ int pel_strides[4] = {0}; -+ -+ const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); -+ -+ if ((desc->flags & AV_PIX_FMT_FLAG_HWACCEL) != 0) { -+ av_log(NULL, AV_LOG_ERROR, "%s: HWACCEL cannot be copied\n", __func__); -+ return -1; -+ } -+ -+ for (i = 0; i != desc->nb_components; ++i) { -+ if (desc->comp[i].plane >= num_planes) -+ num_planes = desc->comp[i].plane + 1; -+ pel_strides[desc->comp[i].plane] = desc->comp[i].step; -+ } -+ -+ if (out->num_planes > 1) { -+ if (num_planes != out->num_planes) { -+ av_log(NULL, AV_LOG_ERROR, "%s: Num planes mismatch: %d != %d\n", __func__, num_planes, out->num_planes); -+ return -1; -+ } -+ for (i = 0; i != num_planes; ++i) { -+ int w = frame->width; -+ int h = frame->height; -+ if (is_chroma(desc, i, num_planes)) { -+ w = AV_CEIL_RSHIFT(w, desc->log2_chroma_w); - h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h); - } -- size = frame->linesize[i] * h; -- ret = v4l2_bufref_to_buf(out, 0, frame->data[i], size, offset); -- if (ret) -- return ret; -- offset += size; -+ -+ cpy_2d(out->plane_info[i].mm_addr, out->plane_info[i].bytesperline, -+ frame->data[i], frame->linesize[i], -+ w * pel_strides[i], h); -+ set_buf_length(out, i, out->plane_info[i].bytesperline * h, out->plane_info[i].length); - } -- return 0; - } -+ else -+ { -+ unsigned int offset = 0; -+ -+ for (i = 0; i != num_planes; ++i) { -+ int w = frame->width; -+ int h = frame->height; -+ int dst_stride = out->plane_info[0].bytesperline; -+ uint8_t * const dst = (uint8_t *)out->plane_info[0].mm_addr + offset; -+ -+ if (is_chroma(desc, i, num_planes)) { -+ // Is chroma -+ dst_stride >>= desc->log2_chroma_w; -+ offset += dst_stride * (out->context->height >> desc->log2_chroma_h); -+ w = AV_CEIL_RSHIFT(w, desc->log2_chroma_w); -+ h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h); -+ } -+ else { -+ // Is luma or alpha -+ offset += dst_stride * out->context->height; -+ } -+ if (offset > out->plane_info[0].length) { -+ av_log(NULL, AV_LOG_ERROR, "%s: Plane total %d > buffer size %d\n", __func__, offset, out->plane_info[0].length); -+ return -1; -+ } - -- for (i = 0; i < out->num_planes; i++) { -- ret = v4l2_bufref_to_buf(out, i, frame->buf[i]->data, frame->buf[i]->size, 0); -- if (ret) -- return ret; -+ cpy_2d(dst, dst_stride, -+ frame->data[i], frame->linesize[i], -+ w * pel_strides[i], h); -+ } -+ set_buf_length(out, 0, offset, out->plane_info[0].length); - } -- - return 0; - } - -@@ -410,14 +545,15 @@ static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - - int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - { -- v4l2_set_pts(out, frame->pts); -+ v4l2_set_pts(out, frame->pts, 0); - - return v4l2_buffer_swframe_to_buf(frame, out); - } - --int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) -+int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf, int no_rescale_pts) - { - int ret; -+ V4L2Context * const ctx = avbuf->context; - - av_frame_unref(frame); - -@@ -432,13 +568,22 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) - frame->colorspace = v4l2_get_color_space(avbuf); - frame->color_range = v4l2_get_color_range(avbuf); - frame->color_trc = v4l2_get_color_trc(avbuf); -- frame->pts = v4l2_get_pts(avbuf); -+ frame->pts = v4l2_get_pts(avbuf, no_rescale_pts); - frame->pkt_dts = AV_NOPTS_VALUE; - - /* these values are updated also during re-init in v4l2_process_driver_event */ -- frame->height = avbuf->context->height; -- frame->width = avbuf->context->width; -- frame->sample_aspect_ratio = avbuf->context->sample_aspect_ratio; -+ frame->height = ctx->height; -+ frame->width = ctx->width; -+ frame->sample_aspect_ratio = ctx->sample_aspect_ratio; -+ -+ if (ctx->selection.height && ctx->selection.width) { -+ frame->crop_left = ctx->selection.left < frame->width ? ctx->selection.left : 0; -+ frame->crop_top = ctx->selection.top < frame->height ? ctx->selection.top : 0; -+ frame->crop_right = ctx->selection.left + ctx->selection.width < frame->width ? -+ frame->width - (ctx->selection.left + ctx->selection.width) : 0; -+ frame->crop_bottom = ctx->selection.top + ctx->selection.height < frame->height ? -+ frame->height - (ctx->selection.top + ctx->selection.height) : 0; -+ } - - /* 3. report errors upstream */ - if (avbuf->buf.flags & V4L2_BUF_FLAG_ERROR) { -@@ -451,15 +596,14 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) - - int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf) - { -- int ret; -- - av_packet_unref(pkt); -- ret = v4l2_buf_to_bufref(avbuf, 0, &pkt->buf); -- if (ret) -- return ret; -+ -+ pkt->buf = wrap_avbuf(avbuf); -+ if (pkt->buf == NULL) -+ return AVERROR(ENOMEM); - - pkt->size = V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type) ? avbuf->buf.m.planes[0].bytesused : avbuf->buf.bytesused; -- pkt->data = pkt->buf->data; -+ pkt->data = (uint8_t*)avbuf->plane_info[0].mm_addr + avbuf->planes[0].data_offset; - - if (avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME) - pkt->flags |= AV_PKT_FLAG_KEY; -@@ -469,20 +613,27 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf) - pkt->flags |= AV_PKT_FLAG_CORRUPT; - } - -- pkt->dts = pkt->pts = v4l2_get_pts(avbuf); -+ pkt->dts = pkt->pts = v4l2_get_pts(avbuf, 0); - - return 0; - } - --int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out) -+int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, -+ const void *extdata, size_t extlen, int no_rescale_pts) - { - int ret; - -- ret = v4l2_bufref_to_buf(out, 0, pkt->data, pkt->size, 0); -+ if (extlen) { -+ ret = v4l2_bufref_to_buf(out, 0, extdata, extlen, 0); -+ if (ret) -+ return ret; -+ } -+ -+ ret = v4l2_bufref_to_buf(out, 0, pkt->data, pkt->size, extlen); - if (ret) - return ret; - -- v4l2_set_pts(out, pkt->pts); -+ v4l2_set_pts(out, pkt->pts, no_rescale_pts); - - if (pkt->flags & AV_PKT_FLAG_KEY) - out->flags = V4L2_BUF_FLAG_KEYFRAME; -@@ -490,15 +641,61 @@ int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out) - return 0; - } - --int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) -+int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out) -+{ -+ return ff_v4l2_buffer_avpkt_to_buf_ext(pkt, out, NULL, 0, 0); -+} -+ -+ -+static void v4l2_buffer_buffer_free(void *opaque, uint8_t *data) -+{ -+ V4L2Buffer * const avbuf = (V4L2Buffer *)data; -+ int i; -+ -+ for (i = 0; i != FF_ARRAY_ELEMS(avbuf->plane_info); ++i) { -+ struct V4L2Plane_info *p = avbuf->plane_info + i; -+ if (p->mm_addr != NULL) -+ munmap(p->mm_addr, p->length); -+ } -+ -+ for (i = 0; i != FF_ARRAY_ELEMS(avbuf->drm_frame.objects); ++i) { -+ if (avbuf->drm_frame.objects[i].fd != -1) -+ close(avbuf->drm_frame.objects[i].fd); -+ } -+ -+ ff_weak_link_unref(&avbuf->context_wl); -+ -+ av_free(avbuf); -+} -+ -+ -+int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ctx) - { -- V4L2Context *ctx = avbuf->context; - int ret, i; -+ V4L2Buffer * const avbuf = av_mallocz(sizeof(*avbuf)); -+ AVBufferRef * bufref; -+ -+ *pbufref = NULL; -+ if (avbuf == NULL) -+ return AVERROR(ENOMEM); -+ -+ bufref = av_buffer_create((uint8_t*)avbuf, sizeof(*avbuf), v4l2_buffer_buffer_free, NULL, 0); -+ if (bufref == NULL) { -+ av_free(avbuf); -+ return AVERROR(ENOMEM); -+ } - -+ avbuf->context = ctx; - avbuf->buf.memory = V4L2_MEMORY_MMAP; - avbuf->buf.type = ctx->type; - avbuf->buf.index = index; - -+ for (i = 0; i != FF_ARRAY_ELEMS(avbuf->drm_frame.objects); ++i) { -+ avbuf->drm_frame.objects[i].fd = -1; -+ } -+ -+ avbuf->context_wl = ff_weak_link_ref(ctx->wl_master); -+ - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { - avbuf->buf.length = VIDEO_MAX_PLANES; - avbuf->buf.m.planes = avbuf->planes; -@@ -506,7 +703,7 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) - - ret = ioctl(buf_to_m2mctx(avbuf)->fd, VIDIOC_QUERYBUF, &avbuf->buf); - if (ret < 0) -- return AVERROR(errno); -+ goto fail; - - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { - avbuf->num_planes = 0; -@@ -526,25 +723,33 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) - - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { - avbuf->plane_info[i].length = avbuf->buf.m.planes[i].length; -- avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length, -- PROT_READ | PROT_WRITE, MAP_SHARED, -- buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset); -+ -+ if ((V4L2_TYPE_IS_OUTPUT(ctx->type) && buf_to_m2mctx(avbuf)->output_drm) || -+ !buf_to_m2mctx(avbuf)->output_drm) { -+ avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length, -+ PROT_READ | PROT_WRITE, MAP_SHARED, -+ buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset); -+ } - } else { - avbuf->plane_info[i].length = avbuf->buf.length; -- avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length, -- PROT_READ | PROT_WRITE, MAP_SHARED, -- buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.offset); -+ -+ if ((V4L2_TYPE_IS_OUTPUT(ctx->type) && buf_to_m2mctx(avbuf)->output_drm) || -+ !buf_to_m2mctx(avbuf)->output_drm) { -+ avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length, -+ PROT_READ | PROT_WRITE, MAP_SHARED, -+ buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.offset); -+ } - } - -- if (avbuf->plane_info[i].mm_addr == MAP_FAILED) -- return AVERROR(ENOMEM); -+ if (avbuf->plane_info[i].mm_addr == MAP_FAILED) { -+ avbuf->plane_info[i].mm_addr = NULL; -+ ret = AVERROR(ENOMEM); -+ goto fail; -+ } - } - - avbuf->status = V4L2BUF_AVAILABLE; - -- if (V4L2_TYPE_IS_OUTPUT(ctx->type)) -- return 0; -- - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { - avbuf->buf.m.planes = avbuf->planes; - avbuf->buf.length = avbuf->num_planes; -@@ -554,7 +759,20 @@ int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index) - avbuf->buf.length = avbuf->planes[0].length; - } - -- return ff_v4l2_buffer_enqueue(avbuf); -+ if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) { -+ if (buf_to_m2mctx(avbuf)->output_drm) { -+ ret = v4l2_buffer_export_drm(avbuf); -+ if (ret) -+ goto fail; -+ } -+ } -+ -+ *pbufref = bufref; -+ return 0; -+ -+fail: -+ av_buffer_unref(&bufref); -+ return ret; - } - - int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf) -@@ -563,9 +781,27 @@ int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf) - - avbuf->buf.flags = avbuf->flags; - -+ if (avbuf->buf.timestamp.tv_sec || avbuf->buf.timestamp.tv_usec) { -+ av_log(logger(avbuf), AV_LOG_DEBUG, "--- %s pre VIDIOC_QBUF: index %d, ts=%ld.%06ld count=%d\n", -+ avbuf->context->name, avbuf->buf.index, -+ avbuf->buf.timestamp.tv_sec, avbuf->buf.timestamp.tv_usec, -+ avbuf->context->q_count); -+ } -+ - ret = ioctl(buf_to_m2mctx(avbuf)->fd, VIDIOC_QBUF, &avbuf->buf); -- if (ret < 0) -- return AVERROR(errno); -+ if (ret < 0) { -+ int err = errno; -+ av_log(logger(avbuf), AV_LOG_ERROR, "--- %s VIDIOC_QBUF: index %d FAIL err %d (%s)\n", -+ avbuf->context->name, avbuf->buf.index, -+ err, strerror(err)); -+ return AVERROR(err); -+ } -+ -+ ++avbuf->context->q_count; -+ av_log(logger(avbuf), AV_LOG_DEBUG, "--- %s VIDIOC_QBUF: index %d, ts=%ld.%06ld count=%d\n", -+ avbuf->context->name, avbuf->buf.index, -+ avbuf->buf.timestamp.tv_sec, avbuf->buf.timestamp.tv_usec, -+ avbuf->context->q_count); - - avbuf->status = V4L2BUF_IN_DRIVER; - -diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h -index 3d2ff1b9a5..111526aee3 100644 ---- a/libavcodec/v4l2_buffers.h -+++ b/libavcodec/v4l2_buffers.h -@@ -28,27 +28,37 @@ - #include - #include - -+#include "avcodec.h" - #include "libavutil/buffer.h" - #include "libavutil/frame.h" -+#include "libavutil/hwcontext_drm.h" - #include "packet.h" - - enum V4L2Buffer_status { - V4L2BUF_AVAILABLE, - V4L2BUF_IN_DRIVER, -+ V4L2BUF_IN_USE, - V4L2BUF_RET_USER, - }; - - /** - * V4L2Buffer (wrapper for v4l2_buffer management) - */ -+struct V4L2Context; -+struct ff_weak_link_client; -+ - typedef struct V4L2Buffer { -- /* each buffer needs to have a reference to its context */ -+ /* each buffer needs to have a reference to its context -+ * The pointer is good enough for most operation but once the buffer has -+ * been passed to the user the buffer may become orphaned so for free ops -+ * the weak link must be used to ensure that the context is actually -+ * there -+ */ - struct V4L2Context *context; -+ struct ff_weak_link_client *context_wl; - -- /* This object is refcounted per-plane, so we need to keep track -- * of how many context-refs we are holding. */ -- AVBufferRef *context_ref; -- atomic_uint context_refcount; -+ /* DRM descriptor */ -+ AVDRMFrameDescriptor drm_frame; - - /* keep track of the mmap address and mmap length */ - struct V4L2Plane_info { -@@ -73,11 +83,12 @@ typedef struct V4L2Buffer { - * - * @param[in] frame The AVFRame to push the information to - * @param[in] buf The V4L2Buffer to get the information from -+ * @param[in] no_rescale_pts If non-zero do not rescale PTS - * - * @returns 0 in case of success, AVERROR(EINVAL) if the number of planes is incorrect, - * AVERROR(ENOMEM) if the AVBufferRef can't be created. - */ --int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *buf); -+int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *buf, int no_rescale_pts); - - /** - * Extracts the data from a V4L2Buffer to an AVPacket -@@ -101,6 +112,9 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *buf); - */ - int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out); - -+int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, -+ const void *extdata, size_t extlen, int no_rescale_pts); -+ - /** - * Extracts the data from an AVFrame to a V4L2Buffer - * -@@ -119,7 +133,7 @@ int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out); - * - * @returns 0 in case of success, a negative AVERROR code otherwise - */ --int ff_v4l2_buffer_initialize(V4L2Buffer* avbuf, int index); -+int ff_v4l2_buffer_initialize(AVBufferRef **avbuf, int index, struct V4L2Context *ctx); - - /** - * Enqueues a V4L2Buffer -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index a40be94690..be76068af3 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -27,11 +27,13 @@ - #include - #include - #include -+#include "libavutil/avassert.h" - #include "libavcodec/avcodec.h" - #include "decode.h" - #include "v4l2_buffers.h" - #include "v4l2_fmt.h" - #include "v4l2_m2m.h" -+#include "weak_link.h" - - struct v4l2_format_update { - uint32_t v4l2_fmt; -@@ -153,21 +155,99 @@ static inline void v4l2_save_to_context(V4L2Context* ctx, struct v4l2_format_upd - } - } - --static int v4l2_start_decode(V4L2Context *ctx) -+static int get_default_selection(V4L2Context * const ctx, struct v4l2_rect *r) - { -- struct v4l2_decoder_cmd cmd = { -- .cmd = V4L2_DEC_CMD_START, -- .flags = 0, -+ V4L2m2mContext * const s = ctx_to_m2mctx(ctx); -+ struct v4l2_selection selection = { -+ .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, -+ .target = V4L2_SEL_TGT_COMPOSE - }; -- int ret; - -- ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_DECODER_CMD, &cmd); -- if (ret) -+ memset(r, 0, sizeof(*r)); -+ if (ioctl(s->fd, VIDIOC_G_SELECTION, &selection)) - return AVERROR(errno); - -+ *r = selection.r; - return 0; - } - -+static int do_source_change(V4L2m2mContext * const s) -+{ -+ AVCodecContext *const avctx = s->avctx; -+ -+ int ret; -+ int reinit; -+ int full_reinit; -+ struct v4l2_format cap_fmt = s->capture.format; -+ -+ s->resize_pending = 0; -+ s->capture.done = 0; -+ -+ ret = ioctl(s->fd, VIDIOC_G_FMT, &cap_fmt); -+ if (ret) { -+ av_log(avctx, AV_LOG_ERROR, "%s VIDIOC_G_FMT failed\n", s->capture.name); -+ return 0; -+ } -+ -+ s->output.sample_aspect_ratio = v4l2_get_sar(&s->output); -+ -+ get_default_selection(&s->capture, &s->capture.selection); -+ -+ reinit = v4l2_resolution_changed(&s->capture, &cap_fmt); -+ if (reinit) { -+ s->capture.height = v4l2_get_height(&cap_fmt); -+ s->capture.width = v4l2_get_width(&cap_fmt); -+ } -+ s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture); -+ -+ av_log(avctx, AV_LOG_DEBUG, "Source change: SAR: %d/%d, crop %dx%d @ %d,%d\n", -+ s->capture.sample_aspect_ratio.num, s->capture.sample_aspect_ratio.den, -+ s->capture.selection.width, s->capture.selection.height, -+ s->capture.selection.left, s->capture.selection.top); -+ -+ s->reinit = 1; -+ -+ if (reinit) { -+ if (avctx) -+ ret = ff_set_dimensions(s->avctx, s->capture.width, s->capture.height); -+ if (ret < 0) -+ av_log(avctx, AV_LOG_WARNING, "update avcodec height and width failed\n"); -+ -+ ret = ff_v4l2_m2m_codec_reinit(s); -+ if (ret) { -+ av_log(avctx, AV_LOG_ERROR, "v4l2_m2m_codec_reinit failed\n"); -+ return AVERROR(EINVAL); -+ } -+ goto reinit_run; -+ } -+ -+ /* Buffers are OK so just stream off to ack */ -+ av_log(avctx, AV_LOG_DEBUG, "%s: Parameters only\n", __func__); -+ -+ ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF); -+ if (ret) -+ av_log(avctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF failed\n"); -+ s->draining = 0; -+ -+ /* reinit executed */ -+reinit_run: -+ ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMON); -+ return 1; -+} -+ -+static int ctx_done(V4L2Context * const ctx) -+{ -+ int rv = 0; -+ V4L2m2mContext * const s = ctx_to_m2mctx(ctx); -+ -+ ctx->done = 1; -+ -+ if (s->resize_pending && !V4L2_TYPE_IS_OUTPUT(ctx->type)) -+ rv = do_source_change(s); -+ -+ return rv; -+} -+ - /** - * handle resolution change event and end of stream event - * returns 1 if reinit was successful, negative if it failed -@@ -175,8 +255,7 @@ static int v4l2_start_decode(V4L2Context *ctx) - */ - static int v4l2_handle_event(V4L2Context *ctx) - { -- V4L2m2mContext *s = ctx_to_m2mctx(ctx); -- struct v4l2_format cap_fmt = s->capture.format; -+ V4L2m2mContext * const s = ctx_to_m2mctx(ctx); - struct v4l2_event evt = { 0 }; - int ret; - -@@ -186,44 +265,22 @@ static int v4l2_handle_event(V4L2Context *ctx) - return 0; - } - -+ av_log(logger(ctx), AV_LOG_INFO, "Dq event %d\n", evt.type); -+ - if (evt.type == V4L2_EVENT_EOS) { -- ctx->done = 1; -+// ctx->done = 1; -+ av_log(logger(ctx), AV_LOG_TRACE, "%s VIDIOC_EVENT_EOS\n", ctx->name); - return 0; - } - - if (evt.type != V4L2_EVENT_SOURCE_CHANGE) - return 0; - -- ret = ioctl(s->fd, VIDIOC_G_FMT, &cap_fmt); -- if (ret) { -- av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_G_FMT\n", s->capture.name); -- return 0; -- } -- -- if (v4l2_resolution_changed(&s->capture, &cap_fmt)) { -- s->capture.height = v4l2_get_height(&cap_fmt); -- s->capture.width = v4l2_get_width(&cap_fmt); -- s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture); -- } else { -- v4l2_start_decode(ctx); -+ s->resize_pending = 1; -+ if (!ctx->done) - return 0; -- } -- -- s->reinit = 1; -- -- if (s->avctx) -- ret = ff_set_dimensions(s->avctx, s->capture.width, s->capture.height); -- if (ret < 0) -- av_log(logger(ctx), AV_LOG_WARNING, "update avcodec height and width\n"); -- -- ret = ff_v4l2_m2m_codec_reinit(s); -- if (ret) { -- av_log(logger(ctx), AV_LOG_ERROR, "v4l2_m2m_codec_reinit\n"); -- return AVERROR(EINVAL); -- } - -- /* reinit executed */ -- return 1; -+ return do_source_change(s); - } - - static int v4l2_stop_decode(V4L2Context *ctx) -@@ -266,8 +323,26 @@ static int v4l2_stop_encode(V4L2Context *ctx) - return 0; - } - -+static int count_in_driver(const V4L2Context * const ctx) -+{ -+ int i; -+ int n = 0; -+ -+ if (!ctx->bufrefs) -+ return -1; -+ -+ for (i = 0; i < ctx->num_buffers; ++i) { -+ V4L2Buffer *const avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -+ if (avbuf->status == V4L2BUF_IN_DRIVER) -+ ++n; -+ } -+ return n; -+} -+ - static V4L2Buffer* v4l2_dequeue_v4l2buf(V4L2Context *ctx, int timeout) - { -+ V4L2m2mContext * const s = ctx_to_m2mctx(ctx); -+ const int is_capture = !V4L2_TYPE_IS_OUTPUT(ctx->type); - struct v4l2_plane planes[VIDEO_MAX_PLANES]; - struct v4l2_buffer buf = { 0 }; - V4L2Buffer *avbuf; -@@ -276,50 +351,84 @@ static V4L2Buffer* v4l2_dequeue_v4l2buf(V4L2Context *ctx, int timeout) - .fd = ctx_to_m2mctx(ctx)->fd, - }; - int i, ret; -+ int no_rx_means_done = 0; - -- if (!V4L2_TYPE_IS_OUTPUT(ctx->type) && ctx->buffers) { -+ if (is_capture && ctx->bufrefs) { - for (i = 0; i < ctx->num_buffers; i++) { -- if (ctx->buffers[i].status == V4L2BUF_IN_DRIVER) -+ avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -+ if (avbuf->status == V4L2BUF_IN_DRIVER) - break; - } - if (i == ctx->num_buffers) -- av_log(logger(ctx), AV_LOG_WARNING, "All capture buffers returned to " -+ av_log(logger(ctx), AV_LOG_WARNING, "All capture buffers (%d) returned to " - "userspace. Increase num_capture_buffers " - "to prevent device deadlock or dropped " -- "packets/frames.\n"); -+ "packets/frames.\n", i); - } - -+#if 0 -+ // I think this is true but pointless -+ // we will get some other form of EOF signal -+ - /* if we are draining and there are no more capture buffers queued in the driver we are done */ -- if (!V4L2_TYPE_IS_OUTPUT(ctx->type) && ctx_to_m2mctx(ctx)->draining) { -+ if (is_capture && ctx_to_m2mctx(ctx)->draining) { - for (i = 0; i < ctx->num_buffers; i++) { - /* capture buffer initialization happens during decode hence - * detection happens at runtime - */ -- if (!ctx->buffers) -+ if (!ctx->bufrefs) - break; - -- if (ctx->buffers[i].status == V4L2BUF_IN_DRIVER) -+ avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -+ if (avbuf->status == V4L2BUF_IN_DRIVER) - goto start; - } - ctx->done = 1; - return NULL; - } -+#endif - - start: -- if (V4L2_TYPE_IS_OUTPUT(ctx->type)) -- pfd.events = POLLOUT | POLLWRNORM; -- else { -+ if (is_capture) { - /* no need to listen to requests for more input while draining */ - if (ctx_to_m2mctx(ctx)->draining) - pfd.events = POLLIN | POLLRDNORM | POLLPRI; -+ } else { -+ pfd.events = POLLOUT | POLLWRNORM; - } -+ no_rx_means_done = s->resize_pending && is_capture; - - for (;;) { -- ret = poll(&pfd, 1, timeout); -+ // If we have a resize pending then all buffers should be Qed -+ // With a resize pending we should be in drain but evidence suggests -+ // that not all decoders do this so poll to clear -+ int t2 = no_rx_means_done ? 0 : timeout < 0 ? 3000 : timeout; -+ const int e = pfd.events; -+ -+ ret = poll(&pfd, 1, t2); -+ - if (ret > 0) - break; -- if (errno == EINTR) -- continue; -+ -+ if (ret < 0) { -+ int err = errno; -+ if (err == EINTR) -+ continue; -+ av_log(logger(ctx), AV_LOG_ERROR, "=== poll error %d (%s): events=%#x, cap buffers=%d\n", -+ err, strerror(err), -+ e, count_in_driver(ctx)); -+ return NULL; -+ } -+ -+ // ret == 0 (timeout) -+ if (no_rx_means_done) { -+ av_log(logger(ctx), AV_LOG_DEBUG, "Ctx done on timeout\n"); -+ ret = ctx_done(ctx); -+ if (ret > 0) -+ goto start; -+ } -+ if (timeout == -1) -+ av_log(logger(ctx), AV_LOG_ERROR, "=== poll unexpected TIMEOUT: events=%#x, cap buffers=%d\n", e, count_in_driver(ctx));; - return NULL; - } - -@@ -329,7 +438,8 @@ start: - no need to raise a warning */ - if (timeout == 0) { - for (i = 0; i < ctx->num_buffers; i++) { -- if (ctx->buffers[i].status != V4L2BUF_AVAILABLE) -+ avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -+ if (avbuf->status != V4L2BUF_AVAILABLE) - av_log(logger(ctx), AV_LOG_WARNING, "%s POLLERR\n", ctx->name); - } - } -@@ -347,22 +457,25 @@ start: - ctx->done = 1; - return NULL; - } -- if (ret) { -- /* if re-init was successful drop the buffer (if there was one) -- * since we had to reconfigure capture (unmap all buffers) -- */ -- return NULL; -- } -+ if (ret > 0) -+ goto start; - } - - /* 2. dequeue the buffer */ - if (pfd.revents & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM)) { - -- if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) { -+ if (is_capture) { - /* there is a capture buffer ready */ - if (pfd.revents & (POLLIN | POLLRDNORM)) - goto dequeue; - -+ // CAPTURE Q drained -+ if (no_rx_means_done) { -+ if (ctx_done(ctx) > 0) -+ goto start; -+ return NULL; -+ } -+ - /* the driver is ready to accept more input; instead of waiting for the capture - * buffer to complete we return NULL so input can proceed (we are single threaded) - */ -@@ -380,37 +493,58 @@ dequeue: - buf.m.planes = planes; - } - -- ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_DQBUF, &buf); -- if (ret) { -- if (errno != EAGAIN) { -- ctx->done = 1; -- if (errno != EPIPE) -+ while ((ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_DQBUF, &buf)) == -1) { -+ const int err = errno; -+ if (err == EINTR) -+ continue; -+ if (err != EAGAIN) { -+ // EPIPE on CAPTURE can be used instead of BUF_FLAG_LAST -+ if (err != EPIPE || !is_capture) - av_log(logger(ctx), AV_LOG_DEBUG, "%s VIDIOC_DQBUF, errno (%s)\n", -- ctx->name, av_err2str(AVERROR(errno))); -+ ctx->name, av_err2str(AVERROR(err))); -+ if (ctx_done(ctx) > 0) -+ goto start; - } - return NULL; - } -+ --ctx->q_count; -+ av_log(logger(ctx), AV_LOG_DEBUG, "--- %s VIDIOC_DQBUF OK: index=%d, ts=%ld.%06ld, count=%d, dq=%d\n", -+ ctx->name, buf.index, -+ buf.timestamp.tv_sec, buf.timestamp.tv_usec, -+ ctx->q_count, ++ctx->dq_count); - -- if (ctx_to_m2mctx(ctx)->draining && !V4L2_TYPE_IS_OUTPUT(ctx->type)) { -+ avbuf = (V4L2Buffer *)ctx->bufrefs[buf.index]->data; -+ avbuf->status = V4L2BUF_AVAILABLE; -+ avbuf->buf = buf; -+ if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { -+ memcpy(avbuf->planes, planes, sizeof(planes)); -+ avbuf->buf.m.planes = avbuf->planes; -+ } -+ -+ if (ctx_to_m2mctx(ctx)->draining && is_capture) { - int bytesused = V4L2_TYPE_IS_MULTIPLANAR(buf.type) ? - buf.m.planes[0].bytesused : buf.bytesused; - if (bytesused == 0) { -- ctx->done = 1; -+ av_log(logger(ctx), AV_LOG_DEBUG, "Buffer empty - reQ\n"); -+ -+ // Must reQ so we don't leak -+ // May not matter if the next thing we do is release all the -+ // buffers but better to be tidy. -+ ff_v4l2_buffer_enqueue(avbuf); -+ -+ if (ctx_done(ctx) > 0) -+ goto start; - return NULL; - } - #ifdef V4L2_BUF_FLAG_LAST -- if (buf.flags & V4L2_BUF_FLAG_LAST) -- ctx->done = 1; -+ if (buf.flags & V4L2_BUF_FLAG_LAST) { -+ av_log(logger(ctx), AV_LOG_TRACE, "FLAG_LAST set\n"); -+ avbuf->status = V4L2BUF_IN_USE; // Avoid flushing this buffer -+ ctx_done(ctx); -+ } - #endif - } - -- avbuf = &ctx->buffers[buf.index]; -- avbuf->status = V4L2BUF_AVAILABLE; -- avbuf->buf = buf; -- if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { -- memcpy(avbuf->planes, planes, sizeof(planes)); -- avbuf->buf.m.planes = avbuf->planes; -- } - return avbuf; - } - -@@ -429,8 +563,9 @@ static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) - } - - for (i = 0; i < ctx->num_buffers; i++) { -- if (ctx->buffers[i].status == V4L2BUF_AVAILABLE) -- return &ctx->buffers[i]; -+ V4L2Buffer * const avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -+ if (avbuf->status == V4L2BUF_AVAILABLE) -+ return avbuf; - } - - return NULL; -@@ -438,25 +573,45 @@ static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) - - static int v4l2_release_buffers(V4L2Context* ctx) - { -- struct v4l2_requestbuffers req = { -- .memory = V4L2_MEMORY_MMAP, -- .type = ctx->type, -- .count = 0, /* 0 -> unmaps buffers from the driver */ -- }; -- int i, j; -+ int i; -+ int ret = 0; -+ const int fd = ctx_to_m2mctx(ctx)->fd; - -- for (i = 0; i < ctx->num_buffers; i++) { -- V4L2Buffer *buffer = &ctx->buffers[i]; -+ // Orphan any buffers in the wild -+ ff_weak_link_break(&ctx->wl_master); -+ -+ if (ctx->bufrefs) { -+ for (i = 0; i < ctx->num_buffers; i++) -+ av_buffer_unref(ctx->bufrefs + i); -+ } -+ -+ if (fd != -1) { -+ struct v4l2_requestbuffers req = { -+ .memory = V4L2_MEMORY_MMAP, -+ .type = ctx->type, -+ .count = 0, /* 0 -> unmap all buffers from the driver */ -+ }; -+ -+ while ((ret = ioctl(fd, VIDIOC_REQBUFS, &req)) == -1) { -+ if (errno == EINTR) -+ continue; -+ -+ ret = AVERROR(errno); - -- for (j = 0; j < buffer->num_planes; j++) { -- struct V4L2Plane_info *p = &buffer->plane_info[j]; -- if (p->mm_addr && p->length) -- if (munmap(p->mm_addr, p->length) < 0) -- av_log(logger(ctx), AV_LOG_ERROR, "%s unmap plane (%s))\n", ctx->name, av_err2str(AVERROR(errno))); -+ av_log(logger(ctx), AV_LOG_ERROR, "release all %s buffers (%s)\n", -+ ctx->name, av_err2str(AVERROR(errno))); -+ -+ if (ctx_to_m2mctx(ctx)->output_drm) -+ av_log(logger(ctx), AV_LOG_ERROR, -+ "Make sure the DRM client releases all FB/GEM objects before closing the codec (ie):\n" -+ "for all buffers: \n" -+ " 1. drmModeRmFB(..)\n" -+ " 2. drmIoctl(.., DRM_IOCTL_GEM_CLOSE,... )\n"); - } - } -+ ctx->q_count = 0; - -- return ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_REQBUFS, &req); -+ return ret; - } - - static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfmt) -@@ -485,6 +640,8 @@ static inline int v4l2_try_raw_format(V4L2Context* ctx, enum AVPixelFormat pixfm - - static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p) - { -+ V4L2m2mContext* s = ctx_to_m2mctx(ctx); -+ V4L2m2mPriv *priv = s->avctx->priv_data; - enum AVPixelFormat pixfmt = ctx->av_pix_fmt; - struct v4l2_fmtdesc fdesc; - int ret; -@@ -503,6 +660,13 @@ static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p) - if (ret) - return AVERROR(EINVAL); - -+ if (priv->pix_fmt != AV_PIX_FMT_NONE) { -+ if (fdesc.pixelformat != ff_v4l2_format_avfmt_to_v4l2(priv->pix_fmt)) { -+ fdesc.index++; -+ continue; -+ } -+ } -+ - pixfmt = ff_v4l2_format_v4l2_to_avfmt(fdesc.pixelformat, AV_CODEC_ID_RAWVIDEO); - ret = v4l2_try_raw_format(ctx, pixfmt); - if (ret){ -@@ -555,18 +719,73 @@ static int v4l2_get_coded_format(V4L2Context* ctx, uint32_t *p) - * - *****************************************************************************/ - -+ -+static void flush_all_buffers_status(V4L2Context* const ctx) -+{ -+ int i; -+ for (i = 0; i < ctx->num_buffers; ++i) { -+ struct V4L2Buffer * const buf = (struct V4L2Buffer *)ctx->bufrefs[i]->data; -+ if (buf->status == V4L2BUF_IN_DRIVER) -+ buf->status = V4L2BUF_AVAILABLE; -+ } -+ ctx->q_count = 0; -+} -+ -+static int stuff_all_buffers(AVCodecContext * avctx, V4L2Context* ctx) -+{ -+ int i; -+ int rv; -+ -+ if (!ctx->bufrefs) { -+ rv = ff_v4l2_context_init(ctx); -+ if (rv) { -+ av_log(avctx, AV_LOG_ERROR, "can't request capture buffers\n"); -+ return rv; -+ } -+ } -+ -+ for (i = 0; i < ctx->num_buffers; ++i) { -+ struct V4L2Buffer * const buf = (struct V4L2Buffer *)ctx->bufrefs[i]->data; -+ if (buf->status == V4L2BUF_AVAILABLE) { -+ rv = ff_v4l2_buffer_enqueue(buf); -+ if (rv < 0) -+ return rv; -+ } -+ } -+ return 0; -+} -+ - int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd) - { - int type = ctx->type; - int ret; -+ AVCodecContext * const avctx = logger(ctx); -+ -+ ff_mutex_lock(&ctx->lock); -+ -+ if (cmd == VIDIOC_STREAMON && !V4L2_TYPE_IS_OUTPUT(ctx->type)) -+ stuff_all_buffers(avctx, ctx); - - ret = ioctl(ctx_to_m2mctx(ctx)->fd, cmd, &type); -- if (ret < 0) -- return AVERROR(errno); -+ if (ret < 0) { -+ const int err = errno; -+ av_log(avctx, AV_LOG_ERROR, "%s set status %d (%s) failed: err=%d\n", ctx->name, -+ cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF", err); -+ ret = AVERROR(err); -+ } -+ else -+ { -+ if (cmd == VIDIOC_STREAMOFF) -+ flush_all_buffers_status(ctx); - -- ctx->streamon = (cmd == VIDIOC_STREAMON); -+ ctx->streamon = (cmd == VIDIOC_STREAMON); -+ av_log(avctx, AV_LOG_DEBUG, "%s set status %d (%s) OK\n", ctx->name, -+ cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF"); -+ } - -- return 0; -+ ff_mutex_unlock(&ctx->lock); -+ -+ return ret; - } - - int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame) -@@ -594,7 +813,8 @@ int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame) - return ff_v4l2_buffer_enqueue(avbuf); - } - --int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt) -+int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, -+ const void * extdata, size_t extlen, int no_rescale_pts) - { - V4L2m2mContext *s = ctx_to_m2mctx(ctx); - V4L2Buffer* avbuf; -@@ -602,8 +822,9 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt) - - if (!pkt->size) { - ret = v4l2_stop_decode(ctx); -+ // Log but otherwise ignore stop failure - if (ret) -- av_log(logger(ctx), AV_LOG_ERROR, "%s stop_decode\n", ctx->name); -+ av_log(logger(ctx), AV_LOG_ERROR, "%s stop_decode failed: err=%d\n", ctx->name, ret); - s->draining = 1; - return 0; - } -@@ -612,14 +833,14 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt) - if (!avbuf) - return AVERROR(EAGAIN); - -- ret = ff_v4l2_buffer_avpkt_to_buf(pkt, avbuf); -+ ret = ff_v4l2_buffer_avpkt_to_buf_ext(pkt, avbuf, extdata, extlen, no_rescale_pts); - if (ret) - return ret; - - return ff_v4l2_buffer_enqueue(avbuf); - } - --int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) -+int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout, int no_rescale_pts) - { - V4L2Buffer *avbuf; - -@@ -636,7 +857,7 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) - return AVERROR(EAGAIN); - } - -- return ff_v4l2_buffer_buf_to_avframe(frame, avbuf); -+ return ff_v4l2_buffer_buf_to_avframe(frame, avbuf, no_rescale_pts); - } - - int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt) -@@ -695,54 +916,57 @@ void ff_v4l2_context_release(V4L2Context* ctx) - { - int ret; - -- if (!ctx->buffers) -+ if (!ctx->bufrefs) - return; - - ret = v4l2_release_buffers(ctx); - if (ret) - av_log(logger(ctx), AV_LOG_WARNING, "V4L2 failed to unmap the %s buffers\n", ctx->name); - -- av_freep(&ctx->buffers); -+ av_freep(&ctx->bufrefs); -+ av_buffer_unref(&ctx->frames_ref); -+ -+ ff_mutex_destroy(&ctx->lock); - } - --int ff_v4l2_context_init(V4L2Context* ctx) -+ -+static int create_buffers(V4L2Context* const ctx, const unsigned int req_buffers) - { -- V4L2m2mContext *s = ctx_to_m2mctx(ctx); -+ V4L2m2mContext * const s = ctx_to_m2mctx(ctx); - struct v4l2_requestbuffers req; -- int ret, i; -- -- if (!v4l2_type_supported(ctx)) { -- av_log(logger(ctx), AV_LOG_ERROR, "type %i not supported\n", ctx->type); -- return AVERROR_PATCHWELCOME; -- } -- -- ret = ioctl(s->fd, VIDIOC_G_FMT, &ctx->format); -- if (ret) -- av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_G_FMT failed\n", ctx->name); -+ int ret; -+ int i; - - memset(&req, 0, sizeof(req)); -- req.count = ctx->num_buffers; -+ req.count = req_buffers; - req.memory = V4L2_MEMORY_MMAP; - req.type = ctx->type; -- ret = ioctl(s->fd, VIDIOC_REQBUFS, &req); -- if (ret < 0) { -- av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_REQBUFS failed: %s\n", ctx->name, strerror(errno)); -- return AVERROR(errno); -+ while ((ret = ioctl(s->fd, VIDIOC_REQBUFS, &req)) == -1) { -+ if (errno != EINTR) { -+ ret = AVERROR(errno); -+ av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_REQBUFS failed: %s\n", ctx->name, av_err2str(ret)); -+ return ret; -+ } - } - - ctx->num_buffers = req.count; -- ctx->buffers = av_mallocz(ctx->num_buffers * sizeof(V4L2Buffer)); -- if (!ctx->buffers) { -+ ctx->bufrefs = av_mallocz(ctx->num_buffers * sizeof(*ctx->bufrefs)); -+ if (!ctx->bufrefs) { - av_log(logger(ctx), AV_LOG_ERROR, "%s malloc enomem\n", ctx->name); -- return AVERROR(ENOMEM); -+ goto fail_release; - } - -- for (i = 0; i < req.count; i++) { -- ctx->buffers[i].context = ctx; -- ret = ff_v4l2_buffer_initialize(&ctx->buffers[i], i); -- if (ret < 0) { -+ ctx->wl_master = ff_weak_link_new(ctx); -+ if (!ctx->wl_master) { -+ ret = AVERROR(ENOMEM); -+ goto fail_release; -+ } -+ -+ for (i = 0; i < ctx->num_buffers; i++) { -+ ret = ff_v4l2_buffer_initialize(&ctx->bufrefs[i], i, ctx); -+ if (ret) { - av_log(logger(ctx), AV_LOG_ERROR, "%s buffer[%d] initialization (%s)\n", ctx->name, i, av_err2str(ret)); -- goto error; -+ goto fail_release; - } - } - -@@ -756,10 +980,62 @@ int ff_v4l2_context_init(V4L2Context* ctx) - - return 0; - --error: -+fail_release: - v4l2_release_buffers(ctx); -+ av_freep(&ctx->bufrefs); -+ return ret; -+} -+ -+int ff_v4l2_context_init(V4L2Context* ctx) -+{ -+ V4L2m2mContext * const s = ctx_to_m2mctx(ctx); -+ int ret; -+ -+ // It is not valid to reinit a context without a previous release -+ av_assert0(ctx->bufrefs == NULL); -+ -+ if (!v4l2_type_supported(ctx)) { -+ av_log(logger(ctx), AV_LOG_ERROR, "type %i not supported\n", ctx->type); -+ return AVERROR_PATCHWELCOME; -+ } -+ -+ ff_mutex_init(&ctx->lock, NULL); - -- av_freep(&ctx->buffers); -+ if (s->output_drm) { -+ AVHWFramesContext *hwframes; -+ -+ ctx->frames_ref = av_hwframe_ctx_alloc(s->device_ref); -+ if (!ctx->frames_ref) { -+ ret = AVERROR(ENOMEM); -+ goto fail_unlock; -+ } -+ -+ hwframes = (AVHWFramesContext*)ctx->frames_ref->data; -+ hwframes->format = AV_PIX_FMT_DRM_PRIME; -+ hwframes->sw_format = ctx->av_pix_fmt; -+ hwframes->width = ctx->width; -+ hwframes->height = ctx->height; -+ ret = av_hwframe_ctx_init(ctx->frames_ref); -+ if (ret < 0) -+ goto fail_unref_hwframes; -+ } -+ -+ ret = ioctl(s->fd, VIDIOC_G_FMT, &ctx->format); -+ if (ret) { -+ ret = AVERROR(errno); -+ av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_G_FMT failed: %s\n", ctx->name, av_err2str(ret)); -+ goto fail_unref_hwframes; -+ } -+ -+ ret = create_buffers(ctx, ctx->num_buffers); -+ if (ret < 0) -+ goto fail_unref_hwframes; -+ -+ return 0; - -+fail_unref_hwframes: -+ av_buffer_unref(&ctx->frames_ref); -+fail_unlock: -+ ff_mutex_destroy(&ctx->lock); - return ret; - } -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index 6f7460c89a..59009d11d1 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -32,6 +32,8 @@ - #include "libavutil/rational.h" - #include "codec_id.h" - #include "packet.h" -+#include "libavutil/buffer.h" -+#include "libavutil/thread.h" - #include "v4l2_buffers.h" - - typedef struct V4L2Context { -@@ -71,11 +73,12 @@ typedef struct V4L2Context { - */ - int width, height; - AVRational sample_aspect_ratio; -+ struct v4l2_rect selection; - - /** -- * Indexed array of V4L2Buffers -+ * Indexed array of pointers to V4L2Buffers - */ -- V4L2Buffer *buffers; -+ AVBufferRef **bufrefs; - - /** - * Readonly after init. -@@ -93,6 +96,12 @@ typedef struct V4L2Context { - */ - int done; - -+ AVBufferRef *frames_ref; -+ int q_count; -+ int dq_count; -+ struct ff_weak_link_master *wl_master; -+ -+ AVMutex lock; - } V4L2Context; - - /** -@@ -157,9 +166,12 @@ int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt); - * @param[in] ctx The V4L2Context to dequeue from. - * @param[inout] f The AVFrame to dequeue to. - * @param[in] timeout The timeout for dequeue (-1 to block, 0 to return immediately, or milliseconds) -+ * @param[in] no_rescale_pts (0 rescale pts, 1 use pts as -+ * timestamp directly) -+ * - * @return 0 in case of success, AVERROR(EAGAIN) if no buffer was ready, another negative error in case of error. - */ --int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout); -+int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout, int no_rescale_pts); - - /** - * Enqueues a buffer to a V4L2Context from an AVPacket -@@ -171,7 +183,7 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout); - * @param[in] pkt A pointer to an AVPacket. - * @return 0 in case of success, a negative error otherwise. - */ --int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt); -+int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, const void * ext_data, size_t ext_size, int no_rescale_pts); - - /** - * Enqueues a buffer to a V4L2Context from an AVFrame -diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c -index 602efb7a16..516e6d9858 100644 ---- a/libavcodec/v4l2_m2m.c -+++ b/libavcodec/v4l2_m2m.c -@@ -216,13 +216,7 @@ int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *s) - av_log(log_ctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n"); - - /* 2. unmap the capture buffers (v4l2 and ffmpeg): -- * we must wait for all references to be released before being allowed -- * to queue new buffers. - */ -- av_log(log_ctx, AV_LOG_DEBUG, "waiting for user to release AVBufferRefs\n"); -- if (atomic_load(&s->refcount)) -- while(sem_wait(&s->refsync) == -1 && errno == EINTR); -- - ff_v4l2_context_release(&s->capture); - - /* 3. get the new capture format */ -@@ -259,6 +253,8 @@ static void v4l2_m2m_destroy_context(void *opaque, uint8_t *context) - av_frame_free(&s->frame); - av_packet_unref(&s->buf_pkt); - -+ av_log(s->avctx, AV_LOG_DEBUG, "V4L2 Context destroyed\n"); -+ - av_free(s); - } - -@@ -270,6 +266,11 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) - if (!s) - return 0; - -+ av_log(s->avctx, AV_LOG_DEBUG, "V4L2 Codec end\n"); -+ -+ if (av_codec_is_decoder(s->avctx->codec)) -+ av_packet_unref(&s->buf_pkt); -+ - if (s->fd >= 0) { - ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF); - if (ret) -@@ -282,7 +283,14 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) - - ff_v4l2_context_release(&s->output); - -+ close(s->fd); -+ s->fd = -1; -+ - s->self_ref = NULL; -+ // This is only called on avctx close so after this point we don't have that -+ // Crash sooner if we find we are using it (can still log with avctx = NULL) -+ s->avctx = NULL; -+ priv->context = NULL; - av_buffer_unref(&priv->context_ref); - - return 0; -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 04d86d7b92..24a9c94864 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -30,6 +30,7 @@ - #include - - #include "libavcodec/avcodec.h" -+#include "libavutil/pixfmt.h" - #include "v4l2_context.h" - - #define container_of(ptr, type, member) ({ \ -@@ -40,6 +41,17 @@ - { "num_output_buffers", "Number of buffers in the output context",\ - OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 16 }, 2, INT_MAX, FLAGS } - -+#define FF_V4L2_M2M_TRACK_SIZE 128 -+typedef struct V4L2m2mTrackEl { -+ int discard; // If we see this buffer its been flushed, so discard -+ int pkt_size; -+ int64_t pts; -+ int64_t reordered_opaque; -+ int64_t pkt_pos; -+ int64_t pkt_duration; -+ int64_t track_pts; -+} V4L2m2mTrackEl; -+ - typedef struct V4L2m2mContext { - char devname[PATH_MAX]; - int fd; -@@ -53,6 +65,7 @@ typedef struct V4L2m2mContext { - sem_t refsync; - atomic_uint refcount; - int reinit; -+ int resize_pending; - - /* null frame/packet received */ - int draining; -@@ -66,6 +79,23 @@ typedef struct V4L2m2mContext { - - /* reference back to V4L2m2mPriv */ - void *priv; -+ -+ AVBufferRef *device_ref; -+ -+ /* generate DRM frames */ -+ int output_drm; -+ -+ /* Frame tracking */ -+ int64_t last_pkt_dts; -+ int64_t last_opaque; -+ unsigned int track_no; -+ V4L2m2mTrackEl track_els[FF_V4L2_M2M_TRACK_SIZE]; -+ -+ /* req pkt */ -+ int req_pkt; -+ -+ /* Ext data sent */ -+ int extdata_sent; - } V4L2m2mContext; - - typedef struct V4L2m2mPriv { -@@ -76,6 +106,7 @@ typedef struct V4L2m2mPriv { - - int num_output_buffers; - int num_capture_buffers; -+ enum AVPixelFormat pix_fmt; - } V4L2m2mPriv; - - /** -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 4944d08511..7f6033ac2c 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -23,6 +23,10 @@ - - #include - #include -+ -+#include "libavutil/avassert.h" -+#include "libavutil/hwcontext.h" -+#include "libavutil/hwcontext_drm.h" - #include "libavutil/pixfmt.h" - #include "libavutil/pixdesc.h" - #include "libavutil/opt.h" -@@ -30,26 +34,51 @@ - #include "codec_internal.h" - #include "libavcodec/decode.h" - -+#include "libavcodec/hwaccels.h" -+#include "libavcodec/internal.h" -+#include "libavcodec/hwconfig.h" -+ - #include "v4l2_context.h" - #include "v4l2_m2m.h" - #include "v4l2_fmt.h" - -+static int check_output_streamon(AVCodecContext *const avctx, V4L2m2mContext *const s) -+{ -+ int ret; -+ struct v4l2_decoder_cmd cmd = { -+ .cmd = V4L2_DEC_CMD_START, -+ .flags = 0, -+ }; -+ -+ if (s->output.streamon) -+ return 0; -+ -+ ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMON); -+ if (ret < 0) -+ av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMON on output context\n"); -+ -+ if (!s->capture.streamon || ret < 0) -+ return ret; -+ -+ ret = ioctl(s->fd, VIDIOC_DECODER_CMD, &cmd); -+ if (ret < 0) -+ av_log(avctx, AV_LOG_ERROR, "VIDIOC_DECODER_CMD start error: %d\n", errno); -+ else -+ av_log(avctx, AV_LOG_DEBUG, "VIDIOC_DECODER_CMD start OK\n"); -+ -+ return ret; -+} -+ - static int v4l2_try_start(AVCodecContext *avctx) - { - V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; - V4L2Context *const capture = &s->capture; -- V4L2Context *const output = &s->output; - struct v4l2_selection selection = { 0 }; - int ret; - - /* 1. start the output process */ -- if (!output->streamon) { -- ret = ff_v4l2_context_set_status(output, VIDIOC_STREAMON); -- if (ret < 0) { -- av_log(avctx, AV_LOG_DEBUG, "VIDIOC_STREAMON on output context\n"); -- return ret; -- } -- } -+ if ((ret = check_output_streamon(avctx, s)) != 0) -+ return ret; - - if (capture->streamon) - return 0; -@@ -63,15 +92,29 @@ static int v4l2_try_start(AVCodecContext *avctx) - } - - /* 2.1 update the AVCodecContext */ -- avctx->pix_fmt = ff_v4l2_format_v4l2_to_avfmt(capture->format.fmt.pix_mp.pixelformat, AV_CODEC_ID_RAWVIDEO); -- capture->av_pix_fmt = avctx->pix_fmt; -+ capture->av_pix_fmt = -+ ff_v4l2_format_v4l2_to_avfmt(capture->format.fmt.pix_mp.pixelformat, AV_CODEC_ID_RAWVIDEO); -+ if (s->output_drm) { -+ avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; -+ avctx->sw_pix_fmt = capture->av_pix_fmt; -+ } -+ else -+ avctx->pix_fmt = capture->av_pix_fmt; - - /* 3. set the crop parameters */ -+#if 1 -+ selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; -+ selection.target = V4L2_SEL_TGT_CROP_DEFAULT; -+ ret = ioctl(s->fd, VIDIOC_G_SELECTION, &selection); -+ av_log(avctx, AV_LOG_INFO, "Post G selection ret=%d, err=%d %dx%d\n", ret, errno, selection.r.width, selection.r.height); -+#else - selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - selection.r.height = avctx->coded_height; - selection.r.width = avctx->coded_width; -+ av_log(avctx, AV_LOG_INFO, "Try selection %dx%d\n", avctx->coded_width, avctx->coded_height); - ret = ioctl(s->fd, VIDIOC_S_SELECTION, &selection); -- if (!ret) { -+ av_log(avctx, AV_LOG_INFO, "Post S selection ret=%d, err=%d %dx%d\n", ret, errno, selection.r.width, selection.r.height); -+ if (1) { - ret = ioctl(s->fd, VIDIOC_G_SELECTION, &selection); - if (ret) { - av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_SELECTION ioctl\n"); -@@ -82,15 +125,7 @@ static int v4l2_try_start(AVCodecContext *avctx) - capture->width = selection.r.width; - } - } -- -- /* 4. init the capture context now that we have the capture format */ -- if (!capture->buffers) { -- ret = ff_v4l2_context_init(capture); -- if (ret) { -- av_log(avctx, AV_LOG_ERROR, "can't request capture buffers\n"); -- return AVERROR(ENOMEM); -- } -- } -+#endif - - /* 5. start the capture process */ - ret = ff_v4l2_context_set_status(capture, VIDIOC_STREAMON); -@@ -133,50 +168,287 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s) - return 0; - } - --static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) -+static inline int64_t track_to_pts(AVCodecContext *avctx, unsigned int n) -+{ -+ return (int64_t)n; -+} -+ -+static inline unsigned int pts_to_track(AVCodecContext *avctx, const int64_t pts) -+{ -+ return (unsigned int)pts; -+} -+ -+// FFmpeg requires us to propagate a number of vars from the coded pkt into -+// the decoded frame. The only thing that tracks like that in V4L2 stateful -+// is timestamp. PTS maps to timestamp for this decode. FFmpeg makes no -+// guarantees about PTS being unique or specified for every frame so replace -+// the supplied PTS with a simple incrementing number and keep a circular -+// buffer of all the things we want preserved (including the original PTS) -+// indexed by the tracking no. -+static void -+xlat_pts_in(AVCodecContext *const avctx, V4L2m2mContext *const s, AVPacket *const avpkt) -+{ -+ int64_t track_pts; -+ -+ // Avoid 0 -+ if (++s->track_no == 0) -+ s->track_no = 1; -+ -+ track_pts = track_to_pts(avctx, s->track_no); -+ -+ av_log(avctx, AV_LOG_TRACE, "In PTS=%" PRId64 ", DTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", avpkt->pts, avpkt->dts, track_pts, s->track_no); -+ s->last_pkt_dts = avpkt->dts; -+ s->track_els[s->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ -+ .discard = 0, -+ .pkt_size = avpkt->size, -+ .pts = avpkt->pts, -+ .reordered_opaque = avctx->reordered_opaque, -+ .pkt_pos = avpkt->pos, -+ .pkt_duration = avpkt->duration, -+ .track_pts = track_pts -+ }; -+ avpkt->pts = track_pts; -+} -+ -+// Returns -1 if we should discard the frame -+static int -+xlat_pts_out(AVCodecContext *const avctx, V4L2m2mContext *const s, AVFrame *const frame) -+{ -+ unsigned int n = pts_to_track(avctx, frame->pts) % FF_V4L2_M2M_TRACK_SIZE; -+ const V4L2m2mTrackEl *const t = s->track_els + n; -+ if (frame->pts == AV_NOPTS_VALUE || frame->pts != t->track_pts) -+ { -+ av_log(avctx, AV_LOG_INFO, "Tracking failure: pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); -+ frame->pts = AV_NOPTS_VALUE; -+ frame->pkt_dts = s->last_pkt_dts; -+ frame->reordered_opaque = s->last_opaque; -+ frame->pkt_pos = -1; -+ frame->pkt_duration = 0; -+ frame->pkt_size = -1; -+ } -+ else if (!t->discard) -+ { -+ frame->pts = t->pts; -+ frame->pkt_dts = s->last_pkt_dts; -+ frame->reordered_opaque = t->reordered_opaque; -+ frame->pkt_pos = t->pkt_pos; -+ frame->pkt_duration = t->pkt_duration; -+ frame->pkt_size = t->pkt_size; -+ -+ s->last_opaque = s->track_els[n].reordered_opaque; -+ s->track_els[n].pts = AV_NOPTS_VALUE; // If we hit this again deny accurate knowledge of PTS -+ } -+ else -+ { -+ av_log(avctx, AV_LOG_DEBUG, "Discard frame (flushed): pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); -+ return -1; -+ } -+ -+ frame->best_effort_timestamp = frame->pts; -+ frame->pkt_dts = frame->pts; // We can't emulate what s/w does in a useful manner? -+ av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 ", DTS=%" PRId64 "\n", frame->pts, frame->pkt_dts); -+ return 0; -+} -+ -+static inline int stream_started(const V4L2m2mContext * const s) { -+ return s->capture.streamon && s->output.streamon; -+} -+ -+#define NQ_OK 0 -+#define NQ_Q_FULL 1 -+#define NQ_SRC_EMPTY 2 -+#define NQ_DRAINING 3 -+#define NQ_DEAD 4 -+ -+#define TRY_DQ(nq_status) ((nq_status) >= NQ_OK && (nq_status) <= NQ_DRAINING) -+ -+// AVERROR_EOF Flushing an already flushed stream -+// -ve Error (all errors except EOF are unexpected) -+// NQ_OK (0) OK -+// NQ_Q_FULL Dst full (retry if we think V4L2 Q has space now) -+// NQ_SRC_EMPTY Src empty (do not retry) -+// NQ_DRAINING At EOS, dQ dest until EOS there too -+// NQ_DEAD Not running (do not retry, do not attempt capture dQ) -+ -+static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const s) - { -- V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; -- V4L2Context *const capture = &s->capture; -- V4L2Context *const output = &s->output; - int ret; - -+ // If we don't already have a coded packet - get a new one -+ // We will already have a coded pkt if the output Q was full last time we -+ // tried to Q it - if (!s->buf_pkt.size) { - ret = ff_decode_get_packet(avctx, &s->buf_pkt); -+ -+ if (ret == AVERROR(EAGAIN)) { -+ if (!stream_started(s)) { -+ av_log(avctx, AV_LOG_TRACE, "%s: receive_frame before 1st coded packet\n", __func__); -+ return NQ_DEAD; -+ } -+ return NQ_SRC_EMPTY; -+ } -+ -+ if (ret == AVERROR_EOF) { -+ // EOF - enter drain mode -+ av_log(avctx, AV_LOG_TRACE, "--- EOS req: ret=%d, size=%d, started=%d, drain=%d\n", -+ ret, s->buf_pkt.size, stream_started(s), s->draining); -+ if (!stream_started(s)) { -+ av_log(avctx, AV_LOG_DEBUG, "EOS on flushed stream\n"); -+ s->draining = 1; -+ s->capture.done = 1; -+ return AVERROR_EOF; -+ } -+ -+ if (!s->draining) { -+ // Calling enqueue with an empty pkt starts drain -+ av_assert0(s->buf_pkt.size == 0); -+ ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0, 1); -+ if (ret) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to start drain: ret=%d\n", ret); -+ return ret; -+ } -+ } -+ return NQ_DRAINING; -+ } -+ - if (ret < 0) { -- if (ret == AVERROR(EAGAIN)) -- return ff_v4l2_context_dequeue_frame(capture, frame, 0); -- else if (ret != AVERROR_EOF) -- return ret; -+ av_log(avctx, AV_LOG_ERROR, "Failed to get coded packet: err=%d\n", ret); -+ return ret; - } -+ -+ xlat_pts_in(avctx, s, &s->buf_pkt); - } - -- if (s->draining) -- goto dequeue; -+ if ((ret = check_output_streamon(avctx, s)) != 0) -+ return ret; - -- ret = ff_v4l2_context_enqueue_packet(output, &s->buf_pkt); -- if (ret < 0 && ret != AVERROR(EAGAIN)) -- goto fail; -+ ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, -+ avctx->extradata, s->extdata_sent ? 0 : avctx->extradata_size, -+ 1); - -- /* if EAGAIN don't unref packet and try to enqueue in the next iteration */ -- if (ret != AVERROR(EAGAIN)) -+ if (ret == AVERROR(EAGAIN)) { -+ // Out of input buffers - keep packet -+ ret = NQ_Q_FULL; -+ } -+ else { -+ // In all other cases we are done with this packet - av_packet_unref(&s->buf_pkt); -+ s->extdata_sent = 1; - -- if (!s->draining) { -- ret = v4l2_try_start(avctx); - if (ret) { -- /* cant recover */ -- if (ret != AVERROR(ENOMEM)) -- ret = 0; -- goto fail; -+ av_log(avctx, AV_LOG_ERROR, "Packet enqueue failure: err=%d\n", ret); -+ return ret; -+ } -+ } -+ -+ // Start if we haven't -+ { -+ const int ret2 = v4l2_try_start(avctx); -+ if (ret2) { -+ av_log(avctx, AV_LOG_DEBUG, "Start failure: err=%d\n", ret2); -+ ret = (ret2 == AVERROR(ENOMEM)) ? ret2 : NQ_DEAD; -+ } -+ } -+ -+ return ret; -+} -+ -+static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) -+{ -+ V4L2m2mContext *const s = ((V4L2m2mPriv*)avctx->priv_data)->context; -+ int src_rv; -+ int dst_rv = 1; // Non-zero (done), non-negative (error) number -+ -+ do { -+ src_rv = try_enqueue_src(avctx, s); -+ -+ // If we got a frame last time and we have nothing to enqueue then -+ // return now. rv will be AVERROR(EAGAIN) indicating that we want more input -+ // This should mean that once decode starts we enter a stable state where -+ // we alternately ask for input and produce output -+ if (s->req_pkt && src_rv == NQ_SRC_EMPTY) -+ break; -+ -+ if (src_rv == NQ_Q_FULL && dst_rv == AVERROR(EAGAIN)) { -+ av_log(avctx, AV_LOG_WARNING, "Poll says src Q has space but enqueue fail"); -+ src_rv = NQ_SRC_EMPTY; // If we can't enqueue pretend that there is nothing to enqueue -+ } -+ -+ // Try to get a new frame if -+ // (a) we haven't already got one AND -+ // (b) enqueue returned a status indicating that decode should be attempted -+ if (dst_rv != 0 && TRY_DQ(src_rv)) { -+ do { -+ // Dequeue frame will unref any previous contents of frame -+ // if it returns success so we don't need an explicit unref -+ // when discarding -+ // This returns AVERROR(EAGAIN) if there isn't a frame ready yet -+ // but there is room in the input Q -+ dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, -1, 1); -+ -+ if (dst_rv == AVERROR_EOF && (s->draining || s->capture.done)) -+ av_log(avctx, AV_LOG_DEBUG, "Dequeue EOF: draining=%d, cap.done=%d\n", -+ s->draining, s->capture.done); -+ else if (dst_rv && dst_rv != AVERROR(EAGAIN)) -+ av_log(avctx, AV_LOG_ERROR, "Packet dequeue failure: draining=%d, cap.done=%d, err=%d\n", -+ s->draining, s->capture.done, dst_rv); -+ -+ // Go again if we got a frame that we need to discard -+ } while (dst_rv == 0 && xlat_pts_out(avctx, s, frame)); -+ } -+ -+ // Continue trying to enqueue packets if either -+ // (a) we succeeded last time OR -+ // (b) enqueue failed due to input Q full AND there is now room -+ } while (src_rv == NQ_OK || (src_rv == NQ_Q_FULL && dst_rv == AVERROR(EAGAIN)) ); -+ -+ // Ensure that the frame contains nothing if we aren't returning a frame -+ // (might happen when discarding) -+ if (dst_rv) -+ av_frame_unref(frame); -+ -+ // If we got a frame this time ask for a pkt next time -+ s->req_pkt = (dst_rv == 0); -+ -+#if 0 -+ if (dst_rv == 0) -+ { -+ static int z = 0; -+ if (++z > 50) { -+ av_log(avctx, AV_LOG_ERROR, "Streamoff and die?\n"); -+ ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF); -+ return -1; - } - } -+#endif -+ -+ return dst_rv == 0 ? 0 : -+ src_rv < 0 ? src_rv : -+ dst_rv < 0 ? dst_rv : -+ AVERROR(EAGAIN); -+} -+ -+#if 0 -+#include -+static int64_t us_time(void) -+{ -+ struct timespec ts; -+ clock_gettime(CLOCK_MONOTONIC, &ts); -+ return (int64_t)ts.tv_sec * 1000000 + ts.tv_nsec / 1000; -+} - --dequeue: -- return ff_v4l2_context_dequeue_frame(capture, frame, -1); --fail: -- av_packet_unref(&s->buf_pkt); -+static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) -+{ -+ int ret; -+ const int64_t now = us_time(); -+ int64_t done; -+ av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); -+ ret = v4l2_receive_frame2(avctx, frame); -+ done = us_time(); -+ av_log(avctx, AV_LOG_TRACE, ">>> %s: rx time=%" PRId64 ", rv=%d\n", __func__, done - now, ret); - return ret; - } -+#endif - - static av_cold int v4l2_decode_init(AVCodecContext *avctx) - { -@@ -185,6 +457,9 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - V4L2m2mPriv *priv = avctx->priv_data; - int ret; - -+ av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); -+ avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; -+ - ret = ff_v4l2_m2m_create_context(priv, &s); - if (ret < 0) - return ret; -@@ -205,6 +480,28 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - capture->av_codec_id = AV_CODEC_ID_RAWVIDEO; - capture->av_pix_fmt = avctx->pix_fmt; - -+ /* the client requests the codec to generate DRM frames: -+ * - data[0] will therefore point to the returned AVDRMFrameDescriptor -+ * check the ff_v4l2_buffer_to_avframe conversion function. -+ * - the DRM frame format is passed in the DRM frame descriptor layer. -+ * check the v4l2_get_drm_frame function. -+ */ -+ switch (ff_get_format(avctx, avctx->codec->pix_fmts)) { -+ default: -+ s->output_drm = 1; -+ break; -+ } -+ -+ s->device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_DRM); -+ if (!s->device_ref) { -+ ret = AVERROR(ENOMEM); -+ return ret; -+ } -+ -+ ret = av_hwdevice_ctx_init(s->device_ref); -+ if (ret < 0) -+ return ret; -+ - s->avctx = avctx; - ret = ff_v4l2_m2m_codec_init(priv); - if (ret) { -@@ -217,7 +514,53 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - - static av_cold int v4l2_decode_close(AVCodecContext *avctx) - { -- return ff_v4l2_m2m_codec_end(avctx->priv_data); -+ int rv; -+ av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); -+ rv = ff_v4l2_m2m_codec_end(avctx->priv_data); -+ av_log(avctx, AV_LOG_TRACE, ">>> %s: rv=%d\n", __func__, rv); -+ return rv; -+} -+ -+static void v4l2_decode_flush(AVCodecContext *avctx) -+{ -+ // An alternatve and more drastic form of flush is to simply do this: -+ // v4l2_decode_close(avctx); -+ // v4l2_decode_init(avctx); -+ // The downside is that this keeps a decoder open until all the frames -+ // associated with it have been returned. This is a bit wasteful on -+ // possibly limited h/w resources and fails on a Pi for this reason unless -+ // more GPU mem is allocated than is the default. -+ -+ V4L2m2mPriv * const priv = avctx->priv_data; -+ V4L2m2mContext * const s = priv->context; -+ V4L2Context * const output = &s->output; -+ V4L2Context * const capture = &s->capture; -+ int ret, i; -+ -+ av_log(avctx, AV_LOG_TRACE, "<<< %s: streamon=%d\n", __func__, output->streamon); -+ -+ // Reflushing everything is benign, quick and avoids having to worry about -+ // states like EOS processing so don't try to optimize out (having got it -+ // wrong once) -+ -+ ret = ff_v4l2_context_set_status(output, VIDIOC_STREAMOFF); -+ if (ret < 0) -+ av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s error: %d\n", output->name, ret); -+ -+ // V4L2 makes no guarantees about whether decoded frames are flushed or not -+ // so mark all frames we are tracking to be discarded if they appear -+ for (i = 0; i != FF_V4L2_M2M_TRACK_SIZE; ++i) -+ s->track_els[i].discard = 1; -+ -+ // resend extradata -+ s->extdata_sent = 0; -+ // clear EOS status vars -+ s->draining = 0; -+ output->done = 0; -+ capture->done = 0; -+ -+ // Stream on will occur when we actually submit a new frame -+ av_log(avctx, AV_LOG_TRACE, ">>> %s\n", __func__); - } - - #define OFFSET(x) offsetof(V4L2m2mPriv, x) -@@ -227,9 +570,15 @@ static const AVOption options[] = { - V4L_M2M_DEFAULT_OPTS, - { "num_capture_buffers", "Number of buffers in the capture context", - OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 20}, 2, INT_MAX, FLAGS }, -+ { "pixel_format", "Pixel format to be used by the decoder", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, AV_PIX_FMT_NONE, AV_PIX_FMT_NB, FLAGS }, - { NULL}, - }; - -+static const AVCodecHWConfigInternal *v4l2_m2m_hw_configs[] = { -+ HW_CONFIG_INTERNAL(DRM_PRIME), -+ NULL -+}; -+ - #define M2MDEC_CLASS(NAME) \ - static const AVClass v4l2_m2m_ ## NAME ## _dec_class = { \ - .class_name = #NAME "_v4l2m2m_decoder", \ -@@ -250,11 +599,16 @@ static const AVOption options[] = { - .init = v4l2_decode_init, \ - FF_CODEC_RECEIVE_FRAME_CB(v4l2_receive_frame), \ - .close = v4l2_decode_close, \ -+ .flush = v4l2_decode_flush, \ - .bsfs = bsf_name, \ - .p.capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, \ - .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE | \ - FF_CODEC_CAP_SETS_PKT_DTS | FF_CODEC_CAP_INIT_CLEANUP, \ - .p.wrapper_name = "v4l2m2m", \ -+ .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_DRM_PRIME, \ -+ AV_PIX_FMT_NV12, \ -+ AV_PIX_FMT_NONE}, \ -+ .hw_configs = v4l2_m2m_hw_configs, \ - } - - M2MDEC(h264, "H.264", AV_CODEC_ID_H264, "h264_mp4toannexb"); - -From 12f8f12326b83dd3c22084f8922705d79a13d195 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 10 Jun 2021 18:46:21 +0100 -Subject: [PATCH 017/151] Fix crash in hw_device_default_name if type not found - (NONE) - ---- - fftools/ffmpeg_hw.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/fftools/ffmpeg_hw.c b/fftools/ffmpeg_hw.c -index 88fa782470..740a5e7153 100644 ---- a/fftools/ffmpeg_hw.c -+++ b/fftools/ffmpeg_hw.c -@@ -75,6 +75,8 @@ static char *hw_device_default_name(enum AVHWDeviceType type) - char *name; - size_t index_pos; - int index, index_limit = 1000; -+ if (!type_name) -+ return NULL; - index_pos = strlen(type_name); - name = av_malloc(index_pos + 4); - if (!name) - -From 7f6bce459e683bff3a0b972922fbcc808e9177a6 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 10 Jun 2021 18:59:18 +0100 -Subject: [PATCH 018/151] Allow v4l2m2m to select non-drm_prime output formats - ---- - libavcodec/v4l2_buffers.c | 2 +- - libavcodec/v4l2_m2m_dec.c | 14 ++++++++++---- - 2 files changed, 11 insertions(+), 5 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index a003934ca1..1ca1128db6 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -524,7 +524,7 @@ static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - offset += dst_stride * out->context->height; - } - if (offset > out->plane_info[0].length) { -- av_log(NULL, AV_LOG_ERROR, "%s: Plane total %d > buffer size %d\n", __func__, offset, out->plane_info[0].length); -+ av_log(NULL, AV_LOG_ERROR, "%s: Plane total %u > buffer size %zu\n", __func__, offset, out->plane_info[0].length); - return -1; - } - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 7f6033ac2c..a4b5a4e7e9 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -455,10 +455,10 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - V4L2Context *capture, *output; - V4L2m2mContext *s; - V4L2m2mPriv *priv = avctx->priv_data; -+ int gf_pix_fmt; - int ret; - - av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); -- avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; - - ret = ff_v4l2_m2m_create_context(priv, &s); - if (ret < 0) -@@ -486,10 +486,15 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - * - the DRM frame format is passed in the DRM frame descriptor layer. - * check the v4l2_get_drm_frame function. - */ -- switch (ff_get_format(avctx, avctx->codec->pix_fmts)) { -- default: -+ -+ gf_pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts); -+ av_log(avctx, AV_LOG_DEBUG, "avctx requested=%d (%s); get_format requested=%d (%s)\n", -+ avctx->pix_fmt, av_get_pix_fmt_name(avctx->pix_fmt), gf_pix_fmt, av_get_pix_fmt_name(gf_pix_fmt)); -+ -+ s->output_drm = 0; -+ if (gf_pix_fmt == AV_PIX_FMT_DRM_PRIME || avctx->pix_fmt == AV_PIX_FMT_DRM_PRIME) { -+ avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; - s->output_drm = 1; -- break; - } - - s->device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_DRM); -@@ -607,6 +612,7 @@ static const AVCodecHWConfigInternal *v4l2_m2m_hw_configs[] = { - .p.wrapper_name = "v4l2m2m", \ - .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_DRM_PRIME, \ - AV_PIX_FMT_NV12, \ -+ AV_PIX_FMT_YUV420P, \ - AV_PIX_FMT_NONE}, \ - .hw_configs = v4l2_m2m_hw_configs, \ - } - -From 9b0d964b727d98271f7f2f4dcdbcb1b41a429e2b Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 10 Jun 2021 18:59:38 +0100 -Subject: [PATCH 019/151] Fix YUV420P output from v4l2m2m - -Also put get_width get_height inlines in header as they are generally -useful. ---- - libavcodec/v4l2_buffers.c | 12 ++++++------ - libavcodec/v4l2_context.c | 22 ++++++---------------- - libavcodec/v4l2_m2m.h | 12 ++++++++++++ - 3 files changed, 24 insertions(+), 22 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 1ca1128db6..f4c11ca8d0 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -425,17 +425,17 @@ static int v4l2_buffer_buf_to_swframe(AVFrame *frame, V4L2Buffer *avbuf) - case AV_PIX_FMT_NV21: - if (avbuf->num_planes > 1) - break; -- frame->linesize[1] = avbuf->plane_info[0].bytesperline; -- frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height; -+ frame->linesize[1] = frame->linesize[0]; -+ frame->data[1] = frame->data[0] + frame->linesize[0] * ff_v4l2_get_format_height(&avbuf->context->format); - break; - - case AV_PIX_FMT_YUV420P: - if (avbuf->num_planes > 1) - break; -- frame->linesize[1] = avbuf->plane_info[0].bytesperline >> 1; -- frame->linesize[2] = avbuf->plane_info[0].bytesperline >> 1; -- frame->data[1] = frame->buf[0]->data + avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height; -- frame->data[2] = frame->data[1] + ((avbuf->plane_info[0].bytesperline * avbuf->context->format.fmt.pix_mp.height) >> 2); -+ frame->linesize[1] = frame->linesize[0] / 2; -+ frame->linesize[2] = frame->linesize[1]; -+ frame->data[1] = frame->data[0] + frame->linesize[0] * ff_v4l2_get_format_height(&avbuf->context->format); -+ frame->data[2] = frame->data[1] + frame->linesize[1] * ff_v4l2_get_format_height(&avbuf->context->format) / 2; - break; - - default: -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index be76068af3..6fe2586627 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -55,16 +55,6 @@ static inline AVCodecContext *logger(V4L2Context *ctx) - return ctx_to_m2mctx(ctx)->avctx; - } - --static inline unsigned int v4l2_get_width(struct v4l2_format *fmt) --{ -- return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.width : fmt->fmt.pix.width; --} -- --static inline unsigned int v4l2_get_height(struct v4l2_format *fmt) --{ -- return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height; --} -- - static AVRational v4l2_get_sar(V4L2Context *ctx) - { - struct AVRational sar = { 0, 1 }; -@@ -96,8 +86,8 @@ static inline unsigned int v4l2_resolution_changed(V4L2Context *ctx, struct v4l2 - if (ret) - av_log(logger(ctx), AV_LOG_DEBUG, "%s changed (%dx%d) -> (%dx%d)\n", - ctx->name, -- v4l2_get_width(fmt1), v4l2_get_height(fmt1), -- v4l2_get_width(fmt2), v4l2_get_height(fmt2)); -+ ff_v4l2_get_format_width(fmt1), ff_v4l2_get_format_height(fmt1), -+ ff_v4l2_get_format_width(fmt2), ff_v4l2_get_format_height(fmt2)); - - return ret; - } -@@ -195,8 +185,8 @@ static int do_source_change(V4L2m2mContext * const s) - - reinit = v4l2_resolution_changed(&s->capture, &cap_fmt); - if (reinit) { -- s->capture.height = v4l2_get_height(&cap_fmt); -- s->capture.width = v4l2_get_width(&cap_fmt); -+ s->capture.height = ff_v4l2_get_format_height(&cap_fmt); -+ s->capture.width = ff_v4l2_get_format_width(&cap_fmt); - } - s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture); - -@@ -973,8 +963,8 @@ static int create_buffers(V4L2Context* const ctx, const unsigned int req_buffers - av_log(logger(ctx), AV_LOG_DEBUG, "%s: %s %02d buffers initialized: %04ux%04u, sizeimage %08u, bytesperline %08u\n", ctx->name, - V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? av_fourcc2str(ctx->format.fmt.pix_mp.pixelformat) : av_fourcc2str(ctx->format.fmt.pix.pixelformat), - req.count, -- v4l2_get_width(&ctx->format), -- v4l2_get_height(&ctx->format), -+ ff_v4l2_get_format_width(&ctx->format), -+ ff_v4l2_get_format_height(&ctx->format), - V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? ctx->format.fmt.pix_mp.plane_fmt[0].sizeimage : ctx->format.fmt.pix.sizeimage, - V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? ctx->format.fmt.pix_mp.plane_fmt[0].bytesperline : ctx->format.fmt.pix.bytesperline); - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 24a9c94864..8f054f2f50 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -160,4 +160,16 @@ int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *ctx); - */ - int ff_v4l2_m2m_codec_full_reinit(V4L2m2mContext *ctx); - -+ -+static inline unsigned int ff_v4l2_get_format_width(struct v4l2_format *fmt) -+{ -+ return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.width : fmt->fmt.pix.width; -+} -+ -+static inline unsigned int ff_v4l2_get_format_height(struct v4l2_format *fmt) -+{ -+ return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height; -+} -+ -+ - #endif /* AVCODEC_V4L2_M2M_H */ - -From 14e9b4bf1b34b3d1e1e6a4fc755cc595416e7d7b Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 10 Jun 2021 19:23:44 +0100 -Subject: [PATCH 020/151] Report buffer overflows in v4l2m2m - ---- - libavcodec/v4l2_buffers.c | 14 ++++++++++---- - libavcodec/v4l2_context.c | 5 ++++- - 2 files changed, 14 insertions(+), 5 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index f4c11ca8d0..de31f7ced9 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -364,6 +364,7 @@ static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) - static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, int size, int offset) - { - unsigned int bytesused, length; -+ int rv = 0; - - if (plane >= out->num_planes) - return AVERROR(EINVAL); -@@ -371,11 +372,16 @@ static int v4l2_bufref_to_buf(V4L2Buffer *out, int plane, const uint8_t* data, i - length = out->plane_info[plane].length; - bytesused = FFMIN(size+offset, length); - -- memcpy((uint8_t*)out->plane_info[plane].mm_addr+offset, data, FFMIN(size, length-offset)); -+ if (size > length - offset) { -+ size = length - offset; -+ rv = AVERROR(ENOMEM); -+ } -+ -+ memcpy((uint8_t*)out->plane_info[plane].mm_addr+offset, data, size); - - set_buf_length(out, plane, bytesused, length); - -- return 0; -+ return rv; - } - - static AVBufferRef * wrap_avbuf(V4L2Buffer * const avbuf) -@@ -630,7 +636,7 @@ int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, - } - - ret = v4l2_bufref_to_buf(out, 0, pkt->data, pkt->size, extlen); -- if (ret) -+ if (ret && ret != AVERROR(ENOMEM)) - return ret; - - v4l2_set_pts(out, pkt->pts, no_rescale_pts); -@@ -638,7 +644,7 @@ int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, - if (pkt->flags & AV_PKT_FLAG_KEY) - out->flags = V4L2_BUF_FLAG_KEYFRAME; - -- return 0; -+ return ret; - } - - int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out) -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 6fe2586627..81aced0c2b 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -824,7 +824,10 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, - return AVERROR(EAGAIN); - - ret = ff_v4l2_buffer_avpkt_to_buf_ext(pkt, avbuf, extdata, extlen, no_rescale_pts); -- if (ret) -+ if (ret == AVERROR(ENOMEM)) -+ av_log(logger(ctx), AV_LOG_ERROR, "Buffer overflow in %s: pkt->size=%d > buf->length=%d\n", -+ __func__, pkt->size, avbuf->planes[0].length); -+ else if (ret) - return ret; - - return ff_v4l2_buffer_enqueue(avbuf); - -From 072907a7fcf160d12972997d24fdf62641687ea4 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 14 Jun 2021 11:55:16 +0100 -Subject: [PATCH 021/151] Increase V4L2 H264 stateful coded buffer size - -Try to set a min size of frame size / 2 for bitbuffers passed to V4l2. -This fixes a few streams that have large I-frames. You would hope -Annex-A gave useful minCR so an appropriate size could be calculated -but it doesn't really. It gives good guidance for bits required over -time but the instantaneous limits are very weak so it is possible -that even this won't be enough. The correct long term solution would -be to have resizable dmabufs but that is a greter rewrite than seems -sensible now. ---- - libavcodec/v4l2_context.c | 24 +++++++++++++++++++++++- - libavcodec/v4l2_context.h | 6 ++++++ - libavcodec/v4l2_m2m_dec.c | 24 ++++++++++++++++++++++++ - 3 files changed, 53 insertions(+), 1 deletion(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 81aced0c2b..a17ae027a6 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -902,7 +902,29 @@ int ff_v4l2_context_get_format(V4L2Context* ctx, int probe) - - int ff_v4l2_context_set_format(V4L2Context* ctx) - { -- return ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_S_FMT, &ctx->format); -+ int ret; -+ -+ ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_S_FMT, &ctx->format); -+ if (ret != 0) -+ return ret; -+ -+ // Check returned size against min size and if smaller have another go -+ // Only worry about plane[0] as this is meant to enforce limits for -+ // encoded streams where we might know a bit more about the shape -+ // than the driver -+ if (V4L2_TYPE_IS_MULTIPLANAR(ctx->format.type)) { -+ if (ctx->min_buf_size <= ctx->format.fmt.pix_mp.plane_fmt[0].sizeimage) -+ return 0; -+ ctx->format.fmt.pix_mp.plane_fmt[0].sizeimage = ctx->min_buf_size; -+ } -+ else { -+ if (ctx->min_buf_size <= ctx->format.fmt.pix.sizeimage) -+ return 0; -+ ctx->format.fmt.pix.sizeimage = ctx->min_buf_size; -+ } -+ -+ ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_S_FMT, &ctx->format); -+ return ret; - } - - void ff_v4l2_context_release(V4L2Context* ctx) -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index 59009d11d1..37b0431400 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -75,6 +75,12 @@ typedef struct V4L2Context { - AVRational sample_aspect_ratio; - struct v4l2_rect selection; - -+ /** -+ * If the default size of buffer is less than this then try to -+ * set to this. -+ */ -+ uint32_t min_buf_size; -+ - /** - * Indexed array of pointers to V4L2Buffers - */ -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index a4b5a4e7e9..1851acbc93 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -450,6 +450,27 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - } - #endif - -+static uint32_t max_coded_size(const AVCodecContext * const avctx) -+{ -+ uint32_t wxh = avctx->coded_width * avctx->coded_height; -+ uint32_t size; -+ -+ // Currently the only thing we try to set our own limits for is H264 -+ if (avctx->codec_id != AV_CODEC_ID_H264) -+ return 0; -+ -+ size = wxh * 3 / 2; -+ // H.264 Annex A table A-1 gives minCR which is either 2 or 4 -+ // unfortunately that doesn't yield an actually useful limit -+ // and it should be noted that frame 0 is special cased to allow -+ // a bigger number which really isn't helpful for us. So just pick -+ // frame_size / 2 -+ size /= 2; -+ // Add 64k to allow for any overheads and/or encoder hopefulness -+ // with small WxH -+ return size + (1 << 16); -+} -+ - static av_cold int v4l2_decode_init(AVCodecContext *avctx) - { - V4L2Context *capture, *output; -@@ -460,6 +481,7 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - - av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); - -+ av_log(avctx, AV_LOG_INFO, "level=%d\n", avctx->level); - ret = ff_v4l2_m2m_create_context(priv, &s); - if (ret < 0) - return ret; -@@ -476,9 +498,11 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - - output->av_codec_id = avctx->codec_id; - output->av_pix_fmt = AV_PIX_FMT_NONE; -+ output->min_buf_size = max_coded_size(avctx); - - capture->av_codec_id = AV_CODEC_ID_RAWVIDEO; - capture->av_pix_fmt = avctx->pix_fmt; -+ capture->min_buf_size = 0; - - /* the client requests the codec to generate DRM frames: - * - data[0] will therefore point to the returned AVDRMFrameDescriptor - -From 6087c8c054e1ff3d2e6e62d5e32705d079928b64 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 28 Jun 2021 12:13:35 +0100 -Subject: [PATCH 022/151] Fix raw video s.t. it respects any remaining cropping - -This fixes the long standing CONFWIN_A conformance test failure for drm. ---- - libavcodec/rawenc.c | 32 ++++++++--- - libavutil/hwcontext_drm.c | 112 ++++++++++++++++++++++++++++++++++++-- - 2 files changed, 130 insertions(+), 14 deletions(-) - -diff --git a/libavcodec/rawenc.c b/libavcodec/rawenc.c -index 594a77c42a..8ca0379e12 100644 ---- a/libavcodec/rawenc.c -+++ b/libavcodec/rawenc.c -@@ -124,32 +124,41 @@ static int raw_sand30_as_yuv420(AVCodecContext *avctx, AVPacket *pkt, - - - static int raw_encode(AVCodecContext *avctx, AVPacket *pkt, -- const AVFrame *frame, int *got_packet) -+ const AVFrame *src_frame, int *got_packet) - { - int ret; -+ AVFrame * frame = NULL; - - #if CONFIG_SAND -- if (av_rpi_is_sand_frame(frame)) { -- ret = av_rpi_is_sand8_frame(frame) ? raw_sand8_as_yuv420(avctx, pkt, frame) : -- av_rpi_is_sand16_frame(frame) ? raw_sand16_as_yuv420(avctx, pkt, frame) : -- av_rpi_is_sand30_frame(frame) ? raw_sand30_as_yuv420(avctx, pkt, frame) : -1; -+ if (av_rpi_is_sand_frame(src_frame)) { -+ ret = av_rpi_is_sand8_frame(src_frame) ? raw_sand8_as_yuv420(avctx, pkt, src_frame) : -+ av_rpi_is_sand16_frame(src_frame) ? raw_sand16_as_yuv420(avctx, pkt, src_frame) : -+ av_rpi_is_sand30_frame(src_frame) ? raw_sand30_as_yuv420(avctx, pkt, src_frame) : -1; - *got_packet = (ret == 0); - return ret; - } - #endif - -+ if ((frame = av_frame_clone(src_frame)) == NULL) { -+ ret = AVERROR(ENOMEM); -+ goto fail; -+ } -+ -+ if ((ret = av_frame_apply_cropping(frame, AV_FRAME_CROP_UNALIGNED)) < 0) -+ goto fail; -+ - ret = av_image_get_buffer_size(frame->format, - frame->width, frame->height, 1); - if (ret < 0) -- return ret; -+ goto fail; - - if ((ret = ff_get_encode_buffer(avctx, pkt, ret, 0)) < 0) -- return ret; -+ goto fail; - if ((ret = av_image_copy_to_buffer(pkt->data, pkt->size, - (const uint8_t **)frame->data, frame->linesize, - frame->format, - frame->width, frame->height, 1)) < 0) -- return ret; -+ goto fail; - - if(avctx->codec_tag == AV_RL32("yuv2") && ret > 0 && - frame->format == AV_PIX_FMT_YUYV422) { -@@ -165,8 +174,15 @@ static int raw_encode(AVCodecContext *avctx, AVPacket *pkt, - AV_WB64(&pkt->data[8 * x], v << 48 | v >> 16); - } - } -+ pkt->flags |= AV_PKT_FLAG_KEY; -+ av_frame_free(&frame); - *got_packet = 1; - return 0; -+ -+fail: -+ av_frame_free(&frame); -+ *got_packet = 0; -+ return ret; - } - - const FFCodec ff_rawvideo_encoder = { -diff --git a/libavutil/hwcontext_drm.c b/libavutil/hwcontext_drm.c -index 7a9fdbd263..baf18920fa 100644 ---- a/libavutil/hwcontext_drm.c -+++ b/libavutil/hwcontext_drm.c -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - - /* This was introduced in version 4.6. And may not exist all without an - * optional package. So to prevent a hard dependency on needing the Linux -@@ -31,6 +32,7 @@ - #endif - - #include -+#include - #include - - #include "avassert.h" -@@ -38,7 +40,9 @@ - #include "hwcontext_drm.h" - #include "hwcontext_internal.h" - #include "imgutils.h" -- -+#if CONFIG_SAND -+#include "libavutil/rpi_sand_fns.h" -+#endif - - static void drm_device_free(AVHWDeviceContext *hwdev) - { -@@ -53,6 +57,11 @@ static int drm_device_create(AVHWDeviceContext *hwdev, const char *device, - AVDRMDeviceContext *hwctx = hwdev->hwctx; - drmVersionPtr version; - -+ if (device == NULL) { -+ hwctx->fd = -1; -+ return 0; -+ } -+ - hwctx->fd = open(device, O_RDWR); - if (hwctx->fd < 0) - return AVERROR(errno); -@@ -139,6 +148,8 @@ static int drm_map_frame(AVHWFramesContext *hwfc, - if (flags & AV_HWFRAME_MAP_WRITE) - mmap_prot |= PROT_WRITE; - -+ if (dst->format == AV_PIX_FMT_NONE) -+ dst->format = hwfc->sw_format; - #if HAVE_LINUX_DMA_BUF_H - if (flags & AV_HWFRAME_MAP_READ) - map->sync_flags |= DMA_BUF_SYNC_READ; -@@ -185,6 +196,23 @@ static int drm_map_frame(AVHWFramesContext *hwfc, - - dst->width = src->width; - dst->height = src->height; -+ dst->crop_top = src->crop_top; -+ dst->crop_bottom = src->crop_bottom; -+ dst->crop_left = src->crop_left; -+ dst->crop_right = src->crop_right; -+ -+#if CONFIG_SAND -+ // Rework for sand frames -+ if (av_rpi_is_sand_frame(dst)) { -+ // As it stands the sand formats hold stride2 in linesize[3] -+ // linesize[0] & [1] contain stride1 which is always 128 for everything we do -+ // * Arguably this should be reworked s.t. stride2 is in linesize[0] & [1] -+ dst->linesize[3] = fourcc_mod_broadcom_param(desc->objects[0].format_modifier); -+ dst->linesize[0] = 128; -+ dst->linesize[1] = 128; -+ // *** Are we sure src->height is actually what we want ??? -+ } -+#endif - - err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src, - &drm_unmap_frame, map); -@@ -212,7 +240,15 @@ static int drm_transfer_get_formats(AVHWFramesContext *ctx, - if (!pix_fmts) - return AVERROR(ENOMEM); - -- pix_fmts[0] = ctx->sw_format; -+ // **** Offer native sand too ???? -+ pix_fmts[0] = -+#if CONFIG_SAND -+ ctx->sw_format == AV_PIX_FMT_RPI4_8 || ctx->sw_format == AV_PIX_FMT_SAND128 ? -+ AV_PIX_FMT_YUV420P : -+ ctx->sw_format == AV_PIX_FMT_RPI4_10 ? -+ AV_PIX_FMT_YUV420P10LE : -+#endif -+ ctx->sw_format; - pix_fmts[1] = AV_PIX_FMT_NONE; - - *formats = pix_fmts; -@@ -231,18 +267,79 @@ static int drm_transfer_data_from(AVHWFramesContext *hwfc, - map = av_frame_alloc(); - if (!map) - return AVERROR(ENOMEM); -- map->format = dst->format; - -+ // Map to default -+ map->format = AV_PIX_FMT_NONE; - err = drm_map_frame(hwfc, map, src, AV_HWFRAME_MAP_READ); - if (err) - goto fail; - -- map->width = dst->width; -- map->height = dst->height; -+#if 0 -+ av_log(hwfc, AV_LOG_INFO, "%s: src fmt=%d (%d), dst fmt=%d (%d) s=%dx%d l=%d/%d/%d/%d, d=%dx%d l=%d/%d/%d\n", __func__, -+ hwfc->sw_format, AV_PIX_FMT_RPI4_8, dst->format, AV_PIX_FMT_YUV420P10LE, -+ map->width, map->height, -+ map->linesize[0], -+ map->linesize[1], -+ map->linesize[2], -+ map->linesize[3], -+ dst->width, dst->height, -+ dst->linesize[0], -+ dst->linesize[1], -+ dst->linesize[2]); -+#endif -+#if CONFIG_SAND -+ if (av_rpi_is_sand_frame(map)) { -+ // Preserve crop - later ffmpeg code assumes that we have in that it -+ // overwrites any crop that we create with the old values -+ const unsigned int w = FFMIN(dst->width, map->width); -+ const unsigned int h = FFMIN(dst->height, map->height); -+ -+ if (map->format == AV_PIX_FMT_RPI4_8 && dst->format == AV_PIX_FMT_YUV420P) { -+ av_rpi_sand_to_planar_y8(dst->data[0], dst->linesize[0], -+ map->data[0], -+ 128, stride2, -+ 0, 0, w, h); -+ av_rpi_sand_to_planar_c8(dst->data[1], dst->linesize[1], -+ dst->data[2], dst->linesize[2], -+ map->data[1], -+ 128, stride2, -+ 0, 0, w / 2, h / 2); -+ } -+ else if (map->format == AV_PIX_FMT_RPI4_10 && dst->format == AV_PIX_FMT_YUV420P10LE) { -+ av_rpi_sand30_to_planar_y16(dst->data[0], dst->linesize[0], -+ map->data[0], -+ 128, stride2, -+ 0, 0, w, h); -+ av_rpi_sand30_to_planar_c16(dst->data[1], dst->linesize[1], -+ dst->data[2], dst->linesize[2], -+ map->data[1], -+ 128, stride2, -+ 0, 0, w / 2, h / 2); -+ } -+ else -+ { -+ av_log(hwfc, AV_LOG_ERROR, "%s: Incompatible output pixfmt for sand\n", __func__); -+ err = AVERROR(EINVAL); -+ goto fail; -+ } -+ -+ dst->width = w; -+ dst->height = h; -+ } -+ else -+#endif -+ { -+ // Kludge mapped h/w s.t. frame_copy works -+ map->width = dst->width; -+ map->height = dst->height; -+ err = av_frame_copy(dst, map); -+ } - -- err = av_frame_copy(dst, map); - if (err) -+ { -+ av_log(hwfc, AV_LOG_ERROR, "%s: Copy fail\n", __func__); - goto fail; -+ } - - err = 0; - fail: -@@ -257,7 +354,10 @@ static int drm_transfer_data_to(AVHWFramesContext *hwfc, - int err; - - if (src->width > hwfc->width || src->height > hwfc->height) -+ { -+ av_log(hwfc, AV_LOG_ERROR, "%s: H/w mismatch: %d/%d, %d/%d\n", __func__, dst->width, hwfc->width, dst->height, hwfc->height); - return AVERROR(EINVAL); -+ } - - map = av_frame_alloc(); - if (!map) - -From 597858c11fbfbe0f54c1b68d9683025929258bc1 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 13 Aug 2021 15:38:28 +0100 -Subject: [PATCH 023/151] Set frame interlace from V4L2 buffer field - ---- - libavcodec/v4l2_buffers.c | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index de31f7ced9..97b8eb1db3 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -222,6 +222,16 @@ static enum AVColorTransferCharacteristic v4l2_get_color_trc(V4L2Buffer *buf) - return AVCOL_TRC_UNSPECIFIED; - } - -+static int v4l2_buf_is_interlaced(const V4L2Buffer * const buf) -+{ -+ return V4L2_FIELD_IS_INTERLACED(buf->buf.field); -+} -+ -+static int v4l2_buf_is_top_first(const V4L2Buffer * const buf) -+{ -+ return buf->buf.field == V4L2_FIELD_INTERLACED_TB; -+} -+ - static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf) - { - AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; -@@ -576,6 +586,8 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf, int no_resc - frame->color_trc = v4l2_get_color_trc(avbuf); - frame->pts = v4l2_get_pts(avbuf, no_rescale_pts); - frame->pkt_dts = AV_NOPTS_VALUE; -+ frame->interlaced_frame = v4l2_buf_is_interlaced(avbuf); -+ frame->top_field_first = v4l2_buf_is_top_first(avbuf); - - /* these values are updated also during re-init in v4l2_process_driver_event */ - frame->height = ctx->height; - -From 05906e2086b5087d615485ec9a09b1493dbb32e1 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 13 Aug 2021 16:11:53 +0100 -Subject: [PATCH 024/151] Fix V4L2 stateful to avoid crash if flush before - start - ---- - libavcodec/v4l2_context.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index a17ae027a6..eb901e8fab 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -713,6 +713,10 @@ static int v4l2_get_coded_format(V4L2Context* ctx, uint32_t *p) - static void flush_all_buffers_status(V4L2Context* const ctx) - { - int i; -+ -+ if (!ctx->bufrefs) -+ return; -+ - for (i = 0; i < ctx->num_buffers; ++i) { - struct V4L2Buffer * const buf = (struct V4L2Buffer *)ctx->bufrefs[i]->data; - if (buf->status == V4L2BUF_IN_DRIVER) - -From 7157b6032e759078a7d751e5dd5762970f3d1e8c Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 9 Sep 2021 17:44:13 +0100 -Subject: [PATCH 025/151] Copy properties from frame to v4l2 buffer - -Now copies all the properties in ff_v4l2_buffer_avframe_to_buf that -ff_v4l2_buffer_buf_to_avframe copies ---- - libavcodec/v4l2_buffers.c | 126 ++++++++++++++++++++++++++++++++++++++ - 1 file changed, 126 insertions(+) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 97b8eb1db3..126d2a17f4 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -128,6 +128,105 @@ static enum AVColorPrimaries v4l2_get_color_primaries(V4L2Buffer *buf) - return AVCOL_PRI_UNSPECIFIED; - } - -+static void v4l2_set_color(V4L2Buffer *buf, -+ const enum AVColorPrimaries avcp, -+ const enum AVColorSpace avcs, -+ const enum AVColorTransferCharacteristic avxc) -+{ -+ enum v4l2_ycbcr_encoding ycbcr = V4L2_YCBCR_ENC_DEFAULT; -+ enum v4l2_colorspace cs = V4L2_COLORSPACE_DEFAULT; -+ enum v4l2_xfer_func xfer = V4L2_XFER_FUNC_DEFAULT; -+ -+ switch (avcp) { -+ case AVCOL_PRI_BT709: -+ cs = V4L2_COLORSPACE_REC709; -+ ycbcr = V4L2_YCBCR_ENC_709; -+ break; -+ case AVCOL_PRI_BT470M: -+ cs = V4L2_COLORSPACE_470_SYSTEM_M; -+ ycbcr = V4L2_YCBCR_ENC_601; -+ break; -+ case AVCOL_PRI_BT470BG: -+ cs = V4L2_COLORSPACE_470_SYSTEM_BG; -+ break; -+ case AVCOL_PRI_SMPTE170M: -+ cs = V4L2_COLORSPACE_SMPTE170M; -+ break; -+ case AVCOL_PRI_SMPTE240M: -+ cs = V4L2_COLORSPACE_SMPTE240M; -+ break; -+ case AVCOL_PRI_BT2020: -+ cs = V4L2_COLORSPACE_BT2020; -+ break; -+ case AVCOL_PRI_SMPTE428: -+ case AVCOL_PRI_SMPTE431: -+ case AVCOL_PRI_SMPTE432: -+ case AVCOL_PRI_EBU3213: -+ case AVCOL_PRI_RESERVED: -+ case AVCOL_PRI_FILM: -+ case AVCOL_PRI_UNSPECIFIED: -+ default: -+ break; -+ } -+ -+ switch (avcs) { -+ case AVCOL_SPC_RGB: -+ cs = V4L2_COLORSPACE_SRGB; -+ break; -+ case AVCOL_SPC_BT709: -+ cs = V4L2_COLORSPACE_REC709; -+ break; -+ case AVCOL_SPC_FCC: -+ cs = V4L2_COLORSPACE_470_SYSTEM_M; -+ break; -+ case AVCOL_SPC_BT470BG: -+ cs = V4L2_COLORSPACE_470_SYSTEM_BG; -+ break; -+ case AVCOL_SPC_SMPTE170M: -+ cs = V4L2_COLORSPACE_SMPTE170M; -+ break; -+ case AVCOL_SPC_SMPTE240M: -+ cs = V4L2_COLORSPACE_SMPTE240M; -+ break; -+ case AVCOL_SPC_BT2020_CL: -+ cs = V4L2_COLORSPACE_BT2020; -+ ycbcr = V4L2_YCBCR_ENC_BT2020_CONST_LUM; -+ break; -+ case AVCOL_SPC_BT2020_NCL: -+ cs = V4L2_COLORSPACE_BT2020; -+ break; -+ default: -+ break; -+ } -+ -+ switch (xfer) { -+ case AVCOL_TRC_BT709: -+ xfer = V4L2_XFER_FUNC_709; -+ break; -+ case AVCOL_TRC_IEC61966_2_1: -+ xfer = V4L2_XFER_FUNC_SRGB; -+ break; -+ case AVCOL_TRC_SMPTE240M: -+ xfer = V4L2_XFER_FUNC_SMPTE240M; -+ break; -+ case AVCOL_TRC_SMPTE2084: -+ xfer = V4L2_XFER_FUNC_SMPTE2084; -+ break; -+ default: -+ break; -+ } -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(buf->buf.type)) { -+ buf->context->format.fmt.pix_mp.colorspace = cs; -+ buf->context->format.fmt.pix_mp.ycbcr_enc = ycbcr; -+ buf->context->format.fmt.pix_mp.xfer_func = xfer; -+ } else { -+ buf->context->format.fmt.pix.colorspace = cs; -+ buf->context->format.fmt.pix.ycbcr_enc = ycbcr; -+ buf->context->format.fmt.pix.xfer_func = xfer; -+ } -+} -+ - static enum AVColorRange v4l2_get_color_range(V4L2Buffer *buf) - { - enum v4l2_quantization qt; -@@ -146,6 +245,20 @@ static enum AVColorRange v4l2_get_color_range(V4L2Buffer *buf) - return AVCOL_RANGE_UNSPECIFIED; - } - -+static void v4l2_set_color_range(V4L2Buffer *buf, const enum AVColorRange avcr) -+{ -+ const enum v4l2_quantization q = -+ avcr == AVCOL_RANGE_MPEG ? V4L2_QUANTIZATION_LIM_RANGE : -+ avcr == AVCOL_RANGE_JPEG ? V4L2_QUANTIZATION_FULL_RANGE : -+ V4L2_QUANTIZATION_DEFAULT; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(buf->buf.type)) { -+ buf->context->format.fmt.pix_mp.quantization = q; -+ } else { -+ buf->context->format.fmt.pix.quantization = q; -+ } -+} -+ - static enum AVColorSpace v4l2_get_color_space(V4L2Buffer *buf) - { - enum v4l2_ycbcr_encoding ycbcr; -@@ -232,6 +345,12 @@ static int v4l2_buf_is_top_first(const V4L2Buffer * const buf) - return buf->buf.field == V4L2_FIELD_INTERLACED_TB; - } - -+static void v4l2_set_interlace(V4L2Buffer * const buf, const int is_interlaced, const int is_tff) -+{ -+ buf->buf.field = !is_interlaced ? V4L2_FIELD_NONE : -+ is_tff ? V4L2_FIELD_INTERLACED_TB : V4L2_FIELD_INTERLACED_BT; -+} -+ - static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf) - { - AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; -@@ -561,7 +680,14 @@ static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - - int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - { -+ out->buf.flags = frame->key_frame ? (out->buf.flags & ~V4L2_BUF_FLAG_KEYFRAME) : (out->buf.flags | V4L2_BUF_FLAG_KEYFRAME); -+ // Beware that colour info is held in format rather than the actual -+ // v4l2 buffer struct so this may not be as useful as you might hope -+ v4l2_set_color(out, frame->color_primaries, frame->colorspace, frame->color_trc); -+ v4l2_set_color_range(out, frame->color_range); -+ // PTS & interlace are buffer vars - v4l2_set_pts(out, frame->pts, 0); -+ v4l2_set_interlace(out, frame->interlaced_frame, frame->top_field_first); - - return v4l2_buffer_swframe_to_buf(frame, out); - } - -From 15415ab226f966fd12e70d79fde3cb80f3d09144 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 17 Nov 2021 16:49:01 +0000 -Subject: [PATCH 026/151] ffmpeg: Do not inc DTS on no decode output - -V4L2 H264 decode has long latency and sometimes spits out a long stream -of output without input. In this case incrementing DTS is wrong. There -may be cases where the condition as written is correct so only "fix" in -the cases which cause problems ---- - fftools/ffmpeg.c | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c -index 5dc2cd73c1..ba0c1898cf 100644 ---- a/fftools/ffmpeg.c -+++ b/fftools/ffmpeg.c -@@ -2609,7 +2609,12 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo - case AVMEDIA_TYPE_VIDEO: - ret = decode_video (ist, repeating ? NULL : avpkt, &got_output, &duration_pts, !pkt, - &decode_failed); -- if (!repeating || !pkt || got_output) { -+ // Pi: Do not inc dts if no_cvt_hw set -+ // V4L2 H264 decode has long latency and sometimes spits out a long -+ // stream of output without input. In this case incrementing DTS is wrong. -+ // There may be cases where the condition as written is correct so only -+ // "fix" in the cases which cause problems -+ if (!repeating || !pkt || (got_output && !no_cvt_hw)) { - if (pkt && pkt->duration) { - duration_dts = av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q); - } else if(ist->dec_ctx->framerate.num != 0 && ist->dec_ctx->framerate.den != 0) { - -From 7bf6c062ed8a1e635aa5722c0072724f236daf00 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 17 Nov 2021 17:32:59 +0000 -Subject: [PATCH 027/151] v4l2_m2m_dec: Adjust timebase if H264 - -Adjust AVCodecContext time_base if H264 in the same way that the -software decoder does. ---- - libavcodec/v4l2_m2m_dec.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 1851acbc93..aa1e5c1597 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -481,6 +481,16 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - - av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); - -+ if (avctx->codec_id == AV_CODEC_ID_H264) { -+ if (avctx->ticks_per_frame == 1) { -+ if(avctx->time_base.den < INT_MAX/2) { -+ avctx->time_base.den *= 2; -+ } else -+ avctx->time_base.num /= 2; -+ } -+ avctx->ticks_per_frame = 2; -+ } -+ - av_log(avctx, AV_LOG_INFO, "level=%d\n", avctx->level); - ret = ff_v4l2_m2m_create_context(priv, &s); - if (ret < 0) - -From 3cd23a761397ae75ed032c1687da5d6b76ddaaaa Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 17 Nov 2021 17:38:27 +0000 -Subject: [PATCH 028/151] v4l2_m2m_dec: Produce best guess PTSs if none - supplied - -Filter scheduling gets confused by missing PTSs and makes poor guesses -more often than not. Try to generate plausible timestamps where we are -missing them. ---- - libavcodec/v4l2_m2m.h | 12 ++++++++ - libavcodec/v4l2_m2m_dec.c | 64 +++++++++++++++++++++++++++++++++++++-- - 2 files changed, 74 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 8f054f2f50..82feb0afdb 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -52,6 +52,16 @@ typedef struct V4L2m2mTrackEl { - int64_t track_pts; - } V4L2m2mTrackEl; - -+typedef struct pts_stats_s -+{ -+ void * logctx; -+ const char * name; // For debug -+ unsigned int last_count; -+ unsigned int last_interval; -+ int64_t last_pts; -+ int64_t guess; -+} pts_stats_t; -+ - typedef struct V4L2m2mContext { - char devname[PATH_MAX]; - int fd; -@@ -91,6 +101,8 @@ typedef struct V4L2m2mContext { - unsigned int track_no; - V4L2m2mTrackEl track_els[FF_V4L2_M2M_TRACK_SIZE]; - -+ pts_stats_t pts_stat; -+ - /* req pkt */ - int req_pkt; - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index aa1e5c1597..a5a2afbd27 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -42,6 +42,62 @@ - #include "v4l2_m2m.h" - #include "v4l2_fmt.h" - -+// Pick 64 for max last count - that is >1sec at 60fps -+#define STATS_LAST_COUNT_MAX 64 -+#define STATS_INTERVAL_MAX (1 << 30) -+ -+static int64_t pts_stats_guess(const pts_stats_t * const stats) -+{ -+ if (stats->last_pts == AV_NOPTS_VALUE || -+ stats->last_interval == 0 || -+ stats->last_count >= STATS_LAST_COUNT_MAX) -+ return AV_NOPTS_VALUE; -+ return stats->last_pts + (int64_t)(stats->last_count - 1) * (int64_t)stats->last_interval; -+} -+ -+static void pts_stats_add(pts_stats_t * const stats, int64_t pts) -+{ -+ if (pts == AV_NOPTS_VALUE || pts == stats->last_pts) { -+ if (stats->last_count < STATS_LAST_COUNT_MAX) -+ ++stats->last_count; -+ return; -+ } -+ -+ if (stats->last_pts != AV_NOPTS_VALUE) { -+ const int64_t interval = pts - stats->last_pts; -+ -+ if (interval < 0 || interval >= STATS_INTERVAL_MAX || -+ stats->last_count >= STATS_LAST_COUNT_MAX) { -+ if (stats->last_interval != 0) -+ av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: Bad interval: %" PRId64 "/%d\n", -+ __func__, stats->name, interval, stats->last_count); -+ stats->last_interval = 0; -+ } -+ else { -+ const int64_t frame_time = interval / (int64_t)stats->last_count; -+ -+ if (frame_time != stats->last_interval) -+ av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: New interval: %u->%" PRId64 "/%d=%" PRId64 "\n", -+ __func__, stats->name, stats->last_interval, interval, stats->last_count, frame_time); -+ stats->last_interval = frame_time; -+ } -+ } -+ -+ stats->last_pts = pts; -+ stats->last_count = 1; -+} -+ -+static void pts_stats_init(pts_stats_t * const stats, void * logctx, const char * name) -+{ -+ *stats = (pts_stats_t){ -+ .logctx = logctx, -+ .name = name, -+ .last_count = 1, -+ .last_interval = 0, -+ .last_pts = AV_NOPTS_VALUE -+ }; -+} -+ - static int check_output_streamon(AVCodecContext *const avctx, V4L2m2mContext *const s) - { - int ret; -@@ -244,9 +300,11 @@ xlat_pts_out(AVCodecContext *const avctx, V4L2m2mContext *const s, AVFrame *cons - return -1; - } - -- frame->best_effort_timestamp = frame->pts; -+ pts_stats_add(&s->pts_stat, frame->pts); -+ -+ frame->best_effort_timestamp = pts_stats_guess(&s->pts_stat); - frame->pkt_dts = frame->pts; // We can't emulate what s/w does in a useful manner? -- av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 ", DTS=%" PRId64 "\n", frame->pts, frame->pkt_dts); -+ av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 "\n", frame->pts, frame->best_effort_timestamp, frame->pkt_dts); - return 0; - } - -@@ -496,6 +554,8 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - if (ret < 0) - return ret; - -+ pts_stats_init(&s->pts_stat, avctx, "decoder"); -+ - capture = &s->capture; - output = &s->output; - - -From ee8be1e900f98212b6c4940980cc7a80becfc07c Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 17 Nov 2021 17:59:27 +0000 -Subject: [PATCH 029/151] v4l2_m2m_dec: Try harder to get an initial frame - -If the input Q is full then wait on a short timeout for a capture frame -rather than stuffing yet still another frame into the input if we could -do that first. This attempts to restrict the sometimes daft initial -buffering that ends up confusing the rest of the system. ---- - libavcodec/v4l2_context.c | 2 +- - libavcodec/v4l2_m2m_dec.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index eb901e8fab..ee5dc7b8d4 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -381,7 +381,7 @@ static V4L2Buffer* v4l2_dequeue_v4l2buf(V4L2Context *ctx, int timeout) - start: - if (is_capture) { - /* no need to listen to requests for more input while draining */ -- if (ctx_to_m2mctx(ctx)->draining) -+ if (ctx_to_m2mctx(ctx)->draining || timeout > 0) - pfd.events = POLLIN | POLLRDNORM | POLLPRI; - } else { - pfd.events = POLLOUT | POLLWRNORM; -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index a5a2afbd27..b49f470c0a 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -442,7 +442,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - // when discarding - // This returns AVERROR(EAGAIN) if there isn't a frame ready yet - // but there is room in the input Q -- dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, -1, 1); -+ dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, src_rv == NQ_Q_FULL ? 100 : -1, 1); - - if (dst_rv == AVERROR_EOF && (s->draining || s->capture.done)) - av_log(avctx, AV_LOG_DEBUG, "Dequeue EOF: draining=%d, cap.done=%d\n", - -From 72da14331c2160a12b69d666d493e0e74c5e8914 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 17 Nov 2021 18:04:56 +0000 -Subject: [PATCH 030/151] Add a V4L2 M2M deinterlace filter - -Add a V4L2 deinterlace filter that will accept DRMPRIME frames. - -Multiple people have contributed to this: -Jernej Skrabec -Alex Bee -popcornmix -John Cox - -There is an unknown delay through the filter of typically one or three -fields which translates to 1 or 2 frames. Frames that are delayed are -lost at end of stream as the V4L2 filter has no flush control. ---- - libavcodec/v4l2_context.c | 4 +- - libavfilter/Makefile | 1 + - libavfilter/allfilters.c | 1 + - libavfilter/vf_deinterlace_v4l2m2m.c | 1269 ++++++++++++++++++++++++++ - 4 files changed, 1273 insertions(+), 2 deletions(-) - create mode 100644 libavfilter/vf_deinterlace_v4l2m2m.c - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index ee5dc7b8d4..440dfaaba5 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -498,10 +498,10 @@ dequeue: - return NULL; - } - --ctx->q_count; -- av_log(logger(ctx), AV_LOG_DEBUG, "--- %s VIDIOC_DQBUF OK: index=%d, ts=%ld.%06ld, count=%d, dq=%d\n", -+ av_log(logger(ctx), AV_LOG_DEBUG, "--- %s VIDIOC_DQBUF OK: index=%d, ts=%ld.%06ld, count=%d, dq=%d field=%d\n", - ctx->name, buf.index, - buf.timestamp.tv_sec, buf.timestamp.tv_usec, -- ctx->q_count, ++ctx->dq_count); -+ ctx->q_count, ++ctx->dq_count, buf.field); - - avbuf = (V4L2Buffer *)ctx->bufrefs[buf.index]->data; - avbuf->status = V4L2BUF_AVAILABLE; -diff --git a/libavfilter/Makefile b/libavfilter/Makefile -index c14fc995a0..0e7b5856bd 100644 ---- a/libavfilter/Makefile -+++ b/libavfilter/Makefile -@@ -262,6 +262,7 @@ OBJS-$(CONFIG_DEFLATE_FILTER) += vf_neighbor.o - OBJS-$(CONFIG_DEFLICKER_FILTER) += vf_deflicker.o - OBJS-$(CONFIG_DEINTERLACE_QSV_FILTER) += vf_vpp_qsv.o - OBJS-$(CONFIG_DEINTERLACE_VAAPI_FILTER) += vf_deinterlace_vaapi.o vaapi_vpp.o -+OBJS-$(CONFIG_DEINTERLACE_V4L2M2M_FILTER) += vf_deinterlace_v4l2m2m.o - OBJS-$(CONFIG_DEJUDDER_FILTER) += vf_dejudder.o - OBJS-$(CONFIG_DELOGO_FILTER) += vf_delogo.o - OBJS-$(CONFIG_DENOISE_VAAPI_FILTER) += vf_misc_vaapi.o vaapi_vpp.o -diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c -index b990a00152..357ff61ca8 100644 ---- a/libavfilter/allfilters.c -+++ b/libavfilter/allfilters.c -@@ -248,6 +248,7 @@ extern const AVFilter ff_vf_derain; - extern const AVFilter ff_vf_deshake; - extern const AVFilter ff_vf_deshake_opencl; - extern const AVFilter ff_vf_despill; -+extern const AVFilter ff_vf_deinterlace_v4l2m2m; - extern const AVFilter ff_vf_detelecine; - extern const AVFilter ff_vf_dilation; - extern const AVFilter ff_vf_dilation_opencl; -diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c -new file mode 100644 -index 0000000000..1a933b7e0a ---- /dev/null -+++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -0,0 +1,1269 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+/** -+ * @file -+ * deinterlace video filter - V4L2 M2M -+ */ -+ -+#include -+ -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "libavutil/avassert.h" -+#include "libavutil/avstring.h" -+#include "libavutil/common.h" -+#include "libavutil/hwcontext.h" -+#include "libavutil/hwcontext_drm.h" -+#include "libavutil/internal.h" -+#include "libavutil/mathematics.h" -+#include "libavutil/opt.h" -+#include "libavutil/pixdesc.h" -+#include "libavutil/time.h" -+ -+#define FF_INTERNAL_FIELDS 1 -+#include "framequeue.h" -+#include "filters.h" -+#include "avfilter.h" -+#include "formats.h" -+#include "internal.h" -+#include "video.h" -+ -+typedef struct V4L2Queue V4L2Queue; -+typedef struct DeintV4L2M2MContextShared DeintV4L2M2MContextShared; -+ -+typedef struct V4L2PlaneInfo { -+ int bytesperline; -+ size_t length; -+} V4L2PlaneInfo; -+ -+typedef struct V4L2Buffer { -+ int enqueued; -+ int reenqueue; -+ int fd; -+ struct v4l2_buffer buffer; -+ AVFrame frame; -+ struct v4l2_plane planes[VIDEO_MAX_PLANES]; -+ int num_planes; -+ V4L2PlaneInfo plane_info[VIDEO_MAX_PLANES]; -+ AVDRMFrameDescriptor drm_frame; -+ V4L2Queue *q; -+} V4L2Buffer; -+ -+typedef struct V4L2Queue { -+ struct v4l2_format format; -+ int num_buffers; -+ V4L2Buffer *buffers; -+ DeintV4L2M2MContextShared *ctx; -+} V4L2Queue; -+ -+typedef struct pts_stats_s -+{ -+ void * logctx; -+ const char * name; // For debug -+ unsigned int last_count; -+ unsigned int last_interval; -+ int64_t last_pts; -+} pts_stats_t; -+ -+#define PTS_TRACK_SIZE 32 -+typedef struct pts_track_el_s -+{ -+ uint32_t n; -+ unsigned int interval; -+ AVFrame * props; -+} pts_track_el_t; -+ -+typedef struct pts_track_s -+{ -+ uint32_t n; -+ uint32_t last_n; -+ int got_2; -+ void * logctx; -+ pts_stats_t stats; -+ pts_track_el_t a[PTS_TRACK_SIZE]; -+} pts_track_t; -+ -+typedef struct DeintV4L2M2MContextShared { -+ void * logctx; // For logging - will be NULL when done -+ -+ int fd; -+ int done; -+ int width; -+ int height; -+ int orig_width; -+ int orig_height; -+ atomic_uint refcount; -+ -+ AVBufferRef *hw_frames_ctx; -+ -+ unsigned int field_order; -+ -+ pts_track_t track; -+ -+ V4L2Queue output; -+ V4L2Queue capture; -+} DeintV4L2M2MContextShared; -+ -+typedef struct DeintV4L2M2MContext { -+ const AVClass *class; -+ -+ DeintV4L2M2MContextShared *shared; -+} DeintV4L2M2MContext; -+ -+static unsigned int pts_stats_interval(const pts_stats_t * const stats) -+{ -+ return stats->last_interval; -+} -+ -+// Pick 64 for max last count - that is >1sec at 60fps -+#define STATS_LAST_COUNT_MAX 64 -+#define STATS_INTERVAL_MAX (1 << 30) -+static void pts_stats_add(pts_stats_t * const stats, int64_t pts) -+{ -+ if (pts == AV_NOPTS_VALUE || pts == stats->last_pts) { -+ if (stats->last_count < STATS_LAST_COUNT_MAX) -+ ++stats->last_count; -+ return; -+ } -+ -+ if (stats->last_pts != AV_NOPTS_VALUE) { -+ const int64_t interval = pts - stats->last_pts; -+ -+ if (interval < 0 || interval >= STATS_INTERVAL_MAX || -+ stats->last_count >= STATS_LAST_COUNT_MAX) { -+ if (stats->last_interval != 0) -+ av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: Bad interval: %" PRId64 "/%d\n", -+ __func__, stats->name, interval, stats->last_count); -+ stats->last_interval = 0; -+ } -+ else { -+ const int64_t frame_time = interval / (int64_t)stats->last_count; -+ -+ if (frame_time != stats->last_interval) -+ av_log(stats->logctx, AV_LOG_DEBUG, "%s: %s: New interval: %u->%" PRId64 "/%d=%" PRId64 "\n", -+ __func__, stats->name, stats->last_interval, interval, stats->last_count, frame_time); -+ stats->last_interval = frame_time; -+ } -+ } -+ -+ stats->last_pts = pts; -+ stats->last_count = 1; -+} -+ -+static void pts_stats_init(pts_stats_t * const stats, void * logctx, const char * name) -+{ -+ *stats = (pts_stats_t){ -+ .logctx = logctx, -+ .name = name, -+ .last_count = 1, -+ .last_interval = 0, -+ .last_pts = AV_NOPTS_VALUE -+ }; -+} -+ -+static inline uint32_t pts_track_next_n(pts_track_t * const trk) -+{ -+ if (++trk->n == 0) -+ trk->n = 1; -+ return trk->n; -+} -+ -+static int pts_track_get_frame(pts_track_t * const trk, const struct timeval tv, AVFrame * const dst) -+{ -+ uint32_t n = (uint32_t)(tv.tv_usec / 2 + tv.tv_sec * 500000); -+ pts_track_el_t * t; -+ -+ // As a first guess assume that n==0 means last frame -+ if (n == 0) { -+ n = trk->last_n; -+ if (n == 0) -+ goto fail; -+ } -+ -+ t = trk->a + (n & (PTS_TRACK_SIZE - 1)); -+ -+ if (t->n != n) { -+ av_log(trk->logctx, AV_LOG_ERROR, "%s: track failure: got %u, expected %u\n", __func__, n, trk->n); -+ goto fail; -+ } -+ -+ // 1st frame is simple - just believe it -+ if (n != trk->last_n) { -+ trk->last_n = n; -+ trk->got_2 = 0; -+ return av_frame_copy_props(dst, t->props); -+ } -+ -+ // Only believe in a single interpolated frame -+ if (trk->got_2) -+ goto fail; -+ trk->got_2 = 1; -+ -+ av_frame_copy_props(dst, t->props); -+ -+ -+ // If we can't guess - don't -+ if (t->interval == 0) { -+ dst->best_effort_timestamp = AV_NOPTS_VALUE; -+ dst->pts = AV_NOPTS_VALUE; -+ dst->pkt_dts = AV_NOPTS_VALUE; -+ } -+ else { -+ if (dst->best_effort_timestamp != AV_NOPTS_VALUE) -+ dst->best_effort_timestamp += t->interval / 2; -+ if (dst->pts != AV_NOPTS_VALUE) -+ dst->pts += t->interval / 2; -+ if (dst->pkt_dts != AV_NOPTS_VALUE) -+ dst->pkt_dts += t->interval / 2; -+ } -+ -+ return 0; -+ -+fail: -+ trk->last_n = 0; -+ trk->got_2 = 0; -+ dst->pts = AV_NOPTS_VALUE; -+ dst->pkt_dts = AV_NOPTS_VALUE; -+ return 0; -+} -+ -+static struct timeval pts_track_add_frame(pts_track_t * const trk, const AVFrame * const src) -+{ -+ const uint32_t n = pts_track_next_n(trk); -+ pts_track_el_t * const t = trk->a + (n & (PTS_TRACK_SIZE - 1)); -+ -+ pts_stats_add(&trk->stats, src->pts); -+ -+ t->n = n; -+ t->interval = pts_stats_interval(&trk->stats); // guess that next interval is the same as the last -+ av_frame_unref(t->props); -+ av_frame_copy_props(t->props, src); -+ -+ // We now know what the previous interval was, rather than having to guess, -+ // so set it. There is a better than decent chance that this is before -+ // we use it. -+ if (t->interval != 0) { -+ pts_track_el_t * const prev_t = trk->a + ((n - 1) & (PTS_TRACK_SIZE - 1)); -+ prev_t->interval = t->interval; -+ } -+ -+ // In case deinterlace interpolates frames use every other usec -+ return (struct timeval){.tv_sec = n / 500000, .tv_usec = (n % 500000) * 2}; -+} -+ -+static void pts_track_uninit(pts_track_t * const trk) -+{ -+ unsigned int i; -+ for (i = 0; i != PTS_TRACK_SIZE; ++i) { -+ trk->a[i].n = 0; -+ av_frame_free(&trk->a[i].props); -+ } -+} -+ -+static int pts_track_init(pts_track_t * const trk, void *logctx) -+{ -+ unsigned int i; -+ trk->n = 1; -+ pts_stats_init(&trk->stats, logctx, "track"); -+ for (i = 0; i != PTS_TRACK_SIZE; ++i) { -+ trk->a[i].n = 0; -+ if ((trk->a[i].props = av_frame_alloc()) == NULL) { -+ pts_track_uninit(trk); -+ return AVERROR(ENOMEM); -+ } -+ } -+ return 0; -+} -+ -+static int deint_v4l2m2m_prepare_context(DeintV4L2M2MContextShared *ctx) -+{ -+ struct v4l2_capability cap; -+ int ret; -+ -+ memset(&cap, 0, sizeof(cap)); -+ ret = ioctl(ctx->fd, VIDIOC_QUERYCAP, &cap); -+ if (ret < 0) -+ return ret; -+ -+ if (!(cap.capabilities & V4L2_CAP_STREAMING)) -+ return AVERROR(EINVAL); -+ -+ if (cap.capabilities & V4L2_CAP_VIDEO_M2M) { -+ ctx->capture.format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; -+ ctx->output.format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; -+ -+ return 0; -+ } -+ -+ if (cap.capabilities & V4L2_CAP_VIDEO_M2M_MPLANE) { -+ ctx->capture.format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; -+ ctx->output.format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; -+ -+ return 0; -+ } -+ -+ return AVERROR(EINVAL); -+} -+ -+static int deint_v4l2m2m_try_format(V4L2Queue *queue) -+{ -+ struct v4l2_format *fmt = &queue->format; -+ DeintV4L2M2MContextShared *ctx = queue->ctx; -+ int ret, field; -+ -+ ret = ioctl(ctx->fd, VIDIOC_G_FMT, fmt); -+ if (ret) -+ av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_G_FMT failed: %d\n", ret); -+ -+ if (V4L2_TYPE_IS_OUTPUT(fmt->type)) -+ field = V4L2_FIELD_INTERLACED_TB; -+ else -+ field = V4L2_FIELD_NONE; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ fmt->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_YUV420; -+ fmt->fmt.pix_mp.field = field; -+ fmt->fmt.pix_mp.width = ctx->width; -+ fmt->fmt.pix_mp.height = ctx->height; -+ } else { -+ fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420; -+ fmt->fmt.pix.field = field; -+ fmt->fmt.pix.width = ctx->width; -+ fmt->fmt.pix.height = ctx->height; -+ } -+ -+ av_log(ctx->logctx, AV_LOG_DEBUG, "%s: Trying format for type %d, wxh: %dx%d, fmt: %08x, size %u bpl %u pre\n", __func__, -+ fmt->type, fmt->fmt.pix_mp.width, fmt->fmt.pix_mp.height, -+ fmt->fmt.pix_mp.pixelformat, -+ fmt->fmt.pix_mp.plane_fmt[0].sizeimage, fmt->fmt.pix_mp.plane_fmt[0].bytesperline); -+ -+ ret = ioctl(ctx->fd, VIDIOC_TRY_FMT, fmt); -+ if (ret) -+ return AVERROR(EINVAL); -+ -+ av_log(ctx->logctx, AV_LOG_DEBUG, "%s: Trying format for type %d, wxh: %dx%d, fmt: %08x, size %u bpl %u post\n", __func__, -+ fmt->type, fmt->fmt.pix_mp.width, fmt->fmt.pix_mp.height, -+ fmt->fmt.pix_mp.pixelformat, -+ fmt->fmt.pix_mp.plane_fmt[0].sizeimage, fmt->fmt.pix_mp.plane_fmt[0].bytesperline); -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ if (fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_YUV420 || -+ fmt->fmt.pix_mp.field != field) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); -+ -+ return AVERROR(EINVAL); -+ } -+ } else { -+ if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_YUV420 || -+ fmt->fmt.pix.field != field) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); -+ -+ return AVERROR(EINVAL); -+ } -+ } -+ -+ return 0; -+} -+ -+static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t field, int width, int height, int pitch, int ysize) -+{ -+ struct v4l2_format *fmt = &queue->format; -+ DeintV4L2M2MContextShared *ctx = queue->ctx; -+ int ret; -+ -+ struct v4l2_selection sel = { -+ .type = fmt->type, -+ .target = V4L2_TYPE_IS_OUTPUT(fmt->type) ? V4L2_SEL_TGT_CROP_BOUNDS : V4L2_SEL_TGT_COMPOSE_BOUNDS, -+ }; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ fmt->fmt.pix_mp.field = field; -+ fmt->fmt.pix_mp.width = width; -+ fmt->fmt.pix_mp.height = ysize / pitch; -+ fmt->fmt.pix_mp.plane_fmt[0].bytesperline = pitch; -+ fmt->fmt.pix_mp.plane_fmt[0].sizeimage = ysize + (ysize >> 1); -+ } else { -+ fmt->fmt.pix.field = field; -+ fmt->fmt.pix.width = width; -+ fmt->fmt.pix.height = height; -+ fmt->fmt.pix.sizeimage = 0; -+ fmt->fmt.pix.bytesperline = 0; -+ } -+ -+ ret = ioctl(ctx->fd, VIDIOC_S_FMT, fmt); -+ if (ret) -+ av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_S_FMT failed: %d\n", ret); -+ -+ ret = ioctl(ctx->fd, VIDIOC_G_SELECTION, &sel); -+ if (ret) -+ av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_G_SELECTION failed: %d\n", ret); -+ -+ sel.r.width = width; -+ sel.r.height = height; -+ sel.r.left = 0; -+ sel.r.top = 0; -+ sel.target = V4L2_TYPE_IS_OUTPUT(fmt->type) ? V4L2_SEL_TGT_CROP : V4L2_SEL_TGT_COMPOSE, -+ sel.flags = V4L2_SEL_FLAG_LE; -+ -+ ret = ioctl(ctx->fd, VIDIOC_S_SELECTION, &sel); -+ if (ret) -+ av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_S_SELECTION failed: %d\n", ret); -+ -+ return ret; -+} -+ -+static int deint_v4l2m2m_probe_device(DeintV4L2M2MContextShared *ctx, char *node) -+{ -+ int ret; -+ -+ ctx->fd = open(node, O_RDWR | O_NONBLOCK, 0); -+ if (ctx->fd < 0) -+ return AVERROR(errno); -+ -+ ret = deint_v4l2m2m_prepare_context(ctx); -+ if (ret) -+ goto fail; -+ -+ ret = deint_v4l2m2m_try_format(&ctx->capture); -+ if (ret) -+ goto fail; -+ -+ ret = deint_v4l2m2m_try_format(&ctx->output); -+ if (ret) -+ goto fail; -+ -+ return 0; -+ -+fail: -+ close(ctx->fd); -+ ctx->fd = -1; -+ -+ return ret; -+} -+ -+static int deint_v4l2m2m_find_device(DeintV4L2M2MContextShared *ctx) -+{ -+ int ret = AVERROR(EINVAL); -+ struct dirent *entry; -+ char node[PATH_MAX]; -+ DIR *dirp; -+ -+ dirp = opendir("/dev"); -+ if (!dirp) -+ return AVERROR(errno); -+ -+ for (entry = readdir(dirp); entry; entry = readdir(dirp)) { -+ -+ if (strncmp(entry->d_name, "video", 5)) -+ continue; -+ -+ snprintf(node, sizeof(node), "/dev/%s", entry->d_name); -+ av_log(ctx->logctx, AV_LOG_DEBUG, "probing device %s\n", node); -+ ret = deint_v4l2m2m_probe_device(ctx, node); -+ if (!ret) -+ break; -+ } -+ -+ closedir(dirp); -+ -+ if (ret) { -+ av_log(ctx->logctx, AV_LOG_ERROR, "Could not find a valid device\n"); -+ ctx->fd = -1; -+ -+ return ret; -+ } -+ -+ av_log(ctx->logctx, AV_LOG_INFO, "Using device %s\n", node); -+ -+ return 0; -+} -+ -+static int deint_v4l2m2m_enqueue_buffer(V4L2Buffer *buf) -+{ -+ int ret; -+ -+ ret = ioctl(buf->q->ctx->fd, VIDIOC_QBUF, &buf->buffer); -+ if (ret < 0) -+ return AVERROR(errno); -+ -+ buf->enqueued = 1; -+ -+ return 0; -+} -+ -+static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) -+{ -+ struct v4l2_exportbuffer expbuf; -+ int i, ret; -+ -+ for (i = 0; i < avbuf->num_planes; i++) { -+ memset(&expbuf, 0, sizeof(expbuf)); -+ -+ expbuf.index = avbuf->buffer.index; -+ expbuf.type = avbuf->buffer.type; -+ expbuf.plane = i; -+ -+ ret = ioctl(avbuf->q->ctx->fd, VIDIOC_EXPBUF, &expbuf); -+ if (ret < 0) -+ return AVERROR(errno); -+ -+ avbuf->fd = expbuf.fd; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(avbuf->buffer.type)) { -+ /* drm frame */ -+ avbuf->drm_frame.objects[i].size = avbuf->buffer.m.planes[i].length; -+ avbuf->drm_frame.objects[i].fd = expbuf.fd; -+ avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ } else { -+ /* drm frame */ -+ avbuf->drm_frame.objects[0].size = avbuf->buffer.length; -+ avbuf->drm_frame.objects[0].fd = expbuf.fd; -+ avbuf->drm_frame.objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ } -+ } -+ -+ return 0; -+} -+ -+static int deint_v4l2m2m_allocate_buffers(V4L2Queue *queue) -+{ -+ struct v4l2_format *fmt = &queue->format; -+ DeintV4L2M2MContextShared *ctx = queue->ctx; -+ struct v4l2_requestbuffers req; -+ int ret, i, j, multiplanar; -+ uint32_t memory; -+ -+ memory = V4L2_TYPE_IS_OUTPUT(fmt->type) ? -+ V4L2_MEMORY_DMABUF : V4L2_MEMORY_MMAP; -+ -+ multiplanar = V4L2_TYPE_IS_MULTIPLANAR(fmt->type); -+ -+ memset(&req, 0, sizeof(req)); -+ req.count = queue->num_buffers; -+ req.memory = memory; -+ req.type = fmt->type; -+ -+ ret = ioctl(ctx->fd, VIDIOC_REQBUFS, &req); -+ if (ret < 0) { -+ av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_REQBUFS failed: %s\n", strerror(errno)); -+ -+ return AVERROR(errno); -+ } -+ -+ queue->num_buffers = req.count; -+ queue->buffers = av_mallocz(queue->num_buffers * sizeof(V4L2Buffer)); -+ if (!queue->buffers) { -+ av_log(ctx->logctx, AV_LOG_ERROR, "malloc enomem\n"); -+ -+ return AVERROR(ENOMEM); -+ } -+ -+ for (i = 0; i < queue->num_buffers; i++) { -+ V4L2Buffer *buf = &queue->buffers[i]; -+ -+ buf->enqueued = 0; -+ buf->fd = -1; -+ buf->q = queue; -+ -+ buf->buffer.type = fmt->type; -+ buf->buffer.memory = memory; -+ buf->buffer.index = i; -+ -+ if (multiplanar) { -+ buf->buffer.length = VIDEO_MAX_PLANES; -+ buf->buffer.m.planes = buf->planes; -+ } -+ -+ ret = ioctl(ctx->fd, VIDIOC_QUERYBUF, &buf->buffer); -+ if (ret < 0) { -+ ret = AVERROR(errno); -+ -+ goto fail; -+ } -+ -+ if (multiplanar) -+ buf->num_planes = buf->buffer.length; -+ else -+ buf->num_planes = 1; -+ -+ for (j = 0; j < buf->num_planes; j++) { -+ V4L2PlaneInfo *info = &buf->plane_info[j]; -+ -+ if (multiplanar) { -+ info->bytesperline = fmt->fmt.pix_mp.plane_fmt[j].bytesperline; -+ info->length = buf->buffer.m.planes[j].length; -+ } else { -+ info->bytesperline = fmt->fmt.pix.bytesperline; -+ info->length = buf->buffer.length; -+ } -+ } -+ -+ if (!V4L2_TYPE_IS_OUTPUT(fmt->type)) { -+ ret = deint_v4l2m2m_enqueue_buffer(buf); -+ if (ret) -+ goto fail; -+ -+ ret = v4l2_buffer_export_drm(buf); -+ if (ret) -+ goto fail; -+ } -+ } -+ -+ return 0; -+ -+fail: -+ for (i = 0; i < queue->num_buffers; i++) -+ if (queue->buffers[i].fd >= 0) -+ close(queue->buffers[i].fd); -+ av_free(queue->buffers); -+ queue->buffers = NULL; -+ -+ return ret; -+} -+ -+static int deint_v4l2m2m_streamon(V4L2Queue *queue) -+{ -+ DeintV4L2M2MContextShared * const ctx = queue->ctx; -+ int type = queue->format.type; -+ int ret; -+ -+ ret = ioctl(ctx->fd, VIDIOC_STREAMON, &type); -+ av_log(ctx->logctx, AV_LOG_DEBUG, "%s: type:%d ret:%d errno:%d\n", __func__, type, ret, AVERROR(errno)); -+ if (ret < 0) -+ return AVERROR(errno); -+ -+ return 0; -+} -+ -+static int deint_v4l2m2m_streamoff(V4L2Queue *queue) -+{ -+ DeintV4L2M2MContextShared * const ctx = queue->ctx; -+ int type = queue->format.type; -+ int ret; -+ -+ ret = ioctl(ctx->fd, VIDIOC_STREAMOFF, &type); -+ av_log(ctx->logctx, AV_LOG_DEBUG, "%s: type:%d ret:%d errno:%d\n", __func__, type, ret, AVERROR(errno)); -+ if (ret < 0) -+ return AVERROR(errno); -+ -+ return 0; -+} -+ -+// timeout in ms -+static V4L2Buffer* deint_v4l2m2m_dequeue_buffer(V4L2Queue *queue, int timeout) -+{ -+ struct v4l2_plane planes[VIDEO_MAX_PLANES]; -+ DeintV4L2M2MContextShared *ctx = queue->ctx; -+ struct v4l2_buffer buf = { 0 }; -+ V4L2Buffer* avbuf = NULL; -+ struct pollfd pfd; -+ short events; -+ int ret; -+ -+ if (V4L2_TYPE_IS_OUTPUT(queue->format.type)) -+ events = POLLOUT | POLLWRNORM; -+ else -+ events = POLLIN | POLLRDNORM; -+ -+ pfd.events = events; -+ pfd.fd = ctx->fd; -+ -+ for (;;) { -+ ret = poll(&pfd, 1, timeout); -+ if (ret > 0) -+ break; -+ if (errno == EINTR) -+ continue; -+ return NULL; -+ } -+ -+ if (pfd.revents & POLLERR) -+ return NULL; -+ -+ if (pfd.revents & events) { -+ memset(&buf, 0, sizeof(buf)); -+ buf.memory = V4L2_MEMORY_MMAP; -+ buf.type = queue->format.type; -+ if (V4L2_TYPE_IS_MULTIPLANAR(queue->format.type)) { -+ memset(planes, 0, sizeof(planes)); -+ buf.length = VIDEO_MAX_PLANES; -+ buf.m.planes = planes; -+ } -+ -+ ret = ioctl(ctx->fd, VIDIOC_DQBUF, &buf); -+ if (ret) { -+ if (errno != EAGAIN) -+ av_log(ctx->logctx, AV_LOG_DEBUG, "VIDIOC_DQBUF, errno (%s)\n", -+ av_err2str(AVERROR(errno))); -+ return NULL; -+ } -+ -+ avbuf = &queue->buffers[buf.index]; -+ avbuf->enqueued = 0; -+ avbuf->buffer = buf; -+ if (V4L2_TYPE_IS_MULTIPLANAR(queue->format.type)) { -+ memcpy(avbuf->planes, planes, sizeof(planes)); -+ avbuf->buffer.m.planes = avbuf->planes; -+ } -+ return avbuf; -+ } -+ -+ return NULL; -+} -+ -+static V4L2Buffer *deint_v4l2m2m_find_free_buf(V4L2Queue *queue) -+{ -+ int i; -+ V4L2Buffer *buf = NULL; -+ -+ for (i = 0; i < queue->num_buffers; i++) -+ if (!queue->buffers[i].enqueued) { -+ buf = &queue->buffers[i]; -+ break; -+ } -+ return buf; -+} -+ -+static void deint_v4l2m2m_unref_queued(V4L2Queue *queue) -+{ -+ int i; -+ V4L2Buffer *buf = NULL; -+ -+ if (!queue || !queue->buffers) -+ return; -+ for (i = 0; i < queue->num_buffers; i++) { -+ buf = &queue->buffers[i]; -+ if (queue->buffers[i].enqueued) -+ av_frame_unref(&buf->frame); -+ } -+} -+ -+static void recycle_q(V4L2Queue * const queue) -+{ -+ V4L2Buffer* avbuf; -+ while (avbuf = deint_v4l2m2m_dequeue_buffer(queue, 0), avbuf) { -+ av_frame_unref(&avbuf->frame); -+ } -+} -+ -+static int count_enqueued(V4L2Queue *queue) -+{ -+ int i; -+ int n = 0; -+ -+ if (queue->buffers == NULL) -+ return 0; -+ -+ for (i = 0; i < queue->num_buffers; i++) -+ if (queue->buffers[i].enqueued) -+ ++n; -+ return n; -+} -+ -+static int deint_v4l2m2m_enqueue_frame(V4L2Queue * const queue, AVFrame * const frame) -+{ -+ DeintV4L2M2MContextShared *const ctx = queue->ctx; -+ AVDRMFrameDescriptor *drm_desc = (AVDRMFrameDescriptor *)frame->data[0]; -+ V4L2Buffer *buf; -+ int i; -+ -+ if (V4L2_TYPE_IS_OUTPUT(queue->format.type)) -+ recycle_q(queue); -+ -+ buf = deint_v4l2m2m_find_free_buf(queue); -+ if (!buf) { -+ av_log(ctx->logctx, AV_LOG_ERROR, "%s: error %d finding free buf\n", __func__, 0); -+ return AVERROR(EAGAIN); -+ } -+ if (V4L2_TYPE_IS_MULTIPLANAR(buf->buffer.type)) -+ for (i = 0; i < drm_desc->nb_objects; i++) -+ buf->buffer.m.planes[i].m.fd = drm_desc->objects[i].fd; -+ else -+ buf->buffer.m.fd = drm_desc->objects[0].fd; -+ -+ buf->buffer.field = !frame->interlaced_frame ? V4L2_FIELD_NONE : -+ frame->top_field_first ? V4L2_FIELD_INTERLACED_TB : -+ V4L2_FIELD_INTERLACED_BT; -+ -+ if (ctx->field_order != buf->buffer.field) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "%s: Field changed: %d->%d\n", __func__, ctx->field_order, buf->buffer.field); -+ ctx->field_order = buf->buffer.field; -+ } -+ -+ buf->buffer.timestamp = pts_track_add_frame(&ctx->track, frame); -+ -+ buf->drm_frame.objects[0].fd = drm_desc->objects[0].fd; -+ -+ av_frame_move_ref(&buf->frame, frame); -+ -+ return deint_v4l2m2m_enqueue_buffer(buf); -+} -+ -+static void deint_v4l2m2m_destroy_context(DeintV4L2M2MContextShared *ctx) -+{ -+ if (atomic_fetch_sub(&ctx->refcount, 1) == 1) { -+ V4L2Queue *capture = &ctx->capture; -+ V4L2Queue *output = &ctx->output; -+ int i; -+ -+ av_log(NULL, AV_LOG_DEBUG, "%s - destroying context\n", __func__); -+ -+ if (ctx->fd >= 0) { -+ deint_v4l2m2m_streamoff(capture); -+ deint_v4l2m2m_streamoff(output); -+ } -+ -+ if (capture->buffers) -+ for (i = 0; i < capture->num_buffers; i++) { -+ capture->buffers[i].q = NULL; -+ if (capture->buffers[i].fd >= 0) -+ close(capture->buffers[i].fd); -+ } -+ -+ deint_v4l2m2m_unref_queued(output); -+ -+ av_buffer_unref(&ctx->hw_frames_ctx); -+ -+ if (capture->buffers) -+ av_free(capture->buffers); -+ -+ if (output->buffers) -+ av_free(output->buffers); -+ -+ if (ctx->fd >= 0) { -+ close(ctx->fd); -+ ctx->fd = -1; -+ } -+ -+ av_free(ctx); -+ } -+} -+ -+static void v4l2_free_buffer(void *opaque, uint8_t *unused) -+{ -+ V4L2Buffer *buf = opaque; -+ DeintV4L2M2MContextShared *ctx = buf->q->ctx; -+ -+ if (!ctx->done) -+ deint_v4l2m2m_enqueue_buffer(buf); -+ -+ deint_v4l2m2m_destroy_context(ctx); -+} -+ -+static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf, int height) -+{ -+ int av_pix_fmt = AV_PIX_FMT_YUV420P; -+ AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; -+ AVDRMLayerDescriptor *layer; -+ -+ /* fill the DRM frame descriptor */ -+ drm_desc->nb_objects = avbuf->num_planes; -+ drm_desc->nb_layers = 1; -+ -+ layer = &drm_desc->layers[0]; -+ layer->nb_planes = avbuf->num_planes; -+ -+ for (int i = 0; i < avbuf->num_planes; i++) { -+ layer->planes[i].object_index = i; -+ layer->planes[i].offset = 0; -+ layer->planes[i].pitch = avbuf->plane_info[i].bytesperline; -+ } -+ -+ switch (av_pix_fmt) { -+ case AV_PIX_FMT_YUYV422: -+ -+ layer->format = DRM_FORMAT_YUYV; -+ layer->nb_planes = 1; -+ -+ break; -+ -+ case AV_PIX_FMT_NV12: -+ case AV_PIX_FMT_NV21: -+ -+ layer->format = av_pix_fmt == AV_PIX_FMT_NV12 ? -+ DRM_FORMAT_NV12 : DRM_FORMAT_NV21; -+ -+ if (avbuf->num_planes > 1) -+ break; -+ -+ layer->nb_planes = 2; -+ -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = avbuf->plane_info[0].bytesperline * -+ height; -+ layer->planes[1].pitch = avbuf->plane_info[0].bytesperline; -+ break; -+ -+ case AV_PIX_FMT_YUV420P: -+ -+ layer->format = DRM_FORMAT_YUV420; -+ -+ if (avbuf->num_planes > 1) -+ break; -+ -+ layer->nb_planes = 3; -+ -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = avbuf->plane_info[0].bytesperline * -+ height; -+ layer->planes[1].pitch = avbuf->plane_info[0].bytesperline >> 1; -+ -+ layer->planes[2].object_index = 0; -+ layer->planes[2].offset = layer->planes[1].offset + -+ ((avbuf->plane_info[0].bytesperline * -+ height) >> 2); -+ layer->planes[2].pitch = avbuf->plane_info[0].bytesperline >> 1; -+ break; -+ -+ default: -+ drm_desc->nb_layers = 0; -+ break; -+ } -+ -+ return (uint8_t *) drm_desc; -+} -+ -+// timeout in ms -+static int deint_v4l2m2m_dequeue_frame(V4L2Queue *queue, AVFrame* frame, int timeout) -+{ -+ DeintV4L2M2MContextShared *ctx = queue->ctx; -+ V4L2Buffer* avbuf; -+ -+ av_log(ctx->logctx, AV_LOG_TRACE, "<<< %s\n", __func__); -+ -+ avbuf = deint_v4l2m2m_dequeue_buffer(queue, timeout); -+ if (!avbuf) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "%s: No buffer to dequeue (timeout=%d)\n", __func__, timeout); -+ return AVERROR(EAGAIN); -+ } -+ -+ // Fill in PTS and anciliary info from src frame -+ // we will want to overwrite some fields as only the pts/dts -+ // fields are updated with new timing in this fn -+ pts_track_get_frame(&ctx->track, avbuf->buffer.timestamp, frame); -+ -+ frame->buf[0] = av_buffer_create((uint8_t *) &avbuf->drm_frame, -+ sizeof(avbuf->drm_frame), v4l2_free_buffer, -+ avbuf, AV_BUFFER_FLAG_READONLY); -+ if (!frame->buf[0]) { -+ av_log(ctx->logctx, AV_LOG_ERROR, "%s: error %d creating buffer\n", __func__, 0); -+ return AVERROR(ENOMEM); -+ } -+ -+ atomic_fetch_add(&ctx->refcount, 1); -+ -+ frame->data[0] = (uint8_t *)v4l2_get_drm_frame(avbuf, ctx->orig_height); -+ frame->format = AV_PIX_FMT_DRM_PRIME; -+ if (ctx->hw_frames_ctx) -+ frame->hw_frames_ctx = av_buffer_ref(ctx->hw_frames_ctx); -+ frame->height = ctx->height; -+ frame->width = ctx->width; -+ -+ // Not interlaced now -+ frame->interlaced_frame = 0; -+ frame->top_field_first = 0; -+ // Pkt duration halved -+ frame->pkt_duration /= 2; -+ -+ if (avbuf->buffer.flags & V4L2_BUF_FLAG_ERROR) { -+ av_log(ctx->logctx, AV_LOG_ERROR, "driver decode error\n"); -+ frame->decode_error_flags |= FF_DECODE_ERROR_INVALID_BITSTREAM; -+ } -+ -+ av_log(ctx->logctx, AV_LOG_TRACE, ">>> %s: PTS=%"PRId64"\n", __func__, frame->pts); -+ return 0; -+} -+ -+static int deint_v4l2m2m_config_props(AVFilterLink *outlink) -+{ -+ AVFilterLink *inlink = outlink->src->inputs[0]; -+ AVFilterContext *avctx = outlink->src; -+ DeintV4L2M2MContext *priv = avctx->priv; -+ DeintV4L2M2MContextShared *ctx = priv->shared; -+ int ret; -+ -+ ctx->height = avctx->inputs[0]->h; -+ ctx->width = avctx->inputs[0]->w; -+ -+ av_log(priv, AV_LOG_DEBUG, "%s: %dx%d\n", __func__, ctx->width, ctx->height); -+ -+ outlink->time_base = inlink->time_base; -+ outlink->w = inlink->w; -+ outlink->h = inlink->h; -+ outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; -+ outlink->format = inlink->format; -+ outlink->frame_rate = (AVRational) {1, 0}; // Deny knowledge of frame rate -+ -+ ret = deint_v4l2m2m_find_device(ctx); -+ if (ret) -+ return ret; -+ -+ if (inlink->hw_frames_ctx) { -+ ctx->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); -+ if (!ctx->hw_frames_ctx) -+ return AVERROR(ENOMEM); -+ } -+ return 0; -+} -+ -+static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) -+{ -+ AVFilterContext *avctx = link->dst; -+ DeintV4L2M2MContext *priv = avctx->priv; -+ DeintV4L2M2MContextShared *ctx = priv->shared; -+ V4L2Queue *capture = &ctx->capture; -+ V4L2Queue *output = &ctx->output; -+ int ret; -+ -+ av_log(priv, AV_LOG_DEBUG, "<<< %s: input pts: %"PRId64" (%"PRId64") field :%d interlaced: %d aspect:%d/%d\n", -+ __func__, in->pts, AV_NOPTS_VALUE, in->top_field_first, in->interlaced_frame, in->sample_aspect_ratio.num, in->sample_aspect_ratio.den); -+ av_log(priv, AV_LOG_DEBUG, "--- %s: in status in %d/ot %d; out status in %d/out %d\n", __func__, -+ avctx->inputs[0]->status_in, avctx->inputs[0]->status_out, avctx->outputs[0]->status_in, avctx->outputs[0]->status_out); -+ -+ if (ctx->field_order == V4L2_FIELD_ANY) { -+ AVDRMFrameDescriptor *drm_desc = (AVDRMFrameDescriptor *)in->data[0]; -+ ctx->orig_width = drm_desc->layers[0].planes[0].pitch; -+ ctx->orig_height = drm_desc->layers[0].planes[1].offset / ctx->orig_width; -+ -+ av_log(priv, AV_LOG_DEBUG, "%s: %dx%d (%td,%td)\n", __func__, ctx->width, ctx->height, -+ drm_desc->layers[0].planes[0].pitch, drm_desc->layers[0].planes[1].offset); -+ -+ if (in->top_field_first) -+ ctx->field_order = V4L2_FIELD_INTERLACED_TB; -+ else -+ ctx->field_order = V4L2_FIELD_INTERLACED_BT; -+ -+ ret = deint_v4l2m2m_set_format(output, ctx->field_order, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); -+ if (ret) -+ return ret; -+ -+ ret = deint_v4l2m2m_set_format(capture, V4L2_FIELD_NONE, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); -+ if (ret) -+ return ret; -+ -+ ret = deint_v4l2m2m_allocate_buffers(capture); -+ if (ret) -+ return ret; -+ -+ ret = deint_v4l2m2m_streamon(capture); -+ if (ret) -+ return ret; -+ -+ ret = deint_v4l2m2m_allocate_buffers(output); -+ if (ret) -+ return ret; -+ -+ ret = deint_v4l2m2m_streamon(output); -+ if (ret) -+ return ret; -+ } -+ -+ ret = deint_v4l2m2m_enqueue_frame(output, in); -+ -+ av_log(priv, AV_LOG_TRACE, ">>> %s: %s\n", __func__, av_err2str(ret)); -+ return ret; -+} -+ -+static int deint_v4l2m2m_activate(AVFilterContext *avctx) -+{ -+ DeintV4L2M2MContext * const priv = avctx->priv; -+ DeintV4L2M2MContextShared *const s = priv->shared; -+ AVFilterLink * const outlink = avctx->outputs[0]; -+ AVFilterLink * const inlink = avctx->inputs[0]; -+ int n = 0; -+ int cn = 99; -+ int instatus = 0; -+ int64_t inpts = 0; -+ int did_something = 0; -+ -+ av_log(priv, AV_LOG_TRACE, "<<< %s\n", __func__); -+ -+ FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, avctx); -+ -+ ff_inlink_acknowledge_status(inlink, &instatus, &inpts); -+ -+ if (!ff_outlink_frame_wanted(outlink)) { -+ av_log(priv, AV_LOG_TRACE, "%s: Not wanted out\n", __func__); -+ } -+ else if (s->field_order != V4L2_FIELD_ANY) // Can't DQ if no setup! -+ { -+ AVFrame * frame = av_frame_alloc(); -+ int rv; -+ -+again: -+ recycle_q(&s->output); -+ n = count_enqueued(&s->output); -+ -+ if (frame == NULL) { -+ av_log(priv, AV_LOG_ERROR, "%s: error allocating frame\n", __func__); -+ return AVERROR(ENOMEM); -+ } -+ -+ rv = deint_v4l2m2m_dequeue_frame(&s->capture, frame, n > 4 ? 300 : 0); -+ if (rv != 0) { -+ av_frame_free(&frame); -+ if (rv != AVERROR(EAGAIN)) { -+ av_log(priv, AV_LOG_ERROR, ">>> %s: DQ fail: %s\n", __func__, av_err2str(rv)); -+ return rv; -+ } -+ } -+ else { -+ frame->interlaced_frame = 0; -+ // frame is always consumed by filter_frame - even on error despite -+ // a somewhat confusing comment in the header -+ rv = ff_filter_frame(outlink, frame); -+ -+ if (instatus != 0) { -+ av_log(priv, AV_LOG_TRACE, "%s: eof loop\n", __func__); -+ goto again; -+ } -+ -+ av_log(priv, AV_LOG_TRACE, "%s: Filtered: %s\n", __func__, av_err2str(rv)); -+ did_something = 1; -+ } -+ -+ cn = count_enqueued(&s->capture); -+ } -+ -+ if (instatus != 0) { -+ ff_outlink_set_status(outlink, instatus, inpts); -+ av_log(priv, AV_LOG_TRACE, ">>> %s: Status done: %s\n", __func__, av_err2str(instatus)); -+ return 0; -+ } -+ -+ { -+ AVFrame * frame; -+ int rv; -+ -+ recycle_q(&s->output); -+ n = count_enqueued(&s->output); -+ -+ while (n < 6) { -+ if ((rv = ff_inlink_consume_frame(inlink, &frame)) < 0) { -+ av_log(priv, AV_LOG_ERROR, "%s: consume in failed: %s\n", __func__, av_err2str(rv)); -+ return rv; -+ } -+ -+ if (frame == NULL) { -+ av_log(priv, AV_LOG_TRACE, "%s: No frame\n", __func__); -+ break; -+ } -+ -+ deint_v4l2m2m_filter_frame(inlink, frame); -+ av_log(priv, AV_LOG_TRACE, "%s: Q frame\n", __func__); -+ ++n; -+ } -+ } -+ -+ if (n < 6) { -+ ff_inlink_request_frame(inlink); -+ did_something = 1; -+ av_log(priv, AV_LOG_TRACE, "%s: req frame\n", __func__); -+ } -+ -+ if (n > 4 && ff_outlink_frame_wanted(outlink)) { -+ ff_filter_set_ready(avctx, 1); -+ did_something = 1; -+ av_log(priv, AV_LOG_TRACE, "%s: ready\n", __func__); -+ } -+ -+ av_log(priv, AV_LOG_TRACE, ">>> %s: OK (n=%d, cn=%d)\n", __func__, n, cn); -+ return did_something ? 0 : FFERROR_NOT_READY; -+} -+ -+static av_cold int deint_v4l2m2m_init(AVFilterContext *avctx) -+{ -+ DeintV4L2M2MContext * const priv = avctx->priv; -+ DeintV4L2M2MContextShared * const ctx = av_mallocz(sizeof(DeintV4L2M2MContextShared)); -+ -+ if (!ctx) { -+ av_log(priv, AV_LOG_ERROR, "%s: error %d allocating context\n", __func__, 0); -+ return AVERROR(ENOMEM); -+ } -+ priv->shared = ctx; -+ ctx->logctx = priv; -+ ctx->fd = -1; -+ ctx->output.ctx = ctx; -+ ctx->output.num_buffers = 8; -+ ctx->capture.ctx = ctx; -+ ctx->capture.num_buffers = 12; -+ ctx->done = 0; -+ ctx->field_order = V4L2_FIELD_ANY; -+ -+ pts_track_init(&ctx->track, priv); -+ -+ atomic_init(&ctx->refcount, 1); -+ -+ return 0; -+} -+ -+static void deint_v4l2m2m_uninit(AVFilterContext *avctx) -+{ -+ DeintV4L2M2MContext *priv = avctx->priv; -+ DeintV4L2M2MContextShared *ctx = priv->shared; -+ -+ ctx->done = 1; -+ ctx->logctx = NULL; // Log to NULL works, log to missing crashes -+ pts_track_uninit(&ctx->track); -+ deint_v4l2m2m_destroy_context(ctx); -+} -+ -+static const AVOption deinterlace_v4l2m2m_options[] = { -+ { NULL }, -+}; -+ -+AVFILTER_DEFINE_CLASS(deinterlace_v4l2m2m); -+ -+static const AVFilterPad deint_v4l2m2m_inputs[] = { -+ { -+ .name = "default", -+ .type = AVMEDIA_TYPE_VIDEO, -+ }, -+}; -+ -+static const AVFilterPad deint_v4l2m2m_outputs[] = { -+ { -+ .name = "default", -+ .type = AVMEDIA_TYPE_VIDEO, -+ .config_props = deint_v4l2m2m_config_props, -+ }, -+}; -+ -+AVFilter ff_vf_deinterlace_v4l2m2m = { -+ .name = "deinterlace_v4l2m2m", -+ .description = NULL_IF_CONFIG_SMALL("V4L2 M2M deinterlacer"), -+ .priv_size = sizeof(DeintV4L2M2MContext), -+ .init = &deint_v4l2m2m_init, -+ .uninit = &deint_v4l2m2m_uninit, -+ FILTER_INPUTS(deint_v4l2m2m_inputs), -+ FILTER_OUTPUTS(deint_v4l2m2m_outputs), -+ FILTER_SINGLE_SAMPLEFMT(AV_PIX_FMT_DRM_PRIME), -+ .priv_class = &deinterlace_v4l2m2m_class, -+ .activate = deint_v4l2m2m_activate, -+}; - -From 0fb00e51d1ca40eed22bfc66b7f309fdc56229bc Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 2 Dec 2021 17:49:55 +0000 -Subject: [PATCH 031/151] Put no_pts_rescale in context which makes more sense - than an arg - ---- - libavcodec/v4l2_buffers.c | 28 ++++++++++++++-------------- - libavcodec/v4l2_buffers.h | 5 ++--- - libavcodec/v4l2_context.c | 8 ++++---- - libavcodec/v4l2_context.h | 13 +++++++++---- - libavcodec/v4l2_m2m_dec.c | 9 +++++---- - 5 files changed, 34 insertions(+), 29 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 126d2a17f4..22da6bd722 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -39,7 +39,7 @@ - #define USEC_PER_SEC 1000000 - static const AVRational v4l2_timebase = { 1, USEC_PER_SEC }; - --static inline V4L2m2mContext *buf_to_m2mctx(V4L2Buffer *buf) -+static inline V4L2m2mContext *buf_to_m2mctx(const V4L2Buffer * const buf) - { - return V4L2_TYPE_IS_OUTPUT(buf->context->type) ? - container_of(buf->context, V4L2m2mContext, output) : -@@ -51,34 +51,34 @@ static inline AVCodecContext *logger(V4L2Buffer *buf) - return buf_to_m2mctx(buf)->avctx; - } - --static inline AVRational v4l2_get_timebase(V4L2Buffer *avbuf) -+static inline AVRational v4l2_get_timebase(const V4L2Buffer * const avbuf) - { -- V4L2m2mContext *s = buf_to_m2mctx(avbuf); -+ const V4L2m2mContext *s = buf_to_m2mctx(avbuf); - const AVRational tb = s->avctx->pkt_timebase.num ? - s->avctx->pkt_timebase : - s->avctx->time_base; - return tb.num && tb.den ? tb : v4l2_timebase; - } - --static inline void v4l2_set_pts(V4L2Buffer *out, int64_t pts, int no_rescale) -+static inline void v4l2_set_pts(V4L2Buffer * const out, const int64_t pts) - { - /* convert pts to v4l2 timebase */ - const int64_t v4l2_pts = -- no_rescale ? pts : -+ out->context->no_pts_rescale ? pts : - pts == AV_NOPTS_VALUE ? 0 : - av_rescale_q(pts, v4l2_get_timebase(out), v4l2_timebase); - out->buf.timestamp.tv_usec = v4l2_pts % USEC_PER_SEC; - out->buf.timestamp.tv_sec = v4l2_pts / USEC_PER_SEC; - } - --static inline int64_t v4l2_get_pts(V4L2Buffer *avbuf, int no_rescale) -+static inline int64_t v4l2_get_pts(const V4L2Buffer * const avbuf) - { - /* convert pts back to encoder timebase */ - const int64_t v4l2_pts = (int64_t)avbuf->buf.timestamp.tv_sec * USEC_PER_SEC + - avbuf->buf.timestamp.tv_usec; - - return -- no_rescale ? v4l2_pts : -+ avbuf->context->no_pts_rescale ? v4l2_pts : - v4l2_pts == 0 ? AV_NOPTS_VALUE : - av_rescale_q(v4l2_pts, v4l2_timebase, v4l2_get_timebase(avbuf)); - } -@@ -686,13 +686,13 @@ int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - v4l2_set_color(out, frame->color_primaries, frame->colorspace, frame->color_trc); - v4l2_set_color_range(out, frame->color_range); - // PTS & interlace are buffer vars -- v4l2_set_pts(out, frame->pts, 0); -+ v4l2_set_pts(out, frame->pts); - v4l2_set_interlace(out, frame->interlaced_frame, frame->top_field_first); - - return v4l2_buffer_swframe_to_buf(frame, out); - } - --int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf, int no_rescale_pts) -+int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) - { - int ret; - V4L2Context * const ctx = avbuf->context; -@@ -710,7 +710,7 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf, int no_resc - frame->colorspace = v4l2_get_color_space(avbuf); - frame->color_range = v4l2_get_color_range(avbuf); - frame->color_trc = v4l2_get_color_trc(avbuf); -- frame->pts = v4l2_get_pts(avbuf, no_rescale_pts); -+ frame->pts = v4l2_get_pts(avbuf); - frame->pkt_dts = AV_NOPTS_VALUE; - frame->interlaced_frame = v4l2_buf_is_interlaced(avbuf); - frame->top_field_first = v4l2_buf_is_top_first(avbuf); -@@ -757,13 +757,13 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf) - pkt->flags |= AV_PKT_FLAG_CORRUPT; - } - -- pkt->dts = pkt->pts = v4l2_get_pts(avbuf, 0); -+ pkt->dts = pkt->pts = v4l2_get_pts(avbuf); - - return 0; - } - - int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, -- const void *extdata, size_t extlen, int no_rescale_pts) -+ const void *extdata, size_t extlen) - { - int ret; - -@@ -777,7 +777,7 @@ int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, - if (ret && ret != AVERROR(ENOMEM)) - return ret; - -- v4l2_set_pts(out, pkt->pts, no_rescale_pts); -+ v4l2_set_pts(out, pkt->pts); - - if (pkt->flags & AV_PKT_FLAG_KEY) - out->flags = V4L2_BUF_FLAG_KEYFRAME; -@@ -787,7 +787,7 @@ int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, - - int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out) - { -- return ff_v4l2_buffer_avpkt_to_buf_ext(pkt, out, NULL, 0, 0); -+ return ff_v4l2_buffer_avpkt_to_buf_ext(pkt, out, NULL, 0); - } - - -diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h -index 111526aee3..641e0e147b 100644 ---- a/libavcodec/v4l2_buffers.h -+++ b/libavcodec/v4l2_buffers.h -@@ -83,12 +83,11 @@ typedef struct V4L2Buffer { - * - * @param[in] frame The AVFRame to push the information to - * @param[in] buf The V4L2Buffer to get the information from -- * @param[in] no_rescale_pts If non-zero do not rescale PTS - * - * @returns 0 in case of success, AVERROR(EINVAL) if the number of planes is incorrect, - * AVERROR(ENOMEM) if the AVBufferRef can't be created. - */ --int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *buf, int no_rescale_pts); -+int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *buf); - - /** - * Extracts the data from a V4L2Buffer to an AVPacket -@@ -113,7 +112,7 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *buf); - int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out); - - int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, -- const void *extdata, size_t extlen, int no_rescale_pts); -+ const void *extdata, size_t extlen); - - /** - * Extracts the data from an AVFrame to a V4L2Buffer -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 440dfaaba5..64540a37b3 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -808,7 +808,7 @@ int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame) - } - - int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, -- const void * extdata, size_t extlen, int no_rescale_pts) -+ const void * extdata, size_t extlen) - { - V4L2m2mContext *s = ctx_to_m2mctx(ctx); - V4L2Buffer* avbuf; -@@ -827,7 +827,7 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, - if (!avbuf) - return AVERROR(EAGAIN); - -- ret = ff_v4l2_buffer_avpkt_to_buf_ext(pkt, avbuf, extdata, extlen, no_rescale_pts); -+ ret = ff_v4l2_buffer_avpkt_to_buf_ext(pkt, avbuf, extdata, extlen); - if (ret == AVERROR(ENOMEM)) - av_log(logger(ctx), AV_LOG_ERROR, "Buffer overflow in %s: pkt->size=%d > buf->length=%d\n", - __func__, pkt->size, avbuf->planes[0].length); -@@ -837,7 +837,7 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, - return ff_v4l2_buffer_enqueue(avbuf); - } - --int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout, int no_rescale_pts) -+int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) - { - V4L2Buffer *avbuf; - -@@ -854,7 +854,7 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout, - return AVERROR(EAGAIN); - } - -- return ff_v4l2_buffer_buf_to_avframe(frame, avbuf, no_rescale_pts); -+ return ff_v4l2_buffer_buf_to_avframe(frame, avbuf); - } - - int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt) -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index 37b0431400..4cc164886c 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -102,6 +102,13 @@ typedef struct V4L2Context { - */ - int done; - -+ /** -+ * PTS rescale not wanted -+ * If the PTS is just a dummy frame count then rescale is -+ * actively harmful -+ */ -+ int no_pts_rescale; -+ - AVBufferRef *frames_ref; - int q_count; - int dq_count; -@@ -172,12 +179,10 @@ int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt); - * @param[in] ctx The V4L2Context to dequeue from. - * @param[inout] f The AVFrame to dequeue to. - * @param[in] timeout The timeout for dequeue (-1 to block, 0 to return immediately, or milliseconds) -- * @param[in] no_rescale_pts (0 rescale pts, 1 use pts as -- * timestamp directly) - * - * @return 0 in case of success, AVERROR(EAGAIN) if no buffer was ready, another negative error in case of error. - */ --int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout, int no_rescale_pts); -+int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout); - - /** - * Enqueues a buffer to a V4L2Context from an AVPacket -@@ -189,7 +194,7 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout, int - * @param[in] pkt A pointer to an AVPacket. - * @return 0 in case of success, a negative error otherwise. - */ --int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, const void * ext_data, size_t ext_size, int no_rescale_pts); -+int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, const void * ext_data, size_t ext_size); - - /** - * Enqueues a buffer to a V4L2Context from an AVFrame -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index b49f470c0a..36754b314a 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -360,7 +360,7 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - if (!s->draining) { - // Calling enqueue with an empty pkt starts drain - av_assert0(s->buf_pkt.size == 0); -- ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0, 1); -+ ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0); - if (ret) { - av_log(avctx, AV_LOG_ERROR, "Failed to start drain: ret=%d\n", ret); - return ret; -@@ -381,8 +381,7 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - return ret; - - ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, -- avctx->extradata, s->extdata_sent ? 0 : avctx->extradata_size, -- 1); -+ avctx->extradata, s->extdata_sent ? 0 : avctx->extradata_size); - - if (ret == AVERROR(EAGAIN)) { - // Out of input buffers - keep packet -@@ -442,7 +441,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - // when discarding - // This returns AVERROR(EAGAIN) if there isn't a frame ready yet - // but there is room in the input Q -- dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, src_rv == NQ_Q_FULL ? 100 : -1, 1); -+ dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, src_rv == NQ_Q_FULL ? 100 : -1); - - if (dst_rv == AVERROR_EOF && (s->draining || s->capture.done)) - av_log(avctx, AV_LOG_DEBUG, "Dequeue EOF: draining=%d, cap.done=%d\n", -@@ -569,10 +568,12 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - output->av_codec_id = avctx->codec_id; - output->av_pix_fmt = AV_PIX_FMT_NONE; - output->min_buf_size = max_coded_size(avctx); -+ output->no_pts_rescale = 1; - - capture->av_codec_id = AV_CODEC_ID_RAWVIDEO; - capture->av_pix_fmt = avctx->pix_fmt; - capture->min_buf_size = 0; -+ capture->no_pts_rescale = 1; - - /* the client requests the codec to generate DRM frames: - * - data[0] will therefore point to the returned AVDRMFrameDescriptor - -From 5e36908e6f2f06b68e85873cbcd421c0973f6409 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 8 Dec 2021 15:00:37 +0000 -Subject: [PATCH 032/151] Use bitbuf min size for all streams - ---- - libavcodec/v4l2_m2m_dec.c | 5 +---- - 1 file changed, 1 insertion(+), 4 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 36754b314a..48a6810d18 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -507,15 +507,12 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - } - #endif - -+// This heuristic is for H264 but use for everything - static uint32_t max_coded_size(const AVCodecContext * const avctx) - { - uint32_t wxh = avctx->coded_width * avctx->coded_height; - uint32_t size; - -- // Currently the only thing we try to set our own limits for is H264 -- if (avctx->codec_id != AV_CODEC_ID_H264) -- return 0; -- - size = wxh * 3 / 2; - // H.264 Annex A table A-1 gives minCR which is either 2 or 4 - // unfortunately that doesn't yield an actually useful limit - -From 5fcbcd31761eea31dc0157793f558eaaadfe2ac3 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 3 Dec 2021 12:54:18 +0000 -Subject: [PATCH 033/151] Track pending frames in v4l2 stateful - -Track which frames are pending decode in the v4l2 stateful decoder. -This relies on DTS & PTS having some relationship to reality, so -any use of this code must cope with the results being wrong. - -Also moves the xlat state vars out of the main context and into their -own structure. ---- - libavcodec/v4l2_m2m.h | 15 ++++-- - libavcodec/v4l2_m2m_dec.c | 100 +++++++++++++++++++++++++++++--------- - 2 files changed, 89 insertions(+), 26 deletions(-) - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 82feb0afdb..3f86809623 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -44,8 +44,10 @@ - #define FF_V4L2_M2M_TRACK_SIZE 128 - typedef struct V4L2m2mTrackEl { - int discard; // If we see this buffer its been flushed, so discard -+ int pending; - int pkt_size; - int64_t pts; -+ int64_t dts; - int64_t reordered_opaque; - int64_t pkt_pos; - int64_t pkt_duration; -@@ -62,6 +64,14 @@ typedef struct pts_stats_s - int64_t guess; - } pts_stats_t; - -+typedef struct xlat_track_s { -+ unsigned int track_no; -+ int64_t last_pts; -+ int64_t last_pkt_dts; -+ int64_t last_opaque; -+ V4L2m2mTrackEl track_els[FF_V4L2_M2M_TRACK_SIZE]; -+} xlat_track_t; -+ - typedef struct V4L2m2mContext { - char devname[PATH_MAX]; - int fd; -@@ -96,10 +106,7 @@ typedef struct V4L2m2mContext { - int output_drm; - - /* Frame tracking */ -- int64_t last_pkt_dts; -- int64_t last_opaque; -- unsigned int track_no; -- V4L2m2mTrackEl track_els[FF_V4L2_M2M_TRACK_SIZE]; -+ xlat_track_t xlat; - - pts_stats_t pts_stat; - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 48a6810d18..d8ebb466cd 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -242,22 +242,24 @@ static inline unsigned int pts_to_track(AVCodecContext *avctx, const int64_t pts - // buffer of all the things we want preserved (including the original PTS) - // indexed by the tracking no. - static void --xlat_pts_in(AVCodecContext *const avctx, V4L2m2mContext *const s, AVPacket *const avpkt) -+xlat_pts_in(AVCodecContext *const avctx, xlat_track_t *const x, AVPacket *const avpkt) - { - int64_t track_pts; - - // Avoid 0 -- if (++s->track_no == 0) -- s->track_no = 1; -+ if (++x->track_no == 0) -+ x->track_no = 1; - -- track_pts = track_to_pts(avctx, s->track_no); -+ track_pts = track_to_pts(avctx, x->track_no); - -- av_log(avctx, AV_LOG_TRACE, "In PTS=%" PRId64 ", DTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", avpkt->pts, avpkt->dts, track_pts, s->track_no); -- s->last_pkt_dts = avpkt->dts; -- s->track_els[s->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ -+ av_log(avctx, AV_LOG_TRACE, "In PTS=%" PRId64 ", DTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", avpkt->pts, avpkt->dts, track_pts, x->track_no); -+ x->last_pkt_dts = avpkt->dts; -+ x->track_els[x->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ - .discard = 0, -+ .pending = 1, - .pkt_size = avpkt->size, - .pts = avpkt->pts, -+ .dts = avpkt->dts, - .reordered_opaque = avctx->reordered_opaque, - .pkt_pos = avpkt->pos, - .pkt_duration = avpkt->duration, -@@ -268,31 +270,36 @@ xlat_pts_in(AVCodecContext *const avctx, V4L2m2mContext *const s, AVPacket *cons - - // Returns -1 if we should discard the frame - static int --xlat_pts_out(AVCodecContext *const avctx, V4L2m2mContext *const s, AVFrame *const frame) -+xlat_pts_out(AVCodecContext *const avctx, -+ xlat_track_t * const x, -+ pts_stats_t * const ps, -+ AVFrame *const frame) - { - unsigned int n = pts_to_track(avctx, frame->pts) % FF_V4L2_M2M_TRACK_SIZE; -- const V4L2m2mTrackEl *const t = s->track_els + n; -+ V4L2m2mTrackEl *const t = x->track_els + n; - if (frame->pts == AV_NOPTS_VALUE || frame->pts != t->track_pts) - { - av_log(avctx, AV_LOG_INFO, "Tracking failure: pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); - frame->pts = AV_NOPTS_VALUE; -- frame->pkt_dts = s->last_pkt_dts; -- frame->reordered_opaque = s->last_opaque; -+ frame->pkt_dts = x->last_pkt_dts; -+ frame->reordered_opaque = x->last_opaque; - frame->pkt_pos = -1; - frame->pkt_duration = 0; - frame->pkt_size = -1; - } - else if (!t->discard) - { -- frame->pts = t->pts; -- frame->pkt_dts = s->last_pkt_dts; -+ frame->pts = t->pending ? t->pts : AV_NOPTS_VALUE; -+ frame->pkt_dts = x->last_pkt_dts; - frame->reordered_opaque = t->reordered_opaque; - frame->pkt_pos = t->pkt_pos; - frame->pkt_duration = t->pkt_duration; - frame->pkt_size = t->pkt_size; - -- s->last_opaque = s->track_els[n].reordered_opaque; -- s->track_els[n].pts = AV_NOPTS_VALUE; // If we hit this again deny accurate knowledge of PTS -+ x->last_opaque = x->track_els[n].reordered_opaque; -+ if (frame->pts != AV_NOPTS_VALUE) -+ x->last_pts = frame->pts; -+ t->pending = 0; - } - else - { -@@ -300,14 +307,62 @@ xlat_pts_out(AVCodecContext *const avctx, V4L2m2mContext *const s, AVFrame *cons - return -1; - } - -- pts_stats_add(&s->pts_stat, frame->pts); -+ pts_stats_add(ps, frame->pts); - -- frame->best_effort_timestamp = pts_stats_guess(&s->pts_stat); -+ frame->best_effort_timestamp = pts_stats_guess(ps); - frame->pkt_dts = frame->pts; // We can't emulate what s/w does in a useful manner? - av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 "\n", frame->pts, frame->best_effort_timestamp, frame->pkt_dts); - return 0; - } - -+static void -+xlat_flush(xlat_track_t * const x) -+{ -+ unsigned int i; -+ for (i = 0; i != FF_V4L2_M2M_TRACK_SIZE; ++i) { -+ x->track_els[i].pending = 0; -+ x->track_els[i].discard = 1; -+ } -+ x->last_pts = AV_NOPTS_VALUE; -+} -+ -+static void -+xlat_init(xlat_track_t * const x) -+{ -+ memset(x, 0, sizeof(*x)); -+ x->last_pts = AV_NOPTS_VALUE; -+} -+ -+static int -+xlat_pending(const xlat_track_t * const x) -+{ -+ unsigned int n = x->track_no % FF_V4L2_M2M_TRACK_SIZE; -+ unsigned int i; -+ int r = 0; -+ int64_t now = AV_NOPTS_VALUE; -+ -+ for (i = 0; i < 32; ++i, n = (n - 1) % FF_V4L2_M2M_TRACK_SIZE) { -+ const V4L2m2mTrackEl * const t = x->track_els + n; -+ -+ if (!t->pending) -+ continue; -+ -+ if (now == AV_NOPTS_VALUE) -+ now = t->dts; -+ -+ if (t->pts == AV_NOPTS_VALUE || -+ ((now == AV_NOPTS_VALUE || t->pts <= now) && -+ (x->last_pts == AV_NOPTS_VALUE || t->pts > x->last_pts))) -+ ++r; -+ } -+ -+ // If we never get any ideas about PTS vs DTS allow a lot more buffer -+ if (now == AV_NOPTS_VALUE) -+ r -= 16; -+ -+ return r; -+} -+ - static inline int stream_started(const V4L2m2mContext * const s) { - return s->capture.streamon && s->output.streamon; - } -@@ -374,7 +429,7 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - return ret; - } - -- xlat_pts_in(avctx, s, &s->buf_pkt); -+ xlat_pts_in(avctx, &s->xlat, &s->buf_pkt); - } - - if ((ret = check_output_streamon(avctx, s)) != 0) -@@ -417,6 +472,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - int dst_rv = 1; // Non-zero (done), non-negative (error) number - - do { -+ av_log(avctx, AV_LOG_INFO, "Pending=%d\n", xlat_pending(&s->xlat)); - src_rv = try_enqueue_src(avctx, s); - - // If we got a frame last time and we have nothing to enqueue then -@@ -451,7 +507,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - s->draining, s->capture.done, dst_rv); - - // Go again if we got a frame that we need to discard -- } while (dst_rv == 0 && xlat_pts_out(avctx, s, frame)); -+ } while (dst_rv == 0 && xlat_pts_out(avctx, &s->xlat, &s->pts_stat, frame)); - } - - // Continue trying to enqueue packets if either -@@ -550,6 +606,7 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - if (ret < 0) - return ret; - -+ xlat_init(&s->xlat); - pts_stats_init(&s->pts_stat, avctx, "decoder"); - - capture = &s->capture; -@@ -632,7 +689,7 @@ static void v4l2_decode_flush(AVCodecContext *avctx) - V4L2m2mContext * const s = priv->context; - V4L2Context * const output = &s->output; - V4L2Context * const capture = &s->capture; -- int ret, i; -+ int ret; - - av_log(avctx, AV_LOG_TRACE, "<<< %s: streamon=%d\n", __func__, output->streamon); - -@@ -646,8 +703,7 @@ static void v4l2_decode_flush(AVCodecContext *avctx) - - // V4L2 makes no guarantees about whether decoded frames are flushed or not - // so mark all frames we are tracking to be discarded if they appear -- for (i = 0; i != FF_V4L2_M2M_TRACK_SIZE; ++i) -- s->track_els[i].discard = 1; -+ xlat_flush(&s->xlat); - - // resend extradata - s->extdata_sent = 0; - -From 6fae7b3f42c8e9e431a59323c0faa6c88fe951d9 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 15 Dec 2021 17:58:21 +0000 -Subject: [PATCH 034/151] Use pending tracking to reduce v4l2 latency - -If there are more than 5 pending decodes outstanding then add a small -timeout to the capture poll to reduce the rate at which frames are -added. ---- - libavcodec/v4l2_m2m_dec.c | 58 ++++++++++++++++++++++++--------------- - 1 file changed, 36 insertions(+), 22 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index d8ebb466cd..7e7e4729d0 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -370,16 +370,19 @@ static inline int stream_started(const V4L2m2mContext * const s) { - #define NQ_OK 0 - #define NQ_Q_FULL 1 - #define NQ_SRC_EMPTY 2 --#define NQ_DRAINING 3 --#define NQ_DEAD 4 -+#define NQ_NONE 3 -+#define NQ_DRAINING 4 -+#define NQ_DEAD 5 - - #define TRY_DQ(nq_status) ((nq_status) >= NQ_OK && (nq_status) <= NQ_DRAINING) -+#define RETRY_NQ(nq_status) ((nq_status) == NQ_Q_FULL || (nq_status) == NQ_NONE) - - // AVERROR_EOF Flushing an already flushed stream - // -ve Error (all errors except EOF are unexpected) - // NQ_OK (0) OK - // NQ_Q_FULL Dst full (retry if we think V4L2 Q has space now) - // NQ_SRC_EMPTY Src empty (do not retry) -+// NQ_NONE Enqueue not attempted - // NQ_DRAINING At EOS, dQ dest until EOS there too - // NQ_DEAD Not running (do not retry, do not attempt capture dQ) - -@@ -468,23 +471,28 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - { - V4L2m2mContext *const s = ((V4L2m2mPriv*)avctx->priv_data)->context; -- int src_rv; -+ int src_rv = NQ_NONE; - int dst_rv = 1; // Non-zero (done), non-negative (error) number -+ unsigned int i = 0; - - do { -- av_log(avctx, AV_LOG_INFO, "Pending=%d\n", xlat_pending(&s->xlat)); -- src_rv = try_enqueue_src(avctx, s); -- -- // If we got a frame last time and we have nothing to enqueue then -- // return now. rv will be AVERROR(EAGAIN) indicating that we want more input -- // This should mean that once decode starts we enter a stable state where -- // we alternately ask for input and produce output -- if (s->req_pkt && src_rv == NQ_SRC_EMPTY) -- break; -- -- if (src_rv == NQ_Q_FULL && dst_rv == AVERROR(EAGAIN)) { -- av_log(avctx, AV_LOG_WARNING, "Poll says src Q has space but enqueue fail"); -- src_rv = NQ_SRC_EMPTY; // If we can't enqueue pretend that there is nothing to enqueue -+ const int pending = xlat_pending(&s->xlat); -+ const int prefer_dq = (pending > 5); -+ -+ // Enqueue another pkt for decode if -+ // (a) We don't have a lot of stuff in the buffer already OR -+ // (b) ... we (think we) do but we've failed to get a frame already OR -+ // (c) We've dequeued a lot of frames without asking for input -+ if (!prefer_dq || i != 0 || s->req_pkt > 2) { -+ src_rv = try_enqueue_src(avctx, s); -+ -+ // If we got a frame last time or we've already tried to get a frame and -+ // we have nothing to enqueue then return now. rv will be AVERROR(EAGAIN) -+ // indicating that we want more input. -+ // This should mean that once decode starts we enter a stable state where -+ // we alternately ask for input and produce output -+ if ((i != 0 || s->req_pkt) && src_rv == NQ_SRC_EMPTY) -+ break; - } - - // Try to get a new frame if -@@ -495,9 +503,9 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - // Dequeue frame will unref any previous contents of frame - // if it returns success so we don't need an explicit unref - // when discarding -- // This returns AVERROR(EAGAIN) if there isn't a frame ready yet -- // but there is room in the input Q -- dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, src_rv == NQ_Q_FULL ? 100 : -1); -+ // This returns AVERROR(EAGAIN) on timeout or if -+ // there is room in the input Q and timeout == -1 -+ dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, prefer_dq ? 5 : -1); - - if (dst_rv == AVERROR_EOF && (s->draining || s->capture.done)) - av_log(avctx, AV_LOG_DEBUG, "Dequeue EOF: draining=%d, cap.done=%d\n", -@@ -510,10 +518,16 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - } while (dst_rv == 0 && xlat_pts_out(avctx, &s->xlat, &s->pts_stat, frame)); - } - -+ ++i; -+ if (i >= 256) { -+ av_log(avctx, AV_LOG_ERROR, "Unexpectedly large retry count: %d\n", i); -+ src_rv = AVERROR(EIO); -+ } -+ - // Continue trying to enqueue packets if either - // (a) we succeeded last time OR -- // (b) enqueue failed due to input Q full AND there is now room -- } while (src_rv == NQ_OK || (src_rv == NQ_Q_FULL && dst_rv == AVERROR(EAGAIN)) ); -+ // (b) we didn't ret a frame and we can retry the input -+ } while (src_rv == NQ_OK || (dst_rv == AVERROR(EAGAIN) && RETRY_NQ(src_rv))); - - // Ensure that the frame contains nothing if we aren't returning a frame - // (might happen when discarding) -@@ -521,7 +535,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - av_frame_unref(frame); - - // If we got a frame this time ask for a pkt next time -- s->req_pkt = (dst_rv == 0); -+ s->req_pkt = (dst_rv == 0) ? s->req_pkt + 1 : 0; - - #if 0 - if (dst_rv == 0) - -From 175abd2eb961a3718a660e1f9eda08b37b01b309 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 15 Dec 2021 12:23:54 +0000 -Subject: [PATCH 035/151] Allow logger() to take const ctx - ---- - libavcodec/v4l2_buffers.c | 2 +- - libavcodec/v4l2_context.c | 4 ++-- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 22da6bd722..39c0094aec 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -46,7 +46,7 @@ static inline V4L2m2mContext *buf_to_m2mctx(const V4L2Buffer * const buf) - container_of(buf->context, V4L2m2mContext, capture); - } - --static inline AVCodecContext *logger(V4L2Buffer *buf) -+static inline AVCodecContext *logger(const V4L2Buffer * const buf) - { - return buf_to_m2mctx(buf)->avctx; - } -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 64540a37b3..d3df48aed4 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -43,14 +43,14 @@ struct v4l2_format_update { - int update_avfmt; - }; - --static inline V4L2m2mContext *ctx_to_m2mctx(V4L2Context *ctx) -+static inline V4L2m2mContext *ctx_to_m2mctx(const V4L2Context *ctx) - { - return V4L2_TYPE_IS_OUTPUT(ctx->type) ? - container_of(ctx, V4L2m2mContext, output) : - container_of(ctx, V4L2m2mContext, capture); - } - --static inline AVCodecContext *logger(V4L2Context *ctx) -+static inline AVCodecContext *logger(const V4L2Context *ctx) - { - return ctx_to_m2mctx(ctx)->avctx; - } - -From 21d4f3f644c45084c621cb5aa577169bf5c15017 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 15 Dec 2021 13:00:27 +0000 -Subject: [PATCH 036/151] Track numbere of bufs qed with an atomic - -Safer and faster than counting status ---- - libavcodec/v4l2_buffers.c | 6 +++--- - libavcodec/v4l2_context.c | 3 ++- - libavcodec/v4l2_context.h | 3 +-- - 3 files changed, 6 insertions(+), 6 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 39c0094aec..2cf7be6632 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -922,6 +922,7 @@ fail: - int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf) - { - int ret; -+ int qc; - - avbuf->buf.flags = avbuf->flags; - -@@ -941,11 +942,10 @@ int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf) - return AVERROR(err); - } - -- ++avbuf->context->q_count; -+ qc = atomic_fetch_add(&avbuf->context->q_count, 1) + 1; - av_log(logger(avbuf), AV_LOG_DEBUG, "--- %s VIDIOC_QBUF: index %d, ts=%ld.%06ld count=%d\n", - avbuf->context->name, avbuf->buf.index, -- avbuf->buf.timestamp.tv_sec, avbuf->buf.timestamp.tv_usec, -- avbuf->context->q_count); -+ avbuf->buf.timestamp.tv_sec, avbuf->buf.timestamp.tv_usec, qc); - - avbuf->status = V4L2BUF_IN_DRIVER; - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index d3df48aed4..268a057e53 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -599,7 +599,7 @@ static int v4l2_release_buffers(V4L2Context* ctx) - " 2. drmIoctl(.., DRM_IOCTL_GEM_CLOSE,... )\n"); - } - } -- ctx->q_count = 0; -+ atomic_store(&ctx->q_count, 0); - - return ret; - } -@@ -1019,6 +1019,7 @@ int ff_v4l2_context_init(V4L2Context* ctx) - } - - ff_mutex_init(&ctx->lock, NULL); -+ atomic_init(&ctx->q_count, 0); - - if (s->output_drm) { - AVHWFramesContext *hwframes; -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index 4cc164886c..a4176448d5 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -110,8 +110,7 @@ typedef struct V4L2Context { - int no_pts_rescale; - - AVBufferRef *frames_ref; -- int q_count; -- int dq_count; -+ atomic_int q_count; - struct ff_weak_link_master *wl_master; - - AVMutex lock; - -From b2fa4ab3d63924597b8c3659123b145a786a2c13 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 9 Dec 2021 12:01:25 +0000 -Subject: [PATCH 037/151] Clear pkt_buf on flush - ---- - libavcodec/v4l2_m2m_dec.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 7e7e4729d0..09ec496351 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -715,6 +715,9 @@ static void v4l2_decode_flush(AVCodecContext *avctx) - if (ret < 0) - av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s error: %d\n", output->name, ret); - -+ // Clear any buffered input packet -+ av_packet_unref(&s->buf_pkt); -+ - // V4L2 makes no guarantees about whether decoded frames are flushed or not - // so mark all frames we are tracking to be discarded if they appear - xlat_flush(&s->xlat); - -From 16cf94cb5e1d11f4c3a6b8a43557383ce78112e0 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 15 Dec 2021 12:52:56 +0000 -Subject: [PATCH 038/151] Rework v4l2 buffer dequeue - ---- - libavcodec/v4l2_context.c | 543 ++++++++++++++++++-------------------- - libavcodec/v4l2_context.h | 2 + - libavcodec/v4l2_m2m.c | 1 - - libavcodec/v4l2_m2m.h | 16 +- - libavcodec/v4l2_m2m_dec.c | 138 ++++------ - 5 files changed, 327 insertions(+), 373 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 268a057e53..d765181645 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -73,19 +73,27 @@ static AVRational v4l2_get_sar(V4L2Context *ctx) - return sar; - } - --static inline unsigned int v4l2_resolution_changed(V4L2Context *ctx, struct v4l2_format *fmt2) -+static inline int ctx_buffers_alloced(const V4L2Context * const ctx) - { -- struct v4l2_format *fmt1 = &ctx->format; -- int ret = V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? -- fmt1->fmt.pix_mp.width != fmt2->fmt.pix_mp.width || -- fmt1->fmt.pix_mp.height != fmt2->fmt.pix_mp.height -- : -- fmt1->fmt.pix.width != fmt2->fmt.pix.width || -- fmt1->fmt.pix.height != fmt2->fmt.pix.height; -+ return ctx->bufrefs != NULL; -+} -+ -+// Width/Height changed or we don't have an alloc in the first place? -+static int ctx_resolution_changed(const V4L2Context *ctx, const struct v4l2_format *fmt2) -+{ -+ const struct v4l2_format *fmt1 = &ctx->format; -+ int ret = !ctx_buffers_alloced(ctx) || -+ (V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? -+ fmt1->fmt.pix_mp.width != fmt2->fmt.pix_mp.width || -+ fmt1->fmt.pix_mp.height != fmt2->fmt.pix_mp.height -+ : -+ fmt1->fmt.pix.width != fmt2->fmt.pix.width || -+ fmt1->fmt.pix.height != fmt2->fmt.pix.height); - - if (ret) -- av_log(logger(ctx), AV_LOG_DEBUG, "%s changed (%dx%d) -> (%dx%d)\n", -+ av_log(logger(ctx), AV_LOG_DEBUG, "V4L2 %s changed: alloc=%d (%dx%d) -> (%dx%d)\n", - ctx->name, -+ ctx_buffers_alloced(ctx), - ff_v4l2_get_format_width(fmt1), ff_v4l2_get_format_height(fmt1), - ff_v4l2_get_format_width(fmt2), ff_v4l2_get_format_height(fmt2)); - -@@ -167,10 +175,8 @@ static int do_source_change(V4L2m2mContext * const s) - - int ret; - int reinit; -- int full_reinit; - struct v4l2_format cap_fmt = s->capture.format; - -- s->resize_pending = 0; - s->capture.done = 0; - - ret = ioctl(s->fd, VIDIOC_G_FMT, &cap_fmt); -@@ -179,15 +185,21 @@ static int do_source_change(V4L2m2mContext * const s) - return 0; - } - -- s->output.sample_aspect_ratio = v4l2_get_sar(&s->output); -- - get_default_selection(&s->capture, &s->capture.selection); - -- reinit = v4l2_resolution_changed(&s->capture, &cap_fmt); -+ reinit = ctx_resolution_changed(&s->capture, &cap_fmt); -+ s->capture.format = cap_fmt; - if (reinit) { - s->capture.height = ff_v4l2_get_format_height(&cap_fmt); - s->capture.width = ff_v4l2_get_format_width(&cap_fmt); - } -+ -+ // If we don't support selection (or it is bust) and we obviously have HD then kludge -+ if ((s->capture.selection.width == 0 || s->capture.selection.height == 0) && -+ (s->capture.height == 1088 && s->capture.width == 1920)) { -+ s->capture.selection = (struct v4l2_rect){.width = 1920, .height = 1080}; -+ } -+ - s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture); - - av_log(avctx, AV_LOG_DEBUG, "Source change: SAR: %d/%d, crop %dx%d @ %d,%d\n", -@@ -195,11 +207,11 @@ static int do_source_change(V4L2m2mContext * const s) - s->capture.selection.width, s->capture.selection.height, - s->capture.selection.left, s->capture.selection.top); - -- s->reinit = 1; -- - if (reinit) { - if (avctx) -- ret = ff_set_dimensions(s->avctx, s->capture.width, s->capture.height); -+ ret = ff_set_dimensions(s->avctx, -+ s->capture.selection.width != 0 ? s->capture.selection.width : s->capture.width, -+ s->capture.selection.height != 0 ? s->capture.selection.height : s->capture.height); - if (ret < 0) - av_log(avctx, AV_LOG_WARNING, "update avcodec height and width failed\n"); - -@@ -208,11 +220,22 @@ static int do_source_change(V4L2m2mContext * const s) - av_log(avctx, AV_LOG_ERROR, "v4l2_m2m_codec_reinit failed\n"); - return AVERROR(EINVAL); - } -+ -+ // Update pixel format - should only actually do something on initial change -+ s->capture.av_pix_fmt = -+ ff_v4l2_format_v4l2_to_avfmt(ff_v4l2_get_format_pixelformat(&s->capture.format), AV_CODEC_ID_RAWVIDEO); -+ if (s->output_drm) { -+ avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; -+ avctx->sw_pix_fmt = s->capture.av_pix_fmt; -+ } -+ else -+ avctx->pix_fmt = s->capture.av_pix_fmt; -+ - goto reinit_run; - } - - /* Buffers are OK so just stream off to ack */ -- av_log(avctx, AV_LOG_DEBUG, "%s: Parameters only\n", __func__); -+ av_log(avctx, AV_LOG_DEBUG, "%s: Parameters only - restart decode\n", __func__); - - ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF); - if (ret) -@@ -225,54 +248,6 @@ reinit_run: - return 1; - } - --static int ctx_done(V4L2Context * const ctx) --{ -- int rv = 0; -- V4L2m2mContext * const s = ctx_to_m2mctx(ctx); -- -- ctx->done = 1; -- -- if (s->resize_pending && !V4L2_TYPE_IS_OUTPUT(ctx->type)) -- rv = do_source_change(s); -- -- return rv; --} -- --/** -- * handle resolution change event and end of stream event -- * returns 1 if reinit was successful, negative if it failed -- * returns 0 if reinit was not executed -- */ --static int v4l2_handle_event(V4L2Context *ctx) --{ -- V4L2m2mContext * const s = ctx_to_m2mctx(ctx); -- struct v4l2_event evt = { 0 }; -- int ret; -- -- ret = ioctl(s->fd, VIDIOC_DQEVENT, &evt); -- if (ret < 0) { -- av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_DQEVENT\n", ctx->name); -- return 0; -- } -- -- av_log(logger(ctx), AV_LOG_INFO, "Dq event %d\n", evt.type); -- -- if (evt.type == V4L2_EVENT_EOS) { --// ctx->done = 1; -- av_log(logger(ctx), AV_LOG_TRACE, "%s VIDIOC_EVENT_EOS\n", ctx->name); -- return 0; -- } -- -- if (evt.type != V4L2_EVENT_SOURCE_CHANGE) -- return 0; -- -- s->resize_pending = 1; -- if (!ctx->done) -- return 0; -- -- return do_source_change(s); --} -- - static int v4l2_stop_decode(V4L2Context *ctx) - { - struct v4l2_decoder_cmd cmd = { -@@ -313,243 +288,252 @@ static int v4l2_stop_encode(V4L2Context *ctx) - return 0; - } - --static int count_in_driver(const V4L2Context * const ctx) -+// DQ a buffer -+// Amalgamates all the various ways there are of signalling EOS/Event to -+// generate a consistant EPIPE. -+// -+// Sets ctx->flag_last if next dq would produce EPIPE (i.e. stream has stopped) -+// -+// Returns: -+// 0 Success -+// AVERROR(EPIPE) Nothing more to read -+// * AVERROR(..) -+ -+ static int -+dq_buf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf) - { -- int i; -- int n = 0; -+ V4L2m2mContext * const m = ctx_to_m2mctx(ctx); -+ AVCodecContext * const avctx = m->avctx; -+ V4L2Buffer * avbuf; -+ const int is_mp = V4L2_TYPE_IS_MULTIPLANAR(ctx->type); - -- if (!ctx->bufrefs) -- return -1; -- -- for (i = 0; i < ctx->num_buffers; ++i) { -- V4L2Buffer *const avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -- if (avbuf->status == V4L2BUF_IN_DRIVER) -- ++n; -- } -- return n; --} -+ struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; - --static V4L2Buffer* v4l2_dequeue_v4l2buf(V4L2Context *ctx, int timeout) --{ -- V4L2m2mContext * const s = ctx_to_m2mctx(ctx); -- const int is_capture = !V4L2_TYPE_IS_OUTPUT(ctx->type); -- struct v4l2_plane planes[VIDEO_MAX_PLANES]; -- struct v4l2_buffer buf = { 0 }; -- V4L2Buffer *avbuf; -- struct pollfd pfd = { -- .events = POLLIN | POLLRDNORM | POLLPRI | POLLOUT | POLLWRNORM, /* default blocking capture */ -- .fd = ctx_to_m2mctx(ctx)->fd, -+ struct v4l2_buffer buf = { -+ .type = ctx->type, -+ .memory = V4L2_MEMORY_MMAP, - }; -- int i, ret; -- int no_rx_means_done = 0; -- -- if (is_capture && ctx->bufrefs) { -- for (i = 0; i < ctx->num_buffers; i++) { -- avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -- if (avbuf->status == V4L2BUF_IN_DRIVER) -- break; -- } -- if (i == ctx->num_buffers) -- av_log(logger(ctx), AV_LOG_WARNING, "All capture buffers (%d) returned to " -- "userspace. Increase num_capture_buffers " -- "to prevent device deadlock or dropped " -- "packets/frames.\n", i); -+ -+ *ppavbuf = NULL; -+ -+ if (ctx->flag_last) -+ return AVERROR(EPIPE); -+ -+ if (is_mp) { -+ buf.length = VIDEO_MAX_PLANES; -+ buf.m.planes = planes; - } - --#if 0 -- // I think this is true but pointless -- // we will get some other form of EOF signal -- -- /* if we are draining and there are no more capture buffers queued in the driver we are done */ -- if (is_capture && ctx_to_m2mctx(ctx)->draining) { -- for (i = 0; i < ctx->num_buffers; i++) { -- /* capture buffer initialization happens during decode hence -- * detection happens at runtime -- */ -- if (!ctx->bufrefs) -- break; -- -- avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -- if (avbuf->status == V4L2BUF_IN_DRIVER) -- goto start; -+ while (ioctl(m->fd, VIDIOC_DQBUF, &buf) != 0) { -+ const int err = errno; -+ av_assert0(AVERROR(err) < 0); -+ if (err != EINTR) { -+ av_log(avctx, AV_LOG_DEBUG, "%s VIDIOC_DQBUF, errno (%s)\n", -+ ctx->name, av_err2str(AVERROR(err))); -+ -+ if (err == EPIPE) -+ ctx->flag_last = 1; -+ -+ return AVERROR(err); - } -- ctx->done = 1; -- return NULL; - } --#endif -- --start: -- if (is_capture) { -- /* no need to listen to requests for more input while draining */ -- if (ctx_to_m2mctx(ctx)->draining || timeout > 0) -- pfd.events = POLLIN | POLLRDNORM | POLLPRI; -- } else { -- pfd.events = POLLOUT | POLLWRNORM; -+ atomic_fetch_sub(&ctx->q_count, 1); -+ -+ avbuf = (V4L2Buffer *)ctx->bufrefs[buf.index]->data; -+ avbuf->status = V4L2BUF_AVAILABLE; -+ avbuf->buf = buf; -+ if (is_mp) { -+ memcpy(avbuf->planes, planes, sizeof(planes)); -+ avbuf->buf.m.planes = avbuf->planes; - } -- no_rx_means_done = s->resize_pending && is_capture; - -- for (;;) { -- // If we have a resize pending then all buffers should be Qed -- // With a resize pending we should be in drain but evidence suggests -- // that not all decoders do this so poll to clear -- int t2 = no_rx_means_done ? 0 : timeout < 0 ? 3000 : timeout; -- const int e = pfd.events; -- -- ret = poll(&pfd, 1, t2); -+ if (V4L2_TYPE_IS_CAPTURE(ctx->type)) { -+ // Zero length cap buffer return == EOS -+ if ((is_mp ? buf.m.planes[0].bytesused : buf.bytesused) == 0) { -+ av_log(avctx, AV_LOG_DEBUG, "Buffer empty - reQ\n"); - -- if (ret > 0) -- break; -+ // Must reQ so we don't leak -+ // May not matter if the next thing we do is release all the -+ // buffers but better to be tidy. -+ ff_v4l2_buffer_enqueue(avbuf); - -- if (ret < 0) { -- int err = errno; -- if (err == EINTR) -- continue; -- av_log(logger(ctx), AV_LOG_ERROR, "=== poll error %d (%s): events=%#x, cap buffers=%d\n", -- err, strerror(err), -- e, count_in_driver(ctx)); -- return NULL; -+ ctx->flag_last = 1; -+ return AVERROR(EPIPE); - } - -- // ret == 0 (timeout) -- if (no_rx_means_done) { -- av_log(logger(ctx), AV_LOG_DEBUG, "Ctx done on timeout\n"); -- ret = ctx_done(ctx); -- if (ret > 0) -- goto start; -- } -- if (timeout == -1) -- av_log(logger(ctx), AV_LOG_ERROR, "=== poll unexpected TIMEOUT: events=%#x, cap buffers=%d\n", e, count_in_driver(ctx));; -- return NULL; -+#ifdef V4L2_BUF_FLAG_LAST -+ // If flag_last set then this contains data but is the last frame -+ // so remember that but return OK -+ if ((buf.flags & V4L2_BUF_FLAG_LAST) != 0) -+ ctx->flag_last = 1; -+#endif - } - -- /* 0. handle errors */ -- if (pfd.revents & POLLERR) { -- /* if we are trying to get free buffers but none have been queued yet -- no need to raise a warning */ -- if (timeout == 0) { -- for (i = 0; i < ctx->num_buffers; i++) { -- avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -- if (avbuf->status != V4L2BUF_AVAILABLE) -- av_log(logger(ctx), AV_LOG_WARNING, "%s POLLERR\n", ctx->name); -- } -- } -- else -- av_log(logger(ctx), AV_LOG_WARNING, "%s POLLERR\n", ctx->name); -+ *ppavbuf = avbuf; -+ return 0; -+} - -- return NULL; -- } -+/** -+ * handle resolution change event and end of stream event -+ * Expects to be called after the stream has stopped -+ * -+ * returns 1 if reinit was successful, negative if it failed -+ * returns 0 if reinit was not executed -+ */ -+static int -+get_event(V4L2m2mContext * const m) -+{ -+ AVCodecContext * const avctx = m->avctx; -+ struct v4l2_event evt = { 0 }; - -- /* 1. handle resolution changes */ -- if (pfd.revents & POLLPRI) { -- ret = v4l2_handle_event(ctx); -- if (ret < 0) { -- /* if re-init failed, abort */ -- ctx->done = 1; -- return NULL; -+ while (ioctl(m->fd, VIDIOC_DQEVENT, &evt) != 0) { -+ const int rv = AVERROR(errno); -+ if (rv == AVERROR(EINTR)) -+ continue; -+ if (rv == AVERROR(EAGAIN)) { -+ av_log(avctx, AV_LOG_WARNING, "V4L2 failed to get expected event - assume EOS\n"); -+ return AVERROR_EOF; - } -- if (ret > 0) -- goto start; -+ av_log(avctx, AV_LOG_ERROR, "V4L2 VIDIOC_DQEVENT: %s\n", av_err2str(rv)); -+ return rv; -+ } -+ -+ av_log(avctx, AV_LOG_DEBUG, "Dq event %d\n", evt.type); -+ -+ if (evt.type == V4L2_EVENT_EOS) { -+ av_log(avctx, AV_LOG_TRACE, "V4L2 VIDIOC_EVENT_EOS\n"); -+ return AVERROR_EOF; - } - -- /* 2. dequeue the buffer */ -- if (pfd.revents & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM)) { -+ if (evt.type == V4L2_EVENT_SOURCE_CHANGE) -+ return do_source_change(m); - -- if (is_capture) { -- /* there is a capture buffer ready */ -- if (pfd.revents & (POLLIN | POLLRDNORM)) -- goto dequeue; -+ return 0; -+} - -- // CAPTURE Q drained -- if (no_rx_means_done) { -- if (ctx_done(ctx) > 0) -- goto start; -- return NULL; -- } - -- /* the driver is ready to accept more input; instead of waiting for the capture -- * buffer to complete we return NULL so input can proceed (we are single threaded) -- */ -- if (pfd.revents & (POLLOUT | POLLWRNORM)) -- return NULL; -+// Get a buffer -+// If output then just gets the buffer in the expected way -+// If capture then runs the capture state m/c to deal with res change etc. -+// If return value == 0 then *ppavbuf != NULL -+ -+static int -+get_qbuf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf, const int timeout) -+{ -+ V4L2m2mContext * const m = ctx_to_m2mctx(ctx); -+ AVCodecContext * const avctx = m->avctx; -+ const int is_cap = V4L2_TYPE_IS_CAPTURE(ctx->type); -+ -+ const unsigned int poll_cap = (POLLIN | POLLRDNORM); -+ const unsigned int poll_out = (POLLOUT | POLLWRNORM); -+ const unsigned int poll_event = POLLPRI; -+ -+ *ppavbuf = NULL; -+ -+ for (;;) { -+ struct pollfd pfd = { -+ .fd = m->fd, -+ // If capture && stream not started then assume we are waiting for the initial event -+ .events = !is_cap ? poll_out : -+ !ff_v4l2_ctx_eos(ctx) && ctx->streamon ? poll_cap : -+ poll_event, -+ }; -+ int ret; -+ -+ if (ctx->done) { -+ av_log(avctx, AV_LOG_TRACE, "V4L2 %s already done\n", ctx->name); -+ return AVERROR_EOF; - } - --dequeue: -- memset(&buf, 0, sizeof(buf)); -- buf.memory = V4L2_MEMORY_MMAP; -- buf.type = ctx->type; -- if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { -- memset(planes, 0, sizeof(planes)); -- buf.length = VIDEO_MAX_PLANES; -- buf.m.planes = planes; -+ // If capture && timeout == -1 then also wait for rx buffer free -+ if (is_cap && timeout == -1 && m->output.streamon && !m->draining) -+ pfd.events |= poll_out; -+ -+ // If nothing Qed all we will get is POLLERR - avoid that -+ if ((pfd.events == poll_out && atomic_load(&m->output.q_count) == 0) || -+ (pfd.events == poll_cap && atomic_load(&m->capture.q_count) == 0) || -+ (pfd.events == (poll_cap | poll_out) && atomic_load(&m->capture.q_count) == 0 && atomic_load(&m->output.q_count) == 0)) { -+ av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s empty\n", ctx->name); -+ return AVERROR(EAGAIN); - } - -- while ((ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_DQBUF, &buf)) == -1) { -- const int err = errno; -- if (err == EINTR) -+ // Timeout kludged s.t. "forever" eventually gives up & produces logging -+ // If waiting for an event when we have seen a last_frame then we expect -+ // it to be ready already so force a short timeout -+ ret = poll(&pfd, 1, -+ ff_v4l2_ctx_eos(ctx) ? 10 : -+ timeout == -1 ? 3000 : timeout); -+ if (ret < 0) { -+ ret = AVERROR(errno); // Remember errno before logging etc. -+ av_assert0(ret < 0); -+ } -+ -+ av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s ret=%d, timeout=%d, events=%#x, revents=%#x\n", -+ ctx->name, ret, timeout, pfd.events, pfd.revents); -+ -+ if (ret < 0) { -+ if (ret == AVERROR(EINTR)) - continue; -- if (err != EAGAIN) { -- // EPIPE on CAPTURE can be used instead of BUF_FLAG_LAST -- if (err != EPIPE || !is_capture) -- av_log(logger(ctx), AV_LOG_DEBUG, "%s VIDIOC_DQBUF, errno (%s)\n", -- ctx->name, av_err2str(AVERROR(err))); -- if (ctx_done(ctx) > 0) -- goto start; -+ av_log(avctx, AV_LOG_ERROR, "V4L2 %s poll error %d (%s)\n", ctx->name, AVUNERROR(ret), av_err2str(ret)); -+ return ret; -+ } -+ -+ if (ret == 0) { -+ if (timeout == -1) -+ av_log(avctx, AV_LOG_ERROR, "V4L2 %s poll unexpected timeout: events=%#x\n", ctx->name, pfd.events); -+ if (ff_v4l2_ctx_eos(ctx)) { -+ av_log(avctx, AV_LOG_WARNING, "V4L2 %s poll event timeout\n", ctx->name); -+ ret = get_event(m); -+ if (ret < 0) { -+ ctx->done = 1; -+ return ret; -+ } - } -- return NULL; -+ return AVERROR(EAGAIN); - } -- --ctx->q_count; -- av_log(logger(ctx), AV_LOG_DEBUG, "--- %s VIDIOC_DQBUF OK: index=%d, ts=%ld.%06ld, count=%d, dq=%d field=%d\n", -- ctx->name, buf.index, -- buf.timestamp.tv_sec, buf.timestamp.tv_usec, -- ctx->q_count, ++ctx->dq_count, buf.field); -- -- avbuf = (V4L2Buffer *)ctx->bufrefs[buf.index]->data; -- avbuf->status = V4L2BUF_AVAILABLE; -- avbuf->buf = buf; -- if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { -- memcpy(avbuf->planes, planes, sizeof(planes)); -- avbuf->buf.m.planes = avbuf->planes; -+ -+ if ((pfd.revents & POLLERR) != 0) { -+ av_log(avctx, AV_LOG_WARNING, "V4L2 %s POLLERR\n", ctx->name); -+ return AVERROR_UNKNOWN; - } - -- if (ctx_to_m2mctx(ctx)->draining && is_capture) { -- int bytesused = V4L2_TYPE_IS_MULTIPLANAR(buf.type) ? -- buf.m.planes[0].bytesused : buf.bytesused; -- if (bytesused == 0) { -- av_log(logger(ctx), AV_LOG_DEBUG, "Buffer empty - reQ\n"); -+ if ((pfd.revents & poll_event) != 0) { -+ ret = get_event(m); -+ if (ret < 0) { -+ ctx->done = 1; -+ return ret; -+ } -+ continue; -+ } - -- // Must reQ so we don't leak -- // May not matter if the next thing we do is release all the -- // buffers but better to be tidy. -- ff_v4l2_buffer_enqueue(avbuf); -+ if ((pfd.revents & poll_cap) != 0) { -+ ret = dq_buf(ctx, ppavbuf); -+ if (ret == AVERROR(EPIPE)) -+ continue; -+ return ret; -+ } - -- if (ctx_done(ctx) > 0) -- goto start; -- return NULL; -- } --#ifdef V4L2_BUF_FLAG_LAST -- if (buf.flags & V4L2_BUF_FLAG_LAST) { -- av_log(logger(ctx), AV_LOG_TRACE, "FLAG_LAST set\n"); -- avbuf->status = V4L2BUF_IN_USE; // Avoid flushing this buffer -- ctx_done(ctx); -- } --#endif -+ if ((pfd.revents & poll_out) != 0) { -+ if (is_cap) -+ return AVERROR(EAGAIN); -+ return dq_buf(ctx, ppavbuf); - } - -- return avbuf; -+ av_log(avctx, AV_LOG_ERROR, "V4L2 poll unexpected events=%#x, revents=%#x\n", pfd.events, pfd.revents); -+ return AVERROR_UNKNOWN; - } -- -- return NULL; - } - - static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) - { -- int timeout = 0; /* return when no more buffers to dequeue */ - int i; - - /* get back as many output buffers as possible */ - if (V4L2_TYPE_IS_OUTPUT(ctx->type)) { -- do { -- } while (v4l2_dequeue_v4l2buf(ctx, timeout)); -+ V4L2Buffer * avbuf; -+ do { -+ get_qbuf(ctx, &avbuf, 0); -+ } while (avbuf); - } - - for (i = 0; i < ctx->num_buffers; i++) { -@@ -722,7 +706,7 @@ static void flush_all_buffers_status(V4L2Context* const ctx) - if (buf->status == V4L2BUF_IN_DRIVER) - buf->status = V4L2BUF_AVAILABLE; - } -- ctx->q_count = 0; -+ atomic_store(&ctx->q_count, 0); - } - - static int stuff_all_buffers(AVCodecContext * avctx, V4L2Context* ctx) -@@ -755,6 +739,10 @@ int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd) - int ret; - AVCodecContext * const avctx = logger(ctx); - -+ // Avoid doing anything if there is nothing we can do -+ if (cmd == VIDIOC_STREAMOFF && !ctx_buffers_alloced(ctx) && !ctx->streamon) -+ return 0; -+ - ff_mutex_lock(&ctx->lock); - - if (cmd == VIDIOC_STREAMON && !V4L2_TYPE_IS_OUTPUT(ctx->type)) -@@ -777,6 +765,9 @@ int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd) - cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF"); - } - -+ // Both stream off & on effectively clear flag_last -+ ctx->flag_last = 0; -+ - ff_mutex_unlock(&ctx->lock); - - return ret; -@@ -840,19 +831,10 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, - int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) - { - V4L2Buffer *avbuf; -+ int rv; - -- /* -- * timeout=-1 blocks until: -- * 1. decoded frame available -- * 2. an input buffer is ready to be dequeued -- */ -- avbuf = v4l2_dequeue_v4l2buf(ctx, timeout); -- if (!avbuf) { -- if (ctx->done) -- return AVERROR_EOF; -- -- return AVERROR(EAGAIN); -- } -+ if ((rv = get_qbuf(ctx, &avbuf, timeout)) != 0) -+ return rv; - - return ff_v4l2_buffer_buf_to_avframe(frame, avbuf); - } -@@ -860,19 +842,10 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) - int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt) - { - V4L2Buffer *avbuf; -+ int rv; - -- /* -- * blocks until: -- * 1. encoded packet available -- * 2. an input buffer ready to be dequeued -- */ -- avbuf = v4l2_dequeue_v4l2buf(ctx, -1); -- if (!avbuf) { -- if (ctx->done) -- return AVERROR_EOF; -- -- return AVERROR(EAGAIN); -- } -+ if ((rv = get_qbuf(ctx, &avbuf, -1)) != 0) -+ return rv; - - return ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf); - } -@@ -956,6 +929,8 @@ static int create_buffers(V4L2Context* const ctx, const unsigned int req_buffers - int ret; - int i; - -+ av_assert0(ctx->bufrefs == NULL); -+ - memset(&req, 0, sizeof(req)); - req.count = req_buffers; - req.memory = V4L2_MEMORY_MMAP; -@@ -1033,8 +1008,8 @@ int ff_v4l2_context_init(V4L2Context* ctx) - hwframes = (AVHWFramesContext*)ctx->frames_ref->data; - hwframes->format = AV_PIX_FMT_DRM_PRIME; - hwframes->sw_format = ctx->av_pix_fmt; -- hwframes->width = ctx->width; -- hwframes->height = ctx->height; -+ hwframes->width = ctx->width != 0 ? ctx->width : s->avctx->width; -+ hwframes->height = ctx->height != 0 ? ctx->height : s->avctx->height; - ret = av_hwframe_ctx_init(ctx->frames_ref); - if (ret < 0) - goto fail_unref_hwframes; -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index a4176448d5..565858a1ed 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -102,6 +102,8 @@ typedef struct V4L2Context { - */ - int done; - -+ int flag_last; -+ - /** - * PTS rescale not wanted - * If the PTS is just a dummy frame count then rescale is -diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c -index 516e6d9858..e26bd74c3e 100644 ---- a/libavcodec/v4l2_m2m.c -+++ b/libavcodec/v4l2_m2m.c -@@ -235,7 +235,6 @@ int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *s) - - /* 5. complete reinit */ - s->draining = 0; -- s->reinit = 0; - - return 0; - } -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 3f86809623..d71f6b721c 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -84,8 +84,6 @@ typedef struct V4L2m2mContext { - AVCodecContext *avctx; - sem_t refsync; - atomic_uint refcount; -- int reinit; -- int resize_pending; - - /* null frame/packet received */ - int draining; -@@ -180,15 +178,25 @@ int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *ctx); - int ff_v4l2_m2m_codec_full_reinit(V4L2m2mContext *ctx); - - --static inline unsigned int ff_v4l2_get_format_width(struct v4l2_format *fmt) -+static inline unsigned int ff_v4l2_get_format_width(const struct v4l2_format * const fmt) - { - return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.width : fmt->fmt.pix.width; - } - --static inline unsigned int ff_v4l2_get_format_height(struct v4l2_format *fmt) -+static inline unsigned int ff_v4l2_get_format_height(const struct v4l2_format * const fmt) - { - return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height; - } - -+static inline uint32_t ff_v4l2_get_format_pixelformat(const struct v4l2_format * const fmt) -+{ -+ return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.pixelformat : fmt->fmt.pix.pixelformat; -+} -+ -+static inline int ff_v4l2_ctx_eos(const V4L2Context * const ctx) -+{ -+ return ctx->flag_last; -+} -+ - - #endif /* AVCODEC_V4L2_M2M_H */ -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 09ec496351..e4b6569ba5 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -113,9 +113,6 @@ static int check_output_streamon(AVCodecContext *const avctx, V4L2m2mContext *co - if (ret < 0) - av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMON on output context\n"); - -- if (!s->capture.streamon || ret < 0) -- return ret; -- - ret = ioctl(s->fd, VIDIOC_DECODER_CMD, &cmd); - if (ret < 0) - av_log(avctx, AV_LOG_ERROR, "VIDIOC_DECODER_CMD start error: %d\n", errno); -@@ -127,69 +124,12 @@ static int check_output_streamon(AVCodecContext *const avctx, V4L2m2mContext *co - - static int v4l2_try_start(AVCodecContext *avctx) - { -- V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; -- V4L2Context *const capture = &s->capture; -- struct v4l2_selection selection = { 0 }; -+ V4L2m2mContext * const s = ((V4L2m2mPriv*)avctx->priv_data)->context; - int ret; - - /* 1. start the output process */ - if ((ret = check_output_streamon(avctx, s)) != 0) - return ret; -- -- if (capture->streamon) -- return 0; -- -- /* 2. get the capture format */ -- capture->format.type = capture->type; -- ret = ioctl(s->fd, VIDIOC_G_FMT, &capture->format); -- if (ret) { -- av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_FMT ioctl\n"); -- return ret; -- } -- -- /* 2.1 update the AVCodecContext */ -- capture->av_pix_fmt = -- ff_v4l2_format_v4l2_to_avfmt(capture->format.fmt.pix_mp.pixelformat, AV_CODEC_ID_RAWVIDEO); -- if (s->output_drm) { -- avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; -- avctx->sw_pix_fmt = capture->av_pix_fmt; -- } -- else -- avctx->pix_fmt = capture->av_pix_fmt; -- -- /* 3. set the crop parameters */ --#if 1 -- selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; -- selection.target = V4L2_SEL_TGT_CROP_DEFAULT; -- ret = ioctl(s->fd, VIDIOC_G_SELECTION, &selection); -- av_log(avctx, AV_LOG_INFO, "Post G selection ret=%d, err=%d %dx%d\n", ret, errno, selection.r.width, selection.r.height); --#else -- selection.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; -- selection.r.height = avctx->coded_height; -- selection.r.width = avctx->coded_width; -- av_log(avctx, AV_LOG_INFO, "Try selection %dx%d\n", avctx->coded_width, avctx->coded_height); -- ret = ioctl(s->fd, VIDIOC_S_SELECTION, &selection); -- av_log(avctx, AV_LOG_INFO, "Post S selection ret=%d, err=%d %dx%d\n", ret, errno, selection.r.width, selection.r.height); -- if (1) { -- ret = ioctl(s->fd, VIDIOC_G_SELECTION, &selection); -- if (ret) { -- av_log(avctx, AV_LOG_WARNING, "VIDIOC_G_SELECTION ioctl\n"); -- } else { -- av_log(avctx, AV_LOG_DEBUG, "crop output %dx%d\n", selection.r.width, selection.r.height); -- /* update the size of the resulting frame */ -- capture->height = selection.r.height; -- capture->width = selection.r.width; -- } -- } --#endif -- -- /* 5. start the capture process */ -- ret = ff_v4l2_context_set_status(capture, VIDIOC_STREAMON); -- if (ret) { -- av_log(avctx, AV_LOG_DEBUG, "VIDIOC_STREAMON, on capture context\n"); -- return ret; -- } -- - return 0; - } - -@@ -364,7 +304,7 @@ xlat_pending(const xlat_track_t * const x) - } - - static inline int stream_started(const V4L2m2mContext * const s) { -- return s->capture.streamon && s->output.streamon; -+ return s->output.streamon; - } - - #define NQ_OK 0 -@@ -377,6 +317,9 @@ static inline int stream_started(const V4L2m2mContext * const s) { - #define TRY_DQ(nq_status) ((nq_status) >= NQ_OK && (nq_status) <= NQ_DRAINING) - #define RETRY_NQ(nq_status) ((nq_status) == NQ_Q_FULL || (nq_status) == NQ_NONE) - -+// do_not_get If true then no new packet will be got but status will -+// be set appropriately -+ - // AVERROR_EOF Flushing an already flushed stream - // -ve Error (all errors except EOF are unexpected) - // NQ_OK (0) OK -@@ -386,14 +329,14 @@ static inline int stream_started(const V4L2m2mContext * const s) { - // NQ_DRAINING At EOS, dQ dest until EOS there too - // NQ_DEAD Not running (do not retry, do not attempt capture dQ) - --static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const s) -+static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const s, const int do_not_get) - { - int ret; - - // If we don't already have a coded packet - get a new one - // We will already have a coded pkt if the output Q was full last time we - // tried to Q it -- if (!s->buf_pkt.size) { -+ if (!s->buf_pkt.size && !do_not_get) { - ret = ff_decode_get_packet(avctx, &s->buf_pkt); - - if (ret == AVERROR(EAGAIN)) { -@@ -435,6 +378,17 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - xlat_pts_in(avctx, &s->xlat, &s->buf_pkt); - } - -+ if (s->draining) { -+ if (s->buf_pkt.size) { -+ av_log(avctx, AV_LOG_WARNING, "Unexpected input whilst draining\n"); -+ av_packet_unref(&s->buf_pkt); -+ } -+ return NQ_DRAINING; -+ } -+ -+ if (!s->buf_pkt.size) -+ return NQ_NONE; -+ - if ((ret = check_output_streamon(avctx, s)) != 0) - return ret; - -@@ -471,7 +425,7 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - { - V4L2m2mContext *const s = ((V4L2m2mPriv*)avctx->priv_data)->context; -- int src_rv = NQ_NONE; -+ int src_rv; - int dst_rv = 1; // Non-zero (done), non-negative (error) number - unsigned int i = 0; - -@@ -483,31 +437,40 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - // (a) We don't have a lot of stuff in the buffer already OR - // (b) ... we (think we) do but we've failed to get a frame already OR - // (c) We've dequeued a lot of frames without asking for input -- if (!prefer_dq || i != 0 || s->req_pkt > 2) { -- src_rv = try_enqueue_src(avctx, s); -- -- // If we got a frame last time or we've already tried to get a frame and -- // we have nothing to enqueue then return now. rv will be AVERROR(EAGAIN) -- // indicating that we want more input. -- // This should mean that once decode starts we enter a stable state where -- // we alternately ask for input and produce output -- if ((i != 0 || s->req_pkt) && src_rv == NQ_SRC_EMPTY) -- break; -- } -+ src_rv = try_enqueue_src(avctx, s, !(!prefer_dq || i != 0 || s->req_pkt > 2)); -+ -+ // If we got a frame last time or we've already tried to get a frame and -+ // we have nothing to enqueue then return now. rv will be AVERROR(EAGAIN) -+ // indicating that we want more input. -+ // This should mean that once decode starts we enter a stable state where -+ // we alternately ask for input and produce output -+ if ((i != 0 || s->req_pkt) && src_rv == NQ_SRC_EMPTY) -+ break; - - // Try to get a new frame if - // (a) we haven't already got one AND - // (b) enqueue returned a status indicating that decode should be attempted - if (dst_rv != 0 && TRY_DQ(src_rv)) { -+ // Pick a timeout depending on state -+ const int t = -+ src_rv == NQ_DRAINING ? 300 : -+ prefer_dq ? 5 : -+ src_rv == NQ_Q_FULL ? -1 : 0; -+ - do { - // Dequeue frame will unref any previous contents of frame - // if it returns success so we don't need an explicit unref - // when discarding - // This returns AVERROR(EAGAIN) on timeout or if - // there is room in the input Q and timeout == -1 -- dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, prefer_dq ? 5 : -1); -+ dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, t); - -- if (dst_rv == AVERROR_EOF && (s->draining || s->capture.done)) -+ if (dst_rv == AVERROR(EAGAIN) && src_rv == NQ_DRAINING) { -+ av_log(avctx, AV_LOG_WARNING, "Timeout in drain - assume EOF"); -+ dst_rv = AVERROR_EOF; -+ s->capture.done = 1; -+ } -+ else if (dst_rv == AVERROR_EOF && (s->draining || s->capture.done)) - av_log(avctx, AV_LOG_DEBUG, "Dequeue EOF: draining=%d, cap.done=%d\n", - s->draining, s->capture.done); - else if (dst_rv && dst_rv != AVERROR(EAGAIN)) -@@ -630,8 +593,10 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - * by the v4l2 driver; this event will trigger a full pipeline reconfig and - * the proper values will be retrieved from the kernel driver. - */ -- output->height = capture->height = avctx->coded_height; -- output->width = capture->width = avctx->coded_width; -+// output->height = capture->height = avctx->coded_height; -+// output->width = capture->width = avctx->coded_width; -+ output->height = capture->height = 0; -+ output->width = capture->width = 0; - - output->av_codec_id = avctx->codec_id; - output->av_pix_fmt = AV_PIX_FMT_NONE; -@@ -703,7 +668,6 @@ static void v4l2_decode_flush(AVCodecContext *avctx) - V4L2m2mContext * const s = priv->context; - V4L2Context * const output = &s->output; - V4L2Context * const capture = &s->capture; -- int ret; - - av_log(avctx, AV_LOG_TRACE, "<<< %s: streamon=%d\n", __func__, output->streamon); - -@@ -711,13 +675,19 @@ static void v4l2_decode_flush(AVCodecContext *avctx) - // states like EOS processing so don't try to optimize out (having got it - // wrong once) - -- ret = ff_v4l2_context_set_status(output, VIDIOC_STREAMOFF); -- if (ret < 0) -- av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s error: %d\n", output->name, ret); -+ ff_v4l2_context_set_status(output, VIDIOC_STREAMOFF); - - // Clear any buffered input packet - av_packet_unref(&s->buf_pkt); - -+ // Clear a pending EOS -+ if (ff_v4l2_ctx_eos(capture)) { -+ // Arguably we could delay this but this is easy and doesn't require -+ // thought or extra vars -+ ff_v4l2_context_set_status(capture, VIDIOC_STREAMOFF); -+ ff_v4l2_context_set_status(capture, VIDIOC_STREAMON); -+ } -+ - // V4L2 makes no guarantees about whether decoded frames are flushed or not - // so mark all frames we are tracking to be discarded if they appear - xlat_flush(&s->xlat); - -From a2519f7a512edde7433aced70de4464e21805693 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 9 Dec 2021 18:51:00 +0000 -Subject: [PATCH 039/151] Honor result of ff_get_format if possible - ---- - libavcodec/v4l2_m2m_dec.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index e4b6569ba5..c9655bcc3b 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -615,15 +615,19 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - * check the v4l2_get_drm_frame function. - */ - -+ avctx->sw_pix_fmt = avctx->pix_fmt; - gf_pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts); - av_log(avctx, AV_LOG_DEBUG, "avctx requested=%d (%s); get_format requested=%d (%s)\n", - avctx->pix_fmt, av_get_pix_fmt_name(avctx->pix_fmt), gf_pix_fmt, av_get_pix_fmt_name(gf_pix_fmt)); - -- s->output_drm = 0; - if (gf_pix_fmt == AV_PIX_FMT_DRM_PRIME || avctx->pix_fmt == AV_PIX_FMT_DRM_PRIME) { - avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; - s->output_drm = 1; - } -+ else { -+ capture->av_pix_fmt = gf_pix_fmt; -+ s->output_drm = 0; -+ } - - s->device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_DRM); - if (!s->device_ref) { - -From a1cd1cb98e48c631392b385ccac5ab7b09bb5ee9 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 14 Dec 2021 16:11:10 +0000 -Subject: [PATCH 040/151] Add an always-reinit quirk - ---- - libavcodec/v4l2_context.c | 7 +++++-- - libavcodec/v4l2_m2m.h | 5 +++++ - libavcodec/v4l2_m2m_dec.c | 33 ++++++++++++++++++++++++++++++++- - 3 files changed, 42 insertions(+), 3 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index d765181645..c11b5e6863 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -188,6 +188,9 @@ static int do_source_change(V4L2m2mContext * const s) - get_default_selection(&s->capture, &s->capture.selection); - - reinit = ctx_resolution_changed(&s->capture, &cap_fmt); -+ if ((s->quirks & FF_V4L2_QUIRK_REINIT_ALWAYS) != 0) -+ reinit = 1; -+ - s->capture.format = cap_fmt; - if (reinit) { - s->capture.height = ff_v4l2_get_format_height(&cap_fmt); -@@ -202,10 +205,10 @@ static int do_source_change(V4L2m2mContext * const s) - - s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture); - -- av_log(avctx, AV_LOG_DEBUG, "Source change: SAR: %d/%d, crop %dx%d @ %d,%d\n", -+ av_log(avctx, AV_LOG_DEBUG, "Source change: SAR: %d/%d, crop %dx%d @ %d,%d, reinit=%d\n", - s->capture.sample_aspect_ratio.num, s->capture.sample_aspect_ratio.den, - s->capture.selection.width, s->capture.selection.height, -- s->capture.selection.left, s->capture.selection.top); -+ s->capture.selection.left, s->capture.selection.top, reinit); - - if (reinit) { - if (avctx) -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index d71f6b721c..f1923bb26d 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -113,6 +113,11 @@ typedef struct V4L2m2mContext { - - /* Ext data sent */ - int extdata_sent; -+ -+#define FF_V4L2_QUIRK_REINIT_ALWAYS 1 -+ /* Quirks */ -+ unsigned int quirks; -+ - } V4L2m2mContext; - - typedef struct V4L2m2mPriv { -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index c9655bcc3b..e2b10f5e3a 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -540,6 +540,34 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - } - #endif - -+static int -+get_quirks(AVCodecContext * const avctx, V4L2m2mContext * const s) -+{ -+ struct v4l2_capability cap; -+ -+ memset(&cap, 0, sizeof(cap)); -+ while (ioctl(s->fd, VIDIOC_QUERYCAP, &cap) != 0) { -+ int err = errno; -+ if (err == EINTR) -+ continue; -+ av_log(avctx, AV_LOG_ERROR, "V4L2: Failed to get capabilities: %s\n", strerror(err)); -+ return AVERROR(err); -+ } -+ -+ // Could be made table driven if we have a few more but right now there -+ // seems no point -+ -+ // Meson (amlogic) always gives a resolution changed event after output -+ // streamon and userspace must (re)allocate capture buffers and streamon -+ // capture to clear the event even if the capture buffers were the right -+ // size in the first place. -+ if (strcmp(cap.driver, "meson-vdec") == 0) -+ s->quirks |= FF_V4L2_QUIRK_REINIT_ALWAYS; -+ -+ av_log(avctx, AV_LOG_DEBUG, "Driver '%s': Quirks=%#x\n", cap.driver, s->quirks); -+ return 0; -+} -+ - // This heuristic is for H264 but use for everything - static uint32_t max_coded_size(const AVCodecContext * const avctx) - { -@@ -646,7 +674,10 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - return ret; - } - -- return v4l2_prepare_decoder(s); -+ if ((ret = v4l2_prepare_decoder(s)) < 0) -+ return ret; -+ -+ return get_quirks(avctx, s); - } - - static av_cold int v4l2_decode_close(AVCodecContext *avctx) - -From 2470968adf0d28bbaf310e782720dd00d57d7bf6 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 4 Jan 2022 16:58:31 +0000 -Subject: [PATCH 041/151] v4l2_buffers: rework flags for keyframe - -Previously flags could become confused and keyframe info could be lost. -This fixes that and removes the duplicate flags field in V4L2Buffer. ---- - libavcodec/v4l2_buffers.c | 15 ++++++++++----- - libavcodec/v4l2_buffers.h | 1 - - libavcodec/v4l2_context.c | 18 +++++++++++++++++- - 3 files changed, 27 insertions(+), 7 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 2cf7be6632..62d1c26053 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -680,7 +680,9 @@ static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - - int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - { -- out->buf.flags = frame->key_frame ? (out->buf.flags & ~V4L2_BUF_FLAG_KEYFRAME) : (out->buf.flags | V4L2_BUF_FLAG_KEYFRAME); -+ out->buf.flags = frame->key_frame ? -+ (out->buf.flags | V4L2_BUF_FLAG_KEYFRAME) : -+ (out->buf.flags & ~V4L2_BUF_FLAG_KEYFRAME); - // Beware that colour info is held in format rather than the actual - // v4l2 buffer struct so this may not be as useful as you might hope - v4l2_set_color(out, frame->color_primaries, frame->colorspace, frame->color_trc); -@@ -706,6 +708,10 @@ int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) - - /* 2. get frame information */ - frame->key_frame = !!(avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME); -+ frame->pict_type = frame->key_frame ? AV_PICTURE_TYPE_I : -+ (avbuf->buf.flags & V4L2_BUF_FLAG_PFRAME) != 0 ? AV_PICTURE_TYPE_P : -+ (avbuf->buf.flags & V4L2_BUF_FLAG_BFRAME) != 0 ? AV_PICTURE_TYPE_B : -+ AV_PICTURE_TYPE_NONE; - frame->color_primaries = v4l2_get_color_primaries(avbuf); - frame->colorspace = v4l2_get_color_space(avbuf); - frame->color_range = v4l2_get_color_range(avbuf); -@@ -779,8 +785,9 @@ int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, - - v4l2_set_pts(out, pkt->pts); - -- if (pkt->flags & AV_PKT_FLAG_KEY) -- out->flags = V4L2_BUF_FLAG_KEYFRAME; -+ out->buf.flags = (pkt->flags & AV_PKT_FLAG_KEY) != 0 ? -+ (out->buf.flags | V4L2_BUF_FLAG_KEYFRAME) : -+ (out->buf.flags & ~V4L2_BUF_FLAG_KEYFRAME); - - return ret; - } -@@ -924,8 +931,6 @@ int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf) - int ret; - int qc; - -- avbuf->buf.flags = avbuf->flags; -- - if (avbuf->buf.timestamp.tv_sec || avbuf->buf.timestamp.tv_usec) { - av_log(logger(avbuf), AV_LOG_DEBUG, "--- %s pre VIDIOC_QBUF: index %d, ts=%ld.%06ld count=%d\n", - avbuf->context->name, avbuf->buf.index, -diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h -index 641e0e147b..3b7ca4d99e 100644 ---- a/libavcodec/v4l2_buffers.h -+++ b/libavcodec/v4l2_buffers.h -@@ -73,7 +73,6 @@ typedef struct V4L2Buffer { - struct v4l2_buffer buf; - struct v4l2_plane planes[VIDEO_MAX_PLANES]; - -- int flags; - enum V4L2Buffer_status status; - - } V4L2Buffer; -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index c11b5e6863..53b522d43e 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -527,6 +527,22 @@ get_qbuf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf, const int timeout - } - } - -+// Clear out flags and timestamps that should should be set by the user -+// Returns the passed avbuf -+static V4L2Buffer * -+clean_v4l2_buffer(V4L2Buffer * const avbuf) -+{ -+ struct v4l2_buffer *const buf = &avbuf->buf; -+ -+ buf->flags = 0; -+ buf->field = V4L2_FIELD_ANY; -+ buf->timestamp = (struct timeval){0}; -+ buf->timecode = (struct v4l2_timecode){0}; -+ buf->sequence = 0; -+ -+ return avbuf; -+} -+ - static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) - { - int i; -@@ -542,7 +558,7 @@ static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) - for (i = 0; i < ctx->num_buffers; i++) { - V4L2Buffer * const avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; - if (avbuf->status == V4L2BUF_AVAILABLE) -- return avbuf; -+ return clean_v4l2_buffer(avbuf); - } - - return NULL; - -From 5dc38f5d088beea4da57e82969643cc831c40cf0 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 22 Mar 2022 11:44:30 +0000 -Subject: [PATCH 042/151] v4l2m2m: Rework decode to wait for missing buffer, - add dynamic pending - -Previously receive_frame exited with EAGAIN if no capture buffer -availble in the Q. Now it waits in the hope that another thread will -post one. - -The prefer dQ logic is now dynamic to help with cases where PTS/DTS -lies. If it looks like we are never getting a frame then the -threshold is increased. It then slowly decays over time to cope with -false alarms. ---- - libavcodec/v4l2_buffers.c | 6 +++-- - libavcodec/v4l2_context.c | 7 +++-- - libavcodec/v4l2_context.h | 3 +++ - libavcodec/v4l2_m2m.h | 2 ++ - libavcodec/v4l2_m2m_dec.c | 57 +++++++++++++++++++++++++++++++++++++-- - 5 files changed, 69 insertions(+), 6 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 62d1c26053..8c4f18dbed 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -947,12 +947,14 @@ int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf) - return AVERROR(err); - } - -+ // Lock not wanted - if called from buffer free then lock already obtained - qc = atomic_fetch_add(&avbuf->context->q_count, 1) + 1; -+ avbuf->status = V4L2BUF_IN_DRIVER; -+ pthread_cond_broadcast(&avbuf->context->cond); -+ - av_log(logger(avbuf), AV_LOG_DEBUG, "--- %s VIDIOC_QBUF: index %d, ts=%ld.%06ld count=%d\n", - avbuf->context->name, avbuf->buf.index, - avbuf->buf.timestamp.tv_sec, avbuf->buf.timestamp.tv_usec, qc); - -- avbuf->status = V4L2BUF_IN_DRIVER; -- - return 0; - } -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 53b522d43e..7ddb759810 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -300,6 +300,7 @@ static int v4l2_stop_encode(V4L2Context *ctx) - // Returns: - // 0 Success - // AVERROR(EPIPE) Nothing more to read -+// AVERROR(ENOSPC) No buffers in Q to put result in - // * AVERROR(..) - - static int -@@ -457,7 +458,7 @@ get_qbuf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf, const int timeout - (pfd.events == poll_cap && atomic_load(&m->capture.q_count) == 0) || - (pfd.events == (poll_cap | poll_out) && atomic_load(&m->capture.q_count) == 0 && atomic_load(&m->output.q_count) == 0)) { - av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s empty\n", ctx->name); -- return AVERROR(EAGAIN); -+ return AVERROR(ENOSPC); - } - - // Timeout kludged s.t. "forever" eventually gives up & produces logging -@@ -864,7 +865,7 @@ int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt) - int rv; - - if ((rv = get_qbuf(ctx, &avbuf, -1)) != 0) -- return rv; -+ return rv == AVERROR(ENOSPC) ? AVERROR(EAGAIN) : rv; // Caller not currently expecting ENOSPC - - return ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf); - } -@@ -938,6 +939,7 @@ void ff_v4l2_context_release(V4L2Context* ctx) - av_buffer_unref(&ctx->frames_ref); - - ff_mutex_destroy(&ctx->lock); -+ pthread_cond_destroy(&ctx->cond); - } - - -@@ -1013,6 +1015,7 @@ int ff_v4l2_context_init(V4L2Context* ctx) - } - - ff_mutex_init(&ctx->lock, NULL); -+ pthread_cond_init(&ctx->cond, NULL); - atomic_init(&ctx->q_count, 0); - - if (s->output_drm) { -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index 565858a1ed..0efff58f18 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -116,6 +116,7 @@ typedef struct V4L2Context { - struct ff_weak_link_master *wl_master; - - AVMutex lock; -+ pthread_cond_t cond; - } V4L2Context; - - /** -@@ -182,6 +183,8 @@ int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt); - * @param[in] timeout The timeout for dequeue (-1 to block, 0 to return immediately, or milliseconds) - * - * @return 0 in case of success, AVERROR(EAGAIN) if no buffer was ready, another negative error in case of error. -+ * AVERROR(ENOSPC) if no buffer availible to put -+ * the frame in - */ - int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* f, int timeout); - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index f1923bb26d..9a20447030 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -105,6 +105,8 @@ typedef struct V4L2m2mContext { - - /* Frame tracking */ - xlat_track_t xlat; -+ int pending_hw; -+ int pending_n; - - pts_stats_t pts_stat; - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index e2b10f5e3a..2e30449dfc 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -251,7 +251,8 @@ xlat_pts_out(AVCodecContext *const avctx, - - frame->best_effort_timestamp = pts_stats_guess(ps); - frame->pkt_dts = frame->pts; // We can't emulate what s/w does in a useful manner? -- av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 "\n", frame->pts, frame->best_effort_timestamp, frame->pkt_dts); -+ av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 ", track=%"PRId64", n=%d\n", -+ frame->pts, frame->best_effort_timestamp, frame->pkt_dts, t->track_pts, n); - return 0; - } - -@@ -422,6 +423,36 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - return ret; - } - -+static int qbuf_wait(AVCodecContext * const avctx, V4L2Context * const ctx) -+{ -+ int rv = 0; -+ -+ ff_mutex_lock(&ctx->lock); -+ -+ while (atomic_load(&ctx->q_count) == 0 && ctx->streamon) { -+ if (pthread_cond_wait(&ctx->cond, &ctx->lock) != 0) { -+ rv = AVERROR(errno); -+ av_log(avctx, AV_LOG_ERROR, "Cond wait failure: %s\n", av_err2str(rv)); -+ break; -+ } -+ } -+ -+ ff_mutex_unlock(&ctx->lock); -+ return rv; -+} -+ -+// Number of frames over what xlat_pending returns that we keep *16 -+// This is a min value - if it appears to be too small the threshold should -+// adjust dynamically. -+#define PENDING_HW_MIN (3 * 16) -+// Offset to use when setting dynamically -+// Set to %16 == 15 to avoid the threshold changing immediately as we relax -+#define PENDING_HW_OFFSET (PENDING_HW_MIN - 1) -+// Number of consecutive times we've failed to get a frame when we prefer it -+// before we increase the prefer threshold (5ms * N = max expected decode -+// time) -+#define PENDING_N_THRESHOLD 6 -+ - static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - { - V4L2m2mContext *const s = ((V4L2m2mPriv*)avctx->priv_data)->context; -@@ -431,7 +462,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - - do { - const int pending = xlat_pending(&s->xlat); -- const int prefer_dq = (pending > 5); -+ const int prefer_dq = (pending > s->pending_hw / 16); - - // Enqueue another pkt for decode if - // (a) We don't have a lot of stuff in the buffer already OR -@@ -465,6 +496,27 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - // there is room in the input Q and timeout == -1 - dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, t); - -+ // Failure due to no buffer in Q? -+ if (dst_rv == AVERROR(ENOSPC)) { -+ // Wait & retry -+ if ((dst_rv = qbuf_wait(avctx, &s->capture)) == 0) { -+ dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, t); -+ } -+ } -+ -+ // Adjust dynamic pending threshold -+ if (dst_rv == 0) { -+ if (--s->pending_hw < PENDING_HW_MIN) -+ s->pending_hw = PENDING_HW_MIN; -+ s->pending_n = 0; -+ } -+ else if (dst_rv == AVERROR(EAGAIN)) { -+ if (prefer_dq && ++s->pending_n > PENDING_N_THRESHOLD) { -+ s->pending_hw = pending * 16 + PENDING_HW_OFFSET; -+ s->pending_n = 0; -+ } -+ } -+ - if (dst_rv == AVERROR(EAGAIN) && src_rv == NQ_DRAINING) { - av_log(avctx, AV_LOG_WARNING, "Timeout in drain - assume EOF"); - dst_rv = AVERROR_EOF; -@@ -613,6 +665,7 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - - xlat_init(&s->xlat); - pts_stats_init(&s->pts_stat, avctx, "decoder"); -+ s->pending_hw = PENDING_HW_MIN; - - capture = &s->capture; - output = &s->output; - -From 33765b769b4301e03f31b65e225fcdb0eff4c0e4 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 25 Mar 2022 15:37:58 +0000 -Subject: [PATCH 043/151] v4l2_m2m2_dec: Avoid loop if unable to resize buffers - -If source change signals a buffer size that cannot be honored give up -rather than looping indefinitely. This happens on Pi if (say) a -2560x1440 h264 stream is presented to the decode. ---- - libavcodec/v4l2_context.c | 13 +++++++++++-- - 1 file changed, 11 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 7ddb759810..007a58c8f1 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -205,8 +205,9 @@ static int do_source_change(V4L2m2mContext * const s) - - s->capture.sample_aspect_ratio = v4l2_get_sar(&s->capture); - -- av_log(avctx, AV_LOG_DEBUG, "Source change: SAR: %d/%d, crop %dx%d @ %d,%d, reinit=%d\n", -+ av_log(avctx, AV_LOG_DEBUG, "Source change: SAR: %d/%d, wxh %dx%d crop %dx%d @ %d,%d, reinit=%d\n", - s->capture.sample_aspect_ratio.num, s->capture.sample_aspect_ratio.den, -+ s->capture.width, s->capture.height, - s->capture.selection.width, s->capture.selection.height, - s->capture.selection.left, s->capture.selection.top, reinit); - -@@ -224,9 +225,17 @@ static int do_source_change(V4L2m2mContext * const s) - return AVERROR(EINVAL); - } - -+ if (s->capture.width > ff_v4l2_get_format_width(&s->capture.format) || -+ s->capture.height > ff_v4l2_get_format_height(&s->capture.format)) { -+ av_log(avctx, AV_LOG_ERROR, "Format post reinit too small: wanted %dx%d > got %dx%d\n", -+ s->capture.width, s->capture.height, -+ ff_v4l2_get_format_width(&s->capture.format), ff_v4l2_get_format_height(&s->capture.format)); -+ return AVERROR(EINVAL); -+ } -+ - // Update pixel format - should only actually do something on initial change - s->capture.av_pix_fmt = -- ff_v4l2_format_v4l2_to_avfmt(ff_v4l2_get_format_pixelformat(&s->capture.format), AV_CODEC_ID_RAWVIDEO); -+ ff_v4l2_format_v4l2_to_avfmt(ff_v4l2_get_format_pixelformat(&s->capture.format), AV_CODEC_ID_RAWVIDEO); - if (s->output_drm) { - avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; - avctx->sw_pix_fmt = s->capture.av_pix_fmt; - -From bb7ad2392ce83149a1ba40ecacb36e051b6bf785 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 25 Mar 2022 18:14:40 +0000 -Subject: [PATCH 044/151] v4l2dec: Improve size/format validation on init - ---- - libavcodec/v4l2_m2m_dec.c | 84 ++++++++++++++++++++++++++++++++-- - libavcodec/v4l2_request_hevc.c | 11 +++++ - 2 files changed, 92 insertions(+), 3 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 2e30449dfc..8dcadf461b 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -592,6 +592,76 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - } - #endif - -+static int -+check_size(AVCodecContext * const avctx, V4L2m2mContext * const s) -+{ -+ unsigned int i; -+ const uint32_t fcc = ff_v4l2_get_format_pixelformat(&s->capture.format); -+ const uint32_t w = avctx->coded_width; -+ const uint32_t h = avctx->coded_height; -+ -+ if (w == 0 || h == 0 || fcc == 0) { -+ av_log(avctx, AV_LOG_TRACE, "%s: Size %dx%d or fcc %s empty\n", __func__, w, h, av_fourcc2str(fcc)); -+ return 0; -+ } -+ -+ for (i = 0;; ++i) { -+ struct v4l2_frmsizeenum fs = { -+ .index = i, -+ .pixel_format = fcc, -+ }; -+ -+ while (ioctl(s->fd, VIDIOC_ENUM_FRAMESIZES, &fs) != 0) { -+ const int err = AVERROR(errno); -+ if (err == AVERROR(EINTR)) -+ continue; -+ if (i == 0 && err == AVERROR(ENOTTY)) { -+ av_log(avctx, AV_LOG_DEBUG, "Framesize enum not supported\n"); -+ return 0; -+ } -+ if (err != AVERROR(EINVAL)) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to enum framesizes: %s", av_err2str(err)); -+ return err; -+ } -+ av_log(avctx, AV_LOG_WARNING, "Failed to find Size=%dx%d, fmt=%s in frame size enums\n", -+ w, h, av_fourcc2str(fcc)); -+ return err; -+ } -+ -+ switch (fs.type) { -+ case V4L2_FRMSIZE_TYPE_DISCRETE: -+ av_log(avctx, AV_LOG_TRACE, "%s[%d]: Discrete: %dx%d\n", __func__, i, -+ fs.discrete.width,fs.discrete.height); -+ if (w == fs.discrete.width && h == fs.discrete.height) -+ return 0; -+ break; -+ case V4L2_FRMSIZE_TYPE_STEPWISE: -+ av_log(avctx, AV_LOG_TRACE, "%s[%d]: Stepwise: Min: %dx%d Max: %dx%d, Step: %dx%d\n", __func__, i, -+ fs.stepwise.min_width, fs.stepwise.min_height, -+ fs.stepwise.max_width, fs.stepwise.max_height, -+ fs.stepwise.step_width,fs.stepwise.step_height); -+ if (w >= fs.stepwise.min_width && w <= fs.stepwise.max_width && -+ h >= fs.stepwise.min_height && h <= fs.stepwise.max_height && -+ (w - fs.stepwise.min_width) % fs.stepwise.step_width == 0 && -+ (h - fs.stepwise.min_height) % fs.stepwise.step_height == 0) -+ return 0; -+ break; -+ case V4L2_FRMSIZE_TYPE_CONTINUOUS: -+ av_log(avctx, AV_LOG_TRACE, "%s[%d]: Continuous: Min: %dx%d Max: %dx%d, Step: %dx%d\n", __func__, i, -+ fs.stepwise.min_width, fs.stepwise.min_height, -+ fs.stepwise.max_width, fs.stepwise.max_height, -+ fs.stepwise.step_width,fs.stepwise.step_height); -+ if (w >= fs.stepwise.min_width && w <= fs.stepwise.max_width && -+ h >= fs.stepwise.min_height && h <= fs.stepwise.max_height) -+ return 0; -+ break; -+ default: -+ av_log(avctx, AV_LOG_ERROR, "Unexpected framesize enum: %d", fs.type); -+ return AVERROR(EINVAL); -+ } -+ } -+} -+ - static int - get_quirks(AVCodecContext * const avctx, V4L2m2mContext * const s) - { -@@ -698,8 +768,10 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - - avctx->sw_pix_fmt = avctx->pix_fmt; - gf_pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts); -- av_log(avctx, AV_LOG_DEBUG, "avctx requested=%d (%s); get_format requested=%d (%s)\n", -- avctx->pix_fmt, av_get_pix_fmt_name(avctx->pix_fmt), gf_pix_fmt, av_get_pix_fmt_name(gf_pix_fmt)); -+ av_log(avctx, AV_LOG_DEBUG, "avctx requested=%d (%s) %dx%d; get_format requested=%d (%s)\n", -+ avctx->pix_fmt, av_get_pix_fmt_name(avctx->pix_fmt), -+ avctx->coded_width, avctx->coded_height, -+ gf_pix_fmt, av_get_pix_fmt_name(gf_pix_fmt)); - - if (gf_pix_fmt == AV_PIX_FMT_DRM_PRIME || avctx->pix_fmt == AV_PIX_FMT_DRM_PRIME) { - avctx->pix_fmt = AV_PIX_FMT_DRM_PRIME; -@@ -730,7 +802,13 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - if ((ret = v4l2_prepare_decoder(s)) < 0) - return ret; - -- return get_quirks(avctx, s); -+ if ((ret = get_quirks(avctx, s)) != 0) -+ return ret; -+ -+ if ((ret = check_size(avctx, s)) != 0) -+ return ret; -+ -+ return 0; - } - - static av_cold int v4l2_decode_close(AVCodecContext *avctx) -diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index b0a5930844..76ab0916cd 100644 ---- a/libavcodec/v4l2_request_hevc.c -+++ b/libavcodec/v4l2_request_hevc.c -@@ -147,6 +147,17 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - - av_log(avctx, AV_LOG_DEBUG, "<<< %s\n", __func__); - -+ // Give up immediately if this is something that we have no code to deal with -+ if (h->ps.sps->chroma_format_idc != 1) { -+ av_log(avctx, AV_LOG_WARNING, "chroma_format_idc(%d) != 1: Not implemented\n", h->ps.sps->chroma_format_idc); -+ return AVERROR_PATCHWELCOME; -+ } -+ if (!(h->ps.sps->bit_depth == 10 || h->ps.sps->bit_depth == 8) || -+ h->ps.sps->bit_depth != h->ps.sps->bit_depth_chroma) { -+ av_log(avctx, AV_LOG_WARNING, "Bit depth Y:%d C:%d: Not implemented\n", h->ps.sps->bit_depth, h->ps.sps->bit_depth_chroma); -+ return AVERROR_PATCHWELCOME; -+ } -+ - if ((ret = devscan_build(avctx, &ctx->devscan)) != 0) { - av_log(avctx, AV_LOG_WARNING, "Failed to find any V4L2 devices\n"); - return (AVERROR(-ret)); - -From 4646b558c0e45f506578a5a452820f55983abc82 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 13 Apr 2022 16:05:56 +0000 -Subject: [PATCH 045/151] v4l2 stateless hevc: Add another API variation for - linux 5.18 - -This is probably going to be a short lived variation and may end up -being reverted if no release using it ever ends up in the wild. ---- - libavcodec/Makefile | 2 +- - libavcodec/hevc-ctrls-v3.h | 255 +++++++++++++++++++++++++++++++++ - libavcodec/v4l2_req_hevc_v3.c | 3 + - libavcodec/v4l2_req_hevc_vx.c | 17 +++ - libavcodec/v4l2_req_media.c | 15 +- - libavcodec/v4l2_req_media.h | 3 + - libavcodec/v4l2_request_hevc.c | 6 +- - libavcodec/v4l2_request_hevc.h | 1 + - 8 files changed, 295 insertions(+), 7 deletions(-) - create mode 100644 libavcodec/hevc-ctrls-v3.h - create mode 100644 libavcodec/v4l2_req_hevc_v3.c - -diff --git a/libavcodec/Makefile b/libavcodec/Makefile -index e1aa0ba014..2b3c16185d 100644 ---- a/libavcodec/Makefile -+++ b/libavcodec/Makefile -@@ -1000,7 +1000,7 @@ OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o - OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o - OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o - OBJS-$(CONFIG_HEVC_V4L2REQUEST_HWACCEL) += v4l2_request_hevc.o v4l2_req_decode_q.o\ -- v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o -+ v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o v4l2_req_hevc_v3.o - OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o - OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o - OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o -diff --git a/libavcodec/hevc-ctrls-v3.h b/libavcodec/hevc-ctrls-v3.h -new file mode 100644 -index 0000000000..4e35bd583d ---- /dev/null -+++ b/libavcodec/hevc-ctrls-v3.h -@@ -0,0 +1,255 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * These are the HEVC state controls for use with stateless HEVC -+ * codec drivers. -+ * -+ * It turns out that these structs are not stable yet and will undergo -+ * more changes. So keep them private until they are stable and ready to -+ * become part of the official public API. -+ */ -+ -+#ifndef _HEVC_CTRLS_H_ -+#define _HEVC_CTRLS_H_ -+ -+#include -+ -+/* The pixel format isn't stable at the moment and will likely be renamed. */ -+#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ -+ -+#define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_CODEC_BASE + 1008) -+#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_CODEC_BASE + 1009) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_BASE + 1010) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_CODEC_BASE + 1011) -+#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS (V4L2_CID_CODEC_BASE + 1012) -+#define V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (V4L2_CID_CODEC_BASE + 1015) -+#define V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (V4L2_CID_CODEC_BASE + 1016) -+ -+/* enum v4l2_ctrl_type type values */ -+#define V4L2_CTRL_TYPE_HEVC_SPS 0x0120 -+#define V4L2_CTRL_TYPE_HEVC_PPS 0x0121 -+#define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122 -+#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0123 -+#define V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS 0x0124 -+ -+enum v4l2_mpeg_video_hevc_decode_mode { -+ V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED, -+ V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED, -+}; -+ -+enum v4l2_mpeg_video_hevc_start_code { -+ V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE, -+ V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B, -+}; -+ -+#define V4L2_HEVC_SLICE_TYPE_B 0 -+#define V4L2_HEVC_SLICE_TYPE_P 1 -+#define V4L2_HEVC_SLICE_TYPE_I 2 -+ -+#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) -+#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) -+#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) -+#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) -+#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) -+#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) -+#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) -+#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) -+#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) -+ -+/* The controls are not stable at the moment and will likely be reworked. */ -+struct v4l2_ctrl_hevc_sps { -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */ -+ __u16 pic_width_in_luma_samples; -+ __u16 pic_height_in_luma_samples; -+ __u8 bit_depth_luma_minus8; -+ __u8 bit_depth_chroma_minus8; -+ __u8 log2_max_pic_order_cnt_lsb_minus4; -+ __u8 sps_max_dec_pic_buffering_minus1; -+ __u8 sps_max_num_reorder_pics; -+ __u8 sps_max_latency_increase_plus1; -+ __u8 log2_min_luma_coding_block_size_minus3; -+ __u8 log2_diff_max_min_luma_coding_block_size; -+ __u8 log2_min_luma_transform_block_size_minus2; -+ __u8 log2_diff_max_min_luma_transform_block_size; -+ __u8 max_transform_hierarchy_depth_inter; -+ __u8 max_transform_hierarchy_depth_intra; -+ __u8 pcm_sample_bit_depth_luma_minus1; -+ __u8 pcm_sample_bit_depth_chroma_minus1; -+ __u8 log2_min_pcm_luma_coding_block_size_minus3; -+ __u8 log2_diff_max_min_pcm_luma_coding_block_size; -+ __u8 num_short_term_ref_pic_sets; -+ __u8 num_long_term_ref_pics_sps; -+ __u8 chroma_format_idc; -+ __u8 sps_max_sub_layers_minus1; -+ -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED (1ULL << 0) -+#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) -+#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) -+#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) -+#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) -+#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) -+#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) -+#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) -+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) -+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) -+#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) -+#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) -+#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) -+#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) -+#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) -+#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) -+#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) -+#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) -+#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) -+#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT (1ULL << 19) -+#define V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING (1ULL << 20) -+ -+struct v4l2_ctrl_hevc_pps { -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture parameter set */ -+ __u8 num_extra_slice_header_bits; -+ __u8 num_ref_idx_l0_default_active_minus1; -+ __u8 num_ref_idx_l1_default_active_minus1; -+ __s8 init_qp_minus26; -+ __u8 diff_cu_qp_delta_depth; -+ __s8 pps_cb_qp_offset; -+ __s8 pps_cr_qp_offset; -+ __u8 num_tile_columns_minus1; -+ __u8 num_tile_rows_minus1; -+ __u8 column_width_minus1[20]; -+ __u8 row_height_minus1[22]; -+ __s8 pps_beta_offset_div2; -+ __s8 pps_tc_offset_div2; -+ __u8 log2_parallel_merge_level_minus2; -+ -+ __u8 padding[4]; -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE 0x01 -+ -+#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 -+ -+struct v4l2_hevc_dpb_entry { -+ __u64 timestamp; -+ __u8 flags; -+ __u8 field_pic; -+ __u16 pic_order_cnt[2]; -+ __u8 padding[2]; -+}; -+ -+struct v4l2_hevc_pred_weight_table { -+ __s8 delta_luma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 luma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 delta_chroma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ __s8 chroma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ -+ __s8 delta_luma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 luma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 delta_chroma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ __s8 chroma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ -+ __u8 padding[6]; -+ -+ __u8 luma_log2_weight_denom; -+ __s8 delta_chroma_log2_weight_denom; -+}; -+ -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) -+#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; -+ __u32 data_bit_offset; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u32 slice_segment_addr; -+ __u32 num_entry_point_offsets; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ -+ __u8 nal_unit_type; -+ __u8 nuh_temporal_id_plus1; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u8 slice_type; -+ __u8 colour_plane_id; -+ __u16 slice_pic_order_cnt; -+ __u8 num_ref_idx_l0_active_minus1; -+ __u8 num_ref_idx_l1_active_minus1; -+ __u8 collocated_ref_idx; -+ __u8 five_minus_max_num_merge_cand; -+ __s8 slice_qp_delta; -+ __s8 slice_cb_qp_offset; -+ __s8 slice_cr_qp_offset; -+ __s8 slice_act_y_qp_offset; -+ __s8 slice_act_cb_qp_offset; -+ __s8 slice_act_cr_qp_offset; -+ __s8 slice_beta_offset_div2; -+ __s8 slice_tc_offset_div2; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ -+ __u8 pic_struct; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ -+ __u8 padding[5]; -+ -+ __u32 entry_point_offset_minus1[256]; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ -+ struct v4l2_hevc_pred_weight_table pred_weight_table; -+ -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC 0x1 -+#define V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC 0x2 -+#define V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR 0x4 -+ -+struct v4l2_ctrl_hevc_decode_params { -+ __s32 pic_order_cnt_val; -+ __u8 num_active_dpb_entries; -+ struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 num_poc_st_curr_before; -+ __u8 num_poc_st_curr_after; -+ __u8 num_poc_lt_curr; -+ __u8 poc_st_curr_before[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 poc_st_curr_after[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u64 flags; -+}; -+ -+struct v4l2_ctrl_hevc_scaling_matrix { -+ __u8 scaling_list_4x4[6][16]; -+ __u8 scaling_list_8x8[6][64]; -+ __u8 scaling_list_16x16[6][64]; -+ __u8 scaling_list_32x32[2][64]; -+ __u8 scaling_list_dc_coef_16x16[6]; -+ __u8 scaling_list_dc_coef_32x32[2]; -+}; -+ -+/* MPEG-class control IDs specific to the Hantro driver as defined by V4L2 */ -+#define V4L2_CID_CODEC_HANTRO_BASE (V4L2_CTRL_CLASS_CODEC | 0x1200) -+/* -+ * V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP - -+ * the number of data (in bits) to skip in the -+ * slice segment header. -+ * If non-IDR, the bits to be skipped go from syntax element "pic_output_flag" -+ * to before syntax element "slice_temporal_mvp_enabled_flag". -+ * If IDR, the skipped bits are just "pic_output_flag" -+ * (separate_colour_plane_flag is not supported). -+ */ -+#define V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP (V4L2_CID_CODEC_HANTRO_BASE + 0) -+ -+#endif -diff --git a/libavcodec/v4l2_req_hevc_v3.c b/libavcodec/v4l2_req_hevc_v3.c -new file mode 100644 -index 0000000000..dcc8d95632 ---- /dev/null -+++ b/libavcodec/v4l2_req_hevc_v3.c -@@ -0,0 +1,3 @@ -+#define HEVC_CTRLS_VERSION 3 -+#include "v4l2_req_hevc_vx.c" -+ -diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c -index 0ae03b10c4..611fa21cc3 100644 ---- a/libavcodec/v4l2_req_hevc_vx.c -+++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -16,6 +16,8 @@ - - #elif HEVC_CTRLS_VERSION == 2 - #include "hevc-ctrls-v2.h" -+#elif HEVC_CTRLS_VERSION == 3 -+#include "hevc-ctrls-v3.h" - #else - #error Unknown HEVC_CTRLS_VERSION - #endif -@@ -147,6 +149,7 @@ static void fill_pred_table(const HEVCContext *h, struct v4l2_hevc_pred_weight_t - } - } - -+#if HEVC_CTRLS_VERSION <= 2 - static int find_frame_rps_type(const HEVCContext *h, uint64_t timestamp) - { - const HEVCFrame *frame; -@@ -172,6 +175,7 @@ static int find_frame_rps_type(const HEVCContext *h, uint64_t timestamp) - - return 0; - } -+#endif - - static unsigned int - get_ref_pic_index(const HEVCContext *h, const HEVCFrame *frame, -@@ -247,7 +251,12 @@ fill_dpb_entries(const HEVCContext * const h, struct v4l2_hevc_dpb_entry * const - struct v4l2_hevc_dpb_entry * const entry = entries + n++; - - entry->timestamp = frame_capture_dpb(frame->frame); -+#if HEVC_CTRLS_VERSION <= 2 - entry->rps = find_frame_rps_type(h, entry->timestamp); -+#else -+ entry->flags = (frame->flags & HEVC_FRAME_FLAG_LONG_REF) == 0 ? 0 : -+ V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE; -+#endif - entry->field_pic = frame->frame->interlaced_frame; - - /* TODO: Interleaved: Get the POC for each field. */ -@@ -1011,6 +1020,14 @@ probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - }; - const unsigned int noof_ctrls = FF_ARRAY_ELEMS(qc); - -+#if HEVC_CTRLS_VERSION == 2 -+ if (mediabufs_ctl_driver_version(ctx->mbufs) >= MEDIABUFS_DRIVER_VERSION(5, 18, 0)) -+ return AVERROR(EINVAL); -+#elif HEVC_CTRLS_VERSION == 3 -+ if (mediabufs_ctl_driver_version(ctx->mbufs) < MEDIABUFS_DRIVER_VERSION(5, 18, 0)) -+ return AVERROR(EINVAL); -+#endif -+ - if (mediabufs_ctl_query_ext_ctrls(ctx->mbufs, qc, noof_ctrls)) { - av_log(avctx, AV_LOG_DEBUG, "Probed V%d control missing\n", HEVC_CTRLS_VERSION); - return AVERROR(EINVAL); -diff --git a/libavcodec/v4l2_req_media.c b/libavcodec/v4l2_req_media.c -index eb00ecb406..980b306b8a 100644 ---- a/libavcodec/v4l2_req_media.c -+++ b/libavcodec/v4l2_req_media.c -@@ -604,6 +604,7 @@ struct mediabufs_ctl { - - struct v4l2_format src_fmt; - struct v4l2_format dst_fmt; -+ struct v4l2_capability capability; - }; - - static int qe_v4l2_queue(struct qent_base *const be, -@@ -1498,20 +1499,24 @@ void mediabufs_ctl_unref(struct mediabufs_ctl **const pmbc) - mediabufs_ctl_delete(mbc); - } - -+unsigned int mediabufs_ctl_driver_version(struct mediabufs_ctl *const mbc) -+{ -+ return mbc->capability.version; -+} -+ - static int set_capabilities(struct mediabufs_ctl *const mbc) - { -- struct v4l2_capability capability = { 0 }; - uint32_t caps; - -- if (ioctl(mbc->vfd, VIDIOC_QUERYCAP, &capability)) { -+ if (ioctl(mbc->vfd, VIDIOC_QUERYCAP, &mbc->capability)) { - int err = errno; - request_err(mbc->dc, "Failed to get capabilities: %s\n", strerror(err)); - return -err; - } - -- caps = (capability.capabilities & V4L2_CAP_DEVICE_CAPS) != 0 ? -- capability.device_caps : -- capability.capabilities; -+ caps = (mbc->capability.capabilities & V4L2_CAP_DEVICE_CAPS) != 0 ? -+ mbc->capability.device_caps : -+ mbc->capability.capabilities; - - if ((caps & V4L2_CAP_VIDEO_M2M_MPLANE) != 0) { - mbc->src_fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; -diff --git a/libavcodec/v4l2_req_media.h b/libavcodec/v4l2_req_media.h -index 2f826cfb14..0307a831de 100644 ---- a/libavcodec/v4l2_req_media.h -+++ b/libavcodec/v4l2_req_media.h -@@ -142,6 +142,9 @@ MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const rw, - struct dmabufs_ctl * const dbsc, - unsigned int n); - -+#define MEDIABUFS_DRIVER_VERSION(a, b, c) (((a) << 16) | ((b) << 8) | (c)) -+unsigned int mediabufs_ctl_driver_version(struct mediabufs_ctl *const mbc); -+ - struct mediabufs_ctl * mediabufs_ctl_new(void * const dc, - const char *vpath, struct pollqueue *const pq); - void mediabufs_ctl_unref(struct mediabufs_ctl **const pmbc); -diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index 76ab0916cd..20e4e0ab15 100644 ---- a/libavcodec/v4l2_request_hevc.c -+++ b/libavcodec/v4l2_request_hevc.c -@@ -210,7 +210,11 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - goto fail4; - } - -- if (V2(ff_v4l2_req_hevc, 2).probe(avctx, ctx) == 0) { -+ if (V2(ff_v4l2_req_hevc, 3).probe(avctx, ctx) == 0) { -+ av_log(avctx, AV_LOG_DEBUG, "HEVC API version 3 probed successfully\n"); -+ ctx->fns = &V2(ff_v4l2_req_hevc, 3); -+ } -+ else if (V2(ff_v4l2_req_hevc, 2).probe(avctx, ctx) == 0) { - av_log(avctx, AV_LOG_DEBUG, "HEVC API version 2 probed successfully\n"); - ctx->fns = &V2(ff_v4l2_req_hevc, 2); - } -diff --git a/libavcodec/v4l2_request_hevc.h b/libavcodec/v4l2_request_hevc.h -index f14f594564..ed48d62e2d 100644 ---- a/libavcodec/v4l2_request_hevc.h -+++ b/libavcodec/v4l2_request_hevc.h -@@ -98,5 +98,6 @@ typedef struct v4l2_req_decode_fns { - - extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 1); - extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 2); -+extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 3); - - #endif - -From 92160173e701aa7e2f1011e63596e48d15e691a9 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 3 May 2022 12:44:42 +0000 -Subject: [PATCH 046/151] Remove V4l2 frame size check for meson-vdec - ---- - libavcodec/v4l2_m2m.h | 3 ++- - libavcodec/v4l2_m2m_dec.c | 10 +++++++--- - 2 files changed, 9 insertions(+), 4 deletions(-) - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 9a20447030..6bd5e8eda7 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -116,7 +116,8 @@ typedef struct V4L2m2mContext { - /* Ext data sent */ - int extdata_sent; - --#define FF_V4L2_QUIRK_REINIT_ALWAYS 1 -+#define FF_V4L2_QUIRK_REINIT_ALWAYS 1 -+#define FF_V4L2_QUIRK_ENUM_FRAMESIZES_BROKEN 2 - /* Quirks */ - unsigned int quirks; - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 8dcadf461b..888ba67fea 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -604,6 +604,10 @@ check_size(AVCodecContext * const avctx, V4L2m2mContext * const s) - av_log(avctx, AV_LOG_TRACE, "%s: Size %dx%d or fcc %s empty\n", __func__, w, h, av_fourcc2str(fcc)); - return 0; - } -+ if ((s->quirks & FF_V4L2_QUIRK_ENUM_FRAMESIZES_BROKEN) != 0) { -+ av_log(avctx, AV_LOG_TRACE, "%s: Skipped (quirk): Size %dx%d, fcc %s\n", __func__, w, h, av_fourcc2str(fcc)); -+ return 0; -+ } - - for (i = 0;; ++i) { - struct v4l2_frmsizeenum fs = { -@@ -623,8 +627,8 @@ check_size(AVCodecContext * const avctx, V4L2m2mContext * const s) - av_log(avctx, AV_LOG_ERROR, "Failed to enum framesizes: %s", av_err2str(err)); - return err; - } -- av_log(avctx, AV_LOG_WARNING, "Failed to find Size=%dx%d, fmt=%s in frame size enums\n", -- w, h, av_fourcc2str(fcc)); -+ av_log(avctx, AV_LOG_WARNING, "Failed to find Size=%dx%d, fmt=%s in %u frame size enums\n", -+ w, h, av_fourcc2str(fcc), i); - return err; - } - -@@ -684,7 +688,7 @@ get_quirks(AVCodecContext * const avctx, V4L2m2mContext * const s) - // capture to clear the event even if the capture buffers were the right - // size in the first place. - if (strcmp(cap.driver, "meson-vdec") == 0) -- s->quirks |= FF_V4L2_QUIRK_REINIT_ALWAYS; -+ s->quirks |= FF_V4L2_QUIRK_REINIT_ALWAYS | FF_V4L2_QUIRK_ENUM_FRAMESIZES_BROKEN; - - av_log(avctx, AV_LOG_DEBUG, "Driver '%s': Quirks=%#x\n", cap.driver, s->quirks); - return 0; - -From 8ba5576e7fcd24c2f450f0295cc3b6d8e82e8649 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 23 May 2022 18:05:20 +0100 -Subject: [PATCH 047/151] v4l2m2m_dec: Make some error rturns a bit more robust - ---- - libavcodec/v4l2_context.c | 5 ++--- - libavcodec/v4l2_m2m_dec.c | 23 ++++++++++++++--------- - 2 files changed, 16 insertions(+), 12 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 007a58c8f1..b3662aedaa 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -765,7 +765,7 @@ static int stuff_all_buffers(AVCodecContext * avctx, V4L2Context* ctx) - int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd) - { - int type = ctx->type; -- int ret; -+ int ret = 0; - AVCodecContext * const avctx = logger(ctx); - - // Avoid doing anything if there is nothing we can do -@@ -777,8 +777,7 @@ int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd) - if (cmd == VIDIOC_STREAMON && !V4L2_TYPE_IS_OUTPUT(ctx->type)) - stuff_all_buffers(avctx, ctx); - -- ret = ioctl(ctx_to_m2mctx(ctx)->fd, cmd, &type); -- if (ret < 0) { -+ if (ioctl(ctx_to_m2mctx(ctx)->fd, cmd, &type) < 0) { - const int err = errno; - av_log(avctx, AV_LOG_ERROR, "%s set status %d (%s) failed: err=%d\n", ctx->name, - cmd, (cmd == VIDIOC_STREAMON) ? "ON" : "OFF", err); -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 888ba67fea..88a341aae2 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -110,16 +110,21 @@ static int check_output_streamon(AVCodecContext *const avctx, V4L2m2mContext *co - return 0; - - ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMON); -- if (ret < 0) -- av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMON on output context\n"); -- -- ret = ioctl(s->fd, VIDIOC_DECODER_CMD, &cmd); -- if (ret < 0) -- av_log(avctx, AV_LOG_ERROR, "VIDIOC_DECODER_CMD start error: %d\n", errno); -- else -- av_log(avctx, AV_LOG_DEBUG, "VIDIOC_DECODER_CMD start OK\n"); -+ if (ret != 0) { -+ av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMON on output context: %s\n", av_err2str(ret)); -+ return ret; -+ } - -- return ret; -+ // STREAMON should do implicit START so this just for those that don't. -+ // It is optional so don't worry if it fails -+ if (ioctl(s->fd, VIDIOC_DECODER_CMD, &cmd) < 0) { -+ ret = AVERROR(errno); -+ av_log(avctx, AV_LOG_WARNING, "VIDIOC_DECODER_CMD start error: %s\n", av_err2str(ret)); -+ } -+ else { -+ av_log(avctx, AV_LOG_TRACE, "VIDIOC_DECODER_CMD start OK\n"); -+ } -+ return 0; - } - - static int v4l2_try_start(AVCodecContext *avctx) - -From aafa5968f8713319be35cf26069c98566d5bf59b Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 24 May 2022 17:02:58 +0000 -Subject: [PATCH 048/151] v4l2m2m_dec: Support in-pkt AV_PKT_DATA_NEW_EXTRADATA - -Support packet side-data containing AV_PKT_DATA_NEW_EXTRADATA. Should -also detect and complain about unexpected streams of empty packets. - -This functionality untested as I haven't yet found anything that creates -NEW_EXTRADATA side data. ---- - libavcodec/v4l2_m2m.c | 1 + - libavcodec/v4l2_m2m.h | 3 +++ - libavcodec/v4l2_m2m_dec.c | 49 ++++++++++++++++++++++++++++++++++++--- - 3 files changed, 50 insertions(+), 3 deletions(-) - -diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c -index e26bd74c3e..6dd01e2e00 100644 ---- a/libavcodec/v4l2_m2m.c -+++ b/libavcodec/v4l2_m2m.c -@@ -251,6 +251,7 @@ static void v4l2_m2m_destroy_context(void *opaque, uint8_t *context) - av_frame_unref(s->frame); - av_frame_free(&s->frame); - av_packet_unref(&s->buf_pkt); -+ av_freep(&s->extdata_data); - - av_log(s->avctx, AV_LOG_DEBUG, "V4L2 Context destroyed\n"); - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 6bd5e8eda7..19d618698d 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -115,6 +115,9 @@ typedef struct V4L2m2mContext { - - /* Ext data sent */ - int extdata_sent; -+ /* Ext data sent in packet - overrides ctx */ -+ uint8_t * extdata_data; -+ size_t extdata_size; - - #define FF_V4L2_QUIRK_REINIT_ALWAYS 1 - #define FF_V4L2_QUIRK_ENUM_FRAMESIZES_BROKEN 2 -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 88a341aae2..392a68f0c7 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -343,7 +343,46 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - // We will already have a coded pkt if the output Q was full last time we - // tried to Q it - if (!s->buf_pkt.size && !do_not_get) { -- ret = ff_decode_get_packet(avctx, &s->buf_pkt); -+ unsigned int i; -+ -+ for (i = 0; i < 256; ++i) { -+ uint8_t * side_data; -+ size_t side_size; -+ -+ ret = ff_decode_get_packet(avctx, &s->buf_pkt); -+ if (ret != 0) -+ break; -+ -+ // New extradata is the only side-data we undertand -+ side_data = av_packet_get_side_data(&s->buf_pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); -+ if (side_data) { -+ av_log(avctx, AV_LOG_DEBUG, "New extradata\n"); -+ av_freep(&s->extdata_data); -+ if ((s->extdata_data = av_malloc(side_size ? side_size : 1)) == NULL) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to alloc %zd bytes of extra data\n", side_size); -+ return AVERROR(ENOMEM); -+ } -+ memcpy(s->extdata_data, side_data, side_size); -+ s->extdata_size = side_size; -+ s->extdata_sent = 0; -+ } -+ -+ if (s->buf_pkt.size != 0) -+ break; -+ -+ if (s->buf_pkt.side_data_elems == 0) { -+ av_log(avctx, AV_LOG_WARNING, "Empty pkt from ff_decode_get_packet - treating as EOF\n"); -+ ret = AVERROR_EOF; -+ break; -+ } -+ -+ // Retry a side-data only pkt -+ } -+ // If i >= 256 something has gone wrong -+ if (i >= 256) { -+ av_log(avctx, AV_LOG_ERROR, "Too many side-data only packets\n"); -+ return AVERROR(EIO); -+ } - - if (ret == AVERROR(EAGAIN)) { - if (!stream_started(s)) { -@@ -398,8 +437,12 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - if ((ret = check_output_streamon(avctx, s)) != 0) - return ret; - -- ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, -- avctx->extradata, s->extdata_sent ? 0 : avctx->extradata_size); -+ if (s->extdata_sent) -+ ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0); -+ else if (s->extdata_data) -+ ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, s->extdata_data, s->extdata_size); -+ else -+ ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, avctx->extradata, avctx->extradata_size); - - if (ret == AVERROR(EAGAIN)) { - // Out of input buffers - keep packet - -From e9bced67bdb40096d31067d41956276e9e1af11a Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 24 May 2022 20:02:48 +0000 -Subject: [PATCH 049/151] v4l2m2m_dec: Catch repeated Q fulls - ---- - libavcodec/v4l2_m2m_dec.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 392a68f0c7..7e17044706 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -504,13 +504,14 @@ static int qbuf_wait(AVCodecContext * const avctx, V4L2Context * const ctx) - static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - { - V4L2m2mContext *const s = ((V4L2m2mPriv*)avctx->priv_data)->context; -- int src_rv; -+ int src_rv = NQ_OK; - int dst_rv = 1; // Non-zero (done), non-negative (error) number - unsigned int i = 0; - - do { - const int pending = xlat_pending(&s->xlat); - const int prefer_dq = (pending > s->pending_hw / 16); -+ const int last_src_rv = src_rv; - - // Enqueue another pkt for decode if - // (a) We don't have a lot of stuff in the buffer already OR -@@ -526,6 +527,11 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - if ((i != 0 || s->req_pkt) && src_rv == NQ_SRC_EMPTY) - break; - -+ if (src_rv == NQ_Q_FULL && last_src_rv == NQ_Q_FULL) { -+ av_log(avctx, AV_LOG_WARNING, "Poll thinks src Q has space; none found\n"); -+ break; -+ } -+ - // Try to get a new frame if - // (a) we haven't already got one AND - // (b) enqueue returned a status indicating that decode should be attempted - -From 0c974e4da2c0311836145f2fd42081d40eb15998 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 25 May 2022 15:22:12 +0000 -Subject: [PATCH 050/151] Remove requirement for epoxy & libudev config options - ---- - configure | 26 +++++++++++++++++--------- - pi-util/conf_native.sh | 2 -- - 2 files changed, 17 insertions(+), 11 deletions(-) - -diff --git a/configure b/configure -index b41663c794..fdc95146bf 100755 ---- a/configure -+++ b/configure -@@ -205,6 +205,7 @@ External library support: - --disable-bzlib disable bzlib [autodetect] - --disable-coreimage disable Apple CoreImage framework [autodetect] - --enable-chromaprint enable audio fingerprinting with chromaprint [no] -+ --disable-epoxy disable epoxy [autodetect] - --enable-frei0r enable frei0r video filtering [no] - --enable-gcrypt enable gcrypt, needed for rtmp(t)e support - if openssl, librtmp or gmp is not used [no] -@@ -281,7 +282,7 @@ External library support: - if openssl, gnutls or mbedtls is not used [no] - --enable-libtwolame enable MP2 encoding via libtwolame [no] - --enable-libuavs3d enable AVS3 decoding via libuavs3d [no] -- --enable-libudev enable libudev [no] -+ --disable-libudev disable libudev [autodetect] - --enable-libv4l2 enable libv4l2/v4l-utils [no] - --enable-libvidstab enable video stabilization using vid.stab [no] - --enable-libvmaf enable vmaf filter via libvmaf [no] -@@ -1747,7 +1748,9 @@ EXTERNAL_AUTODETECT_LIBRARY_LIST=" - avfoundation - bzlib - coreimage -+ epoxy - iconv -+ libudev - libxcb - libxcb_shm - libxcb_shape -@@ -1819,7 +1822,6 @@ EXTERNAL_LIBRARY_LIST=" - libdav1d - libdc1394 - libdrm -- epoxy - libflite - libfontconfig - libfreetype -@@ -1863,7 +1865,6 @@ EXTERNAL_LIBRARY_LIST=" - libtheora - libtwolame - libuavs3d -- libudev - libv4l2 - libvmaf - libvorbis -@@ -3567,9 +3568,8 @@ v4l2_indev_suggest="libv4l2" - v4l2_outdev_deps="libdrm" - v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h" - v4l2_outdev_suggest="libv4l2" --vout_drm_outdev_deps="libdrm vout_drm" --vout_egl_outdev_deps="xlib" --vout_egl_outdev_select="epoxy" -+vout_drm_outdev_deps="libdrm" -+vout_egl_outdev_deps="xlib epoxy" - vfwcap_indev_deps="vfw32 vfwcap_defines" - xcbgrab_indev_deps="libxcb" - xcbgrab_indev_suggest="libxcb_shm libxcb_shape libxcb_xfixes" -@@ -6355,6 +6355,12 @@ if enabled xlib; then - disable xlib - fi - -+enabled libudev && -+ check_pkg_config libudev libudev libudev.h udev_new -+ -+enabled epoxy && -+ check_pkg_config epoxy epoxy epoxy/egl.h epoxy_egl_version -+ - check_headers direct.h - check_headers dirent.h - check_headers dxgidebug.h -@@ -6601,7 +6607,6 @@ enabled libdav1d && require_pkg_config libdav1d "dav1d >= 0.5.0" "dav1d - enabled libdavs2 && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2.h davs2_decoder_open - enabled libdc1394 && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new - enabled libdrm && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion --enabled epoxy && require_pkg_config epoxy epoxy epoxy/egl.h epoxy_egl_version - enabled libfdk_aac && { check_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen || - { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac && - warn "using libfdk without pkg-config"; } } -@@ -6713,7 +6718,6 @@ enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame - { check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame || - die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; } - enabled libuavs3d && require_pkg_config libuavs3d "uavs3d >= 1.1.41" uavs3d.h uavs3d_decode --enabled libudev && require_pkg_config libudev libudev libudev.h udev_new - enabled libv4l2 && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl - enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit - enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 2.0.0" libvmaf.h vmaf_init -@@ -6819,9 +6823,13 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r - enabled v4l2_request && { enabled libdrm || - die "ERROR: v4l2-request requires --enable-libdrm"; } && - { enabled libudev || -- die "ERROR: v4l2-request requires --enable-libudev"; } -+ die "ERROR: v4l2-request requires libudev"; } - enabled vapoursynth && require_pkg_config vapoursynth "vapoursynth-script >= 42" VSScript.h vsscript_init - -+enabled vout_drm && { enabled libdrm || die "ERROR: vout_drm requires --enable-libdrm"; } -+ -+enabled vout_egl && { enabled epoxy || die "ERROR: vout_egl requires epoxy"; } && -+ { enabled xlib || die "ERROR: vout_egl requires xlib"; } - - if enabled gcrypt; then - GCRYPT_CONFIG="${cross_prefix}libgcrypt-config" -diff --git a/pi-util/conf_native.sh b/pi-util/conf_native.sh -index 65576846e8..37cea71756 100755 ---- a/pi-util/conf_native.sh -+++ b/pi-util/conf_native.sh -@@ -91,8 +91,6 @@ $FFSRC/configure \ - --disable-thumb\ - --enable-v4l2-request\ - --enable-libdrm\ -- --enable-epoxy\ -- --enable-libudev\ - --enable-vout-egl\ - --enable-vout-drm\ - $SHARED_LIBS\ - -From 9f234d8cbde2829e6a70fd3cb6324998df8a31f3 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 27 May 2022 09:36:51 +0000 -Subject: [PATCH 051/151] hevc: If hwaccel avoid creation of s/w only vars - ---- - libavcodec/hevc_refs.c | 35 +++++++++++++++++++++-------------- - libavcodec/hevcdec.c | 42 +++++++++++++++++++++++++++++------------- - 2 files changed, 50 insertions(+), 27 deletions(-) - -diff --git a/libavcodec/hevc_refs.c b/libavcodec/hevc_refs.c -index 811e8feff8..f7cf14eabc 100644 ---- a/libavcodec/hevc_refs.c -+++ b/libavcodec/hevc_refs.c -@@ -98,18 +98,22 @@ static HEVCFrame *alloc_frame(HEVCContext *s) - if (!frame->rpl_buf) - goto fail; - -- frame->tab_mvf_buf = av_buffer_pool_get(s->tab_mvf_pool); -- if (!frame->tab_mvf_buf) -- goto fail; -- frame->tab_mvf = (MvField *)frame->tab_mvf_buf->data; -+ if (s->tab_mvf_pool) { -+ frame->tab_mvf_buf = av_buffer_pool_get(s->tab_mvf_pool); -+ if (!frame->tab_mvf_buf) -+ goto fail; -+ frame->tab_mvf = (MvField *)frame->tab_mvf_buf->data; -+ } - -- frame->rpl_tab_buf = av_buffer_pool_get(s->rpl_tab_pool); -- if (!frame->rpl_tab_buf) -- goto fail; -- frame->rpl_tab = (RefPicListTab **)frame->rpl_tab_buf->data; -- frame->ctb_count = s->ps.sps->ctb_width * s->ps.sps->ctb_height; -- for (j = 0; j < frame->ctb_count; j++) -- frame->rpl_tab[j] = (RefPicListTab *)frame->rpl_buf->data; -+ if (s->rpl_tab_pool) { -+ frame->rpl_tab_buf = av_buffer_pool_get(s->rpl_tab_pool); -+ if (!frame->rpl_tab_buf) -+ goto fail; -+ frame->rpl_tab = (RefPicListTab **)frame->rpl_tab_buf->data; -+ frame->ctb_count = s->ps.sps->ctb_width * s->ps.sps->ctb_height; -+ for (j = 0; j < frame->ctb_count; j++) -+ frame->rpl_tab[j] = (RefPicListTab *)frame->rpl_buf->data; -+ } - - frame->frame->top_field_first = s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD; - frame->frame->interlaced_frame = (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_TOP_FIELD) || (s->sei.picture_timing.picture_struct == AV_PICTURE_STRUCTURE_BOTTOM_FIELD); -@@ -297,14 +301,17 @@ static int init_slice_rpl(HEVCContext *s) - int ctb_count = frame->ctb_count; - int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_segment_addr]; - int i; -+ RefPicListTab * const tab = (RefPicListTab *)frame->rpl_buf->data + s->slice_idx; - - if (s->slice_idx >= frame->rpl_buf->size / sizeof(RefPicListTab)) - return AVERROR_INVALIDDATA; - -- for (i = ctb_addr_ts; i < ctb_count; i++) -- frame->rpl_tab[i] = (RefPicListTab *)frame->rpl_buf->data + s->slice_idx; -+ if (frame->rpl_tab) { -+ for (i = ctb_addr_ts; i < ctb_count; i++) -+ frame->rpl_tab[i] = tab; -+ } - -- frame->refPicList = (RefPicList *)frame->rpl_tab[ctb_addr_ts]; -+ frame->refPicList = tab->refPicList; - - return 0; - } -diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c -index 2867cb2e16..17f53322fb 100644 ---- a/libavcodec/hevcdec.c -+++ b/libavcodec/hevcdec.c -@@ -536,6 +536,16 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps, - if (!sps) - return 0; - -+ // If hwaccel then we don't need all the s/w decode helper arrays -+ if (s->avctx->hwaccel) { -+ export_stream_params(s, sps); -+ -+ s->avctx->pix_fmt = pix_fmt; -+ s->ps.sps = sps; -+ s->ps.vps = (HEVCVPS*) s->ps.vps_list[s->ps.sps->vps_id]->data; -+ return 0; -+ } -+ - ret = pic_arrays_init(s, sps); - if (ret < 0) - goto fail; -@@ -2890,11 +2900,13 @@ static int hevc_frame_start(HEVCContext *s) - ((s->ps.sps->height >> s->ps.sps->log2_min_cb_size) + 1); - int ret; - -- memset(s->horizontal_bs, 0, s->bs_width * s->bs_height); -- memset(s->vertical_bs, 0, s->bs_width * s->bs_height); -- memset(s->cbf_luma, 0, s->ps.sps->min_tb_width * s->ps.sps->min_tb_height); -- memset(s->is_pcm, 0, (s->ps.sps->min_pu_width + 1) * (s->ps.sps->min_pu_height + 1)); -- memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address)); -+ if (s->horizontal_bs) { -+ memset(s->horizontal_bs, 0, s->bs_width * s->bs_height); -+ memset(s->vertical_bs, 0, s->bs_width * s->bs_height); -+ memset(s->cbf_luma, 0, s->ps.sps->min_tb_width * s->ps.sps->min_tb_height); -+ memset(s->is_pcm, 0, (s->ps.sps->min_pu_width + 1) * (s->ps.sps->min_pu_height + 1)); -+ memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address)); -+ } - - s->is_decoded = 0; - s->first_nal_type = s->nal_unit_type; -@@ -3438,15 +3450,19 @@ static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src) - dst->needs_fg = 1; - } - -- dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf); -- if (!dst->tab_mvf_buf) -- goto fail; -- dst->tab_mvf = src->tab_mvf; -+ if (src->tab_mvf_buf) { -+ dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf); -+ if (!dst->tab_mvf_buf) -+ goto fail; -+ dst->tab_mvf = src->tab_mvf; -+ } - -- dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf); -- if (!dst->rpl_tab_buf) -- goto fail; -- dst->rpl_tab = src->rpl_tab; -+ if (src->rpl_tab_buf) { -+ dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf); -+ if (!dst->rpl_tab_buf) -+ goto fail; -+ dst->rpl_tab = src->rpl_tab; -+ } - - dst->rpl_buf = av_buffer_ref(src->rpl_buf); - if (!dst->rpl_buf) - -From bb2ddc480634141bed9afd3f66e7f63f5091bb2f Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 30 May 2022 17:51:44 +0100 -Subject: [PATCH 052/151] rpi_sand: Add SAND30->NV12 conversion - -C code only. Reworks the hwcontext_drm conversion to use the -rpi_sand_fns generic frame convert fn rather than calling the -individual conversion functions directly. This keeps all teh stride and -size logic in a single place. ---- - libavutil/hwcontext_drm.c | 46 ++++++++------------ - libavutil/rpi_sand_fns.c | 89 +++++++++++++++++++++++++++++++++++++++ - libavutil/rpi_sand_fns.h | 5 +++ - 3 files changed, 111 insertions(+), 29 deletions(-) - -diff --git a/libavutil/hwcontext_drm.c b/libavutil/hwcontext_drm.c -index baf18920fa..137a952d2c 100644 ---- a/libavutil/hwcontext_drm.c -+++ b/libavutil/hwcontext_drm.c -@@ -234,14 +234,14 @@ static int drm_transfer_get_formats(AVHWFramesContext *ctx, - enum AVHWFrameTransferDirection dir, - enum AVPixelFormat **formats) - { -- enum AVPixelFormat *pix_fmts; -+ enum AVPixelFormat *p; - -- pix_fmts = av_malloc_array(2, sizeof(*pix_fmts)); -- if (!pix_fmts) -+ p = *formats = av_malloc_array(3, sizeof(*p)); -+ if (!p) - return AVERROR(ENOMEM); - - // **** Offer native sand too ???? -- pix_fmts[0] = -+ *p++ = - #if CONFIG_SAND - ctx->sw_format == AV_PIX_FMT_RPI4_8 || ctx->sw_format == AV_PIX_FMT_SAND128 ? - AV_PIX_FMT_YUV420P : -@@ -249,9 +249,14 @@ static int drm_transfer_get_formats(AVHWFramesContext *ctx, - AV_PIX_FMT_YUV420P10LE : - #endif - ctx->sw_format; -- pix_fmts[1] = AV_PIX_FMT_NONE; - -- *formats = pix_fmts; -+#if CONFIG_SAND -+ if (ctx->sw_format == AV_PIX_FMT_RPI4_10 || -+ ctx->sw_format == AV_PIX_FMT_RPI4_8 || ctx->sw_format == AV_PIX_FMT_SAND128) -+ *p++ = AV_PIX_FMT_NV12; -+#endif -+ -+ *p = AV_PIX_FMT_NONE; - return 0; - } - -@@ -294,29 +299,12 @@ static int drm_transfer_data_from(AVHWFramesContext *hwfc, - const unsigned int w = FFMIN(dst->width, map->width); - const unsigned int h = FFMIN(dst->height, map->height); - -- if (map->format == AV_PIX_FMT_RPI4_8 && dst->format == AV_PIX_FMT_YUV420P) { -- av_rpi_sand_to_planar_y8(dst->data[0], dst->linesize[0], -- map->data[0], -- 128, stride2, -- 0, 0, w, h); -- av_rpi_sand_to_planar_c8(dst->data[1], dst->linesize[1], -- dst->data[2], dst->linesize[2], -- map->data[1], -- 128, stride2, -- 0, 0, w / 2, h / 2); -- } -- else if (map->format == AV_PIX_FMT_RPI4_10 && dst->format == AV_PIX_FMT_YUV420P10LE) { -- av_rpi_sand30_to_planar_y16(dst->data[0], dst->linesize[0], -- map->data[0], -- 128, stride2, -- 0, 0, w, h); -- av_rpi_sand30_to_planar_c16(dst->data[1], dst->linesize[1], -- dst->data[2], dst->linesize[2], -- map->data[1], -- 128, stride2, -- 0, 0, w / 2, h / 2); -- } -- else -+ map->crop_top = 0; -+ map->crop_bottom = 0; -+ map->crop_left = 0; -+ map->crop_right = 0; -+ -+ if (av_rpi_sand_to_planar_frame(dst, map) != 0) - { - av_log(hwfc, AV_LOG_ERROR, "%s: Incompatible output pixfmt for sand\n", __func__); - err = AVERROR(EINVAL); -diff --git a/libavutil/rpi_sand_fns.c b/libavutil/rpi_sand_fns.c -index 1f543e9357..256c3d532f 100644 ---- a/libavutil/rpi_sand_fns.c -+++ b/libavutil/rpi_sand_fns.c -@@ -229,6 +229,75 @@ void av_rpi_sand30_to_planar_c16(uint8_t * dst_u, const unsigned int dst_stride_ - } - } - -+// Fetches a single patch - offscreen fixup not done here -+// w <= stride1 -+// single lose bottom 2 bits truncation -+// _x & _w in pixels, strides in bytes -+void av_rpi_sand30_to_planar_y8(uint8_t * dst, const unsigned int dst_stride, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h) -+{ -+ const unsigned int x0 = (_x / 3) * 4; // Byte offset of the word -+ const unsigned int xskip0 = _x - (x0 >> 2) * 3; -+ const unsigned int x1 = ((_x + _w) / 3) * 4; -+ const unsigned int xrem1 = _x + _w - (x1 >> 2) * 3; -+ const unsigned int mask = stride1 - 1; -+ const uint8_t * p0 = src + (x0 & mask) + y * stride1 + (x0 & ~mask) * stride2; -+ const unsigned int slice_inc = ((stride2 - 1) * stride1) >> 2; // RHS of a stripe to LHS of next in words -+ -+#if HAVE_SAND_ASM && 0 -+ if (_x == 0) { -+ ff_rpi_sand30_lines_to_planar_y8(dst, dst_stride, src, stride1, stride2, _x, y, _w, h); -+ return; -+ } -+#endif -+ -+ if (x0 == x1) { -+ // ******************* -+ // Partial single word xfer -+ return; -+ } -+ -+ for (unsigned int i = 0; i != h; ++i, dst += dst_stride, p0 += stride1) -+ { -+ unsigned int x = x0; -+ const uint32_t * p = (const uint32_t *)p0; -+ uint8_t * d = dst; -+ -+ if (xskip0 != 0) { -+ const uint32_t p3 = *p++; -+ -+ if (xskip0 == 1) -+ *d++ = (p3 >> 12) & 0xff; -+ *d++ = (p3 >> 22) & 0xff; -+ -+ if (((x += 4) & mask) == 0) -+ p += slice_inc; -+ } -+ -+ while (x != x1) { -+ const uint32_t p3 = *p++; -+ *d++ = (p3 >> 2) & 0xff; -+ *d++ = (p3 >> 12) & 0xff; -+ *d++ = (p3 >> 22) & 0xff; -+ -+ if (((x += 4) & mask) == 0) -+ p += slice_inc; -+ } -+ -+ if (xrem1 != 0) { -+ const uint32_t p3 = *p; -+ -+ *d++ = (p3 >> 2) & 0xff; -+ if (xrem1 == 2) -+ *d++ = (p3 >> 12) & 0xff; -+ } -+ } -+} -+ -+ - - // w/h in pixels - void av_rpi_sand16_to_sand8(uint8_t * dst, const unsigned int dst_stride1, const unsigned int dst_stride2, -@@ -310,6 +379,16 @@ int av_rpi_sand_to_planar_frame(AVFrame * const dst, const AVFrame * const src) - av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), - x/2, y/2, w/2, h/2); - break; -+ case AV_PIX_FMT_NV12: -+ av_rpi_sand_to_planar_y8(dst->data[0], dst->linesize[0], -+ src->data[0], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x, y, w, h); -+ av_rpi_sand_to_planar_y8(dst->data[1], dst->linesize[1], -+ src->data[1], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x/2, y/2, w, h/2); -+ break; - default: - return -1; - } -@@ -344,6 +423,16 @@ int av_rpi_sand_to_planar_frame(AVFrame * const dst, const AVFrame * const src) - av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), - x/2, y/2, w/2, h/2); - break; -+ case AV_PIX_FMT_NV12: -+ av_rpi_sand30_to_planar_y8(dst->data[0], dst->linesize[0], -+ src->data[0], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x, y, w, h); -+ av_rpi_sand30_to_planar_y8(dst->data[1], dst->linesize[1], -+ src->data[1], -+ av_rpi_sand_frame_stride1(src), av_rpi_sand_frame_stride2(src), -+ x/2, y/2, w, h/2); -+ break; - default: - return -1; - } -diff --git a/libavutil/rpi_sand_fns.h b/libavutil/rpi_sand_fns.h -index 634b55e800..462ccb8abd 100644 ---- a/libavutil/rpi_sand_fns.h -+++ b/libavutil/rpi_sand_fns.h -@@ -85,6 +85,11 @@ void av_rpi_sand30_to_planar_c16(uint8_t * dst_u, const unsigned int dst_stride_ - unsigned int _x, unsigned int y, - unsigned int _w, unsigned int h); - -+void av_rpi_sand30_to_planar_y8(uint8_t * dst, const unsigned int dst_stride, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); - - // w/h in pixels - void av_rpi_sand16_to_sand8(uint8_t * dst, const unsigned int dst_stride1, const unsigned int dst_stride2, - -From b55c351e6954c800229d97dc6c982ca8f998c848 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 1 Jun 2022 17:49:26 +0000 -Subject: [PATCH 053/151] rpi_sand: Add SAND30->NV12 asm for Armv7 & Armv8 - -Also reworks the previous Armv8 SAND30->Y16 function in a slightly more -efficient way that makes it look more like the Armv7 version. ---- - libavutil/aarch64/rpi_sand_neon.S | 549 ++++++++++++++++++------------ - libavutil/aarch64/rpi_sand_neon.h | 4 + - libavutil/arm/rpi_sand_neon.S | 239 ++++++++++--- - libavutil/arm/rpi_sand_neon.h | 11 + - libavutil/rpi_sand_fns.c | 2 +- - 5 files changed, 541 insertions(+), 264 deletions(-) - -diff --git a/libavutil/aarch64/rpi_sand_neon.S b/libavutil/aarch64/rpi_sand_neon.S -index cdcf71ee67..2f07d9674c 100644 ---- a/libavutil/aarch64/rpi_sand_neon.S -+++ b/libavutil/aarch64/rpi_sand_neon.S -@@ -248,228 +248,6 @@ incomplete_block_loop_end_c8: - ret - endfunc - --//void ff_rpi_sand30_lines_to_planar_y16( --// uint8_t * dest, // [x0] --// unsigned int dst_stride, // [w1] -> assumed to be equal to _w --// const uint8_t * src, // [x2] --// unsigned int src_stride1, // [w3] -> 128 --// unsigned int src_stride2, // [w4] --// unsigned int _x, // [w5] --// unsigned int y, // [w6] --// unsigned int _w, // [w7] --// unsigned int h); // [sp, #0] -- --function ff_rpi_sand30_lines_to_planar_y16, export=1 -- stp x19, x20, [sp, #-48]! -- stp x21, x22, [sp, #16] -- stp x23, x24, [sp, #32] -- -- // w6 = argument h -- ldr w6, [sp, #48] -- -- // slice_inc = ((stride2 - 1) * stride1) -- mov w5, w4 -- sub w5, w5, #1 -- lsl w5, w5, #7 -- -- // total number of bytes per row = (width / 3) * 4 -- mov w8, w7 -- mov w9, #3 -- udiv w8, w8, w9 -- lsl w8, w8, #2 -- -- // number of full 128 byte blocks to be processed -- mov w9, #96 -- udiv w9, w7, w9 // = (width * 4) / (3*128) = width/96 -- -- // w10 = number of full integers to process (4 bytes) -- // w11 = remaning zero to two 10bit values still to copy over -- mov w12, #96 -- mul w12, w9, w12 -- sub w12, w7, w12 // width - blocks*96 = remaining points per row -- mov w11, #3 -- udiv w10, w12, w11 // full integers to process = w12 / 3 -- mul w11, w10, w11 // #integers *3 -- sub w11, w12, w11 // remaining 0-2 points = remaining points - integers*3 -- -- // increase w9 by one if w10+w11 is not zero, and decrease the row count by one -- // this is to efficiently copy incomplete blocks at the end of the rows -- // the last row is handled explicitly to avoid writing out of bounds -- add w22, w10, w11 -- cmp w22, #0 -- cset w22, ne // 1 iff w10+w11 not zero, 0 otherwise -- add w9, w9, w22 -- sub w6, w6, #1 -- -- // store the number of bytes in w20 which we copy too much for every row -- // when the width of the frame is not a multiple of 96 (128bytes storing 96 10bit values) -- mov w20, #96*2 -- mul w20, w20, w9 -- sub w20, w1, w20 -- -- mov w23, #0 // flag to check whether the last line had already been processed -- -- // bitmask to clear the uppper 6bits of the result values -- mov x19, #0x03ff03ff03ff03ff -- dup v22.2d, x19 -- -- // row counter = 0 -- eor w12, w12, w12 --row_loop_y16: -- cmp w12, w6 // jump to row_loop_y16_fin if we processed all rows -- bge row_loop_y16_fin -- -- mov x13, x2 // row src -- eor w14, w14, w14 // full block counter --block_loop_y16: -- cmp w14, w9 -- bge block_loop_y16_fin -- -- // load 64 bytes -- ld1 { v0.4s, v1.4s, v2.4s, v3.4s }, [x13], #64 -- -- // process v0 and v1 -- xtn v16.4h, v0.4s -- ushr v0.4s, v0.4s, #10 -- xtn v17.4h, v0.4s -- ushr v0.4s, v0.4s, #10 -- xtn v18.4h, v0.4s -- -- xtn2 v16.8h, v1.4s -- and v16.16b, v16.16b, v22.16b -- ushr v1.4s, v1.4s, #10 -- xtn2 v17.8h, v1.4s -- and v17.16b, v17.16b, v22.16b -- ushr v1.4s, v1.4s, #10 -- xtn2 v18.8h, v1.4s -- and v18.16b, v18.16b, v22.16b -- -- st3 { v16.8h, v17.8h, v18.8h }, [x0], #48 -- -- // process v2 and v3 -- xtn v23.4h, v2.4s -- ushr v2.4s, v2.4s, #10 -- xtn v24.4h, v2.4s -- ushr v2.4s, v2.4s, #10 -- xtn v25.4h, v2.4s -- -- xtn2 v23.8h, v3.4s -- and v23.16b, v23.16b, v22.16b -- ushr v3.4s, v3.4s, #10 -- xtn2 v24.8h, v3.4s -- and v24.16b, v24.16b, v22.16b -- ushr v3.4s, v3.4s, #10 -- xtn2 v25.8h, v3.4s -- and v25.16b, v25.16b, v22.16b -- -- st3 { v23.8h, v24.8h, v25.8h }, [x0], #48 -- -- // load the second half of the block -> 64 bytes into registers v4-v7 -- ld1 { v4.4s, v5.4s, v6.4s, v7.4s }, [x13], #64 -- -- // process v4 and v5 -- xtn v16.4h, v4.4s -- ushr v4.4s, v4.4s, #10 -- xtn v17.4h, v4.4s -- ushr v4.4s, v4.4s, #10 -- xtn v18.4h, v4.4s -- -- xtn2 v16.8h, v5.4s -- and v16.16b, v16.16b, v22.16b -- ushr v5.4s, v5.4s, #10 -- xtn2 v17.8h, v5.4s -- and v17.16b, v17.16b, v22.16b -- ushr v5.4s, v5.4s, #10 -- xtn2 v18.8h, v5.4s -- and v18.16b, v18.16b, v22.16b -- -- st3 { v16.8h, v17.8h, v18.8h }, [x0], #48 -- -- // v6 and v7 -- xtn v23.4h, v6.4s -- ushr v6.4s, v6.4s, #10 -- xtn v24.4h, v6.4s -- ushr v6.4s, v6.4s, #10 -- xtn v25.4h, v6.4s -- -- xtn2 v23.8h, v7.4s -- and v23.16b, v23.16b, v22.16b -- ushr v7.4s, v7.4s, #10 -- xtn2 v24.8h, v7.4s -- and v24.16b, v24.16b, v22.16b -- ushr v7.4s, v7.4s, #10 -- xtn2 v25.8h, v7.4s -- and v25.16b, v25.16b, v22.16b -- -- st3 { v23.8h, v24.8h, v25.8h }, [x0], #48 -- -- add x13, x13, x5 // row src += slice_inc -- add w14, w14, #1 -- b block_loop_y16 --block_loop_y16_fin: -- -- -- -- -- add x2, x2, #128 // src += stride1 (start of the next row) -- add x0, x0, w20, sxtw // subtract the bytes we copied too much from dst -- add w12, w12, #1 -- b row_loop_y16 --row_loop_y16_fin: -- -- // check whether we have incomplete blocks at the end of every row -- // in that case decrease row block count by one -- // change height back to it's original value (meaning increase it by 1) -- // and jump back to another iteration of row_loop_y16 -- -- cmp w23, #1 -- beq row_loop_y16_fin2 // don't continue here if we already processed the last row -- add w6, w6, #1 // increase height to the original value -- sub w9, w9, w22 // block count - 1 or 0, depending on the remaining bytes count -- mov w23, #1 -- b row_loop_y16 --row_loop_y16_fin2: -- -- sub x0, x0, w20, sxtw // with the last row we didn't actually move the dst ptr to far ahead, therefore readd the diference -- -- // now we've got to handle the last block in the last row -- eor w12, w12, w12 // w12 = 0 = counter --integer_loop_y16: -- cmp w12, w10 -- bge integer_loop_y16_fin -- ldr w14, [x13], #4 -- and w15, w14, #0x3ff -- strh w15, [x0], #2 -- lsr w14, w14, #10 -- and w15, w14, #0x3ff -- strh w15, [x0], #2 -- lsr w14, w14, #10 -- and w15, w14, #0x3ff -- strh w15, [x0], #2 -- add w12, w12, #1 -- b integer_loop_y16 --integer_loop_y16_fin: -- --final_values_y16: -- // remaining point count = w11 -- ldr w14, [x13], #4 -- cmp w11, #0 -- beq final_values_y16_fin -- and w15, w14, #0x3ff -- strh w15, [x0], #2 -- cmp w11, #1 -- beq final_values_y16_fin -- lsr w14, w14, #10 -- and w15, w14, #0x3ff -- strh w15, [x0], #2 --final_values_y16_fin: -- -- ldp x23, x24, [sp, #32] -- ldp x21, x22, [sp, #16] -- ldp x19, x20, [sp], #48 -- ret --endfunc -- - //void ff_rpi_sand30_lines_to_planar_c16( - // uint8_t * dst_u, // [x0] - // unsigned int dst_stride_u, // [w1] == _w*2 -@@ -674,3 +452,330 @@ endfunc - // unsigned int _w, - // unsigned int h); - -+// void ff_rpi_sand30_lines_to_planar_y8( -+// uint8_t * dest, : x0 -+// unsigned int dst_stride, : w1 -+// const uint8_t * src, : x2 -+// unsigned int src_stride1, : w3, always 128 -+// unsigned int src_stride2, : w4 -+// unsigned int _x, : w5 -+// unsigned int y, : w6 -+// unsigned int _w, : w7 -+// unsigned int h); : [sp, #0] -+// -+// Assumes that we are starting on a stripe boundary and that overreading -+// within the stripe is OK. However it does respect the dest size for wri -+ -+function ff_rpi_sand30_lines_to_planar_y16, export=1 -+ lsl w4, w4, #7 -+ sub w4, w4, #64 -+ sub w1, w1, w7, lsl #1 -+ uxtw x6, w6 -+ add x8, x2, x6, lsl #7 -+ ldr w6, [sp, #0] -+ -+10: -+ mov x2, x8 -+ mov w5, w7 -+1: -+ ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x2], #64 -+ ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x2], x4 -+ -+ subs w5, w5, #96 -+ -+ // v0, v1 -+ -+ shrn v18.4h, v0.4s, #14 -+ xtn v16.4h, v0.4s -+ shrn v17.4h, v0.4s, #10 -+ -+ shrn2 v18.8h, v1.4s, #14 -+ xtn2 v16.8h, v1.4s -+ shrn2 v17.8h, v1.4s, #10 -+ -+ ushr v18.8h, v18.8h, #6 -+ bic v16.8h, #0xfc, lsl #8 -+ bic v17.8h, #0xfc, lsl #8 -+ -+ // v2, v3 -+ -+ shrn v21.4h, v2.4s, #14 -+ xtn v19.4h, v2.4s -+ shrn v20.4h, v2.4s, #10 -+ -+ shrn2 v21.8h, v3.4s, #14 -+ xtn2 v19.8h, v3.4s -+ shrn2 v20.8h, v3.4s, #10 -+ -+ ushr v21.8h, v21.8h, #6 -+ bic v19.8h, #0xfc, lsl #8 -+ bic v20.8h, #0xfc, lsl #8 -+ -+ // v4, v5 -+ -+ shrn v24.4h, v4.4s, #14 -+ xtn v22.4h, v4.4s -+ shrn v23.4h, v4.4s, #10 -+ -+ shrn2 v24.8h, v5.4s, #14 -+ xtn2 v22.8h, v5.4s -+ shrn2 v23.8h, v5.4s, #10 -+ -+ ushr v24.8h, v24.8h, #6 -+ bic v22.8h, #0xfc, lsl #8 -+ bic v23.8h, #0xfc, lsl #8 -+ -+ // v6, v7 -+ -+ shrn v27.4h, v6.4s, #14 -+ xtn v25.4h, v6.4s -+ shrn v26.4h, v6.4s, #10 -+ -+ shrn2 v27.8h, v7.4s, #14 -+ xtn2 v25.8h, v7.4s -+ shrn2 v26.8h, v7.4s, #10 -+ -+ ushr v27.8h, v27.8h, #6 -+ bic v25.8h, #0xfc, lsl #8 -+ bic v26.8h, #0xfc, lsl #8 -+ -+ blt 2f -+ -+ st3 {v16.8h, v17.8h, v18.8h}, [x0], #48 -+ st3 {v19.8h, v20.8h, v21.8h}, [x0], #48 -+ st3 {v22.8h, v23.8h, v24.8h}, [x0], #48 -+ st3 {v25.8h, v26.8h, v27.8h}, [x0], #48 -+ -+ bne 1b -+ -+11: -+ subs w6, w6, #1 -+ add x0, x0, w1, uxtw -+ add x8, x8, #128 -+ bne 10b -+ -+ ret -+ -+// Partial final write -+2: -+ cmp w5, #48-96 -+ blt 1f -+ st3 {v16.8h, v17.8h, v18.8h}, [x0], #48 -+ st3 {v19.8h, v20.8h, v21.8h}, [x0], #48 -+ beq 11b -+ mov v16.16b, v22.16b -+ mov v17.16b, v23.16b -+ sub w5, w5, #48 -+ mov v18.16b, v24.16b -+ mov v19.16b, v25.16b -+ mov v20.16b, v26.16b -+ mov v21.16b, v27.16b -+1: -+ cmp w5, #24-96 -+ blt 1f -+ st3 {v16.8h, v17.8h, v18.8h}, [x0], #48 -+ beq 11b -+ mov v16.16b, v19.16b -+ mov v17.16b, v20.16b -+ sub w5, w5, #24 -+ mov v18.16b, v21.16b -+1: -+ cmp w5, #12-96 -+ blt 1f -+ st3 {v16.4h, v17.4h, v18.4h}, [x0], #24 -+ beq 11b -+ mov v16.2d[0], v16.2d[1] -+ sub w5, w5, #12 -+ mov v17.2d[0], v17.2d[1] -+ mov v18.2d[0], v18.2d[1] -+1: -+ cmp w5, #6-96 -+ blt 1f -+ st3 {v16.h, v17.h, v18.h}[0], [x0], #6 -+ st3 {v16.h, v17.h, v18.h}[1], [x0], #6 -+ beq 11b -+ mov v16.2s[0], v16.2s[1] -+ sub w5, w5, #6 -+ mov v17.2s[0], v17.2s[1] -+ mov v18.2s[0], v18.2s[1] -+1: -+ cmp w5, #3-96 -+ blt 1f -+ st3 {v16.h, v17.h, v18.h}[0], [x0], #6 -+ beq 11b -+ mov v16.4h[0], v16.4h[1] -+ sub w5, w5, #3 -+ mov v17.4h[0], v17.4h[1] -+1: -+ cmp w5, #2-96 -+ blt 1f -+ st2 {v16.h, v17.h}[0], [x0], #4 -+ b 11b -+1: -+ st1 {v16.h}[0], [x0], #2 -+ b 11b -+ -+endfunc -+ -+// void ff_rpi_sand30_lines_to_planar_y8( -+// uint8_t * dest, : x0 -+// unsigned int dst_stride, : w1 -+// const uint8_t * src, : x2 -+// unsigned int src_stride1, : w3, always 128 -+// unsigned int src_stride2, : w4 -+// unsigned int _x, : w5 -+// unsigned int y, : w6 -+// unsigned int _w, : w7 -+// unsigned int h); : [sp, #0] -+// -+// Assumes that we are starting on a stripe boundary and that overreading -+// within the stripe is OK. However it does respect the dest size for wri -+ -+function ff_rpi_sand30_lines_to_planar_y8, export=1 -+ lsl w4, w4, #7 -+ sub w4, w4, #64 -+ sub w1, w1, w7 -+ uxtw x6, w6 -+ add x8, x2, x6, lsl #7 -+ ldr w6, [sp, #0] -+ -+10: -+ mov x2, x8 -+ mov w5, w7 -+1: -+ ld1 {v0.4s, v1.4s, v2.4s, v3.4s}, [x2], #64 -+ ld1 {v4.4s, v5.4s, v6.4s, v7.4s}, [x2], x4 -+ -+ subs w5, w5, #96 -+ -+ // v0, v1 -+ -+ shrn v18.4h, v0.4s, #16 -+ xtn v16.4h, v0.4s -+ shrn v17.4h, v0.4s, #12 -+ -+ shrn2 v18.8h, v1.4s, #16 -+ xtn2 v16.8h, v1.4s -+ shrn2 v17.8h, v1.4s, #12 -+ -+ shrn v18.8b, v18.8h, #6 -+ shrn v16.8b, v16.8h, #2 -+ xtn v17.8b, v17.8h -+ -+ // v2, v3 -+ -+ shrn v21.4h, v2.4s, #16 -+ xtn v19.4h, v2.4s -+ shrn v20.4h, v2.4s, #12 -+ -+ shrn2 v21.8h, v3.4s, #16 -+ xtn2 v19.8h, v3.4s -+ shrn2 v20.8h, v3.4s, #12 -+ -+ shrn2 v18.16b, v21.8h, #6 -+ shrn2 v16.16b, v19.8h, #2 -+ xtn2 v17.16b, v20.8h -+ -+ // v4, v5 -+ -+ shrn v24.4h, v4.4s, #16 -+ xtn v22.4h, v4.4s -+ shrn v23.4h, v4.4s, #12 -+ -+ shrn2 v24.8h, v5.4s, #16 -+ xtn2 v22.8h, v5.4s -+ shrn2 v23.8h, v5.4s, #12 -+ -+ shrn v21.8b, v24.8h, #6 -+ shrn v19.8b, v22.8h, #2 -+ xtn v20.8b, v23.8h -+ -+ // v6, v7 -+ -+ shrn v27.4h, v6.4s, #16 -+ xtn v25.4h, v6.4s -+ shrn v26.4h, v6.4s, #12 -+ -+ shrn2 v27.8h, v7.4s, #16 -+ xtn2 v25.8h, v7.4s -+ shrn2 v26.8h, v7.4s, #12 -+ -+ shrn2 v21.16b, v27.8h, #6 -+ shrn2 v19.16b, v25.8h, #2 -+ xtn2 v20.16b, v26.8h -+ -+ blt 2f -+ -+ st3 {v16.16b, v17.16b, v18.16b}, [x0], #48 -+ st3 {v19.16b, v20.16b, v21.16b}, [x0], #48 -+ -+ bne 1b -+ -+11: -+ subs w6, w6, #1 -+ add x0, x0, w1, uxtw -+ add x8, x8, #128 -+ bne 10b -+ -+ ret -+ -+// Partial final write -+2: -+ cmp w5, #48-96 -+ blt 1f -+ st3 {v16.16b, v17.16b, v18.16b}, [x0], #48 -+ beq 11b -+ mov v16.16b, v22.16b -+ mov v17.16b, v23.16b -+ sub w5, w5, #48 -+ mov v18.16b, v24.16b -+1: -+ cmp w5, #24-96 -+ blt 1f -+ st3 {v16.8b, v17.8b, v18.8b}, [x0], #24 -+ beq 11b -+ mov v16.2d[0], v16.2d[1] -+ sub w5, w5, #24 -+ mov v17.2d[0], v17.2d[1] -+ mov v18.2d[0], v18.2d[1] -+1: -+ cmp w5, #12-96 -+ blt 1f -+ st3 {v16.b, v17.b, v18.b}[0], [x0], #3 -+ st3 {v16.b, v17.b, v18.b}[1], [x0], #3 -+ st3 {v16.b, v17.b, v18.b}[2], [x0], #3 -+ st3 {v16.b, v17.b, v18.b}[3], [x0], #3 -+ beq 11b -+ mov v16.2s[0], v16.2s[1] -+ sub w5, w5, #12 -+ mov v17.2s[0], v17.2s[1] -+ mov v18.2s[0], v18.2s[1] -+1: -+ cmp w5, #6-96 -+ blt 1f -+ st3 {v16.b, v17.b, v18.b}[0], [x0], #3 -+ st3 {v16.b, v17.b, v18.b}[1], [x0], #3 -+ beq 11b -+ mov v16.4h[0], v16.4h[1] -+ sub w5, w5, #6 -+ mov v17.4h[0], v17.4h[1] -+ mov v18.4h[0], v18.4h[1] -+1: -+ cmp w5, #3-96 -+ blt 1f -+ st3 {v16.b, v17.b, v18.b}[0], [x0], #3 -+ beq 11b -+ mov v16.8b[0], v16.8b[1] -+ sub w5, w5, #3 -+ mov v17.8b[0], v17.8b[1] -+1: -+ cmp w5, #2-96 -+ blt 1f -+ st2 {v16.b, v17.b}[0], [x0], #2 -+ b 11b -+1: -+ st1 {v16.b}[0], [x0], #1 -+ b 11b -+ -+endfunc -+ -diff --git a/libavutil/aarch64/rpi_sand_neon.h b/libavutil/aarch64/rpi_sand_neon.h -index b3aa481ea4..2a56135bc3 100644 ---- a/libavutil/aarch64/rpi_sand_neon.h -+++ b/libavutil/aarch64/rpi_sand_neon.h -@@ -49,6 +49,10 @@ void ff_rpi_sand30_lines_to_planar_c16(uint8_t * dst_u, unsigned int dst_stride_ - uint8_t * dst_v, unsigned int dst_stride_v, const uint8_t * src, unsigned int stride1, - unsigned int stride2, unsigned int _x, unsigned int y, unsigned int _w, unsigned int h); - -+void ff_rpi_sand30_lines_to_planar_y8(uint8_t * dest, unsigned int dst_stride, -+ const uint8_t * src, unsigned int src_stride1, unsigned int src_stride2, -+ unsigned int _x, unsigned int y, unsigned int _w, unsigned int h); -+ - #ifdef __cplusplus - } - #endif -diff --git a/libavutil/arm/rpi_sand_neon.S b/libavutil/arm/rpi_sand_neon.S -index 80890fe985..60e697f681 100644 ---- a/libavutil/arm/rpi_sand_neon.S -+++ b/libavutil/arm/rpi_sand_neon.S -@@ -360,7 +360,6 @@ function ff_rpi_sand30_lines_to_planar_y16, export=1 - ldr r6, [sp, #36] - ldr r7, [sp, #32] @ y - mov r12, #48 -- vmov.u16 q15, #0x3ff - sub r3, #1 - lsl r3, #7 - sub r1, r1, r6, lsl #1 -@@ -376,37 +375,33 @@ function ff_rpi_sand30_lines_to_planar_y16, export=1 - vldm r2!, {q10-q13} - add lr, #64 - -- vshr.u32 q14, q10, #20 @ Cannot vshrn.u32 #20! -+ vshrn.u32 d4 , q10, #14 @ Cannot vshrn.u32 #20! - ands lr, #127 - vshrn.u32 d2, q10, #10 - vmovn.u32 d0, q10 -- vmovn.u32 d4, q14 - -- vshr.u32 q14, q11, #20 -+ vshrn.u32 d5, q11, #14 - it eq - addeq r2, r3 - vshrn.u32 d3, q11, #10 - vmovn.u32 d1, q11 -- vmovn.u32 d5, q14 - - subs r5, #48 -- vand q0, q15 -- vand q1, q15 -- vand q2, q15 -+ vshr.u16 q2, #6 -+ vbic.u16 q0, #0xfc00 -+ vbic.u16 q1, #0xfc00 - -- vshr.u32 q14, q12, #20 -+ vshrn.u32 d20, q12, #14 - vshrn.u32 d18, q12, #10 - vmovn.u32 d16, q12 -- vmovn.u32 d20, q14 - -- vshr.u32 q14, q13, #20 -+ vshrn.u32 d21, q13, #14 - vshrn.u32 d19, q13, #10 - vmovn.u32 d17, q13 -- vmovn.u32 d21, q14 - -- vand q8, q15 -- vand q9, q15 -- vand q10, q15 -+ vshr.u16 q10, #6 -+ vbic.u16 q8, #0xfc00 -+ vbic.u16 q9 , #0xfc00 - blt 2f - - vst3.16 {d0, d2, d4}, [r0], r12 -@@ -499,7 +494,6 @@ function ff_rpi_sand30_lines_to_planar_c16, export=1 - ldr r7, [sp, #48] - ldr r9, [sp, #52] - mov r12, #48 -- vmov.u16 q15, #0x3ff - sub r8, #1 - lsl r8, #7 - add r5, r5, r7, lsl #7 -@@ -515,48 +509,44 @@ function ff_rpi_sand30_lines_to_planar_c16, export=1 - add lr, #64 - - @ N.B. unpack [0,1,2] -> (reg order) 1, 0, 2 -- vshr.u32 q14, q0, #20 -- vshrn.u32 d16, q0, #10 -+ vshrn.u32 d20, q0, #14 - vmovn.u32 d18, q0 -+ vshrn.u32 d0, q0, #10 - ands lr, #127 -- vmovn.u32 d20, q14 - -- vshr.u32 q14, q1, #20 -- vshrn.u32 d17, q1, #10 -+ vshrn.u32 d21, q1, #14 - vmovn.u32 d19, q1 -- vmovn.u32 d21, q14 -+ vshrn.u32 d1, q1, #10 - -- vshr.u32 q14, q2, #20 - vshrn.u32 d22, q2, #10 -- vmovn.u32 d24, q2 -- vmovn.u32 d26, q14 -+ vmovn.u32 d2, q2 -+ vshrn.u32 d4, q2, #14 - -- vshr.u32 q14, q3, #20 -- vshrn.u32 d23, q3, #10 -- vmovn.u32 d25, q3 - add r10, r0, #24 -- vmovn.u32 d27, q14 -+ vshrn.u32 d23, q3, #10 -+ vmovn.u32 d3, q3 -+ vshrn.u32 d5, q3, #14 - - it eq - addeq r4, r8 -- vuzp.16 q8, q11 -- vuzp.16 q9, q12 -- vuzp.16 q10, q13 -+ vuzp.16 q0, q11 -+ vuzp.16 q9, q1 -+ vuzp.16 q10, q2 - -- @ q8 V0, V3,.. -> q0 -+ @ q0 V0, V3,.. - @ q9 U0, U3... - @ q10 U1, U4... - @ q11 U2, U5,.. -- @ q12 V1, V4,.. -> q1 -- @ q13 V2, V5,.. -> q2 -+ @ q1 V1, V4, -+ @ q2 V2, V5,.. - - subs r6, #24 -- vand q11, q15 -- vand q9, q15 -- vand q10, q15 -- vand q0, q8, q15 -- vand q1, q12, q15 -- vand q2, q13, q15 -+ vbic.u16 q11, #0xfc00 -+ vbic.u16 q9, #0xfc00 -+ vshr.u16 q10, #6 -+ vshr.u16 q2, #6 -+ vbic.u16 q0, #0xfc00 -+ vbic.u16 q1, #0xfc00 - - blt 2f - -@@ -765,4 +755,171 @@ function ff_rpi_sand30_lines_to_planar_p010, export=1 - endfunc - - -+@ void ff_rpi_sand30_lines_to_planar_y8( -+@ uint8_t * dest, // [r0] -+@ unsigned int dst_stride, // [r1] -+@ const uint8_t * src, // [r2] -+@ unsigned int src_stride1, // [r3] Ignored - assumed 128 -+@ unsigned int src_stride2, // [sp, #0] -> r3 -+@ unsigned int _x, // [sp, #4] Ignored - 0 -+@ unsigned int y, // [sp, #8] (r7 in prefix) -+@ unsigned int _w, // [sp, #12] -> r6 (cur r5) -+@ unsigned int h); // [sp, #16] -> r7 -+@ -+@ Assumes that we are starting on a stripe boundary and that overreading -+@ within the stripe is OK. However it does respect the dest size for wri -+ -+function ff_rpi_sand30_lines_to_planar_y8, export=1 -+ push {r4-r8, lr} @ +24 -+ ldr r3, [sp, #24] -+ ldr r6, [sp, #36] -+ ldr r7, [sp, #32] @ y -+ mov r12, #48 -+ lsl r3, #7 -+ sub r1, r1, r6 -+ add r8, r2, r7, lsl #7 -+ ldr r7, [sp, #40] -+ -+10: -+ mov r2, r8 -+ add r4, r0, #24 -+ mov r5, r6 -+1: -+ vldm r2, {q8-q15} -+ -+ subs r5, #96 -+ -+ vmovn.u32 d0, q8 -+ vshrn.u32 d2, q8, #12 -+ vshrn.u32 d4, q8, #16 @ Cannot vshrn.u32 #20! -+ -+ add r2, r3 -+ -+ vmovn.u32 d1, q9 -+ vshrn.u32 d3, q9, #12 -+ vshrn.u32 d5, q9, #16 -+ -+ pld [r2, #0] -+ -+ vshrn.u16 d0, q0, #2 -+ vmovn.u16 d1, q1 -+ vshrn.u16 d2, q2, #6 -+ -+ vmovn.u32 d16, q10 -+ vshrn.u32 d18, q10, #12 -+ vshrn.u32 d20, q10, #16 -+ -+ vmovn.u32 d17, q11 -+ vshrn.u32 d19, q11, #12 -+ vshrn.u32 d21, q11, #16 -+ -+ pld [r2, #64] -+ -+ vshrn.u16 d4, q8, #2 -+ vmovn.u16 d5, q9 -+ vshrn.u16 d6, q10, #6 -+ -+ vmovn.u32 d16, q12 -+ vshrn.u32 d18, q12, #12 -+ vshrn.u32 d20, q12, #16 -+ -+ vmovn.u32 d17, q13 -+ vshrn.u32 d19, q13, #12 -+ vshrn.u32 d21, q13, #16 -+ -+ vshrn.u16 d16, q8, #2 -+ vmovn.u16 d17, q9 -+ vshrn.u16 d18, q10, #6 -+ -+ vmovn.u32 d20, q14 -+ vshrn.u32 d22, q14, #12 -+ vshrn.u32 d24, q14, #16 -+ -+ vmovn.u32 d21, q15 -+ vshrn.u32 d23, q15, #12 -+ vshrn.u32 d25, q15, #16 -+ -+ vshrn.u16 d20, q10, #2 -+ vmovn.u16 d21, q11 -+ vshrn.u16 d22, q12, #6 -+ -+ blt 2f -+ -+ vst3.8 {d0, d1, d2}, [r0], r12 -+ vst3.8 {d4, d5, d6}, [r4], r12 -+ vst3.8 {d16, d17, d18}, [r0], r12 -+ vst3.8 {d20, d21, d22}, [r4], r12 -+ -+ bne 1b -+ -+11: -+ subs r7, #1 -+ add r0, r1 -+ add r8, #128 -+ bne 10b -+ -+ pop {r4-r8, pc} -+ -+@ Partial final write -+2: -+ cmp r5, #48-96 -+ blt 1f -+ vst3.8 {d0, d1, d2}, [r0], r12 -+ vst3.8 {d4, d5, d6}, [r4], r12 -+ beq 11b -+ vmov q0, q8 -+ vmov q2, q10 -+ sub r5, #48 -+ vmov d2, d18 -+ vmov d6, d22 -+1: -+ cmp r5, #24-96 -+ blt 1f -+ vst3.8 {d0, d1, d2}, [r0]! -+ beq 11b -+ vmov q0, q2 -+ sub r5, #24 -+ vmov d2, d6 -+1: -+ cmp r5, #12-96 -+ blt 1f -+ vst3.8 {d0[0], d1[0], d2[0]}, [r0]! -+ vst3.8 {d0[1], d1[1], d2[1]}, [r0]! -+ vst3.8 {d0[2], d1[2], d2[2]}, [r0]! -+ vst3.8 {d0[3], d1[3], d2[3]}, [r0]! -+ beq 11b -+ vmov s0, s1 -+ sub r5, #12 -+ vmov s2, s3 -+ vmov s4, s5 -+1: -+ cmp r5, #6-96 -+ blt 1f -+ vst3.8 {d0[0], d1[0], d2[0]}, [r0]! -+ vst3.8 {d0[1], d1[1], d2[1]}, [r0]! -+ add r0, #12 -+ beq 11b -+ vshr.u32 d0, #16 -+ sub r5, #6 -+ vshr.u32 d1, #16 -+ vshr.u32 d2, #16 -+1: -+ cmp r5, #3-96 -+ blt 1f -+ vst3.8 {d0[0], d1[0], d2[0]}, [r0]! -+ beq 11b -+ sub r5, #3 -+ vshr.u32 d0, #8 -+ vshr.u32 d1, #8 -+1: -+ cmp r5, #2-96 -+ blt 1f -+ vst2.8 {d0[0], d1[0]}, [r0]! -+ b 11b -+1: -+ vst1.8 {d0[0]}, [r0]! -+ b 11b -+ -+endfunc -+ - -diff --git a/libavutil/arm/rpi_sand_neon.h b/libavutil/arm/rpi_sand_neon.h -index 447f367bea..d457c10870 100644 ---- a/libavutil/arm/rpi_sand_neon.h -+++ b/libavutil/arm/rpi_sand_neon.h -@@ -95,5 +95,16 @@ void ff_rpi_sand30_lines_to_planar_p010( - unsigned int _w, // [sp, #12] -> r6 (cur r5) - unsigned int h); // [sp, #16] -> r7 - -+void ff_rpi_sand30_lines_to_planar_y8( -+ uint8_t * dest, // [r0] -+ unsigned int dst_stride, // [r1] -+ const uint8_t * src, // [r2] -+ unsigned int src_stride1, // [r3] Ignored - assumed 128 -+ unsigned int src_stride2, // [sp, #0] -> r3 -+ unsigned int _x, // [sp, #4] Ignored - 0 -+ unsigned int y, // [sp, #8] (r7 in prefix) -+ unsigned int _w, // [sp, #12] -> r6 (cur r5) -+ unsigned int h); // [sp, #16] -> r7 -+ - #endif // AVUTIL_ARM_SAND_NEON_H - -diff --git a/libavutil/rpi_sand_fns.c b/libavutil/rpi_sand_fns.c -index 256c3d532f..b6071e2928 100644 ---- a/libavutil/rpi_sand_fns.c -+++ b/libavutil/rpi_sand_fns.c -@@ -247,7 +247,7 @@ void av_rpi_sand30_to_planar_y8(uint8_t * dst, const unsigned int dst_stride, - const uint8_t * p0 = src + (x0 & mask) + y * stride1 + (x0 & ~mask) * stride2; - const unsigned int slice_inc = ((stride2 - 1) * stride1) >> 2; // RHS of a stripe to LHS of next in words - --#if HAVE_SAND_ASM && 0 -+#if HAVE_SAND_ASM - if (_x == 0) { - ff_rpi_sand30_lines_to_planar_y8(dst, dst_stride, src, stride1, stride2, _x, y, _w, h); - return; - -From 24c3eef4487a36d5189ecd934b65a7c6a0b53d03 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 7 Jun 2022 14:46:12 +0000 -Subject: [PATCH 054/151] v4l2_m2m_enc: Add the ability to encode DRM_PRIME - frames - ---- - libavcodec/v4l2_buffers.c | 100 +++++++++++--- - libavcodec/v4l2_buffers.h | 20 ++- - libavcodec/v4l2_context.c | 212 +++++++++++++++++++++++++--- - libavcodec/v4l2_context.h | 15 +- - libavcodec/v4l2_m2m.c | 37 +++-- - libavcodec/v4l2_m2m.h | 3 + - libavcodec/v4l2_m2m_dec.c | 171 ++++++----------------- - libavcodec/v4l2_m2m_enc.c | 283 +++++++++++++++++++++++++++++++++++++- - 8 files changed, 643 insertions(+), 198 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 8c4f18dbed..9ef2f40e39 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -29,6 +29,8 @@ - #include - #include - #include "libavcodec/avcodec.h" -+#include "libavcodec/internal.h" -+#include "libavutil/avassert.h" - #include "libavutil/pixdesc.h" - #include "libavutil/hwcontext.h" - #include "v4l2_context.h" -@@ -60,27 +62,39 @@ static inline AVRational v4l2_get_timebase(const V4L2Buffer * const avbuf) - return tb.num && tb.den ? tb : v4l2_timebase; - } - -+static inline struct timeval tv_from_int(const int64_t t) -+{ -+ return (struct timeval){ -+ .tv_usec = t % USEC_PER_SEC, -+ .tv_sec = t / USEC_PER_SEC -+ }; -+} -+ -+static inline int64_t int_from_tv(const struct timeval t) -+{ -+ return (int64_t)t.tv_sec * USEC_PER_SEC + t.tv_usec; -+} -+ - static inline void v4l2_set_pts(V4L2Buffer * const out, const int64_t pts) - { - /* convert pts to v4l2 timebase */ - const int64_t v4l2_pts = -- out->context->no_pts_rescale ? pts : - pts == AV_NOPTS_VALUE ? 0 : - av_rescale_q(pts, v4l2_get_timebase(out), v4l2_timebase); -- out->buf.timestamp.tv_usec = v4l2_pts % USEC_PER_SEC; -- out->buf.timestamp.tv_sec = v4l2_pts / USEC_PER_SEC; -+ out->buf.timestamp = tv_from_int(v4l2_pts); - } - - static inline int64_t v4l2_get_pts(const V4L2Buffer * const avbuf) - { -+ const int64_t v4l2_pts = int_from_tv(avbuf->buf.timestamp); -+ return v4l2_pts != 0 ? v4l2_pts : AV_NOPTS_VALUE; -+#if 0 - /* convert pts back to encoder timebase */ -- const int64_t v4l2_pts = (int64_t)avbuf->buf.timestamp.tv_sec * USEC_PER_SEC + -- avbuf->buf.timestamp.tv_usec; -- - return - avbuf->context->no_pts_rescale ? v4l2_pts : - v4l2_pts == 0 ? AV_NOPTS_VALUE : - av_rescale_q(v4l2_pts, v4l2_timebase, v4l2_get_timebase(avbuf)); -+#endif - } - - static void set_buf_length(V4L2Buffer *out, unsigned int plane, uint32_t bytesused, uint32_t length) -@@ -435,7 +449,7 @@ static void v4l2_free_bufref(void *opaque, uint8_t *data) - - ff_mutex_lock(&ctx->lock); - -- avbuf->status = V4L2BUF_AVAILABLE; -+ ff_v4l2_buffer_set_avail(avbuf); - - if (s->draining && V4L2_TYPE_IS_OUTPUT(ctx->type)) { - av_log(logger(avbuf), AV_LOG_DEBUG, "%s: Buffer avail\n", ctx->name); -@@ -599,6 +613,38 @@ static int is_chroma(const AVPixFmtDescriptor *desc, int i, int num_planes) - return i != 0 && !(i == num_planes - 1 && (desc->flags & AV_PIX_FMT_FLAG_ALPHA)); - } - -+static int v4l2_buffer_primeframe_to_buf(const AVFrame *frame, V4L2Buffer *out) -+{ -+ const AVDRMFrameDescriptor *const src = (const AVDRMFrameDescriptor *)frame->data[0]; -+ -+ if (frame->format != AV_PIX_FMT_DRM_PRIME || !src) -+ return AVERROR(EINVAL); -+ -+ av_assert0(out->buf.memory == V4L2_MEMORY_DMABUF); -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(out->buf.type)) { -+ // Only currently cope with single buffer types -+ if (out->buf.length != 1) -+ return AVERROR_PATCHWELCOME; -+ if (src->nb_objects != 1) -+ return AVERROR(EINVAL); -+ -+ out->planes[0].m.fd = src->objects[0].fd; -+ } -+ else { -+ if (src->nb_objects != 1) -+ return AVERROR(EINVAL); -+ -+ out->buf.m.fd = src->objects[0].fd; -+ } -+ -+ // No need to copy src AVDescriptor and if we did then we may confuse -+ // fd close on free -+ out->ref_buf = av_buffer_ref(frame->buf[0]); -+ -+ return 0; -+} -+ - static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - { - int i; -@@ -678,7 +724,7 @@ static int v4l2_buffer_swframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - * - ******************************************************************************/ - --int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out) -+int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out, const int64_t track_ts) - { - out->buf.flags = frame->key_frame ? - (out->buf.flags | V4L2_BUF_FLAG_KEYFRAME) : -@@ -688,10 +734,15 @@ int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out) - v4l2_set_color(out, frame->color_primaries, frame->colorspace, frame->color_trc); - v4l2_set_color_range(out, frame->color_range); - // PTS & interlace are buffer vars -- v4l2_set_pts(out, frame->pts); -+ if (track_ts) -+ out->buf.timestamp = tv_from_int(track_ts); -+ else -+ v4l2_set_pts(out, frame->pts); - v4l2_set_interlace(out, frame->interlaced_frame, frame->top_field_first); - -- return v4l2_buffer_swframe_to_buf(frame, out); -+ return frame->format == AV_PIX_FMT_DRM_PRIME ? -+ v4l2_buffer_primeframe_to_buf(frame, out) : -+ v4l2_buffer_swframe_to_buf(frame, out); - } - - int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf) -@@ -754,6 +805,7 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf) - - pkt->size = V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type) ? avbuf->buf.m.planes[0].bytesused : avbuf->buf.bytesused; - pkt->data = (uint8_t*)avbuf->plane_info[0].mm_addr + avbuf->planes[0].data_offset; -+ pkt->flags = 0; - - if (avbuf->buf.flags & V4L2_BUF_FLAG_KEYFRAME) - pkt->flags |= AV_PKT_FLAG_KEY; -@@ -768,8 +820,9 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf) - return 0; - } - --int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, -- const void *extdata, size_t extlen) -+int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket * const pkt, V4L2Buffer * const out, -+ const void *extdata, size_t extlen, -+ const int64_t timestamp) - { - int ret; - -@@ -783,7 +836,10 @@ int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, - if (ret && ret != AVERROR(ENOMEM)) - return ret; - -- v4l2_set_pts(out, pkt->pts); -+ if (timestamp) -+ out->buf.timestamp = tv_from_int(timestamp); -+ else -+ v4l2_set_pts(out, pkt->pts); - - out->buf.flags = (pkt->flags & AV_PKT_FLAG_KEY) != 0 ? - (out->buf.flags | V4L2_BUF_FLAG_KEYFRAME) : -@@ -794,7 +850,7 @@ int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, - - int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out) - { -- return ff_v4l2_buffer_avpkt_to_buf_ext(pkt, out, NULL, 0); -+ return ff_v4l2_buffer_avpkt_to_buf_ext(pkt, out, NULL, 0, 0); - } - - -@@ -814,13 +870,15 @@ static void v4l2_buffer_buffer_free(void *opaque, uint8_t *data) - close(avbuf->drm_frame.objects[i].fd); - } - -+ av_buffer_unref(&avbuf->ref_buf); -+ - ff_weak_link_unref(&avbuf->context_wl); - - av_free(avbuf); - } - - --int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ctx) -+int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ctx, enum v4l2_memory mem) - { - int ret, i; - V4L2Buffer * const avbuf = av_mallocz(sizeof(*avbuf)); -@@ -837,7 +895,7 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct - } - - avbuf->context = ctx; -- avbuf->buf.memory = V4L2_MEMORY_MMAP; -+ avbuf->buf.memory = mem; - avbuf->buf.type = ctx->type; - avbuf->buf.index = index; - -@@ -867,6 +925,8 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct - avbuf->num_planes = 1; - - for (i = 0; i < avbuf->num_planes; i++) { -+ const int want_mmap = avbuf->buf.memory == V4L2_MEMORY_MMAP && -+ (V4L2_TYPE_IS_OUTPUT(ctx->type) || !buf_to_m2mctx(avbuf)->output_drm); - - avbuf->plane_info[i].bytesperline = V4L2_TYPE_IS_MULTIPLANAR(ctx->type) ? - ctx->format.fmt.pix_mp.plane_fmt[i].bytesperline : -@@ -875,21 +935,17 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { - avbuf->plane_info[i].length = avbuf->buf.m.planes[i].length; - -- if ((V4L2_TYPE_IS_OUTPUT(ctx->type) && buf_to_m2mctx(avbuf)->output_drm) || -- !buf_to_m2mctx(avbuf)->output_drm) { -+ if (want_mmap) - avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length, - PROT_READ | PROT_WRITE, MAP_SHARED, - buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset); -- } - } else { - avbuf->plane_info[i].length = avbuf->buf.length; - -- if ((V4L2_TYPE_IS_OUTPUT(ctx->type) && buf_to_m2mctx(avbuf)->output_drm) || -- !buf_to_m2mctx(avbuf)->output_drm) { -+ if (want_mmap) - avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length, - PROT_READ | PROT_WRITE, MAP_SHARED, - buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.offset); -- } - } - - if (avbuf->plane_info[i].mm_addr == MAP_FAILED) { -diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h -index 3b7ca4d99e..1ac32c5989 100644 ---- a/libavcodec/v4l2_buffers.h -+++ b/libavcodec/v4l2_buffers.h -@@ -59,6 +59,10 @@ typedef struct V4L2Buffer { - - /* DRM descriptor */ - AVDRMFrameDescriptor drm_frame; -+ /* For DRM_PRIME encode - need to keep a ref to the source buffer till we -+ * are done -+ */ -+ AVBufferRef * ref_buf; - - /* keep track of the mmap address and mmap length */ - struct V4L2Plane_info { -@@ -110,8 +114,9 @@ int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *buf); - */ - int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out); - --int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, -- const void *extdata, size_t extlen); -+int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket * const pkt, V4L2Buffer * const out, -+ const void *extdata, size_t extlen, -+ const int64_t timestamp); - - /** - * Extracts the data from an AVFrame to a V4L2Buffer -@@ -121,7 +126,7 @@ int ff_v4l2_buffer_avpkt_to_buf_ext(const AVPacket *pkt, V4L2Buffer *out, - * - * @returns 0 in case of success, a negative AVERROR code otherwise - */ --int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out); -+int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out, const int64_t track_ts); - - /** - * Initializes a V4L2Buffer -@@ -131,7 +136,7 @@ int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out); - * - * @returns 0 in case of success, a negative AVERROR code otherwise - */ --int ff_v4l2_buffer_initialize(AVBufferRef **avbuf, int index, struct V4L2Context *ctx); -+int ff_v4l2_buffer_initialize(AVBufferRef **avbuf, int index, struct V4L2Context *ctx, enum v4l2_memory mem); - - /** - * Enqueues a V4L2Buffer -@@ -142,5 +147,12 @@ int ff_v4l2_buffer_initialize(AVBufferRef **avbuf, int index, struct V4L2Context - */ - int ff_v4l2_buffer_enqueue(V4L2Buffer* avbuf); - -+static inline void -+ff_v4l2_buffer_set_avail(V4L2Buffer* const avbuf) -+{ -+ avbuf->status = V4L2BUF_AVAILABLE; -+ av_buffer_unref(&avbuf->ref_buf); -+} -+ - - #endif // AVCODEC_V4L2_BUFFERS_H -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index b3662aedaa..7a707d21fc 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -43,6 +43,160 @@ struct v4l2_format_update { - int update_avfmt; - }; - -+ -+static inline int64_t track_to_pts(AVCodecContext *avctx, unsigned int n) -+{ -+ return (int64_t)n; -+} -+ -+static inline unsigned int pts_to_track(AVCodecContext *avctx, const int64_t pts) -+{ -+ return (unsigned int)pts; -+} -+ -+// FFmpeg requires us to propagate a number of vars from the coded pkt into -+// the decoded frame. The only thing that tracks like that in V4L2 stateful -+// is timestamp. PTS maps to timestamp for this decode. FFmpeg makes no -+// guarantees about PTS being unique or specified for every frame so replace -+// the supplied PTS with a simple incrementing number and keep a circular -+// buffer of all the things we want preserved (including the original PTS) -+// indexed by the tracking no. -+static int64_t -+xlat_pts_pkt_in(AVCodecContext *const avctx, xlat_track_t *const x, const AVPacket *const avpkt) -+{ -+ int64_t track_pts; -+ -+ // Avoid 0 -+ if (++x->track_no == 0) -+ x->track_no = 1; -+ -+ track_pts = track_to_pts(avctx, x->track_no); -+ -+ av_log(avctx, AV_LOG_TRACE, "In pkt PTS=%" PRId64 ", DTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", avpkt->pts, avpkt->dts, track_pts, x->track_no); -+ x->last_pkt_dts = avpkt->dts; -+ x->track_els[x->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ -+ .discard = 0, -+ .pending = 1, -+ .pkt_size = avpkt->size, -+ .pts = avpkt->pts, -+ .dts = avpkt->dts, -+ .reordered_opaque = avctx->reordered_opaque, -+ .pkt_pos = avpkt->pos, -+ .pkt_duration = avpkt->duration, -+ .track_pts = track_pts -+ }; -+ return track_pts; -+} -+ -+static int64_t -+xlat_pts_frame_in(AVCodecContext *const avctx, xlat_track_t *const x, const AVFrame *const frame) -+{ -+ int64_t track_pts; -+ -+ // Avoid 0 -+ if (++x->track_no == 0) -+ x->track_no = 1; -+ -+ track_pts = track_to_pts(avctx, x->track_no); -+ -+ av_log(avctx, AV_LOG_TRACE, "In frame PTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", frame->pts, track_pts, x->track_no); -+ x->last_pkt_dts = frame->pkt_dts; -+ x->track_els[x->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ -+ .discard = 0, -+ .pending = 1, -+ .pkt_size = 0, -+ .pts = frame->pts, -+ .dts = AV_NOPTS_VALUE, -+ .reordered_opaque = frame->reordered_opaque, -+ .pkt_pos = frame->pkt_pos, -+ .pkt_duration = frame->pkt_duration, -+ .track_pts = track_pts -+ }; -+ return track_pts; -+} -+ -+ -+// Returns -1 if we should discard the frame -+static int -+xlat_pts_frame_out(AVCodecContext *const avctx, -+ xlat_track_t * const x, -+ AVFrame *const frame) -+{ -+ unsigned int n = pts_to_track(avctx, frame->pts) % FF_V4L2_M2M_TRACK_SIZE; -+ V4L2m2mTrackEl *const t = x->track_els + n; -+ if (frame->pts == AV_NOPTS_VALUE || frame->pts != t->track_pts) -+ { -+ av_log(avctx, frame->pts == AV_NOPTS_VALUE ? AV_LOG_DEBUG : AV_LOG_WARNING, -+ "Frame tracking failure: pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); -+ frame->pts = AV_NOPTS_VALUE; -+ frame->pkt_dts = x->last_pkt_dts; -+ frame->reordered_opaque = x->last_opaque; -+ frame->pkt_pos = -1; -+ frame->pkt_duration = 0; -+ frame->pkt_size = -1; -+ } -+ else if (!t->discard) -+ { -+ frame->pts = t->pending ? t->pts : AV_NOPTS_VALUE; -+ frame->pkt_dts = x->last_pkt_dts; -+ frame->reordered_opaque = t->reordered_opaque; -+ frame->pkt_pos = t->pkt_pos; -+ frame->pkt_duration = t->pkt_duration; -+ frame->pkt_size = t->pkt_size; -+ -+ x->last_opaque = x->track_els[n].reordered_opaque; -+ if (frame->pts != AV_NOPTS_VALUE) -+ x->last_pts = frame->pts; -+ t->pending = 0; -+ } -+ else -+ { -+ av_log(avctx, AV_LOG_DEBUG, "Discard frame (flushed): pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); -+ return -1; -+ } -+ -+ av_log(avctx, AV_LOG_TRACE, "Out frame PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 ", track=%"PRId64", n=%d\n", -+ frame->pts, frame->best_effort_timestamp, frame->pkt_dts, t->track_pts, n); -+ return 0; -+} -+ -+// Returns -1 if we should discard the frame -+static int -+xlat_pts_pkt_out(AVCodecContext *const avctx, -+ xlat_track_t * const x, -+ AVPacket *const pkt) -+{ -+ unsigned int n = pts_to_track(avctx, pkt->pts) % FF_V4L2_M2M_TRACK_SIZE; -+ V4L2m2mTrackEl *const t = x->track_els + n; -+ if (pkt->pts == AV_NOPTS_VALUE || pkt->pts != t->track_pts) -+ { -+ av_log(avctx, pkt->pts == AV_NOPTS_VALUE ? AV_LOG_DEBUG : AV_LOG_WARNING, -+ "Pkt tracking failure: pts=%" PRId64 ", track[%d]=%" PRId64 "\n", pkt->pts, n, t->track_pts); -+ pkt->pts = AV_NOPTS_VALUE; -+ } -+ else if (!t->discard) -+ { -+ pkt->pts = t->pending ? t->pts : AV_NOPTS_VALUE; -+ -+ x->last_opaque = x->track_els[n].reordered_opaque; -+ if (pkt->pts != AV_NOPTS_VALUE) -+ x->last_pts = pkt->pts; -+ t->pending = 0; -+ } -+ else -+ { -+ av_log(avctx, AV_LOG_DEBUG, "Discard packet (flushed): pts=%" PRId64 ", track[%d]=%" PRId64 "\n", pkt->pts, n, t->track_pts); -+ return -1; -+ } -+ -+ // * Would like something much better than this...xlat(offset + out_count)? -+ pkt->dts = pkt->pts; -+ av_log(avctx, AV_LOG_TRACE, "Out pkt PTS=%" PRId64 ", track=%"PRId64", n=%d\n", -+ pkt->pts, t->track_pts, n); -+ return 0; -+} -+ -+ - static inline V4L2m2mContext *ctx_to_m2mctx(const V4L2Context *ctx) - { - return V4L2_TYPE_IS_OUTPUT(ctx->type) ? -@@ -353,12 +507,14 @@ dq_buf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf) - atomic_fetch_sub(&ctx->q_count, 1); - - avbuf = (V4L2Buffer *)ctx->bufrefs[buf.index]->data; -- avbuf->status = V4L2BUF_AVAILABLE; -+ ff_v4l2_buffer_set_avail(avbuf); - avbuf->buf = buf; - if (is_mp) { - memcpy(avbuf->planes, planes, sizeof(planes)); - avbuf->buf.m.planes = avbuf->planes; - } -+ // Done with any attached buffer -+ av_buffer_unref(&avbuf->ref_buf); - - if (V4L2_TYPE_IS_CAPTURE(ctx->type)) { - // Zero length cap buffer return == EOS -@@ -733,7 +889,7 @@ static void flush_all_buffers_status(V4L2Context* const ctx) - for (i = 0; i < ctx->num_buffers; ++i) { - struct V4L2Buffer * const buf = (struct V4L2Buffer *)ctx->bufrefs[i]->data; - if (buf->status == V4L2BUF_IN_DRIVER) -- buf->status = V4L2BUF_AVAILABLE; -+ ff_v4l2_buffer_set_avail(buf); - } - atomic_store(&ctx->q_count, 0); - } -@@ -787,6 +943,8 @@ int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd) - { - if (cmd == VIDIOC_STREAMOFF) - flush_all_buffers_status(ctx); -+ else -+ ctx->first_buf = 1; - - ctx->streamon = (cmd == VIDIOC_STREAMON); - av_log(avctx, AV_LOG_DEBUG, "%s set status %d (%s) OK\n", ctx->name, -@@ -803,14 +961,16 @@ int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd) - - int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame) - { -- V4L2m2mContext *s = ctx_to_m2mctx(ctx); -+ V4L2m2mContext *const s = ctx_to_m2mctx(ctx); -+ AVCodecContext *const avctx = s->avctx; -+ int64_t track_ts; - V4L2Buffer* avbuf; - int ret; - - if (!frame) { - ret = v4l2_stop_encode(ctx); - if (ret) -- av_log(logger(ctx), AV_LOG_ERROR, "%s stop_encode\n", ctx->name); -+ av_log(avctx, AV_LOG_ERROR, "%s stop_encode\n", ctx->name); - s->draining= 1; - return 0; - } -@@ -819,7 +979,9 @@ int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* frame) - if (!avbuf) - return AVERROR(EAGAIN); - -- ret = ff_v4l2_buffer_avframe_to_buf(frame, avbuf); -+ track_ts = xlat_pts_frame_in(avctx, &s->xlat, frame); -+ -+ ret = ff_v4l2_buffer_avframe_to_buf(frame, avbuf, track_ts); - if (ret) - return ret; - -@@ -830,14 +992,16 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, - const void * extdata, size_t extlen) - { - V4L2m2mContext *s = ctx_to_m2mctx(ctx); -+ AVCodecContext *const avctx = s->avctx; - V4L2Buffer* avbuf; - int ret; -+ int64_t track_ts; - - if (!pkt->size) { - ret = v4l2_stop_decode(ctx); - // Log but otherwise ignore stop failure - if (ret) -- av_log(logger(ctx), AV_LOG_ERROR, "%s stop_decode failed: err=%d\n", ctx->name, ret); -+ av_log(avctx, AV_LOG_ERROR, "%s stop_decode failed: err=%d\n", ctx->name, ret); - s->draining = 1; - return 0; - } -@@ -846,7 +1010,9 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, - if (!avbuf) - return AVERROR(EAGAIN); - -- ret = ff_v4l2_buffer_avpkt_to_buf_ext(pkt, avbuf, extdata, extlen); -+ track_ts = xlat_pts_pkt_in(avctx, &s->xlat, pkt); -+ -+ ret = ff_v4l2_buffer_avpkt_to_buf_ext(pkt, avbuf, extdata, extlen, track_ts); - if (ret == AVERROR(ENOMEM)) - av_log(logger(ctx), AV_LOG_ERROR, "Buffer overflow in %s: pkt->size=%d > buf->length=%d\n", - __func__, pkt->size, avbuf->planes[0].length); -@@ -858,24 +1024,36 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, - - int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) - { -+ V4L2m2mContext *s = ctx_to_m2mctx(ctx); -+ AVCodecContext *const avctx = s->avctx; - V4L2Buffer *avbuf; - int rv; - -- if ((rv = get_qbuf(ctx, &avbuf, timeout)) != 0) -- return rv; -+ do { -+ if ((rv = get_qbuf(ctx, &avbuf, timeout)) != 0) -+ return rv; -+ if ((rv = ff_v4l2_buffer_buf_to_avframe(frame, avbuf)) != 0) -+ return rv; -+ } while (xlat_pts_frame_out(avctx, &s->xlat, frame) != 0); - -- return ff_v4l2_buffer_buf_to_avframe(frame, avbuf); -+ return 0; - } - - int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt) - { -+ V4L2m2mContext *s = ctx_to_m2mctx(ctx); -+ AVCodecContext *const avctx = s->avctx; - V4L2Buffer *avbuf; - int rv; - -- if ((rv = get_qbuf(ctx, &avbuf, -1)) != 0) -- return rv == AVERROR(ENOSPC) ? AVERROR(EAGAIN) : rv; // Caller not currently expecting ENOSPC -+ do { -+ if ((rv = get_qbuf(ctx, &avbuf, -1)) != 0) -+ return rv == AVERROR(ENOSPC) ? AVERROR(EAGAIN) : rv; // Caller not currently expecting ENOSPC -+ if ((rv = ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf)) != 0) -+ return rv; -+ } while (xlat_pts_pkt_out(avctx, &s->xlat, pkt) != 0); - -- return ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf); -+ return 0; - } - - int ff_v4l2_context_get_format(V4L2Context* ctx, int probe) -@@ -951,7 +1129,7 @@ void ff_v4l2_context_release(V4L2Context* ctx) - } - - --static int create_buffers(V4L2Context* const ctx, const unsigned int req_buffers) -+static int create_buffers(V4L2Context* const ctx, const unsigned int req_buffers, const enum v4l2_memory mem) - { - V4L2m2mContext * const s = ctx_to_m2mctx(ctx); - struct v4l2_requestbuffers req; -@@ -962,7 +1140,7 @@ static int create_buffers(V4L2Context* const ctx, const unsigned int req_buffers - - memset(&req, 0, sizeof(req)); - req.count = req_buffers; -- req.memory = V4L2_MEMORY_MMAP; -+ req.memory = mem; - req.type = ctx->type; - while ((ret = ioctl(s->fd, VIDIOC_REQBUFS, &req)) == -1) { - if (errno != EINTR) { -@@ -986,7 +1164,7 @@ static int create_buffers(V4L2Context* const ctx, const unsigned int req_buffers - } - - for (i = 0; i < ctx->num_buffers; i++) { -- ret = ff_v4l2_buffer_initialize(&ctx->bufrefs[i], i, ctx); -+ ret = ff_v4l2_buffer_initialize(&ctx->bufrefs[i], i, ctx, mem); - if (ret) { - av_log(logger(ctx), AV_LOG_ERROR, "%s buffer[%d] initialization (%s)\n", ctx->name, i, av_err2str(ret)); - goto fail_release; -@@ -1052,7 +1230,7 @@ int ff_v4l2_context_init(V4L2Context* ctx) - goto fail_unref_hwframes; - } - -- ret = create_buffers(ctx, ctx->num_buffers); -+ ret = create_buffers(ctx, ctx->num_buffers, ctx->buf_mem); - if (ret < 0) - goto fail_unref_hwframes; - -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index 0efff58f18..21265f1bd7 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -91,11 +91,19 @@ typedef struct V4L2Context { - */ - int num_buffers; - -+ /** -+ * Buffer memory type V4L2_MEMORY_MMAP or V4L2_MEMORY_DMABUF -+ */ -+ enum v4l2_memory buf_mem; -+ - /** - * Whether the stream has been started (VIDIOC_STREAMON has been sent). - */ - int streamon; - -+ /* 1st buffer after stream on */ -+ int first_buf; -+ - /** - * Either no more buffers available or an unrecoverable error was notified - * by the V4L2 kernel driver: once set the context has to be exited. -@@ -105,11 +113,10 @@ typedef struct V4L2Context { - int flag_last; - - /** -- * PTS rescale not wanted -- * If the PTS is just a dummy frame count then rescale is -- * actively harmful -+ * If NZ then when Qing frame/pkt use this rather than the -+ * "real" PTS - */ -- int no_pts_rescale; -+ uint64_t track_ts; - - AVBufferRef *frames_ref; - atomic_int q_count; -diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c -index 6dd01e2e00..1e30d15fd8 100644 ---- a/libavcodec/v4l2_m2m.c -+++ b/libavcodec/v4l2_m2m.c -@@ -35,6 +35,14 @@ - #include "v4l2_fmt.h" - #include "v4l2_m2m.h" - -+static void -+xlat_init(xlat_track_t * const x) -+{ -+ memset(x, 0, sizeof(*x)); -+ x->last_pts = AV_NOPTS_VALUE; -+} -+ -+ - static inline int v4l2_splane_video(struct v4l2_capability *cap) - { - if (cap->capabilities & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT) && -@@ -67,7 +75,9 @@ static int v4l2_prepare_contexts(V4L2m2mContext *s, int probe) - - s->capture.done = s->output.done = 0; - s->capture.name = "capture"; -+ s->capture.buf_mem = V4L2_MEMORY_MMAP; - s->output.name = "output"; -+ s->output.buf_mem = s->input_drm ? V4L2_MEMORY_DMABUF : V4L2_MEMORY_MMAP; - atomic_init(&s->refcount, 0); - sem_init(&s->refsync, 0, 0); - -@@ -334,35 +344,38 @@ int ff_v4l2_m2m_codec_init(V4L2m2mPriv *priv) - return v4l2_configure_contexts(s); - } - --int ff_v4l2_m2m_create_context(V4L2m2mPriv *priv, V4L2m2mContext **s) -+int ff_v4l2_m2m_create_context(V4L2m2mPriv *priv, V4L2m2mContext **pps) - { -- *s = av_mallocz(sizeof(V4L2m2mContext)); -- if (!*s) -+ V4L2m2mContext * const s = av_mallocz(sizeof(V4L2m2mContext)); -+ -+ *pps = NULL; -+ if (!s) - return AVERROR(ENOMEM); - -- priv->context_ref = av_buffer_create((uint8_t *) *s, sizeof(V4L2m2mContext), -+ priv->context_ref = av_buffer_create((uint8_t *)s, sizeof(*s), - &v4l2_m2m_destroy_context, NULL, 0); - if (!priv->context_ref) { -- av_freep(s); -+ av_free(s); - return AVERROR(ENOMEM); - } - - /* assign the context */ -- priv->context = *s; -- (*s)->priv = priv; -+ priv->context = s; -+ s->priv = priv; - - /* populate it */ -- priv->context->capture.num_buffers = priv->num_capture_buffers; -- priv->context->output.num_buffers = priv->num_output_buffers; -- priv->context->self_ref = priv->context_ref; -- priv->context->fd = -1; -+ s->capture.num_buffers = priv->num_capture_buffers; -+ s->output.num_buffers = priv->num_output_buffers; -+ s->self_ref = priv->context_ref; -+ s->fd = -1; -+ xlat_init(&s->xlat); - - priv->context->frame = av_frame_alloc(); - if (!priv->context->frame) { - av_buffer_unref(&priv->context_ref); -- *s = NULL; /* freed when unreferencing context_ref */ - return AVERROR(ENOMEM); - } - -+ *pps = s; - return 0; - } -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 19d618698d..d6cdaf65e1 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -103,6 +103,9 @@ typedef struct V4L2m2mContext { - /* generate DRM frames */ - int output_drm; - -+ /* input frames are drmprime */ -+ int input_drm; -+ - /* Frame tracking */ - xlat_track_t xlat; - int pending_hw; -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 7e17044706..fbbfc81342 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -169,96 +169,17 @@ static int v4l2_prepare_decoder(V4L2m2mContext *s) - return 0; - } - --static inline int64_t track_to_pts(AVCodecContext *avctx, unsigned int n) --{ -- return (int64_t)n; --} -- --static inline unsigned int pts_to_track(AVCodecContext *avctx, const int64_t pts) --{ -- return (unsigned int)pts; --} -- --// FFmpeg requires us to propagate a number of vars from the coded pkt into --// the decoded frame. The only thing that tracks like that in V4L2 stateful --// is timestamp. PTS maps to timestamp for this decode. FFmpeg makes no --// guarantees about PTS being unique or specified for every frame so replace --// the supplied PTS with a simple incrementing number and keep a circular --// buffer of all the things we want preserved (including the original PTS) --// indexed by the tracking no. - static void --xlat_pts_in(AVCodecContext *const avctx, xlat_track_t *const x, AVPacket *const avpkt) --{ -- int64_t track_pts; -- -- // Avoid 0 -- if (++x->track_no == 0) -- x->track_no = 1; -- -- track_pts = track_to_pts(avctx, x->track_no); -- -- av_log(avctx, AV_LOG_TRACE, "In PTS=%" PRId64 ", DTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", avpkt->pts, avpkt->dts, track_pts, x->track_no); -- x->last_pkt_dts = avpkt->dts; -- x->track_els[x->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ -- .discard = 0, -- .pending = 1, -- .pkt_size = avpkt->size, -- .pts = avpkt->pts, -- .dts = avpkt->dts, -- .reordered_opaque = avctx->reordered_opaque, -- .pkt_pos = avpkt->pos, -- .pkt_duration = avpkt->duration, -- .track_pts = track_pts -- }; -- avpkt->pts = track_pts; --} -- --// Returns -1 if we should discard the frame --static int --xlat_pts_out(AVCodecContext *const avctx, -- xlat_track_t * const x, -+set_best_effort_pts(AVCodecContext *const avctx, - pts_stats_t * const ps, - AVFrame *const frame) - { -- unsigned int n = pts_to_track(avctx, frame->pts) % FF_V4L2_M2M_TRACK_SIZE; -- V4L2m2mTrackEl *const t = x->track_els + n; -- if (frame->pts == AV_NOPTS_VALUE || frame->pts != t->track_pts) -- { -- av_log(avctx, AV_LOG_INFO, "Tracking failure: pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); -- frame->pts = AV_NOPTS_VALUE; -- frame->pkt_dts = x->last_pkt_dts; -- frame->reordered_opaque = x->last_opaque; -- frame->pkt_pos = -1; -- frame->pkt_duration = 0; -- frame->pkt_size = -1; -- } -- else if (!t->discard) -- { -- frame->pts = t->pending ? t->pts : AV_NOPTS_VALUE; -- frame->pkt_dts = x->last_pkt_dts; -- frame->reordered_opaque = t->reordered_opaque; -- frame->pkt_pos = t->pkt_pos; -- frame->pkt_duration = t->pkt_duration; -- frame->pkt_size = t->pkt_size; -- -- x->last_opaque = x->track_els[n].reordered_opaque; -- if (frame->pts != AV_NOPTS_VALUE) -- x->last_pts = frame->pts; -- t->pending = 0; -- } -- else -- { -- av_log(avctx, AV_LOG_DEBUG, "Discard frame (flushed): pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); -- return -1; -- } -- - pts_stats_add(ps, frame->pts); - - frame->best_effort_timestamp = pts_stats_guess(ps); - frame->pkt_dts = frame->pts; // We can't emulate what s/w does in a useful manner? -- av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 ", track=%"PRId64", n=%d\n", -- frame->pts, frame->best_effort_timestamp, frame->pkt_dts, t->track_pts, n); -- return 0; -+ av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 "\n", -+ frame->pts, frame->best_effort_timestamp, frame->pkt_dts); - } - - static void -@@ -272,13 +193,6 @@ xlat_flush(xlat_track_t * const x) - x->last_pts = AV_NOPTS_VALUE; - } - --static void --xlat_init(xlat_track_t * const x) --{ -- memset(x, 0, sizeof(*x)); -- x->last_pts = AV_NOPTS_VALUE; --} -- - static int - xlat_pending(const xlat_track_t * const x) - { -@@ -419,8 +333,6 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - av_log(avctx, AV_LOG_ERROR, "Failed to get coded packet: err=%d\n", ret); - return ret; - } -- -- xlat_pts_in(avctx, &s->xlat, &s->buf_pkt); - } - - if (s->draining) { -@@ -542,49 +454,47 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - prefer_dq ? 5 : - src_rv == NQ_Q_FULL ? -1 : 0; - -- do { -- // Dequeue frame will unref any previous contents of frame -- // if it returns success so we don't need an explicit unref -- // when discarding -- // This returns AVERROR(EAGAIN) on timeout or if -- // there is room in the input Q and timeout == -1 -- dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, t); -- -- // Failure due to no buffer in Q? -- if (dst_rv == AVERROR(ENOSPC)) { -- // Wait & retry -- if ((dst_rv = qbuf_wait(avctx, &s->capture)) == 0) { -- dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, t); -- } -+ // Dequeue frame will unref any previous contents of frame -+ // if it returns success so we don't need an explicit unref -+ // when discarding -+ // This returns AVERROR(EAGAIN) on timeout or if -+ // there is room in the input Q and timeout == -1 -+ dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, t); -+ -+ // Failure due to no buffer in Q? -+ if (dst_rv == AVERROR(ENOSPC)) { -+ // Wait & retry -+ if ((dst_rv = qbuf_wait(avctx, &s->capture)) == 0) { -+ dst_rv = ff_v4l2_context_dequeue_frame(&s->capture, frame, t); - } -+ } -+ -+ // Adjust dynamic pending threshold -+ if (dst_rv == 0) { -+ if (--s->pending_hw < PENDING_HW_MIN) -+ s->pending_hw = PENDING_HW_MIN; -+ s->pending_n = 0; - -- // Adjust dynamic pending threshold -- if (dst_rv == 0) { -- if (--s->pending_hw < PENDING_HW_MIN) -- s->pending_hw = PENDING_HW_MIN; -+ set_best_effort_pts(avctx, &s->pts_stat, frame); -+ } -+ else if (dst_rv == AVERROR(EAGAIN)) { -+ if (prefer_dq && ++s->pending_n > PENDING_N_THRESHOLD) { -+ s->pending_hw = pending * 16 + PENDING_HW_OFFSET; - s->pending_n = 0; - } -- else if (dst_rv == AVERROR(EAGAIN)) { -- if (prefer_dq && ++s->pending_n > PENDING_N_THRESHOLD) { -- s->pending_hw = pending * 16 + PENDING_HW_OFFSET; -- s->pending_n = 0; -- } -- } -+ } - -- if (dst_rv == AVERROR(EAGAIN) && src_rv == NQ_DRAINING) { -- av_log(avctx, AV_LOG_WARNING, "Timeout in drain - assume EOF"); -- dst_rv = AVERROR_EOF; -- s->capture.done = 1; -- } -- else if (dst_rv == AVERROR_EOF && (s->draining || s->capture.done)) -- av_log(avctx, AV_LOG_DEBUG, "Dequeue EOF: draining=%d, cap.done=%d\n", -- s->draining, s->capture.done); -- else if (dst_rv && dst_rv != AVERROR(EAGAIN)) -- av_log(avctx, AV_LOG_ERROR, "Packet dequeue failure: draining=%d, cap.done=%d, err=%d\n", -- s->draining, s->capture.done, dst_rv); -- -- // Go again if we got a frame that we need to discard -- } while (dst_rv == 0 && xlat_pts_out(avctx, &s->xlat, &s->pts_stat, frame)); -+ if (dst_rv == AVERROR(EAGAIN) && src_rv == NQ_DRAINING) { -+ av_log(avctx, AV_LOG_WARNING, "Timeout in drain - assume EOF"); -+ dst_rv = AVERROR_EOF; -+ s->capture.done = 1; -+ } -+ else if (dst_rv == AVERROR_EOF && (s->draining || s->capture.done)) -+ av_log(avctx, AV_LOG_DEBUG, "Dequeue EOF: draining=%d, cap.done=%d\n", -+ s->draining, s->capture.done); -+ else if (dst_rv && dst_rv != AVERROR(EAGAIN)) -+ av_log(avctx, AV_LOG_ERROR, "Packet dequeue failure: draining=%d, cap.done=%d, err=%d\n", -+ s->draining, s->capture.done, dst_rv); - } - - ++i; -@@ -791,7 +701,6 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - if (ret < 0) - return ret; - -- xlat_init(&s->xlat); - pts_stats_init(&s->pts_stat, avctx, "decoder"); - s->pending_hw = PENDING_HW_MIN; - -@@ -810,12 +719,10 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - output->av_codec_id = avctx->codec_id; - output->av_pix_fmt = AV_PIX_FMT_NONE; - output->min_buf_size = max_coded_size(avctx); -- output->no_pts_rescale = 1; - - capture->av_codec_id = AV_CODEC_ID_RAWVIDEO; - capture->av_pix_fmt = avctx->pix_fmt; - capture->min_buf_size = 0; -- capture->no_pts_rescale = 1; - - /* the client requests the codec to generate DRM frames: - * - data[0] will therefore point to the returned AVDRMFrameDescriptor -diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c -index 9a0837ecf3..05ff6ba726 100644 ---- a/libavcodec/v4l2_m2m_enc.c -+++ b/libavcodec/v4l2_m2m_enc.c -@@ -24,6 +24,8 @@ - #include - #include - #include -+#include -+ - #include "encode.h" - #include "libavcodec/avcodec.h" - #include "libavutil/pixdesc.h" -@@ -38,6 +40,34 @@ - #define MPEG_CID(x) V4L2_CID_MPEG_VIDEO_##x - #define MPEG_VIDEO(x) V4L2_MPEG_VIDEO_##x - -+// P030 should be defined in drm_fourcc.h and hopefully will be sometime -+// in the future but until then... -+#ifndef DRM_FORMAT_P030 -+#define DRM_FORMAT_P030 fourcc_code('P', '0', '3', '0') -+#endif -+ -+#ifndef DRM_FORMAT_NV15 -+#define DRM_FORMAT_NV15 fourcc_code('N', 'V', '1', '5') -+#endif -+ -+#ifndef DRM_FORMAT_NV20 -+#define DRM_FORMAT_NV20 fourcc_code('N', 'V', '2', '0') -+#endif -+ -+#ifndef V4L2_CID_CODEC_BASE -+#define V4L2_CID_CODEC_BASE V4L2_CID_MPEG_BASE -+#endif -+ -+// V4L2_PIX_FMT_NV12_10_COL128 and V4L2_PIX_FMT_NV12_COL128 should be defined -+// in videodev2.h hopefully will be sometime in the future but until then... -+#ifndef V4L2_PIX_FMT_NV12_10_COL128 -+#define V4L2_PIX_FMT_NV12_10_COL128 v4l2_fourcc('N', 'C', '3', '0') -+#endif -+ -+#ifndef V4L2_PIX_FMT_NV12_COL128 -+#define V4L2_PIX_FMT_NV12_COL128 v4l2_fourcc('N', 'C', '1', '2') /* 12 Y/CbCr 4:2:0 128 pixel wide column */ -+#endif -+ - static inline void v4l2_set_timeperframe(V4L2m2mContext *s, unsigned int num, unsigned int den) - { - struct v4l2_streamparm parm = { 0 }; -@@ -148,15 +178,14 @@ static inline int v4l2_mpeg4_profile_from_ff(int p) - static int v4l2_check_b_frame_support(V4L2m2mContext *s) - { - if (s->avctx->max_b_frames) -- av_log(s->avctx, AV_LOG_WARNING, "Encoder does not support b-frames yet\n"); -+ av_log(s->avctx, AV_LOG_WARNING, "Encoder does not support %d b-frames yet\n", s->avctx->max_b_frames); - -- v4l2_set_ext_ctrl(s, MPEG_CID(B_FRAMES), 0, "number of B-frames", 0); -+ v4l2_set_ext_ctrl(s, MPEG_CID(B_FRAMES), s->avctx->max_b_frames, "number of B-frames", 1); - v4l2_get_ext_ctrl(s, MPEG_CID(B_FRAMES), &s->avctx->max_b_frames, "number of B-frames", 0); - if (s->avctx->max_b_frames == 0) - return 0; - - avpriv_report_missing_feature(s->avctx, "DTS/PTS calculation for V4L2 encoding"); -- - return AVERROR_PATCHWELCOME; - } - -@@ -271,13 +300,184 @@ static int v4l2_prepare_encoder(V4L2m2mContext *s) - return 0; - } - -+static int avdrm_to_v4l2(struct v4l2_format * const format, const AVFrame * const frame) -+{ -+ const AVDRMFrameDescriptor *const src = (const AVDRMFrameDescriptor *)frame->data[0]; -+ -+ const uint32_t drm_fmt = src->layers[0].format; -+ // Treat INVALID as LINEAR -+ const uint64_t mod = src->objects[0].format_modifier == DRM_FORMAT_MOD_INVALID ? -+ DRM_FORMAT_MOD_LINEAR : src->objects[0].format_modifier; -+ uint32_t pix_fmt = 0; -+ uint32_t w = 0; -+ uint32_t h = 0; -+ uint32_t bpl = src->layers[0].planes[0].pitch; -+ -+ // We really don't expect multiple layers -+ // All formats that we currently cope with are single object -+ -+ if (src->nb_layers != 1 || src->nb_objects != 1) -+ return AVERROR(EINVAL); -+ -+ switch (drm_fmt) { -+ case DRM_FORMAT_YUV420: -+ if (mod == DRM_FORMAT_MOD_LINEAR) { -+ if (src->layers[0].nb_planes != 3) -+ break; -+ pix_fmt = V4L2_PIX_FMT_YUV420; -+ h = src->layers[0].planes[1].offset / bpl; -+ w = bpl; -+ } -+ break; -+ -+ case DRM_FORMAT_NV12: -+ if (mod == DRM_FORMAT_MOD_LINEAR) { -+ if (src->layers[0].nb_planes != 2) -+ break; -+ pix_fmt = V4L2_PIX_FMT_NV12; -+ h = src->layers[0].planes[1].offset / bpl; -+ w = bpl; -+ } -+ else if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { -+ if (src->layers[0].nb_planes != 2) -+ break; -+ pix_fmt = V4L2_PIX_FMT_NV12_COL128; -+ w = bpl; -+ h = src->layers[0].planes[1].offset / 128; -+ bpl = fourcc_mod_broadcom_param(mod); -+ } -+ break; -+ -+ case DRM_FORMAT_P030: -+ if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { -+ if (src->layers[0].nb_planes != 2) -+ break; -+ pix_fmt = V4L2_PIX_FMT_NV12_10_COL128; -+ w = bpl / 2; // Matching lie to how we construct this -+ h = src->layers[0].planes[1].offset / 128; -+ bpl = fourcc_mod_broadcom_param(mod); -+ } -+ break; -+ -+ default: -+ break; -+ } -+ -+ if (!pix_fmt) -+ return AVERROR(EINVAL); -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(format->type)) { -+ struct v4l2_pix_format_mplane *const pix = &format->fmt.pix_mp; -+ -+ pix->width = w; -+ pix->height = h; -+ pix->pixelformat = pix_fmt; -+ pix->plane_fmt[0].bytesperline = bpl; -+ pix->num_planes = 1; -+ } -+ else { -+ struct v4l2_pix_format *const pix = &format->fmt.pix; -+ -+ pix->width = w; -+ pix->height = h; -+ pix->pixelformat = pix_fmt; -+ pix->bytesperline = bpl; -+ } -+ -+ return 0; -+} -+ -+// Do we have similar enough formats to be usable? -+static int fmt_eq(const struct v4l2_format * const a, const struct v4l2_format * const b) -+{ -+ if (a->type != b->type) -+ return 0; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(a->type)) { -+ const struct v4l2_pix_format_mplane *const pa = &a->fmt.pix_mp; -+ const struct v4l2_pix_format_mplane *const pb = &b->fmt.pix_mp; -+ unsigned int i; -+ if (pa->pixelformat != pb->pixelformat || -+ pa->num_planes != pb->num_planes) -+ return 0; -+ for (i = 0; i != pa->num_planes; ++i) { -+ if (pa->plane_fmt[i].bytesperline != pb->plane_fmt[i].bytesperline) -+ return 0; -+ } -+ } -+ else { -+ const struct v4l2_pix_format *const pa = &a->fmt.pix; -+ const struct v4l2_pix_format *const pb = &b->fmt.pix; -+ if (pa->pixelformat != pb->pixelformat || -+ pa->bytesperline != pb->bytesperline) -+ return 0; -+ } -+ return 1; -+} -+ -+ - static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame) - { - V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; - V4L2Context *const output = &s->output; - -+ // Signal EOF if needed -+ if (!frame) { -+ return ff_v4l2_context_enqueue_frame(output, frame); -+ } -+ -+ if (s->input_drm && !output->streamon) { -+ int rv; -+ struct v4l2_format req_format = {.type = output->format.type}; -+ -+ // Set format when we first get a buffer -+ if ((rv = avdrm_to_v4l2(&req_format, frame)) != 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to get V4L2 format from DRM_PRIME frame\n"); -+ return rv; -+ } -+ -+ ff_v4l2_context_release(output); -+ -+ output->format = req_format; -+ -+ if ((rv = ff_v4l2_context_set_format(output)) != 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to set V4L2 format\n"); -+ return rv; -+ } -+ -+ if (!fmt_eq(&req_format, &output->format)) { -+ av_log(avctx, AV_LOG_ERROR, "Format mismatch after setup\n"); -+ return AVERROR(EINVAL); -+ } -+ -+ output->selection.top = frame->crop_top; -+ output->selection.left = frame->crop_left; -+ output->selection.width = av_frame_cropped_width(frame); -+ output->selection.height = av_frame_cropped_height(frame); -+ -+ if ((rv = ff_v4l2_context_init(output)) != 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to (re)init context\n"); -+ return rv; -+ } -+ -+ { -+ struct v4l2_selection selection = { -+ .type = V4L2_BUF_TYPE_VIDEO_OUTPUT, -+ .target = V4L2_SEL_TGT_CROP, -+ .r = output->selection -+ }; -+ if (ioctl(s->fd, VIDIOC_S_SELECTION, &selection) != 0) { -+ av_log(avctx, AV_LOG_WARNING, "S_SELECTION (CROP) %dx%d @ %d,%d failed: %s\n", -+ selection.r.width, selection.r.height, selection.r.left, selection.r.top, -+ av_err2str(AVERROR(errno))); -+ } -+ av_log(avctx, AV_LOG_TRACE, "S_SELECTION (CROP) %dx%d @ %d,%d OK\n", -+ selection.r.width, selection.r.height, selection.r.left, selection.r.top); -+ } -+ } -+ - #ifdef V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME -- if (frame && frame->pict_type == AV_PICTURE_TYPE_I) -+ if (frame->pict_type == AV_PICTURE_TYPE_I) - v4l2_set_ext_ctrl(s, MPEG_CID(FORCE_KEY_FRAME), 0, "force key frame", 1); - #endif - -@@ -328,7 +528,70 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) - } - - dequeue: -- return ff_v4l2_context_dequeue_packet(capture, avpkt); -+ if ((ret = ff_v4l2_context_dequeue_packet(capture, avpkt)) != 0) -+ return ret; -+ -+ if (capture->first_buf == 1) { -+ uint8_t * data; -+ const int len = avpkt->size; -+ -+ // 1st buffer after streamon should be SPS/PPS -+ capture->first_buf = 2; -+ -+ // Clear both possible stores so there is no chance of confusion -+ av_freep(&s->extdata_data); -+ s->extdata_size = 0; -+ av_freep(&avctx->extradata); -+ avctx->extradata_size = 0; -+ -+ if ((data = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE)) != NULL) -+ memcpy(data, avpkt->data, len); -+ -+ av_packet_unref(avpkt); -+ -+ if (data == NULL) -+ return AVERROR(ENOMEM); -+ -+ // We need to copy the header, but keep local if not global -+ if ((avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) != 0) { -+ avctx->extradata = data; -+ avctx->extradata_size = len; -+ } -+ else { -+ s->extdata_data = data; -+ s->extdata_size = len; -+ } -+ -+ if ((ret = ff_v4l2_context_dequeue_packet(capture, avpkt)) != 0) -+ return ret; -+ } -+ -+ // First frame must be key so mark as such even if encoder forgot -+ if (capture->first_buf == 2) -+ avpkt->flags |= AV_PKT_FLAG_KEY; -+ -+ // Add SPS/PPS to the start of every key frame if non-global headers -+ if ((avpkt->flags & AV_PKT_FLAG_KEY) != 0 && s->extdata_size != 0) { -+ const size_t newlen = s->extdata_size + avpkt->size; -+ AVBufferRef * const buf = av_buffer_alloc(newlen + AV_INPUT_BUFFER_PADDING_SIZE); -+ -+ if (buf == NULL) { -+ av_packet_unref(avpkt); -+ return AVERROR(ENOMEM); -+ } -+ -+ memcpy(buf->data, s->extdata_data, s->extdata_size); -+ memcpy(buf->data + s->extdata_size, avpkt->data, avpkt->size); -+ -+ av_buffer_unref(&avpkt->buf); -+ avpkt->buf = buf; -+ avpkt->data = buf->data; -+ avpkt->size = newlen; -+ } -+ -+// av_log(avctx, AV_LOG_INFO, "%s: PTS out=%"PRId64", size=%d, ret=%d\n", __func__, avpkt->pts, avpkt->size, ret); -+ capture->first_buf = 0; -+ return 0; - } - - static av_cold int v4l2_encode_init(AVCodecContext *avctx) -@@ -340,6 +603,8 @@ static av_cold int v4l2_encode_init(AVCodecContext *avctx) - uint32_t v4l2_fmt_output; - int ret; - -+ av_log(avctx, AV_LOG_INFO, " <<< %s: fmt=%d/%d\n", __func__, avctx->pix_fmt, avctx->sw_pix_fmt); -+ - ret = ff_v4l2_m2m_create_context(priv, &s); - if (ret < 0) - return ret; -@@ -347,13 +612,17 @@ static av_cold int v4l2_encode_init(AVCodecContext *avctx) - capture = &s->capture; - output = &s->output; - -+ s->input_drm = (avctx->pix_fmt == AV_PIX_FMT_DRM_PRIME); -+ - /* common settings output/capture */ - output->height = capture->height = avctx->height; - output->width = capture->width = avctx->width; - - /* output context */ - output->av_codec_id = AV_CODEC_ID_RAWVIDEO; -- output->av_pix_fmt = avctx->pix_fmt; -+ output->av_pix_fmt = !s->input_drm ? avctx->pix_fmt : -+ avctx->sw_pix_fmt != AV_PIX_FMT_NONE ? avctx->sw_pix_fmt : -+ AV_PIX_FMT_YUV420P; - - /* capture context */ - capture->av_codec_id = avctx->codec_id; -@@ -372,7 +641,7 @@ static av_cold int v4l2_encode_init(AVCodecContext *avctx) - v4l2_fmt_output = output->format.fmt.pix.pixelformat; - - pix_fmt_output = ff_v4l2_format_v4l2_to_avfmt(v4l2_fmt_output, AV_CODEC_ID_RAWVIDEO); -- if (pix_fmt_output != avctx->pix_fmt) { -+ if (!s->input_drm && pix_fmt_output != avctx->pix_fmt) { - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt_output); - av_log(avctx, AV_LOG_ERROR, "Encoder requires %s pixel format.\n", desc->name); - return AVERROR(EINVAL); - -From 6b437ce70582c67971aa81871a6694a08b709784 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 8 Jun 2022 16:13:31 +0000 -Subject: [PATCH 055/151] v4l2_m2m_dec: Use DTS for best effort PTS if PTS is - always NO_PTS - -If we do have DTS but don't have PTS then assume PTS=DTS. -Also get rid of last_dts from tracking as its info wasn't actually -useful in any way. ---- - libavcodec/v4l2_context.c | 6 ++---- - libavcodec/v4l2_m2m.h | 1 - - libavcodec/v4l2_m2m_dec.c | 8 +++++++- - 3 files changed, 9 insertions(+), 6 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 7a707d21fc..6b97eab41e 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -73,7 +73,6 @@ xlat_pts_pkt_in(AVCodecContext *const avctx, xlat_track_t *const x, const AVPack - track_pts = track_to_pts(avctx, x->track_no); - - av_log(avctx, AV_LOG_TRACE, "In pkt PTS=%" PRId64 ", DTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", avpkt->pts, avpkt->dts, track_pts, x->track_no); -- x->last_pkt_dts = avpkt->dts; - x->track_els[x->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ - .discard = 0, - .pending = 1, -@@ -100,7 +99,6 @@ xlat_pts_frame_in(AVCodecContext *const avctx, xlat_track_t *const x, const AVFr - track_pts = track_to_pts(avctx, x->track_no); - - av_log(avctx, AV_LOG_TRACE, "In frame PTS=%" PRId64 ", track=%" PRId64 ", n=%u\n", frame->pts, track_pts, x->track_no); -- x->last_pkt_dts = frame->pkt_dts; - x->track_els[x->track_no % FF_V4L2_M2M_TRACK_SIZE] = (V4L2m2mTrackEl){ - .discard = 0, - .pending = 1, -@@ -129,7 +127,7 @@ xlat_pts_frame_out(AVCodecContext *const avctx, - av_log(avctx, frame->pts == AV_NOPTS_VALUE ? AV_LOG_DEBUG : AV_LOG_WARNING, - "Frame tracking failure: pts=%" PRId64 ", track[%d]=%" PRId64 "\n", frame->pts, n, t->track_pts); - frame->pts = AV_NOPTS_VALUE; -- frame->pkt_dts = x->last_pkt_dts; -+ frame->pkt_dts = AV_NOPTS_VALUE; - frame->reordered_opaque = x->last_opaque; - frame->pkt_pos = -1; - frame->pkt_duration = 0; -@@ -138,7 +136,7 @@ xlat_pts_frame_out(AVCodecContext *const avctx, - else if (!t->discard) - { - frame->pts = t->pending ? t->pts : AV_NOPTS_VALUE; -- frame->pkt_dts = x->last_pkt_dts; -+ frame->pkt_dts = t->dts; - frame->reordered_opaque = t->reordered_opaque; - frame->pkt_pos = t->pkt_pos; - frame->pkt_duration = t->pkt_duration; -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index d6cdaf65e1..ee72beb052 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -67,7 +67,6 @@ typedef struct pts_stats_s - typedef struct xlat_track_s { - unsigned int track_no; - int64_t last_pts; -- int64_t last_pkt_dts; - int64_t last_opaque; - V4L2m2mTrackEl track_els[FF_V4L2_M2M_TRACK_SIZE]; - } xlat_track_t; -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index fbbfc81342..485a96f4b4 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -177,7 +177,13 @@ set_best_effort_pts(AVCodecContext *const avctx, - pts_stats_add(ps, frame->pts); - - frame->best_effort_timestamp = pts_stats_guess(ps); -- frame->pkt_dts = frame->pts; // We can't emulate what s/w does in a useful manner? -+ // If we can't guess from just PTS - try DTS -+ if (frame->best_effort_timestamp == AV_NOPTS_VALUE) -+ frame->best_effort_timestamp = frame->pkt_dts; -+ -+ // We can't emulate what s/w does in a useful manner and using the -+ // "correct" answer seems to just confuse things. -+ frame->pkt_dts = frame->pts; - av_log(avctx, AV_LOG_TRACE, "Out PTS=%" PRId64 "/%"PRId64", DTS=%" PRId64 "\n", - frame->pts, frame->best_effort_timestamp, frame->pkt_dts); - } - -From ec8d1c2c0b6bd3544e5e30500a167fc31abde17a Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 30 Jun 2022 15:59:23 +0000 -Subject: [PATCH 056/151] v4l2: Update H265 request for current API - -This works with v9 of the H265 patch set which hopefully will be the -last one. Hevc controls extracted from patched v4l2-controls into -hevc-ctrls-v4 - if HEVC controls found in the system v4l2-controls then -those will be used instead. ---- - libavcodec/Makefile | 2 +- - libavcodec/hevc-ctrls-v4.h | 515 +++++++++++++++++++++++++++++++++ - libavcodec/v4l2_req_hevc_v4.c | 3 + - libavcodec/v4l2_req_hevc_vx.c | 81 ++++-- - libavcodec/v4l2_request_hevc.c | 6 +- - libavcodec/v4l2_request_hevc.h | 1 + - 6 files changed, 583 insertions(+), 25 deletions(-) - create mode 100644 libavcodec/hevc-ctrls-v4.h - create mode 100644 libavcodec/v4l2_req_hevc_v4.c - -diff --git a/libavcodec/Makefile b/libavcodec/Makefile -index 2b3c16185d..d433a71236 100644 ---- a/libavcodec/Makefile -+++ b/libavcodec/Makefile -@@ -1000,7 +1000,7 @@ OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o - OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o - OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o - OBJS-$(CONFIG_HEVC_V4L2REQUEST_HWACCEL) += v4l2_request_hevc.o v4l2_req_decode_q.o\ -- v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o v4l2_req_hevc_v3.o -+ v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o v4l2_req_hevc_v3.o v4l2_req_hevc_v4.o - OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o - OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o - OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o -diff --git a/libavcodec/hevc-ctrls-v4.h b/libavcodec/hevc-ctrls-v4.h -new file mode 100644 -index 0000000000..7e05f6e7c3 ---- /dev/null -+++ b/libavcodec/hevc-ctrls-v4.h -@@ -0,0 +1,515 @@ -+/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR BSD-3-Clause) */ -+/* -+ * Video for Linux Two controls header file -+ * -+ * Copyright (C) 1999-2012 the contributors -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * Alternatively you can redistribute this file under the terms of the -+ * BSD license as stated below: -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in -+ * the documentation and/or other materials provided with the -+ * distribution. -+ * 3. The names of its contributors may not be used to endorse or promote -+ * products derived from this software without specific prior written -+ * permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -+ * -+ * The contents of this header was split off from videodev2.h. All control -+ * definitions should be added to this header, which is included by -+ * videodev2.h. -+ */ -+ -+#ifndef AVCODEC_HEVC_CTRLS_V4_H -+#define AVCODEC_HEVC_CTRLS_V4_H -+ -+#include -+#include -+ -+#define V4L2_CID_STATELESS_HEVC_SPS (V4L2_CID_CODEC_STATELESS_BASE + 400) -+#define V4L2_CID_STATELESS_HEVC_PPS (V4L2_CID_CODEC_STATELESS_BASE + 401) -+#define V4L2_CID_STATELESS_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 402) -+#define V4L2_CID_STATELESS_HEVC_SCALING_MATRIX (V4L2_CID_CODEC_STATELESS_BASE + 403) -+#define V4L2_CID_STATELESS_HEVC_DECODE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 404) -+#define V4L2_CID_STATELESS_HEVC_DECODE_MODE (V4L2_CID_CODEC_STATELESS_BASE + 405) -+#define V4L2_CID_STATELESS_HEVC_START_CODE (V4L2_CID_CODEC_STATELESS_BASE + 406) -+#define V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS (V4L2_CID_CODEC_STATELESS_BASE + 407) -+ -+enum v4l2_stateless_hevc_decode_mode { -+ V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED, -+ V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED, -+}; -+ -+enum v4l2_stateless_hevc_start_code { -+ V4L2_STATELESS_HEVC_START_CODE_NONE, -+ V4L2_STATELESS_HEVC_START_CODE_ANNEX_B, -+}; -+ -+#define V4L2_HEVC_SLICE_TYPE_B 0 -+#define V4L2_HEVC_SLICE_TYPE_P 1 -+#define V4L2_HEVC_SLICE_TYPE_I 2 -+ -+#define V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE (1ULL << 0) -+#define V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED (1ULL << 1) -+#define V4L2_HEVC_SPS_FLAG_AMP_ENABLED (1ULL << 2) -+#define V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET (1ULL << 3) -+#define V4L2_HEVC_SPS_FLAG_PCM_ENABLED (1ULL << 4) -+#define V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED (1ULL << 5) -+#define V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT (1ULL << 6) -+#define V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED (1ULL << 7) -+#define V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED (1ULL << 8) -+ -+/** -+ * struct v4l2_ctrl_hevc_sps - ITU-T Rec. H.265: Sequence parameter set -+ * -+ * @video_parameter_set_id: specifies the value of the -+ * vps_video_parameter_set_id of the active VPS -+ * @seq_parameter_set_id: provides an identifier for the SPS for -+ * reference by other syntax elements -+ * @pic_width_in_luma_samples: specifies the width of each decoded picture -+ * in units of luma samples -+ * @pic_height_in_luma_samples: specifies the height of each decoded picture -+ * in units of luma samples -+ * @bit_depth_luma_minus8: this value plus 8specifies the bit depth of the -+ * samples of the luma array -+ * @bit_depth_chroma_minus8: this value plus 8 specifies the bit depth of the -+ * samples of the chroma arrays -+ * @log2_max_pic_order_cnt_lsb_minus4: this value plus 4 specifies the value of -+ * the variable MaxPicOrderCntLsb -+ * @sps_max_dec_pic_buffering_minus1: this value plus 1 specifies the maximum -+ * required size of the decoded picture -+ * buffer for the codec video sequence -+ * @sps_max_num_reorder_pics: indicates the maximum allowed number of pictures -+ * @sps_max_latency_increase_plus1: not equal to 0 is used to compute the -+ * value of SpsMaxLatencyPictures array -+ * @log2_min_luma_coding_block_size_minus3: plus 3 specifies the minimum -+ * luma coding block size -+ * @log2_diff_max_min_luma_coding_block_size: specifies the difference between -+ * the maximum and minimum luma -+ * coding block size -+ * @log2_min_luma_transform_block_size_minus2: plus 2 specifies the minimum luma -+ * transform block size -+ * @log2_diff_max_min_luma_transform_block_size: specifies the difference between -+ * the maximum and minimum luma -+ * transform block size -+ * @max_transform_hierarchy_depth_inter: specifies the maximum hierarchy -+ * depth for transform units of -+ * coding units coded in inter -+ * prediction mode -+ * @max_transform_hierarchy_depth_intra: specifies the maximum hierarchy -+ * depth for transform units of -+ * coding units coded in intra -+ * prediction mode -+ * @pcm_sample_bit_depth_luma_minus1: this value plus 1 specifies the number of -+ * bits used to represent each of PCM sample -+ * values of the luma component -+ * @pcm_sample_bit_depth_chroma_minus1: this value plus 1 specifies the number -+ * of bits used to represent each of PCM -+ * sample values of the chroma components -+ * @log2_min_pcm_luma_coding_block_size_minus3: this value plus 3 specifies the -+ * minimum size of coding blocks -+ * @log2_diff_max_min_pcm_luma_coding_block_size: specifies the difference between -+ * the maximum and minimum size of -+ * coding blocks -+ * @num_short_term_ref_pic_sets: specifies the number of st_ref_pic_set() -+ * syntax structures included in the SPS -+ * @num_long_term_ref_pics_sps: specifies the number of candidate long-term -+ * reference pictures that are specified in the SPS -+ * @chroma_format_idc: specifies the chroma sampling -+ * @sps_max_sub_layers_minus1: this value plus 1 specifies the maximum number -+ * of temporal sub-layers -+ * @reserved: padding field. Should be zeroed by applications. -+ * @flags: see V4L2_HEVC_SPS_FLAG_{} -+ */ -+struct v4l2_ctrl_hevc_sps { -+ __u8 video_parameter_set_id; -+ __u8 seq_parameter_set_id; -+ __u16 pic_width_in_luma_samples; -+ __u16 pic_height_in_luma_samples; -+ __u8 bit_depth_luma_minus8; -+ __u8 bit_depth_chroma_minus8; -+ __u8 log2_max_pic_order_cnt_lsb_minus4; -+ __u8 sps_max_dec_pic_buffering_minus1; -+ __u8 sps_max_num_reorder_pics; -+ __u8 sps_max_latency_increase_plus1; -+ __u8 log2_min_luma_coding_block_size_minus3; -+ __u8 log2_diff_max_min_luma_coding_block_size; -+ __u8 log2_min_luma_transform_block_size_minus2; -+ __u8 log2_diff_max_min_luma_transform_block_size; -+ __u8 max_transform_hierarchy_depth_inter; -+ __u8 max_transform_hierarchy_depth_intra; -+ __u8 pcm_sample_bit_depth_luma_minus1; -+ __u8 pcm_sample_bit_depth_chroma_minus1; -+ __u8 log2_min_pcm_luma_coding_block_size_minus3; -+ __u8 log2_diff_max_min_pcm_luma_coding_block_size; -+ __u8 num_short_term_ref_pic_sets; -+ __u8 num_long_term_ref_pics_sps; -+ __u8 chroma_format_idc; -+ __u8 sps_max_sub_layers_minus1; -+ -+ __u8 reserved[6]; -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT_ENABLED (1ULL << 0) -+#define V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT (1ULL << 1) -+#define V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED (1ULL << 2) -+#define V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT (1ULL << 3) -+#define V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED (1ULL << 4) -+#define V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED (1ULL << 5) -+#define V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED (1ULL << 6) -+#define V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT (1ULL << 7) -+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED (1ULL << 8) -+#define V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED (1ULL << 9) -+#define V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED (1ULL << 10) -+#define V4L2_HEVC_PPS_FLAG_TILES_ENABLED (1ULL << 11) -+#define V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED (1ULL << 12) -+#define V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED (1ULL << 13) -+#define V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED (1ULL << 14) -+#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED (1ULL << 15) -+#define V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER (1ULL << 16) -+#define V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT (1ULL << 17) -+#define V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT (1ULL << 18) -+#define V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT (1ULL << 19) -+#define V4L2_HEVC_PPS_FLAG_UNIFORM_SPACING (1ULL << 20) -+ -+/** -+ * struct v4l2_ctrl_hevc_pps - ITU-T Rec. H.265: Picture parameter set -+ * -+ * @pic_parameter_set_id: identifies the PPS for reference by other -+ * syntax elements -+ * @num_extra_slice_header_bits: specifies the number of extra slice header -+ * bits that are present in the slice header RBSP -+ * for coded pictures referring to the PPS. -+ * @num_ref_idx_l0_default_active_minus1: this value plus 1 specifies the -+ * inferred value of num_ref_idx_l0_active_minus1 -+ * @num_ref_idx_l1_default_active_minus1: this value plus 1 specifies the -+ * inferred value of num_ref_idx_l1_active_minus1 -+ * @init_qp_minus26: this value plus 26 specifies the initial value of SliceQp Y for -+ * each slice referring to the PPS -+ * @diff_cu_qp_delta_depth: specifies the difference between the luma coding -+ * tree block size and the minimum luma coding block -+ * size of coding units that convey cu_qp_delta_abs -+ * and cu_qp_delta_sign_flag -+ * @pps_cb_qp_offset: specify the offsets to the luma quantization parameter Cb -+ * @pps_cr_qp_offset: specify the offsets to the luma quantization parameter Cr -+ * @num_tile_columns_minus1: this value plus 1 specifies the number of tile columns -+ * partitioning the picture -+ * @num_tile_rows_minus1: this value plus 1 specifies the number of tile rows partitioning -+ * the picture -+ * @column_width_minus1: this value plus 1 specifies the width of the each tile column in -+ * units of coding tree blocks -+ * @row_height_minus1: this value plus 1 specifies the height of the each tile row in -+ * units of coding tree blocks -+ * @pps_beta_offset_div2: specify the default deblocking parameter offsets for -+ * beta divided by 2 -+ * @pps_tc_offset_div2: specify the default deblocking parameter offsets for tC -+ * divided by 2 -+ * @log2_parallel_merge_level_minus2: this value plus 2 specifies the value of -+ * the variable Log2ParMrgLevel -+ * @reserved: padding field. Should be zeroed by applications. -+ * @flags: see V4L2_HEVC_PPS_FLAG_{} -+ */ -+struct v4l2_ctrl_hevc_pps { -+ __u8 pic_parameter_set_id; -+ __u8 num_extra_slice_header_bits; -+ __u8 num_ref_idx_l0_default_active_minus1; -+ __u8 num_ref_idx_l1_default_active_minus1; -+ __s8 init_qp_minus26; -+ __u8 diff_cu_qp_delta_depth; -+ __s8 pps_cb_qp_offset; -+ __s8 pps_cr_qp_offset; -+ __u8 num_tile_columns_minus1; -+ __u8 num_tile_rows_minus1; -+ __u8 column_width_minus1[20]; -+ __u8 row_height_minus1[22]; -+ __s8 pps_beta_offset_div2; -+ __s8 pps_tc_offset_div2; -+ __u8 log2_parallel_merge_level_minus2; -+ __u8 reserved; -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_DPB_ENTRY_LONG_TERM_REFERENCE 0x01 -+ -+#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME 0 -+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_FIELD 1 -+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_FIELD 2 -+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_BOTTOM 3 -+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_TOP 4 -+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_BOTTOM_TOP 5 -+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM 6 -+#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME_DOUBLING 7 -+#define V4L2_HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING 8 -+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_PAIRED_PREVIOUS_BOTTOM 9 -+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_PAIRED_PREVIOUS_TOP 10 -+#define V4L2_HEVC_SEI_PIC_STRUCT_TOP_PAIRED_NEXT_BOTTOM 11 -+#define V4L2_HEVC_SEI_PIC_STRUCT_BOTTOM_PAIRED_NEXT_TOP 12 -+ -+#define V4L2_HEVC_DPB_ENTRIES_NUM_MAX 16 -+ -+/** -+ * struct v4l2_hevc_dpb_entry - HEVC decoded picture buffer entry -+ * -+ * @timestamp: timestamp of the V4L2 capture buffer to use as reference. -+ * @flags: long term flag for the reference frame -+ * @field_pic: whether the reference is a field picture or a frame. -+ * @reserved: padding field. Should be zeroed by applications. -+ * @pic_order_cnt_val: the picture order count of the current picture. -+ */ -+struct v4l2_hevc_dpb_entry { -+ __u64 timestamp; -+ __u8 flags; -+ __u8 field_pic; -+ __u16 reserved; -+ __s32 pic_order_cnt_val; -+}; -+ -+/** -+ * struct v4l2_hevc_pred_weight_table - HEVC weighted prediction parameters -+ * -+ * @delta_luma_weight_l0: the difference of the weighting factor applied -+ * to the luma prediction value for list 0 -+ * @luma_offset_l0: the additive offset applied to the luma prediction value -+ * for list 0 -+ * @delta_chroma_weight_l0: the difference of the weighting factor applied -+ * to the chroma prediction values for list 0 -+ * @chroma_offset_l0: the difference of the additive offset applied to -+ * the chroma prediction values for list 0 -+ * @delta_luma_weight_l1: the difference of the weighting factor applied -+ * to the luma prediction value for list 1 -+ * @luma_offset_l1: the additive offset applied to the luma prediction value -+ * for list 1 -+ * @delta_chroma_weight_l1: the difference of the weighting factor applied -+ * to the chroma prediction values for list 1 -+ * @chroma_offset_l1: the difference of the additive offset applied to -+ * the chroma prediction values for list 1 -+ * @luma_log2_weight_denom: the base 2 logarithm of the denominator for -+ * all luma weighting factors -+ * @delta_chroma_log2_weight_denom: the difference of the base 2 logarithm -+ * of the denominator for all chroma -+ * weighting factors -+ */ -+struct v4l2_hevc_pred_weight_table { -+ __s8 delta_luma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 luma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 delta_chroma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ __s8 chroma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ -+ __s8 delta_luma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 luma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __s8 delta_chroma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ __s8 chroma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]; -+ -+ __u8 luma_log2_weight_denom; -+ __s8 delta_chroma_log2_weight_denom; -+}; -+ -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA (1ULL << 0) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA (1ULL << 1) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED (1ULL << 2) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO (1ULL << 3) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT (1ULL << 4) -+#define V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0 (1ULL << 5) -+#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 - HEVC slice parameters -+ * -+ * This control is a dynamically sized 1-dimensional array, -+ * V4L2_CTRL_FLAG_DYNAMIC_ARRAY flag must be set when using it. -+ * -+ * @bit_size: size (in bits) of the current slice data -+ * @data_byte_offset: offset (in bytes) to the video data in the current slice data -+ * @num_entry_point_offsets: specifies the number of entry point offset syntax -+ * elements in the slice header. -+ * @nal_unit_type: specifies the coding type of the slice (B, P or I) -+ * @nuh_temporal_id_plus1: minus 1 specifies a temporal identifier for the NAL unit -+ * @slice_type: see V4L2_HEVC_SLICE_TYPE_{} -+ * @colour_plane_id: specifies the colour plane associated with the current slice -+ * @slice_pic_order_cnt: specifies the picture order count -+ * @num_ref_idx_l0_active_minus1: this value plus 1 specifies the maximum -+ * reference index for reference picture list 0 -+ * that may be used to decode the slice -+ * @num_ref_idx_l1_active_minus1: this value plus 1 specifies the maximum -+ * reference index for reference picture list 1 -+ * that may be used to decode the slice -+ * @collocated_ref_idx: specifies the reference index of the collocated picture used -+ * for temporal motion vector prediction -+ * @five_minus_max_num_merge_cand: specifies the maximum number of merging -+ * motion vector prediction candidates supported in -+ * the slice subtracted from 5 -+ * @slice_qp_delta: specifies the initial value of QpY to be used for the coding -+ * blocks in the slice -+ * @slice_cb_qp_offset: specifies a difference to be added to the value of pps_cb_qp_offset -+ * @slice_cr_qp_offset: specifies a difference to be added to the value of pps_cr_qp_offset -+ * @slice_act_y_qp_offset: screen content extension parameters -+ * @slice_act_cb_qp_offset: screen content extension parameters -+ * @slice_act_cr_qp_offset: screen content extension parameters -+ * @slice_beta_offset_div2: specify the deblocking parameter offsets for beta divided by 2 -+ * @slice_tc_offset_div2: specify the deblocking parameter offsets for tC divided by 2 -+ * @pic_struct: indicates whether a picture should be displayed as a frame or as one or -+ * more fields -+ * @reserved0: padding field. Should be zeroed by applications. -+ * @slice_segment_addr: specifies the address of the first coding tree block in -+ * the slice segment -+ * @ref_idx_l0: the list of L0 reference elements as indices in the DPB -+ * @ref_idx_l1: the list of L1 reference elements as indices in the DPB -+ * @short_term_ref_pic_set_size: specifies the size of short-term reference -+ * pictures set included in the SPS -+ * @long_term_ref_pic_set_size: specifies the size of long-term reference -+ * pictures set include in the SPS -+ * @pred_weight_table: the prediction weight coefficients for inter-picture -+ * prediction -+ * @reserved1: padding field. Should be zeroed by applications. -+ * @flags: see V4L2_HEVC_SLICE_PARAMS_FLAG_{} -+ */ -+struct v4l2_ctrl_hevc_slice_params { -+ __u32 bit_size; -+ __u32 data_byte_offset; -+ __u32 num_entry_point_offsets; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: NAL unit header */ -+ __u8 nal_unit_type; -+ __u8 nuh_temporal_id_plus1; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u8 slice_type; -+ __u8 colour_plane_id; -+ __s32 slice_pic_order_cnt; -+ __u8 num_ref_idx_l0_active_minus1; -+ __u8 num_ref_idx_l1_active_minus1; -+ __u8 collocated_ref_idx; -+ __u8 five_minus_max_num_merge_cand; -+ __s8 slice_qp_delta; -+ __s8 slice_cb_qp_offset; -+ __s8 slice_cr_qp_offset; -+ __s8 slice_act_y_qp_offset; -+ __s8 slice_act_cb_qp_offset; -+ __s8 slice_act_cr_qp_offset; -+ __s8 slice_beta_offset_div2; -+ __s8 slice_tc_offset_div2; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Picture timing SEI message */ -+ __u8 pic_struct; -+ -+ __u8 reserved0[3]; -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ -+ __u32 slice_segment_addr; -+ __u8 ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u16 short_term_ref_pic_set_size; -+ __u16 long_term_ref_pic_set_size; -+ -+ /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ -+ struct v4l2_hevc_pred_weight_table pred_weight_table; -+ -+ __u8 reserved1[2]; -+ __u64 flags; -+}; -+ -+#define V4L2_HEVC_DECODE_PARAM_FLAG_IRAP_PIC 0x1 -+#define V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC 0x2 -+#define V4L2_HEVC_DECODE_PARAM_FLAG_NO_OUTPUT_OF_PRIOR 0x4 -+ -+/** -+ * struct v4l2_ctrl_hevc_decode_params - HEVC decode parameters -+ * -+ * @pic_order_cnt_val: picture order count -+ * @short_term_ref_pic_set_size: specifies the size of short-term reference -+ * pictures set included in the SPS of the first slice -+ * @long_term_ref_pic_set_size: specifies the size of long-term reference -+ * pictures set include in the SPS of the first slice -+ * @num_active_dpb_entries: the number of entries in dpb -+ * @num_poc_st_curr_before: the number of reference pictures in the short-term -+ * set that come before the current frame -+ * @num_poc_st_curr_after: the number of reference pictures in the short-term -+ * set that come after the current frame -+ * @num_poc_lt_curr: the number of reference pictures in the long-term set -+ * @poc_st_curr_before: provides the index of the short term before references -+ * in DPB array -+ * @poc_st_curr_after: provides the index of the short term after references -+ * in DPB array -+ * @poc_lt_curr: provides the index of the long term references in DPB array -+ * @reserved: padding field. Should be zeroed by applications. -+ * @dpb: the decoded picture buffer, for meta-data about reference frames -+ * @flags: see V4L2_HEVC_DECODE_PARAM_FLAG_{} -+ */ -+struct v4l2_ctrl_hevc_decode_params { -+ __s32 pic_order_cnt_val; -+ __u16 short_term_ref_pic_set_size; -+ __u16 long_term_ref_pic_set_size; -+ __u8 num_active_dpb_entries; -+ __u8 num_poc_st_curr_before; -+ __u8 num_poc_st_curr_after; -+ __u8 num_poc_lt_curr; -+ __u8 poc_st_curr_before[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 poc_st_curr_after[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u8 reserved[4]; -+ struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]; -+ __u64 flags; -+}; -+ -+/** -+ * struct v4l2_ctrl_hevc_scaling_matrix - HEVC scaling lists parameters -+ * -+ * @scaling_list_4x4: scaling list is used for the scaling process for -+ * transform coefficients. The values on each scaling -+ * list are expected in raster scan order -+ * @scaling_list_8x8: scaling list is used for the scaling process for -+ * transform coefficients. The values on each scaling -+ * list are expected in raster scan order -+ * @scaling_list_16x16: scaling list is used for the scaling process for -+ * transform coefficients. The values on each scaling -+ * list are expected in raster scan order -+ * @scaling_list_32x32: scaling list is used for the scaling process for -+ * transform coefficients. The values on each scaling -+ * list are expected in raster scan order -+ * @scaling_list_dc_coef_16x16: scaling list is used for the scaling process -+ * for transform coefficients. The values on each -+ * scaling list are expected in raster scan order. -+ * @scaling_list_dc_coef_32x32: scaling list is used for the scaling process -+ * for transform coefficients. The values on each -+ * scaling list are expected in raster scan order. -+ */ -+struct v4l2_ctrl_hevc_scaling_matrix { -+ __u8 scaling_list_4x4[6][16]; -+ __u8 scaling_list_8x8[6][64]; -+ __u8 scaling_list_16x16[6][64]; -+ __u8 scaling_list_32x32[2][64]; -+ __u8 scaling_list_dc_coef_16x16[6]; -+ __u8 scaling_list_dc_coef_32x32[2]; -+}; -+ -+#endif -diff --git a/libavcodec/v4l2_req_hevc_v4.c b/libavcodec/v4l2_req_hevc_v4.c -new file mode 100644 -index 0000000000..c35579d8e0 ---- /dev/null -+++ b/libavcodec/v4l2_req_hevc_v4.c -@@ -0,0 +1,3 @@ -+#define HEVC_CTRLS_VERSION 4 -+#include "v4l2_req_hevc_vx.c" -+ -diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c -index 611fa21cc3..761c5b2dc7 100644 ---- a/libavcodec/v4l2_req_hevc_vx.c -+++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -6,8 +6,6 @@ - #include "internal.h" - #include "thread.h" - --#include "v4l2_request_hevc.h" -- - #if HEVC_CTRLS_VERSION == 1 - #include "hevc-ctrls-v1.h" - -@@ -18,10 +16,37 @@ - #include "hevc-ctrls-v2.h" - #elif HEVC_CTRLS_VERSION == 3 - #include "hevc-ctrls-v3.h" -+#elif HEVC_CTRLS_VERSION == 4 -+#include -+#if !defined(V4L2_CID_STATELESS_HEVC_SPS) -+#include "hevc-ctrls-v4.h" -+#endif - #else - #error Unknown HEVC_CTRLS_VERSION - #endif - -+#ifndef V4L2_CID_STATELESS_HEVC_SPS -+#define V4L2_CID_STATELESS_HEVC_SPS V4L2_CID_MPEG_VIDEO_HEVC_SPS -+#define V4L2_CID_STATELESS_HEVC_PPS V4L2_CID_MPEG_VIDEO_HEVC_PPS -+#define V4L2_CID_STATELESS_HEVC_SLICE_PARAMS V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS -+#define V4L2_CID_STATELESS_HEVC_SCALING_MATRIX V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX -+#define V4L2_CID_STATELESS_HEVC_DECODE_PARAMS V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS -+#define V4L2_CID_STATELESS_HEVC_DECODE_MODE V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE -+#define V4L2_CID_STATELESS_HEVC_START_CODE V4L2_CID_MPEG_VIDEO_HEVC_START_CODE -+ -+#define V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED -+#define V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED -+#define V4L2_STATELESS_HEVC_START_CODE_NONE V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE -+#define V4L2_STATELESS_HEVC_START_CODE_ANNEX_B V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B -+#endif -+ -+// Should be in videodev2 but we might not have a good enough one -+#ifndef V4L2_PIX_FMT_HEVC_SLICE -+#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ -+#endif -+ -+#include "v4l2_request_hevc.h" -+ - #include "libavutil/hwcontext_drm.h" - - #include -@@ -259,9 +284,13 @@ fill_dpb_entries(const HEVCContext * const h, struct v4l2_hevc_dpb_entry * const - #endif - entry->field_pic = frame->frame->interlaced_frame; - -+#if HEVC_CTRLS_VERSION <= 3 - /* TODO: Interleaved: Get the POC for each field. */ - entry->pic_order_cnt[0] = frame->poc; - entry->pic_order_cnt[1] = frame->poc; -+#else -+ entry->pic_order_cnt_val = frame->poc; -+#endif - } - } - return n; -@@ -287,8 +316,11 @@ static void fill_slice_params(const HEVCContext * const h, - - *slice_params = (struct v4l2_ctrl_hevc_slice_params) { - .bit_size = bit_size, -+#if HEVC_CTRLS_VERSION <= 3 - .data_bit_offset = bit_offset, -- -+#else -+ .data_byte_offset = bit_offset / 8 + 1, -+#endif - /* ISO/IEC 23008-2, ITU-T Rec. H.265: General slice segment header */ - .slice_segment_addr = sh->slice_segment_addr, - -@@ -376,8 +408,10 @@ static void fill_slice_params(const HEVCContext * const h, - av_log(NULL, AV_LOG_ERROR, "%s: Currently only 256 entry points are supported, but slice has %d entry points.\n", __func__, sh->num_entry_point_offsets); - } - -+#if HEVC_CTRLS_VERSION <= 3 - for (i = 0; i < slice_params->num_entry_point_offsets; i++) - slice_params->entry_point_offset_minus1[i] = sh->entry_point_offset[i] - 1; -+#endif - } - - #if HEVC_CTRLS_VERSION >= 2 -@@ -761,30 +795,30 @@ set_req_ctls(V4L2RequestContextHEVC *ctx, struct media_request * const mreq, - - struct v4l2_ext_control control[] = { - { -- .id = V4L2_CID_MPEG_VIDEO_HEVC_SPS, -+ .id = V4L2_CID_STATELESS_HEVC_SPS, - .ptr = &controls->sps, - .size = sizeof(controls->sps), - }, - { -- .id = V4L2_CID_MPEG_VIDEO_HEVC_PPS, -+ .id = V4L2_CID_STATELESS_HEVC_PPS, - .ptr = &controls->pps, - .size = sizeof(controls->pps), - }, - #if HEVC_CTRLS_VERSION >= 2 - { -- .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS, -+ .id = V4L2_CID_STATELESS_HEVC_DECODE_PARAMS, - .ptr = dec, - .size = sizeof(*dec), - }, - #endif - { -- .id = V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS, -+ .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, - .ptr = slices + slice_no, - .size = sizeof(*slices) * slice_count, - }, - // Optional - { -- .id = V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX, -+ .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX, - .ptr = &controls->scaling_matrix, - .size = sizeof(controls->scaling_matrix), - }, -@@ -1000,12 +1034,12 @@ probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - - // Check for var slice array - struct v4l2_query_ext_ctrl qc[] = { -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS }, -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_SPS }, -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_PPS }, -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX }, -+ { .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS }, -+ { .id = V4L2_CID_STATELESS_HEVC_SPS }, -+ { .id = V4L2_CID_STATELESS_HEVC_PPS }, -+ { .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX }, - #if HEVC_CTRLS_VERSION >= 2 -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS }, -+ { .id = V4L2_CID_STATELESS_HEVC_DECODE_PARAMS }, - #endif - }; - // Order & size must match! -@@ -1042,12 +1076,13 @@ probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - - fill_sps(&ctrl_sps, sps); - -- if (mediabufs_set_ext_ctrl(ctx->mbufs, NULL, V4L2_CID_MPEG_VIDEO_HEVC_SPS, &ctrl_sps, sizeof(ctrl_sps))) { -+ if (mediabufs_set_ext_ctrl(ctx->mbufs, NULL, V4L2_CID_STATELESS_HEVC_SPS, &ctrl_sps, sizeof(ctrl_sps))) { - av_log(avctx, AV_LOG_ERROR, "Failed to set initial SPS\n"); - return AVERROR(EINVAL); - } - - ctx->multi_slice = (qc[0].flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY) != 0; -+ av_log(avctx, AV_LOG_INFO, "%s SPS muti-slice\n", ctx->multi_slice ? "Has" : "No"); - return 0; - } - -@@ -1058,29 +1093,29 @@ set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - int ret; - - struct v4l2_query_ext_ctrl querys[] = { -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE, }, -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_START_CODE, }, -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS, }, -+ { .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, }, -+ { .id = V4L2_CID_STATELESS_HEVC_START_CODE, }, -+ { .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, }, - }; - - struct v4l2_ext_control ctrls[] = { -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE, }, -- { .id = V4L2_CID_MPEG_VIDEO_HEVC_START_CODE, }, -+ { .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, }, -+ { .id = V4L2_CID_STATELESS_HEVC_START_CODE, }, - }; - - mediabufs_ctl_query_ext_ctrls(ctx->mbufs, querys, FF_ARRAY_ELEMS(querys)); - - ctx->decode_mode = querys[0].default_value; - -- if (ctx->decode_mode != V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED && -- ctx->decode_mode != V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED) { -+ if (ctx->decode_mode != V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED && -+ ctx->decode_mode != V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED) { - av_log(avctx, AV_LOG_ERROR, "%s: unsupported decode mode, %d\n", __func__, ctx->decode_mode); - return AVERROR(EINVAL); - } - - ctx->start_code = querys[1].default_value; -- if (ctx->start_code != V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE && -- ctx->start_code != V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B) { -+ if (ctx->start_code != V4L2_STATELESS_HEVC_START_CODE_NONE && -+ ctx->start_code != V4L2_STATELESS_HEVC_START_CODE_ANNEX_B) { - av_log(avctx, AV_LOG_ERROR, "%s: unsupported start code, %d\n", __func__, ctx->start_code); - return AVERROR(EINVAL); - } -diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index 20e4e0ab15..cd79aad563 100644 ---- a/libavcodec/v4l2_request_hevc.c -+++ b/libavcodec/v4l2_request_hevc.c -@@ -210,7 +210,11 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - goto fail4; - } - -- if (V2(ff_v4l2_req_hevc, 3).probe(avctx, ctx) == 0) { -+ if (V2(ff_v4l2_req_hevc, 4).probe(avctx, ctx) == 0) { -+ av_log(avctx, AV_LOG_DEBUG, "HEVC API version 4 probed successfully\n"); -+ ctx->fns = &V2(ff_v4l2_req_hevc, 4); -+ } -+ else if (V2(ff_v4l2_req_hevc, 3).probe(avctx, ctx) == 0) { - av_log(avctx, AV_LOG_DEBUG, "HEVC API version 3 probed successfully\n"); - ctx->fns = &V2(ff_v4l2_req_hevc, 3); - } -diff --git a/libavcodec/v4l2_request_hevc.h b/libavcodec/v4l2_request_hevc.h -index ed48d62e2d..d4adb3f812 100644 ---- a/libavcodec/v4l2_request_hevc.h -+++ b/libavcodec/v4l2_request_hevc.h -@@ -99,5 +99,6 @@ typedef struct v4l2_req_decode_fns { - extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 1); - extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 2); - extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 3); -+extern const v4l2_req_decode_fns V2(ff_v4l2_req_hevc, 4); - - #endif - -From 21a348ae3282318fa96d3a6e2c70f3d4b90a7d52 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Sun, 3 Jul 2022 13:40:41 +0000 -Subject: [PATCH 057/151] v4l2_req: Observe limit on size of slice_array - -This in fact provides some minor simplifications by combing the -multi-slice and single-slice paths. - -(cherry picked from commit 7631e6d1a66fca9048605c214f3464c90d37932c) ---- - libavcodec/v4l2_req_hevc_vx.c | 39 ++++++++++++++-------------------- - libavcodec/v4l2_request_hevc.h | 5 +---- - 2 files changed, 17 insertions(+), 27 deletions(-) - -diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c -index 761c5b2dc7..9d08d13d9e 100644 ---- a/libavcodec/v4l2_req_hevc_vx.c -+++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -840,18 +840,21 @@ static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t * - int bcount = get_bits_count(&h->HEVClc->gb); - uint32_t boff = (ptr_from_index(buffer, bcount/8 + 1) - (buffer + bcount/8 + 1)) * 8 + bcount; - -+ const unsigned int n = rd->num_slices; -+ const unsigned int block_start = (n / ctx->max_slices) * ctx->max_slices; -+ - int rv; - struct slice_info * si; - - if ((rv = slice_add(rd)) != 0) - return rv; - -- si = rd->slices + rd->num_slices - 1; -+ si = rd->slices + n; - si->ptr = buffer; - si->len = size; - -- if (ctx->multi_slice && rd->num_slices > 1) { -- struct slice_info *const si0 = rd->slices; -+ if (n != block_start) { -+ struct slice_info *const si0 = rd->slices + block_start; - const size_t offset = (buffer - si0->ptr); - boff += offset * 8; - size += offset; -@@ -859,11 +862,11 @@ static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t * - } - - #if HEVC_CTRLS_VERSION >= 2 -- if (rd->num_slices == 1) -+ if (n == 0) - fill_decode_params(h, &rd->dec); -- fill_slice_params(h, &rd->dec, rd->slice_params + rd->num_slices - 1, size * 8, boff); -+ fill_slice_params(h, &rd->dec, rd->slice_params + n, size * 8, boff); - #else -- fill_slice_params(h, rd->slice_params + rd->num_slices - 1, size * 8, boff); -+ fill_slice_params(h, rd->slice_params + n, size * 8, boff); - #endif - - return 0; -@@ -997,18 +1000,11 @@ static int v4l2_request_hevc_end_frame(AVCodecContext *avctx) - } - - // Send as slices -- if (ctx->multi_slice) -- { -- if ((rv = send_slice(avctx, rd, &rc, 0, rd->num_slices)) != 0) -+ for (i = 0; i < rd->num_slices; i += ctx->max_slices) { -+ const unsigned int e = FFMIN(rd->num_slices, i + ctx->max_slices); -+ if ((rv = send_slice(avctx, rd, &rc, i, e)) != 0) - goto fail; - } -- else -- { -- for (i = 0; i != rd->num_slices; ++i) { -- if ((rv = send_slice(avctx, rd, &rc, i, i + 1)) != 0) -- goto fail; -- } -- } - - // Set the drm_prime desriptor - drm_from_format(&rd->drm, mediabufs_dst_fmt(ctx->mbufs)); -@@ -1081,8 +1077,6 @@ probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - return AVERROR(EINVAL); - } - -- ctx->multi_slice = (qc[0].flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY) != 0; -- av_log(avctx, AV_LOG_INFO, "%s SPS muti-slice\n", ctx->multi_slice ? "Has" : "No"); - return 0; - } - -@@ -1120,11 +1114,10 @@ set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - return AVERROR(EINVAL); - } - -- ctx->max_slices = querys[2].elems; -- if (ctx->max_slices > MAX_SLICES) { -- av_log(avctx, AV_LOG_ERROR, "%s: unsupported max slices, %d\n", __func__, ctx->max_slices); -- return AVERROR(EINVAL); -- } -+ ctx->max_slices = (!(querys[2].flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY) || -+ querys[2].nr_of_dims != 1 || querys[2].dims[0] == 0) ? -+ 1 : querys[2].dims[0]; -+ av_log(avctx, AV_LOG_DEBUG, "%s: Max slices %d\n", __func__, ctx->max_slices); - - ctrls[0].value = ctx->decode_mode; - ctrls[1].value = ctx->start_code; -diff --git a/libavcodec/v4l2_request_hevc.h b/libavcodec/v4l2_request_hevc.h -index d4adb3f812..0029e23309 100644 ---- a/libavcodec/v4l2_request_hevc.h -+++ b/libavcodec/v4l2_request_hevc.h -@@ -46,8 +46,6 @@ - #define V4L2_CTRL_FLAG_DYNAMIC_ARRAY 0x0800 - #endif - --#define MAX_SLICES 128 -- - #define VCAT(name, version) name##_v##version - #define V2(n,v) VCAT(n, v) - #define V(n) V2(n, HEVC_CTRLS_VERSION) -@@ -64,10 +62,9 @@ typedef struct V4L2RequestContextHEVC { - - unsigned int timestamp; // ?? maybe uint64_t - -- int multi_slice; - int decode_mode; - int start_code; -- int max_slices; -+ unsigned int max_slices; - - req_decode_q decode_q; - - -From 4f1d74cc8eea6a1bd6f2317a10c0ecf620315dec Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 4 Jul 2022 14:43:20 +0100 -Subject: [PATCH 058/151] v4l2_req: Add entry point offsets array control - ---- - libavcodec/v4l2_req_hevc_vx.c | 88 +++++++++++++++++++++++++++------- - libavcodec/v4l2_request_hevc.h | 3 +- - 2 files changed, 72 insertions(+), 19 deletions(-) - -diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c -index 9d08d13d9e..43ef6631ed 100644 ---- a/libavcodec/v4l2_req_hevc_vx.c -+++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -82,11 +82,16 @@ typedef struct V4L2MediaReqDescriptor { - struct v4l2_ctrl_hevc_slice_params * slice_params; - struct slice_info * slices; - -+ size_t num_offsets; -+ size_t alloced_offsets; -+ uint32_t *offsets; -+ - } V4L2MediaReqDescriptor; - - struct slice_info { - const uint8_t * ptr; - size_t len; // bytes -+ size_t n_offsets; - }; - - // Handy container for accumulating controls before setting -@@ -245,7 +250,7 @@ static int slice_add(V4L2MediaReqDescriptor * const rd) - if (rd->num_slices >= rd->alloced_slices) { - struct v4l2_ctrl_hevc_slice_params * p2; - struct slice_info * s2; -- size_t n2 = rd->num_slices == 0 ? 8 : rd->num_slices * 2; -+ size_t n2 = rd->alloced_slices == 0 ? 8 : rd->alloced_slices * 2; - - p2 = av_realloc_array(rd->slice_params, n2, sizeof(*p2)); - if (p2 == NULL) -@@ -263,6 +268,23 @@ static int slice_add(V4L2MediaReqDescriptor * const rd) - return 0; - } - -+static int offsets_add(V4L2MediaReqDescriptor *const rd, const size_t n, const unsigned * const offsets) -+{ -+ if (rd->num_offsets + n > rd->alloced_offsets) { -+ size_t n2 = rd->alloced_slices == 0 ? 128 : rd->alloced_slices * 2; -+ void * p2; -+ while (rd->num_offsets + n > n2) -+ n2 *= 2; -+ if ((p2 = av_realloc_array(rd->offsets, n2, sizeof(*rd->offsets))) == NULL) -+ return AVERROR(ENOMEM); -+ rd->offsets = p2; -+ rd->alloced_offsets = n2; -+ } -+ for (size_t i = 0; i != n; ++i) -+ rd->offsets[rd->num_offsets++] = offsets[i] - 1; -+ return 0; -+} -+ - static unsigned int - fill_dpb_entries(const HEVCContext * const h, struct v4l2_hevc_dpb_entry * const entries) - { -@@ -403,12 +425,12 @@ static void fill_slice_params(const HEVCContext * const h, - fill_pred_table(h, &slice_params->pred_weight_table); - - slice_params->num_entry_point_offsets = sh->num_entry_point_offsets; -+#if HEVC_CTRLS_VERSION <= 3 - if (slice_params->num_entry_point_offsets > 256) { - slice_params->num_entry_point_offsets = 256; - av_log(NULL, AV_LOG_ERROR, "%s: Currently only 256 entry points are supported, but slice has %d entry points.\n", __func__, sh->num_entry_point_offsets); - } - --#if HEVC_CTRLS_VERSION <= 3 - for (i = 0; i < slice_params->num_entry_point_offsets; i++) - slice_params->entry_point_offset_minus1[i] = sh->entry_point_offset[i] - 1; - #endif -@@ -787,13 +809,17 @@ set_req_ctls(V4L2RequestContextHEVC *ctx, struct media_request * const mreq, - #if HEVC_CTRLS_VERSION >= 2 - struct v4l2_ctrl_hevc_decode_params * const dec, - #endif -- struct v4l2_ctrl_hevc_slice_params * const slices, -- const unsigned int slice_no, -- const unsigned int slice_count) -+ struct v4l2_ctrl_hevc_slice_params * const slices, const unsigned int slice_count, -+ void * const offsets, const size_t offset_count) - { - int rv; -+#if HEVC_CTRLS_VERSION >= 2 -+ unsigned int n = 4; -+#else -+ unsigned int n = 3; -+#endif - -- struct v4l2_ext_control control[] = { -+ struct v4l2_ext_control control[6] = { - { - .id = V4L2_CID_STATELESS_HEVC_SPS, - .ptr = &controls->sps, -@@ -813,21 +839,28 @@ set_req_ctls(V4L2RequestContextHEVC *ctx, struct media_request * const mreq, - #endif - { - .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, -- .ptr = slices + slice_no, -+ .ptr = slices, - .size = sizeof(*slices) * slice_count, - }, -- // Optional -- { -+ }; -+ -+ if (controls->has_scaling) -+ control[n++] = (struct v4l2_ext_control) { - .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX, - .ptr = &controls->scaling_matrix, - .size = sizeof(controls->scaling_matrix), -- }, -- }; -+ }; -+ -+#if HEVC_CTRLS_VERSION >= 4 -+ if (offsets) -+ control[n++] = (struct v4l2_ext_control) { -+ .id = V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS, -+ .ptr = offsets, -+ .size = sizeof(((struct V4L2MediaReqDescriptor *)0)->offsets[0]) * offset_count, -+ }; -+#endif - -- rv = mediabufs_ctl_set_ext_ctrls(ctx->mbufs, mreq, control, -- controls->has_scaling ? -- FF_ARRAY_ELEMS(control) : -- FF_ARRAY_ELEMS(control) - 1); -+ rv = mediabufs_ctl_set_ext_ctrls(ctx->mbufs, mreq, control, n); - - return rv; - } -@@ -852,6 +885,7 @@ static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t * - si = rd->slices + n; - si->ptr = buffer; - si->len = size; -+ si->n_offsets = rd->num_offsets; - - if (n != block_start) { - struct slice_info *const si0 = rd->slices + block_start; -@@ -868,6 +902,9 @@ static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t * - #else - fill_slice_params(h, rd->slice_params + n, size * 8, boff); - #endif -+ if (ctx->max_offsets != 0 && -+ (rv = offsets_add(rd, h->sh.num_entry_point_offsets, h->sh.entry_point_offset)) != 0) -+ return rv; - - return 0; - } -@@ -893,10 +930,13 @@ static int send_slice(AVCodecContext * const avctx, - { - V4L2RequestContextHEVC * const ctx = avctx->internal->hwaccel_priv_data; - -+ const int is_last = (j == rd->num_slices); - struct slice_info *const si = rd->slices + i; - struct media_request * req = NULL; - struct qent_src * src = NULL; - MediaBufsStatus stat; -+ void * offsets = rd->offsets + rd->slices[i].n_offsets; -+ size_t n_offsets = (is_last ? rd->num_offsets : rd->slices[j].n_offsets) - rd->slices[i].n_offsets; - - if ((req = media_request_get(ctx->mpool)) == NULL) { - av_log(avctx, AV_LOG_ERROR, "%s: Failed to alloc media request\n", __func__); -@@ -908,8 +948,8 @@ static int send_slice(AVCodecContext * const avctx, - #if HEVC_CTRLS_VERSION >= 2 - &rd->dec, - #endif -- rd->slice_params, -- i, j - i)) { -+ rd->slice_params + i, j - i, -+ offsets, n_offsets)) { - av_log(avctx, AV_LOG_ERROR, "%s: Failed to set req ctls\n", __func__); - goto fail1; - } -@@ -935,7 +975,7 @@ static int send_slice(AVCodecContext * const avctx, - - stat = mediabufs_start_request(ctx->mbufs, &req, &src, - i == 0 ? rd->qe_dst : NULL, -- j == rd->num_slices); -+ is_last); - - if (stat != MEDIABUFS_STATUS_SUCCESS) { - av_log(avctx, AV_LOG_ERROR, "%s: Failed to start request\n", __func__); -@@ -1090,6 +1130,9 @@ set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - { .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, }, - { .id = V4L2_CID_STATELESS_HEVC_START_CODE, }, - { .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, }, -+#if HEVC_CTRLS_VERSION >= 4 -+ { .id = V4L2_CID_STATELESS_HEVC_ENTRY_POINT_OFFSETS, }, -+#endif - }; - - struct v4l2_ext_control ctrls[] = { -@@ -1119,6 +1162,14 @@ set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - 1 : querys[2].dims[0]; - av_log(avctx, AV_LOG_DEBUG, "%s: Max slices %d\n", __func__, ctx->max_slices); - -+#if HEVC_CTRLS_VERSION >= 4 -+ ctx->max_offsets = (querys[3].type == 0 || querys[3].nr_of_dims != 1) ? -+ 0 : querys[3].dims[0]; -+ av_log(avctx, AV_LOG_INFO, "%s: Entry point offsets %d\n", __func__, ctx->max_offsets); -+#else -+ ctx->max_offsets = 0; -+#endif -+ - ctrls[0].value = ctx->decode_mode; - ctrls[1].value = ctx->start_code; - -@@ -1141,6 +1192,7 @@ static void v4l2_req_frame_free(void *opaque, uint8_t *data) - - av_freep(&rd->slices); - av_freep(&rd->slice_params); -+ av_freep(&rd->offsets); - - av_free(rd); - } -diff --git a/libavcodec/v4l2_request_hevc.h b/libavcodec/v4l2_request_hevc.h -index 0029e23309..99c90064ea 100644 ---- a/libavcodec/v4l2_request_hevc.h -+++ b/libavcodec/v4l2_request_hevc.h -@@ -64,7 +64,8 @@ typedef struct V4L2RequestContextHEVC { - - int decode_mode; - int start_code; -- unsigned int max_slices; -+ unsigned int max_slices; // 0 => not wanted (frame mode) -+ unsigned int max_offsets; // 0 => not wanted - - req_decode_q decode_q; - - -From d0e5ed2dff1b8f8909ceb968cb3afe2b20093fda Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 4 Jul 2022 16:22:54 +0100 -Subject: [PATCH 059/151] v4l2_req: Support Annex B - ---- - libavcodec/v4l2_req_hevc_vx.c | 61 +++++++++++++++++++++++------------ - 1 file changed, 41 insertions(+), 20 deletions(-) - -diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c -index 43ef6631ed..5e0db9850a 100644 ---- a/libavcodec/v4l2_req_hevc_vx.c -+++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -879,6 +879,18 @@ static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t * - int rv; - struct slice_info * si; - -+ // This looks dodgy but we know that FFmpeg has parsed this from a buffer -+ // that contains the entire frame including the start code -+ if (ctx->start_code == V4L2_STATELESS_HEVC_START_CODE_ANNEX_B) { -+ buffer -= 3; -+ size += 3; -+ boff += 24; -+ if (buffer[0] != 0 || buffer[1] != 0 || buffer[2] != 1) { -+ av_log(avctx, AV_LOG_ERROR, "Start code requested but missing %02x:%02x:%02x\n", -+ buffer[0], buffer[1], buffer[2]); -+ } -+ } -+ - if ((rv = slice_add(rd)) != 0) - return rv; - -@@ -969,10 +981,6 @@ static int send_slice(AVCodecContext * const avctx, - goto fail2; - } - --#warning ANNEX_B start code --// if (ctx->start_code == V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B) { --// } -- - stat = mediabufs_start_request(ctx->mbufs, &req, &src, - i == 0 ? rd->qe_dst : NULL, - is_last); -@@ -1120,6 +1128,12 @@ probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - return 0; - } - -+static inline int -+ctrl_valid(const struct v4l2_query_ext_ctrl * const c, const int64_t v) -+{ -+ return v >= c->minimum && v <= c->maximum; -+} -+ - // Final init - static int - set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) -@@ -1142,21 +1156,6 @@ set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - - mediabufs_ctl_query_ext_ctrls(ctx->mbufs, querys, FF_ARRAY_ELEMS(querys)); - -- ctx->decode_mode = querys[0].default_value; -- -- if (ctx->decode_mode != V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED && -- ctx->decode_mode != V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED) { -- av_log(avctx, AV_LOG_ERROR, "%s: unsupported decode mode, %d\n", __func__, ctx->decode_mode); -- return AVERROR(EINVAL); -- } -- -- ctx->start_code = querys[1].default_value; -- if (ctx->start_code != V4L2_STATELESS_HEVC_START_CODE_NONE && -- ctx->start_code != V4L2_STATELESS_HEVC_START_CODE_ANNEX_B) { -- av_log(avctx, AV_LOG_ERROR, "%s: unsupported start code, %d\n", __func__, ctx->start_code); -- return AVERROR(EINVAL); -- } -- - ctx->max_slices = (!(querys[2].flags & V4L2_CTRL_FLAG_DYNAMIC_ARRAY) || - querys[2].nr_of_dims != 1 || querys[2].dims[0] == 0) ? - 1 : querys[2].dims[0]; -@@ -1165,11 +1164,33 @@ set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - #if HEVC_CTRLS_VERSION >= 4 - ctx->max_offsets = (querys[3].type == 0 || querys[3].nr_of_dims != 1) ? - 0 : querys[3].dims[0]; -- av_log(avctx, AV_LOG_INFO, "%s: Entry point offsets %d\n", __func__, ctx->max_offsets); -+ av_log(avctx, AV_LOG_DEBUG, "%s: Entry point offsets %d\n", __func__, ctx->max_offsets); - #else - ctx->max_offsets = 0; - #endif - -+ ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B; -+ -+ if (ctrl_valid(querys + 0, V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED)) -+ { -+ ctx->decode_mode = V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED; -+ -+ // Prefer NONE as it doesn't require the slightly dodgy look -+ // backwards in our raw buffer -+ if (ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_NONE)) -+ ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_NONE; -+ else if (ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_ANNEX_B)) -+ ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B; -+ else { -+ av_log(avctx, AV_LOG_ERROR, "%s: unsupported start code\n", __func__); -+ return AVERROR(EINVAL); -+ } -+ } -+ else -+ { -+ av_log(avctx, AV_LOG_ERROR, "%s: unsupported decode mode\n", __func__); -+ } -+ - ctrls[0].value = ctx->decode_mode; - ctrls[1].value = ctx->start_code; - - -From a75506e18a964c9f50efa224a3fa4179c9ef2127 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 4 Jul 2022 18:24:03 +0100 -Subject: [PATCH 060/151] v4l2_req: Add frame mode decode - ---- - libavcodec/v4l2_req_hevc_vx.c | 69 +++++++++++++++++++++++------------ - 1 file changed, 46 insertions(+), 23 deletions(-) - -diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c -index 5e0db9850a..ada53d0d44 100644 ---- a/libavcodec/v4l2_req_hevc_vx.c -+++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -814,9 +814,9 @@ set_req_ctls(V4L2RequestContextHEVC *ctx, struct media_request * const mreq, - { - int rv; - #if HEVC_CTRLS_VERSION >= 2 -- unsigned int n = 4; --#else - unsigned int n = 3; -+#else -+ unsigned int n = 2; - #endif - - struct v4l2_ext_control control[6] = { -@@ -837,12 +837,14 @@ set_req_ctls(V4L2RequestContextHEVC *ctx, struct media_request * const mreq, - .size = sizeof(*dec), - }, - #endif -- { -+ }; -+ -+ if (slices) -+ control[n++] = (struct v4l2_ext_control) { - .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS, - .ptr = slices, - .size = sizeof(*slices) * slice_count, -- }, -- }; -+ }; - - if (controls->has_scaling) - control[n++] = (struct v4l2_ext_control) { -@@ -865,6 +867,8 @@ set_req_ctls(V4L2RequestContextHEVC *ctx, struct media_request * const mreq, - return rv; - } - -+// This only works because we started out from a single coded frame buffer -+// that will remain intact until after end_frame - static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) - { - const HEVCContext * const h = avctx->priv_data; -@@ -891,6 +895,17 @@ static int v4l2_request_hevc_decode_slice(AVCodecContext *avctx, const uint8_t * - } - } - -+ if (ctx->decode_mode == V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED) { -+ if (rd->slices == NULL) { -+ if ((rd->slices = av_mallocz(sizeof(*rd->slices))) == NULL) -+ return AVERROR(ENOMEM); -+ rd->slices->ptr = buffer; -+ rd->num_slices = 1; -+ } -+ rd->slices->len = buffer - rd->slices->ptr + size; -+ return 0; -+ } -+ - if ((rv = slice_add(rd)) != 0) - return rv; - -@@ -1169,28 +1184,36 @@ set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - ctx->max_offsets = 0; - #endif - -- ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B; -- -- if (ctrl_valid(querys + 0, V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED)) -- { -+ if (querys[0].default_value == V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED || -+ querys[0].default_value == V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED) -+ ctx->decode_mode = querys[0].default_value; -+ else if (ctrl_valid(querys + 0, V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED)) -+ ctx->decode_mode = V4L2_STATELESS_HEVC_DECODE_MODE_FRAME_BASED; -+ else if (ctrl_valid(querys + 0, V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED)) - ctx->decode_mode = V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED; -- -- // Prefer NONE as it doesn't require the slightly dodgy look -- // backwards in our raw buffer -- if (ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_NONE)) -- ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_NONE; -- else if (ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_ANNEX_B)) -- ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B; -- else { -- av_log(avctx, AV_LOG_ERROR, "%s: unsupported start code\n", __func__); -- return AVERROR(EINVAL); -- } -- } -- else -- { -+ else { - av_log(avctx, AV_LOG_ERROR, "%s: unsupported decode mode\n", __func__); -+ return AVERROR(EINVAL); - } - -+ if (querys[1].default_value == V4L2_STATELESS_HEVC_START_CODE_NONE || -+ querys[1].default_value == V4L2_STATELESS_HEVC_START_CODE_ANNEX_B) -+ ctx->start_code = querys[1].default_value; -+ else if (ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_ANNEX_B)) -+ ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_ANNEX_B; -+ else if (ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_NONE)) -+ ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_NONE; -+ else { -+ av_log(avctx, AV_LOG_ERROR, "%s: unsupported start code\n", __func__); -+ return AVERROR(EINVAL); -+ } -+ -+ // If we are in slice mode & START_CODE_NONE supported then pick that -+ // as it doesn't require the slightly dodgy look backwards in our raw buffer -+ if (ctx->decode_mode == V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED && -+ ctrl_valid(querys + 1, V4L2_STATELESS_HEVC_START_CODE_NONE)) -+ ctx->start_code = V4L2_STATELESS_HEVC_START_CODE_NONE; -+ - ctrls[0].value = ctx->decode_mode; - ctrls[1].value = ctx->start_code; - - -From 9cf01f1485dcf71bcad7981d45029425d9abf115 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 5 Jul 2022 12:54:22 +0000 -Subject: [PATCH 061/151] v4l2_req: Fix probe for frame based decode - ---- - libavcodec/v4l2_req_hevc_vx.c | 33 +++++++++++++++++++++++---------- - 1 file changed, 23 insertions(+), 10 deletions(-) - -diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c -index ada53d0d44..5d083016f8 100644 ---- a/libavcodec/v4l2_req_hevc_vx.c -+++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -1082,6 +1082,12 @@ fail: - return rv; - } - -+static inline int -+ctrl_valid(const struct v4l2_query_ext_ctrl * const c, const int64_t v) -+{ -+ return v >= c->minimum && v <= c->maximum; -+} -+ - // Initial check & init - static int - probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) -@@ -1094,6 +1100,7 @@ probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - // Check for var slice array - struct v4l2_query_ext_ctrl qc[] = { - { .id = V4L2_CID_STATELESS_HEVC_SLICE_PARAMS }, -+ { .id = V4L2_CID_STATELESS_HEVC_DECODE_MODE, }, - { .id = V4L2_CID_STATELESS_HEVC_SPS }, - { .id = V4L2_CID_STATELESS_HEVC_PPS }, - { .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX }, -@@ -1104,6 +1111,7 @@ probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - // Order & size must match! - static const size_t ctrl_sizes[] = { - sizeof(struct v4l2_ctrl_hevc_slice_params), -+ sizeof(int32_t), - sizeof(struct v4l2_ctrl_hevc_sps), - sizeof(struct v4l2_ctrl_hevc_pps), - sizeof(struct v4l2_ctrl_hevc_scaling_matrix), -@@ -1121,11 +1129,22 @@ probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - return AVERROR(EINVAL); - #endif - -- if (mediabufs_ctl_query_ext_ctrls(ctx->mbufs, qc, noof_ctrls)) { -- av_log(avctx, AV_LOG_DEBUG, "Probed V%d control missing\n", HEVC_CTRLS_VERSION); -+ mediabufs_ctl_query_ext_ctrls(ctx->mbufs, qc, noof_ctrls); -+ i = 0; -+#if HEVC_CTRLS_VERSION >= 4 -+ // Skip slice check if no slice mode -+ if (qc[1].type != 0 && !ctrl_valid(qc + 1, V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED)) -+ i = 1; -+#else -+ // Fail frame mode silently for anything prior to V4 -+ if (qc[1].type == 0 || !ctrl_valid(qc + 1, V4L2_STATELESS_HEVC_DECODE_MODE_SLICE_BASED)) - return AVERROR(EINVAL); -- } -- for (i = 0; i != noof_ctrls; ++i) { -+#endif -+ for (; i != noof_ctrls; ++i) { -+ if (qc[i].type == 0) { -+ av_log(avctx, AV_LOG_DEBUG, "Probed V%d control %#x missing\n", HEVC_CTRLS_VERSION, qc[i].id); -+ return AVERROR(EINVAL); -+ } - if (ctrl_sizes[i] != (size_t)qc[i].elem_size) { - av_log(avctx, AV_LOG_DEBUG, "Probed V%d control %d size mismatch %zu != %zu\n", - HEVC_CTRLS_VERSION, i, ctrl_sizes[i], (size_t)qc[i].elem_size); -@@ -1143,12 +1162,6 @@ probe(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - return 0; - } - --static inline int --ctrl_valid(const struct v4l2_query_ext_ctrl * const c, const int64_t v) --{ -- return v >= c->minimum && v <= c->maximum; --} -- - // Final init - static int - set_controls(AVCodecContext * const avctx, V4L2RequestContextHEVC * const ctx) - -From e7a62226f26073149d35c89268f56e17c8f45d76 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 26 Jul 2022 15:46:14 +0000 -Subject: [PATCH 062/151] vf_deinterlace_v4l2m2m: Support NV12 through - deinterlace - -Supports NV12 (though not yet NV12M) through deinterlace. -Also improves error handling such that attempting to deinterlace an -unsupported drm format causes an error. -No longer leaks frame structures. ---- - libavfilter/vf_deinterlace_v4l2m2m.c | 160 ++++++++++++++++++--------- - 1 file changed, 107 insertions(+), 53 deletions(-) - -diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c -index 1a933b7e0a..1a3bef5bcb 100644 ---- a/libavfilter/vf_deinterlace_v4l2m2m.c -+++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -373,14 +373,16 @@ static int deint_v4l2m2m_try_format(V4L2Queue *queue) - fmt->fmt.pix_mp.plane_fmt[0].sizeimage, fmt->fmt.pix_mp.plane_fmt[0].bytesperline); - - if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -- if (fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_YUV420 || -+ if ((fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_YUV420 && -+ fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_NV12) || - fmt->fmt.pix_mp.field != field) { - av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); - - return AVERROR(EINVAL); - } - } else { -- if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_YUV420 || -+ if ((fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_YUV420 && -+ fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_NV12) || - fmt->fmt.pix.field != field) { - av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); - -@@ -391,7 +393,7 @@ static int deint_v4l2m2m_try_format(V4L2Queue *queue) - return 0; - } - --static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t field, int width, int height, int pitch, int ysize) -+static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t pixelformat, uint32_t field, int width, int height, int pitch, int ysize) - { - struct v4l2_format *fmt = &queue->format; - DeintV4L2M2MContextShared *ctx = queue->ctx; -@@ -402,13 +404,16 @@ static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t field, int width, - .target = V4L2_TYPE_IS_OUTPUT(fmt->type) ? V4L2_SEL_TGT_CROP_BOUNDS : V4L2_SEL_TGT_COMPOSE_BOUNDS, - }; - -+ // This works for most single object 4:2:0 types - if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ fmt->fmt.pix_mp.pixelformat = pixelformat; - fmt->fmt.pix_mp.field = field; - fmt->fmt.pix_mp.width = width; - fmt->fmt.pix_mp.height = ysize / pitch; - fmt->fmt.pix_mp.plane_fmt[0].bytesperline = pitch; - fmt->fmt.pix_mp.plane_fmt[0].sizeimage = ysize + (ysize >> 1); - } else { -+ fmt->fmt.pix.pixelformat = pixelformat; - fmt->fmt.pix.field = field; - fmt->fmt.pix.width = width; - fmt->fmt.pix.height = height; -@@ -417,12 +422,22 @@ static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t field, int width, - } - - ret = ioctl(ctx->fd, VIDIOC_S_FMT, fmt); -- if (ret) -+ if (ret) { -+ ret = AVERROR(errno); - av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_S_FMT failed: %d\n", ret); -+ return ret; -+ } -+ -+ if (pixelformat != fmt->fmt.pix.pixelformat) { -+ av_log(ctx->logctx, AV_LOG_ERROR, "Format not supported: %s; S_FMT returned %s\n", av_fourcc2str(pixelformat), av_fourcc2str(fmt->fmt.pix.pixelformat)); -+ return AVERROR(EINVAL); -+ } - - ret = ioctl(ctx->fd, VIDIOC_G_SELECTION, &sel); -- if (ret) -- av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_G_SELECTION failed: %d\n", ret); -+ if (ret) { -+ ret = AVERROR(errno); -+ av_log(ctx->logctx, AV_LOG_WARNING, "VIDIOC_G_SELECTION failed: %d\n", ret); -+ } - - sel.r.width = width; - sel.r.height = height; -@@ -432,10 +447,12 @@ static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t field, int width, - sel.flags = V4L2_SEL_FLAG_LE; - - ret = ioctl(ctx->fd, VIDIOC_S_SELECTION, &sel); -- if (ret) -- av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_S_SELECTION failed: %d\n", ret); -+ if (ret) { -+ ret = AVERROR(errno); -+ av_log(ctx->logctx, AV_LOG_WARNING, "VIDIOC_S_SELECTION failed: %d\n", ret); -+ } - -- return ret; -+ return 0; - } - - static int deint_v4l2m2m_probe_device(DeintV4L2M2MContextShared *ctx, char *node) -@@ -517,10 +534,25 @@ static int deint_v4l2m2m_enqueue_buffer(V4L2Buffer *buf) - return 0; - } - --static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) -+static int v4l2_buffer_export_drm(V4L2Buffer* avbuf, const uint32_t pixelformat) - { - struct v4l2_exportbuffer expbuf; - int i, ret; -+ uint64_t mod = DRM_FORMAT_MOD_LINEAR; -+ uint32_t fmt = 0; -+ -+ switch (pixelformat) { -+ case V4L2_PIX_FMT_NV12: -+ fmt = DRM_FORMAT_NV12; -+ break; -+ case V4L2_PIX_FMT_YUV420: -+ fmt = DRM_FORMAT_YUV420; -+ break; -+ default: -+ return AVERROR(EINVAL); -+ } -+ -+ avbuf->drm_frame.layers[0].format = fmt; - - for (i = 0; i < avbuf->num_planes; i++) { - memset(&expbuf, 0, sizeof(expbuf)); -@@ -539,12 +571,12 @@ static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) - /* drm frame */ - avbuf->drm_frame.objects[i].size = avbuf->buffer.m.planes[i].length; - avbuf->drm_frame.objects[i].fd = expbuf.fd; -- avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ avbuf->drm_frame.objects[i].format_modifier = mod; - } else { - /* drm frame */ - avbuf->drm_frame.objects[0].size = avbuf->buffer.length; - avbuf->drm_frame.objects[0].fd = expbuf.fd; -- avbuf->drm_frame.objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ avbuf->drm_frame.objects[0].format_modifier = mod; - } - } - -@@ -629,7 +661,7 @@ static int deint_v4l2m2m_allocate_buffers(V4L2Queue *queue) - if (ret) - goto fail; - -- ret = v4l2_buffer_export_drm(buf); -+ ret = v4l2_buffer_export_drm(buf, multiplanar ? fmt->fmt.pix_mp.pixelformat : fmt->fmt.pix.pixelformat); - if (ret) - goto fail; - } -@@ -878,7 +910,6 @@ static void v4l2_free_buffer(void *opaque, uint8_t *unused) - - static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf, int height) - { -- int av_pix_fmt = AV_PIX_FMT_YUV420P; - AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; - AVDRMLayerDescriptor *layer; - -@@ -895,20 +926,13 @@ static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf, int height) - layer->planes[i].pitch = avbuf->plane_info[i].bytesperline; - } - -- switch (av_pix_fmt) { -- case AV_PIX_FMT_YUYV422: -- -- layer->format = DRM_FORMAT_YUYV; -+ switch (layer->format) { -+ case DRM_FORMAT_YUYV: - layer->nb_planes = 1; -- - break; - -- case AV_PIX_FMT_NV12: -- case AV_PIX_FMT_NV21: -- -- layer->format = av_pix_fmt == AV_PIX_FMT_NV12 ? -- DRM_FORMAT_NV12 : DRM_FORMAT_NV21; -- -+ case DRM_FORMAT_NV12: -+ case DRM_FORMAT_NV21: - if (avbuf->num_planes > 1) - break; - -@@ -920,10 +944,7 @@ static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf, int height) - layer->planes[1].pitch = avbuf->plane_info[0].bytesperline; - break; - -- case AV_PIX_FMT_YUV420P: -- -- layer->format = DRM_FORMAT_YUV420; -- -+ case DRM_FORMAT_YUV420: - if (avbuf->num_planes > 1) - break; - -@@ -1032,6 +1053,26 @@ static int deint_v4l2m2m_config_props(AVFilterLink *outlink) - return 0; - } - -+static uint32_t desc_pixelformat(const AVDRMFrameDescriptor * const drm_desc) -+{ -+ const int is_linear = (drm_desc->objects[0].format_modifier == DRM_FORMAT_MOD_LINEAR || -+ drm_desc->objects[0].format_modifier == DRM_FORMAT_MOD_INVALID); -+ -+ switch (drm_desc->layers[0].format) { -+ case DRM_FORMAT_YUV420: -+ if (is_linear) -+ return drm_desc->nb_objects == 1 ? V4L2_PIX_FMT_YUV420 : 0; -+ break; -+ case DRM_FORMAT_NV12: -+ if (is_linear) -+ return drm_desc->nb_objects == 1 ? V4L2_PIX_FMT_NV12 : 0; -+ break; -+ default: -+ break; -+ } -+ return 0; -+} -+ - static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) - { - AVFilterContext *avctx = link->dst; -@@ -1047,23 +1088,27 @@ static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) - avctx->inputs[0]->status_in, avctx->inputs[0]->status_out, avctx->outputs[0]->status_in, avctx->outputs[0]->status_out); - - if (ctx->field_order == V4L2_FIELD_ANY) { -- AVDRMFrameDescriptor *drm_desc = (AVDRMFrameDescriptor *)in->data[0]; -+ const AVDRMFrameDescriptor * const drm_desc = (AVDRMFrameDescriptor *)in->data[0]; -+ const uint32_t pixelformat = desc_pixelformat(drm_desc); -+ -+ if (pixelformat == 0) { -+ av_log(avctx, AV_LOG_ERROR, "Unsupported DRM format %s in %d objects, modifier %#" PRIx64 "\n", -+ av_fourcc2str(drm_desc->layers[0].format), -+ drm_desc->nb_objects, drm_desc->objects[0].format_modifier); -+ return AVERROR(EINVAL); -+ } -+ - ctx->orig_width = drm_desc->layers[0].planes[0].pitch; - ctx->orig_height = drm_desc->layers[0].planes[1].offset / ctx->orig_width; - - av_log(priv, AV_LOG_DEBUG, "%s: %dx%d (%td,%td)\n", __func__, ctx->width, ctx->height, - drm_desc->layers[0].planes[0].pitch, drm_desc->layers[0].planes[1].offset); - -- if (in->top_field_first) -- ctx->field_order = V4L2_FIELD_INTERLACED_TB; -- else -- ctx->field_order = V4L2_FIELD_INTERLACED_BT; -- -- ret = deint_v4l2m2m_set_format(output, ctx->field_order, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); -+ ret = deint_v4l2m2m_set_format(output, pixelformat, ctx->field_order, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); - if (ret) - return ret; - -- ret = deint_v4l2m2m_set_format(capture, V4L2_FIELD_NONE, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); -+ ret = deint_v4l2m2m_set_format(capture, pixelformat, V4L2_FIELD_NONE, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); - if (ret) - return ret; - -@@ -1082,6 +1127,12 @@ static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) - ret = deint_v4l2m2m_streamon(output); - if (ret) - return ret; -+ -+ if (in->top_field_first) -+ ctx->field_order = V4L2_FIELD_INTERLACED_TB; -+ else -+ ctx->field_order = V4L2_FIELD_INTERLACED_BT; -+ - } - - ret = deint_v4l2m2m_enqueue_frame(output, in); -@@ -1157,28 +1208,31 @@ again: - return 0; - } - -- { -+ recycle_q(&s->output); -+ n = count_enqueued(&s->output); -+ -+ while (n < 6) { - AVFrame * frame; - int rv; - -- recycle_q(&s->output); -- n = count_enqueued(&s->output); -+ if ((rv = ff_inlink_consume_frame(inlink, &frame)) < 0) { -+ av_log(priv, AV_LOG_ERROR, "%s: consume in failed: %s\n", __func__, av_err2str(rv)); -+ return rv; -+ } - -- while (n < 6) { -- if ((rv = ff_inlink_consume_frame(inlink, &frame)) < 0) { -- av_log(priv, AV_LOG_ERROR, "%s: consume in failed: %s\n", __func__, av_err2str(rv)); -- return rv; -- } -+ if (frame == NULL) { -+ av_log(priv, AV_LOG_TRACE, "%s: No frame\n", __func__); -+ break; -+ } - -- if (frame == NULL) { -- av_log(priv, AV_LOG_TRACE, "%s: No frame\n", __func__); -- break; -- } -+ rv = deint_v4l2m2m_filter_frame(inlink, frame); -+ av_frame_free(&frame); - -- deint_v4l2m2m_filter_frame(inlink, frame); -- av_log(priv, AV_LOG_TRACE, "%s: Q frame\n", __func__); -- ++n; -- } -+ if (rv != 0) -+ return rv; -+ -+ av_log(priv, AV_LOG_TRACE, "%s: Q frame\n", __func__); -+ ++n; - } - - if (n < 6) { - -From 3d07826bcf588ad0384d00b210415664aa4489fb Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 19 Aug 2022 15:29:11 +0000 -Subject: [PATCH 063/151] v4l2_req: Enable use of MMAP for buffer alloc - -Use MMAP rather than DMABUF if either the dmabuf device can't be opened -or create_buf doesn't set the capability. ---- - libavcodec/v4l2_req_dmabufs.c | 22 +++ - libavcodec/v4l2_req_dmabufs.h | 3 + - libavcodec/v4l2_req_media.c | 263 ++++++++++++++++++++++++++++----- - libavcodec/v4l2_req_media.h | 21 ++- - libavcodec/v4l2_request_hevc.c | 42 +++++- - 5 files changed, 307 insertions(+), 44 deletions(-) - -diff --git a/libavcodec/v4l2_req_dmabufs.c b/libavcodec/v4l2_req_dmabufs.c -index ae6c648369..c4bbed18c6 100644 ---- a/libavcodec/v4l2_req_dmabufs.c -+++ b/libavcodec/v4l2_req_dmabufs.c -@@ -36,6 +36,26 @@ static unsigned int total_bufs = 0; - static size_t total_size = 0; - #endif - -+struct dmabuf_h * dmabuf_import_mmap(void * mapptr, size_t size) -+{ -+ struct dmabuf_h *dh; -+ -+ if (mapptr == MAP_FAILED) -+ return NULL; -+ -+ dh = malloc(sizeof(*dh)); -+ if (!dh) -+ return NULL; -+ -+ *dh = (struct dmabuf_h) { -+ .fd = -1, -+ .size = size, -+ .mapptr = mapptr -+ }; -+ -+ return dh; -+} -+ - struct dmabuf_h * dmabuf_import(int fd, size_t size) - { - struct dmabuf_h *dh; -@@ -122,6 +142,8 @@ int dmabuf_sync(struct dmabuf_h * const dh, unsigned int flags) - struct dma_buf_sync sync = { - .flags = flags - }; -+ if (dh->fd == -1) -+ return 0; - while (ioctl(dh->fd, DMA_BUF_IOCTL_SYNC, &sync) == -1) { - const int err = errno; - if (errno == EINTR) -diff --git a/libavcodec/v4l2_req_dmabufs.h b/libavcodec/v4l2_req_dmabufs.h -index cfb17e801d..c1d3d8c8d7 100644 ---- a/libavcodec/v4l2_req_dmabufs.h -+++ b/libavcodec/v4l2_req_dmabufs.h -@@ -18,6 +18,9 @@ static inline struct dmabuf_h * dmabuf_alloc(struct dmabufs_ctl * dbsc, size_t s - } - /* Create from existing fd - dups(fd) */ - struct dmabuf_h * dmabuf_import(int fd, size_t size); -+/* Import an MMAP - return NULL if mapptr = MAP_FAIL */ -+struct dmabuf_h * dmabuf_import_mmap(void * mapptr, size_t size); -+ - void * dmabuf_map(struct dmabuf_h * const dh); - - /* flags from linux/dmabuf.h DMA_BUF_SYNC_xxx */ -diff --git a/libavcodec/v4l2_req_media.c b/libavcodec/v4l2_req_media.c -index 980b306b8a..910ac77bb6 100644 ---- a/libavcodec/v4l2_req_media.c -+++ b/libavcodec/v4l2_req_media.c -@@ -33,9 +33,11 @@ - #include - #include - #include -+#include - #include - #include - #include -+#include - - #include - -@@ -95,6 +97,32 @@ struct media_request { - struct polltask * pt; - }; - -+static inline enum v4l2_memory -+mediabufs_memory_to_v4l2(const enum mediabufs_memory m) -+{ -+ return (enum v4l2_memory)m; -+} -+ -+const char * -+mediabufs_memory_name(const enum mediabufs_memory m) -+{ -+ switch (m) { -+ case MEDIABUFS_MEMORY_UNSET: -+ return "Unset"; -+ case MEDIABUFS_MEMORY_MMAP: -+ return "MMap"; -+ case MEDIABUFS_MEMORY_USERPTR: -+ return "UserPtr"; -+ case MEDIABUFS_MEMORY_OVERLAY: -+ return "Overlay"; -+ case MEDIABUFS_MEMORY_DMABUF: -+ return "DMABuf"; -+ default: -+ break; -+ } -+ return "Unknown"; -+} -+ - - static inline int do_trywait(sem_t *const sem) - { -@@ -115,14 +143,14 @@ static inline int do_wait(sem_t *const sem) - } - - static int request_buffers(int video_fd, unsigned int type, -- enum v4l2_memory memory, unsigned int buffers_count) -+ enum mediabufs_memory memory, unsigned int buffers_count) - { - struct v4l2_requestbuffers buffers; - int rc; - - memset(&buffers, 0, sizeof(buffers)); - buffers.type = type; -- buffers.memory = memory; -+ buffers.memory = mediabufs_memory_to_v4l2(memory); - buffers.count = buffers_count; - - rc = ioctl(video_fd, VIDIOC_REQBUFS, &buffers); -@@ -324,6 +352,7 @@ struct qent_base { - struct qent_base *next; - struct qent_base *prev; - enum qent_status status; -+ enum mediabufs_memory memtype; - uint32_t index; - struct dmabuf_h *dh[VIDEO_MAX_PLANES]; - struct timeval timestamp; -@@ -348,9 +377,9 @@ struct qe_list_head { - }; - - struct buf_pool { -+ enum mediabufs_memory memtype; - pthread_mutex_t lock; - sem_t free_sem; -- enum v4l2_buf_type buf_type; - struct qe_list_head free; - struct qe_list_head inuse; - }; -@@ -367,9 +396,10 @@ static inline struct qent_src *base_to_src(struct qent_base *be) - } - - --#define QENT_BASE_INITIALIZER {\ -+#define QENT_BASE_INITIALIZER(mtype) {\ - .ref_count = ATOMIC_VAR_INIT(0),\ - .status = QENT_NEW,\ -+ .memtype = (mtype),\ - .index = INDEX_UNSET\ - } - -@@ -390,13 +420,13 @@ static void qe_src_free(struct qent_src *const be_src) - free(be_src); - } - --static struct qent_src * qe_src_new(void) -+static struct qent_src * qe_src_new(enum mediabufs_memory mtype) - { - struct qent_src *const be_src = malloc(sizeof(*be_src)); - if (!be_src) - return NULL; - *be_src = (struct qent_src){ -- .base = QENT_BASE_INITIALIZER -+ .base = QENT_BASE_INITIALIZER(mtype) - }; - return be_src; - } -@@ -413,13 +443,13 @@ static void qe_dst_free(struct qent_dst *const be_dst) - free(be_dst); - } - --static struct qent_dst* qe_dst_new(struct ff_weak_link_master * const wl) -+static struct qent_dst* qe_dst_new(struct ff_weak_link_master * const wl, const enum mediabufs_memory memtype) - { - struct qent_dst *const be_dst = malloc(sizeof(*be_dst)); - if (!be_dst) - return NULL; - *be_dst = (struct qent_dst){ -- .base = QENT_BASE_INITIALIZER, -+ .base = QENT_BASE_INITIALIZER(memtype), - .lock = PTHREAD_MUTEX_INITIALIZER, - .cond = PTHREAD_COND_INITIALIZER, - .mbc_wl = ff_weak_link_ref(wl) -@@ -553,14 +583,14 @@ static struct qent_base *queue_tryget_free(struct buf_pool *const bp) - return buf; - } - --static struct qent_base * queue_find_extract_fd(struct buf_pool *const bp, const int fd) -+static struct qent_base * queue_find_extract_index(struct buf_pool *const bp, const unsigned int index) - { - struct qent_base *be; - - pthread_mutex_lock(&bp->lock); - /* Expect 1st in Q, but allow anywhere */ - for (be = bp->inuse.head; be; be = be->next) { -- if (dmabuf_fd(be->dh[0]) == fd) { -+ if (be->index == index) { - bq_extract_inuse(bp, be); - break; - } -@@ -602,6 +632,8 @@ struct mediabufs_ctl { - struct pollqueue * pq; - struct ff_weak_link_master * this_wlm; - -+ enum mediabufs_memory src_memtype; -+ enum mediabufs_memory dst_memtype; - struct v4l2_format src_fmt; - struct v4l2_format dst_fmt; - struct v4l2_capability capability; -@@ -614,7 +646,7 @@ static int qe_v4l2_queue(struct qent_base *const be, - { - struct v4l2_buffer buffer = { - .type = fmt->type, -- .memory = V4L2_MEMORY_DMABUF, -+ .memory = mediabufs_memory_to_v4l2(be->memtype), - .index = be->index - }; - struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; -@@ -628,7 +660,10 @@ static int qe_v4l2_queue(struct qent_base *const be, - /* *** Really need a pixdesc rather than a format so we can fill in data_offset */ - planes[i].length = dmabuf_size(be->dh[i]); - planes[i].bytesused = dmabuf_len(be->dh[i]); -- planes[i].m.fd = dmabuf_fd(be->dh[i]); -+ if (be->memtype == MEDIABUFS_MEMORY_DMABUF) -+ planes[i].m.fd = dmabuf_fd(be->dh[i]); -+ else -+ planes[i].m.mem_offset = 0; - } - buffer.m.planes = planes; - buffer.length = i; -@@ -639,7 +674,10 @@ static int qe_v4l2_queue(struct qent_base *const be, - - buffer.bytesused = dmabuf_len(be->dh[0]); - buffer.length = dmabuf_size(be->dh[0]); -- buffer.m.fd = dmabuf_fd(be->dh[0]); -+ if (be->memtype == MEDIABUFS_MEMORY_DMABUF) -+ buffer.m.fd = dmabuf_fd(be->dh[0]); -+ else -+ buffer.m.offset = 0; - } - - if (!is_dst && mreq) { -@@ -668,14 +706,13 @@ static struct qent_base * qe_dequeue(struct buf_pool *const bp, - const int vfd, - const struct v4l2_format * const f) - { -- int fd; - struct qent_base *be; - int rc; - const bool mp = V4L2_TYPE_IS_MULTIPLANAR(f->type); - struct v4l2_plane planes[VIDEO_MAX_PLANES] = {{0}}; - struct v4l2_buffer buffer = { - .type = f->type, -- .memory = V4L2_MEMORY_DMABUF -+ .memory = mediabufs_memory_to_v4l2(bp->memtype) - }; - if (mp) { - buffer.length = f->fmt.pix_mp.num_planes; -@@ -690,10 +727,9 @@ static struct qent_base * qe_dequeue(struct buf_pool *const bp, - return NULL; - } - -- fd = mp ? planes[0].m.fd : buffer.m.fd; -- be = queue_find_extract_fd(bp, fd); -+ be = queue_find_extract_index(bp, buffer.index); - if (!be) { -- request_log("Failed to find fd %d in Q\n", fd); -+ request_log("Failed to find index %d in Q\n", buffer.index); - return NULL; - } - -@@ -1104,7 +1140,7 @@ static int create_dst_bufs(struct mediabufs_ctl *const mbc, unsigned int n, stru - - struct v4l2_create_buffers cbuf = { - .count = n, -- .memory = V4L2_MEMORY_DMABUF, -+ .memory = mediabufs_memory_to_v4l2(mbc->dst->memtype), - .format = mbc->dst_fmt, - }; - -@@ -1125,12 +1161,97 @@ static int create_dst_bufs(struct mediabufs_ctl *const mbc, unsigned int n, stru - return cbuf.count; - } - -+static MediaBufsStatus -+qe_import_from_buf(struct mediabufs_ctl *const mbc, struct qent_base * const be, const struct v4l2_format *const fmt, -+ const unsigned int n, const bool x_dmabuf) -+{ -+ struct v4l2_buffer buf = { -+ .index = n, -+ .type = fmt->type, -+ }; -+ struct v4l2_plane planes[VIDEO_MAX_PLANES]; -+ int ret; -+ -+ if (be->dh[0]) -+ return 0; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ memset(planes, 0, sizeof(planes)); -+ buf.m.planes = planes; -+ buf.length = VIDEO_MAX_PLANES; -+ } -+ -+ if ((ret = ioctl(mbc->vfd, VIDIOC_QUERYBUF, &buf)) != 0) { -+ request_err(mbc->dc, "VIDIOC_QUERYBUF failed"); -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ } -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) -+ { -+ unsigned int i; -+ for (i = 0; i != buf.length; ++i) { -+ if (x_dmabuf) { -+ struct v4l2_exportbuffer xbuf = { -+ .type = buf.type, -+ .index = buf.index, -+ .plane = i, -+ .flags = O_RDWR, // *** Arguably O_RDONLY would be fine -+ }; -+ if (ioctl(mbc->vfd, VIDIOC_EXPBUF, &xbuf) == 0) -+ be->dh[i] = dmabuf_import(xbuf.fd, planes[i].length); -+ } -+ else { -+ be->dh[i] = dmabuf_import_mmap( -+ mmap(NULL, planes[i].length, -+ PROT_READ | PROT_WRITE, -+ MAP_SHARED | MAP_POPULATE, -+ mbc->vfd, planes[i].m.mem_offset), -+ planes[i].length); -+ } -+ /* On failure tidy up and die */ -+ if (!be->dh[i]) { -+ while (i--) { -+ dmabuf_free(be->dh[i]); -+ be->dh[i] = NULL; -+ } -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ } -+ } -+ } -+ else -+ { -+ if (x_dmabuf) { -+ struct v4l2_exportbuffer xbuf = { -+ .type = buf.type, -+ .index = buf.index, -+ .flags = O_RDWR, // *** Arguably O_RDONLY would be fine -+ }; -+ if (ioctl(mbc->vfd, VIDIOC_EXPBUF, &xbuf) == 0) -+ be->dh[0] = dmabuf_import(xbuf.fd, buf.length); -+ } -+ else { -+ be->dh[0] = dmabuf_import_mmap( -+ mmap(NULL, buf.length, -+ PROT_READ | PROT_WRITE, -+ MAP_SHARED | MAP_POPULATE, -+ mbc->vfd, buf.m.offset), -+ buf.length); -+ } -+ /* On failure tidy up and die */ -+ if (!be->dh[0]) { -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ } -+ } -+ -+ return 0; -+} -+ - struct qent_dst* mediabufs_dst_qent_alloc(struct mediabufs_ctl *const mbc, struct dmabufs_ctl *const dbsc) - { - struct qent_dst * be_dst; - - if (mbc == NULL) { -- be_dst = qe_dst_new(NULL); -+ be_dst = qe_dst_new(NULL, MEDIABUFS_MEMORY_DMABUF); - if (be_dst) - be_dst->base.status = QENT_IMPORT; - return be_dst; -@@ -1144,7 +1265,7 @@ struct qent_dst* mediabufs_dst_qent_alloc(struct mediabufs_ctl *const mbc, struc - else { - be_dst = base_to_dst(queue_tryget_free(mbc->dst)); - if (!be_dst) { -- be_dst = qe_dst_new(mbc->this_wlm); -+ be_dst = qe_dst_new(mbc->this_wlm, mbc->dst->memtype); - if (!be_dst) - return NULL; - -@@ -1155,12 +1276,21 @@ struct qent_dst* mediabufs_dst_qent_alloc(struct mediabufs_ctl *const mbc, struc - } - } - -- if (qe_alloc_from_fmt(&be_dst->base, dbsc, &mbc->dst_fmt)) { -- /* Given how create buf works we can't uncreate it on alloc failure -- * all we can do is put it on the free Q -- */ -- queue_put_free(mbc->dst, &be_dst->base); -- return NULL; -+ if (mbc->dst->memtype == MEDIABUFS_MEMORY_MMAP) { -+ if (qe_import_from_buf(mbc, &be_dst->base, &mbc->dst_fmt, be_dst->base.index, true)) { -+ request_err(mbc->dc, "Failed to export as dmabuf\n"); -+ queue_put_free(mbc->dst, &be_dst->base); -+ return NULL; -+ } -+ } -+ else { -+ if (qe_alloc_from_fmt(&be_dst->base, dbsc, &mbc->dst_fmt)) { -+ /* Given how create buf works we can't uncreate it on alloc failure -+ * all we can do is put it on the free Q -+ */ -+ queue_put_free(mbc->dst, &be_dst->base); -+ return NULL; -+ } - } - - be_dst->base.status = QENT_PENDING; -@@ -1208,7 +1338,7 @@ MediaBufsStatus mediabufs_dst_fmt_set(struct mediabufs_ctl *const mbc, - - // ** This is a mess if we get partial alloc but without any way to remove - // individual V4L2 Q members we are somewhat stuffed --MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed) -+MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed, const enum mediabufs_memory memtype) - { - unsigned int i; - int a = 0; -@@ -1218,10 +1348,12 @@ MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, cons - if (n > 32) - return MEDIABUFS_ERROR_ALLOCATION_FAILED; - -+ mbc->dst->memtype = memtype; -+ - // Create qents first as it is hard to get rid of the V4L2 buffers on error - for (qc = 0; qc != n; ++qc) - { -- if ((qes[qc] = qe_dst_new(mbc->this_wlm)) == NULL) -+ if ((qes[qc] = qe_dst_new(mbc->this_wlm, mbc->dst->memtype)) == NULL) - goto fail; - } - -@@ -1260,19 +1392,61 @@ void mediabufs_src_qent_abort(struct mediabufs_ctl *const mbc, struct qent_src * - queue_put_free(mbc->src, &qe_src->base); - } - -+static MediaBufsStatus -+chk_memory_type(struct mediabufs_ctl *const mbc, -+ const struct v4l2_format * const f, -+ const enum mediabufs_memory m) -+{ -+ struct v4l2_create_buffers cbuf = { -+ .count = 0, -+ .memory = V4L2_MEMORY_MMAP, -+ .format = *f -+ }; -+ -+ if (ioctl(mbc->vfd, VIDIOC_CREATE_BUFS, &cbuf) != 0) -+ return MEDIABUFS_ERROR_OPERATION_FAILED; -+ -+ switch (m) { -+ case MEDIABUFS_MEMORY_DMABUF: -+ // 0 = Unknown but assume not in that case -+ if ((cbuf.capabilities & V4L2_BUF_CAP_SUPPORTS_DMABUF) == 0) -+ return MEDIABUFS_ERROR_UNSUPPORTED_MEMORY; -+ break; -+ case MEDIABUFS_MEMORY_MMAP: -+ break; -+ default: -+ return MEDIABUFS_ERROR_UNSUPPORTED_MEMORY; -+ } -+ -+ return MEDIABUFS_STATUS_SUCCESS; -+} -+ -+MediaBufsStatus -+mediabufs_src_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype) -+{ -+ return chk_memory_type(mbc, &mbc->src_fmt, memtype); -+} -+ -+MediaBufsStatus -+mediabufs_dst_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype) -+{ -+ return chk_memory_type(mbc, &mbc->dst_fmt, memtype); -+} -+ - /* src format must have been set up before this */ - MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const mbc, - struct dmabufs_ctl * const dbsc, -- unsigned int n) -+ unsigned int n, const enum mediabufs_memory memtype) - { - unsigned int i; - struct v4l2_requestbuffers req = { - .count = n, - .type = mbc->src_fmt.type, -- .memory = V4L2_MEMORY_DMABUF -+ .memory = mediabufs_memory_to_v4l2(memtype) - }; - - bq_free_all_free_src(mbc->src); -+ - while (ioctl(mbc->vfd, VIDIOC_REQBUFS, &req) == -1) { - if (errno != EINTR) { - request_err(mbc->dc, "%s: Failed to request src bufs\n", __func__); -@@ -1286,21 +1460,36 @@ MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const mbc, - } - - for (i = 0; i != n; ++i) { -- struct qent_src *const be_src = qe_src_new(); -+ struct qent_src *const be_src = qe_src_new(memtype); - if (!be_src) { - request_err(mbc->dc, "Failed to create src be %d\n", i); - goto fail; - } -- if (qe_alloc_from_fmt(&be_src->base, dbsc, &mbc->src_fmt)) { -- qe_src_free(be_src); -+ switch (memtype) { -+ case MEDIABUFS_MEMORY_MMAP: -+ if (qe_import_from_buf(mbc, &be_src->base, &mbc->src_fmt, i, false)) { -+ qe_src_free(be_src); -+ goto fail; -+ } -+ be_src->fixed_size = 1; -+ break; -+ case MEDIABUFS_MEMORY_DMABUF: -+ if (qe_alloc_from_fmt(&be_src->base, dbsc, &mbc->src_fmt)) { -+ qe_src_free(be_src); -+ goto fail; -+ } -+ be_src->fixed_size = !mediabufs_src_resizable(mbc); -+ break; -+ default: -+ request_err(mbc->dc, "Unexpected memorty type\n"); - goto fail; - } - be_src->base.index = i; -- be_src->fixed_size = !mediabufs_src_resizable(mbc); - - queue_put_free(mbc->src, &be_src->base); - } - -+ mbc->src->memtype = memtype; - return MEDIABUFS_STATUS_SUCCESS; - - fail: -@@ -1437,9 +1626,13 @@ int mediabufs_ctl_query_ext_ctrls(struct mediabufs_ctl * mbc, struct v4l2_query_ - - int mediabufs_src_resizable(const struct mediabufs_ctl *const mbc) - { -+#if 1 -+ return 0; -+#else - // Single planar OUTPUT can only take exact size buffers - // Multiplanar will take larger than negotiated - return V4L2_TYPE_IS_MULTIPLANAR(mbc->src_fmt.type); -+#endif - } - - static void mediabufs_ctl_delete(struct mediabufs_ctl *const mbc) -diff --git a/libavcodec/v4l2_req_media.h b/libavcodec/v4l2_req_media.h -index 0307a831de..890947b2e2 100644 ---- a/libavcodec/v4l2_req_media.h -+++ b/libavcodec/v4l2_req_media.h -@@ -43,6 +43,7 @@ typedef enum media_buf_status { - MEDIABUFS_ERROR_UNSUPPORTED_BUFFERTYPE, - MEDIABUFS_ERROR_UNSUPPORTED_RT_FORMAT, - MEDIABUFS_ERROR_ALLOCATION_FAILED, -+ MEDIABUFS_ERROR_UNSUPPORTED_MEMORY, - } MediaBufsStatus; - - struct media_pool * media_pool_new(const char * const media_path, -@@ -70,6 +71,15 @@ struct qent_dst; - struct dmabuf_h; - struct dmabufs_ctl; - -+// 1-1 mammping to V4L2 type - just defined separetely to avoid some include versioning difficulties -+enum mediabufs_memory { -+ MEDIABUFS_MEMORY_UNSET = 0, -+ MEDIABUFS_MEMORY_MMAP = 1, -+ MEDIABUFS_MEMORY_USERPTR = 2, -+ MEDIABUFS_MEMORY_OVERLAY = 3, -+ MEDIABUFS_MEMORY_DMABUF = 4, -+}; -+ - int qent_src_params_set(struct qent_src *const be, const struct timeval * timestamp); - struct timeval qent_dst_timestamp_get(const struct qent_dst *const be_dst); - -@@ -93,6 +103,8 @@ MediaBufsStatus qent_dst_import_fd(struct qent_dst *const be_dst, - unsigned int plane, - int fd, size_t size); - -+const char * mediabufs_memory_name(const enum mediabufs_memory m); -+ - MediaBufsStatus mediabufs_start_request(struct mediabufs_ctl *const mbc, - struct media_request **const pmreq, - struct qent_src **const psrc_be, -@@ -106,7 +118,7 @@ struct qent_dst* mediabufs_dst_qent_alloc(struct mediabufs_ctl *const mbc, - // Create dst slots without alloc - // If fixed true then qent_alloc will only get slots from this pool and will - // block until a qent has been unrefed --MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed); -+MediaBufsStatus mediabufs_dst_slots_create(struct mediabufs_ctl *const mbc, const unsigned int n, const bool fixed, const enum mediabufs_memory memtype); - - MediaBufsStatus mediabufs_stream_on(struct mediabufs_ctl *const mbc); - MediaBufsStatus mediabufs_stream_off(struct mediabufs_ctl *const mbc); -@@ -140,7 +152,12 @@ MediaBufsStatus mediabufs_src_fmt_set(struct mediabufs_ctl *const mbc, - - MediaBufsStatus mediabufs_src_pool_create(struct mediabufs_ctl *const rw, - struct dmabufs_ctl * const dbsc, -- unsigned int n); -+ unsigned int n, -+ const enum mediabufs_memory memtype); -+ -+// Want to have appropriate formats set first -+MediaBufsStatus mediabufs_src_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype); -+MediaBufsStatus mediabufs_dst_chk_memtype(struct mediabufs_ctl *const mbc, const enum mediabufs_memory memtype); - - #define MEDIABUFS_DRIVER_VERSION(a, b, c) (((a) << 16) | ((b) << 8) | (c)) - unsigned int mediabufs_ctl_driver_version(struct mediabufs_ctl *const mbc); -diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index cd79aad563..5cf17dd5e3 100644 ---- a/libavcodec/v4l2_request_hevc.c -+++ b/libavcodec/v4l2_request_hevc.c -@@ -144,6 +144,8 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - const struct decdev * decdev; - const uint32_t src_pix_fmt = V2(ff_v4l2_req_hevc, 1).src_pix_fmt_v4l2; // Assuming constant for all APIs but avoiding V4L2 includes - size_t src_size; -+ enum mediabufs_memory src_memtype; -+ enum mediabufs_memory dst_memtype; - - av_log(avctx, AV_LOG_DEBUG, "<<< %s\n", __func__); - -@@ -174,8 +176,14 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - decdev_media_path(decdev), decdev_video_path(decdev)); - - if ((ctx->dbufs = dmabufs_ctl_new()) == NULL) { -- av_log(avctx, AV_LOG_ERROR, "Unable to open dmabufs\n"); -- goto fail0; -+ av_log(avctx, AV_LOG_DEBUG, "Unable to open dmabufs - try mmap buffers\n"); -+ src_memtype = MEDIABUFS_MEMORY_MMAP; -+ dst_memtype = MEDIABUFS_MEMORY_MMAP; -+ } -+ else { -+ av_log(avctx, AV_LOG_DEBUG, "Dmabufs opened - try dmabuf buffers\n"); -+ src_memtype = MEDIABUFS_MEMORY_DMABUF; -+ dst_memtype = MEDIABUFS_MEMORY_DMABUF; - } - - if ((ctx->pq = pollqueue_new()) == NULL) { -@@ -196,8 +204,9 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - // Ask for an initial bitbuf size of max size / 4 - // We will realloc if we need more - // Must use sps->h/w as avctx contains cropped size -+retry_src_memtype: - src_size = bit_buf_size(sps->width, sps->height, sps->bit_depth - 8); -- if (mediabufs_src_resizable(ctx->mbufs)) -+ if (src_memtype == MEDIABUFS_MEMORY_DMABUF && mediabufs_src_resizable(ctx->mbufs)) - src_size /= 4; - // Kludge for conformance tests which break Annex A limits - else if (src_size < 0x40000) -@@ -210,6 +219,15 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - goto fail4; - } - -+ if (mediabufs_src_chk_memtype(ctx->mbufs, src_memtype)) { -+ if (src_memtype == MEDIABUFS_MEMORY_DMABUF) { -+ src_memtype = MEDIABUFS_MEMORY_MMAP; -+ goto retry_src_memtype; -+ } -+ av_log(avctx, AV_LOG_ERROR, "Failed to get src memory type\n"); -+ goto fail4; -+ } -+ - if (V2(ff_v4l2_req_hevc, 4).probe(avctx, ctx) == 0) { - av_log(avctx, AV_LOG_DEBUG, "HEVC API version 4 probed successfully\n"); - ctx->fns = &V2(ff_v4l2_req_hevc, 4); -@@ -238,7 +256,7 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - goto fail4; - } - -- if (mediabufs_src_pool_create(ctx->mbufs, ctx->dbufs, 6)) { -+ if (mediabufs_src_pool_create(ctx->mbufs, ctx->dbufs, 6, src_memtype)) { - av_log(avctx, AV_LOG_ERROR, "Failed to create source pool\n"); - goto fail4; - } -@@ -250,8 +268,17 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering, - avctx->thread_count, avctx->extra_hw_frames); - -+ if (mediabufs_dst_chk_memtype(ctx->mbufs, dst_memtype)) { -+ if (dst_memtype != MEDIABUFS_MEMORY_DMABUF) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to get dst memory type\n"); -+ goto fail4; -+ } -+ av_log(avctx, AV_LOG_DEBUG, "Dst DMABUF not supported - trying mmap\n"); -+ dst_memtype = MEDIABUFS_MEMORY_MMAP; -+ } -+ - // extra_hw_frames is -1 if unset -- if (mediabufs_dst_slots_create(ctx->mbufs, dst_slots, (avctx->extra_hw_frames > 0))) { -+ if (mediabufs_dst_slots_create(ctx->mbufs, dst_slots, (avctx->extra_hw_frames > 0), dst_memtype)) { - av_log(avctx, AV_LOG_ERROR, "Failed to create destination slots\n"); - goto fail4; - } -@@ -277,9 +304,10 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - // Set our s/w format - avctx->sw_pix_fmt = ((AVHWFramesContext *)avctx->hw_frames_ctx->data)->sw_format; - -- av_log(avctx, AV_LOG_INFO, "Hwaccel %s; devices: %s,%s\n", -+ av_log(avctx, AV_LOG_INFO, "Hwaccel %s; devices: %s,%s; buffers: src %s, dst %s\n", - ctx->fns->name, -- decdev_media_path(decdev), decdev_video_path(decdev)); -+ decdev_media_path(decdev), decdev_video_path(decdev), -+ mediabufs_memory_name(src_memtype), mediabufs_memory_name(dst_memtype)); - - return 0; - - -From 79c2fcac56586ce9eea0cc8c6b13d2cd54f3e468 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 22 Aug 2022 12:35:40 +0000 -Subject: [PATCH 064/151] Set buffer lengths on DQ - ---- - libavcodec/v4l2_req_media.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/libavcodec/v4l2_req_media.c b/libavcodec/v4l2_req_media.c -index 910ac77bb6..1a9944774a 100644 ---- a/libavcodec/v4l2_req_media.c -+++ b/libavcodec/v4l2_req_media.c -@@ -733,6 +733,14 @@ static struct qent_base * qe_dequeue(struct buf_pool *const bp, - return NULL; - } - -+ if (mp) { -+ unsigned int i; -+ for (i = 0; i != buffer.length; ++i) -+ dmabuf_len_set(be->dh[i], V4L2_TYPE_IS_CAPTURE(f->type) ? planes[i].bytesused : 0); -+ } -+ else -+ dmabuf_len_set(be->dh[0], V4L2_TYPE_IS_CAPTURE(f->type) ? buffer.length : 0); -+ - be->timestamp = buffer.timestamp; - be->status = (buffer.flags & V4L2_BUF_FLAG_ERROR) ? QENT_ERROR : QENT_DONE; - return be; - -From 8f3245ca1e4b2ec7e13fc2f3bffbc964ee8fc290 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 22 Aug 2022 17:11:24 +0000 -Subject: [PATCH 065/151] Fix compile if videodev2.h defines V4L2 HEVC request - API - -If videodev2.h does define the HEVC request API it is really hard to -set old variations of the controls so if it does then we only compile -against the system includes and remove the back compatability. ---- - configure | 9 +++++++++ - libavcodec/Makefile | 4 ++-- - libavcodec/hevc-ctrls-v4.h | 2 ++ - libavcodec/v4l2_req_hevc_vx.c | 5 ----- - libavcodec/v4l2_request_hevc.c | 6 ++++-- - 5 files changed, 17 insertions(+), 9 deletions(-) - -diff --git a/configure b/configure -index fdc95146bf..5c00a183e3 100755 ---- a/configure -+++ b/configure -@@ -1946,6 +1946,7 @@ FEATURE_LIST=" - swscale_alpha - vout_drm - vout_egl -+ v4l2_req_hevc_vx - " - - # this list should be kept in linking order -@@ -6912,6 +6913,14 @@ fi - - check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns - check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;" -+disable v4l2_req_hevc_vx -+if enabled hevc_v4l2request_hwaccel; then -+ enable v4l2_req_hevc_vx -+fi -+if enabled hevc_v4l2_request; then -+ disable v4l2_req_hevc_vx -+fi -+ - check_headers sys/videoio.h - test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete - -diff --git a/libavcodec/Makefile b/libavcodec/Makefile -index d433a71236..11f183c9b9 100644 ---- a/libavcodec/Makefile -+++ b/libavcodec/Makefile -@@ -999,8 +999,8 @@ OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o - OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o - OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o - OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o --OBJS-$(CONFIG_HEVC_V4L2REQUEST_HWACCEL) += v4l2_request_hevc.o v4l2_req_decode_q.o\ -- v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o v4l2_req_hevc_v3.o v4l2_req_hevc_v4.o -+OBJS-$(CONFIG_HEVC_V4L2REQUEST_HWACCEL) += v4l2_request_hevc.o v4l2_req_decode_q.o v4l2_req_hevc_v4.o -+OBJS-$(CONFIG_V4L2_REQ_HEVC_VX) += v4l2_req_hevc_v1.o v4l2_req_hevc_v2.o v4l2_req_hevc_v3.o - OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o - OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o - OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o -diff --git a/libavcodec/hevc-ctrls-v4.h b/libavcodec/hevc-ctrls-v4.h -index 7e05f6e7c3..7829d82084 100644 ---- a/libavcodec/hevc-ctrls-v4.h -+++ b/libavcodec/hevc-ctrls-v4.h -@@ -53,6 +53,8 @@ - #include - #include - -+#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ -+ - #define V4L2_CID_STATELESS_HEVC_SPS (V4L2_CID_CODEC_STATELESS_BASE + 400) - #define V4L2_CID_STATELESS_HEVC_PPS (V4L2_CID_CODEC_STATELESS_BASE + 401) - #define V4L2_CID_STATELESS_HEVC_SLICE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 402) -diff --git a/libavcodec/v4l2_req_hevc_vx.c b/libavcodec/v4l2_req_hevc_vx.c -index 5d083016f8..e1bd5c6a1f 100644 ---- a/libavcodec/v4l2_req_hevc_vx.c -+++ b/libavcodec/v4l2_req_hevc_vx.c -@@ -40,11 +40,6 @@ - #define V4L2_STATELESS_HEVC_START_CODE_ANNEX_B V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B - #endif - --// Should be in videodev2 but we might not have a good enough one --#ifndef V4L2_PIX_FMT_HEVC_SLICE --#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ --#endif -- - #include "v4l2_request_hevc.h" - - #include "libavutil/hwcontext_drm.h" -diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index 5cf17dd5e3..614a1b4d99 100644 ---- a/libavcodec/v4l2_request_hevc.c -+++ b/libavcodec/v4l2_request_hevc.c -@@ -17,7 +17,7 @@ - */ - - -- -+#include "config.h" - #include "decode.h" - #include "hevcdec.h" - #include "hwconfig.h" -@@ -142,7 +142,7 @@ static int v4l2_request_hevc_init(AVCodecContext *avctx) - const HEVCSPS * const sps = h->ps.sps; - int ret; - const struct decdev * decdev; -- const uint32_t src_pix_fmt = V2(ff_v4l2_req_hevc, 1).src_pix_fmt_v4l2; // Assuming constant for all APIs but avoiding V4L2 includes -+ const uint32_t src_pix_fmt = V2(ff_v4l2_req_hevc, 4).src_pix_fmt_v4l2; // Assuming constant for all APIs but avoiding V4L2 includes - size_t src_size; - enum mediabufs_memory src_memtype; - enum mediabufs_memory dst_memtype; -@@ -232,6 +232,7 @@ retry_src_memtype: - av_log(avctx, AV_LOG_DEBUG, "HEVC API version 4 probed successfully\n"); - ctx->fns = &V2(ff_v4l2_req_hevc, 4); - } -+#if CONFIG_V4L2_REQ_HEVC_VX - else if (V2(ff_v4l2_req_hevc, 3).probe(avctx, ctx) == 0) { - av_log(avctx, AV_LOG_DEBUG, "HEVC API version 3 probed successfully\n"); - ctx->fns = &V2(ff_v4l2_req_hevc, 3); -@@ -244,6 +245,7 @@ retry_src_memtype: - av_log(avctx, AV_LOG_DEBUG, "HEVC API version 1 probed successfully\n"); - ctx->fns = &V2(ff_v4l2_req_hevc, 1); - } -+#endif - else { - av_log(avctx, AV_LOG_ERROR, "No HEVC version probed successfully\n"); - ret = AVERROR(EINVAL); - -From 35ec6af32c4f05b076f84ab343a8fc0d3263ba44 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 12 Sep 2022 17:59:22 +0100 -Subject: [PATCH 066/151] v4l2_m2m_enc: Send headers in in pkt side_data - -If GLOBAL_HEADERS are requested then we can't provide them at init time -so send as NEW_EXTRADATA side data in a similar way to some AV1 -encoders. ---- - libavcodec/v4l2_m2m_enc.c | 33 +++++++++++++++++++++++---------- - 1 file changed, 23 insertions(+), 10 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c -index 05ff6ba726..099ad23928 100644 ---- a/libavcodec/v4l2_m2m_enc.c -+++ b/libavcodec/v4l2_m2m_enc.c -@@ -544,14 +544,12 @@ dequeue: - av_freep(&avctx->extradata); - avctx->extradata_size = 0; - -- if ((data = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE)) != NULL) -- memcpy(data, avpkt->data, len); -+ if ((data = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE)) == NULL) -+ goto fail_no_mem; - -+ memcpy(data, avpkt->data, len); - av_packet_unref(avpkt); - -- if (data == NULL) -- return AVERROR(ENOMEM); -- - // We need to copy the header, but keep local if not global - if ((avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) != 0) { - avctx->extradata = data; -@@ -567,18 +565,28 @@ dequeue: - } - - // First frame must be key so mark as such even if encoder forgot -- if (capture->first_buf == 2) -+ if (capture->first_buf == 2) { - avpkt->flags |= AV_PKT_FLAG_KEY; - -+ // Add any extradata to the 1st packet we emit as we cannot create it at init -+ if (avctx->extradata_size > 0 && avctx->extradata) { -+ void * const side = av_packet_new_side_data(avpkt, -+ AV_PKT_DATA_NEW_EXTRADATA, -+ avctx->extradata_size); -+ if (!side) -+ goto fail_no_mem; -+ -+ memcpy(side, avctx->extradata, avctx->extradata_size); -+ } -+ } -+ - // Add SPS/PPS to the start of every key frame if non-global headers - if ((avpkt->flags & AV_PKT_FLAG_KEY) != 0 && s->extdata_size != 0) { - const size_t newlen = s->extdata_size + avpkt->size; - AVBufferRef * const buf = av_buffer_alloc(newlen + AV_INPUT_BUFFER_PADDING_SIZE); - -- if (buf == NULL) { -- av_packet_unref(avpkt); -- return AVERROR(ENOMEM); -- } -+ if (buf == NULL) -+ goto fail_no_mem; - - memcpy(buf->data, s->extdata_data, s->extdata_size); - memcpy(buf->data + s->extdata_size, avpkt->data, avpkt->size); -@@ -592,6 +600,11 @@ dequeue: - // av_log(avctx, AV_LOG_INFO, "%s: PTS out=%"PRId64", size=%d, ret=%d\n", __func__, avpkt->pts, avpkt->size, ret); - capture->first_buf = 0; - return 0; -+ -+fail_no_mem: -+ ret = AVERROR(ENOMEM); -+ av_packet_unref(avpkt); -+ return ret; - } - - static av_cold int v4l2_encode_init(AVCodecContext *avctx) - -From dfc754491cea9192945b92ca9c8d3919321e30ad Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 14 Sep 2022 15:44:10 +0000 -Subject: [PATCH 067/151] matroskaenc: Allow H264 SPS/PPS headers in packet - sidedata - ---- - libavformat/matroskaenc.c | 26 ++++++++++++++++++++++---- - 1 file changed, 22 insertions(+), 4 deletions(-) - -diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c -index 113541bd9a..61e4c976ef 100644 ---- a/libavformat/matroskaenc.c -+++ b/libavformat/matroskaenc.c -@@ -77,6 +77,10 @@ - - #define IS_WEBM(mkv) (CONFIG_WEBM_MUXER && CONFIG_MATROSKA_MUXER ? \ - ((mkv)->mode == MODE_WEBM) : CONFIG_WEBM_MUXER) -+ -+/* Reserved size for H264 headers if not extant at init time */ -+#define MAX_H264_HEADER_SIZE 1024 -+ - #define IS_SEEKABLE(pb, mkv) (((pb)->seekable & AVIO_SEEKABLE_NORMAL) && \ - !(mkv)->is_live) - -@@ -1121,8 +1125,12 @@ static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn - case AV_CODEC_ID_WAVPACK: - return put_wv_codecpriv(dyn_cp, extradata, extradata_size); - case AV_CODEC_ID_H264: -- return ff_isom_write_avcc(dyn_cp, extradata, -- extradata_size); -+ if (par->extradata_size) -+ return ff_isom_write_avcc(dyn_cp, extradata, -+ extradata_size); -+ else -+ *size_to_reserve = MAX_H264_HEADER_SIZE; -+ break; - case AV_CODEC_ID_HEVC: - return ff_isom_write_hvcc(dyn_cp, extradata, - extradata_size, 0); -@@ -2731,8 +2739,8 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) - } - break; - #endif -- // FIXME: Remove the following once libaom starts propagating proper extradata during init() -- // See https://bugs.chromium.org/p/aomedia/issues/detail?id=2208 -+ // FIXME: Remove the following once libaom starts propagating extradata during init() -+ // See https://bugs.chromium.org/p/aomedia/issues/detail?id=2012 - case AV_CODEC_ID_AV1: - if (side_data_size && mkv->track.bc && !par->extradata_size) { - // If the reserved space doesn't suffice, only write -@@ -2744,6 +2752,16 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) - } else if (!par->extradata_size) - return AVERROR_INVALIDDATA; - break; -+ // H264 V4L2 has a similar issue -+ case AV_CODEC_ID_H264: -+ if (side_data_size && mkv->track.bc && !par->extradata_size) { -+ ret = mkv_update_codecprivate(s, mkv, side_data, side_data_size, -+ par, mkv->track.bc, track, 0); -+ if (ret < 0) -+ return ret; -+ } else if (!par->extradata_size) -+ return AVERROR_INVALIDDATA; -+ break; - default: - if (side_data_size) - av_log(s, AV_LOG_DEBUG, "Ignoring new extradata in a packet for stream %d.\n", pkt->stream_index); - -From 30c6ca4e24ae2acbd7f7f122f5275beb62b625c6 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 14 Sep 2022 15:55:15 +0000 -Subject: [PATCH 068/151] movenc: Allow H264 SPS/PPS headers in packet sidedata - ---- - libavformat/movenc.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/libavformat/movenc.c b/libavformat/movenc.c -index c4fcb5f8b1..891adbf7b2 100644 ---- a/libavformat/movenc.c -+++ b/libavformat/movenc.c -@@ -6343,6 +6343,7 @@ static int mov_write_single_packet(AVFormatContext *s, AVPacket *pkt) - if (trk->par->codec_id == AV_CODEC_ID_MP4ALS || - trk->par->codec_id == AV_CODEC_ID_AAC || - trk->par->codec_id == AV_CODEC_ID_AV1 || -+ trk->par->codec_id == AV_CODEC_ID_H264 || - trk->par->codec_id == AV_CODEC_ID_FLAC) { - size_t side_size; - uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); - -From 1c7c3e99e9ed90f241aecbe7b2269229587d1e03 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 26 Sep 2022 12:45:05 +0100 -Subject: [PATCH 069/151] Allow ffmpeg to select codec internal hwfmts if - no_cvt_hw - -This allows the selection of DRM_PRIME from v4l2m2m without forcing it -in the decoder. - -Not utterly sure this is the right method for 5.1 but it does work ---- - fftools/ffmpeg.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c -index ba0c1898cf..839da7b472 100644 ---- a/fftools/ffmpeg.c -+++ b/fftools/ffmpeg.c -@@ -2763,12 +2763,15 @@ static enum AVPixelFormat get_format(AVCodecContext *s, const enum AVPixelFormat - break; - - if (ist->hwaccel_id == HWACCEL_GENERIC || -- ist->hwaccel_id == HWACCEL_AUTO) { -+ ist->hwaccel_id == HWACCEL_AUTO || -+ no_cvt_hw) { - for (i = 0;; i++) { - config = avcodec_get_hw_config(s->codec, i); - if (!config) - break; -- if (!(config->methods & -+ if (no_cvt_hw && (config->methods & AV_CODEC_HW_CONFIG_METHOD_INTERNAL)) -+ av_log(s, AV_LOG_DEBUG, "no_cvt_hw so trying pix_fmt %d with codec internal hwaccel\n", *p); -+ else if (!(config->methods & - AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX)) - continue; - if (config->pix_fmt == *p) - -From ecf273fd02e8aafe8775b1f291b9664b1b49572e Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 1 Sep 2022 11:42:41 +0000 -Subject: [PATCH 070/151] vf_deinterlace_v4l2m2m: Add a v4l2m2m scaler - -The logic for running an isp based scaler is pretty much identical to -that for the deinterlacer so add to the deinterlacer. This requires -some rework of the setup code to avoid assumptions that are true for -deinterlace but not scale but the reworked code requires few switches -based on operation. ---- - libavfilter/allfilters.c | 1 + - libavfilter/vf_deinterlace_v4l2m2m.c | 1123 ++++++++++++++++++++------ - 2 files changed, 877 insertions(+), 247 deletions(-) - -diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c -index 357ff61ca8..d504fa1bc8 100644 ---- a/libavfilter/allfilters.c -+++ b/libavfilter/allfilters.c -@@ -421,6 +421,7 @@ extern const AVFilter ff_vf_scale; - extern const AVFilter ff_vf_scale_cuda; - extern const AVFilter ff_vf_scale_npp; - extern const AVFilter ff_vf_scale_qsv; -+extern const AVFilter ff_vf_scale_v4l2m2m; - extern const AVFilter ff_vf_scale_vaapi; - extern const AVFilter ff_vf_scale_vulkan; - extern const AVFilter ff_vf_scale2ref; -diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c -index 1a3bef5bcb..2df39ec0f1 100644 ---- a/libavfilter/vf_deinterlace_v4l2m2m.c -+++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -52,31 +52,36 @@ - #include "avfilter.h" - #include "formats.h" - #include "internal.h" -+#include "scale_eval.h" - #include "video.h" - -+#ifndef DRM_FORMAT_P030 -+#define DRM_FORMAT_P030 fourcc_code('P', '0', '3', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel packed */ -+#endif -+ - typedef struct V4L2Queue V4L2Queue; - typedef struct DeintV4L2M2MContextShared DeintV4L2M2MContextShared; - --typedef struct V4L2PlaneInfo { -- int bytesperline; -- size_t length; --} V4L2PlaneInfo; -+typedef enum filter_type_v4l2_e -+{ -+ FILTER_V4L2_DEINTERLACE = 1, -+ FILTER_V4L2_SCALE, -+} filter_type_v4l2_t; - - typedef struct V4L2Buffer { - int enqueued; - int reenqueue; -- int fd; - struct v4l2_buffer buffer; - AVFrame frame; - struct v4l2_plane planes[VIDEO_MAX_PLANES]; - int num_planes; -- V4L2PlaneInfo plane_info[VIDEO_MAX_PLANES]; - AVDRMFrameDescriptor drm_frame; - V4L2Queue *q; - } V4L2Buffer; - - typedef struct V4L2Queue { - struct v4l2_format format; -+ struct v4l2_selection sel; - int num_buffers; - V4L2Buffer *buffers; - DeintV4L2M2MContextShared *ctx; -@@ -111,11 +116,18 @@ typedef struct pts_track_s - - typedef struct DeintV4L2M2MContextShared { - void * logctx; // For logging - will be NULL when done -+ filter_type_v4l2_t filter_type; - - int fd; - int done; - int width; - int height; -+ -+ // from options -+ int output_width; -+ int output_height; -+ enum AVPixelFormat output_format; -+ - int orig_width; - int orig_height; - atomic_uint refcount; -@@ -134,8 +146,60 @@ typedef struct DeintV4L2M2MContext { - const AVClass *class; - - DeintV4L2M2MContextShared *shared; -+ -+ char * w_expr; -+ char * h_expr; -+ char * output_format_string;; -+ -+ int force_original_aspect_ratio; -+ int force_divisible_by; -+ -+ char *colour_primaries_string; -+ char *colour_transfer_string; -+ char *colour_matrix_string; -+ int colour_range; -+ char *chroma_location_string; -+ -+ enum AVColorPrimaries colour_primaries; -+ enum AVColorTransferCharacteristic colour_transfer; -+ enum AVColorSpace colour_matrix; -+ enum AVChromaLocation chroma_location; - } DeintV4L2M2MContext; - -+// These just list the ones we know we can cope with -+static uint32_t -+fmt_av_to_v4l2(const enum AVPixelFormat avfmt) -+{ -+ switch (avfmt) { -+ case AV_PIX_FMT_YUV420P: -+ return V4L2_PIX_FMT_YUV420; -+ case AV_PIX_FMT_NV12: -+ return V4L2_PIX_FMT_NV12; -+ case AV_PIX_FMT_RPI4_8: -+ case AV_PIX_FMT_SAND128: -+ return V4L2_PIX_FMT_NV12_COL128; -+ default: -+ break; -+ } -+ return 0; -+} -+ -+static enum AVPixelFormat -+fmt_v4l2_to_av(const uint32_t pixfmt) -+{ -+ switch (pixfmt) { -+ case V4L2_PIX_FMT_YUV420: -+ return AV_PIX_FMT_YUV420P; -+ case V4L2_PIX_FMT_NV12: -+ return AV_PIX_FMT_NV12; -+ case V4L2_PIX_FMT_NV12_COL128: -+ return AV_PIX_FMT_RPI4_8; -+ default: -+ break; -+ } -+ return AV_PIX_FMT_NONE; -+} -+ - static unsigned int pts_stats_interval(const pts_stats_t * const stats) - { - return stats->last_interval; -@@ -301,6 +365,39 @@ static int pts_track_init(pts_track_t * const trk, void *logctx) - return 0; - } - -+static inline uint32_t -+fmt_bpl(const struct v4l2_format * const fmt, const unsigned int plane_n) -+{ -+ return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.plane_fmt[plane_n].bytesperline : fmt->fmt.pix.bytesperline; -+} -+ -+static inline uint32_t -+fmt_height(const struct v4l2_format * const fmt) -+{ -+ return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height; -+} -+ -+static inline uint32_t -+fmt_width(const struct v4l2_format * const fmt) -+{ -+ return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.width : fmt->fmt.pix.width; -+} -+ -+static inline uint32_t -+fmt_pixelformat(const struct v4l2_format * const fmt) -+{ -+ return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.pixelformat : fmt->fmt.pix.pixelformat; -+} -+ -+static void -+init_format(V4L2Queue * const q, const uint32_t format_type) -+{ -+ memset(&q->format, 0, sizeof(q->format)); -+ memset(&q->sel, 0, sizeof(q->sel)); -+ q->format.type = format_type; -+ q->sel.type = format_type; -+} -+ - static int deint_v4l2m2m_prepare_context(DeintV4L2M2MContextShared *ctx) - { - struct v4l2_capability cap; -@@ -311,80 +408,99 @@ static int deint_v4l2m2m_prepare_context(DeintV4L2M2MContextShared *ctx) - if (ret < 0) - return ret; - -- if (!(cap.capabilities & V4L2_CAP_STREAMING)) -+ if (ctx->filter_type == FILTER_V4L2_SCALE && -+ strcmp("bcm2835-codec-isp", cap.card) != 0) -+ { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "Not ISP\n"); - return AVERROR(EINVAL); -+ } - -- if (cap.capabilities & V4L2_CAP_VIDEO_M2M) { -- ctx->capture.format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; -- ctx->output.format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; -- -- return 0; -+ if (!(cap.capabilities & V4L2_CAP_STREAMING)) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "No streaming\n"); -+ return AVERROR(EINVAL); - } - - if (cap.capabilities & V4L2_CAP_VIDEO_M2M_MPLANE) { -- ctx->capture.format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; -- ctx->output.format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; -- -- return 0; -+ init_format(&ctx->capture, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); -+ init_format(&ctx->output, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); -+ } -+ else if (cap.capabilities & V4L2_CAP_VIDEO_M2M) { -+ init_format(&ctx->capture, V4L2_BUF_TYPE_VIDEO_CAPTURE); -+ init_format(&ctx->output, V4L2_BUF_TYPE_VIDEO_OUTPUT); -+ } -+ else { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "Not M2M\n"); -+ return AVERROR(EINVAL); - } - -- return AVERROR(EINVAL); -+ return 0; - } - --static int deint_v4l2m2m_try_format(V4L2Queue *queue) -+// Just use for probe - doesn't modify q format -+static int deint_v4l2m2m_try_format(V4L2Queue *queue, const uint32_t width, const uint32_t height, const enum AVPixelFormat avfmt) - { -- struct v4l2_format *fmt = &queue->format; -+ struct v4l2_format fmt = {.type = queue->format.type}; - DeintV4L2M2MContextShared *ctx = queue->ctx; - int ret, field; -+ // Pick YUV to test with if not otherwise specified -+ uint32_t pixelformat = avfmt == AV_PIX_FMT_NONE ? V4L2_PIX_FMT_YUV420 : fmt_av_to_v4l2(avfmt); -+ enum AVPixelFormat r_avfmt; -+ - -- ret = ioctl(ctx->fd, VIDIOC_G_FMT, fmt); -+ ret = ioctl(ctx->fd, VIDIOC_G_FMT, &fmt); - if (ret) - av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_G_FMT failed: %d\n", ret); - -- if (V4L2_TYPE_IS_OUTPUT(fmt->type)) -+ if (ctx->filter_type == FILTER_V4L2_DEINTERLACE && V4L2_TYPE_IS_OUTPUT(fmt.type)) - field = V4L2_FIELD_INTERLACED_TB; - else - field = V4L2_FIELD_NONE; - -- if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -- fmt->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_YUV420; -- fmt->fmt.pix_mp.field = field; -- fmt->fmt.pix_mp.width = ctx->width; -- fmt->fmt.pix_mp.height = ctx->height; -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt.type)) { -+ fmt.fmt.pix_mp.pixelformat = pixelformat; -+ fmt.fmt.pix_mp.field = field; -+ fmt.fmt.pix_mp.width = width; -+ fmt.fmt.pix_mp.height = height; - } else { -- fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420; -- fmt->fmt.pix.field = field; -- fmt->fmt.pix.width = ctx->width; -- fmt->fmt.pix.height = ctx->height; -+ fmt.fmt.pix.pixelformat = pixelformat; -+ fmt.fmt.pix.field = field; -+ fmt.fmt.pix.width = width; -+ fmt.fmt.pix.height = height; - } - -- av_log(ctx->logctx, AV_LOG_DEBUG, "%s: Trying format for type %d, wxh: %dx%d, fmt: %08x, size %u bpl %u pre\n", __func__, -- fmt->type, fmt->fmt.pix_mp.width, fmt->fmt.pix_mp.height, -- fmt->fmt.pix_mp.pixelformat, -- fmt->fmt.pix_mp.plane_fmt[0].sizeimage, fmt->fmt.pix_mp.plane_fmt[0].bytesperline); -+ av_log(ctx->logctx, AV_LOG_TRACE, "%s: Trying format for type %d, wxh: %dx%d, fmt: %08x, size %u bpl %u pre\n", __func__, -+ fmt.type, fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, -+ fmt.fmt.pix_mp.pixelformat, -+ fmt.fmt.pix_mp.plane_fmt[0].sizeimage, fmt.fmt.pix_mp.plane_fmt[0].bytesperline); - -- ret = ioctl(ctx->fd, VIDIOC_TRY_FMT, fmt); -+ ret = ioctl(ctx->fd, VIDIOC_TRY_FMT, &fmt); - if (ret) - return AVERROR(EINVAL); - -- av_log(ctx->logctx, AV_LOG_DEBUG, "%s: Trying format for type %d, wxh: %dx%d, fmt: %08x, size %u bpl %u post\n", __func__, -- fmt->type, fmt->fmt.pix_mp.width, fmt->fmt.pix_mp.height, -- fmt->fmt.pix_mp.pixelformat, -- fmt->fmt.pix_mp.plane_fmt[0].sizeimage, fmt->fmt.pix_mp.plane_fmt[0].bytesperline); -+ av_log(ctx->logctx, AV_LOG_TRACE, "%s: Trying format for type %d, wxh: %dx%d, fmt: %08x, size %u bpl %u post\n", __func__, -+ fmt.type, fmt.fmt.pix_mp.width, fmt.fmt.pix_mp.height, -+ fmt.fmt.pix_mp.pixelformat, -+ fmt.fmt.pix_mp.plane_fmt[0].sizeimage, fmt.fmt.pix_mp.plane_fmt[0].bytesperline); - -- if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -- if ((fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_YUV420 && -- fmt->fmt.pix_mp.pixelformat != V4L2_PIX_FMT_NV12) || -- fmt->fmt.pix_mp.field != field) { -- av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); -+ r_avfmt = fmt_v4l2_to_av(fmt_pixelformat(&fmt)); -+ if (r_avfmt != avfmt && avfmt != AV_PIX_FMT_NONE) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "Unable to set format %s on %s port\n", av_get_pix_fmt_name(avfmt), V4L2_TYPE_IS_CAPTURE(fmt.type) ? "dest" : "src"); -+ return AVERROR(EINVAL); -+ } -+ if (r_avfmt == AV_PIX_FMT_NONE) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "No supported format on %s port\n", V4L2_TYPE_IS_CAPTURE(fmt.type) ? "dest" : "src"); -+ return AVERROR(EINVAL); -+ } -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt.type)) { -+ if (fmt.fmt.pix_mp.field != field) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt.type); - - return AVERROR(EINVAL); - } - } else { -- if ((fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_YUV420 && -- fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_NV12) || -- fmt->fmt.pix.field != field) { -- av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt->type); -+ if (fmt.fmt.pix.field != field) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "format not supported for type %d\n", fmt.type); - - return AVERROR(EINVAL); - } -@@ -393,68 +509,410 @@ static int deint_v4l2m2m_try_format(V4L2Queue *queue) - return 0; - } - --static int deint_v4l2m2m_set_format(V4L2Queue *queue, uint32_t pixelformat, uint32_t field, int width, int height, int pitch, int ysize) -+static int -+do_s_fmt(V4L2Queue * const q) - { -- struct v4l2_format *fmt = &queue->format; -- DeintV4L2M2MContextShared *ctx = queue->ctx; -+ DeintV4L2M2MContextShared * const ctx = q->ctx; -+ const uint32_t pixelformat = fmt_pixelformat(&q->format); - int ret; - -- struct v4l2_selection sel = { -- .type = fmt->type, -- .target = V4L2_TYPE_IS_OUTPUT(fmt->type) ? V4L2_SEL_TGT_CROP_BOUNDS : V4L2_SEL_TGT_COMPOSE_BOUNDS, -- }; -- -- // This works for most single object 4:2:0 types -- if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -- fmt->fmt.pix_mp.pixelformat = pixelformat; -- fmt->fmt.pix_mp.field = field; -- fmt->fmt.pix_mp.width = width; -- fmt->fmt.pix_mp.height = ysize / pitch; -- fmt->fmt.pix_mp.plane_fmt[0].bytesperline = pitch; -- fmt->fmt.pix_mp.plane_fmt[0].sizeimage = ysize + (ysize >> 1); -- } else { -- fmt->fmt.pix.pixelformat = pixelformat; -- fmt->fmt.pix.field = field; -- fmt->fmt.pix.width = width; -- fmt->fmt.pix.height = height; -- fmt->fmt.pix.sizeimage = 0; -- fmt->fmt.pix.bytesperline = 0; -- } -- -- ret = ioctl(ctx->fd, VIDIOC_S_FMT, fmt); -+ ret = ioctl(ctx->fd, VIDIOC_S_FMT, &q->format); - if (ret) { - ret = AVERROR(errno); -- av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_S_FMT failed: %d\n", ret); -+ av_log(ctx->logctx, AV_LOG_ERROR, "VIDIOC_S_FMT failed: %s\n", av_err2str(ret)); - return ret; - } - -- if (pixelformat != fmt->fmt.pix.pixelformat) { -- av_log(ctx->logctx, AV_LOG_ERROR, "Format not supported: %s; S_FMT returned %s\n", av_fourcc2str(pixelformat), av_fourcc2str(fmt->fmt.pix.pixelformat)); -+ if (pixelformat != fmt_pixelformat(&q->format)) { -+ av_log(ctx->logctx, AV_LOG_ERROR, "Format not supported: %s; S_FMT returned %s\n", av_fourcc2str(pixelformat), av_fourcc2str(fmt_pixelformat(&q->format))); - return AVERROR(EINVAL); - } - -- ret = ioctl(ctx->fd, VIDIOC_G_SELECTION, &sel); -+ q->sel.target = V4L2_TYPE_IS_OUTPUT(q->sel.type) ? V4L2_SEL_TGT_CROP : V4L2_SEL_TGT_COMPOSE, -+ q->sel.flags = V4L2_TYPE_IS_OUTPUT(q->sel.type) ? V4L2_SEL_FLAG_LE : V4L2_SEL_FLAG_GE; -+ -+ ret = ioctl(ctx->fd, VIDIOC_S_SELECTION, &q->sel); - if (ret) { - ret = AVERROR(errno); -- av_log(ctx->logctx, AV_LOG_WARNING, "VIDIOC_G_SELECTION failed: %d\n", ret); -+ av_log(ctx->logctx, AV_LOG_WARNING, "VIDIOC_S_SELECTION failed: %s\n", av_err2str(ret)); - } - -- sel.r.width = width; -- sel.r.height = height; -- sel.r.left = 0; -- sel.r.top = 0; -- sel.target = V4L2_TYPE_IS_OUTPUT(fmt->type) ? V4L2_SEL_TGT_CROP : V4L2_SEL_TGT_COMPOSE, -- sel.flags = V4L2_SEL_FLAG_LE; -+ return 0; -+} - -- ret = ioctl(ctx->fd, VIDIOC_S_SELECTION, &sel); -- if (ret) { -- ret = AVERROR(errno); -- av_log(ctx->logctx, AV_LOG_WARNING, "VIDIOC_S_SELECTION failed: %d\n", ret); -+static void -+set_fmt_color(struct v4l2_format *const fmt, -+ const enum AVColorPrimaries avcp, -+ const enum AVColorSpace avcs, -+ const enum AVColorTransferCharacteristic avxc) -+{ -+ enum v4l2_ycbcr_encoding ycbcr = V4L2_YCBCR_ENC_DEFAULT; -+ enum v4l2_colorspace cs = V4L2_COLORSPACE_DEFAULT; -+ enum v4l2_xfer_func xfer = V4L2_XFER_FUNC_DEFAULT; -+ -+ switch (avcp) { -+ case AVCOL_PRI_BT709: -+ cs = V4L2_COLORSPACE_REC709; -+ ycbcr = V4L2_YCBCR_ENC_709; -+ break; -+ case AVCOL_PRI_BT470M: -+ cs = V4L2_COLORSPACE_470_SYSTEM_M; -+ ycbcr = V4L2_YCBCR_ENC_601; -+ break; -+ case AVCOL_PRI_BT470BG: -+ cs = V4L2_COLORSPACE_470_SYSTEM_BG; -+ break; -+ case AVCOL_PRI_SMPTE170M: -+ cs = V4L2_COLORSPACE_SMPTE170M; -+ break; -+ case AVCOL_PRI_SMPTE240M: -+ cs = V4L2_COLORSPACE_SMPTE240M; -+ break; -+ case AVCOL_PRI_BT2020: -+ cs = V4L2_COLORSPACE_BT2020; -+ break; -+ case AVCOL_PRI_SMPTE428: -+ case AVCOL_PRI_SMPTE431: -+ case AVCOL_PRI_SMPTE432: -+ case AVCOL_PRI_EBU3213: -+ case AVCOL_PRI_RESERVED: -+ case AVCOL_PRI_FILM: -+ case AVCOL_PRI_UNSPECIFIED: -+ default: -+ break; -+ } -+ -+ switch (avcs) { -+ case AVCOL_SPC_RGB: -+ cs = V4L2_COLORSPACE_SRGB; -+ break; -+ case AVCOL_SPC_BT709: -+ cs = V4L2_COLORSPACE_REC709; -+ break; -+ case AVCOL_SPC_FCC: -+ cs = V4L2_COLORSPACE_470_SYSTEM_M; -+ break; -+ case AVCOL_SPC_BT470BG: -+ cs = V4L2_COLORSPACE_470_SYSTEM_BG; -+ break; -+ case AVCOL_SPC_SMPTE170M: -+ cs = V4L2_COLORSPACE_SMPTE170M; -+ break; -+ case AVCOL_SPC_SMPTE240M: -+ cs = V4L2_COLORSPACE_SMPTE240M; -+ break; -+ case AVCOL_SPC_BT2020_CL: -+ cs = V4L2_COLORSPACE_BT2020; -+ ycbcr = V4L2_YCBCR_ENC_BT2020_CONST_LUM; -+ break; -+ case AVCOL_SPC_BT2020_NCL: -+ cs = V4L2_COLORSPACE_BT2020; -+ break; -+ default: -+ break; -+ } -+ -+ switch (xfer) { -+ case AVCOL_TRC_BT709: -+ xfer = V4L2_XFER_FUNC_709; -+ break; -+ case AVCOL_TRC_IEC61966_2_1: -+ xfer = V4L2_XFER_FUNC_SRGB; -+ break; -+ case AVCOL_TRC_SMPTE240M: -+ xfer = V4L2_XFER_FUNC_SMPTE240M; -+ break; -+ case AVCOL_TRC_SMPTE2084: -+ xfer = V4L2_XFER_FUNC_SMPTE2084; -+ break; -+ default: -+ break; -+ } -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ fmt->fmt.pix_mp.colorspace = cs; -+ fmt->fmt.pix_mp.ycbcr_enc = ycbcr; -+ fmt->fmt.pix_mp.xfer_func = xfer; -+ } else { -+ fmt->fmt.pix.colorspace = cs; -+ fmt->fmt.pix.ycbcr_enc = ycbcr; -+ fmt->fmt.pix.xfer_func = xfer; -+ } -+} -+ -+static void -+set_fmt_color_range(struct v4l2_format *const fmt, const enum AVColorRange avcr) -+{ -+ const enum v4l2_quantization q = -+ avcr == AVCOL_RANGE_MPEG ? V4L2_QUANTIZATION_LIM_RANGE : -+ avcr == AVCOL_RANGE_JPEG ? V4L2_QUANTIZATION_FULL_RANGE : -+ V4L2_QUANTIZATION_DEFAULT; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ fmt->fmt.pix_mp.quantization = q; -+ } else { -+ fmt->fmt.pix.quantization = q; -+ } -+} -+ -+static enum AVColorPrimaries get_color_primaries(const struct v4l2_format *const fmt) -+{ -+ enum v4l2_ycbcr_encoding ycbcr; -+ enum v4l2_colorspace cs; -+ -+ cs = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? -+ fmt->fmt.pix_mp.colorspace : -+ fmt->fmt.pix.colorspace; -+ -+ ycbcr = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? -+ fmt->fmt.pix_mp.ycbcr_enc: -+ fmt->fmt.pix.ycbcr_enc; -+ -+ switch(ycbcr) { -+ case V4L2_YCBCR_ENC_XV709: -+ case V4L2_YCBCR_ENC_709: return AVCOL_PRI_BT709; -+ case V4L2_YCBCR_ENC_XV601: -+ case V4L2_YCBCR_ENC_601:return AVCOL_PRI_BT470M; -+ default: -+ break; -+ } -+ -+ switch(cs) { -+ case V4L2_COLORSPACE_470_SYSTEM_BG: return AVCOL_PRI_BT470BG; -+ case V4L2_COLORSPACE_SMPTE170M: return AVCOL_PRI_SMPTE170M; -+ case V4L2_COLORSPACE_SMPTE240M: return AVCOL_PRI_SMPTE240M; -+ case V4L2_COLORSPACE_BT2020: return AVCOL_PRI_BT2020; -+ default: -+ break; -+ } -+ -+ return AVCOL_PRI_UNSPECIFIED; -+} -+ -+static enum AVColorSpace get_color_space(const struct v4l2_format *const fmt) -+{ -+ enum v4l2_ycbcr_encoding ycbcr; -+ enum v4l2_colorspace cs; -+ -+ cs = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? -+ fmt->fmt.pix_mp.colorspace : -+ fmt->fmt.pix.colorspace; -+ -+ ycbcr = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? -+ fmt->fmt.pix_mp.ycbcr_enc: -+ fmt->fmt.pix.ycbcr_enc; -+ -+ switch(cs) { -+ case V4L2_COLORSPACE_SRGB: return AVCOL_SPC_RGB; -+ case V4L2_COLORSPACE_REC709: return AVCOL_SPC_BT709; -+ case V4L2_COLORSPACE_470_SYSTEM_M: return AVCOL_SPC_FCC; -+ case V4L2_COLORSPACE_470_SYSTEM_BG: return AVCOL_SPC_BT470BG; -+ case V4L2_COLORSPACE_SMPTE170M: return AVCOL_SPC_SMPTE170M; -+ case V4L2_COLORSPACE_SMPTE240M: return AVCOL_SPC_SMPTE240M; -+ case V4L2_COLORSPACE_BT2020: -+ if (ycbcr == V4L2_YCBCR_ENC_BT2020_CONST_LUM) -+ return AVCOL_SPC_BT2020_CL; -+ else -+ return AVCOL_SPC_BT2020_NCL; -+ default: -+ break; -+ } -+ -+ return AVCOL_SPC_UNSPECIFIED; -+} -+ -+static enum AVColorTransferCharacteristic get_color_trc(const struct v4l2_format *const fmt) -+{ -+ enum v4l2_ycbcr_encoding ycbcr; -+ enum v4l2_xfer_func xfer; -+ enum v4l2_colorspace cs; -+ -+ cs = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? -+ fmt->fmt.pix_mp.colorspace : -+ fmt->fmt.pix.colorspace; -+ -+ ycbcr = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? -+ fmt->fmt.pix_mp.ycbcr_enc: -+ fmt->fmt.pix.ycbcr_enc; -+ -+ xfer = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? -+ fmt->fmt.pix_mp.xfer_func: -+ fmt->fmt.pix.xfer_func; -+ -+ switch (xfer) { -+ case V4L2_XFER_FUNC_709: return AVCOL_TRC_BT709; -+ case V4L2_XFER_FUNC_SRGB: return AVCOL_TRC_IEC61966_2_1; -+ default: -+ break; -+ } -+ -+ switch (cs) { -+ case V4L2_COLORSPACE_470_SYSTEM_M: return AVCOL_TRC_GAMMA22; -+ case V4L2_COLORSPACE_470_SYSTEM_BG: return AVCOL_TRC_GAMMA28; -+ case V4L2_COLORSPACE_SMPTE170M: return AVCOL_TRC_SMPTE170M; -+ case V4L2_COLORSPACE_SMPTE240M: return AVCOL_TRC_SMPTE240M; -+ default: -+ break; -+ } -+ -+ switch (ycbcr) { -+ case V4L2_YCBCR_ENC_XV709: -+ case V4L2_YCBCR_ENC_XV601: return AVCOL_TRC_BT1361_ECG; -+ default: -+ break; -+ } -+ -+ return AVCOL_TRC_UNSPECIFIED; -+} -+ -+static enum AVColorRange get_color_range(const struct v4l2_format *const fmt) -+{ -+ enum v4l2_quantization qt; -+ -+ qt = V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? -+ fmt->fmt.pix_mp.quantization : -+ fmt->fmt.pix.quantization; -+ -+ switch (qt) { -+ case V4L2_QUANTIZATION_LIM_RANGE: return AVCOL_RANGE_MPEG; -+ case V4L2_QUANTIZATION_FULL_RANGE: return AVCOL_RANGE_JPEG; -+ default: -+ break; -+ } -+ -+ return AVCOL_RANGE_UNSPECIFIED; -+} -+ -+static int set_src_fmt(V4L2Queue * const q, const AVFrame * const frame) -+{ -+ struct v4l2_format *const format = &q->format; -+ const AVDRMFrameDescriptor *const src = (const AVDRMFrameDescriptor *)frame->data[0]; -+ -+ const uint32_t drm_fmt = src->layers[0].format; -+ // Treat INVALID as LINEAR -+ const uint64_t mod = src->objects[0].format_modifier == DRM_FORMAT_MOD_INVALID ? -+ DRM_FORMAT_MOD_LINEAR : src->objects[0].format_modifier; -+ uint32_t pix_fmt = 0; -+ uint32_t w = 0; -+ uint32_t h = 0; -+ uint32_t bpl = src->layers[0].planes[0].pitch; -+ -+ // We really don't expect multiple layers -+ // All formats that we currently cope with are single object -+ -+ if (src->nb_layers != 1 || src->nb_objects != 1) -+ return AVERROR(EINVAL); -+ -+ switch (drm_fmt) { -+ case DRM_FORMAT_YUV420: -+ if (mod == DRM_FORMAT_MOD_LINEAR) { -+ if (src->layers[0].nb_planes != 3) -+ break; -+ pix_fmt = V4L2_PIX_FMT_YUV420; -+ h = src->layers[0].planes[1].offset / bpl; -+ w = bpl; -+ } -+ break; -+ -+ case DRM_FORMAT_NV12: -+ if (mod == DRM_FORMAT_MOD_LINEAR) { -+ if (src->layers[0].nb_planes != 2) -+ break; -+ pix_fmt = V4L2_PIX_FMT_NV12; -+ h = src->layers[0].planes[1].offset / bpl; -+ w = bpl; -+ } -+ else if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { -+ if (src->layers[0].nb_planes != 2) -+ break; -+ pix_fmt = V4L2_PIX_FMT_NV12_COL128; -+ w = bpl; -+ h = src->layers[0].planes[1].offset / 128; -+ bpl = fourcc_mod_broadcom_param(mod); -+ } -+ break; -+ -+ case DRM_FORMAT_P030: -+ if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { -+ if (src->layers[0].nb_planes != 2) -+ break; -+ pix_fmt = V4L2_PIX_FMT_NV12_10_COL128; -+ w = bpl / 2; // Matching lie to how we construct this -+ h = src->layers[0].planes[1].offset / 128; -+ bpl = fourcc_mod_broadcom_param(mod); -+ } -+ break; -+ -+ default: -+ break; -+ } -+ -+ if (!pix_fmt) -+ return AVERROR(EINVAL); -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(format->type)) { -+ struct v4l2_pix_format_mplane *const pix = &format->fmt.pix_mp; -+ -+ pix->width = w; -+ pix->height = h; -+ pix->pixelformat = pix_fmt; -+ pix->plane_fmt[0].bytesperline = bpl; -+ pix->num_planes = 1; -+ } -+ else { -+ struct v4l2_pix_format *const pix = &format->fmt.pix; -+ -+ pix->width = w; -+ pix->height = h; -+ pix->pixelformat = pix_fmt; -+ pix->bytesperline = bpl; - } - -+ set_fmt_color(format, frame->color_primaries, frame->colorspace, frame->color_trc); -+ set_fmt_color_range(format, frame->color_range); -+ -+ q->sel.r.width = frame->width - (frame->crop_left + frame->crop_right); -+ q->sel.r.height = frame->height - (frame->crop_top + frame->crop_bottom); -+ q->sel.r.left = frame->crop_left; -+ q->sel.r.top = frame->crop_top; -+ - return 0; - } - -+ -+static int set_dst_format(DeintV4L2M2MContext * const priv, V4L2Queue *queue, uint32_t pixelformat, uint32_t field, int width, int height) -+{ -+ struct v4l2_format * const fmt = &queue->format; -+ struct v4l2_selection *const sel = &queue->sel; -+ -+ memset(&fmt->fmt, 0, sizeof(fmt->fmt)); -+ -+ // Align w/h to 16 here in case there are alignment requirements at the next -+ // stage of the filter chain (also RPi deinterlace setup is bust and this -+ // fixes it) -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt->type)) { -+ fmt->fmt.pix_mp.pixelformat = pixelformat; -+ fmt->fmt.pix_mp.field = field; -+ fmt->fmt.pix_mp.width = FFALIGN(width, 16); -+ fmt->fmt.pix_mp.height = FFALIGN(height, 16); -+ } else { -+ fmt->fmt.pix.pixelformat = pixelformat; -+ fmt->fmt.pix.field = field; -+ fmt->fmt.pix.width = FFALIGN(width, 16); -+ fmt->fmt.pix.height = FFALIGN(height, 16); -+ } -+ -+ set_fmt_color(fmt, priv->colour_primaries, priv->colour_matrix, priv->colour_transfer); -+ set_fmt_color_range(fmt, priv->colour_range); -+ -+ sel->r.width = width; -+ sel->r.height = height; -+ sel->r.left = 0; -+ sel->r.top = 0; -+ -+ return do_s_fmt(queue); -+} -+ - static int deint_v4l2m2m_probe_device(DeintV4L2M2MContextShared *ctx, char *node) - { - int ret; -@@ -464,16 +922,22 @@ static int deint_v4l2m2m_probe_device(DeintV4L2M2MContextShared *ctx, char *node - return AVERROR(errno); - - ret = deint_v4l2m2m_prepare_context(ctx); -- if (ret) -+ if (ret) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "Failed to prepare context\n"); - goto fail; -+ } - -- ret = deint_v4l2m2m_try_format(&ctx->capture); -- if (ret) -+ ret = deint_v4l2m2m_try_format(&ctx->capture, ctx->output_width, ctx->output_height, ctx->output_format); -+ if (ret) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "Failed to try dst format\n"); - goto fail; -+ } - -- ret = deint_v4l2m2m_try_format(&ctx->output); -- if (ret) -+ ret = deint_v4l2m2m_try_format(&ctx->output, ctx->width, ctx->height, AV_PIX_FMT_NONE); -+ if (ret) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "Failed to try src format\n"); - goto fail; -+ } - - return 0; - -@@ -534,26 +998,118 @@ static int deint_v4l2m2m_enqueue_buffer(V4L2Buffer *buf) - return 0; - } - --static int v4l2_buffer_export_drm(V4L2Buffer* avbuf, const uint32_t pixelformat) -+static void -+drm_frame_init(AVDRMFrameDescriptor * const d) -+{ -+ unsigned int i; -+ for (i = 0; i != AV_DRM_MAX_PLANES; ++i) { -+ d->objects[i].fd = -1; -+ } -+} -+ -+static void -+drm_frame_uninit(AVDRMFrameDescriptor * const d) -+{ -+ unsigned int i; -+ for (i = 0; i != d->nb_objects; ++i) { -+ if (d->objects[i].fd != -1) { -+ close(d->objects[i].fd); -+ d->objects[i].fd = -1; -+ } -+ } -+} -+ -+static void -+avbufs_delete(V4L2Buffer** ppavbufs, const unsigned int n) -+{ -+ unsigned int i; -+ V4L2Buffer* const avbufs = *ppavbufs; -+ -+ if (avbufs == NULL) -+ return; -+ *ppavbufs = NULL; -+ -+ for (i = 0; i != n; ++i) { -+ V4L2Buffer* const avbuf = avbufs + i; -+ drm_frame_uninit(&avbuf->drm_frame); -+ } -+ -+ av_free(avbufs); -+} -+ -+static int v4l2_buffer_export_drm(V4L2Queue * const q, V4L2Buffer * const avbuf) - { - struct v4l2_exportbuffer expbuf; - int i, ret; - uint64_t mod = DRM_FORMAT_MOD_LINEAR; -- uint32_t fmt = 0; - -- switch (pixelformat) { -- case V4L2_PIX_FMT_NV12: -- fmt = DRM_FORMAT_NV12; -- break; -- case V4L2_PIX_FMT_YUV420: -- fmt = DRM_FORMAT_YUV420; -- break; -- default: -- return AVERROR(EINVAL); -+ AVDRMFrameDescriptor * const drm_desc = &avbuf->drm_frame; -+ AVDRMLayerDescriptor * const layer = &drm_desc->layers[0]; -+ const struct v4l2_format *const fmt = &q->format; -+ const uint32_t height = fmt_height(fmt); -+ const uint32_t width = fmt_width(fmt); -+ ptrdiff_t bpl0; -+ -+ /* fill the DRM frame descriptor */ -+ drm_desc->nb_layers = 1; -+ layer->nb_planes = avbuf->num_planes; -+ -+ for (int i = 0; i < avbuf->num_planes; i++) { -+ layer->planes[i].object_index = i; -+ layer->planes[i].offset = 0; -+ layer->planes[i].pitch = fmt_bpl(fmt, i); - } -+ bpl0 = layer->planes[0].pitch; -+ -+ switch (fmt_pixelformat(fmt)) { -+ -+ case V4L2_PIX_FMT_NV12_COL128: -+ mod = DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(bpl0); -+ layer->format = V4L2_PIX_FMT_NV12; -+ -+ if (avbuf->num_planes > 1) -+ break; -+ -+ layer->nb_planes = 2; -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = height * 128; -+ layer->planes[0].pitch = width; -+ layer->planes[1].pitch = width; -+ break; - -- avbuf->drm_frame.layers[0].format = fmt; -+ case DRM_FORMAT_NV12: -+ layer->format = V4L2_PIX_FMT_NV12; - -+ if (avbuf->num_planes > 1) -+ break; -+ -+ layer->nb_planes = 2; -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = bpl0 * height; -+ layer->planes[1].pitch = bpl0; -+ break; -+ -+ case V4L2_PIX_FMT_YUV420: -+ layer->format = DRM_FORMAT_YUV420; -+ -+ if (avbuf->num_planes > 1) -+ break; -+ -+ layer->nb_planes = 3; -+ layer->planes[1].object_index = 0; -+ layer->planes[1].offset = bpl0 * height; -+ layer->planes[1].pitch = bpl0 / 2; -+ layer->planes[2].object_index = 0; -+ layer->planes[2].offset = layer->planes[1].offset + ((bpl0 * height) / 4); -+ layer->planes[2].pitch = bpl0 / 2; -+ break; -+ -+ default: -+ drm_desc->nb_layers = 0; -+ return AVERROR(EINVAL); -+ } -+ -+ drm_desc->nb_objects = 0; - for (i = 0; i < avbuf->num_planes; i++) { - memset(&expbuf, 0, sizeof(expbuf)); - -@@ -565,19 +1121,11 @@ static int v4l2_buffer_export_drm(V4L2Buffer* avbuf, const uint32_t pixelformat) - if (ret < 0) - return AVERROR(errno); - -- avbuf->fd = expbuf.fd; -- -- if (V4L2_TYPE_IS_MULTIPLANAR(avbuf->buffer.type)) { -- /* drm frame */ -- avbuf->drm_frame.objects[i].size = avbuf->buffer.m.planes[i].length; -- avbuf->drm_frame.objects[i].fd = expbuf.fd; -- avbuf->drm_frame.objects[i].format_modifier = mod; -- } else { -- /* drm frame */ -- avbuf->drm_frame.objects[0].size = avbuf->buffer.length; -- avbuf->drm_frame.objects[0].fd = expbuf.fd; -- avbuf->drm_frame.objects[0].format_modifier = mod; -- } -+ drm_desc->objects[i].size = V4L2_TYPE_IS_MULTIPLANAR(avbuf->buffer.type) ? -+ avbuf->buffer.m.planes[i].length : avbuf->buffer.length; -+ drm_desc->objects[i].fd = expbuf.fd; -+ drm_desc->objects[i].format_modifier = mod; -+ drm_desc->nb_objects = i + 1; - } - - return 0; -@@ -588,7 +1136,7 @@ static int deint_v4l2m2m_allocate_buffers(V4L2Queue *queue) - struct v4l2_format *fmt = &queue->format; - DeintV4L2M2MContextShared *ctx = queue->ctx; - struct v4l2_requestbuffers req; -- int ret, i, j, multiplanar; -+ int ret, i, multiplanar; - uint32_t memory; - - memory = V4L2_TYPE_IS_OUTPUT(fmt->type) ? -@@ -617,10 +1165,9 @@ static int deint_v4l2m2m_allocate_buffers(V4L2Queue *queue) - } - - for (i = 0; i < queue->num_buffers; i++) { -- V4L2Buffer *buf = &queue->buffers[i]; -+ V4L2Buffer * const buf = &queue->buffers[i]; - - buf->enqueued = 0; -- buf->fd = -1; - buf->q = queue; - - buf->buffer.type = fmt->type; -@@ -632,6 +1179,12 @@ static int deint_v4l2m2m_allocate_buffers(V4L2Queue *queue) - buf->buffer.m.planes = buf->planes; - } - -+ drm_frame_init(&buf->drm_frame); -+ } -+ -+ for (i = 0; i < queue->num_buffers; i++) { -+ V4L2Buffer * const buf = &queue->buffers[i]; -+ - ret = ioctl(ctx->fd, VIDIOC_QUERYBUF, &buf->buffer); - if (ret < 0) { - ret = AVERROR(errno); -@@ -639,29 +1192,14 @@ static int deint_v4l2m2m_allocate_buffers(V4L2Queue *queue) - goto fail; - } - -- if (multiplanar) -- buf->num_planes = buf->buffer.length; -- else -- buf->num_planes = 1; -- -- for (j = 0; j < buf->num_planes; j++) { -- V4L2PlaneInfo *info = &buf->plane_info[j]; -- -- if (multiplanar) { -- info->bytesperline = fmt->fmt.pix_mp.plane_fmt[j].bytesperline; -- info->length = buf->buffer.m.planes[j].length; -- } else { -- info->bytesperline = fmt->fmt.pix.bytesperline; -- info->length = buf->buffer.length; -- } -- } -+ buf->num_planes = multiplanar ? buf->buffer.length : 1; - - if (!V4L2_TYPE_IS_OUTPUT(fmt->type)) { - ret = deint_v4l2m2m_enqueue_buffer(buf); - if (ret) - goto fail; - -- ret = v4l2_buffer_export_drm(buf, multiplanar ? fmt->fmt.pix_mp.pixelformat : fmt->fmt.pix.pixelformat); -+ ret = v4l2_buffer_export_drm(queue, buf); - if (ret) - goto fail; - } -@@ -670,12 +1208,8 @@ static int deint_v4l2m2m_allocate_buffers(V4L2Queue *queue) - return 0; - - fail: -- for (i = 0; i < queue->num_buffers; i++) -- if (queue->buffers[i].fd >= 0) -- close(queue->buffers[i].fd); -- av_free(queue->buffers); -- queue->buffers = NULL; -- -+ avbufs_delete(&queue->buffers, queue->num_buffers); -+ queue->num_buffers = 0; - return ret; - } - -@@ -862,7 +1396,6 @@ static void deint_v4l2m2m_destroy_context(DeintV4L2M2MContextShared *ctx) - if (atomic_fetch_sub(&ctx->refcount, 1) == 1) { - V4L2Queue *capture = &ctx->capture; - V4L2Queue *output = &ctx->output; -- int i; - - av_log(NULL, AV_LOG_DEBUG, "%s - destroying context\n", __func__); - -@@ -871,12 +1404,7 @@ static void deint_v4l2m2m_destroy_context(DeintV4L2M2MContextShared *ctx) - deint_v4l2m2m_streamoff(output); - } - -- if (capture->buffers) -- for (i = 0; i < capture->num_buffers; i++) { -- capture->buffers[i].q = NULL; -- if (capture->buffers[i].fd >= 0) -- close(capture->buffers[i].fd); -- } -+ avbufs_delete(&capture->buffers, capture->num_buffers); - - deint_v4l2m2m_unref_queued(output); - -@@ -908,73 +1436,15 @@ static void v4l2_free_buffer(void *opaque, uint8_t *unused) - deint_v4l2m2m_destroy_context(ctx); - } - --static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf, int height) --{ -- AVDRMFrameDescriptor *drm_desc = &avbuf->drm_frame; -- AVDRMLayerDescriptor *layer; -- -- /* fill the DRM frame descriptor */ -- drm_desc->nb_objects = avbuf->num_planes; -- drm_desc->nb_layers = 1; -- -- layer = &drm_desc->layers[0]; -- layer->nb_planes = avbuf->num_planes; -- -- for (int i = 0; i < avbuf->num_planes; i++) { -- layer->planes[i].object_index = i; -- layer->planes[i].offset = 0; -- layer->planes[i].pitch = avbuf->plane_info[i].bytesperline; -- } -- -- switch (layer->format) { -- case DRM_FORMAT_YUYV: -- layer->nb_planes = 1; -- break; -- -- case DRM_FORMAT_NV12: -- case DRM_FORMAT_NV21: -- if (avbuf->num_planes > 1) -- break; -- -- layer->nb_planes = 2; -- -- layer->planes[1].object_index = 0; -- layer->planes[1].offset = avbuf->plane_info[0].bytesperline * -- height; -- layer->planes[1].pitch = avbuf->plane_info[0].bytesperline; -- break; -- -- case DRM_FORMAT_YUV420: -- if (avbuf->num_planes > 1) -- break; -- -- layer->nb_planes = 3; -- -- layer->planes[1].object_index = 0; -- layer->planes[1].offset = avbuf->plane_info[0].bytesperline * -- height; -- layer->planes[1].pitch = avbuf->plane_info[0].bytesperline >> 1; -- -- layer->planes[2].object_index = 0; -- layer->planes[2].offset = layer->planes[1].offset + -- ((avbuf->plane_info[0].bytesperline * -- height) >> 2); -- layer->planes[2].pitch = avbuf->plane_info[0].bytesperline >> 1; -- break; -- -- default: -- drm_desc->nb_layers = 0; -- break; -- } -- -- return (uint8_t *) drm_desc; --} -- - // timeout in ms - static int deint_v4l2m2m_dequeue_frame(V4L2Queue *queue, AVFrame* frame, int timeout) - { - DeintV4L2M2MContextShared *ctx = queue->ctx; - V4L2Buffer* avbuf; -+ enum AVColorPrimaries color_primaries; -+ enum AVColorSpace colorspace; -+ enum AVColorTransferCharacteristic color_trc; -+ enum AVColorRange color_range; - - av_log(ctx->logctx, AV_LOG_TRACE, "<<< %s\n", __func__); - -@@ -985,8 +1455,6 @@ static int deint_v4l2m2m_dequeue_frame(V4L2Queue *queue, AVFrame* frame, int tim - } - - // Fill in PTS and anciliary info from src frame -- // we will want to overwrite some fields as only the pts/dts -- // fields are updated with new timing in this fn - pts_track_get_frame(&ctx->track, avbuf->buffer.timestamp, frame); - - frame->buf[0] = av_buffer_create((uint8_t *) &avbuf->drm_frame, -@@ -999,18 +1467,36 @@ static int deint_v4l2m2m_dequeue_frame(V4L2Queue *queue, AVFrame* frame, int tim - - atomic_fetch_add(&ctx->refcount, 1); - -- frame->data[0] = (uint8_t *)v4l2_get_drm_frame(avbuf, ctx->orig_height); -+ frame->data[0] = (uint8_t *)&avbuf->drm_frame; - frame->format = AV_PIX_FMT_DRM_PRIME; - if (ctx->hw_frames_ctx) - frame->hw_frames_ctx = av_buffer_ref(ctx->hw_frames_ctx); -- frame->height = ctx->height; -- frame->width = ctx->width; -- -- // Not interlaced now -- frame->interlaced_frame = 0; -- frame->top_field_first = 0; -- // Pkt duration halved -- frame->pkt_duration /= 2; -+ frame->height = ctx->output_height; -+ frame->width = ctx->output_width; -+ -+ color_primaries = get_color_primaries(&ctx->capture.format); -+ colorspace = get_color_space(&ctx->capture.format); -+ color_trc = get_color_trc(&ctx->capture.format); -+ color_range = get_color_range(&ctx->capture.format); -+ -+ // If the color parameters are unspecified by V4L2 then leave alone as they -+ // will have been copied from src -+ if (color_primaries != AVCOL_PRI_UNSPECIFIED) -+ frame->color_primaries = color_primaries; -+ if (colorspace != AVCOL_SPC_UNSPECIFIED) -+ frame->colorspace = colorspace; -+ if (color_trc != AVCOL_TRC_UNSPECIFIED) -+ frame->color_trc = color_trc; -+ if (color_range != AVCOL_RANGE_UNSPECIFIED) -+ frame->color_range = color_range; -+ -+ if (ctx->filter_type == FILTER_V4L2_DEINTERLACE) { -+ // Not interlaced now -+ frame->interlaced_frame = 0; // *** Fill in from dst buffer? -+ frame->top_field_first = 0; -+ // Pkt duration halved -+ frame->pkt_duration /= 2; -+ } - - if (avbuf->buffer.flags & V4L2_BUF_FLAG_ERROR) { - av_log(ctx->logctx, AV_LOG_ERROR, "driver decode error\n"); -@@ -1032,15 +1518,34 @@ static int deint_v4l2m2m_config_props(AVFilterLink *outlink) - ctx->height = avctx->inputs[0]->h; - ctx->width = avctx->inputs[0]->w; - -- av_log(priv, AV_LOG_DEBUG, "%s: %dx%d\n", __func__, ctx->width, ctx->height); -+ if (ctx->filter_type == FILTER_V4L2_SCALE) { -+ if ((ret = ff_scale_eval_dimensions(priv, -+ priv->w_expr, priv->h_expr, -+ inlink, outlink, -+ &ctx->output_width, &ctx->output_height)) < 0) -+ return ret; -+ -+ ff_scale_adjust_dimensions(inlink, &ctx->output_width, &ctx->output_height, -+ priv->force_original_aspect_ratio, priv->force_divisible_by); -+ } -+ else { -+ ctx->output_width = ctx->width; -+ ctx->output_height = ctx->height; -+ } -+ -+ av_log(priv, AV_LOG_DEBUG, "%s: %dx%d->%dx%d\n", __func__, ctx->width, ctx->height, ctx->output_width, ctx->output_height); - - outlink->time_base = inlink->time_base; -- outlink->w = inlink->w; -- outlink->h = inlink->h; -- outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; -+ outlink->w = ctx->output_width; -+ outlink->h = ctx->output_height; - outlink->format = inlink->format; - outlink->frame_rate = (AVRational) {1, 0}; // Deny knowledge of frame rate - -+ if (inlink->sample_aspect_ratio.num) -+ outlink->sample_aspect_ratio = av_mul_q((AVRational){outlink->h * inlink->w, outlink->w * inlink->h}, inlink->sample_aspect_ratio); -+ else -+ outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; -+ - ret = deint_v4l2m2m_find_device(ctx); - if (ret) - return ret; -@@ -1055,18 +1560,19 @@ static int deint_v4l2m2m_config_props(AVFilterLink *outlink) - - static uint32_t desc_pixelformat(const AVDRMFrameDescriptor * const drm_desc) - { -- const int is_linear = (drm_desc->objects[0].format_modifier == DRM_FORMAT_MOD_LINEAR || -- drm_desc->objects[0].format_modifier == DRM_FORMAT_MOD_INVALID); -+ const uint64_t mod = drm_desc->objects[0].format_modifier; -+ const int is_linear = (mod == DRM_FORMAT_MOD_LINEAR || mod == DRM_FORMAT_MOD_INVALID); -+ -+ // Only currently support single object things -+ if (drm_desc->nb_objects != 1) -+ return 0; - - switch (drm_desc->layers[0].format) { - case DRM_FORMAT_YUV420: -- if (is_linear) -- return drm_desc->nb_objects == 1 ? V4L2_PIX_FMT_YUV420 : 0; -- break; -+ return is_linear ? V4L2_PIX_FMT_YUV420 : 0; - case DRM_FORMAT_NV12: -- if (is_linear) -- return drm_desc->nb_objects == 1 ? V4L2_PIX_FMT_NV12 : 0; -- break; -+ return is_linear ? V4L2_PIX_FMT_NV12 : -+ fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128 ? V4L2_PIX_FMT_NV12_COL128 : 0; - default: - break; - } -@@ -1089,7 +1595,7 @@ static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) - - if (ctx->field_order == V4L2_FIELD_ANY) { - const AVDRMFrameDescriptor * const drm_desc = (AVDRMFrameDescriptor *)in->data[0]; -- const uint32_t pixelformat = desc_pixelformat(drm_desc); -+ uint32_t pixelformat = desc_pixelformat(drm_desc); - - if (pixelformat == 0) { - av_log(avctx, AV_LOG_ERROR, "Unsupported DRM format %s in %d objects, modifier %#" PRIx64 "\n", -@@ -1104,29 +1610,49 @@ static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) - av_log(priv, AV_LOG_DEBUG, "%s: %dx%d (%td,%td)\n", __func__, ctx->width, ctx->height, - drm_desc->layers[0].planes[0].pitch, drm_desc->layers[0].planes[1].offset); - -- ret = deint_v4l2m2m_set_format(output, pixelformat, ctx->field_order, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); -- if (ret) -+ if ((ret = set_src_fmt(output, in)) != 0) { -+ av_log(avctx, AV_LOG_WARNING, "Unknown input DRM format: %s mod: %#" PRIx64 "\n", -+ av_fourcc2str(drm_desc->layers[0].format), drm_desc->objects[0].format_modifier); -+ return ret; -+ } -+ -+ ret = do_s_fmt(output); -+ if (ret) { -+ av_log(avctx, AV_LOG_WARNING, "Failed to set source format\n"); - return ret; -+ } - -- ret = deint_v4l2m2m_set_format(capture, pixelformat, V4L2_FIELD_NONE, ctx->width, ctx->height, ctx->orig_width, drm_desc->layers[0].planes[1].offset); -- if (ret) -+ if (ctx->output_format != AV_PIX_FMT_NONE) -+ pixelformat = fmt_av_to_v4l2(ctx->output_format); -+ ret = set_dst_format(priv, capture, pixelformat, V4L2_FIELD_NONE, ctx->output_width, ctx->output_height); -+ if (ret) { -+ av_log(avctx, AV_LOG_WARNING, "Failed to set destination format\n"); - return ret; -+ } - - ret = deint_v4l2m2m_allocate_buffers(capture); -- if (ret) -+ if (ret) { -+ av_log(avctx, AV_LOG_WARNING, "Failed to allocate destination buffers\n"); - return ret; -+ } - - ret = deint_v4l2m2m_streamon(capture); -- if (ret) -+ if (ret) { -+ av_log(avctx, AV_LOG_WARNING, "Failed set destination streamon: %s\n", av_err2str(ret)); - return ret; -+ } - - ret = deint_v4l2m2m_allocate_buffers(output); -- if (ret) -+ if (ret) { -+ av_log(avctx, AV_LOG_WARNING, "Failed to allocate src buffers\n"); - return ret; -+ } - - ret = deint_v4l2m2m_streamon(output); -- if (ret) -+ if (ret) { -+ av_log(avctx, AV_LOG_WARNING, "Failed set src streamon: %s\n", av_err2str(ret)); - return ret; -+ } - - if (in->top_field_first) - ctx->field_order = V4L2_FIELD_INTERLACED_TB; -@@ -1251,7 +1777,7 @@ again: - return did_something ? 0 : FFERROR_NOT_READY; - } - --static av_cold int deint_v4l2m2m_init(AVFilterContext *avctx) -+static av_cold int common_v4l2m2m_init(AVFilterContext * const avctx, const filter_type_v4l2_t filter_type) - { - DeintV4L2M2MContext * const priv = avctx->priv; - DeintV4L2M2MContextShared * const ctx = av_mallocz(sizeof(DeintV4L2M2MContextShared)); -@@ -1262,6 +1788,7 @@ static av_cold int deint_v4l2m2m_init(AVFilterContext *avctx) - } - priv->shared = ctx; - ctx->logctx = priv; -+ ctx->filter_type = filter_type; - ctx->fd = -1; - ctx->output.ctx = ctx; - ctx->output.num_buffers = 8; -@@ -1274,9 +1801,52 @@ static av_cold int deint_v4l2m2m_init(AVFilterContext *avctx) - - atomic_init(&ctx->refcount, 1); - -+ if (priv->output_format_string) { -+ ctx->output_format = av_get_pix_fmt(priv->output_format_string); -+ if (ctx->output_format == AV_PIX_FMT_NONE) { -+ av_log(avctx, AV_LOG_ERROR, "Invalid ffmpeg output format '%s'.\n", priv->output_format_string); -+ return AVERROR(EINVAL); -+ } -+ if (fmt_av_to_v4l2(ctx->output_format) == 0) { -+ av_log(avctx, AV_LOG_ERROR, "Unsupported output format for V4L2: %s.\n", av_get_pix_fmt_name(ctx->output_format)); -+ return AVERROR(EINVAL); -+ } -+ } else { -+ // Use the input format once that is configured. -+ ctx->output_format = AV_PIX_FMT_NONE; -+ } -+ -+#define STRING_OPTION(var_name, func_name, default_value) do { \ -+ if (priv->var_name ## _string) { \ -+ int var = av_ ## func_name ## _from_name(priv->var_name ## _string); \ -+ if (var < 0) { \ -+ av_log(avctx, AV_LOG_ERROR, "Invalid %s.\n", #var_name); \ -+ return AVERROR(EINVAL); \ -+ } \ -+ priv->var_name = var; \ -+ } else { \ -+ priv->var_name = default_value; \ -+ } \ -+ } while (0) -+ -+ STRING_OPTION(colour_primaries, color_primaries, AVCOL_PRI_UNSPECIFIED); -+ STRING_OPTION(colour_transfer, color_transfer, AVCOL_TRC_UNSPECIFIED); -+ STRING_OPTION(colour_matrix, color_space, AVCOL_SPC_UNSPECIFIED); -+ STRING_OPTION(chroma_location, chroma_location, AVCHROMA_LOC_UNSPECIFIED); -+ - return 0; - } - -+static av_cold int deint_v4l2m2m_init(AVFilterContext *avctx) -+{ -+ return common_v4l2m2m_init(avctx, FILTER_V4L2_DEINTERLACE); -+} -+ -+static av_cold int scale_v4l2m2m_init(AVFilterContext *avctx) -+{ -+ return common_v4l2m2m_init(avctx, FILTER_V4L2_SCALE); -+} -+ - static void deint_v4l2m2m_uninit(AVFilterContext *avctx) - { - DeintV4L2M2MContext *priv = avctx->priv; -@@ -1294,6 +1864,51 @@ static const AVOption deinterlace_v4l2m2m_options[] = { - - AVFILTER_DEFINE_CLASS(deinterlace_v4l2m2m); - -+#define OFFSET(x) offsetof(DeintV4L2M2MContext, x) -+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM) -+ -+static const AVOption scale_v4l2m2m_options[] = { -+ { "w", "Output video width", -+ OFFSET(w_expr), AV_OPT_TYPE_STRING, {.str = "iw"}, .flags = FLAGS }, -+ { "h", "Output video height", -+ OFFSET(h_expr), AV_OPT_TYPE_STRING, {.str = "ih"}, .flags = FLAGS }, -+ { "format", "Output video format (software format of hardware frames)", -+ OFFSET(output_format_string), AV_OPT_TYPE_STRING, .flags = FLAGS }, -+ // These colour properties match the ones of the same name in vf_scale. -+ { "out_color_matrix", "Output colour matrix coefficient set", -+ OFFSET(colour_matrix_string), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS }, -+ { "out_range", "Output colour range", -+ OFFSET(colour_range), AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED }, -+ AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_JPEG, FLAGS, "range" }, -+ { "full", "Full range", -+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, -+ { "limited", "Limited range", -+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, -+ { "jpeg", "Full range", -+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, -+ { "mpeg", "Limited range", -+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, -+ { "tv", "Limited range", -+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, -+ { "pc", "Full range", -+ 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, -+ // These colour properties match the ones in the VAAPI scaler -+ { "out_color_primaries", "Output colour primaries", -+ OFFSET(colour_primaries_string), AV_OPT_TYPE_STRING, -+ { .str = NULL }, .flags = FLAGS }, -+ { "out_color_transfer", "Output colour transfer characteristics", -+ OFFSET(colour_transfer_string), AV_OPT_TYPE_STRING, -+ { .str = NULL }, .flags = FLAGS }, -+ { "out_chroma_location", "Output chroma sample location", -+ OFFSET(chroma_location_string), AV_OPT_TYPE_STRING, -+ { .str = NULL }, .flags = FLAGS }, -+ { "force_original_aspect_ratio", "decrease or increase w/h if necessary to keep the original AR", OFFSET(force_original_aspect_ratio), AV_OPT_TYPE_INT, { .i64 = 0}, 0, 2, FLAGS, "force_oar" }, -+ { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256, FLAGS }, -+ { NULL }, -+}; -+ -+AVFILTER_DEFINE_CLASS(scale_v4l2m2m); -+ - static const AVFilterPad deint_v4l2m2m_inputs[] = { - { - .name = "default", -@@ -1321,3 +1936,17 @@ AVFilter ff_vf_deinterlace_v4l2m2m = { - .priv_class = &deinterlace_v4l2m2m_class, - .activate = deint_v4l2m2m_activate, - }; -+ -+AVFilter ff_vf_scale_v4l2m2m = { -+ .name = "scale_v4l2m2m", -+ .description = NULL_IF_CONFIG_SMALL("V4L2 M2M scaler"), -+ .priv_size = sizeof(DeintV4L2M2MContext), -+ .init = &scale_v4l2m2m_init, -+ .uninit = &deint_v4l2m2m_uninit, -+ FILTER_INPUTS(deint_v4l2m2m_inputs), -+ FILTER_OUTPUTS(deint_v4l2m2m_outputs), -+ FILTER_SINGLE_SAMPLEFMT(AV_PIX_FMT_DRM_PRIME), -+ .priv_class = &scale_v4l2m2m_class, -+ .activate = deint_v4l2m2m_activate, -+}; -+ - -From 7e7147d50bc6e3f13834525dba3a47d170422f07 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 22 Sep 2022 14:54:46 +0000 -Subject: [PATCH 071/151] v4l2_m2m: Adjust buffer allocation based on min/max - controls - -Clip requested buffer count to min/max declared by driver. -If 0 buffers requested then set to min+2. -This allows encode to keep its src buffer count down to a plausible -minimum which helps with flow control. ---- - libavcodec/v4l2_context.c | 19 +++++++++++++++++++ - 1 file changed, 19 insertions(+) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 6b97eab41e..ba36689ff3 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -1187,6 +1187,7 @@ fail_release: - - int ff_v4l2_context_init(V4L2Context* ctx) - { -+ struct v4l2_queryctrl qctrl; - V4L2m2mContext * const s = ctx_to_m2mctx(ctx); - int ret; - -@@ -1228,6 +1229,24 @@ int ff_v4l2_context_init(V4L2Context* ctx) - goto fail_unref_hwframes; - } - -+ memset(&qctrl, 0, sizeof(qctrl)); -+ qctrl.id = V4L2_CID_MIN_BUFFERS_FOR_OUTPUT; -+ if (ioctl(s->fd, VIDIOC_QUERYCTRL, &qctrl) != 0) { -+ ret = AVERROR(errno); -+ if (ret != AVERROR(EINVAL)) { -+ av_log(logger(ctx), AV_LOG_ERROR, "%s VIDIOC_QUERCTRL failed: %s\n", ctx->name, av_err2str(ret)); -+ goto fail_unref_hwframes; -+ } -+ // Control unsupported - set default if wanted -+ if (ctx->num_buffers < 2) -+ ctx->num_buffers = 4; -+ } -+ else { -+ if (ctx->num_buffers < 2) -+ ctx->num_buffers = qctrl.minimum + 2; -+ ctx->num_buffers = av_clip(ctx->num_buffers, qctrl.minimum, qctrl.maximum); -+ } -+ - ret = create_buffers(ctx, ctx->num_buffers, ctx->buf_mem); - if (ret < 0) - goto fail_unref_hwframes; - -From b69a2707a192ac509174899233a094373a3f5dc9 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 22 Sep 2022 15:00:12 +0000 -Subject: [PATCH 072/151] v4l2_m2m_dec: If src Q is full then wait indefinitely - for buffer - -If it is not possible to add another buffer to the src Q then alawys -wait indefinitely for either an output frame or the Q to have space. - -This has issues if the reason that the Q is stalled is due to dst buffer -exhaustion and buffers cannot be returned async by another thread but -the current scheme confuses ffmpegs pipeline scheduling. ---- - libavcodec/v4l2_m2m_dec.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 485a96f4b4..bb183097f6 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -456,9 +456,9 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - if (dst_rv != 0 && TRY_DQ(src_rv)) { - // Pick a timeout depending on state - const int t = -+ src_rv == NQ_Q_FULL ? -1 : - src_rv == NQ_DRAINING ? 300 : -- prefer_dq ? 5 : -- src_rv == NQ_Q_FULL ? -1 : 0; -+ prefer_dq ? 5 : 0; - - // Dequeue frame will unref any previous contents of frame - // if it returns success so we don't need an explicit unref - -From b1d37be81bbf683a0eb16923c9b9f045fd0ea0c0 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 22 Sep 2022 15:12:27 +0000 -Subject: [PATCH 073/151] vf_deinterlace_v4l2m2m: Add Q name to structure for - debug - ---- - libavfilter/vf_deinterlace_v4l2m2m.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c -index 2df39ec0f1..4edecc02bf 100644 ---- a/libavfilter/vf_deinterlace_v4l2m2m.c -+++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -84,6 +84,7 @@ typedef struct V4L2Queue { - struct v4l2_selection sel; - int num_buffers; - V4L2Buffer *buffers; -+ const char * name; - DeintV4L2M2MContextShared *ctx; - } V4L2Queue; - -@@ -1792,8 +1793,10 @@ static av_cold int common_v4l2m2m_init(AVFilterContext * const avctx, const filt - ctx->fd = -1; - ctx->output.ctx = ctx; - ctx->output.num_buffers = 8; -+ ctx->output.name = "OUTPUT"; - ctx->capture.ctx = ctx; - ctx->capture.num_buffers = 12; -+ ctx->capture.name = "CAPTURE"; - ctx->done = 0; - ctx->field_order = V4L2_FIELD_ANY; - - -From 794a5bfc3ec74fdc7664508a287a075708d5deef Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 22 Sep 2022 16:08:42 +0000 -Subject: [PATCH 074/151] v4l2_m2m_enc: Set src buffer count to min+2 by - default - -Set output.num_buffers to 0 by default which will then be set to min+2 -by the allocation code. This fixes an issue where the deinterlacer had -fewer dest buffer than the encoder has src buffers and so ran dry -creating deadlock in the ffmpeg filter chain. ---- - libavcodec/v4l2_m2m_enc.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c -index 099ad23928..b8ba815c37 100644 ---- a/libavcodec/v4l2_m2m_enc.c -+++ b/libavcodec/v4l2_m2m_enc.c -@@ -672,9 +672,10 @@ static av_cold int v4l2_encode_close(AVCodecContext *avctx) - #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM - - #define V4L_M2M_CAPTURE_OPTS \ -- V4L_M2M_DEFAULT_OPTS,\ -+ { "num_output_buffers", "Number of buffers in the output context",\ -+ OFFSET(num_output_buffers), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },\ - { "num_capture_buffers", "Number of buffers in the capture context", \ -- OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 4 }, 4, INT_MAX, FLAGS } -+ OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 8 }, 8, INT_MAX, FLAGS } - - static const AVOption mpeg4_options[] = { - V4L_M2M_CAPTURE_OPTS, - -From 85c42743046a05b347f33b1933e6d52ea1d17e00 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 22 Sep 2022 16:13:57 +0000 -Subject: [PATCH 075/151] vf_deinterlace_m2m: For deinterlace set outlink FR to - twice inlink - -We used to set the outlink framerate to unknown but it turns out that -ffmpegs filter pipeline copes with that badly. Otherwise leave at 0,0 -which will copy FR from inlink to outlink. ---- - libavfilter/vf_deinterlace_v4l2m2m.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c -index 4edecc02bf..c52dae1c44 100644 ---- a/libavfilter/vf_deinterlace_v4l2m2m.c -+++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -1534,13 +1534,16 @@ static int deint_v4l2m2m_config_props(AVFilterLink *outlink) - ctx->output_height = ctx->height; - } - -- av_log(priv, AV_LOG_DEBUG, "%s: %dx%d->%dx%d\n", __func__, ctx->width, ctx->height, ctx->output_width, ctx->output_height); -+ av_log(priv, AV_LOG_DEBUG, "%s: %dx%d->%dx%d FR: %d/%d->%d/%d\n", __func__, -+ ctx->width, ctx->height, ctx->output_width, ctx->output_height, -+ inlink->frame_rate.num, inlink->frame_rate.den, outlink->frame_rate.num, outlink->frame_rate.den); - - outlink->time_base = inlink->time_base; - outlink->w = ctx->output_width; - outlink->h = ctx->output_height; - outlink->format = inlink->format; -- outlink->frame_rate = (AVRational) {1, 0}; // Deny knowledge of frame rate -+ if (ctx->filter_type == FILTER_V4L2_DEINTERLACE && inlink->frame_rate.den != 0) -+ outlink->frame_rate = (AVRational){inlink->frame_rate.num * 2, inlink->frame_rate.den}; - - if (inlink->sample_aspect_ratio.num) - outlink->sample_aspect_ratio = av_mul_q((AVRational){outlink->h * inlink->w, outlink->w * inlink->h}, inlink->sample_aspect_ratio); - -From 34a24bc0b0d427c75659d3907cb75afb6a9dc255 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 23 Sep 2022 11:30:56 +0000 -Subject: [PATCH 076/151] v4l2m2m: Add ff_v4l2_dq_all to drain all buffers from - a Q - -Useful for where (encode) we might have drmprime buffers that we want to -return to the source ASAP. ---- - libavcodec/v4l2_context.c | 17 +++++++++++------ - libavcodec/v4l2_context.h | 2 ++ - 2 files changed, 13 insertions(+), 6 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index ba36689ff3..4a359bf45e 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -707,17 +707,22 @@ clean_v4l2_buffer(V4L2Buffer * const avbuf) - return avbuf; - } - -+void -+ff_v4l2_dq_all(V4L2Context *const ctx) -+{ -+ V4L2Buffer * avbuf; -+ do { -+ get_qbuf(ctx, &avbuf, 0); -+ } while (avbuf); -+} -+ - static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) - { - int i; - - /* get back as many output buffers as possible */ -- if (V4L2_TYPE_IS_OUTPUT(ctx->type)) { -- V4L2Buffer * avbuf; -- do { -- get_qbuf(ctx, &avbuf, 0); -- } while (avbuf); -- } -+ if (V4L2_TYPE_IS_OUTPUT(ctx->type)) -+ ff_v4l2_dq_all(ctx); - - for (i = 0; i < ctx->num_buffers; i++) { - V4L2Buffer * const avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index 21265f1bd7..523c53e97d 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -218,4 +218,6 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, const - */ - int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* f); - -+void ff_v4l2_dq_all(V4L2Context *const ctx); -+ - #endif // AVCODEC_V4L2_CONTEXT_H - -From 95dfc168c74f7b0f282c1b2ad9deb8fba10a7ce5 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 23 Sep 2022 11:38:36 +0000 -Subject: [PATCH 077/151] v4l2_m2m_enc: DQ output more frequently - -Ensure that we DQ any released src buffers on every op to avoid deadlock -with source. - -There is a plausible argument that this patch is inelegant and the drain -should be integrated into dq_buf, but that is a further reaching delta. ---- - libavcodec/v4l2_m2m_enc.c | 12 ++++++++++-- - 1 file changed, 10 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c -index b8ba815c37..a992a3cccc 100644 ---- a/libavcodec/v4l2_m2m_enc.c -+++ b/libavcodec/v4l2_m2m_enc.c -@@ -421,6 +421,8 @@ static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame) - V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; - V4L2Context *const output = &s->output; - -+ ff_v4l2_dq_all(output); -+ - // Signal EOF if needed - if (!frame) { - return ff_v4l2_context_enqueue_frame(output, frame); -@@ -492,6 +494,8 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) - AVFrame *frame = s->frame; - int ret; - -+ ff_v4l2_dq_all(output); -+ - if (s->draining) - goto dequeue; - -@@ -528,7 +532,9 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) - } - - dequeue: -- if ((ret = ff_v4l2_context_dequeue_packet(capture, avpkt)) != 0) -+ ret = ff_v4l2_context_dequeue_packet(capture, avpkt); -+ ff_v4l2_dq_all(output); -+ if (ret) - return ret; - - if (capture->first_buf == 1) { -@@ -560,7 +566,9 @@ dequeue: - s->extdata_size = len; - } - -- if ((ret = ff_v4l2_context_dequeue_packet(capture, avpkt)) != 0) -+ ret = ff_v4l2_context_dequeue_packet(capture, avpkt); -+ ff_v4l2_dq_all(output); -+ if (ret) - return ret; - } - - -From a40b1c38b0615fce0c0d9eb97510ab9e77b3e1ac Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 26 Sep 2022 18:20:00 +0100 -Subject: [PATCH 078/151] conf_native: Remove --enable-rpi from all builds - ---- - pi-util/conf_native.sh | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/pi-util/conf_native.sh b/pi-util/conf_native.sh -index 37cea71756..f22d531ca4 100755 ---- a/pi-util/conf_native.sh -+++ b/pi-util/conf_native.sh -@@ -54,9 +54,9 @@ if [ $MMAL ]; then - RPI_LIBDIRS="-L$RPI_OPT_VC/lib" - RPI_DEFINES="$RPI_DEFINES -D__VCCOREVER__=0x4000000" - RPI_EXTRALIBS="-Wl,--start-group -lbcm_host -lmmal -lmmal_util -lmmal_core -lvcos -lvcsm -lvchostif -lvchiq_arm -Wl,--end-group" -- RPIOPTS="--enable-mmal --enable-rpi" -+ RPIOPTS="--enable-mmal" - else -- RPIOPTS="--disable-mmal --enable-sand" -+ RPIOPTS="--disable-mmal" - fi - - C=`lsb_release -sc` -@@ -89,6 +89,7 @@ $FFSRC/configure \ - $MCOPTS\ - --disable-stripping\ - --disable-thumb\ -+ --enable-sand\ - --enable-v4l2-request\ - --enable-libdrm\ - --enable-vout-egl\ - -From 8fddfc8f1e3c95caded18705ed29be0ae95517bc Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 29 Sep 2022 19:48:08 +0000 -Subject: [PATCH 079/151] v4l2_m2m_dec: Deal correctly with avcC H264 data in - extradata - -Decoders expect AnnexB style headers, mkv and similar formats have -somewhat oddly wrapped extradata. Convert to annex-b style before use. ---- - libavcodec/v4l2_m2m.h | 2 +- - libavcodec/v4l2_m2m_dec.c | 177 ++++++++++++++++++++++++++++++++++++-- - 2 files changed, 169 insertions(+), 10 deletions(-) - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index ee72beb052..babf101d65 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -118,7 +118,7 @@ typedef struct V4L2m2mContext { - /* Ext data sent */ - int extdata_sent; - /* Ext data sent in packet - overrides ctx */ -- uint8_t * extdata_data; -+ void * extdata_data; - size_t extdata_size; - - #define FF_V4L2_QUIRK_REINIT_ALWAYS 1 -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index bb183097f6..6bd9926b3f 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -46,6 +46,71 @@ - #define STATS_LAST_COUNT_MAX 64 - #define STATS_INTERVAL_MAX (1 << 30) - -+#ifndef FF_API_BUFFER_SIZE_T -+#define FF_API_BUFFER_SIZE_T 1 -+#endif -+ -+#define DUMP_FAILED_EXTRADATA 0 -+ -+#if DUMP_FAILED_EXTRADATA -+static inline char hex1(unsigned int x) -+{ -+ x &= 0xf; -+ return x <= 9 ? '0' + x : 'a' + x - 10; -+} -+ -+static inline char * hex2(char * s, unsigned int x) -+{ -+ *s++ = hex1(x >> 4); -+ *s++ = hex1(x); -+ return s; -+} -+ -+static inline char * hex4(char * s, unsigned int x) -+{ -+ s = hex2(s, x >> 8); -+ s = hex2(s, x); -+ return s; -+} -+ -+static inline char * dash2(char * s) -+{ -+ *s++ = '-'; -+ *s++ = '-'; -+ return s; -+} -+ -+static void -+data16(char * s, const unsigned int offset, const uint8_t * m, const size_t len) -+{ -+ size_t i; -+ s = hex4(s, offset); -+ m += offset; -+ for (i = 0; i != 8; ++i) { -+ *s++ = ' '; -+ s = len > i + offset ? hex2(s, *m++) : dash2(s); -+ } -+ *s++ = ' '; -+ *s++ = ':'; -+ for (; i != 16; ++i) { -+ *s++ = ' '; -+ s = len > i + offset ? hex2(s, *m++) : dash2(s); -+ } -+ *s++ = 0; -+} -+ -+static void -+log_dump(void * logctx, int lvl, const void * const data, const size_t len) -+{ -+ size_t i; -+ for (i = 0; i < len; i += 16) { -+ char buf[80]; -+ data16(buf, i, data, len); -+ av_log(logctx, lvl, "%s\n", buf); -+ } -+} -+#endif -+ - static int64_t pts_stats_guess(const pts_stats_t * const stats) - { - if (stats->last_pts == AV_NOPTS_VALUE || -@@ -98,6 +163,98 @@ static void pts_stats_init(pts_stats_t * const stats, void * logctx, const char - }; - } - -+// If abdata == NULL then this just counts space required -+// Unpacks avcC if detected -+static int -+h264_xd_copy(const uint8_t * const extradata, const int extrasize, uint8_t * abdata) -+{ -+ const uint8_t * const xdend = extradata + extrasize; -+ const uint8_t * p = extradata; -+ uint8_t * d = abdata; -+ unsigned int n; -+ unsigned int len; -+ const unsigned int hdrlen = 4; -+ unsigned int need_pps = 1; -+ -+ if (extrasize < 8) -+ return AVERROR(EINVAL); -+ -+ if (p[0] == 0 && p[1] == 0) { -+ // Assume a couple of leading zeros are good enough to indicate NAL -+ if (abdata) -+ memcpy(d, p, extrasize); -+ return extrasize; -+ } -+ -+ // avcC starts with a 1 -+ if (p[0] != 1) -+ return AVERROR(EINVAL); -+ -+ p += 5; -+ n = *p++ & 0x1f; -+ -+doxps: -+ while (n--) { -+ if (xdend - p < 2) -+ return AVERROR(EINVAL); -+ len = (p[0] << 8) | p[1]; -+ p += 2; -+ if (xdend - p < (ptrdiff_t)len) -+ return AVERROR(EINVAL); -+ if (abdata) { -+ d[0] = 0; -+ d[1] = 0; -+ d[2] = 0; -+ d[3] = 1; -+ memcpy(d + 4, p, len); -+ } -+ d += len + hdrlen; -+ p += len; -+ } -+ if (need_pps) { -+ need_pps = 0; -+ if (p >= xdend) -+ return AVERROR(EINVAL); -+ n = *p++; -+ goto doxps; -+ } -+ -+ return d - abdata; -+} -+ -+static int -+copy_extradata(AVCodecContext * const avctx, -+ const void * const src_data, const int src_len, -+ void ** const pdst_data, size_t * const pdst_len) -+{ -+ int len; -+ -+ *pdst_len = 0; -+ av_freep(pdst_data); -+ -+ if (avctx->codec_id == AV_CODEC_ID_H264) -+ len = h264_xd_copy(src_data, src_len, NULL); -+ else -+ len = src_len < 0 ? AVERROR(EINVAL) : src_len; -+ -+ // Zero length is OK but we swant to stop - -ve is error val -+ if (len <= 0) -+ return len; -+ -+ if ((*pdst_data = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE)) == NULL) -+ return AVERROR(ENOMEM); -+ -+ if (avctx->codec_id == AV_CODEC_ID_H264) -+ h264_xd_copy(src_data, src_len, *pdst_data); -+ else -+ memcpy(*pdst_data, src_data, len); -+ *pdst_len = len; -+ -+ return 0; -+} -+ -+ -+ - static int check_output_streamon(AVCodecContext *const avctx, V4L2m2mContext *const s) - { - int ret; -@@ -277,13 +434,8 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - side_data = av_packet_get_side_data(&s->buf_pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); - if (side_data) { - av_log(avctx, AV_LOG_DEBUG, "New extradata\n"); -- av_freep(&s->extdata_data); -- if ((s->extdata_data = av_malloc(side_size ? side_size : 1)) == NULL) { -- av_log(avctx, AV_LOG_ERROR, "Failed to alloc %zd bytes of extra data\n", side_size); -- return AVERROR(ENOMEM); -- } -- memcpy(s->extdata_data, side_data, side_size); -- s->extdata_size = side_size; -+ if ((ret = copy_extradata(avctx, side_data, (int)side_size, &s->extdata_data, &s->extdata_size)) < 0) -+ av_log(avctx, AV_LOG_WARNING, "Failed to copy new extra data: %s\n", av_err2str(ret)); - s->extdata_sent = 0; - } - -@@ -359,8 +511,6 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0); - else if (s->extdata_data) - ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, s->extdata_data, s->extdata_size); -- else -- ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, avctx->extradata, avctx->extradata_size); - - if (ret == AVERROR(EAGAIN)) { - // Out of input buffers - keep packet -@@ -770,6 +920,15 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - return ret; - } - -+ if (avctx->extradata && -+ (ret = copy_extradata(avctx, avctx->extradata, avctx->extradata_size, &s->extdata_data, &s->extdata_size)) != 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to copy extradata from context: %s\n", av_err2str(ret)); -+#if DUMP_FAILED_EXTRADATA -+ log_dump(avctx, AV_LOG_INFO, avctx->extradata, avctx->extradata_size); -+#endif -+ return ret; -+ } -+ - if ((ret = v4l2_prepare_decoder(s)) < 0) - return ret; - - -From 70227ebbc2999bc49075a3b683392d94618ecd89 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 30 Sep 2022 14:20:23 +0000 -Subject: [PATCH 080/151] v4l2_request_hevc: Fix up - V4L2_CID_CODEC_STATELESS_BASE if missing - ---- - libavcodec/hevc-ctrls-v4.h | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/libavcodec/hevc-ctrls-v4.h b/libavcodec/hevc-ctrls-v4.h -index 7829d82084..c02fdbe5a8 100644 ---- a/libavcodec/hevc-ctrls-v4.h -+++ b/libavcodec/hevc-ctrls-v4.h -@@ -53,6 +53,13 @@ - #include - #include - -+#ifndef V4L2_CTRL_CLASS_CODEC_STATELESS -+#define V4L2_CTRL_CLASS_CODEC_STATELESS 0x00a40000 /* Stateless codecs controls */ -+#endif -+#ifndef V4L2_CID_CODEC_STATELESS_BASE -+#define V4L2_CID_CODEC_STATELESS_BASE (V4L2_CTRL_CLASS_CODEC_STATELESS | 0x900) -+#endif -+ - #define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ - - #define V4L2_CID_STATELESS_HEVC_SPS (V4L2_CID_CODEC_STATELESS_BASE + 400) - -From 22d2000382839dbd04588af1bb20cc9d9b3a4362 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Sat, 1 Oct 2022 13:40:57 +0000 -Subject: [PATCH 081/151] vf_deinterlace_v4l2m2m: Fix compile on m/c without - V4L2 SAND - ---- - libavfilter/vf_deinterlace_v4l2m2m.c | 33 +++++++++++++++++++++++----- - 1 file changed, 28 insertions(+), 5 deletions(-) - -diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c -index c52dae1c44..716789f988 100644 ---- a/libavfilter/vf_deinterlace_v4l2m2m.c -+++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -35,6 +35,8 @@ - #include - #include - -+#include "config.h" -+ - #include "libavutil/avassert.h" - #include "libavutil/avstring.h" - #include "libavutil/common.h" -@@ -59,6 +61,16 @@ - #define DRM_FORMAT_P030 fourcc_code('P', '0', '3', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel packed */ - #endif - -+// V4L2_PIX_FMT_NV12_10_COL128 and V4L2_PIX_FMT_NV12_COL128 should be defined -+// in drm_fourcc.h hopefully will be sometime in the future but until then... -+#ifndef V4L2_PIX_FMT_NV12_10_COL128 -+#define V4L2_PIX_FMT_NV12_10_COL128 v4l2_fourcc('N', 'C', '3', '0') -+#endif -+ -+#ifndef V4L2_PIX_FMT_NV12_COL128 -+#define V4L2_PIX_FMT_NV12_COL128 v4l2_fourcc('N', 'C', '1', '2') /* 12 Y/CbCr 4:2:0 128 pixel wide column */ -+#endif -+ - typedef struct V4L2Queue V4L2Queue; - typedef struct DeintV4L2M2MContextShared DeintV4L2M2MContextShared; - -@@ -176,9 +188,11 @@ fmt_av_to_v4l2(const enum AVPixelFormat avfmt) - return V4L2_PIX_FMT_YUV420; - case AV_PIX_FMT_NV12: - return V4L2_PIX_FMT_NV12; -+#if CONFIG_SAND - case AV_PIX_FMT_RPI4_8: - case AV_PIX_FMT_SAND128: - return V4L2_PIX_FMT_NV12_COL128; -+#endif - default: - break; - } -@@ -193,8 +207,10 @@ fmt_v4l2_to_av(const uint32_t pixfmt) - return AV_PIX_FMT_YUV420P; - case V4L2_PIX_FMT_NV12: - return AV_PIX_FMT_NV12; -+#if CONFIG_SAND - case V4L2_PIX_FMT_NV12_COL128: - return AV_PIX_FMT_RPI4_8; -+#endif - default: - break; - } -@@ -823,6 +839,7 @@ static int set_src_fmt(V4L2Queue * const q, const AVFrame * const frame) - h = src->layers[0].planes[1].offset / bpl; - w = bpl; - } -+#if CONFIG_SAND - else if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { - if (src->layers[0].nb_planes != 2) - break; -@@ -831,9 +848,11 @@ static int set_src_fmt(V4L2Queue * const q, const AVFrame * const frame) - h = src->layers[0].planes[1].offset / 128; - bpl = fourcc_mod_broadcom_param(mod); - } -+#endif - break; - - case DRM_FORMAT_P030: -+#if CONFIG_SAND - if (fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128) { - if (src->layers[0].nb_planes != 2) - break; -@@ -842,6 +861,7 @@ static int set_src_fmt(V4L2Queue * const q, const AVFrame * const frame) - h = src->layers[0].planes[1].offset / 128; - bpl = fourcc_mod_broadcom_param(mod); - } -+#endif - break; - - default: -@@ -1048,7 +1068,6 @@ static int v4l2_buffer_export_drm(V4L2Queue * const q, V4L2Buffer * const avbuf) - AVDRMLayerDescriptor * const layer = &drm_desc->layers[0]; - const struct v4l2_format *const fmt = &q->format; - const uint32_t height = fmt_height(fmt); -- const uint32_t width = fmt_width(fmt); - ptrdiff_t bpl0; - - /* fill the DRM frame descriptor */ -@@ -1063,7 +1082,7 @@ static int v4l2_buffer_export_drm(V4L2Queue * const q, V4L2Buffer * const avbuf) - bpl0 = layer->planes[0].pitch; - - switch (fmt_pixelformat(fmt)) { -- -+#if CONFIG_SAND - case V4L2_PIX_FMT_NV12_COL128: - mod = DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(bpl0); - layer->format = V4L2_PIX_FMT_NV12; -@@ -1074,9 +1093,10 @@ static int v4l2_buffer_export_drm(V4L2Queue * const q, V4L2Buffer * const avbuf) - layer->nb_planes = 2; - layer->planes[1].object_index = 0; - layer->planes[1].offset = height * 128; -- layer->planes[0].pitch = width; -- layer->planes[1].pitch = width; -+ layer->planes[0].pitch = fmt_width(fmt); -+ layer->planes[1].pitch = layer->planes[0].pitch; - break; -+#endif - - case DRM_FORMAT_NV12: - layer->format = V4L2_PIX_FMT_NV12; -@@ -1576,7 +1596,10 @@ static uint32_t desc_pixelformat(const AVDRMFrameDescriptor * const drm_desc) - return is_linear ? V4L2_PIX_FMT_YUV420 : 0; - case DRM_FORMAT_NV12: - return is_linear ? V4L2_PIX_FMT_NV12 : -- fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128 ? V4L2_PIX_FMT_NV12_COL128 : 0; -+#if CONFIG_SAND -+ fourcc_mod_broadcom_mod(mod) == DRM_FORMAT_MOD_BROADCOM_SAND128 ? V4L2_PIX_FMT_NV12_COL128 : -+#endif -+ 0; - default: - break; - } - -From f06f9ee41bf0f6f74240503f0cb427328cf6792f Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Sun, 2 Oct 2022 12:36:43 +0000 -Subject: [PATCH 082/151] configure: Fix v4l2_req_hevc_vx setup; set after deps - fixups - ---- - configure | 9 +++------ - 1 file changed, 3 insertions(+), 6 deletions(-) - -diff --git a/configure b/configure -index 5c00a183e3..94c8161b91 100755 ---- a/configure -+++ b/configure -@@ -6914,12 +6914,6 @@ fi - check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns - check_cc hevc_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_HEVC_SLICE;" - disable v4l2_req_hevc_vx --if enabled hevc_v4l2request_hwaccel; then -- enable v4l2_req_hevc_vx --fi --if enabled hevc_v4l2_request; then -- disable v4l2_req_hevc_vx --fi - - check_headers sys/videoio.h - test_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_sanitized struct_v4l2_frmivalenum_discrete -@@ -7415,6 +7409,9 @@ check_deps $CONFIG_LIST \ - - enabled threads && ! enabled pthreads && ! enabled atomics_native && die "non pthread threading without atomics not supported, try adding --enable-pthreads or --cpu=i486 or higher if you are on x86" - -+# Sub-feature of hevc_v4l2request_hwaccel - can only be set once deps are done -+enabled hevc_v4l2request_hwaccel && disabled hevc_v4l2_request && enable v4l2_req_hevc_vx -+ - case $target_os in - haiku) - disable memalign - -From 7d7709fb68561711f893269227147974fd6a46f3 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Sat, 1 Oct 2022 12:39:45 +0000 -Subject: [PATCH 083/151] vf_deinterlace_v4l2m2m: Ensure we get consistent - final frames - -On getting EOS at the input of the filster do not simply drop everything -in transit on the floor but attempt to retrieve everything possible from -the capture Q before on-signalling EOS. -If we know that we expect 1 frame in to always produce 1 frame out then -match CAPTURE frame to the last OUTPUT frame Qed (scale) -If frames out have an unknown relation to source frames (deinterlace) try -an encode stop and wait for the last frame marker to emerge from CAPTURE ---- - libavfilter/vf_deinterlace_v4l2m2m.c | 172 +++++++++++++++++++++++---- - 1 file changed, 148 insertions(+), 24 deletions(-) - -diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c -index 716789f988..ce875c2c61 100644 ---- a/libavfilter/vf_deinterlace_v4l2m2m.c -+++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -94,6 +94,7 @@ typedef struct V4L2Buffer { - typedef struct V4L2Queue { - struct v4l2_format format; - struct v4l2_selection sel; -+ int eos; - int num_buffers; - V4L2Buffer *buffers; - const char * name; -@@ -127,20 +128,41 @@ typedef struct pts_track_s - pts_track_el_t a[PTS_TRACK_SIZE]; - } pts_track_t; - -+typedef enum drain_state_e -+{ -+ DRAIN_NONE = 0, // Not draining -+ DRAIN_TIMEOUT, // Drain until normal timeout setup yields no frame -+ DRAIN_LAST, // Drain with long timeout last_frame in received on output expected -+ DRAIN_EOS, // Drain with long timeout EOS expected -+ DRAIN_DONE // Drained -+} drain_state_t; -+ - typedef struct DeintV4L2M2MContextShared { - void * logctx; // For logging - will be NULL when done - filter_type_v4l2_t filter_type; - - int fd; -- int done; -+ int done; // fd closed - awating all refs dropped - int width; - int height; - -+ int drain; // EOS received (inlink status) -+ drain_state_t drain_state; -+ int64_t drain_pts; // PTS associated with inline status -+ -+ unsigned int frames_rx; -+ unsigned int frames_tx; -+ - // from options - int output_width; - int output_height; - enum AVPixelFormat output_format; - -+ int has_enc_stop; -+ // We expect to get exactly the same number of frames out as we put in -+ // We can drain by matching input to output -+ int one_to_one; -+ - int orig_width; - int orig_height; - atomic_uint refcount; -@@ -179,6 +201,12 @@ typedef struct DeintV4L2M2MContext { - enum AVChromaLocation chroma_location; - } DeintV4L2M2MContext; - -+ -+static inline int drain_frame_expected(const drain_state_t d) -+{ -+ return d == DRAIN_EOS || d == DRAIN_LAST; -+} -+ - // These just list the ones we know we can cope with - static uint32_t - fmt_av_to_v4l2(const enum AVPixelFormat avfmt) -@@ -334,6 +362,13 @@ fail: - return 0; - } - -+// We are only ever expecting in-order frames so nothing more clever is required -+static unsigned int -+pts_track_count(const pts_track_t * const trk) -+{ -+ return (trk->n - trk->last_n) & (PTS_TRACK_SIZE - 1); -+} -+ - static struct timeval pts_track_add_frame(pts_track_t * const trk, const AVFrame * const src) - { - const uint32_t n = pts_track_next_n(trk); -@@ -406,6 +441,12 @@ fmt_pixelformat(const struct v4l2_format * const fmt) - return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.pixelformat : fmt->fmt.pix.pixelformat; - } - -+static inline uint32_t -+buf_bytesused0(const struct v4l2_buffer * const buf) -+{ -+ return V4L2_TYPE_IS_MULTIPLANAR(buf->type) ? buf->m.planes[0].bytesused : buf->bytesused; -+} -+ - static void - init_format(V4L2Queue * const q, const uint32_t format_type) - { -@@ -1469,12 +1510,24 @@ static int deint_v4l2m2m_dequeue_frame(V4L2Queue *queue, AVFrame* frame, int tim - - av_log(ctx->logctx, AV_LOG_TRACE, "<<< %s\n", __func__); - -+ if (queue->eos) { -+ av_log(ctx->logctx, AV_LOG_TRACE, ">>> %s: EOS\n", __func__); -+ return AVERROR_EOF; -+ } -+ - avbuf = deint_v4l2m2m_dequeue_buffer(queue, timeout); - if (!avbuf) { - av_log(ctx->logctx, AV_LOG_DEBUG, "%s: No buffer to dequeue (timeout=%d)\n", __func__, timeout); - return AVERROR(EAGAIN); - } - -+ if (V4L2_TYPE_IS_CAPTURE(avbuf->buffer.type)) { -+ if ((avbuf->buffer.flags & V4L2_BUF_FLAG_LAST) != 0) -+ queue->eos = 1; -+ if (buf_bytesused0(&avbuf->buffer) == 0) -+ return queue->eos ? AVERROR_EOF : AVERROR(EINVAL); -+ } -+ - // Fill in PTS and anciliary info from src frame - pts_track_get_frame(&ctx->track, avbuf->buffer.timestamp, frame); - -@@ -1686,6 +1739,20 @@ static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) - else - ctx->field_order = V4L2_FIELD_INTERLACED_BT; - -+ { -+ struct v4l2_encoder_cmd ecmd = { -+ .cmd = V4L2_ENC_CMD_STOP -+ }; -+ ctx->has_enc_stop = 0; -+ if (ioctl(ctx->fd, VIDIOC_TRY_ENCODER_CMD, &ecmd) == 0) { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "Test encode stop succeeded\n"); -+ ctx->has_enc_stop = 1; -+ } -+ else { -+ av_log(ctx->logctx, AV_LOG_DEBUG, "Test encode stop fail: %s\n", av_err2str(AVERROR(errno))); -+ } -+ -+ } - } - - ret = deint_v4l2m2m_enqueue_frame(output, in); -@@ -1694,6 +1761,41 @@ static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) - return ret; - } - -+static int -+ack_inlink(AVFilterContext * const avctx, DeintV4L2M2MContextShared *const s, -+ AVFilterLink * const inlink) -+{ -+ int instatus; -+ int64_t inpts; -+ -+ if (ff_inlink_acknowledge_status(inlink, &instatus, &inpts) <= 0) -+ return 0; -+ -+ s->drain = instatus; -+ s->drain_pts = inpts; -+ s->drain_state = DRAIN_TIMEOUT; -+ -+ if (s->field_order == V4L2_FIELD_ANY) { // Not yet started -+ s->drain_state = DRAIN_DONE; -+ } -+ else if (s->one_to_one) { -+ s->drain_state = DRAIN_LAST; -+ } -+ else if (s->has_enc_stop) { -+ struct v4l2_encoder_cmd ecmd = { -+ .cmd = V4L2_ENC_CMD_STOP -+ }; -+ if (ioctl(s->fd, VIDIOC_ENCODER_CMD, &ecmd) == 0) { -+ av_log(avctx->priv, AV_LOG_DEBUG, "Do Encode stop\n"); -+ s->drain_state = DRAIN_EOS; -+ } -+ else { -+ av_log(avctx->priv, AV_LOG_WARNING, "Encode stop fail: %s\n", av_err2str(AVERROR(errno))); -+ } -+ } -+ return 1; -+} -+ - static int deint_v4l2m2m_activate(AVFilterContext *avctx) - { - DeintV4L2M2MContext * const priv = avctx->priv; -@@ -1702,15 +1804,13 @@ static int deint_v4l2m2m_activate(AVFilterContext *avctx) - AVFilterLink * const inlink = avctx->inputs[0]; - int n = 0; - int cn = 99; -- int instatus = 0; -- int64_t inpts = 0; - int did_something = 0; - - av_log(priv, AV_LOG_TRACE, "<<< %s\n", __func__); - - FF_FILTER_FORWARD_STATUS_BACK_ALL(outlink, avctx); - -- ff_inlink_acknowledge_status(inlink, &instatus, &inpts); -+ ack_inlink(avctx, s, inlink); - - if (!ff_outlink_frame_wanted(outlink)) { - av_log(priv, AV_LOG_TRACE, "%s: Not wanted out\n", __func__); -@@ -1720,7 +1820,6 @@ static int deint_v4l2m2m_activate(AVFilterContext *avctx) - AVFrame * frame = av_frame_alloc(); - int rv; - --again: - recycle_q(&s->output); - n = count_enqueued(&s->output); - -@@ -1729,10 +1828,21 @@ again: - return AVERROR(ENOMEM); - } - -- rv = deint_v4l2m2m_dequeue_frame(&s->capture, frame, n > 4 ? 300 : 0); -+ rv = deint_v4l2m2m_dequeue_frame(&s->capture, frame, -+ drain_frame_expected(s->drain_state) || n > 4 ? 300 : 0); - if (rv != 0) { - av_frame_free(&frame); -- if (rv != AVERROR(EAGAIN)) { -+ if (rv == AVERROR_EOF) { -+ av_log(priv, AV_LOG_DEBUG, "%s: --- DQ EOF\n", __func__); -+ s->drain_state = DRAIN_DONE; -+ } -+ else if (rv == AVERROR(EAGAIN)) { -+ if (s->drain_state != DRAIN_NONE) { -+ av_log(priv, AV_LOG_DEBUG, "%s: --- DQ empty - drain done\n", __func__); -+ s->drain_state = DRAIN_DONE; -+ } -+ } -+ else { - av_log(priv, AV_LOG_ERROR, ">>> %s: DQ fail: %s\n", __func__, av_err2str(rv)); - return rv; - } -@@ -1742,29 +1852,30 @@ again: - // frame is always consumed by filter_frame - even on error despite - // a somewhat confusing comment in the header - rv = ff_filter_frame(outlink, frame); -- -- if (instatus != 0) { -- av_log(priv, AV_LOG_TRACE, "%s: eof loop\n", __func__); -- goto again; -- } -+ ++s->frames_tx; - - av_log(priv, AV_LOG_TRACE, "%s: Filtered: %s\n", __func__, av_err2str(rv)); - did_something = 1; -+ -+ if (s->drain_state != DRAIN_NONE && pts_track_count(&s->track) == 0) { -+ av_log(priv, AV_LOG_DEBUG, "%s: --- DQ last - drain done\n", __func__); -+ s->drain_state = DRAIN_DONE; -+ } - } - - cn = count_enqueued(&s->capture); - } - -- if (instatus != 0) { -- ff_outlink_set_status(outlink, instatus, inpts); -- av_log(priv, AV_LOG_TRACE, ">>> %s: Status done: %s\n", __func__, av_err2str(instatus)); -+ if (s->drain_state == DRAIN_DONE) { -+ ff_outlink_set_status(outlink, s->drain, s->drain_pts); -+ av_log(priv, AV_LOG_TRACE, ">>> %s: Status done: %s\n", __func__, av_err2str(s->drain)); - return 0; - } - - recycle_q(&s->output); - n = count_enqueued(&s->output); - -- while (n < 6) { -+ while (n < 6 && !s->drain) { - AVFrame * frame; - int rv; - -@@ -1775,8 +1886,13 @@ again: - - if (frame == NULL) { - av_log(priv, AV_LOG_TRACE, "%s: No frame\n", __func__); -+ if (!ack_inlink(avctx, s, inlink)) { -+ ff_inlink_request_frame(inlink); -+ av_log(priv, AV_LOG_TRACE, "%s: req frame\n", __func__); -+ } - break; - } -+ ++s->frames_rx; - - rv = deint_v4l2m2m_filter_frame(inlink, frame); - av_frame_free(&frame); -@@ -1785,16 +1901,11 @@ again: - return rv; - - av_log(priv, AV_LOG_TRACE, "%s: Q frame\n", __func__); -- ++n; -- } -- -- if (n < 6) { -- ff_inlink_request_frame(inlink); - did_something = 1; -- av_log(priv, AV_LOG_TRACE, "%s: req frame\n", __func__); -+ ++n; - } - -- if (n > 4 && ff_outlink_frame_wanted(outlink)) { -+ if ((n > 4 || s->drain) && ff_outlink_frame_wanted(outlink)) { - ff_filter_set_ready(avctx, 1); - did_something = 1; - av_log(priv, AV_LOG_TRACE, "%s: ready\n", __func__); -@@ -1873,7 +1984,18 @@ static av_cold int deint_v4l2m2m_init(AVFilterContext *avctx) - - static av_cold int scale_v4l2m2m_init(AVFilterContext *avctx) - { -- return common_v4l2m2m_init(avctx, FILTER_V4L2_SCALE); -+ int rv; -+ DeintV4L2M2MContext * priv; -+ DeintV4L2M2MContextShared * ctx; -+ -+ if ((rv = common_v4l2m2m_init(avctx, FILTER_V4L2_SCALE)) != 0) -+ return rv; -+ -+ priv = avctx->priv; -+ ctx = priv->shared; -+ -+ ctx->one_to_one = 1; -+ return 0; - } - - static void deint_v4l2m2m_uninit(AVFilterContext *avctx) -@@ -1881,6 +2003,8 @@ static void deint_v4l2m2m_uninit(AVFilterContext *avctx) - DeintV4L2M2MContext *priv = avctx->priv; - DeintV4L2M2MContextShared *ctx = priv->shared; - -+ av_log(priv, AV_LOG_VERBOSE, "Frames Rx: %u, Frames Tx: %u\n", -+ ctx->frames_rx, ctx->frames_tx); - ctx->done = 1; - ctx->logctx = NULL; // Log to NULL works, log to missing crashes - pts_track_uninit(&ctx->track); - -From f893891df8f4e7738b2d9b49df4386fb160eb25f Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 5 Oct 2022 16:12:02 +0000 -Subject: [PATCH 084/151] v4l2_m2m_dec: Rework decode pending heuristic - -The old code measured the length of the entire Q in the decoder and -attempted to dynamically guess an appropriate length. This was prone to -failure when the guesswork became confused. -The new code attempts to measure the Q length before insertion into decode -which, after all, is what we actually care about. It does this by -asserting that the decoder must have consumed all packets that came -before the one associated with the most recent CAPTURE frame. This -avoids all need for reorder buffer size guesswork. ---- - libavcodec/v4l2_m2m.h | 2 - - libavcodec/v4l2_m2m_dec.c | 77 +++++++++++++++++---------------------- - 2 files changed, 34 insertions(+), 45 deletions(-) - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index babf101d65..26a7161042 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -107,8 +107,6 @@ typedef struct V4L2m2mContext { - - /* Frame tracking */ - xlat_track_t xlat; -- int pending_hw; -- int pending_n; - - pts_stats_t pts_stat; - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 6bd9926b3f..bec9b22fcf 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -349,41 +349,54 @@ static void - xlat_flush(xlat_track_t * const x) - { - unsigned int i; -+ // Do not reset track_no - this ensures that any frames left in the decoder -+ // that turn up later get discarded. -+ -+ x->last_pts = AV_NOPTS_VALUE; -+ x->last_opaque = 0; - for (i = 0; i != FF_V4L2_M2M_TRACK_SIZE; ++i) { - x->track_els[i].pending = 0; - x->track_els[i].discard = 1; - } -- x->last_pts = AV_NOPTS_VALUE; -+} -+ -+static void -+xlat_init(xlat_track_t * const x) -+{ -+ memset(x, 0, sizeof(*x)); -+ xlat_flush(x); - } - - static int - xlat_pending(const xlat_track_t * const x) - { - unsigned int n = x->track_no % FF_V4L2_M2M_TRACK_SIZE; -- unsigned int i; -- int r = 0; -- int64_t now = AV_NOPTS_VALUE; -+ int i; -+ const int64_t now = x->last_pts; - -- for (i = 0; i < 32; ++i, n = (n - 1) % FF_V4L2_M2M_TRACK_SIZE) { -+ for (i = 0; i < FF_V4L2_M2M_TRACK_SIZE; ++i, n = (n - 1) & (FF_V4L2_M2M_TRACK_SIZE - 1)) { - const V4L2m2mTrackEl * const t = x->track_els + n; - -+ // Discard only set on never-set or flushed entries -+ // So if we get here we've never successfully decoded a frame so allow -+ // more frames into the buffer before stalling -+ if (t->discard) -+ return i - 16; -+ -+ // If we've got this frame out then everything before this point -+ // must have entered the decoder - if (!t->pending) -- continue; -+ break; - -+ // If we've never seen a pts all we can do is count frames - if (now == AV_NOPTS_VALUE) -- now = t->dts; -+ continue; - -- if (t->pts == AV_NOPTS_VALUE || -- ((now == AV_NOPTS_VALUE || t->pts <= now) && -- (x->last_pts == AV_NOPTS_VALUE || t->pts > x->last_pts))) -- ++r; -+ if (t->dts != AV_NOPTS_VALUE && now >= t->dts) -+ break; - } - -- // If we never get any ideas about PTS vs DTS allow a lot more buffer -- if (now == AV_NOPTS_VALUE) -- r -= 16; -- -- return r; -+ return i; - } - - static inline int stream_started(const V4L2m2mContext * const s) { -@@ -557,18 +570,6 @@ static int qbuf_wait(AVCodecContext * const avctx, V4L2Context * const ctx) - return rv; - } - --// Number of frames over what xlat_pending returns that we keep *16 --// This is a min value - if it appears to be too small the threshold should --// adjust dynamically. --#define PENDING_HW_MIN (3 * 16) --// Offset to use when setting dynamically --// Set to %16 == 15 to avoid the threshold changing immediately as we relax --#define PENDING_HW_OFFSET (PENDING_HW_MIN - 1) --// Number of consecutive times we've failed to get a frame when we prefer it --// before we increase the prefer threshold (5ms * N = max expected decode --// time) --#define PENDING_N_THRESHOLD 6 -- - static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - { - V4L2m2mContext *const s = ((V4L2m2mPriv*)avctx->priv_data)->context; -@@ -578,9 +579,11 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - - do { - const int pending = xlat_pending(&s->xlat); -- const int prefer_dq = (pending > s->pending_hw / 16); -+ const int prefer_dq = (pending > 3); - const int last_src_rv = src_rv; - -+ av_log(avctx, AV_LOG_TRACE, "Pending=%d, src_rv=%d, req_pkt=%d\n", pending, src_rv, s->req_pkt); -+ - // Enqueue another pkt for decode if - // (a) We don't have a lot of stuff in the buffer already OR - // (b) ... we (think we) do but we've failed to get a frame already OR -@@ -625,20 +628,8 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - } - } - -- // Adjust dynamic pending threshold -- if (dst_rv == 0) { -- if (--s->pending_hw < PENDING_HW_MIN) -- s->pending_hw = PENDING_HW_MIN; -- s->pending_n = 0; -- -+ if (dst_rv == 0) - set_best_effort_pts(avctx, &s->pts_stat, frame); -- } -- else if (dst_rv == AVERROR(EAGAIN)) { -- if (prefer_dq && ++s->pending_n > PENDING_N_THRESHOLD) { -- s->pending_hw = pending * 16 + PENDING_HW_OFFSET; -- s->pending_n = 0; -- } -- } - - if (dst_rv == AVERROR(EAGAIN) && src_rv == NQ_DRAINING) { - av_log(avctx, AV_LOG_WARNING, "Timeout in drain - assume EOF"); -@@ -857,8 +848,8 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - if (ret < 0) - return ret; - -+ xlat_init(&s->xlat); - pts_stats_init(&s->pts_stat, avctx, "decoder"); -- s->pending_hw = PENDING_HW_MIN; - - capture = &s->capture; - output = &s->output; - -From 7048e7e6b8621cf09b96cc7e44b8d82ba8619913 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 21 Oct 2022 13:48:07 +0000 -Subject: [PATCH 085/151] pthread_frame: Fix MT hwaccel. Recent change broke - it. - -Revert the effects of 35aa7e70e7ec350319e7634a30d8d8aa1e6ecdda if the -hwaccel is marked MT_SAFE. ---- - libavcodec/pthread_frame.c | 48 ++++++++++++++++++++++++++++---------- - 1 file changed, 36 insertions(+), 12 deletions(-) - -diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c -index 2cc89a41f5..b14f8e9360 100644 ---- a/libavcodec/pthread_frame.c -+++ b/libavcodec/pthread_frame.c -@@ -231,7 +231,7 @@ static attribute_align_arg void *frame_worker_thread(void *arg) - p->hwaccel_serializing = 0; - pthread_mutex_unlock(&p->parent->hwaccel_mutex); - } -- av_assert0(!avctx->hwaccel); -+ av_assert0(!avctx->hwaccel || (avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE)); - - if (p->async_serializing) { - p->async_serializing = 0; -@@ -319,6 +319,12 @@ FF_ENABLE_DEPRECATION_WARNINGS - } - - dst->hwaccel_flags = src->hwaccel_flags; -+ if (src->hwaccel && -+ (src->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE)) { -+ dst->hwaccel = src->hwaccel; -+ dst->hwaccel_context = src->hwaccel_context; -+ dst->internal->hwaccel_priv_data = src->internal->hwaccel_priv_data; -+ } - - err = av_buffer_replace(&dst->internal->pool, src->internal->pool); - if (err < 0) -@@ -434,10 +440,13 @@ static int submit_packet(PerThreadContext *p, AVCodecContext *user_avctx, - } - - /* transfer the stashed hwaccel state, if any */ -- av_assert0(!p->avctx->hwaccel); -- FFSWAP(const AVHWAccel*, p->avctx->hwaccel, fctx->stash_hwaccel); -- FFSWAP(void*, p->avctx->hwaccel_context, fctx->stash_hwaccel_context); -- FFSWAP(void*, p->avctx->internal->hwaccel_priv_data, fctx->stash_hwaccel_priv); -+ av_assert0(!p->avctx->hwaccel || (p->avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE)); -+ if (p->avctx->hwaccel && -+ !(p->avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE)) { -+ FFSWAP(const AVHWAccel*, p->avctx->hwaccel, fctx->stash_hwaccel); -+ FFSWAP(void*, p->avctx->hwaccel_context, fctx->stash_hwaccel_context); -+ FFSWAP(void*, p->avctx->internal->hwaccel_priv_data, fctx->stash_hwaccel_priv); -+ } - - av_packet_unref(p->avpkt); - ret = av_packet_ref(p->avpkt, avpkt); -@@ -610,9 +619,12 @@ void ff_thread_finish_setup(AVCodecContext *avctx) { - * this is done here so that this worker thread can wipe its own hwaccel - * state after decoding, without requiring synchronization */ - av_assert0(!p->parent->stash_hwaccel); -- p->parent->stash_hwaccel = avctx->hwaccel; -- p->parent->stash_hwaccel_context = avctx->hwaccel_context; -- p->parent->stash_hwaccel_priv = avctx->internal->hwaccel_priv_data; -+ if (avctx->hwaccel && -+ !(avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE)) { -+ p->parent->stash_hwaccel = avctx->hwaccel; -+ p->parent->stash_hwaccel_context = avctx->hwaccel_context; -+ p->parent->stash_hwaccel_priv = avctx->internal->hwaccel_priv_data; -+ } - - pthread_mutex_lock(&p->progress_mutex); - if(atomic_load(&p->state) == STATE_SETUP_FINISHED){ -@@ -667,6 +679,15 @@ void ff_frame_thread_free(AVCodecContext *avctx, int thread_count) - - park_frame_worker_threads(fctx, thread_count); - -+ if (fctx->prev_thread && -+ avctx->hwaccel && (avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE) && -+ avctx->internal->hwaccel_priv_data != -+ fctx->prev_thread->avctx->internal->hwaccel_priv_data) { -+ if (update_context_from_thread(avctx, fctx->prev_thread->avctx, 1) < 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to update user thread.\n"); -+ } -+ } -+ - for (i = 0; i < thread_count; i++) { - PerThreadContext *p = &fctx->threads[i]; - AVCodecContext *ctx = p->avctx; -@@ -710,10 +731,13 @@ void ff_frame_thread_free(AVCodecContext *avctx, int thread_count) - - /* if we have stashed hwaccel state, move it to the user-facing context, - * so it will be freed in avcodec_close() */ -- av_assert0(!avctx->hwaccel); -- FFSWAP(const AVHWAccel*, avctx->hwaccel, fctx->stash_hwaccel); -- FFSWAP(void*, avctx->hwaccel_context, fctx->stash_hwaccel_context); -- FFSWAP(void*, avctx->internal->hwaccel_priv_data, fctx->stash_hwaccel_priv); -+ av_assert0(!avctx->hwaccel || (avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE)); -+ if (avctx->hwaccel && -+ !(avctx->hwaccel->caps_internal & HWACCEL_CAP_MT_SAFE)) { -+ FFSWAP(const AVHWAccel*, avctx->hwaccel, fctx->stash_hwaccel); -+ FFSWAP(void*, avctx->hwaccel_context, fctx->stash_hwaccel_context); -+ FFSWAP(void*, avctx->internal->hwaccel_priv_data, fctx->stash_hwaccel_priv); -+ } - - av_freep(&avctx->internal->thread_ctx); - } - -From 033056bd8ec63b16fe081446f70f41b5d5789b81 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 18 Oct 2022 13:18:27 +0000 -Subject: [PATCH 086/151] v4l2_req: Add swfmt to init logging - -(cherry picked from commit dfa03b702baaf2952bcd2bbf8badcc2f9c961ddf) ---- - libavcodec/v4l2_request_hevc.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index 614a1b4d99..767ecb036a 100644 ---- a/libavcodec/v4l2_request_hevc.c -+++ b/libavcodec/v4l2_request_hevc.c -@@ -26,6 +26,7 @@ - #include "v4l2_request_hevc.h" - - #include "libavutil/hwcontext_drm.h" -+#include "libavutil/pixdesc.h" - - #include "v4l2_req_devscan.h" - #include "v4l2_req_dmabufs.h" -@@ -306,10 +307,11 @@ retry_src_memtype: - // Set our s/w format - avctx->sw_pix_fmt = ((AVHWFramesContext *)avctx->hw_frames_ctx->data)->sw_format; - -- av_log(avctx, AV_LOG_INFO, "Hwaccel %s; devices: %s,%s; buffers: src %s, dst %s\n", -+ av_log(avctx, AV_LOG_INFO, "Hwaccel %s; devices: %s,%s; buffers: src %s, dst %s; swfmt=%s\n", - ctx->fns->name, - decdev_media_path(decdev), decdev_video_path(decdev), -- mediabufs_memory_name(src_memtype), mediabufs_memory_name(dst_memtype)); -+ mediabufs_memory_name(src_memtype), mediabufs_memory_name(dst_memtype), -+ av_get_pix_fmt_name(avctx->sw_pix_fmt)); - - return 0; - - -From 70779e742b93015e3e8aaa8f945a12d35917844d Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 18 Oct 2022 13:39:54 +0000 -Subject: [PATCH 087/151] v4l2_m2m: Avoid polling on a queue that is streamoff - -(cherry picked from commit b2658bc56d3034a17db7f39597fc7d71bfe9a43b) ---- - libavcodec/v4l2_context.c | 13 +++++++++---- - 1 file changed, 9 insertions(+), 4 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 4a359bf45e..b296dc111c 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -578,6 +578,11 @@ get_event(V4L2m2mContext * const m) - return 0; - } - -+static inline int -+dq_ok(const V4L2Context * const c) -+{ -+ return c->streamon && atomic_load(&c->q_count) != 0; -+} - - // Get a buffer - // If output then just gets the buffer in the expected way -@@ -613,13 +618,13 @@ get_qbuf(V4L2Context * const ctx, V4L2Buffer ** const ppavbuf, const int timeout - } - - // If capture && timeout == -1 then also wait for rx buffer free -- if (is_cap && timeout == -1 && m->output.streamon && !m->draining) -+ if (is_cap && timeout == -1 && dq_ok(&m->output) && !m->draining) - pfd.events |= poll_out; - - // If nothing Qed all we will get is POLLERR - avoid that -- if ((pfd.events == poll_out && atomic_load(&m->output.q_count) == 0) || -- (pfd.events == poll_cap && atomic_load(&m->capture.q_count) == 0) || -- (pfd.events == (poll_cap | poll_out) && atomic_load(&m->capture.q_count) == 0 && atomic_load(&m->output.q_count) == 0)) { -+ if ((pfd.events == poll_out && !dq_ok(&m->output)) || -+ (pfd.events == poll_cap && !dq_ok(&m->capture)) || -+ (pfd.events == (poll_cap | poll_out) && !dq_ok(&m->capture) && !dq_ok(&m->output))) { - av_log(avctx, AV_LOG_TRACE, "V4L2 poll %s empty\n", ctx->name); - return AVERROR(ENOSPC); - } - -From 438fed3702eb689f836c885ebbd813e48d4d4c4a Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 18 Oct 2022 14:07:04 +0000 -Subject: [PATCH 088/151] v4l2_m2m: Add function to get number of queued - buffers - -(cherry picked from commit f9ac6485c00b4531dcff354222aef450b29728f4) ---- - libavcodec/v4l2_context.h | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index 523c53e97d..8e4f681643 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -220,4 +220,15 @@ int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* f); - - void ff_v4l2_dq_all(V4L2Context *const ctx); - -+/** -+ * Returns the number of buffers currently queued -+ * -+ * @param[in] ctx The V4L2Context to evaluate -+ */ -+static inline int -+ff_v4l2_context_q_count(const V4L2Context* const ctx) -+{ -+ return atomic_load(&ctx->q_count); -+} -+ - #endif // AVCODEC_V4L2_CONTEXT_H - -From 95ff4a65ed4c88ea7e02ee55e260e37a0ce2ba88 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 18 Oct 2022 14:48:20 +0000 -Subject: [PATCH 089/151] v4l2_m2m: Add timeouts to dq_all and dequeue_packet - -Add timeouts and use them to have better flow control in encode - -(cherry picked from commit c6173cad7f21697e12887982bda796de9719bb32) ---- - libavcodec/v4l2_context.c | 16 +++++++++++----- - libavcodec/v4l2_context.h | 15 +++++++++++++-- - libavcodec/v4l2_m2m_enc.c | 28 +++++++++++++++++++--------- - 3 files changed, 43 insertions(+), 16 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index b296dc111c..7031f3d340 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -712,13 +712,19 @@ clean_v4l2_buffer(V4L2Buffer * const avbuf) - return avbuf; - } - --void --ff_v4l2_dq_all(V4L2Context *const ctx) -+int -+ff_v4l2_dq_all(V4L2Context *const ctx, int timeout1) - { - V4L2Buffer * avbuf; -+ if (timeout1 != 0) { -+ int rv = get_qbuf(ctx, &avbuf, timeout1); -+ if (rv != 0) -+ return rv; -+ } - do { - get_qbuf(ctx, &avbuf, 0); - } while (avbuf); -+ return 0; - } - - static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) -@@ -727,7 +733,7 @@ static V4L2Buffer* v4l2_getfree_v4l2buf(V4L2Context *ctx) - - /* get back as many output buffers as possible */ - if (V4L2_TYPE_IS_OUTPUT(ctx->type)) -- ff_v4l2_dq_all(ctx); -+ ff_v4l2_dq_all(ctx, 0); - - for (i = 0; i < ctx->num_buffers; i++) { - V4L2Buffer * const avbuf = (V4L2Buffer *)ctx->bufrefs[i]->data; -@@ -1047,7 +1053,7 @@ int ff_v4l2_context_dequeue_frame(V4L2Context* ctx, AVFrame* frame, int timeout) - return 0; - } - --int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt) -+int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt, int timeout) - { - V4L2m2mContext *s = ctx_to_m2mctx(ctx); - AVCodecContext *const avctx = s->avctx; -@@ -1055,7 +1061,7 @@ int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt) - int rv; - - do { -- if ((rv = get_qbuf(ctx, &avbuf, -1)) != 0) -+ if ((rv = get_qbuf(ctx, &avbuf, timeout)) != 0) - return rv == AVERROR(ENOSPC) ? AVERROR(EAGAIN) : rv; // Caller not currently expecting ENOSPC - if ((rv = ff_v4l2_buffer_buf_to_avpkt(pkt, avbuf)) != 0) - return rv; -diff --git a/libavcodec/v4l2_context.h b/libavcodec/v4l2_context.h -index 8e4f681643..5afed3e6ec 100644 ---- a/libavcodec/v4l2_context.h -+++ b/libavcodec/v4l2_context.h -@@ -179,7 +179,7 @@ int ff_v4l2_context_set_status(V4L2Context* ctx, uint32_t cmd); - * @param[inout] pkt The AVPacket to dequeue to. - * @return 0 in case of success, AVERROR(EAGAIN) if no buffer was ready, another negative error in case of error. - */ --int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt); -+int ff_v4l2_context_dequeue_packet(V4L2Context* ctx, AVPacket* pkt, int timeout); - - /** - * Dequeues a buffer from a V4L2Context to an AVFrame. -@@ -218,7 +218,18 @@ int ff_v4l2_context_enqueue_packet(V4L2Context* ctx, const AVPacket* pkt, const - */ - int ff_v4l2_context_enqueue_frame(V4L2Context* ctx, const AVFrame* f); - --void ff_v4l2_dq_all(V4L2Context *const ctx); -+/** -+ * Dequeue all buffers on this queue -+ * -+ * Used to recycle output buffers -+ * -+ * @param[in] ctx The V4L2Context to dequeue from. -+ * @param[in] timeout1 A timeout on dequeuing the 1st buffer, -+ * all others have a timeout of zero -+ * @return AVERROR(EAGAIN) if timeout1 non-zero then the return -+ * of the first dequeue operation, 0 otherwise. -+ */ -+int ff_v4l2_dq_all(V4L2Context *const ctx, int timeout1); - - /** - * Returns the number of buffers currently queued -diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c -index a992a3cccc..d0d27e5bc2 100644 ---- a/libavcodec/v4l2_m2m_enc.c -+++ b/libavcodec/v4l2_m2m_enc.c -@@ -420,16 +420,24 @@ static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame) - { - V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; - V4L2Context *const output = &s->output; -+ int rv; -+ int needs_slot = ff_v4l2_context_q_count(output) == output->num_buffers; - -- ff_v4l2_dq_all(output); -+ av_log(avctx, AV_LOG_TRACE, "<<< %s; needs_slot=%d\n", __func__, needs_slot); - -- // Signal EOF if needed -+ // Signal EOF if needed (doesn't need q slot) - if (!frame) { - return ff_v4l2_context_enqueue_frame(output, frame); - } - -+ if ((rv = ff_v4l2_dq_all(output, needs_slot? 500 : 0)) != 0) { -+ // We should be able to return AVERROR(EAGAIN) to indicate buffer -+ // exhaustion, but ffmpeg currently treats that as fatal. -+ av_log(avctx, AV_LOG_WARNING, "Failed to get buffer for src frame: %s\n", av_err2str(rv)); -+ return rv; -+ } -+ - if (s->input_drm && !output->streamon) { -- int rv; - struct v4l2_format req_format = {.type = output->format.type}; - - // Set format when we first get a buffer -@@ -494,7 +502,9 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) - AVFrame *frame = s->frame; - int ret; - -- ff_v4l2_dq_all(output); -+ av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); -+ -+ ff_v4l2_dq_all(output, 0); - - if (s->draining) - goto dequeue; -@@ -532,10 +542,10 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) - } - - dequeue: -- ret = ff_v4l2_context_dequeue_packet(capture, avpkt); -- ff_v4l2_dq_all(output); -+ ret = ff_v4l2_context_dequeue_packet(capture, avpkt, s->draining ? 300 : 0); -+ ff_v4l2_dq_all(output, 0); - if (ret) -- return ret; -+ return (s->draining && ret == AVERROR(EAGAIN)) ? AVERROR_EOF : ret; - - if (capture->first_buf == 1) { - uint8_t * data; -@@ -566,8 +576,8 @@ dequeue: - s->extdata_size = len; - } - -- ret = ff_v4l2_context_dequeue_packet(capture, avpkt); -- ff_v4l2_dq_all(output); -+ ret = ff_v4l2_context_dequeue_packet(capture, avpkt, 0); -+ ff_v4l2_dq_all(output, 0); - if (ret) - return ret; - } - -From e6654c1997a6f4dfd43b0f74b0168f5d644c1c74 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 18 Oct 2022 14:23:32 +0000 -Subject: [PATCH 090/151] v4l2_m2m_enc: Improve debug trace - -(cherry picked from commit 113e89daffb329a0cd3d920abd483a4025664bf5) ---- - libavcodec/v4l2_m2m_enc.c | 13 ++++++++++--- - 1 file changed, 10 insertions(+), 3 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c -index d0d27e5bc2..c8c2de3d47 100644 ---- a/libavcodec/v4l2_m2m_enc.c -+++ b/libavcodec/v4l2_m2m_enc.c -@@ -427,6 +427,7 @@ static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame) - - // Signal EOF if needed (doesn't need q slot) - if (!frame) { -+ av_log(avctx, AV_LOG_TRACE, "--- %s: EOS\n", __func__); - return ff_v4l2_context_enqueue_frame(output, frame); - } - -@@ -491,7 +492,12 @@ static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame) - v4l2_set_ext_ctrl(s, MPEG_CID(FORCE_KEY_FRAME), 0, "force key frame", 1); - #endif - -- return ff_v4l2_context_enqueue_frame(output, frame); -+ rv = ff_v4l2_context_enqueue_frame(output, frame); -+ if (rv) { -+ av_log(avctx, AV_LOG_ERROR, "Enqueue frame failed: %s\n", av_err2str(rv)); -+ } -+ -+ return rv; - } - - static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) -@@ -502,7 +508,8 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) - AVFrame *frame = s->frame; - int ret; - -- av_log(avctx, AV_LOG_TRACE, "<<< %s\n", __func__); -+ av_log(avctx, AV_LOG_TRACE, "<<< %s: qlen out %d cap %d\n", __func__, -+ ff_v4l2_context_q_count(output), ff_v4l2_context_q_count(capture)); - - ff_v4l2_dq_all(output, 0); - -@@ -615,11 +622,11 @@ dequeue: - avpkt->size = newlen; - } - --// av_log(avctx, AV_LOG_INFO, "%s: PTS out=%"PRId64", size=%d, ret=%d\n", __func__, avpkt->pts, avpkt->size, ret); - capture->first_buf = 0; - return 0; - - fail_no_mem: -+ av_log(avctx, AV_LOG_ERROR, "Rx pkt failed: No memory\n"); - ret = AVERROR(ENOMEM); - av_packet_unref(avpkt); - return ret; - -From 02dca2b845125af7ec6dfb68bdc34726a45fee9c Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 18 Oct 2022 13:22:36 +0000 -Subject: [PATCH 091/151] v4l2_m2m_enc: Copy dest packets to memory if short of - v4l2 buffers - -(cherry picked from commit aa4ebbda400b42db952fc713b26927fc8636b0e5) ---- - libavcodec/v4l2_m2m_enc.c | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c -index c8c2de3d47..c23187e6e6 100644 ---- a/libavcodec/v4l2_m2m_enc.c -+++ b/libavcodec/v4l2_m2m_enc.c -@@ -621,6 +621,22 @@ dequeue: - avpkt->data = buf->data; - avpkt->size = newlen; - } -+ else if (ff_v4l2_context_q_count(capture) < 2) { -+ // Avoid running out of capture buffers -+ // In most cases the buffers will be returned quickly in which case -+ // we don't copy and can use the v4l2 buffers directly but sometimes -+ // ffmpeg seems to hold onto all of them for a long time (.mkv -+ // creation?) so avoid deadlock in those cases. -+ AVBufferRef * const buf = av_buffer_alloc(avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE); -+ if (buf == NULL) -+ goto fail_no_mem; -+ -+ memcpy(buf->data, avpkt->data, avpkt->size); -+ av_buffer_unref(&avpkt->buf); // Will recycle the V4L2 buffer -+ -+ avpkt->buf = buf; -+ avpkt->data = buf->data; -+ } - - capture->first_buf = 0; - return 0; - -From ced9a7d442a04be08fc23e0af310312299a5d5a0 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 19 Oct 2022 11:00:16 +0000 -Subject: [PATCH 092/151] v4l2_m2m_dec: Fix pts_best_effort guessing for - initial pts - -(cherry picked from commit 1af32e5c87586a0f7e76cdf19a012ddbcf3eac67) ---- - libavcodec/v4l2_m2m_dec.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index bec9b22fcf..47b2735f82 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -113,6 +113,8 @@ log_dump(void * logctx, int lvl, const void * const data, const size_t len) - - static int64_t pts_stats_guess(const pts_stats_t * const stats) - { -+ if (stats->last_count <= 1) -+ return stats->last_pts; - if (stats->last_pts == AV_NOPTS_VALUE || - stats->last_interval == 0 || - stats->last_count >= STATS_LAST_COUNT_MAX) - -From 3e3cf6ed7280d8ad4f3eed17a6d18c2df3c0cd31 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 19 Oct 2022 14:47:04 +0000 -Subject: [PATCH 093/151] v4l2_m2m_enc: Wait for frame or space in src Q in - rx_pkt - -If receive_packet we should ensure that there is space in the source Q -if we return EAGAIN so wait for either an output packet or space if -the source Q is currently full. - -(cherry picked from commit 82f0c55782a67a8cc665d937647706c2a75f5548) ---- - libavcodec/v4l2_m2m_enc.c | 22 +++++++++++++++++++--- - 1 file changed, 19 insertions(+), 3 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c -index c23187e6e6..524e9424a5 100644 ---- a/libavcodec/v4l2_m2m_enc.c -+++ b/libavcodec/v4l2_m2m_enc.c -@@ -415,13 +415,17 @@ static int fmt_eq(const struct v4l2_format * const a, const struct v4l2_format * - return 1; - } - -+static inline int q_full(const V4L2Context *const output) -+{ -+ return ff_v4l2_context_q_count(output) == output->num_buffers; -+} - - static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame) - { - V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context; - V4L2Context *const output = &s->output; - int rv; -- int needs_slot = ff_v4l2_context_q_count(output) == output->num_buffers; -+ const int needs_slot = q_full(output); - - av_log(avctx, AV_LOG_TRACE, "<<< %s; needs_slot=%d\n", __func__, needs_slot); - -@@ -549,8 +553,20 @@ static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt) - } - - dequeue: -- ret = ff_v4l2_context_dequeue_packet(capture, avpkt, s->draining ? 300 : 0); -- ff_v4l2_dq_all(output, 0); -+ // Dequeue a frame -+ for (;;) { -+ int t = q_full(output) ? -1 : s->draining ? 300 : 0; -+ int rv2; -+ -+ // If output is full wait for either a packet or output to become not full -+ ret = ff_v4l2_context_dequeue_packet(capture, avpkt, t); -+ -+ // If output was full retry packet dequeue -+ t = (ret != AVERROR(EAGAIN) || t != -1) ? 0 : 300; -+ rv2 = ff_v4l2_dq_all(output, t); -+ if (t == 0 || rv2 != 0) -+ break; -+ } - if (ret) - return (s->draining && ret == AVERROR(EAGAIN)) ? AVERROR_EOF : ret; - - -From de9ec2bf6421b199aad9ea9dc7896a46c8813d94 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 19 Oct 2022 14:54:29 +0000 -Subject: [PATCH 094/151] vf_deinterlace_v4l2m2m: Print dts rather that NOPTS - in trace - -(cherry picked from commit e9b468f35f0c6ad9bfe96f5a05e449afa8ae074a) ---- - libavfilter/vf_deinterlace_v4l2m2m.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c -index ce875c2c61..7c6751b69c 100644 ---- a/libavfilter/vf_deinterlace_v4l2m2m.c -+++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -1668,8 +1668,8 @@ static int deint_v4l2m2m_filter_frame(AVFilterLink *link, AVFrame *in) - V4L2Queue *output = &ctx->output; - int ret; - -- av_log(priv, AV_LOG_DEBUG, "<<< %s: input pts: %"PRId64" (%"PRId64") field :%d interlaced: %d aspect:%d/%d\n", -- __func__, in->pts, AV_NOPTS_VALUE, in->top_field_first, in->interlaced_frame, in->sample_aspect_ratio.num, in->sample_aspect_ratio.den); -+ av_log(priv, AV_LOG_DEBUG, "<<< %s: input pts: %"PRId64" dts: %"PRId64" field :%d interlaced: %d aspect:%d/%d\n", -+ __func__, in->pts, in->pkt_dts, in->top_field_first, in->interlaced_frame, in->sample_aspect_ratio.num, in->sample_aspect_ratio.den); - av_log(priv, AV_LOG_DEBUG, "--- %s: in status in %d/ot %d; out status in %d/out %d\n", __func__, - avctx->inputs[0]->status_in, avctx->inputs[0]->status_out, avctx->outputs[0]->status_in, avctx->outputs[0]->status_out); - - -From d71a0a173240e18d518ae0b921ac43849524bd66 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 19 Oct 2022 14:55:21 +0000 -Subject: [PATCH 095/151] vf_deinterlace_v4l2m2m: Ignore "wanted" when - processing input - -If we gate send a frame to the outlink on its frame_wanted flag then we -will sometimes stall as the flag may not get set by ffmpeg's filter -processing. So stuff the output whether or not it wants it which works -much better. - -(cherry picked from commit 808254cc04e5e6574cbab9af254b6c2f3d4142e3) ---- - libavfilter/vf_deinterlace_v4l2m2m.c | 5 +---- - 1 file changed, 1 insertion(+), 4 deletions(-) - -diff --git a/libavfilter/vf_deinterlace_v4l2m2m.c b/libavfilter/vf_deinterlace_v4l2m2m.c -index 7c6751b69c..a173a291f8 100644 ---- a/libavfilter/vf_deinterlace_v4l2m2m.c -+++ b/libavfilter/vf_deinterlace_v4l2m2m.c -@@ -1812,10 +1812,7 @@ static int deint_v4l2m2m_activate(AVFilterContext *avctx) - - ack_inlink(avctx, s, inlink); - -- if (!ff_outlink_frame_wanted(outlink)) { -- av_log(priv, AV_LOG_TRACE, "%s: Not wanted out\n", __func__); -- } -- else if (s->field_order != V4L2_FIELD_ANY) // Can't DQ if no setup! -+ if (s->field_order != V4L2_FIELD_ANY) // Can't DQ if no setup! - { - AVFrame * frame = av_frame_alloc(); - int rv; - -From 842e0a00288f9a2a862720990791b8eca9546955 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 19 Oct 2022 15:00:43 +0000 -Subject: [PATCH 096/151] conf_native: Add --enable-gpl - -(cherry picked from commit bab9bf4a2e39391940d88af2ce5d70236ac21f15) ---- - pi-util/conf_native.sh | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/pi-util/conf_native.sh b/pi-util/conf_native.sh -index f22d531ca4..082d9b5832 100755 ---- a/pi-util/conf_native.sh -+++ b/pi-util/conf_native.sh -@@ -94,6 +94,7 @@ $FFSRC/configure \ - --enable-libdrm\ - --enable-vout-egl\ - --enable-vout-drm\ -+ --enable-gpl\ - $SHARED_LIBS\ - $RPIOPTS\ - --extra-cflags="-ggdb $RPI_KEEPS $RPI_DEFINES $RPI_INCLUDES"\ - -From bf9aaf30818308a4651e00a2a64a0f65dc9a36e5 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 15 Nov 2022 13:33:00 +0000 -Subject: [PATCH 097/151] egl_vout: Make formatting consistent - no code - changes - ---- - libavdevice/egl_vout.c | 741 ++++++++++++++++++++--------------------- - 1 file changed, 369 insertions(+), 372 deletions(-) - -diff --git a/libavdevice/egl_vout.c b/libavdevice/egl_vout.c -index 7b9c610ace..a52cabb082 100644 ---- a/libavdevice/egl_vout.c -+++ b/libavdevice/egl_vout.c -@@ -48,20 +48,20 @@ - #define TRACE_ALL 0 - - struct egl_setup { -- int conId; -- -- Display *dpy; -- EGLDisplay egl_dpy; -- EGLContext ctx; -- EGLSurface surf; -- Window win; -- -- uint32_t crtcId; -- int crtcIdx; -- uint32_t planeId; -- struct { -- int x, y, width, height; -- } compose; -+ int conId; -+ -+ Display *dpy; -+ EGLDisplay egl_dpy; -+ EGLContext ctx; -+ EGLSurface surf; -+ Window win; -+ -+ uint32_t crtcId; -+ int crtcIdx; -+ uint32_t planeId; -+ struct { -+ int x, y, width, height; -+ } compose; - }; - - typedef struct egl_aux_s { -@@ -70,8 +70,7 @@ typedef struct egl_aux_s { - - } egl_aux_t; - --typedef struct egl_display_env_s --{ -+typedef struct egl_display_env_s { - AVClass *class; - - struct egl_setup setup; -@@ -89,8 +88,8 @@ typedef struct egl_display_env_s - sem_t display_start_sem; - sem_t q_sem; - int q_terminate; -- AVFrame * q_this; -- AVFrame * q_next; -+ AVFrame *q_this; -+ AVFrame *q_next; - - } egl_display_env_t; - -@@ -99,45 +98,44 @@ typedef struct egl_display_env_s - * Remove window border/decorations. - */ - static void --no_border( Display *dpy, Window w) -+no_border(Display *dpy, Window w) - { -- static const unsigned MWM_HINTS_DECORATIONS = (1 << 1); -- static const int PROP_MOTIF_WM_HINTS_ELEMENTS = 5; -- -- typedef struct -- { -- unsigned long flags; -- unsigned long functions; -- unsigned long decorations; -- long inputMode; -- unsigned long status; -- } PropMotifWmHints; -- -- PropMotifWmHints motif_hints; -- Atom prop, proptype; -- unsigned long flags = 0; -- -- /* setup the property */ -- motif_hints.flags = MWM_HINTS_DECORATIONS; -- motif_hints.decorations = flags; -- -- /* get the atom for the property */ -- prop = XInternAtom( dpy, "_MOTIF_WM_HINTS", True ); -- if (!prop) { -- /* something went wrong! */ -- return; -- } -- -- /* not sure this is correct, seems to work, XA_WM_HINTS didn't work */ -- proptype = prop; -- -- XChangeProperty( dpy, w, /* display, window */ -+ static const unsigned MWM_HINTS_DECORATIONS = (1 << 1); -+ static const int PROP_MOTIF_WM_HINTS_ELEMENTS = 5; -+ -+ typedef struct { -+ unsigned long flags; -+ unsigned long functions; -+ unsigned long decorations; -+ long inputMode; -+ unsigned long status; -+ } PropMotifWmHints; -+ -+ PropMotifWmHints motif_hints; -+ Atom prop, proptype; -+ unsigned long flags = 0; -+ -+ /* setup the property */ -+ motif_hints.flags = MWM_HINTS_DECORATIONS; -+ motif_hints.decorations = flags; -+ -+ /* get the atom for the property */ -+ prop = XInternAtom(dpy, "_MOTIF_WM_HINTS", True); -+ if (!prop) { -+ /* something went wrong! */ -+ return; -+ } -+ -+ /* not sure this is correct, seems to work, XA_WM_HINTS didn't work */ -+ proptype = prop; -+ -+ XChangeProperty(dpy, w, /* display, window */ - prop, proptype, /* property, type */ - 32, /* format: 32-bit datums */ - PropModeReplace, /* mode */ -- (unsigned char *) &motif_hints, /* data */ -+ (unsigned char *)&motif_hints, /* data */ - PROP_MOTIF_WM_HINTS_ELEMENTS /* nelements */ -- ); -+ ); - } - - -@@ -146,247 +144,247 @@ no_border( Display *dpy, Window w) - * Return the window and context handles. - */ - static int --make_window(struct AVFormatContext * const s, -- egl_display_env_t * const de, -+make_window(struct AVFormatContext *const s, -+ egl_display_env_t *const de, - Display *dpy, EGLDisplay egl_dpy, const char *name, - Window *winRet, EGLContext *ctxRet, EGLSurface *surfRet) - { -- int scrnum = DefaultScreen( dpy ); -- XSetWindowAttributes attr; -- unsigned long mask; -- Window root = RootWindow( dpy, scrnum ); -- Window win; -- EGLContext ctx; -- const int fullscreen = de->fullscreen; -- EGLConfig config; -- int x = de->window_x; -- int y = de->window_y; -- int width = de->window_width ? de->window_width : 1280; -- int height = de->window_height ? de->window_height : 720; -- -- -- if (fullscreen) { -- int scrnum = DefaultScreen(dpy); -- -- x = 0; y = 0; -- width = DisplayWidth(dpy, scrnum); -- height = DisplayHeight(dpy, scrnum); -- } -- -- { -- EGLint num_configs; -- static const EGLint attribs[] = { -- EGL_RED_SIZE, 1, -- EGL_GREEN_SIZE, 1, -- EGL_BLUE_SIZE, 1, -- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, -- EGL_NONE -- }; -- -- if (!eglChooseConfig(egl_dpy, attribs, &config, 1, &num_configs)) { -- av_log(s, AV_LOG_ERROR, "Error: couldn't get an EGL visual config\n"); -- return -1; -- } -- } -- -- { -- EGLint vid; -- if (!eglGetConfigAttrib(egl_dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) { -- av_log(s, AV_LOG_ERROR, "Error: eglGetConfigAttrib() failed\n"); -- return -1; -- } -- -- { -- XVisualInfo visTemplate = { -- .visualid = vid, -- }; -- int num_visuals; -- XVisualInfo *visinfo = XGetVisualInfo(dpy, VisualIDMask, -- &visTemplate, &num_visuals); -- -- /* window attributes */ -- attr.background_pixel = 0; -- attr.border_pixel = 0; -- attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone); -- attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; -- /* XXX this is a bad way to get a borderless window! */ -- mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; -- -- win = XCreateWindow( dpy, root, x, y, width, height, -- 0, visinfo->depth, InputOutput, -- visinfo->visual, mask, &attr ); -- XFree(visinfo); -- } -- } -- -- if (fullscreen) -- no_border(dpy, win); -- -- /* set hints and properties */ -- { -- XSizeHints sizehints; -- sizehints.x = x; -- sizehints.y = y; -- sizehints.width = width; -- sizehints.height = height; -- sizehints.flags = USSize | USPosition; -- XSetNormalHints(dpy, win, &sizehints); -- XSetStandardProperties(dpy, win, name, name, -- None, (char **)NULL, 0, &sizehints); -- } -- -- eglBindAPI(EGL_OPENGL_ES_API); -- -- { -- static const EGLint ctx_attribs[] = { -- EGL_CONTEXT_CLIENT_VERSION, 2, -- EGL_NONE -- }; -- ctx = eglCreateContext(egl_dpy, config, EGL_NO_CONTEXT, ctx_attribs ); -- if (!ctx) { -- av_log(s, AV_LOG_ERROR, "Error: eglCreateContext failed\n"); -- return -1; -- } -- } -- -- -- XMapWindow(dpy, win); -- -- { -- EGLSurface surf = eglCreateWindowSurface(egl_dpy, config, (EGLNativeWindowType)win, NULL); -- if (!surf) { -- av_log(s, AV_LOG_ERROR, "Error: eglCreateWindowSurface failed\n"); -- return -1; -- } -- -- if (!eglMakeCurrent(egl_dpy, surf, surf, ctx)) { -- av_log(s, AV_LOG_ERROR, "Error: eglCreateContext failed\n"); -- return -1; -- } -- -- *winRet = win; -- *ctxRet = ctx; -- *surfRet = surf; -- } -- -- return 0; -+ int scrnum = DefaultScreen(dpy); -+ XSetWindowAttributes attr; -+ unsigned long mask; -+ Window root = RootWindow(dpy, scrnum); -+ Window win; -+ EGLContext ctx; -+ const int fullscreen = de->fullscreen; -+ EGLConfig config; -+ int x = de->window_x; -+ int y = de->window_y; -+ int width = de->window_width ? de->window_width : 1280; -+ int height = de->window_height ? de->window_height : 720; -+ -+ -+ if (fullscreen) { -+ int scrnum = DefaultScreen(dpy); -+ -+ x = 0; y = 0; -+ width = DisplayWidth(dpy, scrnum); -+ height = DisplayHeight(dpy, scrnum); -+ } -+ -+ { -+ EGLint num_configs; -+ static const EGLint attribs[] = { -+ EGL_RED_SIZE, 1, -+ EGL_GREEN_SIZE, 1, -+ EGL_BLUE_SIZE, 1, -+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, -+ EGL_NONE -+ }; -+ -+ if (!eglChooseConfig(egl_dpy, attribs, &config, 1, &num_configs)) { -+ av_log(s, AV_LOG_ERROR, "Error: couldn't get an EGL visual config\n"); -+ return -1; -+ } -+ } -+ -+ { -+ EGLint vid; -+ if (!eglGetConfigAttrib(egl_dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) { -+ av_log(s, AV_LOG_ERROR, "Error: eglGetConfigAttrib() failed\n"); -+ return -1; -+ } -+ -+ { -+ XVisualInfo visTemplate = { -+ .visualid = vid, -+ }; -+ int num_visuals; -+ XVisualInfo *visinfo = XGetVisualInfo(dpy, VisualIDMask, -+ &visTemplate, &num_visuals); -+ -+ /* window attributes */ -+ attr.background_pixel = 0; -+ attr.border_pixel = 0; -+ attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone); -+ attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask; -+ /* XXX this is a bad way to get a borderless window! */ -+ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; -+ -+ win = XCreateWindow(dpy, root, x, y, width, height, -+ 0, visinfo->depth, InputOutput, -+ visinfo->visual, mask, &attr); -+ XFree(visinfo); -+ } -+ } -+ -+ if (fullscreen) -+ no_border(dpy, win); -+ -+ /* set hints and properties */ -+ { -+ XSizeHints sizehints; -+ sizehints.x = x; -+ sizehints.y = y; -+ sizehints.width = width; -+ sizehints.height = height; -+ sizehints.flags = USSize | USPosition; -+ XSetNormalHints(dpy, win, &sizehints); -+ XSetStandardProperties(dpy, win, name, name, -+ None, (char **)NULL, 0, &sizehints); -+ } -+ -+ eglBindAPI(EGL_OPENGL_ES_API); -+ -+ { -+ static const EGLint ctx_attribs[] = { -+ EGL_CONTEXT_CLIENT_VERSION, 2, -+ EGL_NONE -+ }; -+ ctx = eglCreateContext(egl_dpy, config, EGL_NO_CONTEXT, ctx_attribs); -+ if (!ctx) { -+ av_log(s, AV_LOG_ERROR, "Error: eglCreateContext failed\n"); -+ return -1; -+ } -+ } -+ -+ -+ XMapWindow(dpy, win); -+ -+ { -+ EGLSurface surf = eglCreateWindowSurface(egl_dpy, config, (EGLNativeWindowType)win, NULL); -+ if (!surf) { -+ av_log(s, AV_LOG_ERROR, "Error: eglCreateWindowSurface failed\n"); -+ return -1; -+ } -+ -+ if (!eglMakeCurrent(egl_dpy, surf, surf, ctx)) { -+ av_log(s, AV_LOG_ERROR, "Error: eglCreateContext failed\n"); -+ return -1; -+ } -+ -+ *winRet = win; -+ *ctxRet = ctx; -+ *surfRet = surf; -+ } -+ -+ return 0; - } - - static GLint --compile_shader(struct AVFormatContext * const avctx, GLenum target, const char *source) -+compile_shader(struct AVFormatContext *const avctx, GLenum target, const char *source) - { -- GLuint s = glCreateShader(target); -+ GLuint s = glCreateShader(target); - -- if (s == 0) { -- av_log(avctx, AV_LOG_ERROR, "Failed to create shader\n"); -- return 0; -- } -+ if (s == 0) { -+ av_log(avctx, AV_LOG_ERROR, "Failed to create shader\n"); -+ return 0; -+ } - -- glShaderSource(s, 1, (const GLchar **) &source, NULL); -- glCompileShader(s); -+ glShaderSource(s, 1, (const GLchar **)&source, NULL); -+ glCompileShader(s); - -- { -- GLint ok; -- glGetShaderiv(s, GL_COMPILE_STATUS, &ok); -+ { -+ GLint ok; -+ glGetShaderiv(s, GL_COMPILE_STATUS, &ok); - -- if (!ok) { -- GLchar *info; -- GLint size; -+ if (!ok) { -+ GLchar *info; -+ GLint size; - -- glGetShaderiv(s, GL_INFO_LOG_LENGTH, &size); -- info = malloc(size); -+ glGetShaderiv(s, GL_INFO_LOG_LENGTH, &size); -+ info = malloc(size); - -- glGetShaderInfoLog(s, size, NULL, info); -- av_log(avctx, AV_LOG_ERROR, "Failed to compile shader: %ssource:\n%s\n", info, source); -+ glGetShaderInfoLog(s, size, NULL, info); -+ av_log(avctx, AV_LOG_ERROR, "Failed to compile shader: %ssource:\n%s\n", info, source); - -- return 0; -- } -- } -+ return 0; -+ } -+ } - -- return s; -+ return s; - } - --static GLuint link_program(struct AVFormatContext * const s, GLint vs, GLint fs) -+static GLuint link_program(struct AVFormatContext *const s, GLint vs, GLint fs) - { -- GLuint prog = glCreateProgram(); -- -- if (prog == 0) { -- av_log(s, AV_LOG_ERROR, "Failed to create program\n"); -- return 0; -- } -- -- glAttachShader(prog, vs); -- glAttachShader(prog, fs); -- glLinkProgram(prog); -- -- { -- GLint ok; -- glGetProgramiv(prog, GL_LINK_STATUS, &ok); -- if (!ok) { -- /* Some drivers return a size of 1 for an empty log. This is the size -- * of a log that contains only a terminating NUL character. -- */ -- GLint size; -- GLchar *info = NULL; -- glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &size); -- if (size > 1) { -- info = malloc(size); -- glGetProgramInfoLog(prog, size, NULL, info); -- } -+ GLuint prog = glCreateProgram(); - -- av_log(s, AV_LOG_ERROR, "Failed to link: %s\n", -- (info != NULL) ? info : ""); -- return 0; -- } -- } -+ if (prog == 0) { -+ av_log(s, AV_LOG_ERROR, "Failed to create program\n"); -+ return 0; -+ } -+ -+ glAttachShader(prog, vs); -+ glAttachShader(prog, fs); -+ glLinkProgram(prog); -+ -+ { -+ GLint ok; -+ glGetProgramiv(prog, GL_LINK_STATUS, &ok); -+ if (!ok) { -+ /* Some drivers return a size of 1 for an empty log. This is the size -+ * of a log that contains only a terminating NUL character. -+ */ -+ GLint size; -+ GLchar *info = NULL; -+ glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &size); -+ if (size > 1) { -+ info = malloc(size); -+ glGetProgramInfoLog(prog, size, NULL, info); -+ } - -- return prog; -+ av_log(s, AV_LOG_ERROR, "Failed to link: %s\n", -+ (info != NULL) ? info : ""); -+ return 0; -+ } -+ } -+ -+ return prog; - } - - static int --gl_setup(struct AVFormatContext * const s) -+gl_setup(struct AVFormatContext *const s) - { -- const char *vs = -- "attribute vec4 pos;\n" -- "varying vec2 texcoord;\n" -- "\n" -- "void main() {\n" -- " gl_Position = pos;\n" -- " texcoord.x = (pos.x + 1.0) / 2.0;\n" -- " texcoord.y = (-pos.y + 1.0) / 2.0;\n" -- "}\n"; -- const char *fs = -- "#extension GL_OES_EGL_image_external : enable\n" -- "precision mediump float;\n" -- "uniform samplerExternalOES s;\n" -- "varying vec2 texcoord;\n" -- "void main() {\n" -- " gl_FragColor = texture2D(s, texcoord);\n" -- "}\n"; -- -- GLuint vs_s; -- GLuint fs_s; -- GLuint prog; -- -- if (!(vs_s = compile_shader(s, GL_VERTEX_SHADER, vs)) || -- !(fs_s = compile_shader(s, GL_FRAGMENT_SHADER, fs)) || -- !(prog = link_program(s, vs_s, fs_s))) -- return -1; -- -- glUseProgram(prog); -- -- { -- static const float verts[] = { -- -1, -1, -- 1, -1, -- 1, 1, -- -1, 1, -- }; -- glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, verts); -- } -- -- glEnableVertexAttribArray(0); -- return 0; -+ const char *vs = -+ "attribute vec4 pos;\n" -+ "varying vec2 texcoord;\n" -+ "\n" -+ "void main() {\n" -+ " gl_Position = pos;\n" -+ " texcoord.x = (pos.x + 1.0) / 2.0;\n" -+ " texcoord.y = (-pos.y + 1.0) / 2.0;\n" -+ "}\n"; -+ const char *fs = -+ "#extension GL_OES_EGL_image_external : enable\n" -+ "precision mediump float;\n" -+ "uniform samplerExternalOES s;\n" -+ "varying vec2 texcoord;\n" -+ "void main() {\n" -+ " gl_FragColor = texture2D(s, texcoord);\n" -+ "}\n"; -+ -+ GLuint vs_s; -+ GLuint fs_s; -+ GLuint prog; -+ -+ if (!(vs_s = compile_shader(s, GL_VERTEX_SHADER, vs)) || -+ !(fs_s = compile_shader(s, GL_FRAGMENT_SHADER, fs)) || -+ !(prog = link_program(s, vs_s, fs_s))) -+ return -1; -+ -+ glUseProgram(prog); -+ -+ { -+ static const float verts[] = { -+ -1, -1, -+ 1, -1, -+ 1, 1, -+ -1, 1, -+ }; -+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, verts); -+ } -+ -+ glEnableVertexAttribArray(0); -+ return 0; - } - - static int egl_vout_write_trailer(AVFormatContext *s) -@@ -400,12 +398,12 @@ static int egl_vout_write_trailer(AVFormatContext *s) - - static int egl_vout_write_header(AVFormatContext *s) - { -- const AVCodecParameters * const par = s->streams[0]->codecpar; -+ const AVCodecParameters *const par = s->streams[0]->codecpar; - - #if TRACE_ALL - av_log(s, AV_LOG_INFO, "%s\n", __func__); - #endif -- if ( s->nb_streams > 1 -+ if (s->nb_streams > 1 - || par->codec_type != AVMEDIA_TYPE_VIDEO - || par->codec_id != AV_CODEC_ID_WRAPPED_AVFRAME) { - av_log(s, AV_LOG_ERROR, "Only supports one wrapped avframe stream\n"); -@@ -416,10 +414,10 @@ static int egl_vout_write_header(AVFormatContext *s) - } - - --static int do_display(AVFormatContext * const s, egl_display_env_t * const de, AVFrame * const frame) -+static int do_display(AVFormatContext *const s, egl_display_env_t *const de, AVFrame *const frame) - { -- const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor*)frame->data[0]; -- egl_aux_t * da = NULL; -+ const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor *)frame->data[0]; -+ egl_aux_t *da = NULL; - unsigned int i; - - #if TRACE_ALL -@@ -440,26 +438,26 @@ static int do_display(AVFormatContext * const s, egl_display_env_t * const de, A - - if (da->texture == 0) { - EGLint attribs[50]; -- EGLint * a = attribs; -+ EGLint *a = attribs; - int i, j; - static const EGLint anames[] = { -- EGL_DMA_BUF_PLANE0_FD_EXT, -- EGL_DMA_BUF_PLANE0_OFFSET_EXT, -- EGL_DMA_BUF_PLANE0_PITCH_EXT, -- EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, -- EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT, -- EGL_DMA_BUF_PLANE1_FD_EXT, -- EGL_DMA_BUF_PLANE1_OFFSET_EXT, -- EGL_DMA_BUF_PLANE1_PITCH_EXT, -- EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT, -- EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT, -- EGL_DMA_BUF_PLANE2_FD_EXT, -- EGL_DMA_BUF_PLANE2_OFFSET_EXT, -- EGL_DMA_BUF_PLANE2_PITCH_EXT, -- EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT, -- EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT, -+ EGL_DMA_BUF_PLANE0_FD_EXT, -+ EGL_DMA_BUF_PLANE0_OFFSET_EXT, -+ EGL_DMA_BUF_PLANE0_PITCH_EXT, -+ EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT, -+ EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT, -+ EGL_DMA_BUF_PLANE1_FD_EXT, -+ EGL_DMA_BUF_PLANE1_OFFSET_EXT, -+ EGL_DMA_BUF_PLANE1_PITCH_EXT, -+ EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT, -+ EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT, -+ EGL_DMA_BUF_PLANE2_FD_EXT, -+ EGL_DMA_BUF_PLANE2_OFFSET_EXT, -+ EGL_DMA_BUF_PLANE2_PITCH_EXT, -+ EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT, -+ EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT, - }; -- const EGLint * b = anames; -+ const EGLint *b = anames; - - *a++ = EGL_WIDTH; - *a++ = av_frame_cropped_width(frame); -@@ -470,8 +468,8 @@ static int do_display(AVFormatContext * const s, egl_display_env_t * const de, A - - for (i = 0; i < desc->nb_layers; ++i) { - for (j = 0; j < desc->layers[i].nb_planes; ++j) { -- const AVDRMPlaneDescriptor * const p = desc->layers[i].planes + j; -- const AVDRMObjectDescriptor * const obj = desc->objects + p->object_index; -+ const AVDRMPlaneDescriptor *const p = desc->layers[i].planes + j; -+ const AVDRMObjectDescriptor *const obj = desc->objects + p->object_index; - *a++ = *b++; - *a++ = obj->fd; - *a++ = *b++; -@@ -479,13 +477,13 @@ static int do_display(AVFormatContext * const s, egl_display_env_t * const de, A - *a++ = *b++; - *a++ = p->pitch; - if (obj->format_modifier == 0) { -- b += 2; -+ b += 2; - } - else { -- *a++ = *b++; -- *a++ = (EGLint)(obj->format_modifier & 0xFFFFFFFF); -- *a++ = *b++; -- *a++ = (EGLint)(obj->format_modifier >> 32); -+ *a++ = *b++; -+ *a++ = (EGLint)(obj->format_modifier & 0xFFFFFFFF); -+ *a++ = *b++; -+ *a++ = (EGLint)(obj->format_modifier >> 32); - } - } - } -@@ -494,26 +492,26 @@ static int do_display(AVFormatContext * const s, egl_display_env_t * const de, A - - #if TRACE_ALL - for (a = attribs, i = 0; *a != EGL_NONE; a += 2, ++i) { -- av_log(s, AV_LOG_INFO, "[%2d] %4x: %d\n", i, a[0], a[1]); -+ av_log(s, AV_LOG_INFO, "[%2d] %4x: %d\n", i, a[0], a[1]); - } - #endif - { -- const EGLImage image = eglCreateImageKHR(de->setup.egl_dpy, -- EGL_NO_CONTEXT, -- EGL_LINUX_DMA_BUF_EXT, -- NULL, attribs); -- if (!image) { -- av_log(s, AV_LOG_ERROR, "Failed to import fd %d\n", desc->objects[0].fd); -- return -1; -- } -- -- glGenTextures(1, &da->texture); -- glBindTexture(GL_TEXTURE_EXTERNAL_OES, da->texture); -- glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -- glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -- glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image); -- -- eglDestroyImageKHR(de->setup.egl_dpy, image); -+ const EGLImage image = eglCreateImageKHR(de->setup.egl_dpy, -+ EGL_NO_CONTEXT, -+ EGL_LINUX_DMA_BUF_EXT, -+ NULL, attribs); -+ if (!image) { -+ av_log(s, AV_LOG_ERROR, "Failed to import fd %d\n", desc->objects[0].fd); -+ return -1; -+ } -+ -+ glGenTextures(1, &da->texture); -+ glBindTexture(GL_TEXTURE_EXTERNAL_OES, da->texture); -+ glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -+ glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -+ glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image); -+ -+ eglDestroyImageKHR(de->setup.egl_dpy, image); - } - - da->fd = desc->objects[0].fd; -@@ -540,7 +538,7 @@ static int do_display(AVFormatContext * const s, egl_display_env_t * const de, A - (long long)modifiers[1], - (long long)modifiers[2], - (long long)modifiers[3] -- ); -+ ); - #endif - } - -@@ -558,55 +556,55 @@ static int do_display(AVFormatContext * const s, egl_display_env_t * const de, A - return 0; - } - --static void * display_thread(void * v) -+static void* display_thread(void *v) - { -- AVFormatContext * const s = v; -- egl_display_env_t * const de = s->priv_data; -+ AVFormatContext *const s = v; -+ egl_display_env_t *const de = s->priv_data; - - #if TRACE_ALL - av_log(s, AV_LOG_INFO, "<<< %s\n", __func__); - #endif - { -- EGLint egl_major, egl_minor; -- -- de->setup.dpy = XOpenDisplay(NULL); -- if (!de->setup.dpy) { -- av_log(s, AV_LOG_ERROR, "Couldn't open X display\n"); -- goto fail; -- } -- -- de->setup.egl_dpy = eglGetDisplay(de->setup.dpy); -- if (!de->setup.egl_dpy) { -- av_log(s, AV_LOG_ERROR, "eglGetDisplay() failed\n"); -- goto fail; -- } -- -- if (!eglInitialize(de->setup.egl_dpy, &egl_major, &egl_minor)) { -- av_log(s, AV_LOG_ERROR, "Error: eglInitialize() failed\n"); -- goto fail; -- } -- -- av_log(s, AV_LOG_INFO, "EGL version %d.%d\n", egl_major, egl_minor); -- -- if (!epoxy_has_egl_extension(de->setup.egl_dpy, "EGL_KHR_image_base")) { -- av_log(s, AV_LOG_ERROR, "Missing EGL KHR image extension\n"); -- goto fail; -- } -+ EGLint egl_major, egl_minor; -+ -+ de->setup.dpy = XOpenDisplay(NULL); -+ if (!de->setup.dpy) { -+ av_log(s, AV_LOG_ERROR, "Couldn't open X display\n"); -+ goto fail; -+ } -+ -+ de->setup.egl_dpy = eglGetDisplay(de->setup.dpy); -+ if (!de->setup.egl_dpy) { -+ av_log(s, AV_LOG_ERROR, "eglGetDisplay() failed\n"); -+ goto fail; -+ } -+ -+ if (!eglInitialize(de->setup.egl_dpy, &egl_major, &egl_minor)) { -+ av_log(s, AV_LOG_ERROR, "Error: eglInitialize() failed\n"); -+ goto fail; -+ } -+ -+ av_log(s, AV_LOG_INFO, "EGL version %d.%d\n", egl_major, egl_minor); -+ -+ if (!epoxy_has_egl_extension(de->setup.egl_dpy, "EGL_KHR_image_base")) { -+ av_log(s, AV_LOG_ERROR, "Missing EGL KHR image extension\n"); -+ goto fail; -+ } - } - - if (!de->window_width || !de->window_height) { -- de->window_width = 1280; -- de->window_height = 720; -+ de->window_width = 1280; -+ de->window_height = 720; - } - if (make_window(s, de, de->setup.dpy, de->setup.egl_dpy, "ffmpeg-vout", - &de->setup.win, &de->setup.ctx, &de->setup.surf)) { -- av_log(s, AV_LOG_ERROR, "%s: make_window failed\n", __func__); -- goto fail; -+ av_log(s, AV_LOG_ERROR, "%s: make_window failed\n", __func__); -+ goto fail; - } - - if (gl_setup(s)) { -- av_log(s, AV_LOG_ERROR, "%s: gl_setup failed\n", __func__); -- goto fail; -+ av_log(s, AV_LOG_ERROR, "%s: gl_setup failed\n", __func__); -+ goto fail; - } - - #if TRACE_ALL -@@ -615,7 +613,7 @@ static void * display_thread(void * v) - sem_post(&de->display_start_sem); - - for (;;) { -- AVFrame * frame; -+ AVFrame *frame; - - while (sem_wait(&de->q_sem) != 0) { - av_assert0(errno == EINTR); -@@ -653,9 +651,9 @@ fail: - - static int egl_vout_write_packet(AVFormatContext *s, AVPacket *pkt) - { -- const AVFrame * const src_frame = (AVFrame *)pkt->data; -- AVFrame * frame; -- egl_display_env_t * const de = s->priv_data; -+ const AVFrame *const src_frame = (AVFrame *)pkt->data; -+ AVFrame *frame; -+ egl_display_env_t *const de = s->priv_data; - - #if TRACE_ALL - av_log(s, AV_LOG_INFO, "%s\n", __func__); -@@ -668,8 +666,7 @@ static int egl_vout_write_packet(AVFormatContext *s, AVPacket *pkt) - else if (src_frame->format == AV_PIX_FMT_VAAPI) { - frame = av_frame_alloc(); - frame->format = AV_PIX_FMT_DRM_PRIME; -- if (av_hwframe_map(frame, src_frame, 0) != 0) -- { -+ if (av_hwframe_map(frame, src_frame, 0) != 0) { - av_log(s, AV_LOG_WARNING, "Failed to map frame (format=%d) to DRM_PRiME\n", src_frame->format); - av_frame_free(&frame); - return AVERROR(EINVAL); -@@ -682,12 +679,12 @@ static int egl_vout_write_packet(AVFormatContext *s, AVPacket *pkt) - - // Really hacky sync - while (de->show_all && de->q_next) { -- usleep(3000); -+ usleep(3000); - } - - pthread_mutex_lock(&de->q_lock); - { -- AVFrame * const t = de->q_next; -+ AVFrame *const t = de->q_next; - de->q_next = frame; - frame = t; - } -@@ -702,7 +699,7 @@ static int egl_vout_write_packet(AVFormatContext *s, AVPacket *pkt) - } - - static int egl_vout_write_frame(AVFormatContext *s, int stream_index, AVFrame **ppframe, -- unsigned flags) -+ unsigned flags) - { - av_log(s, AV_LOG_ERROR, "%s: NIF: idx=%d, flags=%#x\n", __func__, stream_index, flags); - return AVERROR_PATCHWELCOME; -@@ -713,7 +710,7 @@ static int egl_vout_control_message(AVFormatContext *s, int type, void *data, si - #if TRACE_ALL - av_log(s, AV_LOG_INFO, "%s: %d\n", __func__, type); - #endif -- switch(type) { -+ switch (type) { - case AV_APP_TO_DEV_WINDOW_REPAINT: - return 0; - default: -@@ -723,14 +720,14 @@ static int egl_vout_control_message(AVFormatContext *s, int type, void *data, si - } - - // deinit is called if init fails so no need to clean up explicity here --static int egl_vout_init(struct AVFormatContext * s) -+static int egl_vout_init(struct AVFormatContext *s) - { -- egl_display_env_t * const de = s->priv_data; -+ egl_display_env_t *const de = s->priv_data; - unsigned int i; - - av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); - -- de->setup = (struct egl_setup){0}; -+ de->setup = (struct egl_setup) { 0 }; - - for (i = 0; i != 32; ++i) { - de->aux[i].fd = -1; -@@ -744,8 +741,8 @@ static int egl_vout_init(struct AVFormatContext * s) - - sem_wait(&de->display_start_sem); - if (de->q_terminate) { -- av_log(s, AV_LOG_ERROR, "%s: Display startup failure\n", __func__); -- return -1; -+ av_log(s, AV_LOG_ERROR, "%s: Display startup failure\n", __func__); -+ return -1; - } - - av_log(s, AV_LOG_DEBUG, ">>> %s\n", __func__); -@@ -753,9 +750,9 @@ static int egl_vout_init(struct AVFormatContext * s) - return 0; - } - --static void egl_vout_deinit(struct AVFormatContext * s) -+static void egl_vout_deinit(struct AVFormatContext *s) - { -- egl_display_env_t * const de = s->priv_data; -+ egl_display_env_t *const de = s->priv_data; - - av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); - -@@ -773,11 +770,11 @@ static void egl_vout_deinit(struct AVFormatContext * s) - - #define OFFSET(x) offsetof(egl_display_env_t, x) - static const AVOption options[] = { -- { "show_all", "show all frames", OFFSET(show_all), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, -- { "window_size", "set window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, {.str = NULL}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, -- { "window_x", "set window x offset", OFFSET(window_x), AV_OPT_TYPE_INT, {.i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, -- { "window_y", "set window y offset", OFFSET(window_y), AV_OPT_TYPE_INT, {.i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, -- { "fullscreen", "set fullscreen display", OFFSET(fullscreen), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "show_all", "show all frames", OFFSET(show_all), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "window_size", "set window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "window_x", "set window x offset", OFFSET(window_x), AV_OPT_TYPE_INT, { .i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "window_y", "set window y offset", OFFSET(window_y), AV_OPT_TYPE_INT, { .i64 = 0 }, -INT_MAX, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "fullscreen", "set fullscreen display", OFFSET(fullscreen), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, - { NULL } - - }; - -From 4d3a3973a07994b0a6ec35626e514fc40f439fe3 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 12 Dec 2022 16:49:43 +0000 -Subject: [PATCH 098/151] v4l2m2m: reporganise get_raw_format for loop logic - ---- - libavcodec/v4l2_context.c | 16 +++++----------- - 1 file changed, 5 insertions(+), 11 deletions(-) - -diff --git a/libavcodec/v4l2_context.c b/libavcodec/v4l2_context.c -index 7031f3d340..79a31cf930 100644 ---- a/libavcodec/v4l2_context.c -+++ b/libavcodec/v4l2_context.c -@@ -828,28 +828,22 @@ static int v4l2_get_raw_format(V4L2Context* ctx, enum AVPixelFormat *p) - return 0; - } - -- for (;;) { -+ for (;; ++fdesc.index) { - ret = ioctl(ctx_to_m2mctx(ctx)->fd, VIDIOC_ENUM_FMT, &fdesc); - if (ret) - return AVERROR(EINVAL); - - if (priv->pix_fmt != AV_PIX_FMT_NONE) { -- if (fdesc.pixelformat != ff_v4l2_format_avfmt_to_v4l2(priv->pix_fmt)) { -- fdesc.index++; -+ if (fdesc.pixelformat != ff_v4l2_format_avfmt_to_v4l2(priv->pix_fmt)) - continue; -- } - } - - pixfmt = ff_v4l2_format_v4l2_to_avfmt(fdesc.pixelformat, AV_CODEC_ID_RAWVIDEO); - ret = v4l2_try_raw_format(ctx, pixfmt); -- if (ret){ -- fdesc.index++; -- continue; -+ if (ret == 0) { -+ *p = pixfmt; -+ return 0; - } -- -- *p = pixfmt; -- -- return 0; - } - - return AVERROR(EINVAL); - -From 123c5ef429ec6bd7d1875d621df88bb2ad7af0bd Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 12 Dec 2022 17:49:12 +0000 -Subject: [PATCH 099/151] drm_vout: Set zpos on the plane we pick to ensure it - is at the front - ---- - libavdevice/drm_vout.c | 38 +++++++++++++++++++++++++++++++++----- - 1 file changed, 33 insertions(+), 5 deletions(-) - -diff --git a/libavdevice/drm_vout.c b/libavdevice/drm_vout.c -index cfb33ce7c3..9bd9e04421 100644 ---- a/libavdevice/drm_vout.c -+++ b/libavdevice/drm_vout.c -@@ -115,9 +115,11 @@ static int find_plane(struct AVFormatContext * const avctx, - { - drmModePlaneResPtr planes; - drmModePlanePtr plane; -+ drmModeObjectPropertiesPtr props = NULL; -+ drmModePropertyPtr prop = NULL; - unsigned int i; - unsigned int j; -- int ret = 0; -+ int ret = -1; - - planes = drmModeGetPlaneResources(drmfd); - if (!planes) -@@ -154,11 +156,37 @@ static int find_plane(struct AVFormatContext * const avctx, - break; - } - -- if (i == planes->count_planes) -- ret = -1; -+ if (i == planes->count_planes) { -+ ret = -1; -+ goto fail; -+ } - -- drmModeFreePlaneResources(planes); -- return ret; -+ props = drmModeObjectGetProperties(drmfd, *pplane_id, DRM_MODE_OBJECT_PLANE); -+ if (!props) -+ goto fail; -+ for (i = 0; i != props->count_props; ++i) { -+ if (prop) -+ drmModeFreeProperty(prop); -+ prop = drmModeGetProperty(drmfd, props->props[i]); -+ if (!prop) -+ goto fail; -+ if (strcmp("zpos", prop->name) == 0) { -+ if (drmModeObjectSetProperty(drmfd, *pplane_id, DRM_MODE_OBJECT_PLANE, props->props[i], prop->values[1]) == 0) -+ av_log(avctx, AV_LOG_DEBUG, "ZPOS set to %d\n", (int)prop->values[1]); -+ else -+ av_log(avctx, AV_LOG_WARNING, "Failed to set ZPOS on DRM plane\n"); -+ break; -+ } -+ } -+ -+ ret = 0; -+fail: -+ if (props) -+ drmModeFreeObjectProperties(props); -+ if (prop) -+ drmModeFreeProperty(prop); -+ drmModeFreePlaneResources(planes); -+ return ret; - } - - static void da_uninit(drm_display_env_t * const de, drm_aux_t * da) - -From 0ee1c3b41774d05595376f8d25de2a901dbb12c7 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 12 Dec 2022 17:51:46 +0000 -Subject: [PATCH 100/151] drm_vout: Only set modifier flag and pass modifiers - if there are some - ---- - libavdevice/drm_vout.c | 17 ++++++++++++----- - 1 file changed, 12 insertions(+), 5 deletions(-) - -diff --git a/libavdevice/drm_vout.c b/libavdevice/drm_vout.c -index 9bd9e04421..a56adea866 100644 ---- a/libavdevice/drm_vout.c -+++ b/libavdevice/drm_vout.c -@@ -34,6 +34,7 @@ - - #include - #include -+#include - - #define TRACE_ALL 0 - -@@ -249,6 +250,7 @@ static int do_display(AVFormatContext * const s, drm_display_env_t * const de, A - uint32_t offsets[4] = {0}; - uint64_t modifiers[4] = {0}; - uint32_t bo_handles[4] = {0}; -+ int has_mods = 0; - int i, j, n; - - da->frame = frame; -@@ -258,6 +260,9 @@ static int do_display(AVFormatContext * const s, drm_display_env_t * const de, A - av_log(s, AV_LOG_WARNING, "drmPrimeFDToHandle[%d](%d) failed: %s\n", i, desc->objects[i].fd, ERRSTR); - return -1; - } -+ if (desc->objects[i].format_modifier != DRM_FORMAT_MOD_LINEAR && -+ desc->objects[i].format_modifier != DRM_FORMAT_MOD_INVALID) -+ has_mods = 1; - } - - n = 0; -@@ -299,11 +304,13 @@ static int do_display(AVFormatContext * const s, drm_display_env_t * const de, A - #endif - - if (drmModeAddFB2WithModifiers(de->drm_fd, -- av_frame_cropped_width(frame), -- av_frame_cropped_height(frame), -- desc->layers[0].format, bo_handles, -- pitches, offsets, modifiers, -- &da->fb_handle, DRM_MODE_FB_MODIFIERS /** 0 if no mods */) != 0) { -+ av_frame_cropped_width(frame), -+ av_frame_cropped_height(frame), -+ desc->layers[0].format, bo_handles, -+ pitches, offsets, -+ has_mods ? modifiers : NULL, -+ &da->fb_handle, -+ has_mods ? DRM_MODE_FB_MODIFIERS : 0) != 0) { - av_log(s, AV_LOG_WARNING, "drmModeAddFB2WithModifiers failed: %s\n", ERRSTR); - return -1; - } - -From 4534e6981c1718eaeec4c5f58cdf5592ee7f0329 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 12 Dec 2022 17:52:58 +0000 -Subject: [PATCH 101/151] drm_vout: Fix typo in error message - ---- - libavdevice/drm_vout.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/libavdevice/drm_vout.c b/libavdevice/drm_vout.c -index a56adea866..351abf1d60 100644 ---- a/libavdevice/drm_vout.c -+++ b/libavdevice/drm_vout.c -@@ -596,7 +596,7 @@ static int drm_vout_init(struct AVFormatContext * s) - sem_init(&de->q_sem_out, 0, 0); - if (pthread_create(&de->q_thread, NULL, display_thread, s)) { - rv = AVERROR(errno); -- av_log(s, AV_LOG_ERROR, "Failed to creatye display thread: %s\n", av_err2str(rv)); -+ av_log(s, AV_LOG_ERROR, "Failed to create display thread: %s\n", av_err2str(rv)); - goto fail_close; - } - - -From 0469d1fb132a0d55593611c56e83733efe58045b Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 12 Dec 2022 18:00:41 +0000 -Subject: [PATCH 102/151] drm_vout: Add option to name the drm_module to use - ---- - libavdevice/drm_vout.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -diff --git a/libavdevice/drm_vout.c b/libavdevice/drm_vout.c -index 351abf1d60..491e1dc608 100644 ---- a/libavdevice/drm_vout.c -+++ b/libavdevice/drm_vout.c -@@ -70,7 +70,9 @@ typedef struct drm_display_env_s - uint32_t con_id; - struct drm_setup setup; - enum AVPixelFormat avfmt; -+ - int show_all; -+ const char * drm_module; - - unsigned int ano; - drm_aux_t aux[AUX_SIZE]; -@@ -569,7 +571,6 @@ static int drm_vout_init(struct AVFormatContext * s) - { - drm_display_env_t * const de = s->priv_data; - int rv; -- const char * drm_module = DRM_MODULE; - - av_log(s, AV_LOG_DEBUG, "<<< %s\n", __func__); - -@@ -578,10 +579,10 @@ static int drm_vout_init(struct AVFormatContext * s) - de->setup = (struct drm_setup){0}; - de->q_terminate = 0; - -- if ((de->drm_fd = drmOpen(drm_module, NULL)) < 0) -+ if ((de->drm_fd = drmOpen(de->drm_module, NULL)) < 0) - { - rv = AVERROR(errno); -- av_log(s, AV_LOG_ERROR, "Failed to drmOpen %s: %s\n", drm_module, av_err2str(rv)); -+ av_log(s, AV_LOG_ERROR, "Failed to drmOpen %s: %s\n", de->drm_module, av_err2str(rv)); - return rv; - } - -@@ -641,6 +642,7 @@ static void drm_vout_deinit(struct AVFormatContext * s) - #define OFFSET(x) offsetof(drm_display_env_t, x) - static const AVOption options[] = { - { "show_all", "show all frames", OFFSET(show_all), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, -+ { "drm_module", "drm_module name to use, default=" DRM_MODULE, OFFSET(drm_module), AV_OPT_TYPE_STRING, { .str = DRM_MODULE }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, - { NULL } - }; - - -From 61cb9fc3ce06e0ecaeeec3add143bc3a82956853 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 13 Dec 2022 13:01:00 +0000 -Subject: [PATCH 103/151] dmabufs: Rework to allow for non-CMA backends - ---- - libavcodec/v4l2_req_dmabufs.c | 161 ++++++++++++++++++++++++---------- - 1 file changed, 116 insertions(+), 45 deletions(-) - -diff --git a/libavcodec/v4l2_req_dmabufs.c b/libavcodec/v4l2_req_dmabufs.c -index c4bbed18c6..1c3a5e861f 100644 ---- a/libavcodec/v4l2_req_dmabufs.c -+++ b/libavcodec/v4l2_req_dmabufs.c -@@ -1,3 +1,4 @@ -+#include - #include - #include - #include -@@ -19,9 +20,21 @@ - - #define TRACE_ALLOC 0 - -+struct dmabufs_ctl; -+struct dmabuf_h; -+ -+struct dmabuf_fns { -+ int (*buf_alloc)(struct dmabufs_ctl * dbsc, struct dmabuf_h * dh, size_t size); -+ void (*buf_free)(struct dmabuf_h * dh); -+ int (*ctl_new)(struct dmabufs_ctl * dbsc); -+ void (*ctl_free)(struct dmabufs_ctl * dbsc); -+}; -+ - struct dmabufs_ctl { - int fd; - size_t page_size; -+ void * v; -+ const struct dmabuf_fns * fns; - }; - - struct dmabuf_h { -@@ -29,6 +42,8 @@ struct dmabuf_h { - size_t size; - size_t len; - void * mapptr; -+ void * v; -+ const struct dmabuf_fns * fns; - }; - - #if TRACE_ALLOC -@@ -88,15 +103,8 @@ struct dmabuf_h * dmabuf_import(int fd, size_t size) - struct dmabuf_h * dmabuf_realloc(struct dmabufs_ctl * dbsc, struct dmabuf_h * old, size_t size) - { - struct dmabuf_h * dh; -- struct dma_heap_allocation_data data = { -- .len = (size + dbsc->page_size - 1) & ~(dbsc->page_size - 1), -- .fd = 0, -- .fd_flags = O_RDWR, -- .heap_flags = 0 -- }; -- - if (old != NULL) { -- if (old->size == data.len) { -+ if (old->size >= size) { - return old; - } - dmabuf_free(old); -@@ -106,24 +114,16 @@ struct dmabuf_h * dmabuf_realloc(struct dmabufs_ctl * dbsc, struct dmabuf_h * ol - (dh = malloc(sizeof(*dh))) == NULL) - return NULL; - -- while (ioctl(dbsc->fd, DMA_HEAP_IOCTL_ALLOC, &data)) { -- int err = errno; -- request_log("Failed to alloc %" PRIu64 " from dma-heap(fd=%d): %d (%s)\n", -- (uint64_t)data.len, -- dbsc->fd, -- err, -- strerror(err)); -- if (err == EINTR) -- continue; -- goto fail; -- } -- - *dh = (struct dmabuf_h){ -- .fd = data.fd, -- .size = (size_t)data.len, -- .mapptr = MAP_FAILED -+ .fd = -1, -+ .mapptr = MAP_FAILED, -+ .fns = dbsc->fns - }; - -+ if (dh->fns->buf_alloc(dbsc, dh, size) != 0) -+ goto fail; -+ -+ - #if TRACE_ALLOC - ++total_bufs; - total_size += dh->size; -@@ -220,8 +220,6 @@ void dmabuf_len_set(struct dmabuf_h * const dh, const size_t len) - dh->len = len; - } - -- -- - void dmabuf_free(struct dmabuf_h * dh) - { - if (!dh) -@@ -233,20 +231,63 @@ void dmabuf_free(struct dmabuf_h * dh) - request_log("%s: Free: %zd, total=%zd, bufs=%d\n", __func__, dh->size, total_size, total_bufs); - #endif - -- if (dh->mapptr != MAP_FAILED) -+ dh->fns->buf_free(dh); -+ -+ if (dh->mapptr != MAP_FAILED && dh->mapptr != NULL) - munmap(dh->mapptr, dh->size); -- while (close(dh->fd) == -1 && errno == EINTR) -- /* loop */; -+ if (dh->fd != -1) -+ while (close(dh->fd) == -1 && errno == EINTR) -+ /* loop */; - free(dh); - } - --struct dmabufs_ctl * dmabufs_ctl_new(void) -+static struct dmabufs_ctl * dmabufs_ctl_new2(const struct dmabuf_fns * const fns) - { -- struct dmabufs_ctl * dbsc = malloc(sizeof(*dbsc)); -+ struct dmabufs_ctl * dbsc = calloc(1, sizeof(*dbsc)); - - if (!dbsc) - return NULL; - -+ dbsc->fd = -1; -+ dbsc->fns = fns; -+ dbsc->page_size = (size_t)sysconf(_SC_PAGE_SIZE); -+ -+ if (fns->ctl_new(dbsc) != 0) -+ goto fail; -+ -+ return dbsc; -+ -+fail: -+ free(dbsc); -+ return NULL; -+} -+ -+static void dmabufs_ctl_free(struct dmabufs_ctl * const dbsc) -+{ -+ request_debug(NULL, "Free dmabuf ctl\n"); -+ -+ dbsc->fns->ctl_free(dbsc); -+ -+ free(dbsc); -+} -+ -+void dmabufs_ctl_delete(struct dmabufs_ctl ** const pDbsc) -+{ -+ struct dmabufs_ctl * const dbsc = *pDbsc; -+ -+ if (!dbsc) -+ return; -+ *pDbsc = NULL; -+ -+ dmabufs_ctl_free(dbsc); -+} -+ -+//----------------------------------------------------------------------------- -+// -+// Alloc dmabuf via CMA -+ -+static int ctl_cma_new(struct dmabufs_ctl * dbsc) -+{ - while ((dbsc->fd = open(DMABUF_NAME1, O_RDWR)) == -1 && - errno == EINTR) - /* Loop */; -@@ -258,31 +299,61 @@ struct dmabufs_ctl * dmabufs_ctl_new(void) - if (dbsc->fd == -1) { - request_log("Unable to open either %s or %s\n", - DMABUF_NAME1, DMABUF_NAME2); -- goto fail; -+ return -1; - } - } -+ return 0; -+} - -- dbsc->page_size = (size_t)sysconf(_SC_PAGE_SIZE); -- -- return dbsc; -+static void ctl_cma_free(struct dmabufs_ctl * dbsc) -+{ -+ if (dbsc->fd != -1) -+ while (close(dbsc->fd) == -1 && errno == EINTR) -+ /* loop */; - --fail: -- free(dbsc); -- return NULL; - } - --void dmabufs_ctl_delete(struct dmabufs_ctl ** const pDbsc) -+static int buf_cma_alloc(struct dmabufs_ctl * const dbsc, struct dmabuf_h * dh, size_t size) - { -- struct dmabufs_ctl * const dbsc = *pDbsc; -+ struct dma_heap_allocation_data data = { -+ .len = (size + dbsc->page_size - 1) & ~(dbsc->page_size - 1), -+ .fd = 0, -+ .fd_flags = O_RDWR, -+ .heap_flags = 0 -+ }; - -- if (!dbsc) -- return; -- *pDbsc = NULL; -+ while (ioctl(dbsc->fd, DMA_HEAP_IOCTL_ALLOC, &data)) { -+ int err = errno; -+ request_log("Failed to alloc %" PRIu64 " from dma-heap(fd=%d): %d (%s)\n", -+ (uint64_t)data.len, -+ dbsc->fd, -+ err, -+ strerror(err)); -+ if (err == EINTR) -+ continue; -+ return -err; -+ } - -- while (close(dbsc->fd) == -1 && errno == EINTR) -- /* loop */; -+ dh->fd = data.fd; -+ dh->size = (size_t)data.len; -+ return 0; -+} - -- free(dbsc); -+static void buf_cma_free(struct dmabuf_h * dh) -+{ -+ // Nothing needed - } - -+static const struct dmabuf_fns dmabuf_cma_fns = { -+ .buf_alloc = buf_cma_alloc, -+ .buf_free = buf_cma_free, -+ .ctl_new = ctl_cma_new, -+ .ctl_free = ctl_cma_free, -+}; -+ -+struct dmabufs_ctl * dmabufs_ctl_new(void) -+{ -+ request_debug(NULL, "Dmabufs using CMA\n");; -+ return dmabufs_ctl_new2(&dmabuf_cma_fns); -+} - - -From 288807720443bbddf4c83c3589d1877c7fd418c3 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 13 Dec 2022 13:07:58 +0000 -Subject: [PATCH 104/151] dmabufs: Use unref rather than deleet on cmabufs_ctl - ---- - libavcodec/v4l2_req_dmabufs.c | 12 +++++++++++- - libavcodec/v4l2_req_dmabufs.h | 3 ++- - libavcodec/v4l2_request_hevc.c | 4 ++-- - 3 files changed, 15 insertions(+), 4 deletions(-) - -diff --git a/libavcodec/v4l2_req_dmabufs.c b/libavcodec/v4l2_req_dmabufs.c -index 1c3a5e861f..acc0366e76 100644 ---- a/libavcodec/v4l2_req_dmabufs.c -+++ b/libavcodec/v4l2_req_dmabufs.c -@@ -31,6 +31,7 @@ struct dmabuf_fns { - }; - - struct dmabufs_ctl { -+ atomic_int ref_count; - int fd; - size_t page_size; - void * v; -@@ -271,7 +272,7 @@ static void dmabufs_ctl_free(struct dmabufs_ctl * const dbsc) - free(dbsc); - } - --void dmabufs_ctl_delete(struct dmabufs_ctl ** const pDbsc) -+void dmabufs_ctl_unref(struct dmabufs_ctl ** const pDbsc) - { - struct dmabufs_ctl * const dbsc = *pDbsc; - -@@ -279,9 +280,18 @@ void dmabufs_ctl_delete(struct dmabufs_ctl ** const pDbsc) - return; - *pDbsc = NULL; - -+ if (atomic_fetch_sub(&dbsc->ref_count, 1) != 0) -+ return; -+ - dmabufs_ctl_free(dbsc); - } - -+struct dmabufs_ctl * dmabufs_ctl_ref(struct dmabufs_ctl * const dbsc) -+{ -+ atomic_fetch_add(&dbsc->ref_count, 1); -+ return dbsc; -+} -+ - //----------------------------------------------------------------------------- - // - // Alloc dmabuf via CMA -diff --git a/libavcodec/v4l2_req_dmabufs.h b/libavcodec/v4l2_req_dmabufs.h -index c1d3d8c8d7..381ba2708d 100644 ---- a/libavcodec/v4l2_req_dmabufs.h -+++ b/libavcodec/v4l2_req_dmabufs.h -@@ -7,7 +7,8 @@ struct dmabufs_ctl; - struct dmabuf_h; - - struct dmabufs_ctl * dmabufs_ctl_new(void); --void dmabufs_ctl_delete(struct dmabufs_ctl ** const pdbsc); -+void dmabufs_ctl_unref(struct dmabufs_ctl ** const pdbsc); -+struct dmabufs_ctl * dmabufs_ctl_ref(struct dmabufs_ctl * const dbsc); - - // Need not preserve old contents - // On NULL return old buffer is freed -diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index 767ecb036a..db7ed13b6d 100644 ---- a/libavcodec/v4l2_request_hevc.c -+++ b/libavcodec/v4l2_request_hevc.c -@@ -105,7 +105,7 @@ static int v4l2_request_hevc_uninit(AVCodecContext *avctx) - mediabufs_ctl_unref(&ctx->mbufs); - media_pool_delete(&ctx->mpool); - pollqueue_unref(&ctx->pq); -- dmabufs_ctl_delete(&ctx->dbufs); -+ dmabufs_ctl_unref(&ctx->dbufs); - devscan_delete(&ctx->devscan); - - decode_q_uninit(&ctx->decode_q); -@@ -324,7 +324,7 @@ fail3: - fail2: - pollqueue_unref(&ctx->pq); - fail1: -- dmabufs_ctl_delete(&ctx->dbufs); -+ dmabufs_ctl_unref(&ctx->dbufs); - fail0: - devscan_delete(&ctx->devscan); - return ret; - -From 9115f40c5f55873102312085f2e328d1a2101ae4 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 13 Dec 2022 14:21:40 +0000 -Subject: [PATCH 105/151] egl_vout: Remove redundant & completely broken debug - ---- - libavdevice/egl_vout.c | 25 ------------------------- - 1 file changed, 25 deletions(-) - -diff --git a/libavdevice/egl_vout.c b/libavdevice/egl_vout.c -index a52cabb082..afc7afd13e 100644 ---- a/libavdevice/egl_vout.c -+++ b/libavdevice/egl_vout.c -@@ -515,31 +515,6 @@ static int do_display(AVFormatContext *const s, egl_display_env_t *const de, AVF - } - - da->fd = desc->objects[0].fd; -- --#if 0 -- av_log(s, AV_LOG_INFO, "%dx%d, fmt: %x, boh=%d,%d,%d,%d, pitch=%d,%d,%d,%d," -- " offset=%d,%d,%d,%d, mod=%llx,%llx,%llx,%llx\n", -- av_frame_cropped_width(frame), -- av_frame_cropped_height(frame), -- desc->layers[0].format, -- bo_plane_handles[0], -- bo_plane_handles[1], -- bo_plane_handles[2], -- bo_plane_handles[3], -- pitches[0], -- pitches[1], -- pitches[2], -- pitches[3], -- offsets[0], -- offsets[1], -- offsets[2], -- offsets[3], -- (long long)modifiers[0], -- (long long)modifiers[1], -- (long long)modifiers[2], -- (long long)modifiers[3] -- ); --#endif - } - - glClearColor(0.5, 0.5, 0.5, 0.5); - -From 34711d5a1429213b6f4cf8ad163e8e8d108626e7 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 13 Dec 2022 16:12:12 +0000 -Subject: [PATCH 106/151] v4l2m2m: Use offset from querybuf rather than always - 0 - ---- - libavcodec/v4l2_buffers.c | 4 +++- - libavcodec/v4l2_buffers.h | 3 ++- - 2 files changed, 5 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 9ef2f40e39..5ca58ea593 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -379,7 +379,7 @@ static uint8_t * v4l2_get_drm_frame(V4L2Buffer *avbuf) - - for (int i = 0; i < avbuf->num_planes; i++) { - layer->planes[i].object_index = i; -- layer->planes[i].offset = 0; -+ layer->planes[i].offset = avbuf->plane_info[i].offset; - layer->planes[i].pitch = avbuf->plane_info[i].bytesperline; - } - -@@ -934,6 +934,7 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct - - if (V4L2_TYPE_IS_MULTIPLANAR(ctx->type)) { - avbuf->plane_info[i].length = avbuf->buf.m.planes[i].length; -+ avbuf->plane_info[i].offset = avbuf->buf.m.planes[i].data_offset; - - if (want_mmap) - avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.m.planes[i].length, -@@ -941,6 +942,7 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct - buf_to_m2mctx(avbuf)->fd, avbuf->buf.m.planes[i].m.mem_offset); - } else { - avbuf->plane_info[i].length = avbuf->buf.length; -+ avbuf->plane_info[i].offset = 0; - - if (want_mmap) - avbuf->plane_info[i].mm_addr = mmap(NULL, avbuf->buf.length, -diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h -index 1ac32c5989..d91d5d1dd0 100644 ---- a/libavcodec/v4l2_buffers.h -+++ b/libavcodec/v4l2_buffers.h -@@ -66,7 +66,8 @@ typedef struct V4L2Buffer { - - /* keep track of the mmap address and mmap length */ - struct V4L2Plane_info { -- int bytesperline; -+ size_t bytesperline; -+ size_t offset; - void * mm_addr; - size_t length; - } plane_info[VIDEO_MAX_PLANES]; - -From 15458be3fe79c14f4fdcc2ad786508d1b647c914 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 13 Dec 2022 17:57:27 +0000 -Subject: [PATCH 107/151] v4l2m2m: Fix crash if init errors out before setting - avctx - ---- - libavcodec/v4l2_m2m.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c -index 1e30d15fd8..ac6bae0dc3 100644 ---- a/libavcodec/v4l2_m2m.c -+++ b/libavcodec/v4l2_m2m.c -@@ -278,7 +278,7 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) - - av_log(s->avctx, AV_LOG_DEBUG, "V4L2 Codec end\n"); - -- if (av_codec_is_decoder(s->avctx->codec)) -+ if (s->avctx && av_codec_is_decoder(s->avctx->codec)) - av_packet_unref(&s->buf_pkt); - - if (s->fd >= 0) { - -From 9f7f94c680b8aaedede9b3bcad37b645216cfcff Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 13 Dec 2022 18:10:30 +0000 -Subject: [PATCH 108/151] v4l2_buffers: Add and use ctx_to_m2mctx + error debug - ---- - libavcodec/v4l2_buffers.c | 22 +++++++++++++++------- - 1 file changed, 15 insertions(+), 7 deletions(-) - -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index 5ca58ea593..e28ef2d1e8 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -41,11 +41,16 @@ - #define USEC_PER_SEC 1000000 - static const AVRational v4l2_timebase = { 1, USEC_PER_SEC }; - -+static inline V4L2m2mContext *ctx_to_m2mctx(const V4L2Context *ctx) -+{ -+ return V4L2_TYPE_IS_OUTPUT(ctx->type) ? -+ container_of(ctx, V4L2m2mContext, output) : -+ container_of(ctx, V4L2m2mContext, capture); -+} -+ - static inline V4L2m2mContext *buf_to_m2mctx(const V4L2Buffer * const buf) - { -- return V4L2_TYPE_IS_OUTPUT(buf->context->type) ? -- container_of(buf->context, V4L2m2mContext, output) : -- container_of(buf->context, V4L2m2mContext, capture); -+ return ctx_to_m2mctx(buf->context); - } - - static inline AVCodecContext *logger(const V4L2Buffer * const buf) -@@ -883,6 +888,7 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct - int ret, i; - V4L2Buffer * const avbuf = av_mallocz(sizeof(*avbuf)); - AVBufferRef * bufref; -+ V4L2m2mContext * const s = ctx_to_m2mctx(ctx); - - *pbufref = NULL; - if (avbuf == NULL) -@@ -910,7 +916,7 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct - avbuf->buf.m.planes = avbuf->planes; - } - -- ret = ioctl(buf_to_m2mctx(avbuf)->fd, VIDIOC_QUERYBUF, &avbuf->buf); -+ ret = ioctl(s->fd, VIDIOC_QUERYBUF, &avbuf->buf); - if (ret < 0) - goto fail; - -@@ -969,10 +975,12 @@ int ff_v4l2_buffer_initialize(AVBufferRef ** pbufref, int index, V4L2Context *ct - } - - if (!V4L2_TYPE_IS_OUTPUT(ctx->type)) { -- if (buf_to_m2mctx(avbuf)->output_drm) { -+ if (s->output_drm) { - ret = v4l2_buffer_export_drm(avbuf); -- if (ret) -- goto fail; -+ if (ret) { -+ av_log(logger(avbuf), AV_LOG_ERROR, "Failed to get exported drm handles\n"); -+ goto fail; -+ } - } - } - - -From 6b8bb2c41828351cd3a6f40be353696ae36450b7 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 13 Dec 2022 18:53:22 +0000 -Subject: [PATCH 109/151] v4l2m2m: Add ability to use cma alloced dmabufs as - well as v4l2 mmap - ---- - libavcodec/Makefile | 2 +- - libavcodec/v4l2_buffers.c | 65 ++++++++++++++++++++++++++------------- - libavcodec/v4l2_buffers.h | 2 ++ - libavcodec/v4l2_m2m.c | 6 +++- - libavcodec/v4l2_m2m.h | 4 +++ - libavcodec/v4l2_m2m_dec.c | 16 ++++++++++ - 6 files changed, 71 insertions(+), 24 deletions(-) - -diff --git a/libavcodec/Makefile b/libavcodec/Makefile -index 11f183c9b9..8b1d669834 100644 ---- a/libavcodec/Makefile -+++ b/libavcodec/Makefile -@@ -170,7 +170,7 @@ OBJS-$(CONFIG_VP3DSP) += vp3dsp.o - OBJS-$(CONFIG_VP56DSP) += vp56dsp.o - OBJS-$(CONFIG_VP8DSP) += vp8dsp.o - OBJS-$(CONFIG_V4L2_M2M) += v4l2_m2m.o v4l2_context.o v4l2_buffers.o v4l2_fmt.o\ -- weak_link.o -+ weak_link.o v4l2_req_dmabufs.o - OBJS-$(CONFIG_V4L2_REQUEST) += v4l2_req_media.o v4l2_req_pollqueue.o v4l2_req_dmabufs.o\ - v4l2_req_devscan.o weak_link.o - OBJS-$(CONFIG_WMA_FREQS) += wma_freqs.o -diff --git a/libavcodec/v4l2_buffers.c b/libavcodec/v4l2_buffers.c -index e28ef2d1e8..8d80d19788 100644 ---- a/libavcodec/v4l2_buffers.c -+++ b/libavcodec/v4l2_buffers.c -@@ -36,6 +36,7 @@ - #include "v4l2_context.h" - #include "v4l2_buffers.h" - #include "v4l2_m2m.h" -+#include "v4l2_req_dmabufs.h" - #include "weak_link.h" - - #define USEC_PER_SEC 1000000 -@@ -477,33 +478,46 @@ static void v4l2_free_bufref(void *opaque, uint8_t *data) - av_buffer_unref(&bufref); - } - -+static inline uint32_t ff_v4l2_buf_len(const struct v4l2_buffer * b, unsigned int i) -+{ -+ return V4L2_TYPE_IS_MULTIPLANAR(b->type) ? b->m.planes[i].length : b->length; -+} -+ - static int v4l2_buffer_export_drm(V4L2Buffer* avbuf) - { -- struct v4l2_exportbuffer expbuf; - int i, ret; -+ const V4L2m2mContext * const s = buf_to_m2mctx(avbuf); - - for (i = 0; i < avbuf->num_planes; i++) { -- memset(&expbuf, 0, sizeof(expbuf)); -- -- expbuf.index = avbuf->buf.index; -- expbuf.type = avbuf->buf.type; -- expbuf.plane = i; -+ int dma_fd = -1; -+ const uint32_t blen = ff_v4l2_buf_len(&avbuf->buf, i); -+ -+ if (s->db_ctl != NULL) { -+ if ((avbuf->dmabuf[i] = dmabuf_alloc(s->db_ctl, blen)) == NULL) -+ return AVERROR(ENOMEM); -+ dma_fd = dmabuf_fd(avbuf->dmabuf[i]); -+ if (V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type)) -+ avbuf->buf.m.planes[i].m.fd = dma_fd; -+ else -+ avbuf->buf.m.fd = dma_fd; -+ } -+ else { -+ struct v4l2_exportbuffer expbuf; -+ memset(&expbuf, 0, sizeof(expbuf)); - -- ret = ioctl(buf_to_m2mctx(avbuf)->fd, VIDIOC_EXPBUF, &expbuf); -- if (ret < 0) -- return AVERROR(errno); -+ expbuf.index = avbuf->buf.index; -+ expbuf.type = avbuf->buf.type; -+ expbuf.plane = i; - -- if (V4L2_TYPE_IS_MULTIPLANAR(avbuf->buf.type)) { -- /* drm frame */ -- avbuf->drm_frame.objects[i].size = avbuf->buf.m.planes[i].length; -- avbuf->drm_frame.objects[i].fd = expbuf.fd; -- avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR; -- } else { -- /* drm frame */ -- avbuf->drm_frame.objects[0].size = avbuf->buf.length; -- avbuf->drm_frame.objects[0].fd = expbuf.fd; -- avbuf->drm_frame.objects[0].format_modifier = DRM_FORMAT_MOD_LINEAR; -+ ret = ioctl(s->fd, VIDIOC_EXPBUF, &expbuf); -+ if (ret < 0) -+ return AVERROR(errno); -+ dma_fd = expbuf.fd; - } -+ -+ avbuf->drm_frame.objects[i].size = blen; -+ avbuf->drm_frame.objects[i].fd = dma_fd; -+ avbuf->drm_frame.objects[i].format_modifier = DRM_FORMAT_MOD_LINEAR; - } - - return 0; -@@ -870,9 +884,16 @@ static void v4l2_buffer_buffer_free(void *opaque, uint8_t *data) - munmap(p->mm_addr, p->length); - } - -- for (i = 0; i != FF_ARRAY_ELEMS(avbuf->drm_frame.objects); ++i) { -- if (avbuf->drm_frame.objects[i].fd != -1) -- close(avbuf->drm_frame.objects[i].fd); -+ if (avbuf->dmabuf[0] == NULL) { -+ for (i = 0; i != FF_ARRAY_ELEMS(avbuf->drm_frame.objects); ++i) { -+ if (avbuf->drm_frame.objects[i].fd != -1) -+ close(avbuf->drm_frame.objects[i].fd); -+ } -+ } -+ else { -+ for (i = 0; i != FF_ARRAY_ELEMS(avbuf->dmabuf); ++i) { -+ dmabuf_free(avbuf->dmabuf[i]); -+ } - } - - av_buffer_unref(&avbuf->ref_buf); -diff --git a/libavcodec/v4l2_buffers.h b/libavcodec/v4l2_buffers.h -index d91d5d1dd0..444ad94b14 100644 ---- a/libavcodec/v4l2_buffers.h -+++ b/libavcodec/v4l2_buffers.h -@@ -46,6 +46,7 @@ enum V4L2Buffer_status { - */ - struct V4L2Context; - struct ff_weak_link_client; -+struct dmabuf_h; - - typedef struct V4L2Buffer { - /* each buffer needs to have a reference to its context -@@ -80,6 +81,7 @@ typedef struct V4L2Buffer { - - enum V4L2Buffer_status status; - -+ struct dmabuf_h * dmabuf[VIDEO_MAX_PLANES]; // If externally alloced dmabufs - stash other info here - } V4L2Buffer; - - /** -diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c -index ac6bae0dc3..f802687b1b 100644 ---- a/libavcodec/v4l2_m2m.c -+++ b/libavcodec/v4l2_m2m.c -@@ -34,6 +34,7 @@ - #include "v4l2_context.h" - #include "v4l2_fmt.h" - #include "v4l2_m2m.h" -+#include "v4l2_req_dmabufs.h" - - static void - xlat_init(xlat_track_t * const x) -@@ -75,7 +76,7 @@ static int v4l2_prepare_contexts(V4L2m2mContext *s, int probe) - - s->capture.done = s->output.done = 0; - s->capture.name = "capture"; -- s->capture.buf_mem = V4L2_MEMORY_MMAP; -+ s->capture.buf_mem = s->db_ctl != NULL ? V4L2_MEMORY_DMABUF : V4L2_MEMORY_MMAP; - s->output.name = "output"; - s->output.buf_mem = s->input_drm ? V4L2_MEMORY_DMABUF : V4L2_MEMORY_MMAP; - atomic_init(&s->refcount, 0); -@@ -94,12 +95,14 @@ static int v4l2_prepare_contexts(V4L2m2mContext *s, int probe) - if (v4l2_mplane_video(&cap)) { - s->capture.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; - s->output.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; -+ s->output.format.type = s->output.type; - return 0; - } - - if (v4l2_splane_video(&cap)) { - s->capture.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - s->output.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; -+ s->output.format.type = s->output.type; - return 0; - } - -@@ -293,6 +296,7 @@ int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv) - - ff_v4l2_context_release(&s->output); - -+ dmabufs_ctl_unref(&s->db_ctl); - close(s->fd); - s->fd = -1; - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 26a7161042..0f41f94694 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -71,6 +71,8 @@ typedef struct xlat_track_s { - V4L2m2mTrackEl track_els[FF_V4L2_M2M_TRACK_SIZE]; - } xlat_track_t; - -+struct dmabufs_ctl; -+ - typedef struct V4L2m2mContext { - char devname[PATH_MAX]; - int fd; -@@ -124,6 +126,7 @@ typedef struct V4L2m2mContext { - /* Quirks */ - unsigned int quirks; - -+ struct dmabufs_ctl * db_ctl; - } V4L2m2mContext; - - typedef struct V4L2m2mPriv { -@@ -134,6 +137,7 @@ typedef struct V4L2m2mPriv { - - int num_output_buffers; - int num_capture_buffers; -+ const char * dmabuf_alloc; - enum AVPixelFormat pix_fmt; - } V4L2m2mPriv; - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 47b2735f82..4d17057298 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -41,6 +41,7 @@ - #include "v4l2_context.h" - #include "v4l2_m2m.h" - #include "v4l2_fmt.h" -+#include "v4l2_req_dmabufs.h" - - // Pick 64 for max last count - that is >1sec at 60fps - #define STATS_LAST_COUNT_MAX 64 -@@ -896,6 +897,20 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - s->output_drm = 0; - } - -+ s->db_ctl = NULL; -+ if (priv->dmabuf_alloc != NULL && strcmp(priv->dmabuf_alloc, "v4l2") != 0) { -+ if (strcmp(priv->dmabuf_alloc, "cma") == 0) -+ s->db_ctl = dmabufs_ctl_new(); -+ else { -+ av_log(avctx, AV_LOG_ERROR, "Unknown dmabuf alloc method: '%s'\n", priv->dmabuf_alloc); -+ return AVERROR(EINVAL); -+ } -+ if (!s->db_ctl) { -+ av_log(avctx, AV_LOG_ERROR, "Can't open dmabuf provider '%s'\n", priv->dmabuf_alloc); -+ return AVERROR(ENOMEM); -+ } -+ } -+ - s->device_ref = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_DRM); - if (!s->device_ref) { - ret = AVERROR(ENOMEM); -@@ -1000,6 +1015,7 @@ static const AVOption options[] = { - { "num_capture_buffers", "Number of buffers in the capture context", - OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 20}, 2, INT_MAX, FLAGS }, - { "pixel_format", "Pixel format to be used by the decoder", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, AV_PIX_FMT_NONE, AV_PIX_FMT_NB, FLAGS }, -+ { "dmabuf_alloc", "Dmabuf alloc method", OFFSET(dmabuf_alloc), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, FLAGS }, - { NULL}, - }; - - -From 499bcdc4ed82c737ceab166a07b46e8ed8ccbc88 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 13 Dec 2022 19:05:47 +0000 -Subject: [PATCH 110/151] testfilt: Skeleton of hw filter test code - ---- - pi-util/testfilt.py | 83 +++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 83 insertions(+) - create mode 100755 pi-util/testfilt.py - -diff --git a/pi-util/testfilt.py b/pi-util/testfilt.py -new file mode 100755 -index 0000000000..b322dac0c2 ---- /dev/null -+++ b/pi-util/testfilt.py -@@ -0,0 +1,83 @@ -+#!/usr/bin/env python3 -+ -+import string -+import os -+import subprocess -+import re -+import argparse -+import sys -+import csv -+from stat import * -+ -+class validator: -+ def __init__(self): -+ self.ok = False -+ -+ def isok(self): -+ return self.ok -+ -+ def setok(self): -+ self.ok = True -+ -+class valid_regex(validator): -+ def __init__(self, regex): -+ super().__init__() -+ self.regex = re.compile(regex) -+ -+ def scanline(self, line): -+ if self.isok() or self.regex.search(line): -+ self.setok() -+ -+ -+def validate(validators, flog): -+ for line in flog: -+ for v in validators: -+ v.scanline(line) -+ -+ ok = True -+ for v in validators: -+ if not v.isok(): -+ ok = False -+ # complain -+ print("Test failed") -+ -+ if ok: -+ print("OK") -+ return ok -+ -+def runtest(name, ffmpeg, args, suffix, validators): -+ log_root = os.path.join("/tmp", "testfilt", name) -+ ofilename = os.path.join(log_root, name + suffix) -+ -+ if not os.path.exists(log_root): -+ os.makedirs(log_root) -+ -+ try: -+ os.remove(ofilename) -+ except: -+ pass -+ -+ flog = open(os.path.join(log_root, name + ".log"), "wb") -+ ffargs = [ffmpeg] + args + [ofilename] -+ -+ subprocess.call(ffargs, stdout=flog, stderr=subprocess.STDOUT, text=False) -+ flog.close -+ -+ flog = open(os.path.join(log_root, name + ".log"), "rt") -+ return validate(validators, flog) -+ -+def sayok(log_root, flog): -+ print("Woohoo") -+ return True -+ -+if __name__ == '__main__': -+ -+ argp = argparse.ArgumentParser(description="FFmpeg filter tester") -+ argp.add_argument("--ffmpeg", default="./ffmpeg", help="ffmpeg exec name") -+ args = argp.parse_args() -+ -+ runtest("ATest", args.ffmpeg, ["-v", "verbose", "-no_cvt_hw", "-an", "-c:v", "h264_v4l2m2m", "-i", -+ "/home/johncox/server/TestMedia/Sony/jellyfish-10-mbps-hd-h264.mkv", -+# "/home/jc/rpi/streams/jellyfish-3-mbps-hd-h264.mkv", -+ "-c:v", "h264_v4l2m2m", "-b:v", "2M"], ".mkv", -+ [valid_regex(r'Output stream #0:0 \(video\): 900 frames encoded; 900 packets muxed')]) - -From 50ac318a472fd98e1e58605316ea6a2e8cde0a04 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 5 Jan 2023 14:39:30 +0000 -Subject: [PATCH 111/151] pixfmt: Add a #define to indicate presence of SAND - formats - ---- - libavutil/pixfmt.h | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/libavutil/pixfmt.h b/libavutil/pixfmt.h -index 22f70007c3..5cc780e7d5 100644 ---- a/libavutil/pixfmt.h -+++ b/libavutil/pixfmt.h -@@ -378,6 +378,8 @@ enum AVPixelFormat { - AV_PIX_FMT_Y210BE, ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, big-endian - AV_PIX_FMT_Y210LE, ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, little-endian - // RPI - not on ifdef so can be got at by calling progs -+// #define so code that uses this can know it is there -+#define AVUTIL_HAVE_PIX_FMT_SAND 1 - AV_PIX_FMT_SAND128, ///< 4:2:0 8-bit 128x*Y stripe, 64x*UV stripe, then next x stripe, mysterious padding - AV_PIX_FMT_SAND64_10, ///< 4:2:0 10-bit 64x*Y stripe, 32x*UV stripe, then next x stripe, mysterious padding - AV_PIX_FMT_SAND64_16, ///< 4:2:0 16-bit 64x*Y stripe, 32x*UV stripe, then next x stripe, mysterious padding - -From 23a3132e094d449ea05657704c0cffc3f0762c28 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 11 Jan 2023 16:30:37 +0000 -Subject: [PATCH 112/151] v4l2_m2m_dec: Fix initial pkt send if no extradata - ---- - libavcodec/v4l2_m2m_dec.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 4d17057298..9daf05adfe 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -240,7 +240,7 @@ copy_extradata(AVCodecContext * const avctx, - else - len = src_len < 0 ? AVERROR(EINVAL) : src_len; - -- // Zero length is OK but we swant to stop - -ve is error val -+ // Zero length is OK but we want to stop - -ve is error val - if (len <= 0) - return len; - -@@ -525,7 +525,7 @@ static int try_enqueue_src(AVCodecContext * const avctx, V4L2m2mContext * const - - if (s->extdata_sent) - ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, NULL, 0); -- else if (s->extdata_data) -+ else - ret = ff_v4l2_context_enqueue_packet(&s->output, &s->buf_pkt, s->extdata_data, s->extdata_size); - - if (ret == AVERROR(EAGAIN)) { - -From f4f6b9f1af137153e574c704804033e83f2ed1a8 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 16 Jan 2023 16:05:09 +0000 -Subject: [PATCH 113/151] v4l2m2m_dec: Make capture timeout long once pending - count > 31 - -For some applications (ffmpeg command line) the current heuristic of adding -a short timeout and preferring DQ over Q once we think we have buffers -Qed in V4L2 is insufficient to prevent arbitrary buffer growth. -Unfortunately the current method of guessing the number of Qed buffers isn't -reliable enough to allow for a long timeout with only a few few buffers -believed pending so only do so once the number of buffers believed pending -exceeds plausible inaccuracies caused by buffer reordering. - -The limit could be optimised by codec or apparent latency but a simple -number should reduce the unexpected consequences. ---- - libavcodec/v4l2_m2m.h | 3 ++- - libavcodec/v4l2_m2m_dec.c | 18 ++++++++++++++---- - 2 files changed, 16 insertions(+), 5 deletions(-) - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index 0f41f94694..ded1478a49 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -66,7 +66,7 @@ typedef struct pts_stats_s - - typedef struct xlat_track_s { - unsigned int track_no; -- int64_t last_pts; -+ int64_t last_pts; // Last valid PTS decoded - int64_t last_opaque; - V4L2m2mTrackEl track_els[FF_V4L2_M2M_TRACK_SIZE]; - } xlat_track_t; -@@ -88,6 +88,7 @@ typedef struct V4L2m2mContext { - - /* null frame/packet received */ - int draining; -+ int running; - AVPacket buf_pkt; - - /* Reference to a frame. Only used during encoding */ -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 9daf05adfe..c8ab883d7e 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -582,7 +582,7 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - - do { - const int pending = xlat_pending(&s->xlat); -- const int prefer_dq = (pending > 3); -+ const int prefer_dq = (pending > 4); - const int last_src_rv = src_rv; - - av_log(avctx, AV_LOG_TRACE, "Pending=%d, src_rv=%d, req_pkt=%d\n", pending, src_rv, s->req_pkt); -@@ -611,10 +611,14 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - // (b) enqueue returned a status indicating that decode should be attempted - if (dst_rv != 0 && TRY_DQ(src_rv)) { - // Pick a timeout depending on state -+ // The pending count isn't completely reliable so it is good enough -+ // hint that we want a frame but not good enough to require it in -+ // all cases; however if it has got > 31 that exceeds its margin of -+ // error so require a frame to prevent ridiculous levels of latency - const int t = - src_rv == NQ_Q_FULL ? -1 : - src_rv == NQ_DRAINING ? 300 : -- prefer_dq ? 5 : 0; -+ prefer_dq ? (s->running && pending > 31 ? 100 : 5) : 0; - - // Dequeue frame will unref any previous contents of frame - // if it returns success so we don't need an explicit unref -@@ -631,8 +635,13 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - } - } - -- if (dst_rv == 0) -+ if (dst_rv == 0) { - set_best_effort_pts(avctx, &s->pts_stat, frame); -+ if (!s->running) { -+ s->running = 1; -+ av_log(avctx, AV_LOG_VERBOSE, "Decode running\n"); -+ } -+ } - - if (dst_rv == AVERROR(EAGAIN) && src_rv == NQ_DRAINING) { - av_log(avctx, AV_LOG_WARNING, "Timeout in drain - assume EOF"); -@@ -998,7 +1007,8 @@ static void v4l2_decode_flush(AVCodecContext *avctx) - - // resend extradata - s->extdata_sent = 0; -- // clear EOS status vars -+ // clear status vars -+ s->running = 0; - s->draining = 0; - output->done = 0; - capture->done = 0; - -From 39f49cdaefa4483914f703c3f352c8894b3b81fd Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 6 Feb 2023 19:23:16 +0000 -Subject: [PATCH 114/151] Initial buffersink alloc callback code - -(cherry picked from commit dde8d3c8f3cc279b9b92ed4f10a2e3990f4aadeb) ---- - libavfilter/buffersink.c | 44 ++++++++++++++++++++++++++++++++++++++++ - libavfilter/buffersink.h | 3 +++ - 2 files changed, 47 insertions(+) - -diff --git a/libavfilter/buffersink.c b/libavfilter/buffersink.c -index 306c283f77..d3c82aabf3 100644 ---- a/libavfilter/buffersink.c -+++ b/libavfilter/buffersink.c -@@ -62,6 +62,11 @@ typedef struct BufferSinkContext { - int sample_rates_size; - - AVFrame *peeked_frame; -+ -+ union { -+ av_buffersink_alloc_video_frame * video; -+ } alloc_cb; -+ void * alloc_v; - } BufferSinkContext; - - #define NB_ITEMS(list) (list ## _size / sizeof(*list)) -@@ -154,6 +159,44 @@ int attribute_align_arg av_buffersink_get_samples(AVFilterContext *ctx, - return get_frame_internal(ctx, frame, 0, nb_samples); - } - -+static AVFrame * alloc_video_buffer(AVFilterLink *link, int w, int h) -+{ -+ AVFilterContext * const ctx = link->dst; -+ BufferSinkContext * const bs = ctx->priv; -+ return bs->alloc_cb.video ? bs->alloc_cb.video(ctx, bs->alloc_v, w, h) : -+ ff_default_get_video_buffer(link, w, h); -+} -+ -+int av_buffersink_set_alloc_video_frame(AVFilterContext *ctx, av_buffersink_alloc_video_frame * cb, void * v) -+{ -+ BufferSinkContext * const bs = ctx->priv; -+ bs->alloc_cb.video = cb; -+ bs->alloc_v = v; -+ return 0; -+} -+ -+#if FF_API_BUFFERSINK_ALLOC -+AVBufferSinkParams *av_buffersink_params_alloc(void) -+{ -+ static const int pixel_fmts[] = { AV_PIX_FMT_NONE }; -+ AVBufferSinkParams *params = av_malloc(sizeof(AVBufferSinkParams)); -+ if (!params) -+ return NULL; -+ -+ params->pixel_fmts = pixel_fmts; -+ return params; -+} -+ -+AVABufferSinkParams *av_abuffersink_params_alloc(void) -+{ -+ AVABufferSinkParams *params = av_mallocz(sizeof(AVABufferSinkParams)); -+ -+ if (!params) -+ return NULL; -+ return params; -+} -+#endif -+ - static av_cold int common_init(AVFilterContext *ctx) - { - BufferSinkContext *buf = ctx->priv; -@@ -381,6 +424,7 @@ static const AVFilterPad avfilter_vsink_buffer_inputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, -+ .get_buffer = {.video = alloc_video_buffer}, - }, - }; - -diff --git a/libavfilter/buffersink.h b/libavfilter/buffersink.h -index 64e08de53e..09737d322f 100644 ---- a/libavfilter/buffersink.h -+++ b/libavfilter/buffersink.h -@@ -166,6 +166,9 @@ int av_buffersink_get_frame(AVFilterContext *ctx, AVFrame *frame); - */ - int av_buffersink_get_samples(AVFilterContext *ctx, AVFrame *frame, int nb_samples); - -+typedef AVFrame * av_buffersink_alloc_video_frame(AVFilterContext * ctx, void * v, int w, int h); -+int av_buffersink_set_alloc_video_frame(AVFilterContext *ctx, av_buffersink_alloc_video_frame * cb, void * v); -+ - /** - * @} - */ - -From a63ae21e74ae48f1aedac53c18142b7596d041ad Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 30 Jan 2023 17:23:12 +0000 -Subject: [PATCH 115/151] v4l2_m2m_dec: Add a profile check - -Check the profile in avctx aginst what the v4l2 driver advertises. If -the driver doesn't support the check then just accept anything. - -(cherry picked from commit 6dd83dead9ebce419fdea152db0c9f5e9a94e9ef) ---- - libavcodec/v4l2_m2m_dec.c | 125 ++++++++++++++++++++++++++++++++++++++ - 1 file changed, 125 insertions(+) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index c8ab883d7e..098adf4821 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -715,6 +715,127 @@ static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - } - #endif - -+static uint32_t -+avprofile_to_v4l2(const enum AVCodecID codec_id, const int avprofile) -+{ -+ switch (codec_id) { -+ case AV_CODEC_ID_H264: -+ switch (avprofile) { -+ case FF_PROFILE_H264_BASELINE: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE; -+ case FF_PROFILE_H264_CONSTRAINED_BASELINE: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE; -+ case FF_PROFILE_H264_MAIN: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_MAIN; -+ case FF_PROFILE_H264_EXTENDED: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED; -+ case FF_PROFILE_H264_HIGH: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH; -+ case FF_PROFILE_H264_HIGH_10: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10; -+ case FF_PROFILE_H264_HIGH_10_INTRA: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA; -+ case FF_PROFILE_H264_MULTIVIEW_HIGH: -+ case FF_PROFILE_H264_HIGH_422: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422; -+ case FF_PROFILE_H264_HIGH_422_INTRA: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA; -+ case FF_PROFILE_H264_STEREO_HIGH: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH; -+ case FF_PROFILE_H264_HIGH_444_PREDICTIVE: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE; -+ case FF_PROFILE_H264_HIGH_444_INTRA: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA; -+ case FF_PROFILE_H264_CAVLC_444: -+ return V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA; -+ case FF_PROFILE_H264_HIGH_444: -+ default: -+ break; -+// V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE = 12, -+// V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH = 13, -+// V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA = 14, -+// V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH = 16, -+// V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH = 17, -+ } -+ break; -+ case AV_CODEC_ID_MPEG2VIDEO: -+ case AV_CODEC_ID_MPEG4: -+ case AV_CODEC_ID_VC1: -+ case AV_CODEC_ID_VP8: -+ case AV_CODEC_ID_VP9: -+ case AV_CODEC_ID_AV1: -+ // Most profiles are a simple number that matches the V4L2 enum -+ return avprofile; -+ default: -+ break; -+ } -+ return ~(uint32_t)0; -+} -+ -+// This check mirrors Chrome's profile check by testing to see if the profile -+// exists as a possible value for the V4L2 profile control -+static int -+check_profile(AVCodecContext *const avctx, V4L2m2mContext *const s) -+{ -+ struct v4l2_queryctrl query_ctrl; -+ struct v4l2_querymenu query_menu; -+ uint32_t profile_id; -+ -+ // An unset profile is almost certainly zero or -99 - do not reject -+ if (avctx->profile <= 0) { -+ av_log(avctx, AV_LOG_VERBOSE, "Profile <= 0 - check skipped\n"); -+ return 0; -+ } -+ -+ memset(&query_ctrl, 0, sizeof(query_ctrl)); -+ switch (avctx->codec_id) { -+ case AV_CODEC_ID_MPEG2VIDEO: -+ profile_id = V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE; -+ break; -+ case AV_CODEC_ID_MPEG4: -+ profile_id = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE; -+ break; -+ case AV_CODEC_ID_H264: -+ profile_id = V4L2_CID_MPEG_VIDEO_H264_PROFILE; -+ break; -+ case AV_CODEC_ID_VP8: -+ profile_id = V4L2_CID_MPEG_VIDEO_VP8_PROFILE; -+ break; -+ case AV_CODEC_ID_VP9: -+ profile_id = V4L2_CID_MPEG_VIDEO_VP9_PROFILE; -+ break; -+#ifdef V4L2_CID_MPEG_VIDEO_AV1_PROFILE -+ case AV_CODEC_ID_AV1: -+ profile_id = V4L2_CID_MPEG_VIDEO_AV1_PROFILE; -+ break; -+#endif -+ default: -+ av_log(avctx, AV_LOG_VERBOSE, "Can't map profile for codec id %d; profile check skipped\n", avctx->codec_id); -+ return 0; -+ } -+ -+ query_ctrl = (struct v4l2_queryctrl){.id = profile_id}; -+ if (ioctl(s->fd, VIDIOC_QUERYCTRL, &query_ctrl) != 0) { -+ av_log(avctx, AV_LOG_VERBOSE, "Query profile ctrl (%#x) not supported: assume OK\n", query_ctrl.id); -+ } -+ else { -+ av_log(avctx, AV_LOG_DEBUG, "%s: Control supported: %#x\n", __func__, query_ctrl.id); -+ -+ query_menu = (struct v4l2_querymenu){ -+ .id = query_ctrl.id, -+ .index = avprofile_to_v4l2(avctx->codec_id, avctx->profile), -+ }; -+ -+ if (query_menu.index > query_ctrl.maximum || -+ query_menu.index < query_ctrl.minimum || -+ ioctl(s->fd, VIDIOC_QUERYMENU, &query_menu) != 0) { -+ return AVERROR(ENOENT); -+ } -+ } -+ -+ return 0; -+}; -+ - static int - check_size(AVCodecContext * const avctx, V4L2m2mContext * const s) - { -@@ -955,6 +1076,10 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - if ((ret = check_size(avctx, s)) != 0) - return ret; - -+ if ((ret = check_profile(avctx, s)) != 0) { -+ av_log(avctx, AV_LOG_WARNING, "Profile %d not supported by decode\n", avctx->profile); -+ return ret; -+ } - return 0; - } - - -From f734a6ead04a8381fccfae53066866a02a9516d2 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 1 Feb 2023 17:24:39 +0000 -Subject: [PATCH 116/151] v4l2_m2m_dec: Add extradata parse for h264 & hevc - -If we have extradata we can extract profile & level and potentailly -other useful info from it. Use the codec parser to get it if the decoder -is configured. - -(cherry picked from commit 6d431e79adeb246c2ed8cebce9011d81175a3906) ---- - libavcodec/v4l2_m2m_dec.c | 84 ++++++++++++++++++++++++++++++++++++++- - 1 file changed, 83 insertions(+), 1 deletion(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 098adf4821..e64bc707d3 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -21,6 +21,8 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -+#include "config.h" -+ - #include - #include - -@@ -43,6 +45,13 @@ - #include "v4l2_fmt.h" - #include "v4l2_req_dmabufs.h" - -+#if CONFIG_H264_DECODER -+#include "h264_parse.h" -+#endif -+#if CONFIG_HEVC_DECODER -+#include "hevc_parse.h" -+#endif -+ - // Pick 64 for max last count - that is >1sec at 60fps - #define STATS_LAST_COUNT_MAX 64 - #define STATS_INTERVAL_MAX (1 << 30) -@@ -956,6 +965,78 @@ static uint32_t max_coded_size(const AVCodecContext * const avctx) - return size + (1 << 16); - } - -+static void -+parse_extradata(AVCodecContext *avctx) -+{ -+ if (!avctx->extradata || !avctx->extradata_size) -+ return; -+ -+ switch (avctx->codec_id) { -+#if CONFIG_H264_DECODER -+ case AV_CODEC_ID_H264: -+ { -+ H264ParamSets ps = {{NULL}}; -+ int is_avc = 0; -+ int nal_length_size = 0; -+ int ret; -+ -+ ret = ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, -+ &ps, &is_avc, &nal_length_size, -+ avctx->err_recognition, avctx); -+ if (ret > 0) { -+ const SPS * sps = NULL; -+ unsigned int i; -+ for (i = 0; i != MAX_SPS_COUNT; ++i) { -+ if (ps.sps_list[i]) { -+ sps = (const SPS *)ps.sps_list[i]->data; -+ break; -+ } -+ } -+ if (sps) { -+ avctx->profile = ff_h264_get_profile(sps); -+ avctx->level = sps->level_idc; -+ } -+ } -+ ff_h264_ps_uninit(&ps); -+ break; -+ } -+#endif -+#if CONFIG_HEVC_DECODER -+ case AV_CODEC_ID_HEVC: -+ { -+ HEVCParamSets ps = {{NULL}}; -+ HEVCSEI sei = {{{{0}}}}; -+ int is_nalff = 0; -+ int nal_length_size = 0; -+ int ret; -+ -+ ret = ff_hevc_decode_extradata(avctx->extradata, avctx->extradata_size, -+ &ps, &sei, &is_nalff, &nal_length_size, -+ avctx->err_recognition, 0, avctx); -+ if (ret > 0) { -+ const HEVCSPS * sps = NULL; -+ unsigned int i; -+ for (i = 0; i != HEVC_MAX_SPS_COUNT; ++i) { -+ if (ps.sps_list[i]) { -+ sps = (const HEVCSPS *)ps.sps_list[i]->data; -+ break; -+ } -+ } -+ if (sps) { -+ avctx->profile = sps->ptl.general_ptl.profile_idc; -+ avctx->level = sps->ptl.general_ptl.level_idc; -+ } -+ } -+ ff_hevc_ps_uninit(&ps); -+ ff_hevc_reset_sei(&sei); -+ break; -+ } -+#endif -+ default: -+ break; -+ } -+} -+ - static av_cold int v4l2_decode_init(AVCodecContext *avctx) - { - V4L2Context *capture, *output; -@@ -976,7 +1057,8 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - avctx->ticks_per_frame = 2; - } - -- av_log(avctx, AV_LOG_INFO, "level=%d\n", avctx->level); -+ parse_extradata(avctx); -+ - ret = ff_v4l2_m2m_create_context(priv, &s); - if (ret < 0) - return ret; - -From e28421e397743a94f5e37327ad234f59b6ae613d Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 20 Mar 2023 18:12:51 +0000 -Subject: [PATCH 117/151] clean_usr_libs: Now wipes the include files too - -When swapping ffmpeg versions obsolete makefiles could confuse -configure utilities. ---- - pi-util/clean_usr_libs.sh | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/pi-util/clean_usr_libs.sh b/pi-util/clean_usr_libs.sh -index b3b2d5509d..01bd6a6a22 100755 ---- a/pi-util/clean_usr_libs.sh -+++ b/pi-util/clean_usr_libs.sh -@@ -1,4 +1,20 @@ - set -e -+U=/usr/include/arm-linux-gnueabihf -+rm -rf $U/libavcodec -+rm -rf $U/libavdevice -+rm -rf $U/libavfilter -+rm -rf $U/libavformat -+rm -rf $U/libavutil -+rm -rf $U/libswresample -+rm -rf $U/libswscale -+U=/usr/include/aarch64-linux-gnu -+rm -rf $U/libavcodec -+rm -rf $U/libavdevice -+rm -rf $U/libavfilter -+rm -rf $U/libavformat -+rm -rf $U/libavutil -+rm -rf $U/libswresample -+rm -rf $U/libswscale - U=/usr/lib/arm-linux-gnueabihf - rm -f $U/libavcodec.* - rm -f $U/libavdevice.* - -From dcabd30310b88b45359609bac27d5d0f9bbc6dc1 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 20 Mar 2023 18:15:08 +0000 -Subject: [PATCH 118/151] vulkan: Add missing decode extension defines - -When building on bookworm the video decode extension names -were missing. This adds them. I expect this patch will be -obsolete shortly but it solves a current problem. ---- - libavutil/hwcontext_vulkan.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c -index 2a9b5f4aac..11e7945f18 100644 ---- a/libavutil/hwcontext_vulkan.c -+++ b/libavutil/hwcontext_vulkan.c -@@ -57,6 +57,14 @@ - #define CHECK_CU(x) FF_CUDA_CHECK_DL(cuda_cu, cu, x) - #endif - -+// Sometimes missing definitions -+#ifndef VK_EXT_VIDEO_DECODE_H264_EXTENSION_NAME -+#define VK_EXT_VIDEO_DECODE_H264_EXTENSION_NAME "VK_EXT_video_decode_h264" -+#endif -+#ifndef VK_EXT_VIDEO_DECODE_H265_EXTENSION_NAME -+#define VK_EXT_VIDEO_DECODE_H265_EXTENSION_NAME "VK_EXT_video_decode_h265" -+#endif -+ - typedef struct VulkanQueueCtx { - VkFence fence; - VkQueue queue; - -From 0231c208843a5badc799590eb5b9de907d1c26b2 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 21 Mar 2023 14:20:05 +0000 -Subject: [PATCH 119/151] v4l2_m2m_dec: Fix config file for finding if decoder - enabled - -Fixes parsing of extradata for profile testing. 5.x changed where that -info is defined. ---- - libavcodec/v4l2_m2m_dec.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index e64bc707d3..91136f03da 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -21,7 +21,7 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - --#include "config.h" -+#include "config_components.h" - - #include - #include - -From 822baefed69372b3380144ab44226e2c6ad3e298 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 21 Mar 2023 14:23:20 +0000 -Subject: [PATCH 120/151] v4l2_m2m_dec: Display profile given if skipped in - debug - ---- - libavcodec/v4l2_m2m_dec.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 91136f03da..d124c7b1fc 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -792,7 +792,7 @@ check_profile(AVCodecContext *const avctx, V4L2m2mContext *const s) - - // An unset profile is almost certainly zero or -99 - do not reject - if (avctx->profile <= 0) { -- av_log(avctx, AV_LOG_VERBOSE, "Profile <= 0 - check skipped\n"); -+ av_log(avctx, AV_LOG_VERBOSE, "Profile %d <= 0 - check skipped\n", avctx->profile); - return 0; - } - - -From 6859fc2a8791c0fcc25851b77fed15a691ceb332 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 22 Mar 2023 16:08:08 +0000 -Subject: [PATCH 121/151] conf_native: Fix for 64-bit kernel with 32-bit - userspace - -(cherry picked from commit 5bb1e09cea95b4215c6904b9b1a726e83bc5d327) ---- - pi-util/conf_native.sh | 32 +++++++++++++++++++++----------- - 1 file changed, 21 insertions(+), 11 deletions(-) - -diff --git a/pi-util/conf_native.sh b/pi-util/conf_native.sh -index 082d9b5832..0a7d230f1b 100755 ---- a/pi-util/conf_native.sh -+++ b/pi-util/conf_native.sh -@@ -33,18 +33,28 @@ RPI_LIBDIRS= - RPI_DEFINES= - RPI_EXTRALIBS= - --if [ "$MC" == "arm64" ]; then -- echo "M/C aarch64" -- A=aarch64-linux-gnu -- B=arm64 --elif [ "$MC" == "armhf" ]; then -- echo "M/C armv7" -- A=arm-linux-gnueabihf -- B=armv7 -- MCOPTS="--arch=armv6t2 --cpu=cortex-a7" -- RPI_DEFINES=-mfpu=neon-vfpv4 -+# uname -m gives kernel type which may not have the same -+# 32/64bitness as userspace :-( getconf shoudl provide the answer -+# but use uname to check we are on the right processor -+MC=`uname -m` -+LB=`getconf LONG_BIT` -+if [ "$MC" == "armv7l" ] || [ "$MC" == "aarch64" ]; then -+ if [ "$LB" == "32" ]; then -+ echo "M/C armv7" -+ A=arm-linux-gnueabihf -+ B=armv7 -+ MCOPTS="--arch=armv6t2 --cpu=cortex-a7" -+ RPI_DEFINES=-mfpu=neon-vfpv4 -+ elif [ "$LB" == "64" ]; then -+ echo "M/C aarch64" -+ A=aarch64-linux-gnu -+ B=arm64 -+ else -+ echo "Unknown LONG_BIT name: $LB" -+ exit 1 -+ fi - else -- echo Unexpected architecture $MC -+ echo "Unknown machine name: $MC" - exit 1 - fi - - -From c35f074854a922c0c025159ddddd1abfc562a3d2 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 20 Apr 2023 11:48:25 +0000 -Subject: [PATCH 122/151] conf_native: Add install prefix variation - -(cherry picked from commit 73c3019b534cb8f4b4e4c21995653f6ce440086d) ---- - pi-util/BUILD.txt | 32 ++++++++++++++++++++------------ - pi-util/conf_native.sh | 14 ++++++++++++-- - 2 files changed, 32 insertions(+), 14 deletions(-) - -diff --git a/pi-util/BUILD.txt b/pi-util/BUILD.txt -index b050971f63..2b62d660c0 100644 ---- a/pi-util/BUILD.txt -+++ b/pi-util/BUILD.txt -@@ -24,6 +24,8 @@ There are a few choices here - paths being confused and therefore running the wrong code, Shared - is what is needed, in most cases, when building for use by other - programs. -+ --usr Set install dir to /usr (i.e. system default) rather than in -+ /install - - So for a static build - --------------------- -@@ -37,23 +39,29 @@ You can now run ffmpeg directly from where it was built - For a shared build - ------------------ - --$ pi-util/conf_native.sh -- --You will normally want an install target if shared. Note that the script has --set this up to be generated in out//install, you don't have to worry --about overwriting your system libs. -+There are two choices here - -+$ pi-util/conf_native.sh - $ make -j8 -C out/ install - --You can now set LD_LIBRARY_PATH appropriately and run ffmpeg from where it was --built or install the image on the system - you have to be careful to get rid --of all other ffmpeg libs or confusion may result. There is a little script --that wipes all other versions - obviously use with care! -+This sets the install prefix to /install and is probably what you -+want if you don't want to overwrite the system files. - --$ sudo pi-util/clean_usr_libs.sh -+You can now set LD_LIBRARY_PATH appropriately and run ffmpeg from where it was -+built. You can copy the contents of /install to /usr and that mostly -+works. The only downside is that paths in pkgconfig end up being set to the -+install directory in your build directory which may be less than ideal when -+building other packages. - --Then simply copying from the install to /usr works -+The alternative if you just want to replace the system libs is: - --$ sudo cp -r out//install/* /usr -+$ pi-util/conf_native.sh --usr -+$ make -j8 -C out/ -+$ sudo pi-util/clean_usr_libs.sh -+$ sudo make -j8 -C out/ install - -+The clean_usr_libs.sh step wipes any existing libs & includes (for all -+architectures) from the system which helps avoid confusion when running other -+progs as you can be sure you're not running old code which is unfortunately -+easy to do otherwise. - -diff --git a/pi-util/conf_native.sh b/pi-util/conf_native.sh -index 0a7d230f1b..f0ed159594 100755 ---- a/pi-util/conf_native.sh -+++ b/pi-util/conf_native.sh -@@ -9,6 +9,7 @@ RPI_KEEPS="" - - NOSHARED= - MMAL= -+USR_PREFIX= - - while [ "$1" != "" ] ; do - case $1 in -@@ -18,8 +19,14 @@ while [ "$1" != "" ] ; do - --mmal) - MMAL=1 - ;; -+ --usr) -+ USR_PREFIX=/usr -+ ;; - *) -- echo "Usage $0: [--noshared] [--mmal]" -+ echo "Usage $0: [--noshared] [--mmal] [--usr]" -+ echo " noshared Build static libs and executable - good for testing" -+ echo " mmal Build mmal decoders" -+ echo " usr Set install prefix to /usr [default=/install]" - exit 1 - ;; - esac -@@ -82,7 +89,9 @@ else - OUT=$BUILDBASE/$B-$C-$V-shared-rel - fi - --USR_PREFIX=$OUT/install -+if [ ! $USR_PREFIX ]; then -+ USR_PREFIX=$OUT/install -+fi - LIB_PREFIX=$USR_PREFIX/lib/$A - INC_PREFIX=$USR_PREFIX/include/$A - -@@ -113,6 +122,7 @@ $FFSRC/configure \ - --extra-libs="$RPI_EXTRALIBS"\ - --extra-version="rpi" - -+echo "Configured into $OUT" - - # gcc option for getting asm listing - # -Wa,-ahls - -From 91ea652a95370a428f1353932b2a55dae7158acc Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 19 Apr 2023 10:47:58 +0000 -Subject: [PATCH 123/151] swcale: Add explicit bgr24->yv12 conversion - -(cherry picked from commit 9a22d429f46a038321c66a0cd54737177641b434) ---- - libswscale/rgb2rgb.c | 5 +++++ - libswscale/rgb2rgb.h | 7 +++++++ - libswscale/rgb2rgb_template.c | 36 ++++++++++++++++++++++++++++++----- - libswscale/swscale_unscaled.c | 22 +++++++++++++++++++++ - 4 files changed, 65 insertions(+), 5 deletions(-) - -diff --git a/libswscale/rgb2rgb.c b/libswscale/rgb2rgb.c -index e98fdac8ea..84bb56e60e 100644 ---- a/libswscale/rgb2rgb.c -+++ b/libswscale/rgb2rgb.c -@@ -83,6 +83,11 @@ void (*ff_rgb24toyv12)(const uint8_t *src, uint8_t *ydst, - int width, int height, - int lumStride, int chromStride, int srcStride, - int32_t *rgb2yuv); -+void (*ff_bgr24toyv12)(const uint8_t *src, uint8_t *ydst, -+ uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); - void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height, - int srcStride, int dstStride); - void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst, -diff --git a/libswscale/rgb2rgb.h b/libswscale/rgb2rgb.h -index f3951d523e..0028ab345f 100644 ---- a/libswscale/rgb2rgb.h -+++ b/libswscale/rgb2rgb.h -@@ -79,6 +79,9 @@ void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size); - void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - uint8_t *vdst, int width, int height, int lumStride, - int chromStride, int srcStride, int32_t *rgb2yuv); -+void ff_bgr24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv); - - /** - * Height should be a multiple of 2 and width should be a multiple of 16. -@@ -128,6 +131,10 @@ extern void (*ff_rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - int width, int height, - int lumStride, int chromStride, int srcStride, - int32_t *rgb2yuv); -+extern void (*ff_bgr24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); - extern void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height, - int srcStride, int dstStride); - -diff --git a/libswscale/rgb2rgb_template.c b/libswscale/rgb2rgb_template.c -index 42c69801ba..e2437826dd 100644 ---- a/libswscale/rgb2rgb_template.c -+++ b/libswscale/rgb2rgb_template.c -@@ -646,13 +646,14 @@ static inline void uyvytoyv12_c(const uint8_t *src, uint8_t *ydst, - * others are ignored in the C version. - * FIXME: Write HQ version. - */ --void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+static void rgb24toyv12_x(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - uint8_t *vdst, int width, int height, int lumStride, -- int chromStride, int srcStride, int32_t *rgb2yuv) -+ int chromStride, int srcStride, int32_t *rgb2yuv, -+ const uint8_t x[9]) - { -- int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX]; -- int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX]; -- int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX]; -+ int32_t ry = rgb2yuv[x[0]], gy = rgb2yuv[x[1]], by = rgb2yuv[x[2]]; -+ int32_t ru = rgb2yuv[x[3]], gu = rgb2yuv[x[4]], bu = rgb2yuv[x[5]]; -+ int32_t rv = rgb2yuv[x[6]], gv = rgb2yuv[x[7]], bv = rgb2yuv[x[8]]; - int y; - const int chromWidth = width >> 1; - -@@ -707,6 +708,30 @@ void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - } - } - -+void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv) -+{ -+ static const uint8_t x[9] = { -+ RY_IDX, GY_IDX, BY_IDX, -+ RU_IDX, GU_IDX, BU_IDX, -+ RV_IDX, GV_IDX, BV_IDX, -+ }; -+ rgb24toyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x); -+} -+ -+void ff_bgr24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv) -+{ -+ static const uint8_t x[9] = { -+ BY_IDX, GY_IDX, RY_IDX, -+ BU_IDX, GU_IDX, RU_IDX, -+ BV_IDX, GV_IDX, RV_IDX, -+ }; -+ rgb24toyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x); -+} -+ - static void interleaveBytes_c(const uint8_t *src1, const uint8_t *src2, - uint8_t *dest, int width, int height, - int src1Stride, int src2Stride, int dstStride) -@@ -980,6 +1005,7 @@ static av_cold void rgb2rgb_init_c(void) - yuy2toyv12 = yuy2toyv12_c; - planar2x = planar2x_c; - ff_rgb24toyv12 = ff_rgb24toyv12_c; -+ ff_bgr24toyv12 = ff_bgr24toyv12_c; - interleaveBytes = interleaveBytes_c; - deinterleaveBytes = deinterleaveBytes_c; - vu9_to_vu12 = vu9_to_vu12_c; -diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c -index 9af2e7ecc3..9047030ae4 100644 ---- a/libswscale/swscale_unscaled.c -+++ b/libswscale/swscale_unscaled.c -@@ -1654,6 +1654,23 @@ static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t *src[], - return srcSliceH; - } - -+static int rgb24ToYv12Wrapper(SwsContext *c, const uint8_t *src[], -+ int srcStride[], int srcSliceY, int srcSliceH, -+ uint8_t *dst[], int dstStride[]) -+{ -+ ff_bgr24toyv12( -+ src[0], -+ dst[0] + srcSliceY * dstStride[0], -+ dst[1] + (srcSliceY >> 1) * dstStride[1], -+ dst[2] + (srcSliceY >> 1) * dstStride[2], -+ c->srcW, srcSliceH, -+ dstStride[0], dstStride[1], srcStride[0], -+ c->input_rgb2yuv_table); -+ if (dst[3]) -+ fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); -+ return srcSliceH; -+} -+ - static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t *src[], - int srcStride[], int srcSliceY, int srcSliceH, - uint8_t *dst[], int dstStride[]) -@@ -2037,6 +2054,11 @@ void ff_get_unscaled_swscale(SwsContext *c) - (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P) && - !(flags & SWS_ACCURATE_RND) && !(dstW&1)) - c->convert_unscaled = bgr24ToYv12Wrapper; -+ /* rgb24toYV12 */ -+ if (srcFormat == AV_PIX_FMT_RGB24 && -+ (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P) && -+ !(flags & SWS_ACCURATE_RND) && !(dstW&1)) -+ c->convert_unscaled = rgb24ToYv12Wrapper; - - /* RGB/BGR -> RGB/BGR (no dither needed forms) */ - if (isAnyRGB(srcFormat) && isAnyRGB(dstFormat) && findRgbConvFn(c) - -From 207ea47b2153b276b53cd5a87528dbc532a9f551 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 20 Apr 2023 11:26:10 +0000 -Subject: [PATCH 124/151] swscale: Add unscaled XRGB->YUV420P functions - -(cherry picked from commit 04cc32ee3f390de513ad8c6156c0c66b2c60abc8) ---- - libswscale/rgb2rgb.c | 20 ++++++ - libswscale/rgb2rgb.h | 16 +++++ - libswscale/rgb2rgb_template.c | 123 ++++++++++++++++++++++++++++++---- - libswscale/swscale_unscaled.c | 89 ++++++++++++++++++++++++ - 4 files changed, 236 insertions(+), 12 deletions(-) - -diff --git a/libswscale/rgb2rgb.c b/libswscale/rgb2rgb.c -index 84bb56e60e..c3b9079d2b 100644 ---- a/libswscale/rgb2rgb.c -+++ b/libswscale/rgb2rgb.c -@@ -88,6 +88,26 @@ void (*ff_bgr24toyv12)(const uint8_t *src, uint8_t *ydst, - int width, int height, - int lumStride, int chromStride, int srcStride, - int32_t *rgb2yuv); -+void (*ff_rgbxtoyv12)(const uint8_t *src, uint8_t *ydst, -+ uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); -+void (*ff_bgrxtoyv12)(const uint8_t *src, uint8_t *ydst, -+ uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); -+void (*ff_xrgbtoyv12)(const uint8_t *src, uint8_t *ydst, -+ uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); -+void (*ff_xbgrtoyv12)(const uint8_t *src, uint8_t *ydst, -+ uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); - void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height, - int srcStride, int dstStride); - void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst, -diff --git a/libswscale/rgb2rgb.h b/libswscale/rgb2rgb.h -index 0028ab345f..a0dd3ffb79 100644 ---- a/libswscale/rgb2rgb.h -+++ b/libswscale/rgb2rgb.h -@@ -135,6 +135,22 @@ extern void (*ff_bgr24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - int width, int height, - int lumStride, int chromStride, int srcStride, - int32_t *rgb2yuv); -+extern void (*ff_rgbxtoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); -+extern void (*ff_bgrxtoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); -+extern void (*ff_xrgbtoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); -+extern void (*ff_xbgrtoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, -+ int width, int height, -+ int lumStride, int chromStride, int srcStride, -+ int32_t *rgb2yuv); - extern void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height, - int srcStride, int dstStride); - -diff --git a/libswscale/rgb2rgb_template.c b/libswscale/rgb2rgb_template.c -index e2437826dd..703de90690 100644 ---- a/libswscale/rgb2rgb_template.c -+++ b/libswscale/rgb2rgb_template.c -@@ -708,30 +708,125 @@ static void rgb24toyv12_x(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - } - } - -+static const uint8_t x_rgb[9] = { -+ RY_IDX, GY_IDX, BY_IDX, -+ RU_IDX, GU_IDX, BU_IDX, -+ RV_IDX, GV_IDX, BV_IDX, -+}; -+ -+static const uint8_t x_bgr[9] = { -+ BY_IDX, GY_IDX, RY_IDX, -+ BU_IDX, GU_IDX, RU_IDX, -+ BV_IDX, GV_IDX, RV_IDX, -+}; -+ - void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - uint8_t *vdst, int width, int height, int lumStride, - int chromStride, int srcStride, int32_t *rgb2yuv) - { -- static const uint8_t x[9] = { -- RY_IDX, GY_IDX, BY_IDX, -- RU_IDX, GU_IDX, BU_IDX, -- RV_IDX, GV_IDX, BV_IDX, -- }; -- rgb24toyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x); -+ rgb24toyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_rgb); - } - - void ff_bgr24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - uint8_t *vdst, int width, int height, int lumStride, - int chromStride, int srcStride, int32_t *rgb2yuv) - { -- static const uint8_t x[9] = { -- BY_IDX, GY_IDX, RY_IDX, -- BU_IDX, GU_IDX, RU_IDX, -- BV_IDX, GV_IDX, RV_IDX, -- }; -- rgb24toyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x); -+ rgb24toyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_bgr); - } - -+static void rgbxtoyv12_x(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv, -+ const uint8_t x[9]) -+{ -+ int32_t ry = rgb2yuv[x[0]], gy = rgb2yuv[x[1]], by = rgb2yuv[x[2]]; -+ int32_t ru = rgb2yuv[x[3]], gu = rgb2yuv[x[4]], bu = rgb2yuv[x[5]]; -+ int32_t rv = rgb2yuv[x[6]], gv = rgb2yuv[x[7]], bv = rgb2yuv[x[8]]; -+ int y; -+ const int chromWidth = width >> 1; -+ -+ for (y = 0; y < height; y += 2) { -+ int i; -+ for (i = 0; i < chromWidth; i++) { -+ unsigned int b = src[8 * i + 2]; -+ unsigned int g = src[8 * i + 1]; -+ unsigned int r = src[8 * i + 0]; -+ -+ unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; -+ unsigned int V = ((rv * r + gv * g + bv * b) >> RGB2YUV_SHIFT) + 128; -+ unsigned int U = ((ru * r + gu * g + bu * b) >> RGB2YUV_SHIFT) + 128; -+ -+ udst[i] = U; -+ vdst[i] = V; -+ ydst[2 * i] = Y; -+ -+ b = src[8 * i + 6]; -+ g = src[8 * i + 5]; -+ r = src[8 * i + 4]; -+ -+ Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; -+ ydst[2 * i + 1] = Y; -+ } -+ ydst += lumStride; -+ src += srcStride; -+ -+ if (y+1 == height) -+ break; -+ -+ for (i = 0; i < chromWidth; i++) { -+ unsigned int b = src[8 * i + 2]; -+ unsigned int g = src[8 * i + 1]; -+ unsigned int r = src[8 * i + 0]; -+ -+ unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; -+ -+ ydst[2 * i] = Y; -+ -+ b = src[8 * i + 6]; -+ g = src[8 * i + 5]; -+ r = src[8 * i + 4]; -+ -+ Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; -+ ydst[2 * i + 1] = Y; -+ } -+ udst += chromStride; -+ vdst += chromStride; -+ ydst += lumStride; -+ src += srcStride; -+ } -+} -+ -+static void ff_rgbxtoyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv) -+{ -+ rgbxtoyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_rgb); -+} -+ -+static void ff_bgrxtoyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv) -+{ -+ rgbxtoyv12_x(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_bgr); -+} -+ -+// As the general code does no SIMD-like ops simply adding 1 to the src address -+// will fix the ignored alpha position -+static void ff_xrgbtoyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv) -+{ -+ rgbxtoyv12_x(src + 1, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_rgb); -+} -+ -+static void ff_xbgrtoyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv) -+{ -+ rgbxtoyv12_x(src + 1, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv, x_bgr); -+} -+ -+ - static void interleaveBytes_c(const uint8_t *src1, const uint8_t *src2, - uint8_t *dest, int width, int height, - int src1Stride, int src2Stride, int dstStride) -@@ -1006,6 +1101,10 @@ static av_cold void rgb2rgb_init_c(void) - planar2x = planar2x_c; - ff_rgb24toyv12 = ff_rgb24toyv12_c; - ff_bgr24toyv12 = ff_bgr24toyv12_c; -+ ff_rgbxtoyv12 = ff_rgbxtoyv12_c; -+ ff_bgrxtoyv12 = ff_bgrxtoyv12_c; -+ ff_xrgbtoyv12 = ff_xrgbtoyv12_c; -+ ff_xbgrtoyv12 = ff_xbgrtoyv12_c; - interleaveBytes = interleaveBytes_c; - deinterleaveBytes = deinterleaveBytes_c; - vu9_to_vu12 = vu9_to_vu12_c; -diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c -index 9047030ae4..053c06adf5 100644 ---- a/libswscale/swscale_unscaled.c -+++ b/libswscale/swscale_unscaled.c -@@ -1671,6 +1671,74 @@ static int rgb24ToYv12Wrapper(SwsContext *c, const uint8_t *src[], - return srcSliceH; - } - -+static int bgrxToYv12Wrapper(SwsContext *c, const uint8_t *src[], -+ int srcStride[], int srcSliceY, int srcSliceH, -+ uint8_t *dst[], int dstStride[]) -+{ -+ ff_bgrxtoyv12( -+ src[0], -+ dst[0] + srcSliceY * dstStride[0], -+ dst[1] + (srcSliceY >> 1) * dstStride[1], -+ dst[2] + (srcSliceY >> 1) * dstStride[2], -+ c->srcW, srcSliceH, -+ dstStride[0], dstStride[1], srcStride[0], -+ c->input_rgb2yuv_table); -+ if (dst[3]) -+ fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); -+ return srcSliceH; -+} -+ -+static int rgbxToYv12Wrapper(SwsContext *c, const uint8_t *src[], -+ int srcStride[], int srcSliceY, int srcSliceH, -+ uint8_t *dst[], int dstStride[]) -+{ -+ ff_rgbxtoyv12( -+ src[0], -+ dst[0] + srcSliceY * dstStride[0], -+ dst[1] + (srcSliceY >> 1) * dstStride[1], -+ dst[2] + (srcSliceY >> 1) * dstStride[2], -+ c->srcW, srcSliceH, -+ dstStride[0], dstStride[1], srcStride[0], -+ c->input_rgb2yuv_table); -+ if (dst[3]) -+ fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); -+ return srcSliceH; -+} -+ -+static int xbgrToYv12Wrapper(SwsContext *c, const uint8_t *src[], -+ int srcStride[], int srcSliceY, int srcSliceH, -+ uint8_t *dst[], int dstStride[]) -+{ -+ ff_xbgrtoyv12( -+ src[0], -+ dst[0] + srcSliceY * dstStride[0], -+ dst[1] + (srcSliceY >> 1) * dstStride[1], -+ dst[2] + (srcSliceY >> 1) * dstStride[2], -+ c->srcW, srcSliceH, -+ dstStride[0], dstStride[1], srcStride[0], -+ c->input_rgb2yuv_table); -+ if (dst[3]) -+ fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); -+ return srcSliceH; -+} -+ -+static int xrgbToYv12Wrapper(SwsContext *c, const uint8_t *src[], -+ int srcStride[], int srcSliceY, int srcSliceH, -+ uint8_t *dst[], int dstStride[]) -+{ -+ ff_xrgbtoyv12( -+ src[0], -+ dst[0] + srcSliceY * dstStride[0], -+ dst[1] + (srcSliceY >> 1) * dstStride[1], -+ dst[2] + (srcSliceY >> 1) * dstStride[2], -+ c->srcW, srcSliceH, -+ dstStride[0], dstStride[1], srcStride[0], -+ c->input_rgb2yuv_table); -+ if (dst[3]) -+ fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); -+ return srcSliceH; -+} -+ - static int yvu9ToYv12Wrapper(SwsContext *c, const uint8_t *src[], - int srcStride[], int srcSliceY, int srcSliceH, - uint8_t *dst[], int dstStride[]) -@@ -2060,6 +2128,27 @@ void ff_get_unscaled_swscale(SwsContext *c) - !(flags & SWS_ACCURATE_RND) && !(dstW&1)) - c->convert_unscaled = rgb24ToYv12Wrapper; - -+ /* bgrxtoYV12 */ -+ if (((srcFormat == AV_PIX_FMT_BGRA && dstFormat == AV_PIX_FMT_YUV420P) || -+ (srcFormat == AV_PIX_FMT_BGR0 && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && -+ !(flags & SWS_ACCURATE_RND)) -+ c->convert_unscaled = bgrxToYv12Wrapper; -+ /* rgbx24toYV12 */ -+ if (((srcFormat == AV_PIX_FMT_RGBA && dstFormat == AV_PIX_FMT_YUV420P) || -+ (srcFormat == AV_PIX_FMT_RGB0 && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && -+ !(flags & SWS_ACCURATE_RND) && !(dstW&1)) -+ c->convert_unscaled = rgbxToYv12Wrapper; -+ /* xbgrtoYV12 */ -+ if (((srcFormat == AV_PIX_FMT_ABGR && dstFormat == AV_PIX_FMT_YUV420P) || -+ (srcFormat == AV_PIX_FMT_0BGR && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && -+ !(flags & SWS_ACCURATE_RND) && !(dstW&1)) -+ c->convert_unscaled = xbgrToYv12Wrapper; -+ /* xrgb24toYV12 */ -+ if (((srcFormat == AV_PIX_FMT_ARGB && dstFormat == AV_PIX_FMT_YUV420P) || -+ (srcFormat == AV_PIX_FMT_0RGB && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && -+ !(flags & SWS_ACCURATE_RND) && !(dstW&1)) -+ c->convert_unscaled = xrgbToYv12Wrapper; -+ - /* RGB/BGR -> RGB/BGR (no dither needed forms) */ - if (isAnyRGB(srcFormat) && isAnyRGB(dstFormat) && findRgbConvFn(c) - && (!needsDither || (c->flags&(SWS_FAST_BILINEAR|SWS_POINT)))) - -From b5672a2d361ec4f064ae116a3452282996cc87a0 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 20 Apr 2023 11:35:44 +0000 -Subject: [PATCH 125/151] swscale: Add aarch64 unscaled RGB24->YUV420P - -(cherry picked from commit 0cf416312095ce5bea3d2f7e9b14736d4b3ed160) ---- - libswscale/aarch64/rgb2rgb.c | 40 +++++++ - libswscale/aarch64/rgb2rgb_neon.S | 181 ++++++++++++++++++++++++++++++ - 2 files changed, 221 insertions(+) - -diff --git a/libswscale/aarch64/rgb2rgb.c b/libswscale/aarch64/rgb2rgb.c -index a9bf6ff9e0..6d3e0000dc 100644 ---- a/libswscale/aarch64/rgb2rgb.c -+++ b/libswscale/aarch64/rgb2rgb.c -@@ -30,6 +30,44 @@ - void ff_interleave_bytes_neon(const uint8_t *src1, const uint8_t *src2, - uint8_t *dest, int width, int height, - int src1Stride, int src2Stride, int dstStride); -+void ff_bgr24toyv12_aarch64(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv); -+void ff_rgb24toyv12_aarch64(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv); -+ -+// RGB to YUV asm fns process 16 pixels at once so ensure that the output -+// will fit into the stride. ARM64 should cope with unaligned SIMD r/w so -+// don't test for that -+// Fall back to C if we cannot use asm -+ -+static inline int chkw(const int width, const int lumStride, const int chromStride) -+{ -+ const int aw = FFALIGN(width, 16); -+ return aw <= FFABS(lumStride) && aw <= FFABS(chromStride) * 2; -+} -+ -+static void rgb24toyv12_check(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *rgb2yuv) -+{ -+ if (chkw(width, lumStride, chromStride)) -+ ff_rgb24toyv12_aarch64(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv); -+ else -+ ff_rgb24toyv12_c(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv); -+} -+ -+static void bgr24toyv12_check(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -+ uint8_t *vdst, int width, int height, int lumStride, -+ int chromStride, int srcStride, int32_t *bgr2yuv) -+{ -+ if (chkw(width, lumStride, chromStride)) -+ ff_bgr24toyv12_aarch64(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, bgr2yuv); -+ else -+ ff_bgr24toyv12_c(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, bgr2yuv); -+} -+ - - av_cold void rgb2rgb_init_aarch64(void) - { -@@ -37,5 +75,7 @@ av_cold void rgb2rgb_init_aarch64(void) - - if (have_neon(cpu_flags)) { - interleaveBytes = ff_interleave_bytes_neon; -+ ff_rgb24toyv12 = rgb24toyv12_check; -+ ff_bgr24toyv12 = bgr24toyv12_check; - } - } -diff --git a/libswscale/aarch64/rgb2rgb_neon.S b/libswscale/aarch64/rgb2rgb_neon.S -index d81110ec57..8cf40b65f5 100644 ---- a/libswscale/aarch64/rgb2rgb_neon.S -+++ b/libswscale/aarch64/rgb2rgb_neon.S -@@ -77,3 +77,184 @@ function ff_interleave_bytes_neon, export=1 - 0: - ret - endfunc -+ -+// void ff_rgb24toyv12_aarch64( -+// const uint8_t *src, // x0 -+// uint8_t *ydst, // x1 -+// uint8_t *udst, // x2 -+// uint8_t *vdst, // x3 -+// int width, // w4 -+// int height, // w5 -+// int lumStride, // w6 -+// int chromStride, // w7 -+// int srcStr, // [sp, #0] -+// int32_t *rgb2yuv); // [sp, #8] -+ -+function ff_rgb24toyv12_aarch64, export=1 -+ ldr x15, [sp, #8] -+ ld1 {v3.s}[2], [x15], #4 -+ ld1 {v3.s}[1], [x15], #4 -+ ld1 {v3.s}[0], [x15], #4 -+ ld1 {v4.s}[2], [x15], #4 -+ ld1 {v4.s}[1], [x15], #4 -+ ld1 {v4.s}[0], [x15], #4 -+ ld1 {v5.s}[2], [x15], #4 -+ ld1 {v5.s}[1], [x15], #4 -+ ld1 {v5.s}[0], [x15] -+ b 99f -+endfunc -+ -+// void ff_bgr24toyv12_aarch64( -+// const uint8_t *src, // x0 -+// uint8_t *ydst, // x1 -+// uint8_t *udst, // x2 -+// uint8_t *vdst, // x3 -+// int width, // w4 -+// int height, // w5 -+// int lumStride, // w6 -+// int chromStride, // w7 -+// int srcStr, // [sp, #0] -+// int32_t *rgb2yuv); // [sp, #8] -+ -+function ff_bgr24toyv12_aarch64, export=1 -+ ldr x15, [sp, #8] -+ ld3 {v3.s, v4.s, v5.s}[0], [x15], #12 -+ ld3 {v3.s, v4.s, v5.s}[1], [x15], #12 -+ ld3 {v3.s, v4.s, v5.s}[2], [x15] -+99: -+ ldr w14, [sp, #0] -+ movi v18.8b, #128 -+ uxtl v17.8h, v18.8b -+ -+ // Even line - YUV -+1: -+ mov x10, x0 -+ mov x11, x1 -+ mov x12, x2 -+ mov x13, x3 -+ mov w9, w4 -+ -+0: -+ ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 -+ -+ uxtl2 v20.8h, v0.16b -+ uxtl2 v21.8h, v1.16b -+ uxtl2 v22.8h, v2.16b -+ -+ uxtl v0.8h, v0.8b -+ uxtl v1.8h, v1.8b -+ uxtl v2.8h, v2.8b -+ // Y0 -+ smull v6.4s, v0.4h, v3.h[0] -+ smull2 v7.4s, v0.8h, v3.h[0] -+ smlal v6.4s, v1.4h, v4.h[0] -+ smlal2 v7.4s, v1.8h, v4.h[0] -+ smlal v6.4s, v2.4h, v5.h[0] -+ smlal2 v7.4s, v2.8h, v5.h[0] -+ shrn v6.4h, v6.4s, #12 -+ shrn2 v6.8h, v7.4s, #12 -+ add v6.8h, v6.8h, v17.8h // +128 (>> 3 = 16) -+ uqrshrn v16.8b, v6.8h, #3 -+ // Y1 -+ smull v6.4s, v20.4h, v3.h[0] -+ smull2 v7.4s, v20.8h, v3.h[0] -+ smlal v6.4s, v21.4h, v4.h[0] -+ smlal2 v7.4s, v21.8h, v4.h[0] -+ smlal v6.4s, v22.4h, v5.h[0] -+ smlal2 v7.4s, v22.8h, v5.h[0] -+ shrn v6.4h, v6.4s, #12 -+ shrn2 v6.8h, v7.4s, #12 -+ add v6.8h, v6.8h, v17.8h -+ uqrshrn2 v16.16b, v6.8h, #3 -+ // Y0/Y1 -+ st1 {v16.16b}, [x11], #16 -+ -+ uzp1 v0.8h, v0.8h, v20.8h -+ uzp1 v1.8h, v1.8h, v21.8h -+ uzp1 v2.8h, v2.8h, v22.8h -+ -+ // U -+ // Vector subscript *2 as we loaded into S but are only using H -+ smull v6.4s, v0.4h, v3.h[2] -+ smull2 v7.4s, v0.8h, v3.h[2] -+ smlal v6.4s, v1.4h, v4.h[2] -+ smlal2 v7.4s, v1.8h, v4.h[2] -+ smlal v6.4s, v2.4h, v5.h[2] -+ smlal2 v7.4s, v2.8h, v5.h[2] -+ shrn v6.4h, v6.4s, #14 -+ shrn2 v6.8h, v7.4s, #14 -+ sqrshrn v6.8b, v6.8h, #1 -+ add v6.8b, v6.8b, v18.8b // +128 -+ st1 {v6.8b}, [x12], #8 -+ -+ // V -+ smull v6.4s, v0.4h, v3.h[4] -+ smull2 v7.4s, v0.8h, v3.h[4] -+ smlal v6.4s, v1.4h, v4.h[4] -+ smlal2 v7.4s, v1.8h, v4.h[4] -+ smlal v6.4s, v2.4h, v5.h[4] -+ smlal2 v7.4s, v2.8h, v5.h[4] -+ shrn v6.4h, v6.4s, #14 -+ shrn2 v6.8h, v7.4s, #14 -+ sqrshrn v6.8b, v6.8h, #1 -+ add v6.8b, v6.8b, v18.8b // +128 -+ st1 {v6.8b}, [x13], #8 -+ -+ subs w9, w9, #16 -+ b.gt 0b -+ -+ // Odd line - Y only -+ -+ add x0, x0, w14, SXTX -+ add x1, x1, w6, SXTX -+ mov x10, x0 -+ mov x11, x1 -+ mov w9, w4 -+ -+0: -+ ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 -+ -+ uxtl2 v20.8h, v0.16b -+ uxtl2 v21.8h, v1.16b -+ uxtl2 v22.8h, v2.16b -+ -+ uxtl v0.8h, v0.8b -+ uxtl v1.8h, v1.8b -+ uxtl v2.8h, v2.8b -+ // Y0 -+ smull v6.4s, v0.4h, v3.h[0] -+ smull2 v7.4s, v0.8h, v3.h[0] -+ smlal v6.4s, v1.4h, v4.h[0] -+ smlal2 v7.4s, v1.8h, v4.h[0] -+ smlal v6.4s, v2.4h, v5.h[0] -+ smlal2 v7.4s, v2.8h, v5.h[0] -+ shrn v6.4h, v6.4s, #12 -+ shrn2 v6.8h, v7.4s, #12 -+ add v6.8h, v6.8h, v17.8h -+ uqrshrn v16.8b, v6.8h, #3 -+ // Y1 -+ smull v6.4s, v20.4h, v3.h[0] -+ smull2 v7.4s, v20.8h, v3.h[0] -+ smlal v6.4s, v21.4h, v4.h[0] -+ smlal2 v7.4s, v21.8h, v4.h[0] -+ smlal v6.4s, v22.4h, v5.h[0] -+ smlal2 v7.4s, v22.8h, v5.h[0] -+ shrn v6.4h, v6.4s, #12 -+ shrn2 v6.8h, v7.4s, #12 -+ add v6.8h, v6.8h, v17.8h -+ uqrshrn2 v16.16b, v6.8h, #3 -+ // Y0/Y1 -+ st1 {v16.16b}, [x11], #16 -+ -+ subs w9, w9, #16 -+ b.gt 0b -+ -+ add x0, x0, w14, SXTX -+ add x1, x1, w6, SXTX -+ add x2, x2, w7, SXTX -+ add x3, x3, w7, SXTX -+ subs w5, w5, #2 -+ b.gt 1b -+ -+ ret -+endfunc - -From f62603136ee2eaf781519bd70e445b03f80960da Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 27 Apr 2023 13:03:52 +0000 -Subject: [PATCH 126/151] rgb2rgb: Fix rgb24->yuv420p with arbitrary wxh - -(cherry picked from commit 58771fdf0218dc670d8a343824f540e2f6e8785d) ---- - libswscale/aarch64/rgb2rgb.c | 5 +- - libswscale/aarch64/rgb2rgb_neon.S | 440 ++++++++++++++++++++++++------ - 2 files changed, 355 insertions(+), 90 deletions(-) - -diff --git a/libswscale/aarch64/rgb2rgb.c b/libswscale/aarch64/rgb2rgb.c -index 6d3e0000dc..f10c4ef2de 100644 ---- a/libswscale/aarch64/rgb2rgb.c -+++ b/libswscale/aarch64/rgb2rgb.c -@@ -44,8 +44,9 @@ void ff_rgb24toyv12_aarch64(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - - static inline int chkw(const int width, const int lumStride, const int chromStride) - { -- const int aw = FFALIGN(width, 16); -- return aw <= FFABS(lumStride) && aw <= FFABS(chromStride) * 2; -+// const int aw = FFALIGN(width, 16); -+// return aw <= FFABS(lumStride) && aw <= FFABS(chromStride) * 2; -+ return 1; - } - - static void rgb24toyv12_check(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -diff --git a/libswscale/aarch64/rgb2rgb_neon.S b/libswscale/aarch64/rgb2rgb_neon.S -index 8cf40b65f5..978ab443ea 100644 ---- a/libswscale/aarch64/rgb2rgb_neon.S -+++ b/libswscale/aarch64/rgb2rgb_neon.S -@@ -116,6 +116,25 @@ endfunc - // int srcStr, // [sp, #0] - // int32_t *rgb2yuv); // [sp, #8] - -+// regs -+// v0-2 Src bytes - reused as chroma src -+// v3-5 Coeffs (packed very inefficiently - could be squashed) -+// v6 128b -+// v7 128h -+// v8-15 Reserved -+// v16-18 Lo Src expanded as H -+// v19 - -+// v20-22 Hi Src expanded as H -+// v23 - -+// v24 U out -+// v25 U tmp -+// v26 Y out -+// v27-29 Y tmp -+// v30 V out -+// v31 V tmp -+ -+// Assumes Little Endian in tail stores & conversion matrix -+ - function ff_bgr24toyv12_aarch64, export=1 - ldr x15, [sp, #8] - ld3 {v3.s, v4.s, v5.s}[0], [x15], #12 -@@ -123,138 +142,383 @@ function ff_bgr24toyv12_aarch64, export=1 - ld3 {v3.s, v4.s, v5.s}[2], [x15] - 99: - ldr w14, [sp, #0] -- movi v18.8b, #128 -- uxtl v17.8h, v18.8b -- -- // Even line - YUV -+ movi v7.8b, #128 -+ uxtl v6.8h, v7.8b -+ // Ensure if nothing to do then we do nothing -+ cmp w4, #0 -+ b.le 90f -+ cmp w5, #0 -+ b.le 90f -+ // If w % 16 != 0 then -16 so we do main loop 1 fewer times with -+ // the remainder done in the tail -+ tst w4, #15 -+ b.eq 1f -+ sub w4, w4, #16 - 1: -+ -+// -------------------- Even line body - YUV -+11: -+ subs w9, w4, #0 - mov x10, x0 - mov x11, x1 - mov x12, x2 - mov x13, x3 -- mov w9, w4 -+ b.lt 12f - --0: - ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 -+ subs w9, w9, #16 -+ b.le 13f -+ -+10: -+ uxtl v16.8h, v0.8b -+ uxtl v17.8h, v1.8b -+ uxtl v18.8h, v2.8b - - uxtl2 v20.8h, v0.16b - uxtl2 v21.8h, v1.16b - uxtl2 v22.8h, v2.16b - -- uxtl v0.8h, v0.8b -- uxtl v1.8h, v1.8b -- uxtl v2.8h, v2.8b -+ bic v0.8h, #0xff, LSL #8 -+ bic v1.8h, #0xff, LSL #8 -+ bic v2.8h, #0xff, LSL #8 -+ -+ // Testing shows it is faster to stack the smull/smlal ops together -+ // rather than interleave them between channels and indeed even the -+ // shift/add sections seem happier not interleaved -+ - // Y0 -- smull v6.4s, v0.4h, v3.h[0] -- smull2 v7.4s, v0.8h, v3.h[0] -- smlal v6.4s, v1.4h, v4.h[0] -- smlal2 v7.4s, v1.8h, v4.h[0] -- smlal v6.4s, v2.4h, v5.h[0] -- smlal2 v7.4s, v2.8h, v5.h[0] -- shrn v6.4h, v6.4s, #12 -- shrn2 v6.8h, v7.4s, #12 -- add v6.8h, v6.8h, v17.8h // +128 (>> 3 = 16) -- uqrshrn v16.8b, v6.8h, #3 -+ smull v26.4s, v16.4h, v3.h[0] -+ smlal v26.4s, v17.4h, v4.h[0] -+ smlal v26.4s, v18.4h, v5.h[0] -+ smull2 v27.4s, v16.8h, v3.h[0] -+ smlal2 v27.4s, v17.8h, v4.h[0] -+ smlal2 v27.4s, v18.8h, v5.h[0] - // Y1 -- smull v6.4s, v20.4h, v3.h[0] -- smull2 v7.4s, v20.8h, v3.h[0] -- smlal v6.4s, v21.4h, v4.h[0] -- smlal2 v7.4s, v21.8h, v4.h[0] -- smlal v6.4s, v22.4h, v5.h[0] -- smlal2 v7.4s, v22.8h, v5.h[0] -- shrn v6.4h, v6.4s, #12 -- shrn2 v6.8h, v7.4s, #12 -- add v6.8h, v6.8h, v17.8h -- uqrshrn2 v16.16b, v6.8h, #3 -+ smull v28.4s, v20.4h, v3.h[0] -+ smlal v28.4s, v21.4h, v4.h[0] -+ smlal v28.4s, v22.4h, v5.h[0] -+ smull2 v29.4s, v20.8h, v3.h[0] -+ smlal2 v29.4s, v21.8h, v4.h[0] -+ smlal2 v29.4s, v22.8h, v5.h[0] -+ shrn v26.4h, v26.4s, #12 -+ shrn2 v26.8h, v27.4s, #12 -+ add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) -+ uqrshrn v26.8b, v26.8h, #3 -+ shrn v28.4h, v28.4s, #12 -+ shrn2 v28.8h, v29.4s, #12 -+ add v28.8h, v28.8h, v6.8h -+ uqrshrn2 v26.16b, v28.8h, #3 - // Y0/Y1 -- st1 {v16.16b}, [x11], #16 -- -- uzp1 v0.8h, v0.8h, v20.8h -- uzp1 v1.8h, v1.8h, v21.8h -- uzp1 v2.8h, v2.8h, v22.8h - - // U - // Vector subscript *2 as we loaded into S but are only using H -- smull v6.4s, v0.4h, v3.h[2] -- smull2 v7.4s, v0.8h, v3.h[2] -- smlal v6.4s, v1.4h, v4.h[2] -- smlal2 v7.4s, v1.8h, v4.h[2] -- smlal v6.4s, v2.4h, v5.h[2] -- smlal2 v7.4s, v2.8h, v5.h[2] -- shrn v6.4h, v6.4s, #14 -- shrn2 v6.8h, v7.4s, #14 -- sqrshrn v6.8b, v6.8h, #1 -- add v6.8b, v6.8b, v18.8b // +128 -- st1 {v6.8b}, [x12], #8 -+ smull v24.4s, v0.4h, v3.h[2] -+ smlal v24.4s, v1.4h, v4.h[2] -+ smlal v24.4s, v2.4h, v5.h[2] -+ smull2 v25.4s, v0.8h, v3.h[2] -+ smlal2 v25.4s, v1.8h, v4.h[2] -+ smlal2 v25.4s, v2.8h, v5.h[2] - - // V -- smull v6.4s, v0.4h, v3.h[4] -- smull2 v7.4s, v0.8h, v3.h[4] -- smlal v6.4s, v1.4h, v4.h[4] -- smlal2 v7.4s, v1.8h, v4.h[4] -- smlal v6.4s, v2.4h, v5.h[4] -- smlal2 v7.4s, v2.8h, v5.h[4] -- shrn v6.4h, v6.4s, #14 -- shrn2 v6.8h, v7.4s, #14 -- sqrshrn v6.8b, v6.8h, #1 -- add v6.8b, v6.8b, v18.8b // +128 -- st1 {v6.8b}, [x13], #8 -+ smull v30.4s, v0.4h, v3.h[4] -+ smlal v30.4s, v1.4h, v4.h[4] -+ smlal v30.4s, v2.4h, v5.h[4] -+ smull2 v31.4s, v0.8h, v3.h[4] -+ smlal2 v31.4s, v1.8h, v4.h[4] -+ smlal2 v31.4s, v2.8h, v5.h[4] -+ -+ ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 -+ -+ shrn v24.4h, v24.4s, #14 -+ shrn2 v24.8h, v25.4s, #14 -+ sqrshrn v24.8b, v24.8h, #1 -+ add v24.8b, v24.8b, v7.8b // +128 -+ shrn v30.4h, v30.4s, #14 -+ shrn2 v30.8h, v31.4s, #14 -+ sqrshrn v30.8b, v30.8h, #1 -+ add v30.8b, v30.8b, v7.8b // +128 - - subs w9, w9, #16 -- b.gt 0b - -- // Odd line - Y only -+ st1 {v26.16b}, [x11], #16 -+ st1 {v24.8b}, [x12], #8 -+ st1 {v30.8b}, [x13], #8 -+ -+ b.gt 10b -+ -+// -------------------- Even line tail - YUV -+// If width % 16 == 0 then simply runs once with preloaded RGB -+// If other then deals with preload & then does remaining tail -+ -+13: -+ // Body is simple copy of main loop body minus preload -+ -+ uxtl v16.8h, v0.8b -+ uxtl v17.8h, v1.8b -+ uxtl v18.8h, v2.8b -+ -+ uxtl2 v20.8h, v0.16b -+ uxtl2 v21.8h, v1.16b -+ uxtl2 v22.8h, v2.16b -+ -+ bic v0.8h, #0xff, LSL #8 -+ bic v1.8h, #0xff, LSL #8 -+ bic v2.8h, #0xff, LSL #8 -+ -+ // Y0 -+ smull v26.4s, v16.4h, v3.h[0] -+ smlal v26.4s, v17.4h, v4.h[0] -+ smlal v26.4s, v18.4h, v5.h[0] -+ smull2 v27.4s, v16.8h, v3.h[0] -+ smlal2 v27.4s, v17.8h, v4.h[0] -+ smlal2 v27.4s, v18.8h, v5.h[0] -+ // Y1 -+ smull v28.4s, v20.4h, v3.h[0] -+ smlal v28.4s, v21.4h, v4.h[0] -+ smlal v28.4s, v22.4h, v5.h[0] -+ smull2 v29.4s, v20.8h, v3.h[0] -+ smlal2 v29.4s, v21.8h, v4.h[0] -+ smlal2 v29.4s, v22.8h, v5.h[0] -+ shrn v26.4h, v26.4s, #12 -+ shrn2 v26.8h, v27.4s, #12 -+ add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) -+ uqrshrn v26.8b, v26.8h, #3 -+ shrn v28.4h, v28.4s, #12 -+ shrn2 v28.8h, v29.4s, #12 -+ add v28.8h, v28.8h, v6.8h -+ uqrshrn2 v26.16b, v28.8h, #3 -+ // Y0/Y1 -+ -+ // U -+ // Vector subscript *2 as we loaded into S but are only using H -+ smull v24.4s, v0.4h, v3.h[2] -+ smlal v24.4s, v1.4h, v4.h[2] -+ smlal v24.4s, v2.4h, v5.h[2] -+ smull2 v25.4s, v0.8h, v3.h[2] -+ smlal2 v25.4s, v1.8h, v4.h[2] -+ smlal2 v25.4s, v2.8h, v5.h[2] - -+ // V -+ smull v30.4s, v0.4h, v3.h[4] -+ smlal v30.4s, v1.4h, v4.h[4] -+ smlal v30.4s, v2.4h, v5.h[4] -+ smull2 v31.4s, v0.8h, v3.h[4] -+ smlal2 v31.4s, v1.8h, v4.h[4] -+ smlal2 v31.4s, v2.8h, v5.h[4] -+ -+ cmp w9, #-16 -+ -+ shrn v24.4h, v24.4s, #14 -+ shrn2 v24.8h, v25.4s, #14 -+ sqrshrn v24.8b, v24.8h, #1 -+ add v24.8b, v24.8b, v7.8b // +128 -+ shrn v30.4h, v30.4s, #14 -+ shrn2 v30.8h, v31.4s, #14 -+ sqrshrn v30.8b, v30.8h, #1 -+ add v30.8b, v30.8b, v7.8b // +128 -+ -+ // Here: -+ // w9 == 0 width % 16 == 0, tail done -+ // w9 > -16 1st tail done (16 pels), remainder still to go -+ // w9 == -16 shouldn't happen -+ // w9 > -32 2nd tail done -+ // w9 <= -32 shouldn't happen -+ -+ b.lt 2f -+ st1 {v26.16b}, [x11], #16 -+ st1 {v24.8b}, [x12], #8 -+ st1 {v30.8b}, [x13], #8 -+ cbz w9, 3f -+ -+12: -+ sub w9, w9, #16 -+ -+ tbz w9, #3, 1f -+ ld3 {v0.8b, v1.8b, v2.8b}, [x10], #24 -+1: tbz w9, #2, 1f -+ ld3 {v0.b, v1.b, v2.b}[8], [x10], #3 -+ ld3 {v0.b, v1.b, v2.b}[9], [x10], #3 -+ ld3 {v0.b, v1.b, v2.b}[10], [x10], #3 -+ ld3 {v0.b, v1.b, v2.b}[11], [x10], #3 -+1: tbz w9, #1, 1f -+ ld3 {v0.b, v1.b, v2.b}[12], [x10], #3 -+ ld3 {v0.b, v1.b, v2.b}[13], [x10], #3 -+1: tbz w9, #0, 13b -+ ld3 {v0.b, v1.b, v2.b}[14], [x10], #3 -+ b 13b -+ -+2: -+ tbz w9, #3, 1f -+ st1 {v26.8b}, [x11], #8 -+ st1 {v24.s}[0], [x12], #4 -+ st1 {v30.s}[0], [x13], #4 -+1: tbz w9, #2, 1f -+ st1 {v26.s}[2], [x11], #4 -+ st1 {v24.h}[2], [x12], #2 -+ st1 {v30.h}[2], [x13], #2 -+1: tbz w9, #1, 1f -+ st1 {v26.h}[6], [x11], #2 -+ st1 {v24.b}[6], [x12], #1 -+ st1 {v30.b}[6], [x13], #1 -+1: tbz w9, #0, 1f -+ st1 {v26.b}[14], [x11] -+ st1 {v24.b}[7], [x12] -+ st1 {v30.b}[7], [x13] -+1: -+3: -+ -+// -------------------- Odd line body - Y only -+ -+ subs w5, w5, #1 -+ b.eq 90f -+ -+ subs w9, w4, #0 - add x0, x0, w14, SXTX - add x1, x1, w6, SXTX - mov x10, x0 - mov x11, x1 -- mov w9, w4 -+ b.lt 12f - --0: - ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 -+ subs w9, w9, #16 -+ b.le 13f -+ -+10: -+ uxtl v16.8h, v0.8b -+ uxtl v17.8h, v1.8b -+ uxtl v18.8h, v2.8b - - uxtl2 v20.8h, v0.16b - uxtl2 v21.8h, v1.16b - uxtl2 v22.8h, v2.16b - -- uxtl v0.8h, v0.8b -- uxtl v1.8h, v1.8b -- uxtl v2.8h, v2.8b -+ // Testing shows it is faster to stack the smull/smlal ops together -+ // rather than interleave them between channels and indeed even the -+ // shift/add sections seem happier not interleaved -+ - // Y0 -- smull v6.4s, v0.4h, v3.h[0] -- smull2 v7.4s, v0.8h, v3.h[0] -- smlal v6.4s, v1.4h, v4.h[0] -- smlal2 v7.4s, v1.8h, v4.h[0] -- smlal v6.4s, v2.4h, v5.h[0] -- smlal2 v7.4s, v2.8h, v5.h[0] -- shrn v6.4h, v6.4s, #12 -- shrn2 v6.8h, v7.4s, #12 -- add v6.8h, v6.8h, v17.8h -- uqrshrn v16.8b, v6.8h, #3 -+ smull v26.4s, v16.4h, v3.h[0] -+ smlal v26.4s, v17.4h, v4.h[0] -+ smlal v26.4s, v18.4h, v5.h[0] -+ smull2 v27.4s, v16.8h, v3.h[0] -+ smlal2 v27.4s, v17.8h, v4.h[0] -+ smlal2 v27.4s, v18.8h, v5.h[0] - // Y1 -- smull v6.4s, v20.4h, v3.h[0] -- smull2 v7.4s, v20.8h, v3.h[0] -- smlal v6.4s, v21.4h, v4.h[0] -- smlal2 v7.4s, v21.8h, v4.h[0] -- smlal v6.4s, v22.4h, v5.h[0] -- smlal2 v7.4s, v22.8h, v5.h[0] -- shrn v6.4h, v6.4s, #12 -- shrn2 v6.8h, v7.4s, #12 -- add v6.8h, v6.8h, v17.8h -- uqrshrn2 v16.16b, v6.8h, #3 -+ smull v28.4s, v20.4h, v3.h[0] -+ smlal v28.4s, v21.4h, v4.h[0] -+ smlal v28.4s, v22.4h, v5.h[0] -+ smull2 v29.4s, v20.8h, v3.h[0] -+ smlal2 v29.4s, v21.8h, v4.h[0] -+ smlal2 v29.4s, v22.8h, v5.h[0] -+ -+ ld3 {v0.16b, v1.16b, v2.16b}, [x10], #48 -+ -+ shrn v26.4h, v26.4s, #12 -+ shrn2 v26.8h, v27.4s, #12 -+ add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) -+ uqrshrn v26.8b, v26.8h, #3 -+ shrn v28.4h, v28.4s, #12 -+ shrn2 v28.8h, v29.4s, #12 -+ add v28.8h, v28.8h, v6.8h -+ uqrshrn2 v26.16b, v28.8h, #3 - // Y0/Y1 -- st1 {v16.16b}, [x11], #16 - - subs w9, w9, #16 -- b.gt 0b -+ -+ st1 {v26.16b}, [x11], #16 -+ -+ b.gt 10b -+ -+// -------------------- Odd line tail - Y -+// If width % 16 == 0 then simply runs once with preloaded RGB -+// If other then deals with preload & then does remaining tail -+ -+13: -+ // Body is simple copy of main loop body minus preload -+ -+ uxtl v16.8h, v0.8b -+ uxtl v17.8h, v1.8b -+ uxtl v18.8h, v2.8b -+ -+ uxtl2 v20.8h, v0.16b -+ uxtl2 v21.8h, v1.16b -+ uxtl2 v22.8h, v2.16b -+ -+ // Y0 -+ smull v26.4s, v16.4h, v3.h[0] -+ smlal v26.4s, v17.4h, v4.h[0] -+ smlal v26.4s, v18.4h, v5.h[0] -+ smull2 v27.4s, v16.8h, v3.h[0] -+ smlal2 v27.4s, v17.8h, v4.h[0] -+ smlal2 v27.4s, v18.8h, v5.h[0] -+ // Y1 -+ smull v28.4s, v20.4h, v3.h[0] -+ smlal v28.4s, v21.4h, v4.h[0] -+ smlal v28.4s, v22.4h, v5.h[0] -+ smull2 v29.4s, v20.8h, v3.h[0] -+ smlal2 v29.4s, v21.8h, v4.h[0] -+ smlal2 v29.4s, v22.8h, v5.h[0] -+ -+ cmp w9, #-16 -+ -+ shrn v26.4h, v26.4s, #12 -+ shrn2 v26.8h, v27.4s, #12 -+ add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) -+ uqrshrn v26.8b, v26.8h, #3 -+ shrn v28.4h, v28.4s, #12 -+ shrn2 v28.8h, v29.4s, #12 -+ add v28.8h, v28.8h, v6.8h -+ uqrshrn2 v26.16b, v28.8h, #3 -+ // Y0/Y1 -+ -+ // Here: -+ // w9 == 0 width % 16 == 0, tail done -+ // w9 > -16 1st tail done (16 pels), remainder still to go -+ // w9 == -16 shouldn't happen -+ // w9 > -32 2nd tail done -+ // w9 <= -32 shouldn't happen -+ -+ b.lt 2f -+ st1 {v26.16b}, [x11], #16 -+ cbz w9, 3f -+ -+12: -+ sub w9, w9, #16 -+ -+ tbz w9, #3, 1f -+ ld3 {v0.8b, v1.8b, v2.8b}, [x10], #24 -+1: tbz w9, #2, 1f -+ ld3 {v0.b, v1.b, v2.b}[8], [x10], #3 -+ ld3 {v0.b, v1.b, v2.b}[9], [x10], #3 -+ ld3 {v0.b, v1.b, v2.b}[10], [x10], #3 -+ ld3 {v0.b, v1.b, v2.b}[11], [x10], #3 -+1: tbz w9, #1, 1f -+ ld3 {v0.b, v1.b, v2.b}[12], [x10], #3 -+ ld3 {v0.b, v1.b, v2.b}[13], [x10], #3 -+1: tbz w9, #0, 13b -+ ld3 {v0.b, v1.b, v2.b}[14], [x10], #3 -+ b 13b -+ -+2: -+ tbz w9, #3, 1f -+ st1 {v26.8b}, [x11], #8 -+1: tbz w9, #2, 1f -+ st1 {v26.s}[2], [x11], #4 -+1: tbz w9, #1, 1f -+ st1 {v26.h}[6], [x11], #2 -+1: tbz w9, #0, 1f -+ st1 {v26.b}[14], [x11] -+1: -+3: -+ -+// ------------------- Loop to start - - add x0, x0, w14, SXTX - add x1, x1, w6, SXTX - add x2, x2, w7, SXTX - add x3, x3, w7, SXTX -- subs w5, w5, #2 -- b.gt 1b -- -+ subs w5, w5, #1 -+ b.gt 11b -+90: - ret - endfunc - -From cf020c89ac47620c4a5390d0333e9ea70fbfa7b8 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 26 Apr 2023 15:36:07 +0000 -Subject: [PATCH 127/151] rgb2rgb: Use asm unconditionally - -(cherry picked from commit 7c216c0804836b31c0ea093bb1dde5ab387724b1) ---- - libswscale/aarch64/rgb2rgb.c | 37 ++---------------------------------- - 1 file changed, 2 insertions(+), 35 deletions(-) - -diff --git a/libswscale/aarch64/rgb2rgb.c b/libswscale/aarch64/rgb2rgb.c -index f10c4ef2de..6a0e2dcc09 100644 ---- a/libswscale/aarch64/rgb2rgb.c -+++ b/libswscale/aarch64/rgb2rgb.c -@@ -37,46 +37,13 @@ void ff_rgb24toyv12_aarch64(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - uint8_t *vdst, int width, int height, int lumStride, - int chromStride, int srcStride, int32_t *rgb2yuv); - --// RGB to YUV asm fns process 16 pixels at once so ensure that the output --// will fit into the stride. ARM64 should cope with unaligned SIMD r/w so --// don't test for that --// Fall back to C if we cannot use asm -- --static inline int chkw(const int width, const int lumStride, const int chromStride) --{ --// const int aw = FFALIGN(width, 16); --// return aw <= FFABS(lumStride) && aw <= FFABS(chromStride) * 2; -- return 1; --} -- --static void rgb24toyv12_check(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -- uint8_t *vdst, int width, int height, int lumStride, -- int chromStride, int srcStride, int32_t *rgb2yuv) --{ -- if (chkw(width, lumStride, chromStride)) -- ff_rgb24toyv12_aarch64(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv); -- else -- ff_rgb24toyv12_c(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, rgb2yuv); --} -- --static void bgr24toyv12_check(const uint8_t *src, uint8_t *ydst, uint8_t *udst, -- uint8_t *vdst, int width, int height, int lumStride, -- int chromStride, int srcStride, int32_t *bgr2yuv) --{ -- if (chkw(width, lumStride, chromStride)) -- ff_bgr24toyv12_aarch64(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, bgr2yuv); -- else -- ff_bgr24toyv12_c(src, ydst, udst, vdst, width, height, lumStride, chromStride, srcStride, bgr2yuv); --} -- -- - av_cold void rgb2rgb_init_aarch64(void) - { - int cpu_flags = av_get_cpu_flags(); - - if (have_neon(cpu_flags)) { - interleaveBytes = ff_interleave_bytes_neon; -- ff_rgb24toyv12 = rgb24toyv12_check; -- ff_bgr24toyv12 = bgr24toyv12_check; -+ ff_rgb24toyv12 = ff_rgb24toyv12_aarch64; -+ ff_bgr24toyv12 = ff_bgr24toyv12_aarch64; - } - } - -From 1895fdcaf403f403736ab52d1cb69dce7c964b66 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 27 Apr 2023 13:01:43 +0000 -Subject: [PATCH 128/151] tests/swscale: Add options for width and height on - the command line - -(cherry picked from commit eb8a09779688fc05bf204fdfcd063b04cda07271) ---- - libswscale/tests/swscale.c | 84 ++++++++++++++++++++++++++------------ - 1 file changed, 59 insertions(+), 25 deletions(-) - -diff --git a/libswscale/tests/swscale.c b/libswscale/tests/swscale.c -index 6c38041ddb..4cf41d9f64 100644 ---- a/libswscale/tests/swscale.c -+++ b/libswscale/tests/swscale.c -@@ -355,56 +355,71 @@ static int fileTest(const uint8_t * const ref[4], int refStride[4], - return 0; - } - --#define W 96 --#define H 96 -- - int main(int argc, char **argv) - { -+ unsigned int W = 96; -+ unsigned int H = 96; -+ unsigned int W2; -+ unsigned int H2; -+ unsigned int S; - enum AVPixelFormat srcFormat = AV_PIX_FMT_NONE; - enum AVPixelFormat dstFormat = AV_PIX_FMT_NONE; -- uint8_t *rgb_data = av_malloc(W * H * 4); -- const uint8_t * const rgb_src[4] = { rgb_data, NULL, NULL, NULL }; -- int rgb_stride[4] = { 4 * W, 0, 0, 0 }; -- uint8_t *data = av_malloc(4 * W * H); -- const uint8_t * const src[4] = { data, data + W * H, data + W * H * 2, data + W * H * 3 }; -- int stride[4] = { W, W, W, W }; - int x, y; - struct SwsContext *sws; - AVLFG rand; - int res = -1; - int i; - FILE *fp = NULL; -- -- if (!rgb_data || !data) -- return -1; -+ uint8_t *rgb_data; -+ uint8_t * rgb_src[4] = { NULL }; -+ int rgb_stride[4] = { 0 }; -+ uint8_t *data; -+ uint8_t * src[4] = { NULL }; -+ int stride[4] = { 0 }; - - for (i = 1; i < argc; i += 2) { -+ const char * const arg2 = argv[i+1]; -+ - if (argv[i][0] != '-' || i + 1 == argc) - goto bad_option; - if (!strcmp(argv[i], "-ref")) { -- fp = fopen(argv[i + 1], "r"); -+ fp = fopen(arg2, "r"); - if (!fp) { -- fprintf(stderr, "could not open '%s'\n", argv[i + 1]); -+ fprintf(stderr, "could not open '%s'\n", arg2); - goto error; - } - } else if (!strcmp(argv[i], "-cpuflags")) { - unsigned flags = av_get_cpu_flags(); -- int ret = av_parse_cpu_caps(&flags, argv[i + 1]); -+ int ret = av_parse_cpu_caps(&flags, arg2); - if (ret < 0) { -- fprintf(stderr, "invalid cpu flags %s\n", argv[i + 1]); -+ fprintf(stderr, "invalid cpu flags %s\n", arg2); - return ret; - } - av_force_cpu_flags(flags); - } else if (!strcmp(argv[i], "-src")) { -- srcFormat = av_get_pix_fmt(argv[i + 1]); -+ srcFormat = av_get_pix_fmt(arg2); - if (srcFormat == AV_PIX_FMT_NONE) { -- fprintf(stderr, "invalid pixel format %s\n", argv[i + 1]); -+ fprintf(stderr, "invalid pixel format %s\n", arg2); - return -1; - } - } else if (!strcmp(argv[i], "-dst")) { -- dstFormat = av_get_pix_fmt(argv[i + 1]); -+ dstFormat = av_get_pix_fmt(arg2); - if (dstFormat == AV_PIX_FMT_NONE) { -- fprintf(stderr, "invalid pixel format %s\n", argv[i + 1]); -+ fprintf(stderr, "invalid pixel format %s\n", arg2); -+ return -1; -+ } -+ } else if (!strcmp(argv[i], "-w")) { -+ char * p = NULL; -+ W = strtoul(arg2, &p, 0); -+ if (!W || *p) { -+ fprintf(stderr, "bad width %s\n", arg2); -+ return -1; -+ } -+ } else if (!strcmp(argv[i], "-h")) { -+ char * p = NULL; -+ H = strtoul(arg2, &p, 0); -+ if (!H || *p) { -+ fprintf(stderr, "bad height '%s' (H=%d, *p=%d)\n", arg2, H, *p); - return -1; - } - } else { -@@ -414,15 +429,34 @@ bad_option: - } - } - -- sws = sws_getContext(W / 12, H / 12, AV_PIX_FMT_RGB32, W, H, -+ S = (W + 15) & ~15; -+ rgb_data = av_mallocz(S * H * 4); -+ rgb_src[0] = rgb_data; -+ rgb_stride[0] = 4 * S; -+ data = av_mallocz(4 * S * H); -+ src[0] = data; -+ src[1] = data + S * H; -+ src[2] = data + S * H * 2; -+ src[3] = data + S * H * 3; -+ stride[0] = S; -+ stride[1] = S; -+ stride[2] = S; -+ stride[3] = S; -+ H2 = H < 96 ? 8 : H / 12; -+ W2 = W < 96 ? 8 : W / 12; -+ -+ if (!rgb_data || !data) -+ return -1; -+ -+ sws = sws_getContext(W2, H2, AV_PIX_FMT_RGB32, W, H, - AV_PIX_FMT_YUVA420P, SWS_BILINEAR, NULL, NULL, NULL); - - av_lfg_init(&rand, 1); - - for (y = 0; y < H; y++) - for (x = 0; x < W * 4; x++) -- rgb_data[ x + y * 4 * W] = av_lfg_get(&rand); -- res = sws_scale(sws, rgb_src, rgb_stride, 0, H / 12, (uint8_t * const *) src, stride); -+ rgb_data[ x + y * 4 * S] = av_lfg_get(&rand); -+ res = sws_scale(sws, (const uint8_t * const *)rgb_src, rgb_stride, 0, H2, (uint8_t * const *) src, stride); - if (res < 0 || res != H) { - res = -1; - goto error; -@@ -431,10 +465,10 @@ bad_option: - av_free(rgb_data); - - if(fp) { -- res = fileTest(src, stride, W, H, fp, srcFormat, dstFormat); -+ res = fileTest((const uint8_t * const *)src, stride, W, H, fp, srcFormat, dstFormat); - fclose(fp); - } else { -- selfTest(src, stride, W, H, srcFormat, dstFormat); -+ selfTest((const uint8_t * const *)src, stride, W, H, srcFormat, dstFormat); - res = 0; - } - error: - -From 94e48653a6bd1b8438887b486927e87b56651455 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 26 Apr 2023 16:31:23 +0000 -Subject: [PATCH 129/151] tests/swscale: Add a timing option - --t Where n is the number of time to loop the scale op. - Often useful to do it 10 times or so for better resolution - -(cherry picked from commit 50cd60a23a66254f911376602d07b30fcafbde96) ---- - libswscale/tests/swscale.c | 32 ++++++++++++++++++++++++++++++-- - 1 file changed, 30 insertions(+), 2 deletions(-) - -diff --git a/libswscale/tests/swscale.c b/libswscale/tests/swscale.c -index 4cf41d9f64..12776ffec7 100644 ---- a/libswscale/tests/swscale.c -+++ b/libswscale/tests/swscale.c -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - - #undef HAVE_AV_CONFIG_H - #include "libavutil/cpu.h" -@@ -78,6 +79,15 @@ struct Results { - uint32_t crc; - }; - -+static int time_rep = 0; -+ -+static uint64_t utime(void) -+{ -+ struct timespec ts; -+ clock_gettime(CLOCK_MONOTONIC, &ts); -+ return ts.tv_nsec / 1000 + (uint64_t)ts.tv_sec * 1000000; -+} -+ - // test by ref -> src -> dst -> out & compare out against ref - // ref & out are YV12 - static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h, -@@ -174,7 +184,7 @@ static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h, - goto end; - } - -- printf(" %s %dx%d -> %s %3dx%3d flags=%2d", -+ printf(" %s %4dx%4d -> %s %4dx%4d flags=%2d", - desc_src->name, srcW, srcH, - desc_dst->name, dstW, dstH, - flags); -@@ -182,6 +192,17 @@ static int doTest(const uint8_t * const ref[4], int refStride[4], int w, int h, - - sws_scale(dstContext, (const uint8_t * const*)src, srcStride, 0, srcH, dst, dstStride); - -+ if (time_rep != 0) -+ { -+ const uint64_t now = utime(); -+ uint64_t done; -+ for (i = 1; i != time_rep; ++i) { -+ sws_scale(dstContext, (const uint8_t * const*)src, srcStride, 0, srcH, dst, dstStride); -+ } -+ done = utime(); -+ printf(" T=%7"PRId64"us ", done-now); -+ } -+ - for (i = 0; i < 4 && dstStride[i]; i++) - crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), crc, dst[i], - dstStride[i] * dstH); -@@ -419,7 +440,14 @@ int main(int argc, char **argv) - char * p = NULL; - H = strtoul(arg2, &p, 0); - if (!H || *p) { -- fprintf(stderr, "bad height '%s' (H=%d, *p=%d)\n", arg2, H, *p); -+ fprintf(stderr, "bad height '%s'\n", arg2); -+ return -1; -+ } -+ } else if (!strcmp(argv[i], "-t")) { -+ char * p = NULL; -+ time_rep = (int)strtol(arg2, &p, 0); -+ if (*p) { -+ fprintf(stderr, "bad time repetitions '%s'\n", arg2); - return -1; - } - } else { - -From 406806d0b9d9cb113deb0d083a28cbccabab6825 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 20 Apr 2023 13:40:36 +0000 -Subject: [PATCH 130/151] swscale: RGB->YUV420 fix C template to allow odd - widths - -(cherry picked from commit 08b2023e7b5292df0adc6593e4d20087f9cef5c8) ---- - libswscale/rgb2rgb_template.c | 44 +++++++++++++++++++++++++++++++++++ - libswscale/swscale_unscaled.c | 11 ++++----- - 2 files changed, 49 insertions(+), 6 deletions(-) - -diff --git a/libswscale/rgb2rgb_template.c b/libswscale/rgb2rgb_template.c -index 703de90690..e711589e1e 100644 ---- a/libswscale/rgb2rgb_template.c -+++ b/libswscale/rgb2rgb_template.c -@@ -679,6 +679,19 @@ static void rgb24toyv12_x(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; - ydst[2 * i + 1] = Y; - } -+ if ((width & 1) != 0) { -+ unsigned int b = src[6 * i + 0]; -+ unsigned int g = src[6 * i + 1]; -+ unsigned int r = src[6 * i + 2]; -+ -+ unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; -+ unsigned int V = ((rv * r + gv * g + bv * b) >> RGB2YUV_SHIFT) + 128; -+ unsigned int U = ((ru * r + gu * g + bu * b) >> RGB2YUV_SHIFT) + 128; -+ -+ udst[i] = U; -+ vdst[i] = V; -+ ydst[2 * i] = Y; -+ } - ydst += lumStride; - src += srcStride; - -@@ -701,6 +714,15 @@ static void rgb24toyv12_x(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; - ydst[2 * i + 1] = Y; - } -+ if ((width & 1) != 0) { -+ unsigned int b = src[6 * i + 0]; -+ unsigned int g = src[6 * i + 1]; -+ unsigned int r = src[6 * i + 2]; -+ -+ unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; -+ -+ ydst[2 * i] = Y; -+ } - udst += chromStride; - vdst += chromStride; - ydst += lumStride; -@@ -767,6 +789,19 @@ static void rgbxtoyv12_x(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; - ydst[2 * i + 1] = Y; - } -+ if ((width & 1) != 0) { -+ unsigned int b = src[8 * i + 2]; -+ unsigned int g = src[8 * i + 1]; -+ unsigned int r = src[8 * i + 0]; -+ -+ unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; -+ unsigned int V = ((rv * r + gv * g + bv * b) >> RGB2YUV_SHIFT) + 128; -+ unsigned int U = ((ru * r + gu * g + bu * b) >> RGB2YUV_SHIFT) + 128; -+ -+ udst[i] = U; -+ vdst[i] = V; -+ ydst[2 * i] = Y; -+ } - ydst += lumStride; - src += srcStride; - -@@ -789,6 +824,15 @@ static void rgbxtoyv12_x(const uint8_t *src, uint8_t *ydst, uint8_t *udst, - Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; - ydst[2 * i + 1] = Y; - } -+ if ((width & 1) != 0) { -+ unsigned int b = src[8 * i + 2]; -+ unsigned int g = src[8 * i + 1]; -+ unsigned int r = src[8 * i + 0]; -+ -+ unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16; -+ -+ ydst[2 * i] = Y; -+ } - udst += chromStride; - vdst += chromStride; - ydst += lumStride; -diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c -index 053c06adf5..52469b2e4a 100644 ---- a/libswscale/swscale_unscaled.c -+++ b/libswscale/swscale_unscaled.c -@@ -2062,7 +2062,6 @@ void ff_get_unscaled_swscale(SwsContext *c) - const enum AVPixelFormat dstFormat = c->dstFormat; - const int flags = c->flags; - const int dstH = c->dstH; -- const int dstW = c->dstW; - int needsDither; - - needsDither = isAnyRGB(dstFormat) && -@@ -2120,12 +2119,12 @@ void ff_get_unscaled_swscale(SwsContext *c) - /* bgr24toYV12 */ - if (srcFormat == AV_PIX_FMT_BGR24 && - (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P) && -- !(flags & SWS_ACCURATE_RND) && !(dstW&1)) -+ !(flags & SWS_ACCURATE_RND)) - c->convert_unscaled = bgr24ToYv12Wrapper; - /* rgb24toYV12 */ - if (srcFormat == AV_PIX_FMT_RGB24 && - (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P) && -- !(flags & SWS_ACCURATE_RND) && !(dstW&1)) -+ !(flags & SWS_ACCURATE_RND)) - c->convert_unscaled = rgb24ToYv12Wrapper; - - /* bgrxtoYV12 */ -@@ -2136,17 +2135,17 @@ void ff_get_unscaled_swscale(SwsContext *c) - /* rgbx24toYV12 */ - if (((srcFormat == AV_PIX_FMT_RGBA && dstFormat == AV_PIX_FMT_YUV420P) || - (srcFormat == AV_PIX_FMT_RGB0 && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && -- !(flags & SWS_ACCURATE_RND) && !(dstW&1)) -+ !(flags & SWS_ACCURATE_RND)) - c->convert_unscaled = rgbxToYv12Wrapper; - /* xbgrtoYV12 */ - if (((srcFormat == AV_PIX_FMT_ABGR && dstFormat == AV_PIX_FMT_YUV420P) || - (srcFormat == AV_PIX_FMT_0BGR && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && -- !(flags & SWS_ACCURATE_RND) && !(dstW&1)) -+ !(flags & SWS_ACCURATE_RND)) - c->convert_unscaled = xbgrToYv12Wrapper; - /* xrgb24toYV12 */ - if (((srcFormat == AV_PIX_FMT_ARGB && dstFormat == AV_PIX_FMT_YUV420P) || - (srcFormat == AV_PIX_FMT_0RGB && (dstFormat == AV_PIX_FMT_YUV420P || dstFormat == AV_PIX_FMT_YUVA420P))) && -- !(flags & SWS_ACCURATE_RND) && !(dstW&1)) -+ !(flags & SWS_ACCURATE_RND)) - c->convert_unscaled = xrgbToYv12Wrapper; - - /* RGB/BGR -> RGB/BGR (no dither needed forms) */ - -From 68c6482d9473ce774e87cac2455a8c7b3e2d99b4 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Thu, 4 May 2023 14:26:14 +0000 -Subject: [PATCH 131/151] rtpenc: Add code to send H264 new extradata in - sidedata - -Fixes issue with pi V4L2 H264 encode which cannot create extradata -at init time. - -(cherry picked from commit 4f852b4b093f841b64b4934a6f1720e98e4e0f2c) ---- - libavformat/rtpenc.c | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c -index a8d296a154..f67dc2a15a 100644 ---- a/libavformat/rtpenc.c -+++ b/libavformat/rtpenc.c -@@ -19,6 +19,7 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -+#include "avc.h" - #include "avformat.h" - #include "mpegts.h" - #include "internal.h" -@@ -585,8 +586,25 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) - ff_rtp_send_vc2hq(s1, pkt->data, size, st->codecpar->field_order != AV_FIELD_PROGRESSIVE ? 1 : 0); - break; - case AV_CODEC_ID_H264: -+ { -+ uint8_t *side_data; -+ int side_data_size = 0; -+ -+ side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, -+ &side_data_size); -+ -+ if (side_data_size != 0) { -+ int ps_size = side_data_size; -+ uint8_t * ps_buf = NULL; -+ -+ ff_avc_write_annexb_extradata(side_data, &ps_buf, &ps_size); -+ av_log(s1, AV_LOG_TRACE, "H264: write side data=%d\n", ps_size); -+ ff_rtp_send_h264_hevc(s1, ps_buf ? ps_buf : side_data, ps_size); -+ av_free(ps_buf); -+ } - ff_rtp_send_h264_hevc(s1, pkt->data, size); - break; -+ } - case AV_CODEC_ID_H261: - ff_rtp_send_h261(s1, pkt->data, size); - break; - -From 5240cc7fc3abed8af5f178c5461ca9fe11a7d5e4 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Mon, 5 Jun 2023 08:34:38 +0000 -Subject: [PATCH 132/151] rgb2rgb: Fix luma narrow+saturation instruction - -(cherry picked from commit 9cdac1c08ad5c0aea28907d1d3fd0bdda387955a) ---- - libswscale/aarch64/rgb2rgb_neon.S | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/libswscale/aarch64/rgb2rgb_neon.S b/libswscale/aarch64/rgb2rgb_neon.S -index 978ab443ea..476ca723a0 100644 ---- a/libswscale/aarch64/rgb2rgb_neon.S -+++ b/libswscale/aarch64/rgb2rgb_neon.S -@@ -203,11 +203,11 @@ function ff_bgr24toyv12_aarch64, export=1 - shrn v26.4h, v26.4s, #12 - shrn2 v26.8h, v27.4s, #12 - add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) -- uqrshrn v26.8b, v26.8h, #3 -+ sqrshrun v26.8b, v26.8h, #3 - shrn v28.4h, v28.4s, #12 - shrn2 v28.8h, v29.4s, #12 - add v28.8h, v28.8h, v6.8h -- uqrshrn2 v26.16b, v28.8h, #3 -+ sqrshrun2 v26.16b, v28.8h, #3 - // Y0/Y1 - - // U -@@ -282,11 +282,11 @@ function ff_bgr24toyv12_aarch64, export=1 - shrn v26.4h, v26.4s, #12 - shrn2 v26.8h, v27.4s, #12 - add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) -- uqrshrn v26.8b, v26.8h, #3 -+ sqrshrun v26.8b, v26.8h, #3 - shrn v28.4h, v28.4s, #12 - shrn2 v28.8h, v29.4s, #12 - add v28.8h, v28.8h, v6.8h -- uqrshrn2 v26.16b, v28.8h, #3 -+ sqrshrun2 v26.16b, v28.8h, #3 - // Y0/Y1 - - // U -@@ -416,11 +416,11 @@ function ff_bgr24toyv12_aarch64, export=1 - shrn v26.4h, v26.4s, #12 - shrn2 v26.8h, v27.4s, #12 - add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) -- uqrshrn v26.8b, v26.8h, #3 -+ sqrshrun v26.8b, v26.8h, #3 - shrn v28.4h, v28.4s, #12 - shrn2 v28.8h, v29.4s, #12 - add v28.8h, v28.8h, v6.8h -- uqrshrn2 v26.16b, v28.8h, #3 -+ sqrshrun2 v26.16b, v28.8h, #3 - // Y0/Y1 - - subs w9, w9, #16 -@@ -464,11 +464,11 @@ function ff_bgr24toyv12_aarch64, export=1 - shrn v26.4h, v26.4s, #12 - shrn2 v26.8h, v27.4s, #12 - add v26.8h, v26.8h, v6.8h // +128 (>> 3 = 16) -- uqrshrn v26.8b, v26.8h, #3 -+ sqrshrun v26.8b, v26.8h, #3 - shrn v28.4h, v28.4s, #12 - shrn2 v28.8h, v29.4s, #12 - add v28.8h, v28.8h, v6.8h -- uqrshrn2 v26.16b, v28.8h, #3 -+ sqrshrun2 v26.16b, v28.8h, #3 - // Y0/Y1 - - // Here: - -From 9474d9d227f2af488d5d2bd614c5c707479ca3c3 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Sun, 4 Jun 2023 13:37:59 +0000 -Subject: [PATCH 133/151] v4l2_m2m_dec: Tweak pending count to use dts & - reorder size - -(cherry picked from commit ca438b382c90f9a5f58f4708205e6ac25395db2a) ---- - libavcodec/v4l2_m2m.h | 1 + - libavcodec/v4l2_m2m_dec.c | 53 +++++++++++++++++++++++++++++++-------- - 2 files changed, 43 insertions(+), 11 deletions(-) - -diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h -index ded1478a49..a506e69d67 100644 ---- a/libavcodec/v4l2_m2m.h -+++ b/libavcodec/v4l2_m2m.h -@@ -115,6 +115,7 @@ typedef struct V4L2m2mContext { - - /* req pkt */ - int req_pkt; -+ int reorder_size; - - /* Ext data sent */ - int extdata_sent; -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index d124c7b1fc..13af62e819 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -121,13 +121,18 @@ log_dump(void * logctx, int lvl, const void * const data, const size_t len) - } - #endif - --static int64_t pts_stats_guess(const pts_stats_t * const stats) -+static unsigned int pts_stats_interval(const pts_stats_t * const stats) -+{ -+ return stats->last_interval; -+} -+ -+static int64_t pts_stats_guess(const pts_stats_t * const stats, const int fail_bad_guess) - { - if (stats->last_count <= 1) - return stats->last_pts; - if (stats->last_pts == AV_NOPTS_VALUE || -- stats->last_interval == 0 || -- stats->last_count >= STATS_LAST_COUNT_MAX) -+ fail_bad_guess && (stats->last_interval == 0 || -+ stats->last_count >= STATS_LAST_COUNT_MAX)) - return AV_NOPTS_VALUE; - return stats->last_pts + (int64_t)(stats->last_count - 1) * (int64_t)stats->last_interval; - } -@@ -345,7 +350,7 @@ set_best_effort_pts(AVCodecContext *const avctx, - { - pts_stats_add(ps, frame->pts); - -- frame->best_effort_timestamp = pts_stats_guess(ps); -+ frame->best_effort_timestamp = pts_stats_guess(ps, 1); - // If we can't guess from just PTS - try DTS - if (frame->best_effort_timestamp == AV_NOPTS_VALUE) - frame->best_effort_timestamp = frame->pkt_dts; -@@ -380,15 +385,25 @@ xlat_init(xlat_track_t * const x) - } - - static int --xlat_pending(const xlat_track_t * const x) -+xlat_pending(const V4L2m2mContext * const s) - { -+ const xlat_track_t *const x = &s->xlat; - unsigned int n = x->track_no % FF_V4L2_M2M_TRACK_SIZE; - int i; -- const int64_t now = x->last_pts; -+ const int64_t now = pts_stats_guess(&s->pts_stat, 0); -+ int64_t first_dts = AV_NOPTS_VALUE; -+ int no_dts_count = 0; -+ unsigned int interval = pts_stats_interval(&s->pts_stat); - - for (i = 0; i < FF_V4L2_M2M_TRACK_SIZE; ++i, n = (n - 1) & (FF_V4L2_M2M_TRACK_SIZE - 1)) { - const V4L2m2mTrackEl * const t = x->track_els + n; - -+ if (first_dts == AV_NOPTS_VALUE) -+ if (t->dts == AV_NOPTS_VALUE) -+ ++no_dts_count; -+ else -+ first_dts = t->dts; -+ - // Discard only set on never-set or flushed entries - // So if we get here we've never successfully decoded a frame so allow - // more frames into the buffer before stalling -@@ -408,6 +423,18 @@ xlat_pending(const xlat_track_t * const x) - break; - } - -+ if (first_dts != AV_NOPTS_VALUE && now != AV_NOPTS_VALUE && interval != 0 && s->reorder_size != 0) { -+ const int iframes = (first_dts - now) / (int)interval; -+ const int t = iframes - s->reorder_size + no_dts_count; -+ -+// av_log(s->avctx, AV_LOG_DEBUG, "Last:%"PRId64", Now:%"PRId64", First:%"PRId64", delta=%"PRId64", frames=%d, nodts=%d\n", -+// x->last_dts, now, first_dts, first_dts - now, iframes, no_dts_count); -+ -+ if (iframes > 0 && iframes < 64 && t < i) { -+ return t; -+ } -+ } -+ - return i; - } - -@@ -585,12 +612,12 @@ static int qbuf_wait(AVCodecContext * const avctx, V4L2Context * const ctx) - static int v4l2_receive_frame(AVCodecContext *avctx, AVFrame *frame) - { - V4L2m2mContext *const s = ((V4L2m2mPriv*)avctx->priv_data)->context; -- int src_rv = NQ_OK; -+ int src_rv = -1; - int dst_rv = 1; // Non-zero (done), non-negative (error) number - unsigned int i = 0; - - do { -- const int pending = xlat_pending(&s->xlat); -+ const int pending = xlat_pending(s); - const int prefer_dq = (pending > 4); - const int last_src_rv = src_rv; - -@@ -966,8 +993,10 @@ static uint32_t max_coded_size(const AVCodecContext * const avctx) - } - - static void --parse_extradata(AVCodecContext *avctx) -+parse_extradata(AVCodecContext * const avctx, V4L2m2mContext * const s) - { -+ s->reorder_size = 0; -+ - if (!avctx->extradata || !avctx->extradata_size) - return; - -@@ -996,6 +1025,7 @@ parse_extradata(AVCodecContext *avctx) - avctx->profile = ff_h264_get_profile(sps); - avctx->level = sps->level_idc; - } -+ s->reorder_size = sps->num_reorder_frames; - } - ff_h264_ps_uninit(&ps); - break; -@@ -1025,6 +1055,7 @@ parse_extradata(AVCodecContext *avctx) - if (sps) { - avctx->profile = sps->ptl.general_ptl.profile_idc; - avctx->level = sps->ptl.general_ptl.level_idc; -+ s->reorder_size = sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering; - } - } - ff_hevc_ps_uninit(&ps); -@@ -1057,12 +1088,12 @@ static av_cold int v4l2_decode_init(AVCodecContext *avctx) - avctx->ticks_per_frame = 2; - } - -- parse_extradata(avctx); -- - ret = ff_v4l2_m2m_create_context(priv, &s); - if (ret < 0) - return ret; - -+ parse_extradata(avctx, s); -+ - xlat_init(&s->xlat); - pts_stats_init(&s->pts_stat, avctx, "decoder"); - - -From 2145b9c9177f0fe9569ce39e2d4eb629caf8bd47 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Wed, 7 Jun 2023 11:14:52 +0000 -Subject: [PATCH 134/151] v4l2_m2m: Add encode size check - -Previously an out of bounds size would fail whilst trying to copy the -buffer with an unhelpful message. This produces a better error at init -time. - -(cherry picked from commit 0b61c4617e26f043d28d44c8767f7b9fd4882f97) ---- - libavcodec/v4l2_m2m.c | 43 +++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 43 insertions(+) - -diff --git a/libavcodec/v4l2_m2m.c b/libavcodec/v4l2_m2m.c -index f802687b1b..28d9ed4988 100644 ---- a/libavcodec/v4l2_m2m.c -+++ b/libavcodec/v4l2_m2m.c -@@ -109,6 +109,44 @@ static int v4l2_prepare_contexts(V4L2m2mContext *s, int probe) - return AVERROR(EINVAL); - } - -+static int check_size(AVCodecContext * const avctx, V4L2m2mContext * const s) -+{ -+ struct v4l2_format fmt = {.type = s->output.type}; -+ int rv; -+ uint32_t pixfmt = ff_v4l2_format_avfmt_to_v4l2(avctx->pix_fmt); -+ unsigned int w; -+ unsigned int h; -+ -+ if (V4L2_TYPE_IS_MULTIPLANAR(fmt.type)) { -+ fmt.fmt.pix_mp.pixelformat = pixfmt; -+ fmt.fmt.pix_mp.width = avctx->width; -+ fmt.fmt.pix_mp.height = avctx->height; -+ } -+ else { -+ fmt.fmt.pix.pixelformat = pixfmt; -+ fmt.fmt.pix.width = avctx->width; -+ fmt.fmt.pix.height = avctx->height; -+ } -+ -+ rv = ioctl(s->fd, VIDIOC_TRY_FMT, &fmt); -+ -+ if (rv != 0) { -+ rv = AVERROR(errno); -+ av_log(avctx, AV_LOG_ERROR, "%s: Tryfmt failed: %s\n", __func__, av_err2str(rv)); -+ return rv; -+ } -+ -+ w = ff_v4l2_get_format_width(&fmt); -+ h = ff_v4l2_get_format_height(&fmt); -+ -+ if (w < avctx->width || h < avctx->height) { -+ av_log(avctx, AV_LOG_WARNING, "%s: Size check failed: asked for %dx%d, got: %dx%d\n", __func__, avctx->width, avctx->height, w, h); -+ return AVERROR(EINVAL); -+ } -+ -+ return 0; -+} -+ - static int v4l2_probe_driver(V4L2m2mContext *s) - { - void *log_ctx = s->avctx; -@@ -128,6 +166,11 @@ static int v4l2_probe_driver(V4L2m2mContext *s) - goto done; - } - -+ // If being given frames (encode) check that V4L2 can cope with the size -+ if (s->output.av_codec_id == AV_CODEC_ID_RAWVIDEO && -+ (ret = check_size(s->avctx, s)) != 0) -+ goto done; -+ - ret = ff_v4l2_context_get_format(&s->capture, 1); - if (ret) { - av_log(log_ctx, AV_LOG_DEBUG, "v4l2 capture format not supported\n"); - -From 805985ea191c98885a74dbf994b1ca11551cd81e Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 9 Jun 2023 10:28:12 +0000 -Subject: [PATCH 135/151] vf_bwdif: Add attributes to ask for vectorization - -(cherry picked from commit 281250290ba5c2dcd8676e9a261050e65c10bcb7) ---- - libavfilter/vf_bwdif.c | 29 +++++++++++++++-------------- - 1 file changed, 15 insertions(+), 14 deletions(-) - -diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c -index 65c617ebb3..09e68523bb 100644 ---- a/libavfilter/vf_bwdif.c -+++ b/libavfilter/vf_bwdif.c -@@ -74,10 +74,10 @@ typedef struct ThreadData { - int temporal_diff1 =(FFABS(prev[mrefs] - c) + FFABS(prev[prefs] - e)) >> 1; \ - int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e)) >> 1; \ - int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); \ -- \ -+ {/*\ - if (!diff) { \ - dst[0] = d; \ -- } else { -+ } else {*/ - - #define SPAT_CHECK() \ - int b = ((prev2[mrefs2] + next2[mrefs2]) >> 1) - c; \ -@@ -89,15 +89,16 @@ typedef struct ThreadData { - diff = FFMAX3(diff, min, -max); - - #define FILTER_LINE() \ -+ int i1, i2; \ - SPAT_CHECK() \ -- if (FFABS(c - e) > temporal_diff0) { \ -- interpol = (((coef_hf[0] * (prev2[0] + next2[0]) \ -+ /*if (FFABS(c - e) > temporal_diff0)*/ { \ -+ i1 = (((coef_hf[0] * (prev2[0] + next2[0]) \ - - coef_hf[1] * (prev2[mrefs2] + next2[mrefs2] + prev2[prefs2] + next2[prefs2]) \ - + coef_hf[2] * (prev2[mrefs4] + next2[mrefs4] + prev2[prefs4] + next2[prefs4])) >> 2) \ - + coef_lf[0] * (c + e) - coef_lf[1] * (cur[mrefs3] + cur[prefs3])) >> 13; \ -- } else { \ -- interpol = (coef_sp[0] * (c + e) - coef_sp[1] * (cur[mrefs3] + cur[prefs3])) >> 13; \ -- } -+ } /*else*/ { \ -+ i2 = (coef_sp[0] * (c + e) - coef_sp[1] * (cur[mrefs3] + cur[prefs3])) >> 13; \ -+ }interpol = FFABS(c - e) > temporal_diff0 ? i1:i2;\ - - #define FILTER_EDGE() \ - if (spat) { \ -@@ -111,7 +112,7 @@ typedef struct ThreadData { - else if (interpol < d - diff) \ - interpol = d - diff; \ - \ -- dst[0] = av_clip(interpol, 0, clip_max); \ -+ dst[0] = !diff ? d : av_clip(interpol, 0, clip_max); \ - } \ - \ - dst++; \ -@@ -122,7 +123,7 @@ typedef struct ThreadData { - next2++; \ - } - --static void filter_intra(void *dst1, void *cur1, int w, int prefs, int mrefs, -+static void __attribute__((optimize("tree-vectorize"))) filter_intra(void *restrict dst1, void *restrict cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max) - { - uint8_t *dst = dst1; -@@ -132,7 +133,7 @@ static void filter_intra(void *dst1, void *cur1, int w, int prefs, int mrefs, - FILTER_INTRA() - } - --static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, -+static void __attribute__((optimize("tree-vectorize"))) filter_line_c(void *restrict dst1, void *restrict prev1, void *restrict cur1, void *restrict next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int prefs3, int mrefs3, int prefs4, int mrefs4, - int parity, int clip_max) -@@ -150,7 +151,7 @@ static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, - FILTER2() - } - --static void filter_edge(void *dst1, void *prev1, void *cur1, void *next1, -+static void __attribute__((optimize("tree-vectorize"))) filter_edge(void *restrict dst1, void *restrict prev1, void *restrict cur1, void *restrict next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int parity, int clip_max, int spat) - { -@@ -167,7 +168,7 @@ static void filter_edge(void *dst1, void *prev1, void *cur1, void *next1, - FILTER2() - } - --static void filter_intra_16bit(void *dst1, void *cur1, int w, int prefs, int mrefs, -+static void __attribute__((optimize("tree-vectorize"))) filter_intra_16bit(void *restrict dst1, void *restrict cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max) - { - uint16_t *dst = dst1; -@@ -177,7 +178,7 @@ static void filter_intra_16bit(void *dst1, void *cur1, int w, int prefs, int mre - FILTER_INTRA() - } - --static void filter_line_c_16bit(void *dst1, void *prev1, void *cur1, void *next1, -+static void __attribute__((optimize("tree-vectorize"))) filter_line_c_16bit(void *restrict dst1, void *restrict prev1, void *restrict cur1, void *restrict next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int prefs3, int mrefs3, int prefs4, int mrefs4, - int parity, int clip_max) -@@ -195,7 +196,7 @@ static void filter_line_c_16bit(void *dst1, void *prev1, void *cur1, void *next1 - FILTER2() - } - --static void filter_edge_16bit(void *dst1, void *prev1, void *cur1, void *next1, -+static void __attribute__((optimize("tree-vectorize"))) filter_edge_16bit(void *restrict dst1, void *restrict prev1, void *restrict cur1, void *restrict next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int parity, int clip_max, int spat) - { - -From f4012f09da1c57a0aa5db01f9096992d0c385f7b Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 13 Jun 2023 13:07:55 +0000 -Subject: [PATCH 136/151] v4l2m2m_dec: Fix h264 reorder size if no sps - initially - -(cherry picked from commit 8832f7924bf47cbca0de251d7b406917f958ebf4) ---- - libavcodec/v4l2_m2m_dec.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c -index 13af62e819..11c83b2d66 100644 ---- a/libavcodec/v4l2_m2m_dec.c -+++ b/libavcodec/v4l2_m2m_dec.c -@@ -1024,8 +1024,8 @@ parse_extradata(AVCodecContext * const avctx, V4L2m2mContext * const s) - if (sps) { - avctx->profile = ff_h264_get_profile(sps); - avctx->level = sps->level_idc; -+ s->reorder_size = sps->num_reorder_frames; - } -- s->reorder_size = sps->num_reorder_frames; - } - ff_h264_ps_uninit(&ps); - break; - -From fd31937e4befa2368d48e234d66fb962246bf777 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 30 Jun 2023 18:03:29 +0000 -Subject: [PATCH 137/151] sand_fns: Add missing uxtw for neon stride - ---- - libavutil/aarch64/rpi_sand_neon.S | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/libavutil/aarch64/rpi_sand_neon.S b/libavutil/aarch64/rpi_sand_neon.S -index 2f07d9674c..19411cf3f1 100644 ---- a/libavutil/aarch64/rpi_sand_neon.S -+++ b/libavutil/aarch64/rpi_sand_neon.S -@@ -469,6 +469,7 @@ endfunc - function ff_rpi_sand30_lines_to_planar_y16, export=1 - lsl w4, w4, #7 - sub w4, w4, #64 -+ uxtw x4, w4 - sub w1, w1, w7, lsl #1 - uxtw x6, w6 - add x8, x2, x6, lsl #7 -@@ -634,6 +635,7 @@ endfunc - function ff_rpi_sand30_lines_to_planar_y8, export=1 - lsl w4, w4, #7 - sub w4, w4, #64 -+ uxtw x4, w4 - sub w1, w1, w7 - uxtw x6, w6 - add x8, x2, x6, lsl #7 - -From f6a19a36ffe0dbe0a6e2e450dafec6711db19057 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 30 Jun 2023 18:12:16 +0000 -Subject: [PATCH 138/151] sand_fns: Rework aarch64 neon - sand30_lines_to_planar_c16 - -Previous version could overflow its write buffer on small buffers -which sometimes crashed WPP_F_ericsson_MAIN10_2. - -This version is probably faster too ---- - libavutil/aarch64/rpi_sand_neon.S | 329 ++++++++++++++---------------- - 1 file changed, 151 insertions(+), 178 deletions(-) - -diff --git a/libavutil/aarch64/rpi_sand_neon.S b/libavutil/aarch64/rpi_sand_neon.S -index 19411cf3f1..af7e2a88c4 100644 ---- a/libavutil/aarch64/rpi_sand_neon.S -+++ b/libavutil/aarch64/rpi_sand_neon.S -@@ -248,199 +248,172 @@ incomplete_block_loop_end_c8: - ret - endfunc - --//void ff_rpi_sand30_lines_to_planar_c16( --// uint8_t * dst_u, // [x0] --// unsigned int dst_stride_u, // [w1] == _w*2 --// uint8_t * dst_v, // [x2] --// unsigned int dst_stride_v, // [w3] == _w*2 --// const uint8_t * src, // [x4] --// unsigned int stride1, // [w5] == 128 --// unsigned int stride2, // [w6] --// unsigned int _x, // [w7] == 0 --// unsigned int y, // [sp, #0] == 0 --// unsigned int _w, // [sp, #8] -> w3 --// unsigned int h); // [sp, #16] -> w7 -- --.macro rpi_sand30_lines_to_planar_c16_block_half -- ld1 { v0.4s, v1.4s, v2.4s, v3.4s }, [x13], #64 -- -- xtn v4.4h, v0.4s -- ushr v0.4s, v0.4s, #10 -- xtn v5.4h, v0.4s -- ushr v0.4s, v0.4s, #10 -- xtn v6.4h, v0.4s -- xtn2 v4.8h, v1.4s -- ushr v1.4s, v1.4s, #10 -- xtn2 v5.8h, v1.4s -- ushr v1.4s, v1.4s, #10 -- xtn2 v6.8h, v1.4s -- and v4.16b, v4.16b, v16.16b -- and v5.16b, v5.16b, v16.16b -- and v6.16b, v6.16b, v16.16b -- st3 { v4.8h, v5.8h, v6.8h }, [sp], #48 -- -- xtn v4.4h, v2.4s -- ushr v2.4s, v2.4s, #10 -- xtn v5.4h, v2.4s -- ushr v2.4s, v2.4s, #10 -- xtn v6.4h, v2.4s -- xtn2 v4.8h, v3.4s -- ushr v3.4s, v3.4s, #10 -- xtn2 v5.8h, v3.4s -- ushr v3.4s, v3.4s, #10 -- xtn2 v6.8h, v3.4s -- and v4.16b, v4.16b, v16.16b -- and v5.16b, v5.16b, v16.16b -- and v6.16b, v6.16b, v16.16b -- st3 { v4.8h, v5.8h, v6.8h }, [sp] -- sub sp, sp, #48 --.endm -- --function ff_rpi_sand30_lines_to_planar_c16, export=1 -- stp x19, x20, [sp, #-48]! -- stp x21, x22, [sp, #16] -- stp x23, x24, [sp, #32] -- -- ldr w3, [sp, #48+8] // w3 = width -- ldr w7, [sp, #48+16] // w7 = height -- -- // reserve space on the stack for intermediate results -- sub sp, sp, #256 -+// Unzip chroma -+// -+// On entry: -+// a0 = V0, U2, ... -+// a1 = U0, V1, ... -+// a2 = U1, V2, ... -+// b0 = V8, U10, ... -+// b1 = U8, V9, ... -+// b2 = U9, V10, ... -+// -+// On exit: -+// d0 = U0, U3, ... -+// ... -+// a0 = V0, V3, .. -+// ... -+// -+// Reg order for USAND is a1, a0, a2 (i.e. swap natural order of 1st 2 dest regs) - -- // number of 128byte blocks per row, w8 = width / 48 -- mov w9, #48 -- udiv w8, w3, w9 -+.macro UZPH_C d0, d1, d2, a0, a1, a2, b0, b1, b2 -+ uzp1 \d0\().8h, \a1\().8h, \b1\().8h -+ uzp1 \d1\().8h, \a2\().8h, \b2\().8h -+ uzp2 \d2\().8h, \a0\().8h, \b0\().8h - -- // remaining pixels (rem_pix) per row, w9 = width - w8 * 48 -- mul w9, w8, w9 -- sub w9, w3, w9 -+ uzp1 \a0\().8h, \a0\().8h, \b0\().8h -+ uzp2 \a1\().8h, \a1\().8h, \b1\().8h -+ uzp2 \a2\().8h, \a2\().8h, \b2\().8h -+.endm - -- // row offset, the beginning of the next row to process -- eor w10, w10, w10 -+// SAND30 -> 10bit -+.macro USAND10 d0, d1, d2, a0, a1 -+ shrn \d2\().4h, \a0\().4s, #14 -+ xtn \d0\().4h, \a0\().4s -+ shrn \d1\().4h, \a0\().4s, #10 - -- // offset to the beginning of the next block, w11 = stride2 * 128 - 128 -- lsl w11, w6, #7 -- sub w11, w11, #128 -+ shrn2 \d2\().8h, \a1\().4s, #14 -+ xtn2 \d0\().8h, \a1\().4s -+ shrn2 \d1\().8h, \a1\().4s, #10 - -- // decrease the height by one and in case of remaining pixels increase the block count by one -- sub w7, w7, #1 -- cmp w9, #0 -- cset w19, ne // w19 == 1 iff reamining pixels != 0 -- add w8, w8, w19 -+ ushr \d2\().8h, \d2\().8h, #6 -+ bic \d0\().8h, #0xfc, lsl #8 -+ bic \d1\().8h, #0xfc, lsl #8 -+.endm - -- // bytes we have to move dst back by at the end of every row -- mov w21, #48*2 -- mul w21, w21, w8 -- sub w21, w1, w21 -+// void ff_rpi_sand30_lines_to_planar_c16( -+// uint8_t * dst_u, // [x0] -+// unsigned int dst_stride_u, // [w1] -+// uint8_t * dst_v, // [x2] -+// unsigned int dst_stride_v, // [w3] -+// const uint8_t * src, // [x4] -+// unsigned int stride1, // [w5] 128 -+// unsigned int stride2, // [w6] -+// unsigned int _x, // [w7] 0 -+// unsigned int y, // [sp, #0] -+// unsigned int _w, // [sp, #8] w9 -+// unsigned int h); // [sp, #16] w10 - -- mov w20, #0 // w20 = flag, last row processed -+function ff_rpi_sand30_lines_to_planar_c16, export=1 -+ ldr w7, [sp, #0] // y -+ ldr w8, [sp, #8] // _w -+ ldr w10, [sp, #16] // h -+ lsl w6, w6, #7 // Fixup stride2 -+ sub w6, w6, #64 -+ uxtw x6, w6 -+ sub w1, w1, w8, LSL #1 // Fixup chroma strides -+ sub w3, w3, w8, LSL #1 -+ lsl w7, w7, #7 // Add y to src -+ add x4, x4, w7, UXTW -+10: -+ mov w13, #0 -+ mov x5, x4 -+ mov w9, w8 -+1: -+ ld1 {v0.4s-v3.4s}, [x5], #64 -+ ld1 {v4.4s-v7.4s}, [x5], x6 - -- mov x12, #0x03ff03ff03ff03ff -- dup v16.2d, x12 -+ USAND10 v17, v16, v18, v0, v1 -+ USAND10 v20, v19, v21, v2, v3 -+ UZPH_C v0, v1, v2, v16, v17, v18, v19, v20, v21 -+ USAND10 v23, v22, v24, v4, v5 -+ USAND10 v26, v25, v27, v6, v7 -+ UZPH_C v4, v5, v6, v22, v23, v24, v25, v26, v27 - -- // iterate through rows, row counter = w12 = 0 -- eor w12, w12, w12 --row_loop_c16: -- cmp w12, w7 -- bge row_loop_c16_fin -+ subs w9, w9, #48 -+ blt 2f - -- // address of row data = src + row_offset -- mov x13, x4 -- add x13, x13, x10 -+ st3 {v0.8h-v2.8h}, [x0], #48 -+ st3 {v4.8h-v6.8h}, [x0], #48 -+ st3 {v16.8h-v18.8h}, [x2], #48 -+ st3 {v22.8h-v24.8h}, [x2], #48 - -- eor w14, w14, w14 --block_loop_c16: -- cmp w14, w8 -- bge block_loop_c16_fin -- -- rpi_sand30_lines_to_planar_c16_block_half -- -- ld2 { v0.8h, v1.8h }, [sp], #32 -- ld2 { v2.8h, v3.8h }, [sp], #32 -- ld2 { v4.8h, v5.8h }, [sp] -- sub sp, sp, #64 -- -- st1 { v0.8h }, [x0], #16 -- st1 { v2.8h }, [x0], #16 -- st1 { v4.8h }, [x0], #16 -- st1 { v1.8h }, [x2], #16 -- st1 { v3.8h }, [x2], #16 -- st1 { v5.8h }, [x2], #16 -- -- rpi_sand30_lines_to_planar_c16_block_half -- -- ld2 { v0.8h, v1.8h }, [sp], #32 -- ld2 { v2.8h, v3.8h }, [sp], #32 -- ld2 { v4.8h, v5.8h }, [sp] -- sub sp, sp, #64 -- -- st1 { v0.8h }, [x0], #16 -- st1 { v2.8h }, [x0], #16 -- st1 { v4.8h }, [x0], #16 -- st1 { v1.8h }, [x2], #16 -- st1 { v3.8h }, [x2], #16 -- st1 { v5.8h }, [x2], #16 -- -- add x13, x13, x11 // offset to next block -- add w14, w14, #1 -- b block_loop_c16 --block_loop_c16_fin: -+ bne 1b -+11: -+ subs w10, w10, #1 -+ add x4, x4, #128 -+ add x0, x0, w1, UXTW -+ add x2, x2, w3, UXTW -+ bne 10b -+99: -+ ret - -- add w10, w10, #128 -- add w12, w12, #1 -- add x0, x0, w21, sxtw // move dst pointers back by x21 -- add x2, x2, w21, sxtw -- b row_loop_c16 --row_loop_c16_fin: -- -- cmp w20, #1 -- beq row_loop_c16_fin2 -- mov w20, #1 -- sub w8, w8, w19 // decrease block count by w19 -- add w7, w7, #1 // increase height -- b row_loop_c16 -- --row_loop_c16_fin2: -- sub x0, x0, w21, sxtw // readd x21 in case of the last row -- sub x2, x2, w21, sxtw // so that we can write out the few remaining pixels -- -- // last incomplete block to be finished -- // read operations are fine, stride2 is more than large enough even if rem_pix is 0 -- rpi_sand30_lines_to_planar_c16_block_half -- ld2 { v0.8h, v1.8h }, [sp], #32 -- ld2 { v2.8h, v3.8h }, [sp], #32 -- ld2 { v4.8h, v5.8h }, [sp], #32 -- rpi_sand30_lines_to_planar_c16_block_half -- ld2 { v0.8h, v1.8h }, [sp], #32 -- ld2 { v2.8h, v3.8h }, [sp], #32 -- ld2 { v4.8h, v5.8h }, [sp] -- sub sp, sp, #160 -- -- mov x4, sp -- eor w20, w20, w20 --rem_pix_c16_loop: -- cmp w20, w9 -- bge rem_pix_c16_fin -- -- ldr w22, [x4], #4 -- str w22, [x0], #2 -- lsr w22, w22, #16 -- str w22, [x2], #2 -- -- add w20, w20, #1 -- b rem_pix_c16_loop --rem_pix_c16_fin: -- -- add sp, sp, #256 -- -- ldp x23, x24, [sp, #32] -- ldp x21, x22, [sp, #16] -- ldp x19, x20, [sp], #48 -- ret -+// Partial final write -+2: -+ cmp w9, #24-48 -+ blt 1f -+ st3 {v0.8h - v2.8h}, [x0], #48 -+ st3 {v16.8h - v18.8h}, [x2], #48 -+ beq 11b -+ mov v0.16b, v4.16b -+ mov v1.16b, v5.16b -+ sub w9, w9, #24 -+ mov v2.16b, v6.16b -+ mov v16.16b, v22.16b -+ mov v17.16b, v23.16b -+ mov v18.16b, v24.16b -+1: -+ cmp w9, #12-48 -+ blt 1f -+ st3 {v0.4h - v2.4h}, [x0], #24 -+ st3 {v16.4h - v18.4h}, [x2], #24 -+ beq 11b -+ mov v0.2d[0], v0.2d[1] -+ sub w9, w9, #12 -+ mov v1.2d[0], v1.2d[1] -+ mov v2.2d[0], v2.2d[1] -+ mov v16.2d[0], v16.2d[1] -+ mov v17.2d[0], v17.2d[1] -+ mov v18.2d[0], v18.2d[1] -+1: -+ cmp w9, #6-48 -+ blt 1f -+ st3 {v0.h - v2.h}[0], [x0], #6 -+ st3 {v0.h - v2.h}[1], [x0], #6 -+ st3 {v16.h - v18.h}[0], [x2], #6 -+ st3 {v16.h - v18.h}[1], [x2], #6 -+ beq 11b -+ mov v0.s[0], v0.s[1] -+ sub w9, w9, #6 -+ mov v1.s[0], v1.s[1] -+ mov v2.s[0], v2.s[1] -+ mov v16.s[0], v16.s[1] -+ mov v17.s[0], v17.s[1] -+ mov v18.s[0], v18.s[1] -+1: -+ cmp w9, #3-48 -+ blt 1f -+ st3 {v0.h - v2.h}[0], [x0], #6 -+ st3 {v16.h - v18.h}[0], [x2], #6 -+ beq 11b -+ mov v0.h[0], v0.h[1] -+ sub w9, w9, #3 -+ mov v1.h[0], v1.h[1] -+ mov v16.h[0], v16.h[1] -+ mov v17.h[0], v17.h[1] -+1: -+ cmp w9, #2-48 -+ blt 1f -+ st2 {v0.h - v1.h}[0], [x0], #4 -+ st2 {v16.h - v17.h}[0], [x2], #4 -+ b 11b -+1: -+ st1 {v0.h}[0], [x0], #2 -+ st1 {v16.h}[0], [x2], #2 -+ b 11b - endfunc - - -- - //void ff_rpi_sand30_lines_to_planar_p010( - // uint8_t * dest, - // unsigned int dst_stride, - -From 68356e594ff32e18e419a476889d958dc24af4b2 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Fri, 30 Jun 2023 19:41:06 +0000 -Subject: [PATCH 139/151] sand_fns: Minor optimisations to aarch64 neon - ---- - libavutil/aarch64/rpi_sand_neon.S | 140 ++++++------------------------ - 1 file changed, 28 insertions(+), 112 deletions(-) - -diff --git a/libavutil/aarch64/rpi_sand_neon.S b/libavutil/aarch64/rpi_sand_neon.S -index af7e2a88c4..11658de0c8 100644 ---- a/libavutil/aarch64/rpi_sand_neon.S -+++ b/libavutil/aarch64/rpi_sand_neon.S -@@ -279,18 +279,37 @@ endfunc - // SAND30 -> 10bit - .macro USAND10 d0, d1, d2, a0, a1 - shrn \d2\().4h, \a0\().4s, #14 -- xtn \d0\().4h, \a0\().4s - shrn \d1\().4h, \a0\().4s, #10 - - shrn2 \d2\().8h, \a1\().4s, #14 -- xtn2 \d0\().8h, \a1\().4s - shrn2 \d1\().8h, \a1\().4s, #10 -+ uzp1 \d0\().8h, \a0\().8h, \a1\().8h - - ushr \d2\().8h, \d2\().8h, #6 - bic \d0\().8h, #0xfc, lsl #8 - bic \d1\().8h, #0xfc, lsl #8 - .endm - -+// SAND30 -> 8bit -+.macro USAND8 d0, d1, d2, a0, a1, a2, a3, t0, t1, t2 -+ shrn \d1\().4h, \a0\().4s, #12 -+ shrn2 \d1\().8h, \a1\().4s, #12 -+ uzp1 \d0\().8h, \a0\().8h, \a1\().8h -+ uzp2 \d2\().8h, \a0\().8h, \a1\().8h -+ -+ shrn \t1\().4h, \a2\().4s, #12 -+ shrn2 \t1\().8h, \a3\().4s, #12 -+ uzp1 \t0\().8h, \a2\().8h, \a3\().8h -+ uzp2 \t2\().8h, \a2\().8h, \a3\().8h -+ -+ shrn \d0\().8b, \d0\().8h, #2 -+ shrn2 \d0\().16b, \t0\().8h, #2 -+ shrn \d2\().8b, \d2\().8h, #6 -+ shrn2 \d2\().16b, \t2\().8h, #6 -+ uzp1 \d1\().16b, \d1\().16b, \t1\().16b -+.endm -+ -+ - // void ff_rpi_sand30_lines_to_planar_c16( - // uint8_t * dst_u, // [x0] - // unsigned int dst_stride_u, // [w1] -@@ -322,6 +341,7 @@ function ff_rpi_sand30_lines_to_planar_c16, export=1 - 1: - ld1 {v0.4s-v3.4s}, [x5], #64 - ld1 {v4.4s-v7.4s}, [x5], x6 -+ subs w9, w9, #48 - - USAND10 v17, v16, v18, v0, v1 - USAND10 v20, v19, v21, v2, v3 -@@ -330,7 +350,6 @@ function ff_rpi_sand30_lines_to_planar_c16, export=1 - USAND10 v26, v25, v27, v6, v7 - UZPH_C v4, v5, v6, v22, v23, v24, v25, v26, v27 - -- subs w9, w9, #48 - blt 2f - - st3 {v0.8h-v2.8h}, [x0], #48 -@@ -457,61 +476,10 @@ function ff_rpi_sand30_lines_to_planar_y16, export=1 - - subs w5, w5, #96 - -- // v0, v1 -- -- shrn v18.4h, v0.4s, #14 -- xtn v16.4h, v0.4s -- shrn v17.4h, v0.4s, #10 -- -- shrn2 v18.8h, v1.4s, #14 -- xtn2 v16.8h, v1.4s -- shrn2 v17.8h, v1.4s, #10 -- -- ushr v18.8h, v18.8h, #6 -- bic v16.8h, #0xfc, lsl #8 -- bic v17.8h, #0xfc, lsl #8 -- -- // v2, v3 -- -- shrn v21.4h, v2.4s, #14 -- xtn v19.4h, v2.4s -- shrn v20.4h, v2.4s, #10 -- -- shrn2 v21.8h, v3.4s, #14 -- xtn2 v19.8h, v3.4s -- shrn2 v20.8h, v3.4s, #10 -- -- ushr v21.8h, v21.8h, #6 -- bic v19.8h, #0xfc, lsl #8 -- bic v20.8h, #0xfc, lsl #8 -- -- // v4, v5 -- -- shrn v24.4h, v4.4s, #14 -- xtn v22.4h, v4.4s -- shrn v23.4h, v4.4s, #10 -- -- shrn2 v24.8h, v5.4s, #14 -- xtn2 v22.8h, v5.4s -- shrn2 v23.8h, v5.4s, #10 -- -- ushr v24.8h, v24.8h, #6 -- bic v22.8h, #0xfc, lsl #8 -- bic v23.8h, #0xfc, lsl #8 -- -- // v6, v7 -- -- shrn v27.4h, v6.4s, #14 -- xtn v25.4h, v6.4s -- shrn v26.4h, v6.4s, #10 -- -- shrn2 v27.8h, v7.4s, #14 -- xtn2 v25.8h, v7.4s -- shrn2 v26.8h, v7.4s, #10 -- -- ushr v27.8h, v27.8h, #6 -- bic v25.8h, #0xfc, lsl #8 -- bic v26.8h, #0xfc, lsl #8 -+ USAND10 v16, v17, v18, v0, v1 -+ USAND10 v19, v20, v21, v2, v3 -+ USAND10 v22, v23, v24, v4, v5 -+ USAND10 v25, v26, v27, v6, v7 - - blt 2f - -@@ -624,60 +592,8 @@ function ff_rpi_sand30_lines_to_planar_y8, export=1 - subs w5, w5, #96 - - // v0, v1 -- -- shrn v18.4h, v0.4s, #16 -- xtn v16.4h, v0.4s -- shrn v17.4h, v0.4s, #12 -- -- shrn2 v18.8h, v1.4s, #16 -- xtn2 v16.8h, v1.4s -- shrn2 v17.8h, v1.4s, #12 -- -- shrn v18.8b, v18.8h, #6 -- shrn v16.8b, v16.8h, #2 -- xtn v17.8b, v17.8h -- -- // v2, v3 -- -- shrn v21.4h, v2.4s, #16 -- xtn v19.4h, v2.4s -- shrn v20.4h, v2.4s, #12 -- -- shrn2 v21.8h, v3.4s, #16 -- xtn2 v19.8h, v3.4s -- shrn2 v20.8h, v3.4s, #12 -- -- shrn2 v18.16b, v21.8h, #6 -- shrn2 v16.16b, v19.8h, #2 -- xtn2 v17.16b, v20.8h -- -- // v4, v5 -- -- shrn v24.4h, v4.4s, #16 -- xtn v22.4h, v4.4s -- shrn v23.4h, v4.4s, #12 -- -- shrn2 v24.8h, v5.4s, #16 -- xtn2 v22.8h, v5.4s -- shrn2 v23.8h, v5.4s, #12 -- -- shrn v21.8b, v24.8h, #6 -- shrn v19.8b, v22.8h, #2 -- xtn v20.8b, v23.8h -- -- // v6, v7 -- -- shrn v27.4h, v6.4s, #16 -- xtn v25.4h, v6.4s -- shrn v26.4h, v6.4s, #12 -- -- shrn2 v27.8h, v7.4s, #16 -- xtn2 v25.8h, v7.4s -- shrn2 v26.8h, v7.4s, #12 -- -- shrn2 v21.16b, v27.8h, #6 -- shrn2 v19.16b, v25.8h, #2 -- xtn2 v20.16b, v26.8h -+ USAND8 v16, v17, v18, v0, v1, v2, v3, v22, v23, v24 -+ USAND8 v19, v20, v21, v4, v5, v6, v7, v22, v23, v24 - - blt 2f - - -From 3abb0dcc453aba0a069bc1a8f26ba77913c5ef2b Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Sat, 1 Jul 2023 18:43:32 +0000 -Subject: [PATCH 140/151] sand_fns: Add test for neon to sand30 fns so they can - be tested by checkasm - ---- - libavutil/rpi_sand_fns.c | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - -diff --git a/libavutil/rpi_sand_fns.c b/libavutil/rpi_sand_fns.c -index b6071e2928..0626bb06cb 100644 ---- a/libavutil/rpi_sand_fns.c -+++ b/libavutil/rpi_sand_fns.c -@@ -35,10 +35,12 @@ Authors: John Cox - #include "frame.h" - - #if ARCH_ARM && HAVE_NEON --#include "arm/rpi_sand_neon.h" -+#include "libavutil/arm/cpu.h" -+#include "libavutil/arm/rpi_sand_neon.h" - #define HAVE_SAND_ASM 1 - #elif ARCH_AARCH64 && HAVE_NEON --#include "aarch64/rpi_sand_neon.h" -+#include "libavutil/aarch64/cpu.h" -+#include "libavutil/aarch64/rpi_sand_neon.h" - #define HAVE_SAND_ASM 1 - #else - #define HAVE_SAND_ASM 0 -@@ -97,7 +99,7 @@ void av_rpi_sand30_to_planar_y16(uint8_t * dst, const unsigned int dst_stride, - const unsigned int slice_inc = ((stride2 - 1) * stride1) >> 2; // RHS of a stripe to LHS of next in words - - #if HAVE_SAND_ASM -- if (_x == 0) { -+ if (_x == 0 && have_neon(av_get_cpu_flags())) { - ff_rpi_sand30_lines_to_planar_y16(dst, dst_stride, src, stride1, stride2, _x, y, _w, h); - return; - } -@@ -163,7 +165,7 @@ void av_rpi_sand30_to_planar_c16(uint8_t * dst_u, const unsigned int dst_stride_ - const unsigned int slice_inc = ((stride2 - 1) * stride1) >> 2; // RHS of a stripe to LHS of next in words - - #if HAVE_SAND_ASM -- if (_x == 0) { -+ if (_x == 0 && have_neon(av_get_cpu_flags())) { - ff_rpi_sand30_lines_to_planar_c16(dst_u, dst_stride_u, dst_v, dst_stride_v, - src, stride1, stride2, _x, y, _w, h); - return; - -From fb72aa34ec2c42fc595bb1a6c32b599da870fa2b Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Sat, 1 Jul 2023 18:43:57 +0000 -Subject: [PATCH 141/151] checkasm: Add tests for rpi_sand sand30 fns - -Something of a kludge for function selection as, at the moment, the -rpi_sand fns don't have a jump table that we could use for selection. ---- - tests/checkasm/Makefile | 3 +- - tests/checkasm/checkasm.c | 3 + - tests/checkasm/checkasm.h | 1 + - tests/checkasm/rpi_sand.c | 118 ++++++++++++++++++++++++++++++++++++++ - tests/fate/checkasm.mak | 1 + - 5 files changed, 125 insertions(+), 1 deletion(-) - create mode 100644 tests/checkasm/rpi_sand.c - -diff --git a/tests/checkasm/Makefile b/tests/checkasm/Makefile -index a6f06c7007..66291baf33 100644 ---- a/tests/checkasm/Makefile -+++ b/tests/checkasm/Makefile -@@ -59,8 +59,9 @@ CHECKASMOBJS-$(CONFIG_SWSCALE) += $(SWSCALEOBJS) - AVUTILOBJS += av_tx.o - AVUTILOBJS += fixed_dsp.o - AVUTILOBJS += float_dsp.o -+AVUTILOBJS-$(CONFIG_SAND) += rpi_sand.o - --CHECKASMOBJS-$(CONFIG_AVUTIL) += $(AVUTILOBJS) -+CHECKASMOBJS-$(CONFIG_AVUTIL) += $(AVUTILOBJS) $(AVUTILOBJS-yes) - - CHECKASMOBJS-$(ARCH_AARCH64) += aarch64/checkasm.o - CHECKASMOBJS-$(HAVE_ARMV5TE_EXTERNAL) += arm/checkasm.o -diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c -index e96d84a7da..57e0091b80 100644 ---- a/tests/checkasm/checkasm.c -+++ b/tests/checkasm/checkasm.c -@@ -210,6 +210,9 @@ static const struct { - { "fixed_dsp", checkasm_check_fixed_dsp }, - { "float_dsp", checkasm_check_float_dsp }, - { "av_tx", checkasm_check_av_tx }, -+ #if CONFIG_SAND -+ { "rpi_sand", checkasm_check_rpi_sand }, -+ #endif - #endif - { NULL } - }; -diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h -index 8744a81218..f4a0d20358 100644 ---- a/tests/checkasm/checkasm.h -+++ b/tests/checkasm/checkasm.h -@@ -73,6 +73,7 @@ void checkasm_check_motion(void); - void checkasm_check_nlmeans(void); - void checkasm_check_opusdsp(void); - void checkasm_check_pixblockdsp(void); -+void checkasm_check_rpi_sand(void); - void checkasm_check_sbrdsp(void); - void checkasm_check_synth_filter(void); - void checkasm_check_sw_gbrp(void); -diff --git a/tests/checkasm/rpi_sand.c b/tests/checkasm/rpi_sand.c -new file mode 100644 -index 0000000000..0888714c4c ---- /dev/null -+++ b/tests/checkasm/rpi_sand.c -@@ -0,0 +1,118 @@ -+/* -+ * Copyright (c) 2023 John Cox -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with FFmpeg; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ */ -+ -+#include -+#include "checkasm.h" -+#include "libavutil/common.h" -+#include "libavutil/rpi_sand_fns.h" -+ -+#if ARCH_ARM -+#include "libavutil/arm/cpu.h" -+#include "libavutil/arm/rpi_sand_neon.h" -+#elif ARCH_AARCH64 -+#include "libavutil/aarch64/cpu.h" -+#include "libavutil/aarch64/rpi_sand_neon.h" -+#endif -+ -+static inline uint32_t pack30(unsigned int a, unsigned int b, unsigned int c) -+{ -+ return (a & 0x3ff) | ((b & 0x3ff) << 10) | ((c & 0x3ff) << 20); -+} -+ -+void checkasm_check_rpi_sand(void) -+{ -+ const unsigned int w = 1280; -+ const unsigned int h = 66; -+ const unsigned int stride1 = 128; -+ const unsigned int stride2 = h*3/2; -+ const unsigned int ssize = ((w+95)/96)*128*h*3/2; -+ const unsigned int ysize = ((w + 32) * (h + 32) * 2); -+ -+ uint8_t * sbuf0 = malloc(ssize); -+ uint8_t * sbuf1 = malloc(ssize); -+ uint8_t * ybuf0 = malloc(ysize); -+ uint8_t * ybuf1 = malloc(ysize); -+ uint8_t * vbuf0 = malloc(ysize); -+ uint8_t * vbuf1 = malloc(ysize); -+ uint8_t * yframe0 = (w + 32) * 16 + ybuf0; -+ uint8_t * yframe1 = (w + 32) * 16 + ybuf1; -+ uint8_t * vframe0 = (w + 32) * 16 + vbuf0; -+ uint8_t * vframe1 = (w + 32) * 16 + vbuf1; -+ unsigned int i; -+ -+ for (i = 0; i != ssize; i += 4) -+ *(uint32_t*)(sbuf0 + i) = rnd(); -+ memcpy(sbuf1, sbuf0, ssize); -+ -+ if (check_func(have_neon(av_get_cpu_flags()) ? ff_rpi_sand30_lines_to_planar_y16 : av_rpi_sand30_to_planar_y16, "rpi_sand30_to_planar_y16")) { -+ declare_func(void, uint8_t * dst, const unsigned int dst_stride, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+ -+ memset(ybuf0, 0xbb, ysize); -+ memset(ybuf1, 0xbb, ysize); -+ -+ call_ref(yframe0, (w + 32) * 2, sbuf0, stride1, stride2, 0, 0, w, h); -+ call_new(yframe1, (w + 32) * 2, sbuf1, stride1, stride2, 0, 0, w, h); -+ -+ if (memcmp(sbuf0, sbuf1, ssize) -+ || memcmp(ybuf0, ybuf1, ysize)) -+ fail(); -+ -+ bench_new(ybuf1, (w + 32) * 2, sbuf1, stride1, stride2, 0, 0, w, h); -+ } -+ -+ if (check_func(have_neon(av_get_cpu_flags()) ? ff_rpi_sand30_lines_to_planar_c16 : av_rpi_sand30_to_planar_c16, "rpi_sand30_to_planar_c16")) { -+ declare_func(void, uint8_t * u_dst, const unsigned int u_stride, -+ uint8_t * v_dst, const unsigned int v_stride, -+ const uint8_t * src, -+ unsigned int stride1, unsigned int stride2, -+ unsigned int _x, unsigned int y, -+ unsigned int _w, unsigned int h); -+ -+ memset(ybuf0, 0xbb, ysize); -+ memset(ybuf1, 0xbb, ysize); -+ memset(vbuf0, 0xbb, ysize); -+ memset(vbuf1, 0xbb, ysize); -+ -+ call_ref(yframe0, (w + 32), vframe0, (w + 32), sbuf0, stride1, stride2, 0, 0, w/2, h/2); -+ call_new(yframe1, (w + 32), vframe1, (w + 32), sbuf1, stride1, stride2, 0, 0, w/2, h/2); -+ -+ if (memcmp(sbuf0, sbuf1, ssize) -+ || memcmp(ybuf0, ybuf1, ysize) -+ || memcmp(vbuf0, vbuf1, ysize)) -+ fail(); -+ -+ bench_new(yframe1, (w + 32), vframe1, (w + 32), sbuf1, stride1, stride2, 0, 0, w/2, h/2); -+ } -+ -+ -+ report("sand30"); -+ -+ free(sbuf0); -+ free(sbuf1); -+ free(ybuf0); -+ free(ybuf1); -+ free(vbuf0); -+ free(vbuf1); -+} -+ -diff --git a/tests/fate/checkasm.mak b/tests/fate/checkasm.mak -index a4e95541f5..6fda6d227e 100644 ---- a/tests/fate/checkasm.mak -+++ b/tests/fate/checkasm.mak -@@ -27,6 +27,7 @@ FATE_CHECKASM = fate-checkasm-aacpsdsp \ - fate-checkasm-motion \ - fate-checkasm-opusdsp \ - fate-checkasm-pixblockdsp \ -+ fate-checkasm-rpi_sand \ - fate-checkasm-sbrdsp \ - fate-checkasm-synth_filter \ - fate-checkasm-sw_gbrp \ - -From d798c7b90dd63bca6f9878b1fb30ec1d8f0b9a5e Mon Sep 17 00:00:00 2001 -From: James Darnley -Date: Mon, 20 Feb 2023 20:55:08 +0100 -Subject: [PATCH 142/151] avfilter/bwdif: move filter_line init to a dedicated - function - -(cherry picked from commit b503b5a0cf80f38ecf4737c012b621b7e94f242a) ---- - libavfilter/bwdif.h | 3 ++- - libavfilter/vf_bwdif.c | 13 +++++++++---- - libavfilter/x86/vf_bwdif_init.c | 4 +--- - 3 files changed, 12 insertions(+), 8 deletions(-) - -diff --git a/libavfilter/bwdif.h b/libavfilter/bwdif.h -index 889ff772ed..5749345f78 100644 ---- a/libavfilter/bwdif.h -+++ b/libavfilter/bwdif.h -@@ -37,6 +37,7 @@ typedef struct BWDIFContext { - int parity, int clip_max, int spat); - } BWDIFContext; - --void ff_bwdif_init_x86(BWDIFContext *bwdif); -+void ff_bwdif_init_filter_line(BWDIFContext *bwdif, int bit_depth); -+void ff_bwdif_init_x86(BWDIFContext *bwdif, int bit_depth); - - #endif /* AVFILTER_BWDIF_H */ -diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c -index 09e68523bb..539fabbd46 100644 ---- a/libavfilter/vf_bwdif.c -+++ b/libavfilter/vf_bwdif.c -@@ -341,7 +341,14 @@ static int config_props(AVFilterLink *link) - - yadif->csp = av_pix_fmt_desc_get(link->format); - yadif->filter = filter; -- if (yadif->csp->comp[0].depth > 8) { -+ ff_bwdif_init_filter_line(s, yadif->csp->comp[0].depth); -+ -+ return 0; -+} -+ -+av_cold void ff_bwdif_init_filter_line(BWDIFContext *s, int bit_depth) -+{ -+ if (bit_depth > 8) { - s->filter_intra = filter_intra_16bit; - s->filter_line = filter_line_c_16bit; - s->filter_edge = filter_edge_16bit; -@@ -352,10 +359,8 @@ static int config_props(AVFilterLink *link) - } - - #if ARCH_X86 -- ff_bwdif_init_x86(s); -+ ff_bwdif_init_x86(s, bit_depth); - #endif -- -- return 0; - } - - -diff --git a/libavfilter/x86/vf_bwdif_init.c b/libavfilter/x86/vf_bwdif_init.c -index e24e5cd9b1..ba7bc40c3d 100644 ---- a/libavfilter/x86/vf_bwdif_init.c -+++ b/libavfilter/x86/vf_bwdif_init.c -@@ -42,11 +42,9 @@ void ff_bwdif_filter_line_12bit_ssse3(void *dst, void *prev, void *cur, void *ne - int mrefs2, int prefs3, int mrefs3, int prefs4, - int mrefs4, int parity, int clip_max); - --av_cold void ff_bwdif_init_x86(BWDIFContext *bwdif) -+av_cold void ff_bwdif_init_x86(BWDIFContext *bwdif, int bit_depth) - { -- YADIFContext *yadif = &bwdif->yadif; - int cpu_flags = av_get_cpu_flags(); -- int bit_depth = (!yadif->csp) ? 8 : yadif->csp->comp[0].depth; - - if (bit_depth <= 8) { - if (EXTERNAL_SSE2(cpu_flags)) - -From 0eb9c627c07931cf93c4932e07e0df6c0ce860fd Mon Sep 17 00:00:00 2001 -From: James Darnley -Date: Mon, 20 Feb 2023 20:55:08 +0100 -Subject: [PATCH 143/151] checkasm: add test for bwdif - -(cherry picked from commit 087faf8cac51e5e20a5f41b36b8d4c2705a10039) ---- - tests/checkasm/Makefile | 1 + - tests/checkasm/checkasm.c | 3 ++ - tests/checkasm/checkasm.h | 1 + - tests/checkasm/vf_bwdif.c | 84 +++++++++++++++++++++++++++++++++++++++ - tests/fate/checkasm.mak | 1 + - 5 files changed, 90 insertions(+) - create mode 100644 tests/checkasm/vf_bwdif.c - -diff --git a/tests/checkasm/Makefile b/tests/checkasm/Makefile -index 66291baf33..2c80d8e661 100644 ---- a/tests/checkasm/Makefile -+++ b/tests/checkasm/Makefile -@@ -40,6 +40,7 @@ CHECKASMOBJS-$(CONFIG_AVCODEC) += $(AVCODECOBJS-yes) - # libavfilter tests - AVFILTEROBJS-$(CONFIG_AFIR_FILTER) += af_afir.o - AVFILTEROBJS-$(CONFIG_BLEND_FILTER) += vf_blend.o -+AVFILTEROBJS-$(CONFIG_BWDIF_FILTER) += vf_bwdif.o - AVFILTEROBJS-$(CONFIG_COLORSPACE_FILTER) += vf_colorspace.o - AVFILTEROBJS-$(CONFIG_EQ_FILTER) += vf_eq.o - AVFILTEROBJS-$(CONFIG_GBLUR_FILTER) += vf_gblur.o -diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c -index 57e0091b80..4f983d7fbc 100644 ---- a/tests/checkasm/checkasm.c -+++ b/tests/checkasm/checkasm.c -@@ -179,6 +179,9 @@ static const struct { - #if CONFIG_BLEND_FILTER - { "vf_blend", checkasm_check_blend }, - #endif -+ #if CONFIG_BWDIF_FILTER -+ { "vf_bwdif", checkasm_check_vf_bwdif }, -+ #endif - #if CONFIG_COLORSPACE_FILTER - { "vf_colorspace", checkasm_check_colorspace }, - #endif -diff --git a/tests/checkasm/checkasm.h b/tests/checkasm/checkasm.h -index f4a0d20358..d69bc43999 100644 ---- a/tests/checkasm/checkasm.h -+++ b/tests/checkasm/checkasm.h -@@ -83,6 +83,7 @@ void checkasm_check_utvideodsp(void); - void checkasm_check_v210dec(void); - void checkasm_check_v210enc(void); - void checkasm_check_vc1dsp(void); -+void checkasm_check_vf_bwdif(void); - void checkasm_check_vf_eq(void); - void checkasm_check_vf_gblur(void); - void checkasm_check_vf_hflip(void); -diff --git a/tests/checkasm/vf_bwdif.c b/tests/checkasm/vf_bwdif.c -new file mode 100644 -index 0000000000..46224bb575 ---- /dev/null -+++ b/tests/checkasm/vf_bwdif.c -@@ -0,0 +1,84 @@ -+/* -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with FFmpeg; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ */ -+ -+#include -+#include "checkasm.h" -+#include "libavcodec/internal.h" -+#include "libavfilter/bwdif.h" -+ -+#define WIDTH 256 -+ -+#define randomize_buffers(buf0, buf1, mask, count) \ -+ for (size_t i = 0; i < count; i++) \ -+ buf0[i] = buf1[i] = rnd() & mask -+ -+#define BODY(type, depth) \ -+ do { \ -+ type prev0[9*WIDTH], prev1[9*WIDTH]; \ -+ type next0[9*WIDTH], next1[9*WIDTH]; \ -+ type cur0[9*WIDTH], cur1[9*WIDTH]; \ -+ type dst0[WIDTH], dst1[WIDTH]; \ -+ const int stride = WIDTH; \ -+ const int mask = (1< -Date: Thu, 6 Jul 2023 13:56:18 +0000 -Subject: [PATCH 144/151] Revert "vf_bwdif: Add attributes to ask for - vectorization" - -This reverts commit 281250290ba5c2dcd8676e9a261050e65c10bcb7. -Will be replaced by hand coded asm as on upstream ---- - libavfilter/vf_bwdif.c | 29 ++++++++++++++--------------- - 1 file changed, 14 insertions(+), 15 deletions(-) - -diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c -index 539fabbd46..34e8c5e234 100644 ---- a/libavfilter/vf_bwdif.c -+++ b/libavfilter/vf_bwdif.c -@@ -74,10 +74,10 @@ typedef struct ThreadData { - int temporal_diff1 =(FFABS(prev[mrefs] - c) + FFABS(prev[prefs] - e)) >> 1; \ - int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e)) >> 1; \ - int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); \ -- {/*\ -+ \ - if (!diff) { \ - dst[0] = d; \ -- } else {*/ -+ } else { - - #define SPAT_CHECK() \ - int b = ((prev2[mrefs2] + next2[mrefs2]) >> 1) - c; \ -@@ -89,16 +89,15 @@ typedef struct ThreadData { - diff = FFMAX3(diff, min, -max); - - #define FILTER_LINE() \ -- int i1, i2; \ - SPAT_CHECK() \ -- /*if (FFABS(c - e) > temporal_diff0)*/ { \ -- i1 = (((coef_hf[0] * (prev2[0] + next2[0]) \ -+ if (FFABS(c - e) > temporal_diff0) { \ -+ interpol = (((coef_hf[0] * (prev2[0] + next2[0]) \ - - coef_hf[1] * (prev2[mrefs2] + next2[mrefs2] + prev2[prefs2] + next2[prefs2]) \ - + coef_hf[2] * (prev2[mrefs4] + next2[mrefs4] + prev2[prefs4] + next2[prefs4])) >> 2) \ - + coef_lf[0] * (c + e) - coef_lf[1] * (cur[mrefs3] + cur[prefs3])) >> 13; \ -- } /*else*/ { \ -- i2 = (coef_sp[0] * (c + e) - coef_sp[1] * (cur[mrefs3] + cur[prefs3])) >> 13; \ -- }interpol = FFABS(c - e) > temporal_diff0 ? i1:i2;\ -+ } else { \ -+ interpol = (coef_sp[0] * (c + e) - coef_sp[1] * (cur[mrefs3] + cur[prefs3])) >> 13; \ -+ } - - #define FILTER_EDGE() \ - if (spat) { \ -@@ -112,7 +111,7 @@ typedef struct ThreadData { - else if (interpol < d - diff) \ - interpol = d - diff; \ - \ -- dst[0] = !diff ? d : av_clip(interpol, 0, clip_max); \ -+ dst[0] = av_clip(interpol, 0, clip_max); \ - } \ - \ - dst++; \ -@@ -123,7 +122,7 @@ typedef struct ThreadData { - next2++; \ - } - --static void __attribute__((optimize("tree-vectorize"))) filter_intra(void *restrict dst1, void *restrict cur1, int w, int prefs, int mrefs, -+static void filter_intra(void *dst1, void *cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max) - { - uint8_t *dst = dst1; -@@ -133,7 +132,7 @@ static void __attribute__((optimize("tree-vectorize"))) filter_intra(void *restr - FILTER_INTRA() - } - --static void __attribute__((optimize("tree-vectorize"))) filter_line_c(void *restrict dst1, void *restrict prev1, void *restrict cur1, void *restrict next1, -+static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int prefs3, int mrefs3, int prefs4, int mrefs4, - int parity, int clip_max) -@@ -151,7 +150,7 @@ static void __attribute__((optimize("tree-vectorize"))) filter_line_c(void *rest - FILTER2() - } - --static void __attribute__((optimize("tree-vectorize"))) filter_edge(void *restrict dst1, void *restrict prev1, void *restrict cur1, void *restrict next1, -+static void filter_edge(void *dst1, void *prev1, void *cur1, void *next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int parity, int clip_max, int spat) - { -@@ -168,7 +167,7 @@ static void __attribute__((optimize("tree-vectorize"))) filter_edge(void *restri - FILTER2() - } - --static void __attribute__((optimize("tree-vectorize"))) filter_intra_16bit(void *restrict dst1, void *restrict cur1, int w, int prefs, int mrefs, -+static void filter_intra_16bit(void *dst1, void *cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max) - { - uint16_t *dst = dst1; -@@ -178,7 +177,7 @@ static void __attribute__((optimize("tree-vectorize"))) filter_intra_16bit(void - FILTER_INTRA() - } - --static void __attribute__((optimize("tree-vectorize"))) filter_line_c_16bit(void *restrict dst1, void *restrict prev1, void *restrict cur1, void *restrict next1, -+static void filter_line_c_16bit(void *dst1, void *prev1, void *cur1, void *next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int prefs3, int mrefs3, int prefs4, int mrefs4, - int parity, int clip_max) -@@ -196,7 +195,7 @@ static void __attribute__((optimize("tree-vectorize"))) filter_line_c_16bit(void - FILTER2() - } - --static void __attribute__((optimize("tree-vectorize"))) filter_edge_16bit(void *restrict dst1, void *restrict prev1, void *restrict cur1, void *restrict next1, -+static void filter_edge_16bit(void *dst1, void *prev1, void *cur1, void *next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int parity, int clip_max, int spat) - { - -From 093eddd9ef66a7db9e637f3acfe51d950c87f613 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 4 Jul 2023 14:04:39 +0000 -Subject: [PATCH 145/151] tests/checkasm: Add test for vf_bwdif filter_intra -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: John Cox -Signed-off-by: Martin Storsjö -(cherry picked from commit 7caa8d6b91e738ad2c1ea61746b6c062c470f7d3) ---- - tests/checkasm/vf_bwdif.c | 37 +++++++++++++++++++++++++++++++++++++ - 1 file changed, 37 insertions(+) - -diff --git a/tests/checkasm/vf_bwdif.c b/tests/checkasm/vf_bwdif.c -index 46224bb575..034bbabb4c 100644 ---- a/tests/checkasm/vf_bwdif.c -+++ b/tests/checkasm/vf_bwdif.c -@@ -20,6 +20,7 @@ - #include "checkasm.h" - #include "libavcodec/internal.h" - #include "libavfilter/bwdif.h" -+#include "libavutil/mem_internal.h" - - #define WIDTH 256 - -@@ -81,4 +82,40 @@ void checkasm_check_vf_bwdif(void) - BODY(uint16_t, 10); - report("bwdif10"); - } -+ -+ if (check_func(ctx_8.filter_intra, "bwdif8.intra")) { -+ LOCAL_ALIGNED_16(uint8_t, cur0, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, cur1, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, dst0, [WIDTH*3]); -+ LOCAL_ALIGNED_16(uint8_t, dst1, [WIDTH*3]); -+ const int stride = WIDTH; -+ const int mask = (1<<8)-1; -+ -+ declare_func(void, void *dst1, void *cur1, int w, int prefs, int mrefs, -+ int prefs3, int mrefs3, int parity, int clip_max); -+ -+ randomize_buffers( cur0, cur1, mask, 11*WIDTH); -+ memset(dst0, 0xba, WIDTH * 3); -+ memset(dst1, 0xba, WIDTH * 3); -+ -+ call_ref(dst0 + stride, -+ cur0 + stride * 4, WIDTH, -+ stride, -stride, stride * 3, -stride * 3, -+ 0, mask); -+ call_new(dst1 + stride, -+ cur0 + stride * 4, WIDTH, -+ stride, -stride, stride * 3, -stride * 3, -+ 0, mask); -+ -+ if (memcmp(dst0, dst1, WIDTH*3) -+ || memcmp( cur0, cur1, WIDTH*11)) -+ fail(); -+ -+ bench_new(dst1 + stride, -+ cur0 + stride * 4, WIDTH, -+ stride, -stride, stride * 3, -stride * 3, -+ 0, mask); -+ -+ report("bwdif8.intra"); -+ } - } - -From 28ef7402381b6fe241f81e21f302a23f8af674bf Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 4 Jul 2023 14:04:40 +0000 -Subject: [PATCH 146/151] avfilter/vf_bwdif: Add neon for filter_intra -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Adds an outline for aarch neon functions -Adds common macros and consts for aarch64 neon -Exports C filter_intra needed for tail fixup of neon code -Adds neon for filter_intra - -Signed-off-by: John Cox -Signed-off-by: Martin Storsjö -(cherry picked from commit 5075cfb4e6a21f6b4da9e62bdb0bad4cb32a4673) ---- - libavfilter/aarch64/Makefile | 2 + - libavfilter/aarch64/vf_bwdif_init_aarch64.c | 56 ++++++++ - libavfilter/aarch64/vf_bwdif_neon.S | 136 ++++++++++++++++++++ - libavfilter/bwdif.h | 4 + - libavfilter/vf_bwdif.c | 8 +- - 5 files changed, 203 insertions(+), 3 deletions(-) - create mode 100644 libavfilter/aarch64/vf_bwdif_init_aarch64.c - create mode 100644 libavfilter/aarch64/vf_bwdif_neon.S - -diff --git a/libavfilter/aarch64/Makefile b/libavfilter/aarch64/Makefile -index b58daa3a3f..b68209bc94 100644 ---- a/libavfilter/aarch64/Makefile -+++ b/libavfilter/aarch64/Makefile -@@ -1,3 +1,5 @@ -+OBJS-$(CONFIG_BWDIF_FILTER) += aarch64/vf_bwdif_init_aarch64.o - OBJS-$(CONFIG_NLMEANS_FILTER) += aarch64/vf_nlmeans_init.o - -+NEON-OBJS-$(CONFIG_BWDIF_FILTER) += aarch64/vf_bwdif_neon.o - NEON-OBJS-$(CONFIG_NLMEANS_FILTER) += aarch64/vf_nlmeans_neon.o -diff --git a/libavfilter/aarch64/vf_bwdif_init_aarch64.c b/libavfilter/aarch64/vf_bwdif_init_aarch64.c -new file mode 100644 -index 0000000000..3ffaa07ab3 ---- /dev/null -+++ b/libavfilter/aarch64/vf_bwdif_init_aarch64.c -@@ -0,0 +1,56 @@ -+/* -+ * bwdif aarch64 NEON optimisations -+ * -+ * Copyright (c) 2023 John Cox -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+#include "libavutil/common.h" -+#include "libavfilter/bwdif.h" -+#include "libavutil/aarch64/cpu.h" -+ -+void ff_bwdif_filter_intra_neon(void *dst1, void *cur1, int w, int prefs, int mrefs, -+ int prefs3, int mrefs3, int parity, int clip_max); -+ -+ -+static void filter_intra_helper(void *dst1, void *cur1, int w, int prefs, int mrefs, -+ int prefs3, int mrefs3, int parity, int clip_max) -+{ -+ const int w0 = clip_max != 255 ? 0 : w & ~15; -+ -+ ff_bwdif_filter_intra_neon(dst1, cur1, w0, prefs, mrefs, prefs3, mrefs3, parity, clip_max); -+ -+ if (w0 < w) -+ ff_bwdif_filter_intra_c((char *)dst1 + w0, (char *)cur1 + w0, -+ w - w0, prefs, mrefs, prefs3, mrefs3, parity, clip_max); -+} -+ -+void -+ff_bwdif_init_aarch64(BWDIFContext *s, int bit_depth) -+{ -+ const int cpu_flags = av_get_cpu_flags(); -+ -+ if (bit_depth != 8) -+ return; -+ -+ if (!have_neon(cpu_flags)) -+ return; -+ -+ s->filter_intra = filter_intra_helper; -+} -+ -diff --git a/libavfilter/aarch64/vf_bwdif_neon.S b/libavfilter/aarch64/vf_bwdif_neon.S -new file mode 100644 -index 0000000000..e288efbe6c ---- /dev/null -+++ b/libavfilter/aarch64/vf_bwdif_neon.S -@@ -0,0 +1,136 @@ -+/* -+ * bwdif aarch64 NEON optimisations -+ * -+ * Copyright (c) 2023 John Cox -+ * -+ * This file is part of FFmpeg. -+ * -+ * FFmpeg is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * FFmpeg is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General Public -+ * License along with FFmpeg; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -+ */ -+ -+ -+#include "libavutil/aarch64/asm.S" -+ -+// Space taken on the stack by an int (32-bit) -+#ifdef __APPLE__ -+.set SP_INT, 4 -+#else -+.set SP_INT, 8 -+#endif -+ -+.macro SQSHRUNN b, s0, s1, s2, s3, n -+ sqshrun \s0\().4h, \s0\().4s, #\n - 8 -+ sqshrun2 \s0\().8h, \s1\().4s, #\n - 8 -+ sqshrun \s1\().4h, \s2\().4s, #\n - 8 -+ sqshrun2 \s1\().8h, \s3\().4s, #\n - 8 -+ uzp2 \b\().16b, \s0\().16b, \s1\().16b -+.endm -+ -+.macro SMULL4K a0, a1, a2, a3, s0, s1, k -+ smull \a0\().4s, \s0\().4h, \k -+ smull2 \a1\().4s, \s0\().8h, \k -+ smull \a2\().4s, \s1\().4h, \k -+ smull2 \a3\().4s, \s1\().8h, \k -+.endm -+ -+.macro UMULL4K a0, a1, a2, a3, s0, s1, k -+ umull \a0\().4s, \s0\().4h, \k -+ umull2 \a1\().4s, \s0\().8h, \k -+ umull \a2\().4s, \s1\().4h, \k -+ umull2 \a3\().4s, \s1\().8h, \k -+.endm -+ -+.macro UMLAL4K a0, a1, a2, a3, s0, s1, k -+ umlal \a0\().4s, \s0\().4h, \k -+ umlal2 \a1\().4s, \s0\().8h, \k -+ umlal \a2\().4s, \s1\().4h, \k -+ umlal2 \a3\().4s, \s1\().8h, \k -+.endm -+ -+.macro UMLSL4K a0, a1, a2, a3, s0, s1, k -+ umlsl \a0\().4s, \s0\().4h, \k -+ umlsl2 \a1\().4s, \s0\().8h, \k -+ umlsl \a2\().4s, \s1\().4h, \k -+ umlsl2 \a3\().4s, \s1\().8h, \k -+.endm -+ -+.macro LDR_COEFFS d, t0 -+ movrel \t0, coeffs, 0 -+ ld1 {\d\().8h}, [\t0] -+.endm -+ -+// static const uint16_t coef_lf[2] = { 4309, 213 }; -+// static const uint16_t coef_hf[3] = { 5570, 3801, 1016 }; -+// static const uint16_t coef_sp[2] = { 5077, 981 }; -+ -+const coeffs, align=4 // align 4 means align on 2^4 boundry -+ .hword 4309 * 4, 213 * 4 // lf[0]*4 = v0.h[0] -+ .hword 5570, 3801, 1016, -3801 // hf[0] = v0.h[2], -hf[1] = v0.h[5] -+ .hword 5077, 981 // sp[0] = v0.h[6] -+endconst -+ -+// ============================================================================ -+// -+// void ff_bwdif_filter_intra_neon( -+// void *dst1, // x0 -+// void *cur1, // x1 -+// int w, // w2 -+// int prefs, // w3 -+// int mrefs, // w4 -+// int prefs3, // w5 -+// int mrefs3, // w6 -+// int parity, // w7 unused -+// int clip_max) // [sp, #0] unused -+ -+function ff_bwdif_filter_intra_neon, export=1 -+ cmp w2, #0 -+ ble 99f -+ -+ LDR_COEFFS v0, x17 -+ -+// for (x = 0; x < w; x++) { -+10: -+ -+// interpol = (coef_sp[0] * (cur[mrefs] + cur[prefs]) - coef_sp[1] * (cur[mrefs3] + cur[prefs3])) >> 13; -+ ldr q31, [x1, w4, sxtw] -+ ldr q30, [x1, w3, sxtw] -+ ldr q29, [x1, w6, sxtw] -+ ldr q28, [x1, w5, sxtw] -+ -+ uaddl v20.8h, v31.8b, v30.8b -+ uaddl2 v21.8h, v31.16b, v30.16b -+ -+ UMULL4K v2, v3, v4, v5, v20, v21, v0.h[6] -+ -+ uaddl v20.8h, v29.8b, v28.8b -+ uaddl2 v21.8h, v29.16b, v28.16b -+ -+ UMLSL4K v2, v3, v4, v5, v20, v21, v0.h[7] -+ -+// dst[0] = av_clip(interpol, 0, clip_max); -+ SQSHRUNN v2, v2, v3, v4, v5, 13 -+ str q2, [x0], #16 -+ -+// dst++; -+// cur++; -+// } -+ -+ subs w2, w2, #16 -+ add x1, x1, #16 -+ bgt 10b -+ -+99: -+ ret -+endfunc -diff --git a/libavfilter/bwdif.h b/libavfilter/bwdif.h -index 5749345f78..ae6f6ce223 100644 ---- a/libavfilter/bwdif.h -+++ b/libavfilter/bwdif.h -@@ -39,5 +39,9 @@ typedef struct BWDIFContext { - - void ff_bwdif_init_filter_line(BWDIFContext *bwdif, int bit_depth); - void ff_bwdif_init_x86(BWDIFContext *bwdif, int bit_depth); -+void ff_bwdif_init_aarch64(BWDIFContext *bwdif, int bit_depth); -+ -+void ff_bwdif_filter_intra_c(void *dst1, void *cur1, int w, int prefs, int mrefs, -+ int prefs3, int mrefs3, int parity, int clip_max); - - #endif /* AVFILTER_BWDIF_H */ -diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c -index 34e8c5e234..6ec8bbab5d 100644 ---- a/libavfilter/vf_bwdif.c -+++ b/libavfilter/vf_bwdif.c -@@ -122,8 +122,8 @@ typedef struct ThreadData { - next2++; \ - } - --static void filter_intra(void *dst1, void *cur1, int w, int prefs, int mrefs, -- int prefs3, int mrefs3, int parity, int clip_max) -+void ff_bwdif_filter_intra_c(void *dst1, void *cur1, int w, int prefs, int mrefs, -+ int prefs3, int mrefs3, int parity, int clip_max) - { - uint8_t *dst = dst1; - uint8_t *cur = cur1; -@@ -352,13 +352,15 @@ av_cold void ff_bwdif_init_filter_line(BWDIFContext *s, int bit_depth) - s->filter_line = filter_line_c_16bit; - s->filter_edge = filter_edge_16bit; - } else { -- s->filter_intra = filter_intra; -+ s->filter_intra = ff_bwdif_filter_intra_c; - s->filter_line = filter_line_c; - s->filter_edge = filter_edge; - } - - #if ARCH_X86 - ff_bwdif_init_x86(s, bit_depth); -+#elif ARCH_AARCH64 -+ ff_bwdif_init_aarch64(s, bit_depth); - #endif - } - - -From 2f8199a41cfd43595352899e722646052b0db2ee Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 4 Jul 2023 14:04:41 +0000 -Subject: [PATCH 147/151] tests/checkasm: Add test for vf_bwdif filter_edge -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: John Cox -Signed-off-by: Martin Storsjö -(cherry picked from commit 7ed7c00f55a50ac88589f9e17c172d4a4fce0581) ---- - tests/checkasm/vf_bwdif.c | 54 +++++++++++++++++++++++++++++++++++++++ - 1 file changed, 54 insertions(+) - -diff --git a/tests/checkasm/vf_bwdif.c b/tests/checkasm/vf_bwdif.c -index 034bbabb4c..5fdba09fdc 100644 ---- a/tests/checkasm/vf_bwdif.c -+++ b/tests/checkasm/vf_bwdif.c -@@ -83,6 +83,60 @@ void checkasm_check_vf_bwdif(void) - report("bwdif10"); - } - -+ { -+ LOCAL_ALIGNED_16(uint8_t, prev0, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, prev1, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, next0, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, next1, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, cur0, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, cur1, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, dst0, [WIDTH*3]); -+ LOCAL_ALIGNED_16(uint8_t, dst1, [WIDTH*3]); -+ const int stride = WIDTH; -+ const int mask = (1<<8)-1; -+ int spat; -+ int parity; -+ -+ for (spat = 0; spat != 2; ++spat) { -+ for (parity = 0; parity != 2; ++parity) { -+ if (check_func(ctx_8.filter_edge, "bwdif8.edge.s%d.p%d", spat, parity)) { -+ -+ declare_func(void, void *dst1, void *prev1, void *cur1, void *next1, -+ int w, int prefs, int mrefs, int prefs2, int mrefs2, -+ int parity, int clip_max, int spat); -+ -+ randomize_buffers(prev0, prev1, mask, 11*WIDTH); -+ randomize_buffers(next0, next1, mask, 11*WIDTH); -+ randomize_buffers( cur0, cur1, mask, 11*WIDTH); -+ memset(dst0, 0xba, WIDTH * 3); -+ memset(dst1, 0xba, WIDTH * 3); -+ -+ call_ref(dst0 + stride, -+ prev0 + stride * 4, cur0 + stride * 4, next0 + stride * 4, WIDTH, -+ stride, -stride, stride * 2, -stride * 2, -+ parity, mask, spat); -+ call_new(dst1 + stride, -+ prev1 + stride * 4, cur1 + stride * 4, next1 + stride * 4, WIDTH, -+ stride, -stride, stride * 2, -stride * 2, -+ parity, mask, spat); -+ -+ if (memcmp(dst0, dst1, WIDTH*3) -+ || memcmp(prev0, prev1, WIDTH*11) -+ || memcmp(next0, next1, WIDTH*11) -+ || memcmp( cur0, cur1, WIDTH*11)) -+ fail(); -+ -+ bench_new(dst1 + stride, -+ prev1 + stride * 4, cur1 + stride * 4, next1 + stride * 4, WIDTH, -+ stride, -stride, stride * 2, -stride * 2, -+ parity, mask, spat); -+ } -+ } -+ } -+ -+ report("bwdif8.edge"); -+ } -+ - if (check_func(ctx_8.filter_intra, "bwdif8.intra")) { - LOCAL_ALIGNED_16(uint8_t, cur0, [11*WIDTH]); - LOCAL_ALIGNED_16(uint8_t, cur1, [11*WIDTH]); - -From 171d7f201503812617b8e320c83cc33120425923 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 4 Jul 2023 14:04:42 +0000 -Subject: [PATCH 148/151] avfilter/vf_bwdif: Add neon for filter_edge -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Adds clip and spatial macros for aarch64 neon -Exports C filter_edge needed for tail fixup of neon code -Adds neon for filter_edge - -Signed-off-by: John Cox -Signed-off-by: Martin Storsjö -(cherry picked from commit 8130df83e0fbd3264fe990fb4e084ecbd452d0b1) ---- - libavfilter/aarch64/vf_bwdif_init_aarch64.c | 20 +++ - libavfilter/aarch64/vf_bwdif_neon.S | 177 ++++++++++++++++++++ - libavfilter/bwdif.h | 4 + - libavfilter/vf_bwdif.c | 8 +- - 4 files changed, 205 insertions(+), 4 deletions(-) - -diff --git a/libavfilter/aarch64/vf_bwdif_init_aarch64.c b/libavfilter/aarch64/vf_bwdif_init_aarch64.c -index 3ffaa07ab3..e75cf2f204 100644 ---- a/libavfilter/aarch64/vf_bwdif_init_aarch64.c -+++ b/libavfilter/aarch64/vf_bwdif_init_aarch64.c -@@ -24,10 +24,29 @@ - #include "libavfilter/bwdif.h" - #include "libavutil/aarch64/cpu.h" - -+void ff_bwdif_filter_edge_neon(void *dst1, void *prev1, void *cur1, void *next1, -+ int w, int prefs, int mrefs, int prefs2, int mrefs2, -+ int parity, int clip_max, int spat); -+ - void ff_bwdif_filter_intra_neon(void *dst1, void *cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max); - - -+static void filter_edge_helper(void *dst1, void *prev1, void *cur1, void *next1, -+ int w, int prefs, int mrefs, int prefs2, int mrefs2, -+ int parity, int clip_max, int spat) -+{ -+ const int w0 = clip_max != 255 ? 0 : w & ~15; -+ -+ ff_bwdif_filter_edge_neon(dst1, prev1, cur1, next1, w0, prefs, mrefs, prefs2, mrefs2, -+ parity, clip_max, spat); -+ -+ if (w0 < w) -+ ff_bwdif_filter_edge_c((char *)dst1 + w0, (char *)prev1 + w0, (char *)cur1 + w0, (char *)next1 + w0, -+ w - w0, prefs, mrefs, prefs2, mrefs2, -+ parity, clip_max, spat); -+} -+ - static void filter_intra_helper(void *dst1, void *cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max) - { -@@ -52,5 +71,6 @@ ff_bwdif_init_aarch64(BWDIFContext *s, int bit_depth) - return; - - s->filter_intra = filter_intra_helper; -+ s->filter_edge = filter_edge_helper; - } - -diff --git a/libavfilter/aarch64/vf_bwdif_neon.S b/libavfilter/aarch64/vf_bwdif_neon.S -index e288efbe6c..389302b813 100644 ---- a/libavfilter/aarch64/vf_bwdif_neon.S -+++ b/libavfilter/aarch64/vf_bwdif_neon.S -@@ -66,6 +66,79 @@ - umlsl2 \a3\().4s, \s1\().8h, \k - .endm - -+// int b = m2s1 - m1; -+// int f = p2s1 - p1; -+// int dc = c0s1 - m1; -+// int de = c0s1 - p1; -+// int sp_max = FFMIN(p1 - c0s1, m1 - c0s1); -+// sp_max = FFMIN(sp_max, FFMAX(-b,-f)); -+// int sp_min = FFMIN(c0s1 - p1, c0s1 - m1); -+// sp_min = FFMIN(sp_min, FFMAX(b,f)); -+// diff = diff == 0 ? 0 : FFMAX3(diff, sp_min, sp_max); -+.macro SPAT_CHECK diff, m2s1, m1, c0s1, p1, p2s1, t0, t1, t2, t3 -+ uqsub \t0\().16b, \p1\().16b, \c0s1\().16b -+ uqsub \t2\().16b, \m1\().16b, \c0s1\().16b -+ umin \t2\().16b, \t0\().16b, \t2\().16b -+ -+ uqsub \t1\().16b, \m1\().16b, \m2s1\().16b -+ uqsub \t3\().16b, \p1\().16b, \p2s1\().16b -+ umax \t3\().16b, \t3\().16b, \t1\().16b -+ umin \t3\().16b, \t3\().16b, \t2\().16b -+ -+ uqsub \t0\().16b, \c0s1\().16b, \p1\().16b -+ uqsub \t2\().16b, \c0s1\().16b, \m1\().16b -+ umin \t2\().16b, \t0\().16b, \t2\().16b -+ -+ uqsub \t1\().16b, \m2s1\().16b, \m1\().16b -+ uqsub \t0\().16b, \p2s1\().16b, \p1\().16b -+ umax \t0\().16b, \t0\().16b, \t1\().16b -+ umin \t2\().16b, \t2\().16b, \t0\().16b -+ -+ cmeq \t1\().16b, \diff\().16b, #0 -+ umax \diff\().16b, \diff\().16b, \t3\().16b -+ umax \diff\().16b, \diff\().16b, \t2\().16b -+ bic \diff\().16b, \diff\().16b, \t1\().16b -+.endm -+ -+// i0 = s0; -+// if (i0 > d0 + diff0) -+// i0 = d0 + diff0; -+// else if (i0 < d0 - diff0) -+// i0 = d0 - diff0; -+// -+// i0 = s0 is safe -+.macro DIFF_CLIP i0, s0, d0, diff, t0, t1 -+ uqadd \t0\().16b, \d0\().16b, \diff\().16b -+ uqsub \t1\().16b, \d0\().16b, \diff\().16b -+ umin \i0\().16b, \s0\().16b, \t0\().16b -+ umax \i0\().16b, \i0\().16b, \t1\().16b -+.endm -+ -+// i0 = FFABS(m1 - p1) > td0 ? i1 : i2; -+// DIFF_CLIP -+// -+// i0 = i1 is safe -+.macro INTERPOL i0, i1, i2, m1, d0, p1, td0, diff, t0, t1, t2 -+ uabd \t0\().16b, \m1\().16b, \p1\().16b -+ cmhi \t0\().16b, \t0\().16b, \td0\().16b -+ bsl \t0\().16b, \i1\().16b, \i2\().16b -+ DIFF_CLIP \i0, \t0, \d0, \diff, \t1, \t2 -+.endm -+ -+.macro PUSH_VREGS -+ stp d8, d9, [sp, #-64]! -+ stp d10, d11, [sp, #16] -+ stp d12, d13, [sp, #32] -+ stp d14, d15, [sp, #48] -+.endm -+ -+.macro POP_VREGS -+ ldp d14, d15, [sp, #48] -+ ldp d12, d13, [sp, #32] -+ ldp d10, d11, [sp, #16] -+ ldp d8, d9, [sp], #64 -+.endm -+ - .macro LDR_COEFFS d, t0 - movrel \t0, coeffs, 0 - ld1 {\d\().8h}, [\t0] -@@ -81,6 +154,110 @@ const coeffs, align=4 // align 4 means align on 2^4 boundry - .hword 5077, 981 // sp[0] = v0.h[6] - endconst - -+// ============================================================================ -+// -+// void ff_bwdif_filter_edge_neon( -+// void *dst1, // x0 -+// void *prev1, // x1 -+// void *cur1, // x2 -+// void *next1, // x3 -+// int w, // w4 -+// int prefs, // w5 -+// int mrefs, // w6 -+// int prefs2, // w7 -+// int mrefs2, // [sp, #0] -+// int parity, // [sp, #SP_INT] -+// int clip_max, // [sp, #SP_INT*2] unused -+// int spat); // [sp, #SP_INT*3] -+ -+function ff_bwdif_filter_edge_neon, export=1 -+ // Sanity check w -+ cmp w4, #0 -+ ble 99f -+ -+// #define prev2 cur -+// const uint8_t * restrict next2 = parity ? prev : next; -+ -+ ldr w8, [sp, #0] // mrefs2 -+ -+ ldr w17, [sp, #SP_INT] // parity -+ ldr w16, [sp, #SP_INT*3] // spat -+ cmp w17, #0 -+ csel x17, x1, x3, ne -+ -+// for (x = 0; x < w; x++) { -+ -+10: -+// int m1 = cur[mrefs]; -+// int d = (prev2[0] + next2[0]) >> 1; -+// int p1 = cur[prefs]; -+// int temporal_diff0 = FFABS(prev2[0] - next2[0]); -+// int temporal_diff1 =(FFABS(prev[mrefs] - m1) + FFABS(prev[prefs] - p1)) >> 1; -+// int temporal_diff2 =(FFABS(next[mrefs] - m1) + FFABS(next[prefs] - p1)) >> 1; -+// int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); -+ ldr q31, [x2] -+ ldr q21, [x17] -+ uhadd v16.16b, v31.16b, v21.16b // d0 = v16 -+ uabd v17.16b, v31.16b, v21.16b // td0 = v17 -+ ldr q24, [x2, w6, sxtw] // m1 = v24 -+ ldr q22, [x2, w5, sxtw] // p1 = v22 -+ -+ ldr q0, [x1, w6, sxtw] // prev[mrefs] -+ ldr q2, [x1, w5, sxtw] // prev[prefs] -+ ldr q1, [x3, w6, sxtw] // next[mrefs] -+ ldr q3, [x3, w5, sxtw] // next[prefs] -+ -+ ushr v29.16b, v17.16b, #1 -+ -+ uabd v31.16b, v0.16b, v24.16b -+ uabd v30.16b, v2.16b, v22.16b -+ uhadd v0.16b, v31.16b, v30.16b // td1 = q0 -+ -+ uabd v31.16b, v1.16b, v24.16b -+ uabd v30.16b, v3.16b, v22.16b -+ uhadd v1.16b, v31.16b, v30.16b // td2 = q1 -+ -+ umax v0.16b, v0.16b, v29.16b -+ umax v0.16b, v0.16b, v1.16b // diff = v0 -+ -+// if (spat) { -+// SPAT_CHECK() -+// } -+// i0 = (m1 + p1) >> 1; -+ cbz w16, 1f -+ -+ ldr q31, [x2, w8, sxtw] -+ ldr q18, [x17, w8, sxtw] -+ ldr q30, [x2, w7, sxtw] -+ ldr q19, [x17, w7, sxtw] -+ uhadd v18.16b, v18.16b, v31.16b -+ uhadd v19.16b, v19.16b, v30.16b -+ -+ SPAT_CHECK v0, v18, v24, v16, v22, v19, v31, v30, v29, v28 -+ -+1: -+ uhadd v2.16b, v22.16b, v24.16b -+ -+ // i0 = v2, s0 = v2, d0 = v16, diff = v0, t0 = v31, t1 = v30 -+ DIFF_CLIP v2, v2, v16, v0, v31, v30 -+ -+// dst[0] = av_clip(interpol, 0, clip_max); -+ str q2, [x0], #16 -+ -+// dst++; -+// cur++; -+// } -+ subs w4, w4, #16 -+ add x1, x1, #16 -+ add x2, x2, #16 -+ add x3, x3, #16 -+ add x17, x17, #16 -+ bgt 10b -+ -+99: -+ ret -+endfunc -+ - // ============================================================================ - // - // void ff_bwdif_filter_intra_neon( -diff --git a/libavfilter/bwdif.h b/libavfilter/bwdif.h -index ae6f6ce223..ae1616d366 100644 ---- a/libavfilter/bwdif.h -+++ b/libavfilter/bwdif.h -@@ -41,6 +41,10 @@ void ff_bwdif_init_filter_line(BWDIFContext *bwdif, int bit_depth); - void ff_bwdif_init_x86(BWDIFContext *bwdif, int bit_depth); - void ff_bwdif_init_aarch64(BWDIFContext *bwdif, int bit_depth); - -+void ff_bwdif_filter_edge_c(void *dst1, void *prev1, void *cur1, void *next1, -+ int w, int prefs, int mrefs, int prefs2, int mrefs2, -+ int parity, int clip_max, int spat); -+ - void ff_bwdif_filter_intra_c(void *dst1, void *cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max); - -diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c -index 6ec8bbab5d..688c2d2572 100644 ---- a/libavfilter/vf_bwdif.c -+++ b/libavfilter/vf_bwdif.c -@@ -150,9 +150,9 @@ static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, - FILTER2() - } - --static void filter_edge(void *dst1, void *prev1, void *cur1, void *next1, -- int w, int prefs, int mrefs, int prefs2, int mrefs2, -- int parity, int clip_max, int spat) -+void ff_bwdif_filter_edge_c(void *dst1, void *prev1, void *cur1, void *next1, -+ int w, int prefs, int mrefs, int prefs2, int mrefs2, -+ int parity, int clip_max, int spat) - { - uint8_t *dst = dst1; - uint8_t *prev = prev1; -@@ -354,7 +354,7 @@ av_cold void ff_bwdif_init_filter_line(BWDIFContext *s, int bit_depth) - } else { - s->filter_intra = ff_bwdif_filter_intra_c; - s->filter_line = filter_line_c; -- s->filter_edge = filter_edge; -+ s->filter_edge = ff_bwdif_filter_edge_c; - } - - #if ARCH_X86 - -From abf6588935bce275ba302766bcd8c3bb7a523d3c Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 4 Jul 2023 14:04:43 +0000 -Subject: [PATCH 149/151] avfilter/vf_bwdif: Add neon for filter_line -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Exports C filter_line needed for tail fixup of neon code -Adds neon for filter_line - -Signed-off-by: John Cox -Signed-off-by: Martin Storsjö -(cherry picked from commit 94cb94a2c0910d364a7181fc5cc0e9556b777d0a) ---- - libavfilter/aarch64/vf_bwdif_init_aarch64.c | 21 ++ - libavfilter/aarch64/vf_bwdif_neon.S | 203 ++++++++++++++++++++ - libavfilter/bwdif.h | 5 + - libavfilter/vf_bwdif.c | 10 +- - 4 files changed, 234 insertions(+), 5 deletions(-) - -diff --git a/libavfilter/aarch64/vf_bwdif_init_aarch64.c b/libavfilter/aarch64/vf_bwdif_init_aarch64.c -index e75cf2f204..21e67884ab 100644 ---- a/libavfilter/aarch64/vf_bwdif_init_aarch64.c -+++ b/libavfilter/aarch64/vf_bwdif_init_aarch64.c -@@ -31,6 +31,26 @@ void ff_bwdif_filter_edge_neon(void *dst1, void *prev1, void *cur1, void *next1, - void ff_bwdif_filter_intra_neon(void *dst1, void *cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max); - -+void ff_bwdif_filter_line_neon(void *dst1, void *prev1, void *cur1, void *next1, -+ int w, int prefs, int mrefs, int prefs2, int mrefs2, -+ int prefs3, int mrefs3, int prefs4, int mrefs4, -+ int parity, int clip_max); -+ -+ -+static void filter_line_helper(void *dst1, void *prev1, void *cur1, void *next1, -+ int w, int prefs, int mrefs, int prefs2, int mrefs2, -+ int prefs3, int mrefs3, int prefs4, int mrefs4, -+ int parity, int clip_max) -+{ -+ const int w0 = clip_max != 255 ? 0 : w & ~15; -+ -+ ff_bwdif_filter_line_neon(dst1, prev1, cur1, next1, -+ w0, prefs, mrefs, prefs2, mrefs2, prefs3, mrefs3, prefs4, mrefs4, parity, clip_max); -+ -+ if (w0 < w) -+ ff_bwdif_filter_line_c((char *)dst1 + w0, (char *)prev1 + w0, (char *)cur1 + w0, (char *)next1 + w0, -+ w - w0, prefs, mrefs, prefs2, mrefs2, prefs3, mrefs3, prefs4, mrefs4, parity, clip_max); -+} - - static void filter_edge_helper(void *dst1, void *prev1, void *cur1, void *next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, -@@ -71,6 +91,7 @@ ff_bwdif_init_aarch64(BWDIFContext *s, int bit_depth) - return; - - s->filter_intra = filter_intra_helper; -+ s->filter_line = filter_line_helper; - s->filter_edge = filter_edge_helper; - } - -diff --git a/libavfilter/aarch64/vf_bwdif_neon.S b/libavfilter/aarch64/vf_bwdif_neon.S -index 389302b813..f185e94e3c 100644 ---- a/libavfilter/aarch64/vf_bwdif_neon.S -+++ b/libavfilter/aarch64/vf_bwdif_neon.S -@@ -154,6 +154,209 @@ const coeffs, align=4 // align 4 means align on 2^4 boundry - .hword 5077, 981 // sp[0] = v0.h[6] - endconst - -+// =========================================================================== -+// -+// void filter_line( -+// void *dst1, // x0 -+// void *prev1, // x1 -+// void *cur1, // x2 -+// void *next1, // x3 -+// int w, // w4 -+// int prefs, // w5 -+// int mrefs, // w6 -+// int prefs2, // w7 -+// int mrefs2, // [sp, #0] -+// int prefs3, // [sp, #SP_INT] -+// int mrefs3, // [sp, #SP_INT*2] -+// int prefs4, // [sp, #SP_INT*3] -+// int mrefs4, // [sp, #SP_INT*4] -+// int parity, // [sp, #SP_INT*5] -+// int clip_max) // [sp, #SP_INT*6] -+ -+function ff_bwdif_filter_line_neon, export=1 -+ // Sanity check w -+ cmp w4, #0 -+ ble 99f -+ -+ // Rearrange regs to be the same as line3 for ease of debug! -+ mov w10, w4 // w10 = loop count -+ mov w9, w6 // w9 = mref -+ mov w12, w7 // w12 = pref2 -+ mov w11, w5 // w11 = pref -+ ldr w8, [sp, #0] // w8 = mref2 -+ ldr w7, [sp, #SP_INT*2] // w7 = mref3 -+ ldr w6, [sp, #SP_INT*4] // w6 = mref4 -+ ldr w13, [sp, #SP_INT] // w13 = pref3 -+ ldr w14, [sp, #SP_INT*3] // w14 = pref4 -+ -+ mov x4, x3 -+ mov x3, x2 -+ mov x2, x1 -+ -+ LDR_COEFFS v0, x17 -+ -+// #define prev2 cur -+// const uint8_t * restrict next2 = parity ? prev : next; -+ ldr w17, [sp, #SP_INT*5] // parity -+ cmp w17, #0 -+ csel x17, x2, x4, ne -+ -+ PUSH_VREGS -+ -+// for (x = 0; x < w; x++) { -+// int diff0, diff2; -+// int d0, d2; -+// int temporal_diff0, temporal_diff2; -+// -+// int i1, i2; -+// int j1, j2; -+// int p6, p5, p4, p3, p2, p1, c0, m1, m2, m3, m4; -+ -+10: -+// c0 = prev2[0] + next2[0]; // c0 = v20, v21 -+// d0 = c0 >> 1; // d0 = v10 -+// temporal_diff0 = FFABS(prev2[0] - next2[0]); // td0 = v11 -+ ldr q31, [x3] -+ ldr q21, [x17] -+ uhadd v10.16b, v31.16b, v21.16b -+ uabd v11.16b, v31.16b, v21.16b -+ uaddl v20.8h, v21.8b, v31.8b -+ uaddl2 v21.8h, v21.16b, v31.16b -+ -+ ldr q31, [x3, w6, sxtw] -+ ldr q23, [x17, w6, sxtw] -+ -+// i1 = coef_hf[0] * c0; // i1 = v2-v5 -+ UMULL4K v2, v3, v4, v5, v20, v21, v0.h[2] -+ -+ ldr q30, [x3, w14, sxtw] -+ ldr q25, [x17, w14, sxtw] -+ -+// m4 = prev2[mrefs4] + next2[mrefs4]; // m4 = v22,v23 -+ uaddl v22.8h, v23.8b, v31.8b -+ uaddl2 v23.8h, v23.16b, v31.16b -+ -+// p4 = prev2[prefs4] + next2[prefs4]; // p4 = v24,v25, (p4 >> 1) = v12 -+ uhadd v12.16b, v25.16b, v30.16b -+ uaddl v24.8h, v25.8b, v30.8b -+ uaddl2 v25.8h, v25.16b, v30.16b -+ -+// m3 = cur[mrefs3]; // m3 = v20 -+ ldr q20, [x3, w7, sxtw] -+ -+// p3 = cur[prefs3]; // p3 = v21 -+ ldr q21, [x3, w13, sxtw] -+ -+// i1 += coef_hf[2] * (m4 + p4); // (-m4:v22,v23) (-p4:v24,v25) -+ add v22.8h, v22.8h, v24.8h -+ add v23.8h, v23.8h, v25.8h -+ UMLAL4K v2, v3, v4, v5, v22, v23, v0.h[4] -+ -+ ldr q29, [x3, w8, sxtw] -+ ldr q23, [x17, w8, sxtw] -+ -+// i1 -= coef_lf[1] * 4 * (m3 + p3); // - -+ uaddl v30.8h, v20.8b, v21.8b -+ uaddl2 v31.8h, v20.16b, v21.16b -+ -+ UMLSL4K v2, v3, v4, v5, v30, v31, v0.h[1] -+ -+ ldr q31, [x3, w12, sxtw] -+ ldr q27, [x17, w12, sxtw] -+ -+// m2 = prev2[mrefs2] + next2[mrefs2]; // m2 = v22,v23, (m2 >> 1) = v13 -+ uhadd v13.16b, v23.16b, v29.16b -+ uaddl v22.8h, v23.8b, v29.8b -+ uaddl2 v23.8h, v23.16b, v29.16b -+ -+// m1 = cur[mrefs]; // m1 = v24 -+ ldr q24, [x3, w9, sxtw] -+ -+// p2 = prev2[prefs2] + next2[prefs2]; // p2 = v26, v27 -+// temporal_diff2 = FFABS(prev2[prefs2] - next2[prefs2]); // td2 = v14 -+// d2 = p2 >> 1; // d2 = v15 -+ uabd v14.16b, v31.16b, v27.16b -+ uhadd v15.16b, v31.16b, v27.16b -+ uaddl v26.8h, v27.8b, v31.8b -+ uaddl2 v27.8h, v27.16b, v31.16b -+ -+// i1 -= coef_hf[1] * (m2 + p2); // (-m2:v22,v23*) (-p2:v26*,v27*) -+ add v22.8h, v22.8h, v26.8h -+ add v23.8h, v23.8h, v27.8h -+ UMLSL4K v2, v3, v4, v5, v22, v23, v0.h[3] -+ -+// p1 = cur[prefs]; // p1 = v22 -+ ldr q22, [x3, w11, sxtw] -+ -+// i2 = (coef_sp[0] * (m1 + p1) - coef_sp[1] * (m3 + p3)) >> 13; // (-m3:v20*) i2=v17 -+ uaddl v18.8h, v22.8b, v24.8b -+ uaddl2 v19.8h, v22.16b, v24.16b -+ UMULL4K v28, v29, v30, v31, v18, v19, v0.h[6] -+ -+ uaddl v18.8h, v20.8b, v21.8b -+ uaddl2 v19.8h, v20.16b, v21.16b -+ UMLSL4K v28, v29, v30, v31, v18, v19, v0.h[7] -+ -+ SQSHRUNN v17, v28, v29, v30, v31, 13 -+ -+// i1 += coef_lf[0] * 4 * (m1 + p1); // p1 = v22, m1 = v24 -+ uaddl v26.8h, v24.8b, v22.8b -+ uaddl2 v27.8h, v24.16b, v22.16b -+ UMLAL4K v2, v3, v4, v5, v26, v27, v0.h[0] -+ -+ ldr q31, [x2, w9, sxtw] -+ ldr q29, [x4, w9, sxtw] -+ -+ ldr q30, [x2, w11, sxtw] -+ ldr q28, [x4, w11, sxtw] -+ -+// i1 >>= 15; // i1 = v2, -v3, -v4*, -v5* -+ SQSHRUNN v2, v2, v3, v4, v5, 15 -+ -+// { -+// int t1 =(FFABS(prev[mrefs] - m1) + FFABS(prev[prefs] - p1)) >> 1; -+// int t2 =(FFABS(next[mrefs] - m1) + FFABS(next[prefs] - p1)) >> 1; -+ uabd v30.16b, v22.16b, v30.16b -+ uabd v31.16b, v24.16b, v31.16b -+ uabd v28.16b, v22.16b, v28.16b -+ uabd v29.16b, v24.16b, v29.16b -+ uhadd v31.16b, v31.16b, v30.16b -+ uhadd v29.16b, v29.16b, v28.16b -+ -+// diff0 = FFMAX3(temporal_diff0 >> 1, t1, t2); // diff0=v18 -+ ushr v18.16b, v11.16b, #1 -+ umax v18.16b, v18.16b, v31.16b -+ umax v18.16b, v18.16b, v29.16b -+ -+ // diff0 = v18, (m2 >> 1) = v13, m1 = v24, d0 = v10, p1 = v22, d2 = v15 -+ SPAT_CHECK v18, v13, v24, v10, v22, v15, v31, v30, v29, v28 -+ -+ // i1 = v2, i2 = v17, m1 = v24, d0 = v10, p1 = v22, td2 = v11, diff2 = v18 -+ INTERPOL v2, v2, v17, v24, v10, v22, v11, v18, v31, v30, v29 -+ -+// dst[0] = av_clip_uint8(interpol); -+ str q2, [x0], #16 -+// } -+// -+// dst++; -+// cur++; -+// prev++; -+// prev2++; -+// next++; -+// } -+ -+ subs w10, w10, #16 -+ add x2, x2, #16 -+ add x3, x3, #16 -+ add x4, x4, #16 -+ add x17, x17, #16 -+ bgt 10b -+ -+ POP_VREGS -+99: -+ ret -+endfunc -+ - // ============================================================================ - // - // void ff_bwdif_filter_edge_neon( -diff --git a/libavfilter/bwdif.h b/libavfilter/bwdif.h -index ae1616d366..cce99953f3 100644 ---- a/libavfilter/bwdif.h -+++ b/libavfilter/bwdif.h -@@ -48,4 +48,9 @@ void ff_bwdif_filter_edge_c(void *dst1, void *prev1, void *cur1, void *next1, - void ff_bwdif_filter_intra_c(void *dst1, void *cur1, int w, int prefs, int mrefs, - int prefs3, int mrefs3, int parity, int clip_max); - -+void ff_bwdif_filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, -+ int w, int prefs, int mrefs, int prefs2, int mrefs2, -+ int prefs3, int mrefs3, int prefs4, int mrefs4, -+ int parity, int clip_max); -+ - #endif /* AVFILTER_BWDIF_H */ -diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c -index 688c2d2572..2dc47f9614 100644 ---- a/libavfilter/vf_bwdif.c -+++ b/libavfilter/vf_bwdif.c -@@ -132,10 +132,10 @@ void ff_bwdif_filter_intra_c(void *dst1, void *cur1, int w, int prefs, int mrefs - FILTER_INTRA() - } - --static void filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, -- int w, int prefs, int mrefs, int prefs2, int mrefs2, -- int prefs3, int mrefs3, int prefs4, int mrefs4, -- int parity, int clip_max) -+void ff_bwdif_filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, -+ int w, int prefs, int mrefs, int prefs2, int mrefs2, -+ int prefs3, int mrefs3, int prefs4, int mrefs4, -+ int parity, int clip_max) - { - uint8_t *dst = dst1; - uint8_t *prev = prev1; -@@ -353,7 +353,7 @@ av_cold void ff_bwdif_init_filter_line(BWDIFContext *s, int bit_depth) - s->filter_edge = filter_edge_16bit; - } else { - s->filter_intra = ff_bwdif_filter_intra_c; -- s->filter_line = filter_line_c; -+ s->filter_line = ff_bwdif_filter_line_c; - s->filter_edge = ff_bwdif_filter_edge_c; - } - - -From 7601de6ab2604d1f530e4b8f20f409d1ec2ae6a4 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 4 Jul 2023 14:04:44 +0000 -Subject: [PATCH 150/151] avfilter/vf_bwdif: Add a filter_line3 method for - optimisation -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add an optional filter_line3 to the available optimisations. - -filter_line3 is equivalent to filter_line, memcpy, filter_line - -filter_line shares quite a number of loads and some calculations in -common with its next iteration and testing shows that using aarch64 -neon filter_line3s performance is 30% better than two filter_lines -and a memcpy. - -Adds a test for vf_bwdif filter_line3 to checkasm - -Rounds job start lines down to a multiple of 4. This means that if -filter_line3 exists then filter_line will not sometimes be called -once at the end of a slice depending on thread count. The final slice -may do up to 3 extra lines but filter_edge is faster than filter_line -so it is unlikely to create any noticable thread load variation. - -Signed-off-by: John Cox -Signed-off-by: Martin Storsjö -(cherry picked from commit 697533e76dbea8cc7fd6a0642bc60050cc05ead8) ---- - libavfilter/bwdif.h | 7 ++++ - libavfilter/vf_bwdif.c | 44 +++++++++++++++++++-- - tests/checkasm/vf_bwdif.c | 81 +++++++++++++++++++++++++++++++++++++++ - 3 files changed, 129 insertions(+), 3 deletions(-) - -diff --git a/libavfilter/bwdif.h b/libavfilter/bwdif.h -index cce99953f3..496cec72ef 100644 ---- a/libavfilter/bwdif.h -+++ b/libavfilter/bwdif.h -@@ -35,6 +35,9 @@ typedef struct BWDIFContext { - void (*filter_edge)(void *dst, void *prev, void *cur, void *next, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int parity, int clip_max, int spat); -+ void (*filter_line3)(void *dst, int dstride, -+ const void *prev, const void *cur, const void *next, int prefs, -+ int w, int parity, int clip_max); - } BWDIFContext; - - void ff_bwdif_init_filter_line(BWDIFContext *bwdif, int bit_depth); -@@ -53,4 +56,8 @@ void ff_bwdif_filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, - int prefs3, int mrefs3, int prefs4, int mrefs4, - int parity, int clip_max); - -+void ff_bwdif_filter_line3_c(void * dst1, int d_stride, -+ const void * prev1, const void * cur1, const void * next1, int s_stride, -+ int w, int parity, int clip_max); -+ - #endif /* AVFILTER_BWDIF_H */ -diff --git a/libavfilter/vf_bwdif.c b/libavfilter/vf_bwdif.c -index 2dc47f9614..9847d38b6a 100644 ---- a/libavfilter/vf_bwdif.c -+++ b/libavfilter/vf_bwdif.c -@@ -150,6 +150,31 @@ void ff_bwdif_filter_line_c(void *dst1, void *prev1, void *cur1, void *next1, - FILTER2() - } - -+#define NEXT_LINE()\ -+ dst += d_stride; \ -+ prev += prefs; \ -+ cur += prefs; \ -+ next += prefs; -+ -+void ff_bwdif_filter_line3_c(void * dst1, int d_stride, -+ const void * prev1, const void * cur1, const void * next1, int s_stride, -+ int w, int parity, int clip_max) -+{ -+ const int prefs = s_stride; -+ uint8_t * dst = dst1; -+ const uint8_t * prev = prev1; -+ const uint8_t * cur = cur1; -+ const uint8_t * next = next1; -+ -+ ff_bwdif_filter_line_c(dst, (void*)prev, (void*)cur, (void*)next, w, -+ prefs, -prefs, prefs * 2, - prefs * 2, prefs * 3, -prefs * 3, prefs * 4, -prefs * 4, parity, clip_max); -+ NEXT_LINE(); -+ memcpy(dst, cur, w); -+ NEXT_LINE(); -+ ff_bwdif_filter_line_c(dst, (void*)prev, (void*)cur, (void*)next, w, -+ prefs, -prefs, prefs * 2, - prefs * 2, prefs * 3, -prefs * 3, prefs * 4, -prefs * 4, parity, clip_max); -+} -+ - void ff_bwdif_filter_edge_c(void *dst1, void *prev1, void *cur1, void *next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, - int parity, int clip_max, int spat) -@@ -212,6 +237,13 @@ static void filter_edge_16bit(void *dst1, void *prev1, void *cur1, void *next1, - FILTER2() - } - -+// Round job start line down to multiple of 4 so that if filter_line3 exists -+// and the frame is a multiple of 4 high then filter_line will never be called -+static inline int job_start(const int jobnr, const int nb_jobs, const int h) -+{ -+ return jobnr >= nb_jobs ? h : ((h * jobnr) / nb_jobs) & ~3; -+} -+ - static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) - { - BWDIFContext *s = ctx->priv; -@@ -221,8 +253,8 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) - int clip_max = (1 << (yadif->csp->comp[td->plane].depth)) - 1; - int df = (yadif->csp->comp[td->plane].depth + 7) / 8; - int refs = linesize / df; -- int slice_start = (td->h * jobnr ) / nb_jobs; -- int slice_end = (td->h * (jobnr+1)) / nb_jobs; -+ int slice_start = job_start(jobnr, nb_jobs, td->h); -+ int slice_end = job_start(jobnr + 1, nb_jobs, td->h); - int y; - - for (y = slice_start; y < slice_end; y++) { -@@ -244,6 +276,11 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) - refs << 1, -(refs << 1), - td->parity ^ td->tff, clip_max, - (y < 2) || ((y + 3) > td->h) ? 0 : 1); -+ } else if (s->filter_line3 && y + 2 < slice_end && y + 6 < td->h) { -+ s->filter_line3(dst, td->frame->linesize[td->plane], -+ prev, cur, next, linesize, td->w, -+ td->parity ^ td->tff, clip_max); -+ y += 2; - } else { - s->filter_line(dst, prev, cur, next, td->w, - refs, -refs, refs << 1, -(refs << 1), -@@ -280,7 +317,7 @@ static void filter(AVFilterContext *ctx, AVFrame *dstpic, - td.plane = i; - - ff_filter_execute(ctx, filter_slice, &td, NULL, -- FFMIN(h, ff_filter_get_nb_threads(ctx))); -+ FFMIN((h+3)/4, ff_filter_get_nb_threads(ctx))); - } - if (yadif->current_field == YADIF_FIELD_END) { - yadif->current_field = YADIF_FIELD_NORMAL; -@@ -347,6 +384,7 @@ static int config_props(AVFilterLink *link) - - av_cold void ff_bwdif_init_filter_line(BWDIFContext *s, int bit_depth) - { -+ s->filter_line3 = 0; - if (bit_depth > 8) { - s->filter_intra = filter_intra_16bit; - s->filter_line = filter_line_c_16bit; -diff --git a/tests/checkasm/vf_bwdif.c b/tests/checkasm/vf_bwdif.c -index 5fdba09fdc..3399cacdf7 100644 ---- a/tests/checkasm/vf_bwdif.c -+++ b/tests/checkasm/vf_bwdif.c -@@ -28,6 +28,10 @@ - for (size_t i = 0; i < count; i++) \ - buf0[i] = buf1[i] = rnd() & mask - -+#define randomize_overflow_check(buf0, buf1, mask, count) \ -+ for (size_t i = 0; i < count; i++) \ -+ buf0[i] = buf1[i] = (rnd() & 1) != 0 ? mask : 0; -+ - #define BODY(type, depth) \ - do { \ - type prev0[9*WIDTH], prev1[9*WIDTH]; \ -@@ -83,6 +87,83 @@ void checkasm_check_vf_bwdif(void) - report("bwdif10"); - } - -+ if (!ctx_8.filter_line3) -+ ctx_8.filter_line3 = ff_bwdif_filter_line3_c; -+ -+ { -+ LOCAL_ALIGNED_16(uint8_t, prev0, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, prev1, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, next0, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, next1, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, cur0, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, cur1, [11*WIDTH]); -+ LOCAL_ALIGNED_16(uint8_t, dst0, [WIDTH*3]); -+ LOCAL_ALIGNED_16(uint8_t, dst1, [WIDTH*3]); -+ const int stride = WIDTH; -+ const int mask = (1<<8)-1; -+ int parity; -+ -+ for (parity = 0; parity != 2; ++parity) { -+ if (check_func(ctx_8.filter_line3, "bwdif8.line3.rnd.p%d", parity)) { -+ -+ declare_func(void, void * dst1, int d_stride, -+ const void * prev1, const void * cur1, const void * next1, int prefs, -+ int w, int parity, int clip_max); -+ -+ randomize_buffers(prev0, prev1, mask, 11*WIDTH); -+ randomize_buffers(next0, next1, mask, 11*WIDTH); -+ randomize_buffers( cur0, cur1, mask, 11*WIDTH); -+ -+ call_ref(dst0, stride, -+ prev0 + stride * 4, cur0 + stride * 4, next0 + stride * 4, stride, -+ WIDTH, parity, mask); -+ call_new(dst1, stride, -+ prev1 + stride * 4, cur1 + stride * 4, next1 + stride * 4, stride, -+ WIDTH, parity, mask); -+ -+ if (memcmp(dst0, dst1, WIDTH*3) -+ || memcmp(prev0, prev1, WIDTH*11) -+ || memcmp(next0, next1, WIDTH*11) -+ || memcmp( cur0, cur1, WIDTH*11)) -+ fail(); -+ -+ bench_new(dst1, stride, -+ prev1 + stride * 4, cur1 + stride * 4, next1 + stride * 4, stride, -+ WIDTH, parity, mask); -+ } -+ } -+ -+ // Use just 0s and ~0s to try to provoke bad cropping or overflow -+ // Parity makes no difference to this test so just test 0 -+ if (check_func(ctx_8.filter_line3, "bwdif8.line3.overflow")) { -+ -+ declare_func(void, void * dst1, int d_stride, -+ const void * prev1, const void * cur1, const void * next1, int prefs, -+ int w, int parity, int clip_max); -+ -+ randomize_overflow_check(prev0, prev1, mask, 11*WIDTH); -+ randomize_overflow_check(next0, next1, mask, 11*WIDTH); -+ randomize_overflow_check( cur0, cur1, mask, 11*WIDTH); -+ -+ call_ref(dst0, stride, -+ prev0 + stride * 4, cur0 + stride * 4, next0 + stride * 4, stride, -+ WIDTH, 0, mask); -+ call_new(dst1, stride, -+ prev1 + stride * 4, cur1 + stride * 4, next1 + stride * 4, stride, -+ WIDTH, 0, mask); -+ -+ if (memcmp(dst0, dst1, WIDTH*3) -+ || memcmp(prev0, prev1, WIDTH*11) -+ || memcmp(next0, next1, WIDTH*11) -+ || memcmp( cur0, cur1, WIDTH*11)) -+ fail(); -+ -+ // No point to benching -+ } -+ -+ report("bwdif8.line3"); -+ } -+ - { - LOCAL_ALIGNED_16(uint8_t, prev0, [11*WIDTH]); - LOCAL_ALIGNED_16(uint8_t, prev1, [11*WIDTH]); - -From 120058b7abd0db1d222b1e197207de8226fdfd94 Mon Sep 17 00:00:00 2001 -From: John Cox -Date: Tue, 4 Jul 2023 14:04:45 +0000 -Subject: [PATCH 151/151] avfilter/vf_bwdif: Add neon for filter_line3 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: John Cox -Signed-off-by: Martin Storsjö -(cherry picked from commit f00222e81f7d6a59d977fbb280d67989818e0ad2) ---- - libavfilter/aarch64/vf_bwdif_init_aarch64.c | 28 ++ - libavfilter/aarch64/vf_bwdif_neon.S | 272 ++++++++++++++++++++ - 2 files changed, 300 insertions(+) - -diff --git a/libavfilter/aarch64/vf_bwdif_init_aarch64.c b/libavfilter/aarch64/vf_bwdif_init_aarch64.c -index 21e67884ab..f52bc4b9b4 100644 ---- a/libavfilter/aarch64/vf_bwdif_init_aarch64.c -+++ b/libavfilter/aarch64/vf_bwdif_init_aarch64.c -@@ -36,6 +36,33 @@ void ff_bwdif_filter_line_neon(void *dst1, void *prev1, void *cur1, void *next1, - int prefs3, int mrefs3, int prefs4, int mrefs4, - int parity, int clip_max); - -+void ff_bwdif_filter_line3_neon(void * dst1, int d_stride, -+ const void * prev1, const void * cur1, const void * next1, int s_stride, -+ int w, int parity, int clip_max); -+ -+ -+static void filter_line3_helper(void * dst1, int d_stride, -+ const void * prev1, const void * cur1, const void * next1, int s_stride, -+ int w, int parity, int clip_max) -+{ -+ // Asm works on 16 byte chunks -+ // If w is a multiple of 16 then all is good - if not then if width rounded -+ // up to nearest 16 will fit in both src & dst strides then allow the asm -+ // to write over the padding bytes as that is almost certainly faster than -+ // having to invoke the C version to clean up the tail. -+ const int w1 = FFALIGN(w, 16); -+ const int w0 = clip_max != 255 ? 0 : -+ d_stride <= w1 && s_stride <= w1 ? w : w & ~15; -+ -+ ff_bwdif_filter_line3_neon(dst1, d_stride, -+ prev1, cur1, next1, s_stride, -+ w0, parity, clip_max); -+ -+ if (w0 < w) -+ ff_bwdif_filter_line3_c((char *)dst1 + w0, d_stride, -+ (const char *)prev1 + w0, (const char *)cur1 + w0, (const char *)next1 + w0, s_stride, -+ w - w0, parity, clip_max); -+} - - static void filter_line_helper(void *dst1, void *prev1, void *cur1, void *next1, - int w, int prefs, int mrefs, int prefs2, int mrefs2, -@@ -93,5 +120,6 @@ ff_bwdif_init_aarch64(BWDIFContext *s, int bit_depth) - s->filter_intra = filter_intra_helper; - s->filter_line = filter_line_helper; - s->filter_edge = filter_edge_helper; -+ s->filter_line3 = filter_line3_helper; - } - -diff --git a/libavfilter/aarch64/vf_bwdif_neon.S b/libavfilter/aarch64/vf_bwdif_neon.S -index f185e94e3c..ae9aab20cd 100644 ---- a/libavfilter/aarch64/vf_bwdif_neon.S -+++ b/libavfilter/aarch64/vf_bwdif_neon.S -@@ -154,6 +154,278 @@ const coeffs, align=4 // align 4 means align on 2^4 boundry - .hword 5077, 981 // sp[0] = v0.h[6] - endconst - -+// =========================================================================== -+// -+// void ff_bwdif_filter_line3_neon( -+// void * dst1, // x0 -+// int d_stride, // w1 -+// const void * prev1, // x2 -+// const void * cur1, // x3 -+// const void * next1, // x4 -+// int s_stride, // w5 -+// int w, // w6 -+// int parity, // w7 -+// int clip_max); // [sp, #0] (Ignored) -+ -+function ff_bwdif_filter_line3_neon, export=1 -+ // Sanity check w -+ cmp w6, #0 -+ ble 99f -+ -+ LDR_COEFFS v0, x17 -+ -+// #define prev2 cur -+// const uint8_t * restrict next2 = parity ? prev : next; -+ cmp w7, #0 -+ csel x17, x2, x4, ne -+ -+ // We want all the V registers - save all the ones we must -+ PUSH_VREGS -+ -+ // Some rearrangement of initial values for nice layout of refs in regs -+ mov w10, w6 // w10 = loop count -+ neg w9, w5 // w9 = mref -+ lsl w8, w9, #1 // w8 = mref2 -+ add w7, w9, w9, LSL #1 // w7 = mref3 -+ lsl w6, w9, #2 // w6 = mref4 -+ mov w11, w5 // w11 = pref -+ lsl w12, w5, #1 // w12 = pref2 -+ add w13, w5, w5, LSL #1 // w13 = pref3 -+ lsl w14, w5, #2 // w14 = pref4 -+ add w15, w5, w5, LSL #2 // w15 = pref5 -+ add w16, w14, w12 // w16 = pref6 -+ -+ lsl w5, w1, #1 // w5 = d_stride * 2 -+ -+// for (x = 0; x < w; x++) { -+// int diff0, diff2; -+// int d0, d2; -+// int temporal_diff0, temporal_diff2; -+// -+// int i1, i2; -+// int j1, j2; -+// int p6, p5, p4, p3, p2, p1, c0, m1, m2, m3, m4; -+ -+10: -+// c0 = prev2[0] + next2[0]; // c0 = v20, v21 -+// d0 = c0 >> 1; // d0 = v10 -+// temporal_diff0 = FFABS(prev2[0] - next2[0]); // td0 = v11 -+ ldr q31, [x3] -+ ldr q21, [x17] -+ uhadd v10.16b, v31.16b, v21.16b -+ uabd v11.16b, v31.16b, v21.16b -+ uaddl v20.8h, v21.8b, v31.8b -+ uaddl2 v21.8h, v21.16b, v31.16b -+ -+ ldr q31, [x3, w6, sxtw] -+ ldr q23, [x17, w6, sxtw] -+ -+// i1 = coef_hf[0] * c0; // i1 = v2-v5 -+ UMULL4K v2, v3, v4, v5, v20, v21, v0.h[2] -+ -+ ldr q30, [x3, w14, sxtw] -+ ldr q25, [x17, w14, sxtw] -+ -+// m4 = prev2[mrefs4] + next2[mrefs4]; // m4 = v22,v23 -+ uaddl v22.8h, v23.8b, v31.8b -+ uaddl2 v23.8h, v23.16b, v31.16b -+ -+// p4 = prev2[prefs4] + next2[prefs4]; // p4 = v24,v25, (p4 >> 1) = v12 -+ uhadd v12.16b, v25.16b, v30.16b -+ uaddl v24.8h, v25.8b, v30.8b -+ uaddl2 v25.8h, v25.16b, v30.16b -+ -+// j1 = -coef_hf[1] * (c0 + p4); // j1 = v6-v9 (-c0:v20,v21) -+ add v20.8h, v20.8h, v24.8h -+ add v21.8h, v21.8h, v25.8h -+ SMULL4K v6, v7, v8, v9, v20, v21, v0.h[5] -+ -+// m3 = cur[mrefs3]; // m3 = v20 -+ ldr q20, [x3, w7, sxtw] -+ -+// p3 = cur[prefs3]; // p3 = v21 -+ ldr q21, [x3, w13, sxtw] -+ -+// i1 += coef_hf[2] * (m4 + p4); // (-m4:v22,v23) (-p4:v24,v25) -+ add v22.8h, v22.8h, v24.8h -+ add v23.8h, v23.8h, v25.8h -+ UMLAL4K v2, v3, v4, v5, v22, v23, v0.h[4] -+ -+ ldr q29, [x3, w8, sxtw] -+ ldr q23, [x17, w8, sxtw] -+ -+// i1 -= coef_lf[1] * 4 * (m3 + p3); // - -+ uaddl v30.8h, v20.8b, v21.8b -+ uaddl2 v31.8h, v20.16b, v21.16b -+ -+ ldr q28, [x3, w16, sxtw] -+ ldr q25, [x17, w16, sxtw] -+ -+ UMLSL4K v2, v3, v4, v5, v30, v31, v0.h[1] -+ -+// m2 = prev2[mrefs2] + next2[mrefs2]; // m2 = v22,v23, (m2 >> 1) = v13 -+ uhadd v13.16b, v23.16b, v29.16b -+ uaddl v22.8h, v23.8b, v29.8b -+ uaddl2 v23.8h, v23.16b, v29.16b -+ -+ ldr q31, [x3, w12, sxtw] -+ ldr q27, [x17, w12, sxtw] -+ -+// p6 = prev2[prefs6] + next2[prefs6]; // p6 = v24,v25 -+ uaddl v24.8h, v25.8b, v28.8b -+ uaddl2 v25.8h, v25.16b, v28.16b -+ -+// j1 += coef_hf[2] * (m2 + p6); // (-p6:v24,v25) -+ add v24.8h, v24.8h, v22.8h -+ add v25.8h, v25.8h, v23.8h -+ UMLAL4K v6, v7, v8, v9, v24, v25, v0.h[4] -+ -+// m1 = cur[mrefs]; // m1 = v24 -+ ldr q24, [x3, w9, sxtw] -+ -+// p5 = cur[prefs5]; // p5 = v25 -+ ldr q25, [x3, w15, sxtw] -+ -+// p2 = prev2[prefs2] + next2[prefs2]; // p2 = v26, v27 -+// temporal_diff2 = FFABS(prev2[prefs2] - next2[prefs2]); // td2 = v14 -+// d2 = p2 >> 1; // d2 = v15 -+ uabd v14.16b, v31.16b, v27.16b -+ uhadd v15.16b, v31.16b, v27.16b -+ uaddl v26.8h, v27.8b, v31.8b -+ uaddl2 v27.8h, v27.16b, v31.16b -+ -+// j1 += coef_hf[0] * p2; // - -+ UMLAL4K v6, v7, v8, v9, v26, v27, v0.h[2] -+ -+// i1 -= coef_hf[1] * (m2 + p2); // (-m2:v22,v23*) (-p2:v26*,v27*) -+ add v22.8h, v22.8h, v26.8h -+ add v23.8h, v23.8h, v27.8h -+ UMLSL4K v2, v3, v4, v5, v22, v23, v0.h[3] -+ -+// p1 = cur[prefs]; // p1 = v22 -+ ldr q22, [x3, w11, sxtw] -+ -+// j1 -= coef_lf[1] * 4 * (m1 + p5); // - -+ uaddl v26.8h, v24.8b, v25.8b -+ uaddl2 v27.8h, v24.16b, v25.16b -+ UMLSL4K v6, v7, v8, v9, v26, v27, v0.h[1] -+ -+// j2 = (coef_sp[0] * (p1 + p3) - coef_sp[1] * (m1 + p5)) >> 13; // (-p5:v25*) j2=v16 -+ uaddl v18.8h, v22.8b, v21.8b -+ uaddl2 v19.8h, v22.16b, v21.16b -+ UMULL4K v28, v29, v30, v31, v18, v19, v0.h[6] -+ -+ uaddl v18.8h, v24.8b, v25.8b -+ uaddl2 v19.8h, v24.16b, v25.16b -+ UMLSL4K v28, v29, v30, v31, v18, v19, v0.h[7] -+ -+ SQSHRUNN v16, v28, v29, v30, v31, 13 -+ -+// i2 = (coef_sp[0] * (m1 + p1) - coef_sp[1] * (m3 + p3)) >> 13; // (-m3:v20*) i2=v17 -+ uaddl v18.8h, v22.8b, v24.8b -+ uaddl2 v19.8h, v22.16b, v24.16b -+ UMULL4K v28, v29, v30, v31, v18, v19, v0.h[6] -+ -+ uaddl v18.8h, v20.8b, v21.8b -+ uaddl2 v19.8h, v20.16b, v21.16b -+ UMLSL4K v28, v29, v30, v31, v18, v19, v0.h[7] -+ -+ SQSHRUNN v17, v28, v29, v30, v31, 13 -+ -+// i1 += coef_lf[0] * 4 * (m1 + p1); // p1 = v22, m1 = v24 -+ uaddl v26.8h, v24.8b, v22.8b -+ uaddl2 v27.8h, v24.16b, v22.16b -+ UMLAL4K v2, v3, v4, v5, v26, v27, v0.h[0] -+ -+ ldr q31, [x2, w9, sxtw] -+ ldr q29, [x4, w9, sxtw] -+ -+// j1 += coef_lf[0] * 4 * (p1 + p3); // p1 = v22, p3 = v21 -+ uaddl v26.8h, v21.8b, v22.8b -+ uaddl2 v27.8h, v21.16b, v22.16b -+ UMLAL4K v6, v7, v8, v9, v26, v27, v0.h[0] -+ -+ ldr q30, [x2, w11, sxtw] -+ ldr q28, [x4, w11, sxtw] -+ -+// i1 >>= 15; // i1 = v2, -v3, -v4*, -v5* -+ SQSHRUNN v2, v2, v3, v4, v5, 15 -+ -+// j1 >>= 15; // j1 = v3, -v6*, -v7*, -v8*, -v9* -+ SQSHRUNN v3, v6, v7, v8, v9, 15 -+ -+// { -+// int t1 =(FFABS(prev[mrefs] - m1) + FFABS(prev[prefs] - p1)) >> 1; -+// int t2 =(FFABS(next[mrefs] - m1) + FFABS(next[prefs] - p1)) >> 1; -+ uabd v30.16b, v22.16b, v30.16b -+ uabd v31.16b, v24.16b, v31.16b -+ uabd v28.16b, v22.16b, v28.16b -+ uabd v29.16b, v24.16b, v29.16b -+ uhadd v31.16b, v31.16b, v30.16b -+ uhadd v29.16b, v29.16b, v28.16b -+ -+ ldr q27, [x2, w13, sxtw] -+ ldr q26, [x4, w13, sxtw] -+ -+// diff0 = FFMAX3(temporal_diff0 >> 1, t1, t2); // diff0=v18 -+ ushr v18.16b, v11.16b, #1 -+ umax v18.16b, v18.16b, v31.16b -+ umax v18.16b, v18.16b, v29.16b -+// } // v28, v30 preserved for next block -+// { // tdiff2 = v14 -+// int t1 =(FFABS(prev[prefs] - p1) + FFABS(prev[prefs3] - p3)) >> 1; -+// int t2 =(FFABS(next[prefs] - p1) + FFABS(next[prefs3] - p3)) >> 1; -+ uabd v31.16b, v21.16b, v27.16b -+ uabd v29.16b, v21.16b, v26.16b -+ uhadd v31.16b, v31.16b, v30.16b -+ uhadd v29.16b, v29.16b, v28.16b -+ -+// diff2 = FFMAX3(temporal_diff2 >> 1, t1, t2); // diff2=v19 -+ ushr v19.16b, v14.16b, #1 -+ umax v19.16b, v19.16b, v31.16b -+ umax v19.16b, v19.16b, v29.16b -+// } -+ -+ // diff0 = v18, (m2 >> 1) = v13, m1 = v24, d0 = v10, p1 = v22, d2 = v15 -+ SPAT_CHECK v18, v13, v24, v10, v22, v15, v31, v30, v29, v28 -+ -+ // diff2 = v19, d0 = v10, p1 = v22, d2 = v15, p3 = v21, (p4 >> 1) = v12 -+ SPAT_CHECK v19, v10, v22, v15, v21, v12, v31, v30, v29, v28 -+ -+ // j1 = v3, j2 = v16, p1 = v22, d2 = v15, p3 = v21, td2 = v14, diff2 = v19 -+ INTERPOL v3, v3, v16, v22, v15, v21, v14, v19, v31, v30, v29 -+ -+// dst[d_stride * 2] = av_clip_uint8(interpol); -+ str q3, [x0, w5, sxtw] -+ -+// dst[d_stride] = p1; -+ str q22, [x0, w1, sxtw] -+ -+ // i1 = v2, i2 = v17, m1 = v24, d0 = v10, p1 = v22, td2 = v11, diff2 = v18 -+ INTERPOL v2, v2, v17, v24, v10, v22, v11, v18, v31, v30, v29 -+ -+// dst[0] = av_clip_uint8(interpol); -+ str q2, [x0], #16 -+// } -+// -+// dst++; -+// cur++; -+// prev++; -+// prev2++; -+// next++; -+// } -+ subs w10, w10, #16 -+ add x2, x2, #16 -+ add x3, x3, #16 -+ add x4, x4, #16 -+ add x17, x17, #16 -+ bgt 10b -+ -+ POP_VREGS -+99: -+ ret -+endfunc -+ - // =========================================================================== - // - // void filter_line( diff --git a/packages/multimedia/gstreamer/gst-plugins-bad/package.mk b/packages/multimedia/gstreamer/gst-plugins-bad/package.mk index e8f84022e3..25f1ce3ce3 100644 --- a/packages/multimedia/gstreamer/gst-plugins-bad/package.mk +++ b/packages/multimedia/gstreamer/gst-plugins-bad/package.mk @@ -182,7 +182,7 @@ pre_configure_target() { -Dglib-asserts=disabled \ -Dglib-checks=disabled \ -Dpackage-name=gst-plugins-bad \ - -Dpackage-origin=LibreELEC.tv \ + -Dpackage-origin=jelos.org \ -Ddoc=disabled" } diff --git a/packages/multimedia/gstreamer/gst-plugins-base/package.mk b/packages/multimedia/gstreamer/gst-plugins-base/package.mk index 55c41d3851..89f00475b2 100644 --- a/packages/multimedia/gstreamer/gst-plugins-base/package.mk +++ b/packages/multimedia/gstreamer/gst-plugins-base/package.mk @@ -15,7 +15,7 @@ pre_configure_target() { -Dtests=disabled \ -Dgobject-cast-checks=disabled \ -Dpackage-name=gst-plugins-base \ - -Dpackage-origin=LibreELEC.tv \ + -Dpackage-origin=jelos.org \ -Ddoc=disabled \ -Dnls=disabled" diff --git a/packages/multimedia/gstreamer/gstreamer/package.mk b/packages/multimedia/gstreamer/gstreamer/package.mk index ca4e72b6f4..910483bd3b 100644 --- a/packages/multimedia/gstreamer/gstreamer/package.mk +++ b/packages/multimedia/gstreamer/gstreamer/package.mk @@ -15,7 +15,7 @@ PKG_MESON_OPTS_TARGET="-Dlibunwind=disabled \ -Dtests=disabled \ -Dnls=disabled \ -Dpackage-name=gstreamer \ - -Dpackage-origin=LibreELEC.tv \ + -Dpackage-origin=jelos.org \ -Ddoc=disabled" } diff --git a/packages/network/avahi/system.d/avahi-daemon.service b/packages/network/avahi/system.d/avahi-daemon.service index 63cd640cb8..3f9b1e89da 100644 --- a/packages/network/avahi/system.d/avahi-daemon.service +++ b/packages/network/avahi/system.d/avahi-daemon.service @@ -6,7 +6,7 @@ ConditionPathExists=/storage/.cache/services/avahi.conf [Service] Restart=on-failure -EnvironmentFile=-/run/libreelec/debug/avahi.conf +EnvironmentFile=-/run/jelos/debug/avahi.conf ExecStart=/usr/sbin/avahi-daemon -s $AVAHI_DEBUG ExecReload=/usr/sbin/avahi-daemon -r TimeoutStopSec=1s diff --git a/packages/network/bluez/system.d/bluetooth.service b/packages/network/bluez/system.d/bluetooth.service index 3f0ff2bf9a..2918d2a979 100644 --- a/packages/network/bluez/system.d/bluetooth.service +++ b/packages/network/bluez/system.d/bluetooth.service @@ -10,7 +10,7 @@ Type=dbus BusName=org.bluez NotifyAccess=main EnvironmentFile=/storage/.cache/services/bluez.conf -EnvironmentFile=-/run/libreelec/debug/bluez.conf +EnvironmentFile=-/run/jelos/debug/bluez.conf ExecStart=/usr/lib/bluetooth/bluetoothd $BLUEZ_ARGS $BLUEZ_DEBUG CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_FOWNER LimitNPROC=1 diff --git a/packages/network/bluez/system.d/obex.service b/packages/network/bluez/system.d/obex.service index 919d75babd..52f01a4f44 100644 --- a/packages/network/bluez/system.d/obex.service +++ b/packages/network/bluez/system.d/obex.service @@ -8,7 +8,7 @@ ConditionPathExists=/storage/.cache/services/bluez.conf [Service] EnvironmentFile=/storage/.cache/services/obexd.conf -EnvironmentFile=-/run/libreelec/debug/obexd.conf +EnvironmentFile=-/run/jelos/debug/obexd.conf ExecStartPre=/bin/sh -c 'mkdir -p $OBEXD_ROOT' ExecStart=/usr/lib/bluetooth/obexd -r $OBEXD_ROOT $OBEXD_DEBUG TimeoutStopSec=1s diff --git a/packages/network/connman/package.mk b/packages/network/connman/package.mk index a9f57ad476..5db2516ae9 100644 --- a/packages/network/connman/package.mk +++ b/packages/network/connman/package.mk @@ -49,7 +49,7 @@ PKG_CONFIGURE_OPTS_TARGET="WPASUPPLICANT=/usr/bin/wpa_supplicant \ if [ "$WIREGUARD_SUPPORT" = "yes" ]; then PKG_CONFIGURE_OPTS_TARGET+=" --enable-wireguard=builtin" else - PKG_CONGIGURE_OPTS_TARGET+=" --disable-wireguard" + PKG_CONFIGURE_OPTS_TARGET+=" --disable-wireguard" fi PKG_MAKE_OPTS_TARGET="storagedir=/storage/.cache/connman \ @@ -77,13 +77,15 @@ post_makeinstall_target() { -e "s|^# TetheringTechnologies.*|TetheringTechnologies = wifi|g" \ -e "s|^# AllowHostnameUpdates.*|AllowHostnameUpdates = false|g" \ -e "s|^# PersistentTetheringMode.*|PersistentTetheringMode = true|g" \ - -e "s|^# SingleConnectedTechnology.*|SingleConnectedTechnology = true|g" \ -e "s|^# NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb|NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,docker,veth,zt,p2p|g" mkdir -p ${INSTALL}/usr/share/connman/ cp ${PKG_DIR}/config/settings ${INSTALL}/usr/share/connman/ } +# Bounced from above +# -e "s|^# SingleConnectedTechnology.*|SingleConnectedTechnology = true|g" \ + post_install() { add_user system x 430 430 "service" "/var/run/connman" "/bin/sh" add_group system 430 diff --git a/packages/network/connman/scripts/connman-setup b/packages/network/connman/scripts/connman-setup index 16bc279ad2..d0b7fc85ed 100755 --- a/packages/network/connman/scripts/connman-setup +++ b/packages/network/connman/scripts/connman-setup @@ -18,8 +18,8 @@ # switch resolv.conf management to connman and use current contents # as a fallback -if [ -f /run/libreelec/resolv.conf ]; then - cat /run/libreelec/resolv.conf > /run/connman/resolv.conf +if [ -f /run/jelos/resolv.conf ]; then + cat /run/jelos/resolv.conf > /run/connman/resolv.conf fi -rm -f /run/libreelec/resolv.conf -ln -s /run/connman/resolv.conf /run/libreelec/resolv.conf +rm -f /run/jelos/resolv.conf +ln -s /run/connman/resolv.conf /run/jelos/resolv.conf diff --git a/packages/network/connman/system.d/connman.service b/packages/network/connman/system.d/connman.service index 0ae1867505..14a0b320a2 100644 --- a/packages/network/connman/system.d/connman.service +++ b/packages/network/connman/system.d/connman.service @@ -12,7 +12,7 @@ ConditionPathExists=!/dev/.kernel_ipconfig Type=dbus BusName=net.connman Restart=on-failure -EnvironmentFile=-/run/libreelec/debug/connman.conf +EnvironmentFile=-/run/jelos/debug/connman.conf ExecStart=/bin/sh -c ". /usr/lib/connman/connman-setup; exec /usr/sbin/connmand -nr $CONNMAN_MAIN $CONNMAN_DEBUG" StandardOutput=null RestartSec=2 diff --git a/packages/network/iptables/package.mk b/packages/network/iptables/package.mk index 44c9a80fc1..d63d9bd409 100644 --- a/packages/network/iptables/package.mk +++ b/packages/network/iptables/package.mk @@ -11,20 +11,9 @@ PKG_LONGDESC="IP packet filter administration." PKG_TOOLCHAIN="autotools" -case ${DEVICE} in - RK356*) - PKG_VERSION="1.8.3" - PKG_EXTENSION="bz2" - PKG_PATCH_DIRS+="4.x" - PKG_CONFIGURE_OPTS_TARGET="--with-kernel=$(kernel_path) - CPPFLAGS=-I${SYSROOT_PREFIX}/usr/include" - ;; - *) - PKG_VERSION="1.8.9" - PKG_EXTENSION="xz" - PKG_PATCH_DIRS+="5.x" - ;; -esac +PKG_VERSION="1.8.9" +PKG_EXTENSION="xz" +PKG_PATCH_DIRS+="5.x" PKG_URL="https://www.netfilter.org/projects/iptables/files/${PKG_NAME}-${PKG_VERSION}.tar.${PKG_EXTENSION}" @@ -35,8 +24,8 @@ post_makeinstall_target() { mkdir -p ${INSTALL}/etc/iptables/ cp -PR ${PKG_DIR}/config/* ${INSTALL}/etc/iptables/ - mkdir -p ${INSTALL}/usr/lib/coreelec - cp ${PKG_DIR}/scripts/iptables_helper ${INSTALL}/usr/lib/coreelec + mkdir -p ${INSTALL}/usr/lib/jelos/ + cp ${PKG_DIR}/scripts/iptables_helper ${INSTALL}/usr/lib/jelos/ } post_install() { diff --git a/packages/network/iptables/system.d/iptables.service b/packages/network/iptables/system.d/iptables.service index 5e23ef1de8..c4a6d51fbc 100644 --- a/packages/network/iptables/system.d/iptables.service +++ b/packages/network/iptables/system.d/iptables.service @@ -1,6 +1,6 @@ [Unit] Description=IPTABLES Packet Filtering -ConditionPathExists=/usr/lib/coreelec/iptables_helper +ConditionPathExists=/usr/lib/jelos/iptables_helper ConditionPathExists=|/storage/.cache/services/iptables.conf Before=network.target Wants=network.target @@ -8,9 +8,9 @@ Wants=network.target [Service] Type=oneshot EnvironmentFile=-/storage/.cache/services/iptables.conf -ExecStart=/usr/lib/coreelec/iptables_helper enable -ExecReload=/usr/lib/coreelec/iptables_helper enable -ExecStop=/usr/lib/coreelec/iptables_helper disable +ExecStart=/usr/lib/jelos/iptables_helper enable +ExecReload=/usr/lib/jelos/iptables_helper enable +ExecStop=/usr/lib/jelos/iptables_helper disable RemainAfterExit=yes [Install] diff --git a/packages/network/tailscale/package.mk b/packages/network/tailscale/package.mk index 5669238688..451b141ffc 100644 --- a/packages/network/tailscale/package.mk +++ b/packages/network/tailscale/package.mk @@ -22,13 +22,6 @@ esac PKG_URL="https://pkgs.tailscale.com/stable/tailscale_${PKG_VERSION}${TS_ARCH}.tgz" -# Don't wildcard (X55) -case ${DEVICE} in - RK3566) - PKG_DEPENDS_TARGET+=" wireguard-linux-compat" - ;; -esac - pre_unpack() { mkdir -p ${PKG_BUILD} tar --strip-components=1 -xf $SOURCES/${PKG_NAME}/${PKG_NAME}-${PKG_VERSION}.tgz -C ${PKG_BUILD} tailscale_${PKG_VERSION}${TS_ARCH} diff --git a/packages/network/wireguard-linux-compat/patches/RK3566/01-fix-build-issue.patch b/packages/network/wireguard-linux-compat/patches/RK3566/01-fix-build-issue.patch deleted file mode 100644 index 905ab9a256..0000000000 --- a/packages/network/wireguard-linux-compat/patches/RK3566/01-fix-build-issue.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -rupN wireguard-linux-compat.orig/src/compat/compat.h wireguard-linux-compat/src/compat/compat.h ---- wireguard-linux-compat.orig/src/compat/compat.h 2022-05-12 09:47:59.423533102 +0000 -+++ wireguard-linux-compat/src/compat/compat.h 2022-05-12 09:49:46.623499934 +0000 -@@ -686,14 +686,14 @@ struct __compat_dummy_container { char d - #define genl_dump_check_consistent(a, b) genl_dump_check_consistent(a, b, &genl_family) - #endif - --#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0) && !defined(ISRHEL7) -+/* #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0) && !defined(ISRHEL7) - static inline void *skb_put_data(struct sk_buff *skb, const void *data, unsigned int len) - { - void *tmp = skb_put(skb, len); - memcpy(tmp, data, len); - return tmp; - } --#endif -+#endif */ - - #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0) && !defined(ISRHEL7) - #define napi_complete_done(n, work_done) napi_complete(n) diff --git a/packages/network/wireguard-linux-compat/patches/RK3566/02-fix-another-one.patch b/packages/network/wireguard-linux-compat/patches/RK3566/02-fix-another-one.patch deleted file mode 100644 index bc786c259b..0000000000 --- a/packages/network/wireguard-linux-compat/patches/RK3566/02-fix-another-one.patch +++ /dev/null @@ -1,50 +0,0 @@ -diff -rupN wireguard-linux-compat.orig/src/compat/compat.h wireguard-linux-compat/src/compat/compat.h ---- wireguard-linux-compat.orig/src/compat/compat.h 2022-05-18 13:48:16.173696186 +0000 -+++ wireguard-linux-compat/src/compat/compat.h 2022-05-18 13:54:54.027438354 +0000 -@@ -414,16 +414,6 @@ static inline u64 __compat_jiffies64_to_ - } - #define jiffies64_to_nsecs __compat_jiffies64_to_nsecs - #endif --static inline u64 ktime_get_coarse_boottime_ns(void) --{ --#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 17, 0) -- return ktime_to_ns(ktime_get_boottime()); --#elif (LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 12) && LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)) || LINUX_VERSION_CODE < KERNEL_VERSION(4, 19, 53) -- return ktime_to_ns(ktime_mono_to_any(ns_to_ktime(jiffies64_to_nsecs(get_jiffies_64())), TK_OFFS_BOOT)); --#else -- return ktime_to_ns(ktime_get_coarse_boottime()); --#endif --} - #endif - - #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0) -@@ -1080,29 +1070,8 @@ static inline void skb_reset_redirect(st - #define pre_exit exit - #endif - --#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 8, 0) --#include --#include --#include --static inline __be16 ip_tunnel_parse_protocol(const struct sk_buff *skb) --{ -- if (skb_network_header(skb) >= skb->head && -- (skb_network_header(skb) + sizeof(struct iphdr)) <= skb_tail_pointer(skb) && -- ip_hdr(skb)->version == 4) -- return htons(ETH_P_IP); -- if (skb_network_header(skb) >= skb->head && -- (skb_network_header(skb) + sizeof(struct ipv6hdr)) <= skb_tail_pointer(skb) && -- ipv6_hdr(skb)->version == 6) -- return htons(ETH_P_IPV6); -- return 0; --} --#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) || defined(ISRHEL8) --static const struct header_ops ip_tunnel_header_ops = { .parse_protocol = ip_tunnel_parse_protocol }; --#else - #define header_ops hard_header_len - #define ip_tunnel_header_ops *(char *)0 - (char *)0 --#endif --#endif - - #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0) - #define kfree_sensitive(a) kzfree(a) diff --git a/packages/rust/rust/package.mk b/packages/rust/rust/package.mk index 9a90a50e32..4cdfc5228a 100644 --- a/packages/rust/rust/package.mk +++ b/packages/rust/rust/package.mk @@ -19,19 +19,8 @@ pre_configure_host() { } configure_host() { - mkdir -p ${PKG_BUILD}/targets - - case "${TARGET_ARCH}" in - "arm") - # the arm target is special because we specify the subarch. ie armv8a - cp -a ${PKG_DIR}/targets/arm-libreelec-linux-gnueabihf.json ${PKG_BUILD}/targets/${TARGET_NAME}.json - ;; - "aarch64"|"x86_64") - cp -a ${PKG_DIR}/targets/${TARGET_NAME}.json ${PKG_BUILD}/targets/${TARGET_NAME}.json - ;; - esac - + cp -a ${PKG_DIR}/targets/${TARGET_NAME}.json ${PKG_BUILD}/targets/${TARGET_NAME}.json cat > ${PKG_BUILD}/config.toml <>/run/libreelec/cacert.pem +[ -f /storage/.config/cacert.pem ] && cat /storage/.config/cacert.pem >>/run/jelos/cacert.pem exit 0 diff --git a/packages/sysutils/busybox/package.mk b/packages/sysutils/busybox/package.mk index 4d72b4a187..1b5d7ad6f5 100644 --- a/packages/sysutils/busybox/package.mk +++ b/packages/sysutils/busybox/package.mk @@ -127,15 +127,11 @@ makeinstall_target() { cp ${PKG_DIR}/scripts/pastebinit ${INSTALL}/usr/bin/ ln -sf pastebinit ${INSTALL}/usr/bin/paste - mkdir -p ${INSTALL}/usr/lib/coreelec - cp ${PKG_DIR}/scripts/functions ${INSTALL}/usr/lib/coreelec - cp ${PKG_DIR}/scripts/fs-resize ${INSTALL}/usr/lib/coreelec + mkdir -p ${INSTALL}/usr/lib/jelos/ + cp ${PKG_DIR}/scripts/functions ${INSTALL}/usr/lib/jelos/ + cp ${PKG_DIR}/scripts/fs-resize ${INSTALL}/usr/lib/jelos/ sed -e "s/@DISTRONAME@/${DISTRONAME}/g" \ - -i ${INSTALL}/usr/lib/coreelec/fs-resize - - if listcontains "${FIRMWARE}" "rpi-eeprom"; then - cp ${PKG_DIR}/scripts/rpi-flash-firmware ${INSTALL}/usr/lib/libreelec - fi + -i ${INSTALL}/usr/lib/jelos/fs-resize mkdir -p ${INSTALL}/etc cp ${PKG_DIR}/config/profile ${INSTALL}/etc @@ -190,8 +186,6 @@ post_install() { enable_service var.mount enable_service proc-sys-fs-binfmt_misc.mount - listcontains "${FIRMWARE}" "rpi-eeprom" && enable_service rpi-flash-firmware.service - # cron support if [ "$CRON_SUPPORT" = "yes" ] ; then mkdir -p ${INSTALL}/usr/lib/systemd/system diff --git a/packages/sysutils/busybox/scripts/fs-resize b/packages/sysutils/busybox/scripts/fs-resize index 4f3d941fba..aecd49faec 100755 --- a/packages/sysutils/busybox/scripts/fs-resize +++ b/packages/sysutils/busybox/scripts/fs-resize @@ -6,7 +6,7 @@ # Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) if [ -e /storage/.please_resize_me ] ; then - . /usr/lib/coreelec/functions + . /usr/lib/jelos/functions hidecursor diff --git a/packages/sysutils/busybox/scripts/init b/packages/sysutils/busybox/scripts/init index 45df97666a..2f607ae6eb 100755 --- a/packages/sysutils/busybox/scripts/init +++ b/packages/sysutils/busybox/scripts/init @@ -227,7 +227,7 @@ mount_folder() { mkdir -p /dev/bind_tmp mount_common "$target" "/dev/bind_tmp" "rw,noatime" - mount_common "/dev/bind_tmp/coreelec_$(basename $2)" "$2" "bind" + mount_common "/dev/bind_tmp/jelos_$(basename $2)" "$2" "bind" umount /dev/bind_tmp &>/dev/null [ "$2" = "/flash" ] && mount -o remount,ro /flash @@ -292,7 +292,7 @@ mount_sysroot() { get_project_arch() { if [ -f ${1}/etc/os-release ]; then . ${1}/etc/os-release - echo "${COREELEC_ARCH:-${LIBREELEC_ARCH}}" + echo "${OS_ARCH}" fi } @@ -1225,8 +1225,6 @@ elif [ -f /sysroot/storage/.cache/reset_oe -o -f /sysroot/storage/.cache/reset_x INIT_UNIT="--unit=factory-reset.target" elif [ -f "${BACKUP_FILE}" ]; then INIT_UNIT="--unit=backup-restore.target" -elif [ -f /sysroot/storage/.rpi_flash_firmware ]; then - INIT_UNIT="--unit=rpi-flash-firmware.target" fi # stop output redirection diff --git a/packages/sysutils/busybox/scripts/rpi-flash-firmware b/packages/sysutils/busybox/scripts/rpi-flash-firmware deleted file mode 100755 index d519209f80..0000000000 --- a/packages/sysutils/busybox/scripts/rpi-flash-firmware +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh - -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) - -FLAG_FILE="/storage/.rpi_flash_firmware" - -. /usr/lib/libreelec/functions - -hidecursor - -if [ -f "${FLAG_FILE}" ]; then - . ${FLAG_FILE} - rm -f "${FLAG_FILE}" - - if ! mount -o remount,rw /flash 2>/dev/null; then - echo "ERROR: Unable to mount /flash as a read/write file system." - echo - echo "Aborting Flash update process - please proceed with a manual update." - echo - - StartProgress countdown "Rebooting in 15s... " 15 "NOW" - reboot -f &>/dev/null - fi - - # Install new bootloader and/or USB3 firmware files to /flash - # Firmware flashing will occur during the next boot, after - # which the system will again reboot. - # Old firmware files will be automatically removed by init. - CMD_ARGS="" - [ "${BOOTLOADER}" = "yes" ] && CMD_ARGS="${CMD_ARGS} -A bootloader" - [ "${VL805}" = "yes" ] && CMD_ARGS="${CMD_ARGS} -A vl805" - - if [ -n "${CMD_ARGS}" ]; then - USE_FLASHROM=0 /usr/bin/.rpi-eeprom-update.real ${CMD_ARGS} - fi - - sync - mount -o remount,ro /flash -fi - -reboot -f &>/dev/null diff --git a/packages/sysutils/busybox/sleep.d.serial/99-suspend-modules.sh b/packages/sysutils/busybox/sleep.d.serial/99-suspend-modules.sh index 37545ee60a..9a81bcb140 100755 --- a/packages/sysutils/busybox/sleep.d.serial/99-suspend-modules.sh +++ b/packages/sysutils/busybox/sleep.d.serial/99-suspend-modules.sh @@ -51,7 +51,7 @@ modunload() _rmmod() { if modprobe -r "$1"; then - touch "/run/libreelec/suspend/module:$1" + touch "/run/jelos/suspend/module:$1" return 0 else logger -t suspend-modules "# could not unload '$1', usage count was $2" @@ -61,7 +61,7 @@ _rmmod() resume_modules() { - for x in /run/libreelec/suspend/module:* ; do + for x in /run/jelos/suspend/module:* ; do [ -O "${x}" ] || continue modprobe "${x##*:}" &>/dev/null && \ logger -t resume-modules "Reloaded module ${x##*:}." || \ @@ -73,8 +73,8 @@ suspend_modules() { [ -z "$SUSPEND_MODULES" ] && return 0 # clean up - rm -rf /run/libreelec/suspend - mkdir -p /run/libreelec/suspend + rm -rf /run/jelos/suspend + mkdir -p /run/jelos/suspend for x in $SUSPEND_MODULES ; do modunload $x && \ logger -t suspend-modules "Unloading kernel module $x: Done" || \ diff --git a/packages/sysutils/busybox/system.d/fs-resize.service b/packages/sysutils/busybox/system.d/fs-resize.service index 50d2026672..e33e5e20ac 100644 --- a/packages/sysutils/busybox/system.d/fs-resize.service +++ b/packages/sysutils/busybox/system.d/fs-resize.service @@ -4,7 +4,7 @@ DefaultDependencies=no [Service] Type=idle -ExecStart=/usr/lib/coreelec/fs-resize +ExecStart=/usr/lib/jelos/fs-resize StandardInput=tty-force StandardOutput=inherit StandardError=inherit diff --git a/packages/sysutils/busybox/system.d/rpi-flash-firmware.service b/packages/sysutils/busybox/system.d/rpi-flash-firmware.service deleted file mode 100644 index c05ea654d4..0000000000 --- a/packages/sysutils/busybox/system.d/rpi-flash-firmware.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=RPi Flash Firmware -Requires=tmp.mount var.mount sys-kernel-config.mount kernel-overlays.service -After=tmp.mount var.mount sys-kernel-config.mount kernel-overlays.service -DefaultDependencies=no - -[Service] -Type=idle -ExecStart=/usr/lib/libreelec/rpi-flash-firmware -StandardInput=tty-force -StandardOutput=inherit -StandardError=inherit diff --git a/packages/sysutils/busybox/system.d/rpi-flash-firmware.target b/packages/sysutils/busybox/system.d/rpi-flash-firmware.target deleted file mode 100644 index 98480bca45..0000000000 --- a/packages/sysutils/busybox/system.d/rpi-flash-firmware.target +++ /dev/null @@ -1,5 +0,0 @@ -[Unit] -Description=RPi Flash Firmware target -Requires=rpi-flash-firmware.service -After=rpi-flash-firmware.service -AllowIsolate=yes diff --git a/packages/sysutils/busybox/system.d/var-log.mount b/packages/sysutils/busybox/system.d/var-log.mount index 3acdd0a6de..8a4c3f2eef 100644 --- a/packages/sysutils/busybox/system.d/var-log.mount +++ b/packages/sysutils/busybox/system.d/var-log.mount @@ -5,7 +5,7 @@ Requires=storage-log.service After=storage-log.service ConditionKernelCommandLine=!installer ConditionKernelCommandLine=|debugging -ConditionPathExists=|/storage/.cache/debug.libreelec +ConditionPathExists=|/storage/.cache/debug.jelos [Mount] What=/storage/.cache/log diff --git a/packages/sysutils/open-vm-tools/package.mk b/packages/sysutils/open-vm-tools/package.mk deleted file mode 100644 index c640470438..0000000000 --- a/packages/sysutils/open-vm-tools/package.mk +++ /dev/null @@ -1,52 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2011 Anthony Nash (nash.ant@gmail.com) -# Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) -# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="open-vm-tools" -PKG_VERSION="12.3.5" -PKG_ARCH="x86_64" -PKG_LICENSE="GPL" -PKG_SITE="https://github.com/vmware/open-vm-tools" -PKG_URL="https://github.com/vmware/open-vm-tools/archive/stable-${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="toolchain fuse glib:host glib libdnet libtirpc" -PKG_LONGDESC="open-vm-tools: open source implementation of VMware Tools" -PKG_TOOLCHAIN="autotools" - -PKG_CONFIGURE_OPTS_TARGET="--disable-docs \ - --disable-tests \ - --disable-deploypkg \ - --without-pam \ - --without-gtk2 \ - --without-gtkmm \ - --without-ssl \ - --without-x \ - --without-xerces \ - --without-icu \ - --without-kernel-modules \ - --with-udev-rules-dir=/usr/lib/udev/rules.d/ \ - --with-sysroot=${SYSROOT_PREFIX}" - -post_unpack() { - mv ${PKG_BUILD}/${PKG_NAME}/* ${PKG_BUILD}/ - - sed -i -e 's|.*common-agent/etc/config/Makefile.*||' ${PKG_BUILD}/configure.ac - mkdir -p ${PKG_BUILD}/common-agent/etc/config -} - -pre_configure_target() { - export LIBS="-ldnet -ltirpc" -} - -post_makeinstall_target() { - rm -rf ${INSTALL}/sbin - rm -rf ${INSTALL}/usr/share - rm -rf ${INSTALL}/etc/vmware-tools/scripts/vmware/network - - find ${INSTALL}/etc/vmware-tools/ -type f | xargs sed -i '/.*expr.*/d' -} - -post_install() { - enable_service vmtoolsd.service - enable_service vmware-vmblock-fuse.service -} diff --git a/packages/sysutils/open-vm-tools/system.d/vmtoolsd.service b/packages/sysutils/open-vm-tools/system.d/vmtoolsd.service deleted file mode 100644 index 1b9924c1f9..0000000000 --- a/packages/sysutils/open-vm-tools/system.d/vmtoolsd.service +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Open Virtual Machine Tools (VMware Tools) -ConditionVirtualization=vmware - -[Service] -ExecStart=/usr/bin/vmtoolsd - -[Install] -WantedBy=multi-user.target diff --git a/packages/sysutils/open-vm-tools/system.d/vmware-vmblock-fuse.service b/packages/sysutils/open-vm-tools/system.d/vmware-vmblock-fuse.service deleted file mode 100644 index 9e4d2a3121..0000000000 --- a/packages/sysutils/open-vm-tools/system.d/vmware-vmblock-fuse.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=Open Virtual Machine Tools (vmware-vmblock-fuse) -ConditionVirtualization=vmware - -[Service] -Type=simple -RuntimeDirectory=vmblock-fuse -RuntimeDirectoryMode=755 -ExecStart=/usr/bin/vmware-vmblock-fuse -d -f -o subtype=vmware-vmblock,default_permissions,allow_other /run/vmblock-fuse - -[Install] -WantedBy=multi-user.target diff --git a/packages/sysutils/systemd/config/hosts.conf b/packages/sysutils/systemd/config/hosts.conf index cb9af3a7bd..3eb2e4e64c 100644 --- a/packages/sysutils/systemd/config/hosts.conf +++ b/packages/sysutils/systemd/config/hosts.conf @@ -4,7 +4,7 @@ # IP addresses # Format: -# Example: 192.168.0.3 libreelec libreelec.mynetwork +# Example: 192.168.0.3 jelos jelos.mynetwork 127.0.0.1 localhost.localdomain localhost diff --git a/packages/sysutils/systemd/package.mk b/packages/sysutils/systemd/package.mk index 5f34601830..dcaf97782a 100644 --- a/packages/sysutils/systemd/package.mk +++ b/packages/sysutils/systemd/package.mk @@ -218,8 +218,8 @@ post_makeinstall_target() { cp ${PKG_DIR}/scripts/systemd-timesyncd-setup ${INSTALL}/usr/sbin # /etc/resolv.conf and /etc/hosts must be writable - ln -sf /run/libreelec/resolv.conf ${INSTALL}/etc/resolv.conf - ln -sf /run/libreelec/hosts ${INSTALL}/etc/hosts + ln -sf /run/jelos/resolv.conf ${INSTALL}/etc/resolv.conf + ln -sf /run/jelos/hosts ${INSTALL}/etc/hosts # provide 'halt', 'shutdown', 'reboot' & co. ln -sf /usr/bin/systemctl ${INSTALL}/usr/sbin/halt diff --git a/packages/sysutils/systemd/scripts/network-base-setup b/packages/sysutils/systemd/scripts/network-base-setup index c67965e42d..6a53dc8750 100755 --- a/packages/sysutils/systemd/scripts/network-base-setup +++ b/packages/sysutils/systemd/scripts/network-base-setup @@ -9,19 +9,19 @@ hostnamectl --transient hostname ${HOSTNAME} avahi-set-host-name ${HOSTNAME} # setup /etc/hosts -rm -f /run/libreelec/hosts +rm -f /run/jelos/hosts if [ -f /storage/.config/hosts.conf ]; then - cat /storage/.config/hosts.conf > /run/libreelec/hosts + cat /storage/.config/hosts.conf > /run/jelos/hosts fi # setup /etc/resolv.conf -rm -f /run/libreelec/resolv.conf +rm -f /run/jelos/resolv.conf if [ -f /storage/.config/resolv.conf ]; then - cat /storage/.config/resolv.conf > /run/libreelec/resolv.conf + cat /storage/.config/resolv.conf > /run/jelos/resolv.conf elif [ -f /dev/.kernel_ipconfig -a -f /proc/net/pnp ]; then - cat /proc/net/pnp > /run/libreelec/resolv.conf + cat /proc/net/pnp > /run/jelos/resolv.conf else - cat << EOF > /run/libreelec/resolv.conf + cat << EOF > /run/jelos/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4 EOF diff --git a/packages/sysutils/systemd/system.d/debugconfig.service b/packages/sysutils/systemd/system.d/debugconfig.service index 4261d0cf44..6525290343 100644 --- a/packages/sysutils/systemd/system.d/debugconfig.service +++ b/packages/sysutils/systemd/system.d/debugconfig.service @@ -3,11 +3,11 @@ Description=Setup debug config DefaultDependencies=no After=systemd-tmpfiles-setup.service ConditionKernelCommandLine=|debugging -ConditionPathExists=|/storage/.cache/debug.libreelec +ConditionPathExists=|/storage/.cache/debug.jelos [Service] Type=oneshot -ExecStart=/bin/sh -c 'cp /usr/share/debugconf/*.conf /run/libreelec/debug' +ExecStart=/bin/sh -c 'cp /usr/share/debugconf/*.conf /run/jelos/debug' RemainAfterExit=yes [Install] diff --git a/packages/sysutils/systemd/tmpfiles.d/z_01_openelec.conf b/packages/sysutils/systemd/tmpfiles.d/z_01_jelos.conf similarity index 54% rename from packages/sysutils/systemd/tmpfiles.d/z_01_openelec.conf rename to packages/sysutils/systemd/tmpfiles.d/z_01_jelos.conf index 07d11f550b..992c7586df 100644 --- a/packages/sysutils/systemd/tmpfiles.d/z_01_openelec.conf +++ b/packages/sysutils/systemd/tmpfiles.d/z_01_jelos.conf @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) -d /run/libreelec 0755 root root - - -d /run/libreelec/debug 0755 root root - - +d /run/jelos 0755 root root - - +d /run/jelos/debug 0755 root root - - diff --git a/packages/sysutils/util-linux/package.mk b/packages/sysutils/util-linux/package.mk index 751f4cab3b..5ee25127d4 100644 --- a/packages/sysutils/util-linux/package.mk +++ b/packages/sysutils/util-linux/package.mk @@ -81,8 +81,8 @@ fi post_makeinstall_target() { if [ "${SWAP_SUPPORT}" = "yes" ]; then - mkdir -p ${INSTALL}/usr/lib/libreelec - cp -PR ${PKG_DIR}/scripts/mount-swap ${INSTALL}/usr/lib/libreelec + mkdir -p ${INSTALL}/usr/lib/jelos + cp -PR ${PKG_DIR}/scripts/mount-swap ${INSTALL}/usr/lib/jelos mkdir -p ${INSTALL}/etc cat ${PKG_DIR}/config/swap.conf | \ diff --git a/packages/sysutils/util-linux/system.d/swap.service b/packages/sysutils/util-linux/system.d/swap.service index 4bf0f8fb0b..a5bf1b2a70 100644 --- a/packages/sysutils/util-linux/system.d/swap.service +++ b/packages/sysutils/util-linux/system.d/swap.service @@ -13,8 +13,8 @@ ConditionKernelCommandLine=!installer [Service] Environment=HOME=/storage Type=oneshot -ExecStartPre=/usr/lib/libreelec/mount-swap create -ExecStart=/usr/lib/libreelec/mount-swap mount +ExecStartPre=/usr/lib/jelos/mount-swap create +ExecStart=/usr/lib/jelos/mount-swap mount RemainAfterExit=yes [Install] diff --git a/packages/sysutils/v4l-utils/package.mk b/packages/sysutils/v4l-utils/package.mk index 351ec5e99d..2ff2747c50 100644 --- a/packages/sysutils/v4l-utils/package.mk +++ b/packages/sysutils/v4l-utils/package.mk @@ -86,22 +86,22 @@ post_makeinstall_target() { # create multi keymap to support several remotes OOTB if [ -n "$IR_REMOTE_PROTOCOLS" -a -n "$IR_REMOTE_KEYMAPS" ]; then - create_multi_keymap libreelec_multi "$IR_REMOTE_PROTOCOLS" $IR_REMOTE_KEYMAPS + create_multi_keymap jelos_multi "$IR_REMOTE_PROTOCOLS" $IR_REMOTE_KEYMAPS # use multi-keymap instead of default one sed -i '/^\*\s*rc-rc6-mce\s*rc6_mce/d' ${INSTALL}/etc/rc_maps.cfg cat << EOF >> ${INSTALL}/etc/rc_maps.cfg # -# Custom LibreELEC configuration starts here +# Custom JELOS configuration starts here # # use combined multi-table on MCE receivers # * rc-rc6-mce rc6_mce -* rc-rc6-mce libreelec_multi +* rc-rc6-mce jelos_multi # table for Xbox DVD Playback Kit * rc-xbox-dvd xbox_dvd # multi-table for amlogic devices -meson-ir * libreelec_multi +meson-ir * jelos_multi EOF fi diff --git a/packages/tools/installer/config/installer.gptk b/packages/tools/installer/config/installer.gptk new file mode 100644 index 0000000000..b6095deb97 --- /dev/null +++ b/packages/tools/installer/config/installer.gptk @@ -0,0 +1,24 @@ +back = esc +start = enter +a = enter +b = esc +x = \\ +y = \\ +l1 = \\ +l2 = \\ +l3 = \\ +r1 = \\ +r2 = \\ +r3 = \\ +up = up +down = down +left = left +right = right +left_analog_up = up +left_analog_down = down +left_analog_left = left +left_analog_right = right +right_analog_up = \\ +right_analog_down = \\ +right_analog_left = \\ +right_analog_right = \\ diff --git a/packages/tools/installer/package.mk b/packages/tools/installer/package.mk index c33630564a..5b4b74a104 100644 --- a/packages/tools/installer/package.mk +++ b/packages/tools/installer/package.mk @@ -4,10 +4,10 @@ PKG_NAME="installer" PKG_VERSION="1" PKG_LICENSE="GPL" -PKG_SITE="http://libreelec.tv/" +PKG_SITE="https://jelos.org" PKG_URL="" PKG_DEPENDS_TARGET="toolchain busybox newt parted e2fsprogs syslinux grub" -PKG_LONGDESC="LibreELEC.tv Install manager to install the system on any disk" +PKG_LONGDESC="JELOS Install manager to install the system on any disk" PKG_TOOLCHAIN="manual" post_install() { @@ -18,8 +18,7 @@ post_install() { -i ${INSTALL}/usr/bin/installer mkdir -p ${INSTALL}/etc - find_file_path config/installer.conf - cp ${FOUND_PATH} ${INSTALL}/etc + cp ${PKG_DIR}/config/* ${INSTALL}/etc sed -e "s/@SYSTEM_SIZE@/${SYSTEM_SIZE}/g" \ -e "s/@SYSTEM_PART_START@/${SYSTEM_PART_START}/g" \ -e "s/@SYSLINUX_PARAMETERS@/${SYSLINUX_PARAMETERS}/g" \ diff --git a/packages/tools/installer/scripts/installer b/packages/tools/installer/scripts/installer index 901e9f3ffd..c772a0d71f 100755 --- a/packages/tools/installer/scripts/installer +++ b/packages/tools/installer/scripts/installer @@ -35,6 +35,16 @@ trap '' 2 # Bring in OS variables. . /etc/os-release +# Initialize controller input +/usr/bin/control-gen_init.sh +source /storage/.config/gptokeyb/control.ini +get_controls + +if [ -f "/etc/installer.gptk" ] +then + cp /etc/installer.gptk /storage/.config/gptokeyb/installer.gptk + ${GPTOKEYB} "installer" -c "/storage/.config/gptokeyb/installer.gptk" & +fi dbglg() { # Acts just like echo cmd, with automatic redirection @@ -568,5 +578,7 @@ while true; do menu_main done +kill -9 $(pidof gptokeyb) 2>/dev/null + # exit cleanly exit 0 diff --git a/packages/tools/installer/system.d/installer.target b/packages/tools/installer/system.d/installer.target index cd1cb7f7f2..880356cdb3 100644 --- a/packages/tools/installer/system.d/installer.target +++ b/packages/tools/installer/system.d/installer.target @@ -1,5 +1,5 @@ [Unit] -Description=OpenELEC installer +Description=JELOS installer Requires=basic.target After=basic.target Conflicts=rescue.target multi-user.target graphical.target diff --git a/packages/tools/pugixml/package.mk b/packages/tools/pugixml/package.mk index 25424aa6d5..f6e0ae9411 100644 --- a/packages/tools/pugixml/package.mk +++ b/packages/tools/pugixml/package.mk @@ -2,10 +2,10 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pugixml" -PKG_VERSION="1.14" +PKG_VERSION="b2b466403084667c90a0f0cc4e960405cfc8117a" PKG_LICENSE="MIT" PKG_SITE="https://pugixml.org/" -PKG_URL="https://github.com/zeux/pugixml/archive/v${PKG_VERSION}.tar.gz" +PKG_URL="https://github.com/zeux/pugixml.git" PKG_DEPENDS_HOST="toolchain:host" PKG_DEPENDS_TARGET="toolchain" PKG_LONGDESC="Light-weight, simple and fast XML parser for C++ with XPath support." diff --git a/packages/tools/python-evdev/package.mk b/packages/tools/python-evdev/package.mk index 22a7af34c3..b0e5f77998 100644 --- a/packages/tools/python-evdev/package.mk +++ b/packages/tools/python-evdev/package.mk @@ -33,6 +33,6 @@ makeinstall_target() { post_makeinstall_target() { for so in _ecodes _input _uinput do - mv ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/${so}.cpython-311-x86_64-linux-gnu.so ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/${so}.cpython-311-aarch64-linux-gnu.so + mv ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/${so}.cpython-311-x86_64-jelos-linux-gnu.so ${INSTALL}/usr/lib/${PKG_PYTHON_VERSION}/site-packages/evdev/${so}.cpython-311-aarch64-jelos-linux-gnu.so done } diff --git a/packages/tools/rkbin/package.mk b/packages/tools/rkbin/package.mk index 61ee82bcf9..d1065f4912 100644 --- a/packages/tools/rkbin/package.mk +++ b/packages/tools/rkbin/package.mk @@ -9,5 +9,5 @@ PKG_LONGDESC="rkbin: Rockchip Firmware and Tool Binaries" PKG_TOOLCHAIN="manual" PKG_PATCH_DIRS+="${DEVICE}*" -PKG_VERSION="3aafb4dd13a750ab226604875d7938284d4ee9f1" +PKG_VERSION="5257e54cc6c15fef28c3b73bd95ca1b55cc8c8cd" PKG_URL="${PKG_SITE}.git" diff --git a/packages/tools/sound/libvorbisidec/package.mk b/packages/tools/sound/libvorbisidec/package.mk index a3ab12bbfd..d4e5aac785 100644 --- a/packages/tools/sound/libvorbisidec/package.mk +++ b/packages/tools/sound/libvorbisidec/package.mk @@ -14,7 +14,7 @@ PKG_TOOLCHAIN="make" make_target() { cd ${PKG_BUILD} -./autogen.sh HAVE_OGG=no --disable-mmx --prefix=/usr --datadir=/usr/share/ --datarootdir=/usr/share/ --host=armv8a-libreelec-linux --enable-fb --enable-freetype --with-freetype-prefix=${SYSROOT_PREFIX}/usr/ --enable-slang +./autogen.sh HAVE_OGG=no --disable-mmx --prefix=/usr --datadir=/usr/share/ --datarootdir=/usr/share/ --host=armv8a-linux --enable-fb --enable-freetype --with-freetype-prefix=${SYSROOT_PREFIX}/usr/ --enable-slang make } diff --git a/packages/ui/emulationstation/config/common/es_input.cfg b/packages/ui/emulationstation/config/common/es_input.cfg index 0e55098f0e..e9b381f0da 100644 --- a/packages/ui/emulationstation/config/common/es_input.cfg +++ b/packages/ui/emulationstation/config/common/es_input.cfg @@ -1321,6 +1321,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/ui/emulationstation/package.mk b/packages/ui/emulationstation/package.mk index 05b96747e0..93c78efbe1 100644 --- a/packages/ui/emulationstation/package.mk +++ b/packages/ui/emulationstation/package.mk @@ -3,7 +3,7 @@ # Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="emulationstation" -PKG_VERSION="b298647ee7988cf2a34fedd4442f357f63c66597" +PKG_VERSION="b690d7c772615f30a69bf52777efe80d269c0df3" PKG_GIT_CLONE_BRANCH="main" PKG_REV="1" PKG_ARCH="any" @@ -33,7 +33,12 @@ else PKG_CMAKE_OPTS_TARGET+=" -DENABLE_UPDATES=0" fi -PKG_CMAKE_OPTS_TARGET+=" -DENABLE_EMUELEC=1 -DDISABLE_KODI=1 -DENABLE_FILEMANAGER=0 -DCEC=0 -DENABLE_PULSE=1" +PKG_CMAKE_OPTS_TARGET+=" -DENABLE_EMUELEC=1 \ + -DDISABLE_KODI=1 \ + -DENABLE_FILEMANAGER=0 \ + -DCEC=0 \ + -DENABLE_PULSE=1 \ + -DUSE_SYSTEM_PUGIXML=1" ########################################################################################################## # The following allows building Emulation station from local copy by using EMULATIONSTATION_SRC. diff --git a/packages/virtual/arm/package.mk b/packages/virtual/arm/package.mk index 0521b2a028..ccac0a66cb 100644 --- a/packages/virtual/arm/package.mk +++ b/packages/virtual/arm/package.mk @@ -3,7 +3,7 @@ PKG_NAME="arm" PKG_LICENSE="GPLv2" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_DEPENDS_TARGET="toolchain squashfs-tools:host dosfstools:host fakeroot:host kmod:host mtools:host populatefs:host libc gcc linux linux-drivers linux-firmware libusb unzip socat p7zip file SDL2 SDL2_gfx SDL2_image SDL2_mixer SDL2_net SDL2_ttf" PKG_SECTION="virtual" PKG_LONGDESC="Root package used to build and create 32-bit userland" diff --git a/packages/virtual/docker/package.mk b/packages/virtual/docker/package.mk index 380d5c06c5..93e1b0b9b8 100644 --- a/packages/virtual/docker/package.mk +++ b/packages/virtual/docker/package.mk @@ -3,7 +3,7 @@ PKG_NAME="docker" PKG_LICENSE="GPLv2" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_SECTION="virtual" PKG_LONGDESC="Container support software metapackage." diff --git a/packages/virtual/emulators/package.mk b/packages/virtual/emulators/package.mk index d1bbf4681a..1db7927dbe 100644 --- a/packages/virtual/emulators/package.mk +++ b/packages/virtual/emulators/package.mk @@ -3,7 +3,7 @@ PKG_NAME="emulators" PKG_LICENSE="GPLv2" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_SECTION="emulation" # Do not change to virtual or makeinstall_target will not execute. PKG_LONGDESC="Emulation metapackage." PKG_TOOLCHAIN="manual" diff --git a/packages/virtual/es-themes/package.mk b/packages/virtual/es-themes/package.mk index e15b06c6c4..645be76b87 100644 --- a/packages/virtual/es-themes/package.mk +++ b/packages/virtual/es-themes/package.mk @@ -3,7 +3,7 @@ PKG_NAME="es-themes" PKG_LICENSE="GPLv2" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_DEPENDS_TARGET="es-theme-art-book-next" PKG_SECTION="virtual" PKG_LONGDESC="EmulationStation themes package." diff --git a/packages/virtual/gamesupport/package.mk b/packages/virtual/gamesupport/package.mk index 02c6822a8d..d783965958 100644 --- a/packages/virtual/gamesupport/package.mk +++ b/packages/virtual/gamesupport/package.mk @@ -3,11 +3,11 @@ PKG_NAME="gamesupport" PKG_LICENSE="GPLv2" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_SECTION="virtual" PKG_LONGDESC="Game support software metapackage." -PKG_GAMESUPPORT="sixaxis gptokeyb jstest-sdl gamecontrollerdb sdljoytest control-gen" +PKG_GAMESUPPORT="sixaxis gptokeyb jstest-sdl gamecontrollerdb sdljoytest control-gen virtualgamepad" PKG_DEPENDS_TARGET="${PKG_GAMESUPPORT}" diff --git a/packages/virtual/image/package.mk b/packages/virtual/image/package.mk index 8be4d05eee..420fbbbc96 100644 --- a/packages/virtual/image/package.mk +++ b/packages/virtual/image/package.mk @@ -58,7 +58,7 @@ fi # Add support for containers [ "${CONTAINER_SUPPORT}" = "yes" ] && PKG_DEPENDS_TARGET+=" ${PKG_TOOLS} docker" -[ "${DEBUG_SUPPORT}" = "yes" ] && PKG_DEPENDS_TARGET+=" ${PKG_DEBUG}" +[ "${DEBUG_PACKAGES}" = "yes" ] && PKG_DEPENDS_TARGET+=" ${PKG_DEBUG}" # 32Bit package support [ "${ENABLE_32BIT}" == true ] && PKG_DEPENDS_TARGET+=" lib32" @@ -75,9 +75,6 @@ fi # NTFS 3G support [ "${NTFS3G}" = "yes" ] && PKG_DEPENDS_TARGET+=" ntfs-3g_ntfsprogs" -# Virtual image creation support -[ "${PROJECT}" = "Generic" ] && PKG_DEPENDS_TARGET+=" virtual" - # Installer support [ "${INSTALLER_SUPPORT}" = "yes" ] && PKG_DEPENDS_TARGET+=" installer" diff --git a/packages/virtual/misc-packages/package.mk b/packages/virtual/misc-packages/package.mk index 584f885471..eb3c6c77fd 100644 --- a/packages/virtual/misc-packages/package.mk +++ b/packages/virtual/misc-packages/package.mk @@ -6,7 +6,7 @@ PKG_NAME="misc-packages" PKG_VERSION="" PKG_LICENSE="GPL" -PKG_SITE="https://www.jelos.org" +PKG_SITE="https://jelos.org" PKG_URL="" PKG_SECTION="virtual" PKG_LONGDESC="misc-packages: Metapackage for miscellaneous packages" diff --git a/packages/virtual/synctools/package.mk b/packages/virtual/synctools/package.mk index 19d8903127..9f4709fb2b 100644 --- a/packages/virtual/synctools/package.mk +++ b/packages/virtual/synctools/package.mk @@ -3,7 +3,7 @@ PKG_NAME="synctools" PKG_LICENSE="GPLv2" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_SECTION="virtual" PKG_LONGDESC="Cloud/local sync tools metapackage." diff --git a/packages/virtual/toolchain/package.mk b/packages/virtual/toolchain/package.mk index 08a47d7d2d..a91ab6932a 100644 --- a/packages/virtual/toolchain/package.mk +++ b/packages/virtual/toolchain/package.mk @@ -5,9 +5,9 @@ PKG_NAME="toolchain" PKG_VERSION="" PKG_LICENSE="GPL" -PKG_SITE="https://libreelec.tv" +PKG_SITE="https://jelos.org" PKG_URL="" -PKG_DEPENDS_HOST="autoconf:host autoconf-archive:host automake:host bison:host configtools:host cmake:host flex:host intltool:host libtool:host ninja:host make:host meson:host p7zip:host pigz:host sed:host xmlstarlet:host xz:host nettle:host rdfind:host" +PKG_DEPENDS_HOST="autoconf:host autoconf-archive:host automake:host bison:host configtools:host cmake:host flex:host intltool:host libtool:host ninja:host make:host meson:host p7zip:host pigz:host sed:host xmlstarlet:host xz:host" PKG_DEPENDS_TARGET="toolchain:host gcc:host" PKG_SECTION="virtual" -PKG_LONGDESC="LibreELEC.tv' toolchain to compile all packages" +PKG_LONGDESC="JELOS toolchain to compile all packages" diff --git a/packages/virtual/virtual/package.mk b/packages/virtual/virtual/package.mk deleted file mode 100644 index a6cfaef8d2..0000000000 --- a/packages/virtual/virtual/package.mk +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="virtual" -PKG_VERSION="" -PKG_LICENSE="GPL" -PKG_SITE="http://www.libreelec.tv" -PKG_URL="" -PKG_DEPENDS_TARGET="qemu:host" -PKG_SECTION="virtual" -PKG_LONGDESC="virtual is a Meta package to install Virtual project extra dependencies" - -get_graphicdrivers - -listcontains "$GRAPHIC_DRIVERS" "vmware" && PKG_DEPENDS_TARGET+=" open-vm-tools" || true diff --git a/packages/virtual/x86/package.mk b/packages/virtual/x86/package.mk index d0e7ab7b1c..b879c369b8 100644 --- a/packages/virtual/x86/package.mk +++ b/packages/virtual/x86/package.mk @@ -3,7 +3,7 @@ PKG_NAME="x86" PKG_LICENSE="GPLv2" -PKG_SITE="www.jelos.org" +PKG_SITE="https://jelos.org" PKG_DEPENDS_TARGET="toolchain squashfs-tools:host dosfstools:host fakeroot:host kmod:host mtools:host populatefs:host libc gcc linux linux-drivers linux-firmware libusb unzip socat p7zip file SDL2 SDL2_gfx SDL2_image SDL2_mixer SDL2_net SDL2_ttf" PKG_SECTION="virtual" PKG_LONGDESC="Root package used to build and create 32-bit userland" diff --git a/packages/wayland/compositor/sway/config/config b/packages/wayland/compositor/sway/config/config index e6495a75cf..01f7f9c8b9 100644 --- a/packages/wayland/compositor/sway/config/config +++ b/packages/wayland/compositor/sway/config/config @@ -24,7 +24,7 @@ set $menu bemenu-run -p "#" -l 10 --scrollbar autohide -i -w --tf "$prompt" --hf ### Output configuration # # Default wallpaper (more resolutions are available in /usr/share/sway/) -output * bg /usr/share/sway/libreelec-wallpaper-2160.png fill +output * bg /usr/share/sway/jelos-wallpaper-2160.png fill # hide_cursor hides the cursor image after the specified timeout (in milliseconds) has elapsed with no activity on that cursor seat * hide_cursor 3000 diff --git a/packages/wayland/weston-kiosk-shell-dpms/package.mk b/packages/wayland/weston-kiosk-shell-dpms/package.mk index 3edb0d5be3..97c159a1e9 100644 --- a/packages/wayland/weston-kiosk-shell-dpms/package.mk +++ b/packages/wayland/weston-kiosk-shell-dpms/package.mk @@ -6,9 +6,17 @@ PKG_VERSION="dccd7db3905464bb0c00b65ee554b0fd2e3ba7b6" PKG_LICENSE="MIT" PKG_SITE="https://github.com/akhilharihar/Weston-kiosk-shell-DPMS" PKG_URL="${PKG_SITE}.git" -PKG_DEPENDS_TARGET="toolchain weston" +PKG_DEPENDS_TARGET="toolchain ${WINDOWMANAGER}" PKG_LONGDESC="A dpms module for Weston's kiosk shell." +pre_configure_target() { + case ${WINDOWMANAGER} in + weston11) + sed -i 's~libweston_version =.*$~libweston_version = 11~g' ${PKG_BUILD}/meson.build + ;; + esac +} + post_makeinstall_target() { mkdir -p ${INSTALL}/usr/bin cp ${PKG_BUILD}/.${TARGET_NAME}/dpms-client ${INSTALL}/usr/bin diff --git a/packages/wayland/weston-kiosk-shell-dpms/patches/001-fix-build.patch b/packages/wayland/weston-kiosk-shell-dpms/patches/001-fix-build.patch index afc0c1bdf9..65bf6b75be 100644 --- a/packages/wayland/weston-kiosk-shell-dpms/patches/001-fix-build.patch +++ b/packages/wayland/weston-kiosk-shell-dpms/patches/001-fix-build.patch @@ -7,7 +7,7 @@ index f1fb908..6ea815e 100644 endif -libweston_version = 10 -+libweston_version = 12 ++libweston_version = 13 dir_prefix = get_option('prefix') dir_lib = dir_prefix / get_option('libdir') dir_module_weston = dir_lib / 'weston' diff --git a/packages/wayland/weston/package.mk b/packages/wayland/weston/package.mk index a6f4778b2a..8352a9aba5 100644 --- a/packages/wayland/weston/package.mk +++ b/packages/wayland/weston/package.mk @@ -2,12 +2,11 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="weston" -PKG_VERSION="12.0.3" +PKG_VERSION="13.0.0" PKG_LICENSE="MIT" PKG_SITE="https://wayland.freedesktop.org/" PKG_URL="https://gitlab.freedesktop.org/wayland/weston/-/archive/${PKG_VERSION}/${PKG_NAME}-${PKG_VERSION}.tar.gz" -#PKG_URL="https://gitlab.freedesktop.org/wayland/weston.git" PKG_DEPENDS_TARGET="toolchain wayland wayland-protocols libdrm libxkbcommon libxcb-cursor libinput cairo pango libjpeg-turbo dbus seatd glu ${OPENGL} libX11 xwayland libXcursor xkbcomp setxkbmap cairo xterm libwebp" PKG_LONGDESC="Reference implementation of a Wayland compositor" PKG_PATCH_DIRS+="${DEVICE}" @@ -39,7 +38,6 @@ PKG_MESON_OPTS_TARGET+=" -Dbackend-drm=true \ -Dshell-kiosk=true \ -Ddesktop-shell-client-default="weston-desktop-shell" \ -Dcolor-management-lcms=false \ - -Dlauncher-libseat=true \ -Dimage-jpeg=true \ -Dimage-webp=true \ -Dtools=['terminal','debug','info'] diff --git a/packages/wayland/weston/patches/002-weston-image.patch b/packages/wayland/weston/patches/002-weston-image.patch index 39af379040..d9f3253f93 100644 --- a/packages/wayland/weston/patches/002-weston-image.patch +++ b/packages/wayland/weston/patches/002-weston-image.patch @@ -1,21 +1,19 @@ -diff --git a/clients/image.c b/clients/image.c -index 63a5cefb..eedbefa2 100644 ---- a/clients/image.c -+++ b/clients/image.c -@@ -402,7 +402,7 @@ image_create(struct display *display, const char *filename, +diff -rupN weston.orig/clients/image.c weston/clients/image.c +--- weston.orig/clients/image.c 2024-02-05 14:42:51.052285175 +0000 ++++ weston/clients/image.c 2024-02-05 14:44:09.510805841 +0000 +@@ -402,7 +402,7 @@ image_create(struct display *display, co widget_set_button_handler(image->widget, button_handler); widget_set_axis_handler(image->widget, axis_handler); window_set_key_handler(image->window, key_handler); - widget_schedule_resize(image->widget, 500, 400); -+ widget_schedule_resize(image->widget, 480, 320); ++ widget_schedule_resize(image->widget, 380, 320); return image; } -diff --git a/clients/meson.build b/clients/meson.build -index 2fe10956..38000b41 100644 ---- a/clients/meson.build -+++ b/clients/meson.build -@@ -267,77 +267,7 @@ foreach t : tools_list +diff -rupN weston.orig/clients/meson.build weston/clients/meson.build +--- weston.orig/clients/meson.build 2024-02-05 14:42:51.052285175 +0000 ++++ weston/clients/meson.build 2024-02-05 14:47:27.792730710 +0000 +@@ -270,83 +270,7 @@ foreach t : tools_list endforeach demo_clients = [ @@ -24,7 +22,13 @@ index 2fe10956..38000b41 100644 - 'basename': 'cliptest', - 'dep_objs': [ dep_vertex_clipping, dep_matrix_c ] - }, -- { 'basename': 'confine' }, +- { +- 'basename': 'constraints', +- 'add_sources': [ +- xdg_shell_client_protocol_h, +- xdg_shell_protocol_c, +- ], +- }, - { - 'basename': 'content_protection', - 'add_sources': [ diff --git a/packages/web/curl/package.mk b/packages/web/curl/package.mk index 2f0090b7a8..d3a0174fda 100644 --- a/packages/web/curl/package.mk +++ b/packages/web/curl/package.mk @@ -62,7 +62,7 @@ PKG_CONFIGURE_OPTS_TARGET="ac_cv_lib_rtmp_RTMP_Init=yes \ --with-ssl \ --without-mbedtls \ --without-nss \ - --with-ca-bundle=/run/libreelec/cacert.pem \ + --with-ca-bundle=/run/jelos/cacert.pem \ --without-ca-path \ --without-libpsl \ --without-libssh2 \ diff --git a/packages/x11/driver/xf86-video-vmware/package.mk b/packages/x11/driver/xf86-video-vmware/package.mk deleted file mode 100644 index 2d22d79fb4..0000000000 --- a/packages/x11/driver/xf86-video-vmware/package.mk +++ /dev/null @@ -1,21 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) -# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="xf86-video-vmware" -PKG_VERSION="13.4.0" -PKG_SHA256="aed31ee5ed5ecc6e2226705383e7ad06f7602c1376a295305f376b17af3eb81a" -PKG_ARCH="x86_64" -PKG_LICENSE="OSS" -PKG_SITE="https://www.vmware.com" -PKG_URL="https://xorg.freedesktop.org/releases/individual/driver/${PKG_NAME}-${PKG_VERSION}.tar.xz" -PKG_DEPENDS_TARGET="toolchain mesa libX11 xwayland" -PKG_LONGDESC="xf86-video-vmware: The Xorg driver for vmware video" -PKG_TOOLCHAIN="autotools" - -PKG_CONFIGURE_OPTS_TARGET="--enable-vmwarectrl-client \ - --with-xorg-module-dir=${XORG_PATH_MODULES}" - -post_configure_target() { - libtool_remove_rpath libtool -} diff --git a/packages/x11/util/xorg-launch-helper/scripts/xorg-launch b/packages/x11/util/xorg-launch-helper/scripts/xorg-launch index 9e6c719783..79f36b8358 100755 --- a/packages/x11/util/xorg-launch-helper/scripts/xorg-launch +++ b/packages/x11/util/xorg-launch-helper/scripts/xorg-launch @@ -5,7 +5,7 @@ # wait for xorg-configure@.service # max 10 seconds -ARGS_FILE="/run/libreelec/xorg-settings.conf" +ARGS_FILE="/run/jelos/xorg-settings.conf" for i in $(seq 1 40) ; do if [ -e "$ARGS_FILE" ] ; then break @@ -14,7 +14,7 @@ for i in $(seq 1 40) ; do done if [ -e "$ARGS_FILE" ] ; then - . /run/libreelec/xorg-settings.conf + . /run/jelos/xorg-settings.conf exec xorg-launch-helper $@ $XORG_ARGS else echo "" > /dev/tty1 diff --git a/packages/x11/xserver/xwayland/package.mk b/packages/x11/xserver/xwayland/package.mk index 266780e0fa..2b91e42339 100644 --- a/packages/x11/xserver/xwayland/package.mk +++ b/packages/x11/xserver/xwayland/package.mk @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) -# Copyright (C) 2023-present JELOS (https://github.com/JustEnoughLinuxOS/distribution) +# Copyright (C) 2023-present JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="xwayland" PKG_VERSION="7439e9c6c59219335fe35629a90f4fdd49912bcf" @@ -25,9 +25,9 @@ PKG_MESON_OPTS_TARGET+=" -Dxvfb=false \ -Dinput_thread=true \ -Dxkb_dir=${XORG_PATH_XKB} \ -Dxkb_output_dir="/var/cache/xkb" \ - -Dvendor_name="LibreELEC" \ - -Dvendor_name_short="LE" \ - -Dvendor_web="https://libreelec.tv/" \ + -Dvendor_name="JELOS" \ + -Dvendor_name_short="JELOS" \ + -Dvendor_web="https://jelos.org" \ -Dlisten_tcp=false \ -Dlisten_unix=true \ -Dlisten_local=false \ diff --git a/packages/x11/xserver/xwayland/scripts/xorg-configure b/packages/x11/xserver/xwayland/scripts/xorg-configure index a7e9a97c35..d9d7f48050 100755 --- a/packages/x11/xserver/xwayland/scripts/xorg-configure +++ b/packages/x11/xserver/xwayland/scripts/xorg-configure @@ -105,6 +105,6 @@ logger -t Xorg "### creating needed directories and symlinks ###" ################################################################################ logger -t Xorg "### starting Xorg with '${DISPLAY} vt01 ${XORG_ARGS}' ###" - mkdir -p /run/libreelec - echo "XORG_ARGS=\"${XORG_ARGS}\"" > /run/libreelec/xorg-settings.conf + mkdir -p /run/jelos + echo "XORG_ARGS=\"${XORG_ARGS}\"" > /run/jelos/xorg-settings.conf diff --git a/packages/x11/xserver/xwayland/system.d/xorg.service b/packages/x11/xserver/xwayland/system.d/xorg.service index a9dbde6893..78e276669c 100644 --- a/packages/x11/xserver/xwayland/system.d/xorg.service +++ b/packages/x11/xserver/xwayland/system.d/xorg.service @@ -6,7 +6,7 @@ ConditionKernelCommandLine=!installer [Service] Type=notify -EnvironmentFile=-/run/libreelec/debug/xorg.conf +EnvironmentFile=-/run/jelos/debug/xorg.conf ExecStart=/usr/bin/xorg-launch -nolisten tcp vt01 $XORG_DEBUG Restart=always RestartSec=2 diff --git a/projects/Amlogic/devices/S922X/linux/linux.aarch64.conf b/projects/Amlogic/devices/S922X/linux/linux.aarch64.conf index 0720aa2295..467ee2dddc 100644 --- a/projects/Amlogic/devices/S922X/linux/linux.aarch64.conf +++ b/projects/Amlogic/devices/S922X/linux/linux.aarch64.conf @@ -1,8 +1,8 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 6.6.15 Kernel Configuration +# Linux/arm64 6.7.4 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-libreelec-linux-gnueabi-gcc-12.3.1 (GCC) 12.3.1 20240103" +CONFIG_CC_VERSION_TEXT="aarch64-linux-gnueabi-gcc-12.3.1 (GCC) 12.3.1 20240103" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120301 CONFIG_CLANG_VERSION=0 @@ -321,6 +321,7 @@ CONFIG_ARCH_MESON=y # CONFIG_ARCH_NXP is not set # CONFIG_ARCH_MA35 is not set # CONFIG_ARCH_NPCM is not set +# CONFIG_ARCH_PENSANDO is not set # CONFIG_ARCH_QCOM is not set # CONFIG_ARCH_REALTEK is not set # CONFIG_ARCH_RENESAS is not set @@ -870,6 +871,7 @@ CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y +CONFIG_PCP_BATCH_SCALE_MAX=5 CONFIG_PHYS_ADDR_T_64BIT=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 @@ -995,6 +997,7 @@ CONFIG_TCP_CONG_CDG=m CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_AO is not set # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=y # CONFIG_IPV6_ROUTER_PREF is not set @@ -1405,7 +1408,6 @@ CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" CONFIG_MAC80211_MESH=y CONFIG_MAC80211_LEDS=y -# CONFIG_MAC80211_DEBUGFS is not set # CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 @@ -1558,7 +1560,6 @@ CONFIG_GENERIC_ARCH_TOPOLOGY=y # # Bus devices # -# CONFIG_BRCMSTB_GISB_ARB is not set # CONFIG_MOXTET is not set # CONFIG_VEXPRESS_CONFIG is not set # CONFIG_MHI_BUS is not set @@ -1591,6 +1592,12 @@ CONFIG_ARM_SCPI_POWER_DOMAIN=y CONFIG_MESON_SM=y CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set + +# +# Qualcomm firmware drivers +# +# end of Qualcomm firmware drivers + CONFIG_HAVE_ARM_SMCCC=y CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y CONFIG_ARM_SMCCC_SOC_ID=y @@ -1608,7 +1615,6 @@ CONFIG_MTD=y # # Partition parsers # -# CONFIG_MTD_AR7_PARTS is not set # CONFIG_MTD_CMDLINE_PARTS is not set CONFIG_MTD_OF_PARTS=y # CONFIG_MTD_AFS_PARTS is not set @@ -1777,7 +1783,6 @@ CONFIG_BLK_DEV_RAM_SIZE=4096 # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_AT25 is not set -# CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_93XX46 is not set @@ -2032,6 +2037,7 @@ CONFIG_TUN=y # CONFIG_TUN_VNET_CROSS_LE is not set CONFIG_VETH=m # CONFIG_NLMON is not set +# CONFIG_NETKIT is not set # CONFIG_ARCNET is not set CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set @@ -2293,7 +2299,6 @@ CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m # CONFIG_ATH9K_PCI is not set # CONFIG_ATH9K_AHB is not set -# CONFIG_ATH9K_DEBUGFS is not set # CONFIG_ATH9K_DYNACK is not set # CONFIG_ATH9K_WOW is not set CONFIG_ATH9K_RFKILL=y @@ -2400,6 +2405,8 @@ CONFIG_MT7663S=m # CONFIG_MT7921S is not set # CONFIG_MT7921U is not set # CONFIG_MT7996E is not set +# CONFIG_MT7925E is not set +# CONFIG_MT7925U is not set CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set @@ -2970,6 +2977,7 @@ CONFIG_PINCTRL_MESON_G12A=y CONFIG_PINCTRL_MESON_A1=y CONFIG_PINCTRL_MESON_S4=y CONFIG_PINCTRL_AMLOGIC_C3=y +CONFIG_PINCTRL_AMLOGIC_T7=y # # Renesas pinctrl drivers @@ -3066,7 +3074,6 @@ CONFIG_GPIO_PCA953X=m # CONFIG_W1 is not set CONFIG_POWER_RESET=y -# CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y CONFIG_POWER_RESET_ODROID_GO_ULTRA_POWEROFF=y @@ -3175,12 +3182,14 @@ CONFIG_SENSORS_GPIO_FAN=m # CONFIG_SENSORS_IIO_HWMON is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_POWERZ is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2947_I2C is not set # CONFIG_SENSORS_LTC2947_SPI is not set # CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC2991 is not set # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set @@ -3458,7 +3467,6 @@ CONFIG_MFD_SEC_CORE=y # CONFIG_MFD_SKY81452 is not set # CONFIG_MFD_STMPE is not set CONFIG_MFD_SYSCON=y -# CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_MFD_LP8788 is not set # CONFIG_MFD_TI_LMU is not set @@ -3532,6 +3540,7 @@ CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_LTC3589 is not set # CONFIG_REGULATOR_LTC3676 is not set # CONFIG_REGULATOR_MAX1586 is not set +# CONFIG_REGULATOR_MAX77503 is not set # CONFIG_REGULATOR_MAX77857 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set @@ -3589,50 +3598,13 @@ CONFIG_REGULATOR_RK808=y # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set # CONFIG_REGULATOR_QCOM_LABIBB is not set -CONFIG_RC_CORE=y -CONFIG_BPF_LIRC_MODE2=y -CONFIG_LIRC=y -CONFIG_RC_MAP=m -CONFIG_RC_DECODERS=y -CONFIG_IR_IMON_DECODER=m -CONFIG_IR_JVC_DECODER=m -CONFIG_IR_MCE_KBD_DECODER=m -CONFIG_IR_NEC_DECODER=m -CONFIG_IR_RC5_DECODER=m -CONFIG_IR_RC6_DECODER=m -CONFIG_IR_RCMM_DECODER=m -CONFIG_IR_SANYO_DECODER=m -CONFIG_IR_SHARP_DECODER=m -CONFIG_IR_SONY_DECODER=m -CONFIG_IR_XMP_DECODER=m -CONFIG_RC_DEVICES=y -CONFIG_IR_GPIO_CIR=m -CONFIG_IR_GPIO_TX=m -# CONFIG_IR_HIX5HD2 is not set -CONFIG_IR_IGORPLUGUSB=m -CONFIG_IR_IGUANA=m -CONFIG_IR_IMON=m -CONFIG_IR_IMON_RAW=m -CONFIG_IR_MCEUSB=m -CONFIG_IR_MESON=m -# CONFIG_IR_MESON_TX is not set -CONFIG_IR_PWM_TX=m -CONFIG_IR_REDRAT3=m -# CONFIG_IR_SERIAL is not set -# CONFIG_IR_SPI is not set -CONFIG_IR_STREAMZAP=m -# CONFIG_IR_TOY is not set -CONFIG_IR_TTUSBIR=m -CONFIG_RC_ATI_REMOTE=m -# CONFIG_RC_LOOPBACK is not set -CONFIG_RC_XBOX_DVD=m +# CONFIG_RC_CORE is not set CONFIG_CEC_CORE=y CONFIG_CEC_NOTIFIER=y # # CEC support # -# CONFIG_MEDIA_CEC_RC is not set CONFIG_MEDIA_CEC_SUPPORT=y # CONFIG_CEC_CH7322 is not set CONFIG_CEC_MESON_AO=y @@ -3643,60 +3615,44 @@ CONFIG_CEC_MESON_G12A_AO=y # end of CEC support CONFIG_MEDIA_SUPPORT=y -# CONFIG_MEDIA_SUPPORT_FILTER is not set +CONFIG_MEDIA_SUPPORT_FILTER=y CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # # Media device types # -CONFIG_MEDIA_CAMERA_SUPPORT=y -CONFIG_MEDIA_ANALOG_TV_SUPPORT=y -CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y -CONFIG_MEDIA_RADIO_SUPPORT=y -CONFIG_MEDIA_SDR_SUPPORT=y +# CONFIG_MEDIA_CAMERA_SUPPORT is not set +# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set +# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set +# CONFIG_MEDIA_RADIO_SUPPORT is not set +# CONFIG_MEDIA_SDR_SUPPORT is not set CONFIG_MEDIA_PLATFORM_SUPPORT=y -CONFIG_MEDIA_TEST_SUPPORT=y +# CONFIG_MEDIA_TEST_SUPPORT is not set # end of Media device types -# -# Media core support -# CONFIG_VIDEO_DEV=y CONFIG_MEDIA_CONTROLLER=y -CONFIG_DVB_CORE=y -# end of Media core support # # Video4Linux options # CONFIG_VIDEO_V4L2_I2C=y -CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_V4L2_MEM2MEM_DEV=y -CONFIG_V4L2_FWNODE=y -CONFIG_V4L2_ASYNC=y # end of Video4Linux options # # Media controller options # -CONFIG_MEDIA_CONTROLLER_DVB=y # end of Media controller options # -# Digital TV options +# Media drivers # -# CONFIG_DVB_MMAP is not set -CONFIG_DVB_NET=y -CONFIG_DVB_MAX_ADAPTERS=8 -# CONFIG_DVB_DYNAMIC_MINORS is not set -# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set -# CONFIG_DVB_ULE_DEBUG is not set -# end of Digital TV options # -# Media drivers +# Drivers filtered as selected at 'Filter media drivers' # # @@ -3704,11 +3660,8 @@ CONFIG_DVB_MAX_ADAPTERS=8 # # CONFIG_MEDIA_USB_SUPPORT is not set # CONFIG_MEDIA_PCI_SUPPORT is not set -# CONFIG_RADIO_ADAPTERS is not set CONFIG_MEDIA_PLATFORM_DRIVERS=y # CONFIG_V4L_PLATFORM_DRIVERS is not set -# CONFIG_SDR_PLATFORM_DRIVERS is not set -# CONFIG_DVB_PLATFORM_DRIVERS is not set CONFIG_V4L_MEM2MEM_DRIVERS=y CONFIG_VIDEO_MEM2MEM_DEINTERLACE=m @@ -3759,6 +3712,10 @@ CONFIG_VIDEO_MESON_GE2D=y # Microchip Technology, Inc. media platform drivers # +# +# Nuvoton media platform drivers +# + # # NVidia media platform drivers # @@ -3806,13 +3763,6 @@ CONFIG_VIDEO_MESON_GE2D=y # # Xilinx media platform drivers # - -# -# MMC/SDIO DVB adapters -# -# CONFIG_SMS_SDIO_DRV is not set -# CONFIG_V4L_TEST_DRIVERS is not set -# CONFIG_DVB_TEST_DRIVERS is not set CONFIG_UVC_COMMON=m CONFIG_VIDEOBUF2_CORE=y CONFIG_VIDEOBUF2_V4L2=y @@ -3825,105 +3775,14 @@ CONFIG_VIDEOBUF2_DMA_SG=m # # Media ancillary drivers # -CONFIG_MEDIA_ATTACH=y - -# -# IR I2C driver auto-selected by 'Autoselect ancillary drivers' -# -CONFIG_VIDEO_IR_I2C=m -CONFIG_VIDEO_CAMERA_SENSOR=y -# CONFIG_VIDEO_AR0521 is not set -# CONFIG_VIDEO_HI556 is not set -# CONFIG_VIDEO_HI846 is not set -# CONFIG_VIDEO_HI847 is not set -# CONFIG_VIDEO_IMX208 is not set -# CONFIG_VIDEO_IMX214 is not set -# CONFIG_VIDEO_IMX219 is not set -# CONFIG_VIDEO_IMX258 is not set -# CONFIG_VIDEO_IMX274 is not set -# CONFIG_VIDEO_IMX290 is not set -# CONFIG_VIDEO_IMX296 is not set -# CONFIG_VIDEO_IMX319 is not set -# CONFIG_VIDEO_IMX334 is not set -# CONFIG_VIDEO_IMX335 is not set -# CONFIG_VIDEO_IMX355 is not set -# CONFIG_VIDEO_IMX412 is not set -# CONFIG_VIDEO_IMX415 is not set -# CONFIG_VIDEO_MT9M001 is not set -# CONFIG_VIDEO_MT9M111 is not set -# CONFIG_VIDEO_MT9P031 is not set -# CONFIG_VIDEO_MT9T112 is not set -# CONFIG_VIDEO_MT9V011 is not set -# CONFIG_VIDEO_MT9V032 is not set -# CONFIG_VIDEO_MT9V111 is not set -# CONFIG_VIDEO_OG01A1B is not set -# CONFIG_VIDEO_OV01A10 is not set -# CONFIG_VIDEO_OV02A10 is not set -# CONFIG_VIDEO_OV08D10 is not set -# CONFIG_VIDEO_OV08X40 is not set -# CONFIG_VIDEO_OV13858 is not set -# CONFIG_VIDEO_OV13B10 is not set -# CONFIG_VIDEO_OV2640 is not set -# CONFIG_VIDEO_OV2659 is not set -# CONFIG_VIDEO_OV2680 is not set -# CONFIG_VIDEO_OV2685 is not set -# CONFIG_VIDEO_OV4689 is not set -# CONFIG_VIDEO_OV5640 is not set -# CONFIG_VIDEO_OV5645 is not set -# CONFIG_VIDEO_OV5647 is not set -# CONFIG_VIDEO_OV5648 is not set -# CONFIG_VIDEO_OV5670 is not set -# CONFIG_VIDEO_OV5675 is not set -# CONFIG_VIDEO_OV5693 is not set -# CONFIG_VIDEO_OV5695 is not set -# CONFIG_VIDEO_OV6650 is not set -# CONFIG_VIDEO_OV7251 is not set -# CONFIG_VIDEO_OV7640 is not set -# CONFIG_VIDEO_OV7670 is not set -# CONFIG_VIDEO_OV772X is not set -# CONFIG_VIDEO_OV7740 is not set -# CONFIG_VIDEO_OV8856 is not set -# CONFIG_VIDEO_OV8858 is not set -# CONFIG_VIDEO_OV8865 is not set -# CONFIG_VIDEO_OV9282 is not set -# CONFIG_VIDEO_OV9640 is not set -# CONFIG_VIDEO_OV9650 is not set -# CONFIG_VIDEO_RDACM20 is not set -# CONFIG_VIDEO_RDACM21 is not set -# CONFIG_VIDEO_RJ54N1 is not set -# CONFIG_VIDEO_S5C73M3 is not set -# CONFIG_VIDEO_S5K5BAF is not set -# CONFIG_VIDEO_S5K6A3 is not set -# CONFIG_VIDEO_ST_VGXY61 is not set -# CONFIG_VIDEO_CCS is not set -# CONFIG_VIDEO_ET8EK8 is not set - -# -# Lens drivers -# -# CONFIG_VIDEO_AD5820 is not set -# CONFIG_VIDEO_AK7375 is not set -# CONFIG_VIDEO_DW9714 is not set -# CONFIG_VIDEO_DW9719 is not set -# CONFIG_VIDEO_DW9768 is not set -# CONFIG_VIDEO_DW9807_VCM is not set -# end of Lens drivers - -# -# Flash devices -# -# CONFIG_VIDEO_ADP1653 is not set -# CONFIG_VIDEO_LM3560 is not set -# CONFIG_VIDEO_LM3646 is not set -# end of Flash devices # # Audio decoders, processors and mixers # # CONFIG_VIDEO_CS3308 is not set # CONFIG_VIDEO_CS5345 is not set -CONFIG_VIDEO_CS53L32A=m -CONFIG_VIDEO_MSP3400=m +# CONFIG_VIDEO_CS53L32A is not set +# CONFIG_VIDEO_MSP3400 is not set # CONFIG_VIDEO_SONY_BTF_MPX is not set # CONFIG_VIDEO_TDA1997X is not set # CONFIG_VIDEO_TDA7432 is not set @@ -3935,7 +3794,7 @@ CONFIG_VIDEO_MSP3400=m # CONFIG_VIDEO_UDA1342 is not set # CONFIG_VIDEO_VP27SMPX is not set # CONFIG_VIDEO_WM8739 is not set -CONFIG_VIDEO_WM8775=m +# CONFIG_VIDEO_WM8775 is not set # end of Audio decoders, processors and mixers # @@ -3960,7 +3819,7 @@ CONFIG_VIDEO_WM8775=m # CONFIG_VIDEO_MAX9286 is not set # CONFIG_VIDEO_ML86V7667 is not set # CONFIG_VIDEO_SAA7110 is not set -CONFIG_VIDEO_SAA711X=m +# CONFIG_VIDEO_SAA711X is not set # CONFIG_VIDEO_TC358743 is not set # CONFIG_VIDEO_TC358746 is not set # CONFIG_VIDEO_TVP514X is not set @@ -3976,7 +3835,7 @@ CONFIG_VIDEO_SAA711X=m # Video and audio decoders # # CONFIG_VIDEO_SAA717X is not set -CONFIG_VIDEO_CX25840=m +# CONFIG_VIDEO_CX25840 is not set # end of Video decoders # @@ -4009,7 +3868,6 @@ CONFIG_VIDEO_CX25840=m # # SDR tuner chips # -# CONFIG_SDR_MAX2175 is not set # end of SDR tuner chips # @@ -4032,221 +3890,8 @@ CONFIG_VIDEO_CX25840=m # # Media SPI Adapters # -CONFIG_CXD2880_SPI_DRV=m # CONFIG_VIDEO_GS1662 is not set # end of Media SPI Adapters - -CONFIG_MEDIA_TUNER=y - -# -# Customize TV tuners -# -CONFIG_MEDIA_TUNER_E4000=m -CONFIG_MEDIA_TUNER_FC0011=m -CONFIG_MEDIA_TUNER_FC0012=m -CONFIG_MEDIA_TUNER_FC0013=m -CONFIG_MEDIA_TUNER_FC2580=m -CONFIG_MEDIA_TUNER_IT913X=m -# CONFIG_MEDIA_TUNER_M88RS6000T is not set -CONFIG_MEDIA_TUNER_MAX2165=m -CONFIG_MEDIA_TUNER_MC44S803=y -# CONFIG_MEDIA_TUNER_MSI001 is not set -CONFIG_MEDIA_TUNER_MT2060=m -CONFIG_MEDIA_TUNER_MT2063=m -CONFIG_MEDIA_TUNER_MT20XX=y -# CONFIG_MEDIA_TUNER_MT2131 is not set -CONFIG_MEDIA_TUNER_MT2266=m -# CONFIG_MEDIA_TUNER_MXL301RF is not set -CONFIG_MEDIA_TUNER_MXL5005S=m -CONFIG_MEDIA_TUNER_MXL5007T=m -# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set -CONFIG_MEDIA_TUNER_QM1D1C0042=m -CONFIG_MEDIA_TUNER_QT1010=m -CONFIG_MEDIA_TUNER_R820T=m -CONFIG_MEDIA_TUNER_SI2157=m -CONFIG_MEDIA_TUNER_SIMPLE=y -CONFIG_MEDIA_TUNER_TDA18212=m -CONFIG_MEDIA_TUNER_TDA18218=m -CONFIG_MEDIA_TUNER_TDA18250=m -CONFIG_MEDIA_TUNER_TDA18271=y -CONFIG_MEDIA_TUNER_TDA827X=y -CONFIG_MEDIA_TUNER_TDA8290=y -CONFIG_MEDIA_TUNER_TDA9887=y -CONFIG_MEDIA_TUNER_TEA5761=y -CONFIG_MEDIA_TUNER_TEA5767=y -CONFIG_MEDIA_TUNER_TUA9001=m -CONFIG_MEDIA_TUNER_XC2028=y -CONFIG_MEDIA_TUNER_XC4000=y -CONFIG_MEDIA_TUNER_XC5000=y -# end of Customize TV tuners - -# -# Customise DVB Frontends -# - -# -# Multistandard (satellite) frontends -# -CONFIG_DVB_M88DS3103=m -# CONFIG_DVB_MXL5XX is not set -CONFIG_DVB_STB0899=m -CONFIG_DVB_STB6100=m -CONFIG_DVB_STV090x=m -# CONFIG_DVB_STV0910 is not set -CONFIG_DVB_STV6110x=m -# CONFIG_DVB_STV6111 is not set - -# -# Multistandard (cable + terrestrial) frontends -# -CONFIG_DVB_DRXK=m -CONFIG_DVB_MN88472=m -CONFIG_DVB_MN88473=m -CONFIG_DVB_SI2165=m -CONFIG_DVB_TDA18271C2DD=m - -# -# DVB-S (satellite) frontends -# -# CONFIG_DVB_CX24110 is not set -CONFIG_DVB_CX24116=m -# CONFIG_DVB_CX24117 is not set -CONFIG_DVB_CX24120=m -CONFIG_DVB_CX24123=m -CONFIG_DVB_DS3000=m -# CONFIG_DVB_MB86A16 is not set -CONFIG_DVB_MT312=m -CONFIG_DVB_S5H1420=m -CONFIG_DVB_SI21XX=m -CONFIG_DVB_STB6000=m -CONFIG_DVB_STV0288=m -CONFIG_DVB_STV0299=m -CONFIG_DVB_STV0900=m -CONFIG_DVB_STV6110=m -CONFIG_DVB_TDA10071=m -CONFIG_DVB_TDA10086=m -# CONFIG_DVB_TDA8083 is not set -# CONFIG_DVB_TDA8261 is not set -CONFIG_DVB_TDA826X=m -CONFIG_DVB_TS2020=m -# CONFIG_DVB_TUA6100 is not set -CONFIG_DVB_TUNER_CX24113=m -CONFIG_DVB_TUNER_ITD1000=m -# CONFIG_DVB_VES1X93 is not set -# CONFIG_DVB_ZL10036 is not set -CONFIG_DVB_ZL10039=m - -# -# DVB-T (terrestrial) frontends -# -CONFIG_DVB_AF9013=m -# CONFIG_DVB_CX22700 is not set -CONFIG_DVB_CX22702=m -CONFIG_DVB_CXD2820R=m -CONFIG_DVB_CXD2841ER=m -CONFIG_DVB_DIB3000MB=m -CONFIG_DVB_DIB3000MC=m -CONFIG_DVB_DIB7000M=m -CONFIG_DVB_DIB7000P=m -# CONFIG_DVB_DIB9000 is not set -CONFIG_DVB_DRXD=m -CONFIG_DVB_EC100=m -# CONFIG_DVB_L64781 is not set -CONFIG_DVB_MT352=m -CONFIG_DVB_NXT6000=m -CONFIG_DVB_RTL2830=m -CONFIG_DVB_RTL2832=m -CONFIG_DVB_RTL2832_SDR=m -# CONFIG_DVB_S5H1432 is not set -CONFIG_DVB_SI2168=m -# CONFIG_DVB_SP887X is not set -# CONFIG_DVB_STV0367 is not set -CONFIG_DVB_TDA10048=m -CONFIG_DVB_TDA1004X=m -CONFIG_DVB_ZD1301_DEMOD=m -CONFIG_DVB_ZL10353=m -# CONFIG_DVB_CXD2880 is not set - -# -# DVB-C (cable) frontends -# -CONFIG_DVB_STV0297=m -# CONFIG_DVB_TDA10021 is not set -CONFIG_DVB_TDA10023=m -# CONFIG_DVB_VES1820 is not set - -# -# ATSC (North American/Korean Terrestrial/Cable DTV) frontends -# -CONFIG_DVB_AU8522=m -CONFIG_DVB_AU8522_DTV=m -CONFIG_DVB_AU8522_V4L=m -CONFIG_DVB_BCM3510=m -CONFIG_DVB_LG2160=m -CONFIG_DVB_LGDT3305=m -CONFIG_DVB_LGDT3306A=m -CONFIG_DVB_LGDT330X=m -CONFIG_DVB_MXL692=m -CONFIG_DVB_NXT200X=m -# CONFIG_DVB_OR51132 is not set -# CONFIG_DVB_OR51211 is not set -CONFIG_DVB_S5H1409=m -CONFIG_DVB_S5H1411=m - -# -# ISDB-T (terrestrial) frontends -# -CONFIG_DVB_DIB8000=m -CONFIG_DVB_MB86A20S=m -CONFIG_DVB_S921=m - -# -# ISDB-S (satellite) & ISDB-T (terrestrial) frontends -# -# CONFIG_DVB_MN88443X is not set -CONFIG_DVB_TC90522=m - -# -# Digital terrestrial only tuners/PLL -# -CONFIG_DVB_PLL=m -CONFIG_DVB_TUNER_DIB0070=m -CONFIG_DVB_TUNER_DIB0090=m - -# -# SEC control devices for DVB-S -# -CONFIG_DVB_A8293=m -CONFIG_DVB_AF9033=m -# CONFIG_DVB_ASCOT2E is not set -CONFIG_DVB_ATBM8830=m -# CONFIG_DVB_HELENE is not set -# CONFIG_DVB_HORUS3A is not set -# CONFIG_DVB_ISL6405 is not set -CONFIG_DVB_ISL6421=m -CONFIG_DVB_ISL6423=m -CONFIG_DVB_IX2505V=m -# CONFIG_DVB_LGS8GL5 is not set -CONFIG_DVB_LGS8GXX=m -# CONFIG_DVB_LNBH25 is not set -# CONFIG_DVB_LNBH29 is not set -CONFIG_DVB_LNBP21=m -CONFIG_DVB_LNBP22=m -CONFIG_DVB_M88RS2000=m -# CONFIG_DVB_TDA665x is not set -CONFIG_DVB_DRX39XYJ=m - -# -# Common Interface (EN50221) controller drivers -# -# CONFIG_DVB_CXD2099 is not set -CONFIG_DVB_SP2=m -# end of Customise DVB Frontends - -# -# Tools to develop new frontends -# -# CONFIG_DVB_DUMMY_FE is not set # end of Media ancillary drivers # @@ -4322,10 +3967,12 @@ CONFIG_DRM_PANEL=y # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9882T is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set # CONFIG_DRM_PANEL_JADARD_JD9365DA_H3 is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set +# CONFIG_DRM_PANEL_JDI_LPM102A188A is not set # CONFIG_DRM_PANEL_JDI_R63452 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set # CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set @@ -4353,6 +4000,7 @@ CONFIG_DRM_PANEL=y # CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM692E5 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set # CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set @@ -4523,6 +4171,7 @@ CONFIG_FB_SYS_IMAGEBLIT=y CONFIG_FB_SYS_FOPS=y CONFIG_FB_DEFERRED_IO=y CONFIG_FB_DMAMEM_HELPERS=y +CONFIG_FB_IOMEM_FOPS=y CONFIG_FB_SYSMEM_HELPERS=y CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y CONFIG_FB_MODE_HELPERS=y @@ -4712,6 +4361,8 @@ CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_AW8738 is not set # CONFIG_SND_SOC_AW88395 is not set # CONFIG_SND_SOC_AW88261 is not set +# CONFIG_SND_SOC_AW87390 is not set +# CONFIG_SND_SOC_AW88399 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CHV3_CODEC is not set @@ -4793,6 +4444,7 @@ CONFIG_SND_SOC_RK817=y # CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_RT9120 is not set +# CONFIG_SND_SOC_RTQ9128 is not set # CONFIG_SND_SOC_SGTL5000 is not set CONFIG_SND_SOC_SIMPLE_AMPLIFIER=y # CONFIG_SND_SOC_SIMPLE_MUX is not set @@ -5146,59 +4798,7 @@ CONFIG_USB_DWC2_DUAL_ROLE=y # # USB port drivers # -CONFIG_USB_SERIAL=m -CONFIG_USB_SERIAL_GENERIC=y -# CONFIG_USB_SERIAL_SIMPLE is not set -# CONFIG_USB_SERIAL_AIRCABLE is not set -# CONFIG_USB_SERIAL_ARK3116 is not set -# CONFIG_USB_SERIAL_BELKIN is not set -CONFIG_USB_SERIAL_CH341=m -# CONFIG_USB_SERIAL_WHITEHEAT is not set -# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set -CONFIG_USB_SERIAL_CP210X=m -# CONFIG_USB_SERIAL_CYPRESS_M8 is not set -# CONFIG_USB_SERIAL_EMPEG is not set -CONFIG_USB_SERIAL_FTDI_SIO=m -# CONFIG_USB_SERIAL_VISOR is not set -# CONFIG_USB_SERIAL_IPAQ is not set -# CONFIG_USB_SERIAL_IR is not set -# CONFIG_USB_SERIAL_EDGEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT_TI is not set -# CONFIG_USB_SERIAL_F81232 is not set -# CONFIG_USB_SERIAL_F8153X is not set -# CONFIG_USB_SERIAL_GARMIN is not set -# CONFIG_USB_SERIAL_IPW is not set -CONFIG_USB_SERIAL_IUU=m -# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set -# CONFIG_USB_SERIAL_KEYSPAN is not set -# CONFIG_USB_SERIAL_KLSI is not set -# CONFIG_USB_SERIAL_KOBIL_SCT is not set -# CONFIG_USB_SERIAL_MCT_U232 is not set -# CONFIG_USB_SERIAL_METRO is not set -# CONFIG_USB_SERIAL_MOS7720 is not set -# CONFIG_USB_SERIAL_MOS7840 is not set -# CONFIG_USB_SERIAL_MXUPORT is not set -# CONFIG_USB_SERIAL_NAVMAN is not set -CONFIG_USB_SERIAL_PL2303=m -# CONFIG_USB_SERIAL_OTI6858 is not set -# CONFIG_USB_SERIAL_QCAUX is not set -# CONFIG_USB_SERIAL_QUALCOMM is not set -# CONFIG_USB_SERIAL_SPCP8X5 is not set -# CONFIG_USB_SERIAL_SAFE is not set -# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set -# CONFIG_USB_SERIAL_SYMBOL is not set -# CONFIG_USB_SERIAL_TI is not set -# CONFIG_USB_SERIAL_CYBERJACK is not set -# CONFIG_USB_SERIAL_OPTION is not set -# CONFIG_USB_SERIAL_OMNINET is not set -# CONFIG_USB_SERIAL_OPTICON is not set -# CONFIG_USB_SERIAL_XSENS_MT is not set -# CONFIG_USB_SERIAL_WISHBONE is not set -# CONFIG_USB_SERIAL_SSU100 is not set -# CONFIG_USB_SERIAL_QT2 is not set -# CONFIG_USB_SERIAL_UPD78F0730 is not set -# CONFIG_USB_SERIAL_XR is not set -# CONFIG_USB_SERIAL_DEBUG is not set +# CONFIG_USB_SERIAL is not set # # USB Miscellaneous drivers @@ -5347,6 +4947,7 @@ CONFIG_TYPEC_FUSB302=m # CONFIG_TYPEC_MUX_GPIO_SBU is not set # CONFIG_TYPEC_MUX_PI3USB30532 is not set # CONFIG_TYPEC_MUX_NB7VPQ904M is not set +# CONFIG_TYPEC_MUX_PTN36502 is not set # end of USB Type-C Multiplexer/DeMultiplexer Switch support # @@ -5458,6 +5059,7 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=y # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set CONFIG_LEDS_TRIGGER_CPU=y CONFIG_LEDS_TRIGGER_ACTIVITY=y +# CONFIG_LEDS_TRIGGER_GPIO is not set CONFIG_LEDS_TRIGGER_DEFAULT_ON=y # @@ -5626,7 +5228,6 @@ CONFIG_DMABUF_HEAPS_CMA=y # CONFIG_COMEDI is not set CONFIG_STAGING=y # CONFIG_PRISM2_USB is not set -# CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set # CONFIG_RTL8723BS is not set # CONFIG_R8712U is not set @@ -5669,17 +5270,10 @@ CONFIG_STAGING=y # # CONFIG_AD5933 is not set # end of Network Analyzer, Impedance Converters - -# -# Resolver to digital converters -# -# CONFIG_AD2S1210 is not set -# end of Resolver to digital converters # end of IIO staging drivers # CONFIG_FB_SM750 is not set CONFIG_STAGING_MEDIA=y -# CONFIG_DVB_AV7110 is not set # CONFIG_VIDEO_MAX96712 is not set CONFIG_VIDEO_MESON_VDEC=y # CONFIG_STAGING_MEDIA_DEPRECATED is not set @@ -5690,7 +5284,6 @@ CONFIG_VIDEO_MESON_VDEC=y # CONFIG_PI433 is not set # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_FIELDBUS_DEV is not set -# CONFIG_QLGE is not set # CONFIG_VME_BUS is not set # CONFIG_GOLDFISH is not set # CONFIG_CHROME_PLATFORMS is not set @@ -5748,9 +5341,11 @@ CONFIG_COMMON_CLK_MESON_CPU_DYNDIV=y CONFIG_COMMON_CLK_GXBB=y CONFIG_COMMON_CLK_AXG=y CONFIG_COMMON_CLK_AXG_AUDIO=y -# CONFIG_COMMON_CLK_A1_PLL is not set -# CONFIG_COMMON_CLK_A1_PERIPHERALS is not set +CONFIG_COMMON_CLK_A1_PLL=y +CONFIG_COMMON_CLK_A1_PERIPHERALS=y CONFIG_COMMON_CLK_G12A=y +CONFIG_COMMON_CLK_S4_PLL=y +CONFIG_COMMON_CLK_S4_PERIPHERALS=y # end of Clock support for Amlogic platforms # CONFIG_XILINX_VCU is not set @@ -5826,15 +5421,11 @@ CONFIG_IOMMU_DMA=y CONFIG_MESON_CANVAS=y CONFIG_MESON_CLK_MEASURE=y CONFIG_MESON_GX_SOCINFO=y -CONFIG_MESON_GX_PM_DOMAINS=y -CONFIG_MESON_EE_PM_DOMAINS=y -CONFIG_MESON_SECURE_PM_DOMAINS=y # end of Amlogic SoC drivers # # Broadcom SoC drivers # -# CONFIG_SOC_BRCMSTB is not set # end of Broadcom SoC drivers # @@ -5875,6 +5466,34 @@ CONFIG_MESON_SECURE_PM_DOMAINS=y # end of Xilinx SoC drivers # end of SOC (System On Chip) specific Drivers +# +# PM Domains +# + +# +# Amlogic PM Domains +# +CONFIG_MESON_GX_PM_DOMAINS=y +CONFIG_MESON_EE_PM_DOMAINS=y +CONFIG_MESON_SECURE_PM_DOMAINS=y +# end of Amlogic PM Domains + +# +# Broadcom PM Domains +# +# end of Broadcom PM Domains + +# +# i.MX PM Domains +# +# end of i.MX PM Domains + +# +# Qualcomm PM Domains +# +# end of Qualcomm PM Domains +# end of PM Domains + CONFIG_PM_DEVFREQ=y # @@ -5998,6 +5617,7 @@ CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_HI8435 is not set # CONFIG_HX711 is not set # CONFIG_INA2XX_ADC is not set +# CONFIG_LTC2309 is not set # CONFIG_LTC2471 is not set # CONFIG_LTC2485 is not set # CONFIG_LTC2496 is not set @@ -6012,6 +5632,7 @@ CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_MAX9611 is not set # CONFIG_MCP320X is not set # CONFIG_MCP3422 is not set +# CONFIG_MCP3564 is not set # CONFIG_MCP3911 is not set CONFIG_MESON_SARADC=y # CONFIG_NAU7802 is not set @@ -6373,6 +5994,7 @@ CONFIG_MESON_SARADC=y # Pressure sensors # # CONFIG_ABP060MG is not set +# CONFIG_ROHM_BM1390 is not set # CONFIG_BMP280 is not set # CONFIG_DLHL60D is not set # CONFIG_DPS310 is not set @@ -6420,6 +6042,7 @@ CONFIG_MESON_SARADC=y # # CONFIG_AD2S90 is not set # CONFIG_AD2S1200 is not set +# CONFIG_AD2S1210 is not set # end of Resolver to digital converters # @@ -6633,7 +6256,6 @@ CONFIG_XFS_SUPPORT_ASCII_CI=y # CONFIG_OCFS2_FS is not set CONFIG_BTRFS_FS=m # CONFIG_BTRFS_FS_POSIX_ACL is not set -# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG is not set # CONFIG_BTRFS_ASSERT is not set @@ -6647,6 +6269,7 @@ CONFIG_F2FS_CHECK_FS=y # CONFIG_F2FS_FS_COMPRESSION is not set CONFIG_F2FS_IOSTAT=y # CONFIG_F2FS_UNFAIR_RWSEM is not set +# CONFIG_BCACHEFS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y # CONFIG_EXPORTFS_BLOCK_OPS is not set @@ -7040,7 +6663,9 @@ CONFIG_CRYPTO_DRBG_HMAC=y # CONFIG_CRYPTO_DRBG_CTR is not set CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y -# CONFIG_CRYPTO_JITTERENTROPY_TESTINTERFACE is not set +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 +CONFIG_CRYPTO_JITTERENTROPY_OSR=1 CONFIG_CRYPTO_KDF800108_CTR=y # end of Random number generation @@ -7199,7 +6824,6 @@ CONFIG_ZSTD_DECOMPRESS=y CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set -# CONFIG_XZ_DEC_IA64 is not set # CONFIG_XZ_DEC_ARM is not set # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set @@ -7284,6 +6908,7 @@ CONFIG_SG_POOL=y CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y +# CONFIG_LWQ_TEST is not set # end of Library routines CONFIG_GENERIC_IOREMAP=y diff --git a/projects/Amlogic/packages/linux/package.mk b/projects/Amlogic/packages/linux/package.mk index 8ef5c07583..9d567a0409 100644 --- a/projects/Amlogic/packages/linux/package.mk +++ b/projects/Amlogic/packages/linux/package.mk @@ -7,8 +7,8 @@ PKG_NAME="linux" PKG_LICENSE="GPL" PKG_SITE="https://github.com/JustEnoughLinuxOS" -PKG_DEPENDS_HOST="ccache:host rsync:host openssl:host rdfind:host" -PKG_DEPENDS_TARGET="toolchain linux:host cpio:host kmod:host xz:host wireless-regdb keyutils util-linux binutils ncurses openssl:host ${KERNEL_EXTRA_DEPENDS_TARGET}" +PKG_DEPENDS_HOST="ccache:host rdfind:host rsync:host openssl:host" +PKG_DEPENDS_TARGET="toolchain rdfind:host linux:host cpio:host kmod:host xz:host wireless-regdb keyutils util-linux binutils ncurses openssl:host ${KERNEL_EXTRA_DEPENDS_TARGET}" PKG_DEPENDS_INIT="toolchain" PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory initramfs) $(get_pkg_variable initramfs PKG_NEED_UNPACK)" PKG_LONGDESC="This package builds the kernel for Amlogic devices" @@ -18,7 +18,7 @@ PKG_PATCH_DIRS+="${DEVICE}" case ${DEVICE} in S922X*) - PKG_VERSION="6.7.3" + PKG_VERSION="6.7.4" PKG_URL="https://www.kernel.org/pub/linux/kernel/v6.x/${PKG_NAME}-${PKG_VERSION}.tar.xz" ;; esac @@ -253,19 +253,6 @@ makeinstall_target() { cp -v resource.img ${INSTALL}/usr/share/bootloader ARCH=${TARGET_ARCH} fi - elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then - mkdir -p ${INSTALL}/usr/share/bootloader/overlays - - # install platform dtbs, but remove upstream kernel dtbs (i.e. without downstream - # drivers and decent USB support) as these are not required by LibreELEC - cp -p arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb ${INSTALL}/usr/share/bootloader - rm -f ${INSTALL}/usr/share/bootloader/bcm283*.dtb - - # install overlay dtbs - for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/*.dtbo; do - cp ${dtb} ${INSTALL}/usr/share/bootloader/overlays 2>/dev/null || : - done - cp -p arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/README ${INSTALL}/usr/share/bootloader/overlays fi } diff --git a/projects/PC/config/ovf.template b/projects/PC/config/ovf.template deleted file mode 100644 index 7184beb6cf..0000000000 --- a/projects/PC/config/ovf.template +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - Virtual disk information - - - - The list of logical networks - - The bridged network - - - - A virtual machine - @DISTRO@ - - Meta-information about the installed software - LibreELEC - LibreELEC - https://libreelec.tv - https://libreelec.tv - - - A human-readable annotation - LibreELEC is ‘Just enough OS’ for Kodi, a Linux distribution built to run Kodi on current and popular mediacentre hardware. After importing the OVA image adjust CPU, RAM, and HDD storage to the required configuration before first boot. - - - The kind of installed guest operating system - - Virtual hardware requirements - - Virtual Hardware Family - 0 - LibreELEC - vmx-12 - - - hertz * 10^6 - Number of Virtual CPUs - 1 virtual CPU(s) - 1 - 3 - 1 - - - byte * 2^20 - Memory Size - 1024MB of memory - 2 - 4 - 1024 - - - 0 - USB Controller (EHCI) - usb - 3 - vmware.usb.ehci - 23 - - - - 0 - IDE Controller - ideController0 - 4 - 5 - - - 0 - disk0 - ovf:/disk/disk - 5 - 4 - 17 - - - 1 - true - bridged - E1000 ethernet adapter on "bridged" - ethernet0 - 6 - E1000 - 10 - - - - false - sound - 7 - vmware.soundcard.hdaudio - 1 - - - false - video - 8 - 24 - - - - false - vmci - 9 - vmware.vmci - 1 - - - - - - - - - diff --git a/projects/PC/devices/AMD64/linux/linux.x86_64.conf b/projects/PC/devices/AMD64/linux/linux.x86_64.conf index 0a753f983c..f3f5003a61 100644 --- a/projects/PC/devices/AMD64/linux/linux.x86_64.conf +++ b/projects/PC/devices/AMD64/linux/linux.x86_64.conf @@ -2,7 +2,7 @@ # Automatically generated file; DO NOT EDIT. # Linux/x86 6.6.9 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="x86_64-libreelec-linux-gnu-gcc-12.3.1 (GCC) 12.3.1 20240103" +CONFIG_CC_VERSION_TEXT="x86_64-linux-gnu-gcc-12.3.1 (GCC) 12.3.1 20240103" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120301 CONFIG_CLANG_VERSION=0 diff --git a/projects/PC/devices/AMD64/options b/projects/PC/devices/AMD64/options index fdf0f3ff22..b86261bbfb 100644 --- a/projects/PC/devices/AMD64/options +++ b/projects/PC/devices/AMD64/options @@ -40,10 +40,10 @@ # Default weston terminal font size WESTONFONTSIZE="18" - # Mesa 3D Graphic drivers to use (all / crocus,i915,iris,r300,r600,radeonsi,vmware,virtio) + # Mesa 3D Graphic drivers to use (all / crocus,i915,iris,r300,r600,radeonsi,virtio) # Space separated list is supported, - # e.g. GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi vmware virtio" - GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi vmware virtio" + # e.g. GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi virtio" + GRAPHIC_DRIVERS="crocus i915 iris r300 r600 radeonsi virtio" # additional packages to install # ADDITIONAL_PACKAGES="" diff --git a/projects/PC/options b/projects/PC/options index 6c6619b9d8..1bdbaf2c66 100644 --- a/projects/PC/options +++ b/projects/PC/options @@ -53,9 +53,6 @@ # Space separated list is supported, DRIVER_ADDONS="crazycat digital_devices dvb-latest" - # Default size of the ova image, in MB, eg. 4096 - OVA_SIZE="4096" - # Installation support INSTALLER_SUPPORT="yes" diff --git a/projects/Rockchip/bootloader/install b/projects/Rockchip/bootloader/install index 30d412b679..998d6bbf77 100755 --- a/projects/Rockchip/bootloader/install +++ b/projects/Rockchip/bootloader/install @@ -109,8 +109,14 @@ esac if [ "${BOOT_INI}" == true ] then echo "boot: create boot.ini..." - cp -f ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/boot/boot.ini ${INSTALL}/usr/share/bootloader/boot.ini - sed -i "s~@EXTRA_CMDLINE@~${EXTRA_CMDLINE}~g" ${INSTALL}/usr/share/bootloader/boot.ini + if [ -e "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/boot/boot.ini" ] + then + cp -f ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/boot/boot.ini ${INSTALL}/usr/share/bootloader/boot.ini + sed -i "s~@EXTRA_CMDLINE@~${EXTRA_CMDLINE}~g" ${INSTALL}/usr/share/bootloader/boot.ini + else + echo "ERROR: No boot.ini found in ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/boot/." + exit 1 + fi fi if [ "${EXT_LINUX_CONF}" == true ] diff --git a/projects/Rockchip/bootloader/mkimage b/projects/Rockchip/bootloader/mkimage index 0e968ef450..bd1b3fb2ef 100755 --- a/projects/Rockchip/bootloader/mkimage +++ b/projects/Rockchip/bootloader/mkimage @@ -56,11 +56,17 @@ esac if [ "${BOOT_INI}" == true ] then echo "boot: create boot.ini..." - cp -f ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/boot/boot.ini ${LE_TMP}/boot.ini - sed -i "s~@UUID_SYSTEM@~${UUID_SYSTEM}~g" ${LE_TMP}/boot.ini - sed -i "s~@UUID_STORAGE@~${UUID_STORAGE}~g" ${LE_TMP}/boot.ini - sed -i "s~@EXTRA_CMDLINE@~${EXTRA_CMDLINE}~g" ${LE_TMP}/boot.ini - mcopy -so "${LE_TMP}/boot.ini" :: + if [ -e "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/boot/boot.ini" ] + then + cp -f ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/boot/boot.ini ${LE_TMP}/boot.ini + sed -i "s~@UUID_SYSTEM@~${UUID_SYSTEM}~g" ${LE_TMP}/boot.ini + sed -i "s~@UUID_STORAGE@~${UUID_STORAGE}~g" ${LE_TMP}/boot.ini + sed -i "s~@EXTRA_CMDLINE@~${EXTRA_CMDLINE}~g" ${LE_TMP}/boot.ini + mcopy -so "${LE_TMP}/boot.ini" :: + else + echo "ERROR: No boot.ini found in ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/boot/." + exit 1 + fi fi mkdir -p "${LE_TMP}/extlinux" diff --git a/projects/Rockchip/bootloader/release b/projects/Rockchip/bootloader/release index f03b259b61..3830864df3 100755 --- a/projects/Rockchip/bootloader/release +++ b/projects/Rockchip/bootloader/release @@ -37,6 +37,10 @@ if [ -f ${INSTALL}/usr/share/bootloader/boot.ini ]; then cp -a ${INSTALL}/usr/share/bootloader/boot.ini ${RELEASE_DIR}/3rdparty/bootloader fi +if [ -f ${INSTALL}/usr/share/bootloader/boot.scr ]; then + cp -a ${INSTALL}/usr/share/bootloader/boot.scr ${RELEASE_DIR}/3rdparty/bootloader +fi + LINUX_DTS_DIR=$(get_build_dir linux)/arch/${TARGET_KERNEL_ARCH}/boot/dts/ for dtb in $(find ${LINUX_DTS_DIR} -name "*.dtb") ; do if [ -f $dtb ]; then diff --git a/projects/Rockchip/bootloader/update.sh b/projects/Rockchip/bootloader/update.sh index 4a6b7a65e6..de2f71c2a4 100755 --- a/projects/Rockchip/bootloader/update.sh +++ b/projects/Rockchip/bootloader/update.sh @@ -83,6 +83,16 @@ if [ -f $SYSTEM_ROOT/usr/share/bootloader/boot.ini ]; then sed -e "s/@UUID_SYSTEM@/${UUID_SYSTEM}/" \ -e "s/@UUID_STORAGE@/${UUID_STORAGE}/" \ -i $BOOT_ROOT/boot.ini + + # Set correct R3xS dtb in boot.ini + DTB_NAME=$(cat $BOOT_ROOT/device.name) + if [ $DTB_NAME = 'R33S' ]; then + echo "Setting R33S dtb in boot.ini..." + sed -i '/rk3326-gameconsole-r3/c\ load mmc 1:1 ${dtb_loadaddr} rk3326-gameconsole-r33s.dtb' $BOOT_ROOT/boot.ini + elif [ $DTB_NAME = 'R36S' ]; then + echo "Setting R36S/R35S dtb in boot.ini..." + sed -i '/rk3326-gameconsole-r3/c\ load mmc 1:1 ${dtb_loadaddr} rk3326-gameconsole-r36s.dtb' $BOOT_ROOT/boot.ini + fi fi # update device tree diff --git a/projects/Rockchip/devices/RK-ARMV8-A/linux/linux.aarch64.conf b/projects/Rockchip/devices/RK-ARMV8-A/linux/linux.aarch64.conf index d64d296e23..d248a54478 100644 --- a/projects/Rockchip/devices/RK-ARMV8-A/linux/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK-ARMV8-A/linux/linux.aarch64.conf @@ -2,7 +2,7 @@ # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.7.0 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-libreelec-linux-gnueabi-gcc-12.3.0 (GCC) 12.3.0" +CONFIG_CC_VERSION_TEXT="aarch64-linux-gnueabi-gcc-12.3.0 (GCC) 12.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120300 CONFIG_CLANG_VERSION=0 diff --git a/projects/Rockchip/devices/RK3326/linux/linux.aarch64.conf b/projects/Rockchip/devices/RK3326/linux/linux.aarch64.conf index 08bf4eeedb..f761e7e636 100644 --- a/projects/Rockchip/devices/RK3326/linux/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3326/linux/linux.aarch64.conf @@ -2,7 +2,7 @@ # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.7.2 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-libreelec-linux-gnueabi-gcc-12.3.1 (GCC) 12.3.1 20240103" +CONFIG_CC_VERSION_TEXT="aarch64-linux-gnueabi-gcc-12.3.1 (GCC) 12.3.1 20240103" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120301 CONFIG_CLANG_VERSION=0 diff --git a/projects/Rockchip/devices/RK3326/options b/projects/Rockchip/devices/RK3326/options index b623db4d3c..239d93d869 100644 --- a/projects/Rockchip/devices/RK3326/options +++ b/projects/Rockchip/devices/RK3326/options @@ -31,7 +31,7 @@ BOOTLOADER="u-boot" TRUST_LABEL="trust" PARTITION_TABLE="msdos" - DEVICE_DTB=("rk3326-anbernic-rg351m" "rk3326-anbernic-rg351v" "rk3326-gameconsole-r33s" "rk3326-odroid-go2" "rk3326-odroid-go2-v11" "rk3326-odroid-go3" "rk3326-powkiddy-rgb10" "rk3326-powkiddy-rgb20s" "rk3326-magicx-xu10") + DEVICE_DTB=("rk3326-anbernic-rg351m" "rk3326-anbernic-rg351v" "rk3326-gameconsole-r33s" "rk3326-gameconsole-r36s" "rk3326-odroid-go2" "rk3326-odroid-go2-v11" "rk3326-odroid-go3" "rk3326-powkiddy-rgb10" "rk3326-powkiddy-rgb20s" "rk3326-magicx-xu10") UBOOT_DTB="${DEVICE_DTB[0]}" UBOOT_CONFIG="odroidgoa_defconfig" PKG_SOC="px30" @@ -73,7 +73,7 @@ EXTRA_CMDLINE="quiet rootwait console=ttyFIQ0 console=tty0 ssh consoleblank=0 systemd.show_status=0 loglevel=0 panic=20" # additional packages to install - ADDITIONAL_PACKAGES="" + ADDITIONAL_PACKAGES="device-switch" # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, diff --git a/projects/Rockchip/devices/RK3399/linux/linux.aarch64.conf b/projects/Rockchip/devices/RK3399/linux/linux.aarch64.conf index 40061e087a..5845e0a957 100644 --- a/projects/Rockchip/devices/RK3399/linux/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3399/linux/linux.aarch64.conf @@ -2,7 +2,7 @@ # Automatically generated file; DO NOT EDIT. # Linux/arm64 6.7.1 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-libreelec-linux-gnueabi-gcc-12.3.1 (GCC) 12.3.1 20240103" +CONFIG_CC_VERSION_TEXT="aarch64-linux-gnueabi-gcc-12.3.1 (GCC) 12.3.1 20240103" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120301 CONFIG_CLANG_VERSION=0 diff --git a/projects/Rockchip/devices/RK3566-X55/linux/linux.aarch64.conf b/projects/Rockchip/devices/RK3566-X55/linux/linux.aarch64.conf index b734999e09..721676b7f8 100644 --- a/projects/Rockchip/devices/RK3566-X55/linux/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3566-X55/linux/linux.aarch64.conf @@ -1,1018 +1,273 @@ -# -# Automatically generated file; DO NOT EDIT. -# Linux/arm64 4.19.172 Kernel Configuration -# - -# -# Compiler: aarch64-libreelec-linux-gnueabi-gcc-10.3.0 (GCC) 10.3.0 -# -CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=100300 -CONFIG_CLANG_VERSION=0 -CONFIG_CC_HAS_ASM_GOTO=y -CONFIG_IRQ_WORK=y -CONFIG_BUILDTIME_EXTABLE_SORT=y -CONFIG_THREAD_INFO_IN_TASK=y - -# -# General setup -# -CONFIG_INIT_ENV_ARG_LIMIT=32 -# CONFIG_COMPILE_TEST is not set -CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set -CONFIG_BUILD_SALT="" -CONFIG_HAVE_KERNEL_GZIP=y -CONFIG_HAVE_KERNEL_LZ4=y -CONFIG_KERNEL_GZIP=y -# CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_HOSTNAME="@DEVICENAME@" -CONFIG_SWAP=y CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -# CONFIG_POSIX_MQUEUE is not set -CONFIG_CROSS_MEMORY_ATTACH=y -# CONFIG_USELIB is not set -# CONFIG_AUDIT is not set -CONFIG_HAVE_ARCH_AUDITSYSCALL=y - -# -# IRQ subsystem -# -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_SHOW_LEVEL=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_GENERIC_IRQ_CHIP=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_HANDLE_DOMAIN_IRQ=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_SPARSE_IRQ=y -# CONFIG_GENERIC_IRQ_DEBUGFS is not set -CONFIG_GENERIC_IRQ_MULTI_HANDLER=y -CONFIG_ARCH_CLOCKSOURCE_DATA=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_ARCH_HAS_TICK_BROADCAST=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y - -# -# Timers subsystem -# -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ_COMMON=y -# CONFIG_HZ_PERIODIC is not set +CONFIG_POSIX_MQUEUE=y +CONFIG_WATCH_QUEUE=y +# CONFIG_CROSS_MEMORY_ATTACH is not set +CONFIG_USELIB=y CONFIG_NO_HZ_IDLE=y -# CONFIG_NO_HZ_FULL is not set -CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y -# CONFIG_PREEMPT_NONE is not set -CONFIG_PREEMPT_VOLUNTARY=y -# CONFIG_PREEMPT is not set - -# -# CPU/Task time and stats accounting -# -CONFIG_TICK_CPU_ACCOUNTING=y -# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set -# CONFIG_IRQ_TIME_ACCOUNTING is not set -# CONFIG_BSD_PROCESS_ACCT is not set -# CONFIG_TASKSTATS is not set -# CONFIG_PSI is not set -CONFIG_CPU_ISOLATION=y - -# -# RCU Subsystem -# -CONFIG_TREE_RCU=y -# CONFIG_RCU_EXPERT is not set -CONFIG_SRCU=y -CONFIG_TREE_SRCU=y -CONFIG_RCU_STALL_COMMON=y -CONFIG_RCU_NEED_SEGCBLIST=y -CONFIG_BUILD_BIN2C=y +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set +CONFIG_PREEMPT=y +CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y -# CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 -CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 -CONFIG_GENERIC_SCHED_CLOCK=y - -# -# Scheduler features -# -CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y -CONFIG_ARCH_SUPPORTS_INT128=y -CONFIG_CGROUPS=y -# CONFIG_MEMCG is not set +CONFIG_MEMCG=y CONFIG_BLK_CGROUP=y -# CONFIG_DEBUG_BLK_CGROUP is not set -CONFIG_CGROUP_SCHED=y -CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y -# CONFIG_RT_GROUP_SCHED is not set -# CONFIG_CGROUP_PIDS is not set -# CONFIG_CGROUP_RDMA is not set +CONFIG_RT_GROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y -CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y -# CONFIG_CGROUP_DEBUG is not set -CONFIG_SOCK_CGROUP_DATA=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -CONFIG_UTS_NS=y -CONFIG_IPC_NS=y -CONFIG_USER_NS=y -CONFIG_PID_NS=y -CONFIG_NET_NS=y -# CONFIG_CHECKPOINT_RESTORE is not set -# CONFIG_SCHED_AUTOGROUP is not set -# CONFIG_SCHED_TUNE is not set -# CONFIG_SYSFS_DEPRECATED is not set +CONFIG_SCHED_AUTOGROUP=y CONFIG_RELAY=y -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_INITRAMFS_ROOT_UID=0 -CONFIG_INITRAMFS_ROOT_GID=0 -CONFIG_RD_GZIP=y -CONFIG_RD_BZIP2=y -CONFIG_RD_LZMA=y -CONFIG_RD_XZ=y -CONFIG_RD_LZO=y -CONFIG_RD_LZ4=y -CONFIG_INITRAMFS_COMPRESSION=".gz" -# CONFIG_INITRD_ASYNC is not set -# CONFIG_ROCKCHIP_ONE_INITRD is not set -CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_SYSCTL=y -CONFIG_HAVE_UID16=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_BPF=y +CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" +CONFIG_INITRAMFS_COMPRESSION_LZO=y +CONFIG_BOOT_CONFIG=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_EXPERT=y -CONFIG_UID16=y -CONFIG_MULTIUSER=y -# CONFIG_SGETMASK_SYSCALL is not set -CONFIG_SYSFS_SYSCALL=y -# CONFIG_SYSCTL_SYSCALL is not set -CONFIG_FHANDLE=y -CONFIG_POSIX_TIMERS=y -CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y -CONFIG_BUG=y -CONFIG_ELF_CORE=y -CONFIG_BASE_FULL=y -CONFIG_FUTEX=y -CONFIG_FUTEX_PI=y -CONFIG_EPOLL=y -CONFIG_SIGNALFD=y -CONFIG_TIMERFD=y -CONFIG_EVENTFD=y -CONFIG_SHMEM=y -CONFIG_AIO=y -CONFIG_ADVISE_SYSCALLS=y -CONFIG_MEMBARRIER=y -CONFIG_KALLSYMS=y -# CONFIG_KALLSYMS_ALL is not set -CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_SYSCALL is not set -# CONFIG_USERFAULTFD is not set -CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y -CONFIG_RSEQ=y -# CONFIG_DEBUG_RSEQ is not set -CONFIG_EMBEDDED=y -CONFIG_HAVE_PERF_EVENTS=y -# CONFIG_PC104 is not set - -# -# Kernel Performance Events And Counters -# -# CONFIG_PERF_EVENTS is not set -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_SLUB_SYSFS=y -CONFIG_SLUB_DEBUG=y -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -CONFIG_SLUB_CPU_PARTIAL=y -CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_SGETMASK_SYSCALL=y +CONFIG_KALLSYMS_ALL=y CONFIG_PROFILING=y -CONFIG_TRACEPOINTS=y -CONFIG_ARM64=y -CONFIG_64BIT=y -CONFIG_MMU=y -CONFIG_ARM64_PAGE_SHIFT=12 -CONFIG_ARM64_CONT_SHIFT=4 -CONFIG_ARCH_MMAP_RND_BITS_MIN=18 -CONFIG_ARCH_MMAP_RND_BITS_MAX=24 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_RWSEM_XCHGADD_ALGORITHM=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_HWEIGHT=y -CONFIG_GENERIC_CSUM=y -CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_ZONE_DMA32=y -CONFIG_HAVE_GENERIC_GUP=y -CONFIG_SMP=y -CONFIG_KERNEL_MODE_NEON=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_PGTABLE_LEVELS=3 -CONFIG_ARCH_SUPPORTS_UPROBES=y -CONFIG_ARCH_PROC_KCORE_TEXT=y - -# -# Platform selection -# -# CONFIG_ARCH_ACTIONS is not set -# CONFIG_ARCH_SUNXI is not set -# CONFIG_ARCH_ALPINE is not set -# CONFIG_ARCH_BCM2835 is not set -# CONFIG_ARCH_BCM_IPROC is not set -# CONFIG_ARCH_BERLIN is not set -# CONFIG_ARCH_BRCMSTB is not set -# CONFIG_ARCH_EXYNOS is not set -# CONFIG_ARCH_K3 is not set -# CONFIG_ARCH_LAYERSCAPE is not set -# CONFIG_ARCH_LG1K is not set -# CONFIG_ARCH_HISI is not set -# CONFIG_ARCH_MEDIATEK is not set -# CONFIG_ARCH_MESON is not set -# CONFIG_ARCH_MVEBU is not set -# CONFIG_ARCH_QCOM is not set -# CONFIG_ARCH_REALTEK is not set CONFIG_ARCH_ROCKCHIP=y -# CONFIG_ARCH_SEATTLE is not set -# CONFIG_ARCH_SYNQUACER is not set -# CONFIG_ARCH_RENESAS is not set -# CONFIG_ARCH_STRATIX10 is not set -# CONFIG_ARCH_TEGRA is not set -# CONFIG_ARCH_SPRD is not set -# CONFIG_ARCH_THUNDER is not set -# CONFIG_ARCH_THUNDER2 is not set -# CONFIG_ARCH_UNIPHIER is not set -# CONFIG_ARCH_VEXPRESS is not set -# CONFIG_ARCH_XGENE is not set -# CONFIG_ARCH_ZX is not set -# CONFIG_ARCH_ZYNQMP is not set - -# -# Bus support -# -CONFIG_PCI=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_DOMAINS_GENERIC=y -CONFIG_PCI_SYSCALL=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCIEAER=y -# CONFIG_PCIEAER_INJECT is not set -# CONFIG_PCIE_ECRC is not set -CONFIG_PCIEASPM=y -# CONFIG_PCIEASPM_DEBUG is not set -CONFIG_PCIEASPM_DEFAULT=y -# CONFIG_PCIEASPM_POWERSAVE is not set -# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set -# CONFIG_PCIEASPM_PERFORMANCE is not set -CONFIG_PCIE_PME=y -# CONFIG_PCIE_DPC is not set -# CONFIG_PCIE_PTM is not set -CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y -CONFIG_PCI_QUIRKS=y -# CONFIG_PCI_DEBUG is not set -# CONFIG_PCI_STUB is not set -# CONFIG_PCI_IOV is not set -# CONFIG_PCI_PRI is not set -# CONFIG_PCI_PASID is not set -# CONFIG_HOTPLUG_PCI is not set - -# -# PCI controller drivers -# - -# -# Cadence PCIe controllers support -# -# CONFIG_PCIE_CADENCE_HOST is not set -# CONFIG_PCI_FTPCI100 is not set -# CONFIG_PCI_HOST_GENERIC is not set -# CONFIG_PCIE_XILINX is not set -# CONFIG_PCI_XGENE is not set -# CONFIG_PCI_HOST_THUNDER_PEM is not set -# CONFIG_PCI_HOST_THUNDER_ECAM is not set -# CONFIG_PCIE_ROCKCHIP_HOST is not set -# CONFIG_ROCKCHIP_PCIE_DMA_OBJ is not set - -# -# DesignWare PCI Core Support -# -CONFIG_PCIE_DW=y -CONFIG_PCIE_DW_HOST=y -# CONFIG_PCIE_DW_PLAT_HOST is not set -CONFIG_PCIE_DW_ROCKCHIP=y -# CONFIG_PCI_HISI is not set -# CONFIG_PCIE_KIRIN is not set - -# -# PCI Endpoint -# -# CONFIG_PCI_ENDPOINT is not set - -# -# PCI switch controller drivers -# -# CONFIG_PCI_SW_SWITCHTEC is not set - -# -# Kernel Features -# - -# -# ARM errata workarounds via the alternatives framework -# -# CONFIG_ARM64_ERRATUM_826319 is not set -# CONFIG_ARM64_ERRATUM_827319 is not set -# CONFIG_ARM64_ERRATUM_824069 is not set -# CONFIG_ARM64_ERRATUM_819472 is not set -# CONFIG_ARM64_ERRATUM_832075 is not set -CONFIG_ARM64_ERRATUM_845719=y -CONFIG_ARM64_ERRATUM_843419=y -CONFIG_ARM64_ERRATUM_1024718=y -CONFIG_ARM64_ERRATUM_1463225=y -CONFIG_ARM64_ERRATUM_1542419=y # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set -CONFIG_CAVIUM_ERRATUM_27456=y -CONFIG_CAVIUM_ERRATUM_30115=y -CONFIG_QCOM_FALKOR_ERRATUM_1003=y -CONFIG_QCOM_FALKOR_ERRATUM_1009=y -CONFIG_QCOM_QDF2400_ERRATUM_0065=y -CONFIG_SOCIONEXT_SYNQUACER_PREITS=y -CONFIG_HISILICON_ERRATUM_161600802=y -CONFIG_QCOM_FALKOR_ERRATUM_E1041=y -CONFIG_ARM64_4K_PAGES=y -# CONFIG_ARM64_16K_PAGES is not set -# CONFIG_ARM64_64K_PAGES is not set -CONFIG_ARM64_VA_BITS_39=y -# CONFIG_ARM64_VA_BITS_48 is not set -CONFIG_ARM64_VA_BITS=39 -CONFIG_ARM64_PA_BITS_48=y -CONFIG_ARM64_PA_BITS=48 -# CONFIG_CPU_BIG_ENDIAN is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_CAVIUM_ERRATUM_30115 is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_FUJITSU_ERRATUM_010001 is not set +# CONFIG_HISILICON_ERRATUM_161600802 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set +# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set +# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set +# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set CONFIG_SCHED_MC=y -# CONFIG_SCHED_SMT is not set -CONFIG_NR_CPUS=8 -CONFIG_HOTPLUG_CPU=y -CONFIG_ARCH_NR_GPIO=256 -# CONFIG_NUMA is not set -CONFIG_HOLES_IN_ZONE=y -# CONFIG_HZ_100 is not set -# CONFIG_HZ_250 is not set -CONFIG_HZ_300=y -# CONFIG_HZ_1000 is not set -CONFIG_HZ=300 -CONFIG_SCHED_HRTICK=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y -CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_FLATMEM_ENABLE=y -CONFIG_HAVE_ARCH_PFN_VALID=y -CONFIG_SYS_SUPPORTS_HUGETLBFS=y -CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -# CONFIG_ARM64_DMA_USE_IOMMU is not set -CONFIG_SECCOMP=y -# CONFIG_PARAVIRT is not set -# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set -# CONFIG_KEXEC is not set -# CONFIG_CRASH_DUMP is not set -# CONFIG_XEN is not set -CONFIG_FORCE_MAX_ZONEORDER=11 -CONFIG_UNMAP_KERNEL_AT_EL0=y -CONFIG_HARDEN_BRANCH_PREDICTOR=y -CONFIG_HARDEN_EL2_VECTORS=y -CONFIG_ARM64_SSBD=y -CONFIG_ARM64_TAGGED_ADDR_ABI=y +CONFIG_SCHED_SMT=y +CONFIG_NR_CPUS=4 +CONFIG_ARM64_SW_TTBR0_PAN=y +CONFIG_COMPAT=y CONFIG_ARMV8_DEPRECATED=y -CONFIG_SWP_EMULATION=y -CONFIG_CP15_BARRIER_EMULATION=y -CONFIG_SETEND_EMULATION=y -# CONFIG_ARM64_SW_TTBR0_PAN is not set - -# -# ARMv8.1 architectural features -# -CONFIG_ARM64_HW_AFDBM=y -CONFIG_ARM64_PAN=y -CONFIG_ARM64_LSE_ATOMICS=y -CONFIG_ARM64_VHE=y - -# -# ARMv8.2 architectural features -# -CONFIG_ARM64_UAO=y -# CONFIG_ARM64_PMEM is not set -CONFIG_ARM64_RAS_EXTN=y -CONFIG_ARM64_SVE=y -CONFIG_ARM64_MODULE_PLTS=y -# CONFIG_RANDOMIZE_BASE is not set - -# -# Boot options -# -CONFIG_CMDLINE="" +CONFIG_ARM64_PMEM=y +# CONFIG_ARM64_BTI is not set +CONFIG_RANDOMIZE_BASE=y # CONFIG_EFI is not set -CONFIG_COMPAT=y -CONFIG_KUSER_HELPERS=y -CONFIG_SYSVIPC_COMPAT=y - -# -# Power management options -# -CONFIG_SUSPEND=y -CONFIG_SUSPEND_FREEZER=y -# CONFIG_SUSPEND_SKIP_SYNC is not set -CONFIG_HAS_WAKELOCK=y -CONFIG_WAKELOCK=y -# CONFIG_HIBERNATION is not set -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -# CONFIG_PM_AUTOSLEEP is not set -# CONFIG_PM_WAKELOCKS is not set -CONFIG_PM=y -CONFIG_PM_DEBUG=y -CONFIG_PM_ADVANCED_DEBUG=y -# CONFIG_PM_TEST_SUSPEND is not set -CONFIG_PM_SLEEP_DEBUG=y -# CONFIG_DPM_WATCHDOG is not set -CONFIG_PM_CLK=y -CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_SUSPEND_SKIP_SYNC=y +CONFIG_PM_AUTOSLEEP=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y -CONFIG_PM_GENERIC_DOMAINS_SLEEP=y -CONFIG_PM_GENERIC_DOMAINS_OF=y -CONFIG_CPU_PM=y CONFIG_ENERGY_MODEL=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y - -# -# CPU Power Management -# - -# -# CPU Idle -# CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y -# CONFIG_CPU_IDLE_GOV_LADDER is not set -CONFIG_CPU_IDLE_GOV_MENU=y -CONFIG_DT_IDLE_STATES=y - -# -# ARM CPU Idle Drivers -# -CONFIG_ARM_CPUIDLE=y - -# -# CPU Frequency scaling -# +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_ARM_PSCI_CPUIDLE=y CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_GOV_ATTR_SET=y -CONFIG_CPU_FREQ_GOV_COMMON=y -# CONFIG_CPU_FREQ_STAT is not set -# CONFIG_CPU_FREQ_TIMES is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y -CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_INTERACTIVE=y - -# -# CPU frequency scaling drivers -# CONFIG_CPUFREQ_DT=y -CONFIG_CPUFREQ_DT_PLATDEV=y -# CONFIG_CPUFREQ_DUMMY is not set -# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set -CONFIG_ARM_ROCKCHIP_CPUFREQ=y -# CONFIG_ARM_SCMI_CPUFREQ is not set -# CONFIG_QORIQ_CPUFREQ is not set - -# -# Firmware Drivers -# -CONFIG_ARM_PSCI_FW=y -# CONFIG_ARM_PSCI_CHECKER is not set -CONFIG_ARM_SCMI_PROTOCOL=y -CONFIG_ARM_SCMI_POWER_DOMAIN=y -# CONFIG_ARM_SCPI_PROTOCOL is not set -# CONFIG_ARM_SDE_INTERFACE is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_ROCKCHIP_SIP=y -CONFIG_HAVE_ARM_SMCCC=y -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# Tegra firmware driver -# -# CONFIG_VIRTUALIZATION is not set -CONFIG_ARM64_CRYPTO=y -CONFIG_CRYPTO_SHA256_ARM64=y -# CONFIG_CRYPTO_SHA512_ARM64 is not set -CONFIG_CRYPTO_SHA1_ARM64_CE=y -CONFIG_CRYPTO_SHA2_ARM64_CE=y -# CONFIG_CRYPTO_SHA512_ARM64_CE is not set -# CONFIG_CRYPTO_SHA3_ARM64 is not set -# CONFIG_CRYPTO_SM3_ARM64_CE is not set -# CONFIG_CRYPTO_SM4_ARM64_CE is not set -CONFIG_CRYPTO_GHASH_ARM64_CE=y -# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set -# CONFIG_CRYPTO_CRC32_ARM64_CE is not set -CONFIG_CRYPTO_AES_ARM64=y -CONFIG_CRYPTO_AES_ARM64_CE=y -CONFIG_CRYPTO_AES_ARM64_CE_CCM=y -CONFIG_CRYPTO_AES_ARM64_CE_BLK=y -# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set -# CONFIG_CRYPTO_CHACHA20_NEON is not set -# CONFIG_CRYPTO_POLY1305_NEON is not set -# CONFIG_CRYPTO_AES_ARM64_BS is not set - -# -# General architecture-dependent options -# -# CONFIG_KPROBES is not set -# CONFIG_JUMP_LABEL is not set -CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y -CONFIG_HAVE_KPROBES=y -CONFIG_HAVE_KRETPROBES=y -CONFIG_HAVE_NMI=y -CONFIG_HAVE_ARCH_TRACEHOOK=y -CONFIG_HAVE_DMA_CONTIGUOUS=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_IDLE_POLL_SETUP=y -CONFIG_ARCH_HAS_FORTIFY_SOURCE=y -CONFIG_ARCH_HAS_SET_MEMORY=y -CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y -CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y -CONFIG_HAVE_RSEQ=y -CONFIG_HAVE_CLK=y -CONFIG_HAVE_PERF_REGS=y -CONFIG_HAVE_PERF_USER_STACK_DUMP=y -CONFIG_HAVE_ARCH_JUMP_LABEL=y -CONFIG_HAVE_RCU_TABLE_FREE=y -CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y -CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y -CONFIG_HAVE_CMPXCHG_LOCAL=y -CONFIG_HAVE_CMPXCHG_DOUBLE=y -CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y -CONFIG_HAVE_ARCH_SECCOMP_FILTER=y -CONFIG_SECCOMP_FILTER=y -CONFIG_HAVE_STACKPROTECTOR=y -CONFIG_CC_HAS_STACKPROTECTOR_NONE=y -CONFIG_STACKPROTECTOR=y -CONFIG_STACKPROTECTOR_STRONG=y -CONFIG_ARCH_SUPPORTS_LTO_CLANG=y -CONFIG_ARCH_SUPPORTS_THINLTO=y -CONFIG_LTO_NONE=y -CONFIG_HAVE_CONTEXT_TRACKING=y -CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y -CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y -CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y -CONFIG_HAVE_ARCH_HUGE_VMAP=y -CONFIG_HAVE_MOD_ARCH_SPECIFIC=y -CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_ARCH_HAS_ELF_RANDOMIZE=y -CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_ARM_SCMI_CPUFREQ=y CONFIG_ARCH_MMAP_RND_BITS=18 -CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 -CONFIG_CLONE_BACKWARDS=y -CONFIG_OLD_SIGSUSPEND3=y -CONFIG_COMPAT_OLD_SIGACTION=y -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_HAVE_ARCH_VMAP_STACK=y -CONFIG_VMAP_STACK=y -CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y -CONFIG_STRICT_KERNEL_RWX=y -CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y -CONFIG_STRICT_MODULE_RWX=y -CONFIG_REFCOUNT_FULL=y -CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y - -# -# GCOV-based kernel profiling -# -# CONFIG_GCOV_KERNEL is not set -CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y -CONFIG_PLUGIN_HOSTCC="" -CONFIG_HAVE_GCC_PLUGINS=y -CONFIG_RT_MUTEXES=y -CONFIG_BASE_SMALL=0 +# CONFIG_GCC_PLUGINS is not set CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y -# CONFIG_MODVERSIONS is not set -# CONFIG_MODULE_SRCVERSION_ALL is not set -# CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set -# CONFIG_TRIM_UNUSED_KSYMS is not set -CONFIG_MODULES_TREE_LOOKUP=y -CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y -# CONFIG_BLK_DEV_BSGLIB is not set -# CONFIG_BLK_DEV_INTEGRITY is not set -# CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_DEV_THROTTLING is not set -# CONFIG_BLK_CMDLINE_PARSER is not set -# CONFIG_BLK_WBT is not set -# CONFIG_BLK_CGROUP_IOLATENCY is not set -CONFIG_BLK_DEBUG_FS=y -# CONFIG_BLK_SED_OPAL is not set -# CONFIG_BLK_INLINE_ENCRYPTION is not set - -# -# Partition Types -# CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -# CONFIG_AIX_PARTITION is not set -# CONFIG_OSF_PARTITION is not set -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_ATARI_PARTITION is not set -# CONFIG_MAC_PARTITION is not set -CONFIG_MSDOS_PARTITION=y -# CONFIG_BSD_DISKLABEL is not set -# CONFIG_MINIX_SUBPARTITION is not set -# CONFIG_SOLARIS_X86_PARTITION is not set -# CONFIG_UNIXWARE_DISKLABEL is not set -# CONFIG_LDM_PARTITION is not set -# CONFIG_SGI_PARTITION is not set -# CONFIG_ULTRIX_PARTITION is not set -# CONFIG_SUN_PARTITION is not set -# CONFIG_KARMA_PARTITION is not set -CONFIG_EFI_PARTITION=y -# CONFIG_SYSV68_PARTITION is not set -# CONFIG_CMDLINE_PARTITION is not set -CONFIG_BLOCK_COMPAT=y -CONFIG_BLK_MQ_PCI=y - -# -# IO Schedulers -# -CONFIG_IOSCHED_NOOP=y -CONFIG_IOSCHED_DEADLINE=y -CONFIG_IOSCHED_CFQ=y -# CONFIG_CFQ_GROUP_IOSCHED is not set -# CONFIG_DEFAULT_DEADLINE is not set -CONFIG_DEFAULT_CFQ=y -# CONFIG_DEFAULT_NOOP is not set -CONFIG_DEFAULT_IOSCHED="cfq" -CONFIG_MQ_IOSCHED_DEADLINE=y -CONFIG_MQ_IOSCHED_KYBER=y +CONFIG_MAC_PARTITION=y +# CONFIG_MQ_IOSCHED_KYBER is not set # CONFIG_IOSCHED_BFQ is not set -CONFIG_ASN1=y -CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y -CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_LOCK=y -CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y -CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y -CONFIG_ARCH_INLINE_READ_LOCK=y -CONFIG_ARCH_INLINE_READ_LOCK_BH=y -CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y -CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_READ_UNLOCK=y -CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y -CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y -CONFIG_ARCH_INLINE_WRITE_LOCK=y -CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y -CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y -CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y -CONFIG_UNINLINE_SPIN_UNLOCK=y -CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_ARCH_USE_QUEUED_RWLOCKS=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y -# CONFIG_GKI_HIDDEN_DRM_CONFIGS is not set -# CONFIG_GKI_HIDDEN_REGMAP_CONFIGS is not set -# CONFIG_GKI_HIDDEN_CRYPTO_CONFIGS is not set -# CONFIG_GKI_HIDDEN_SND_CONFIGS is not set -# CONFIG_GKI_HIDDEN_SND_SOC_CONFIGS is not set -# CONFIG_GKI_HIDDEN_GPIO_CONFIGS is not set -# CONFIG_GKI_HIDDEN_VIRTUAL_CONFIGS is not set -# CONFIG_GKI_LEGACY_WEXT_ALLCONFIG is not set -# CONFIG_GKI_HIDDEN_SOC_PM_CONFIGS is not set -# CONFIG_GKI_HIDDEN_VIDEOBUF2_CONFIGS is not set -# CONFIG_GKI_HIDDEN_USB_CONFIGS is not set -# CONFIG_GKI_HIDDEN_SOC_BUS_CONFIGS is not set -# CONFIG_GKI_HIDDEN_GPU_CONFIGS is not set -# CONFIG_GKI_HIDDEN_IRQ_CONFIGS is not set -# CONFIG_GKI_HACKS_TO_FIX is not set -CONFIG_FREEZER=y - -# -# Executable file formats -# -CONFIG_BINFMT_ELF=y -CONFIG_COMPAT_BINFMT_ELF=y -CONFIG_ELFCORE=y -CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y -CONFIG_BINFMT_SCRIPT=y CONFIG_BINFMT_MISC=y -CONFIG_COREDUMP=y - -# -# Memory Management options -# -CONFIG_SELECT_MEMORY_MODEL=y -# CONFIG_FLATMEM_MANUAL is not set -CONFIG_SPARSEMEM_MANUAL=y -CONFIG_SPARSEMEM=y -CONFIG_HAVE_MEMORY_PRESENT=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_HAVE_MEMBLOCK=y -CONFIG_NO_BOOTMEM=y -CONFIG_MEMORY_ISOLATION=y -CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_SLAB_MERGE_DEFAULT is not set +# CONFIG_SLUB_CPU_PARTIAL is not set +# CONFIG_COMPAT_BRK is not set # CONFIG_COMPACTION is not set -CONFIG_MIGRATION=y -CONFIG_PHYS_ADDR_T_64BIT=y -# CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 -CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y -# CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set -# CONFIG_CLEANCACHE is not set -# CONFIG_FRONTSWAP is not set -CONFIG_CMA=y -# CONFIG_CMA_DEBUG is not set -# CONFIG_CMA_DEBUGFS is not set -CONFIG_CMA_AREAS=7 -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -CONFIG_ZSMALLOC=y -# CONFIG_PGTABLE_MAPPING is not set -# CONFIG_ZSMALLOC_STAT is not set -# CONFIG_MM_EVENT_STAT is not set -CONFIG_GENERIC_EARLY_IOREMAP=y -# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set -# CONFIG_IDLE_PAGE_TRACKING is not set -CONFIG_FRAME_VECTOR=y -# CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set -CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_VM_EVENT_COUNTERS is not set CONFIG_NET=y -CONFIG_COMPAT_NETLINK_MESSAGES=y -CONFIG_NET_INGRESS=y - -# -# Networking options -# CONFIG_PACKET=y -CONFIG_PACKET_DIAG=y CONFIG_UNIX=y -CONFIG_UNIX_DIAG=y -# CONFIG_TLS is not set -CONFIG_XFRM=y -CONFIG_XFRM_ALGO=y +CONFIG_UNIX_DIAG=m CONFIG_XFRM_USER=y -# CONFIG_XFRM_INTERFACE is not set -# CONFIG_XFRM_SUB_POLICY is not set -CONFIG_XFRM_MIGRATE=y -# CONFIG_XFRM_STATISTICS is not set -CONFIG_XFRM_IPCOMP=m -CONFIG_NET_KEY=m -CONFIG_NET_KEY_MIGRATE=y +CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_FIB_TRIE_STATS=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y -CONFIG_IP_ROUTE_CLASSID=y -CONFIG_IP_PNP=y -# CONFIG_IP_PNP_DHCP is not set -# CONFIG_IP_PNP_BOOTP is not set -# CONFIG_IP_PNP_RARP is not set CONFIG_NET_IPIP=m CONFIG_NET_IPGRE_DEMUX=m -CONFIG_NET_IP_TUNNEL=m -# CONFIG_NET_IPGRE is not set -CONFIG_IP_MROUTE_COMMON=y +CONFIG_NET_IPGRE=m CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y -CONFIG_SYN_COOKIES=y -# CONFIG_NET_IPVTI is not set -CONFIG_NET_UDP_TUNNEL=m -CONFIG_NET_FOU=m -# CONFIG_NET_FOU_IP_TUNNELS is not set -CONFIG_INET_AH=m -CONFIG_INET_ESP=m -# CONFIG_INET_ESP_OFFLOAD is not set -CONFIG_INET_IPCOMP=m -CONFIG_INET_XFRM_TUNNEL=m -CONFIG_INET_TUNNEL=m -CONFIG_INET_XFRM_MODE_TRANSPORT=m -CONFIG_INET_XFRM_MODE_TUNNEL=m -CONFIG_INET_XFRM_MODE_BEET=m -CONFIG_INET_DIAG=m -CONFIG_INET_TCP_DIAG=m -# CONFIG_INET_UDP_DIAG is not set -# CONFIG_INET_RAW_DIAG is not set -# CONFIG_INET_DIAG_DESTROY is not set +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y -CONFIG_TCP_CONG_BIC=m CONFIG_TCP_CONG_CUBIC=m -CONFIG_TCP_CONG_WESTWOOD=m -CONFIG_TCP_CONG_HTCP=m -# CONFIG_TCP_CONG_HSTCP is not set -# CONFIG_TCP_CONG_HYBLA is not set -# CONFIG_TCP_CONG_VEGAS is not set -# CONFIG_TCP_CONG_NV is not set -# CONFIG_TCP_CONG_SCALABLE is not set -# CONFIG_TCP_CONG_LP is not set -# CONFIG_TCP_CONG_VENO is not set -# CONFIG_TCP_CONG_YEAH is not set -# CONFIG_TCP_CONG_ILLINOIS is not set -# CONFIG_TCP_CONG_DCTCP is not set -# CONFIG_TCP_CONG_CDG is not set -# CONFIG_TCP_CONG_BBR is not set -CONFIG_DEFAULT_RENO=y -CONFIG_DEFAULT_TCP_CONG="reno" -# CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=m -# CONFIG_IPV6_ROUTER_PREF is not set -CONFIG_IPV6_OPTIMISTIC_DAD=y -CONFIG_INET6_AH=m -CONFIG_INET6_ESP=m -# CONFIG_INET6_ESP_OFFLOAD is not set -CONFIG_INET6_IPCOMP=m -CONFIG_IPV6_MIP6=m -CONFIG_IPV6_ILA=m -CONFIG_INET6_XFRM_TUNNEL=m -CONFIG_INET6_TUNNEL=m -CONFIG_INET6_XFRM_MODE_TRANSPORT=m -CONFIG_INET6_XFRM_MODE_TUNNEL=m -CONFIG_INET6_XFRM_MODE_BEET=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -# CONFIG_IPV6_VTI is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -CONFIG_IPV6_TUNNEL=m -# CONFIG_IPV6_GRE is not set -CONFIG_IPV6_FOU=m -CONFIG_IPV6_MULTIPLE_TABLES=y -# CONFIG_IPV6_SUBTREES is not set -CONFIG_IPV6_MROUTE=y -# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set -# CONFIG_IPV6_PIMSM_V2 is not set -# CONFIG_IPV6_SEG6_LWTUNNEL is not set -# CONFIG_IPV6_SEG6_HMAC is not set -CONFIG_NETWORK_SECMARK=y -CONFIG_NET_PTP_CLASSIFY=y -# CONFIG_NETWORK_PHY_TIMESTAMPING is not set -CONFIG_NETFILTER=n -CONFIG_NETFILTER_ADVANCED=n -CONFIG_BRIDGE_NETFILTER=n - -CONFIG_IP_SET=m -CONFIG_IP_SET_MAX=256 -# CONFIG_IP_SET_BITMAP_IP is not set -# CONFIG_IP_SET_BITMAP_IPMAC is not set -# CONFIG_IP_SET_BITMAP_PORT is not set -# CONFIG_IP_SET_HASH_IP is not set -# CONFIG_IP_SET_HASH_IPMARK is not set -# CONFIG_IP_SET_HASH_IPPORT is not set -# CONFIG_IP_SET_HASH_IPPORTIP is not set -# CONFIG_IP_SET_HASH_IPPORTNET is not set -# CONFIG_IP_SET_HASH_IPMAC is not set -# CONFIG_IP_SET_HASH_MAC is not set -# CONFIG_IP_SET_HASH_NETPORTNET is not set -# CONFIG_IP_SET_HASH_NET is not set -# CONFIG_IP_SET_HASH_NETNET is not set -# CONFIG_IP_SET_HASH_NETPORT is not set -# CONFIG_IP_SET_HASH_NETIFACE is not set -# CONFIG_IP_SET_LIST_SET is not set +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_CDG=m +CONFIG_TCP_MD5SIG=y +# CONFIG_IPV6 is not set +CONFIG_NETFILTER=y +CONFIG_BRIDGE_NETFILTER=y +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_PROCFS=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_TIMEOUT=y +CONFIG_NF_CONNTRACK_TIMESTAMP=y +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m +CONFIG_NF_TABLES=m +CONFIG_NFT_CT=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_QUEUE=m +CONFIG_NFT_REJECT=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +CONFIG_NETFILTER_XTABLES_COMPAT=y +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m +CONFIG_NETFILTER_XT_TARGET_TPROXY=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_L2TP=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_RECENT=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=y +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m CONFIG_IP_VS=m -# CONFIG_IP_VS_IPV6 is not set -# CONFIG_IP_VS_DEBUG is not set -CONFIG_IP_VS_TAB_BITS=12 - -# -# IPVS transport protocol load balancing support -# -# CONFIG_IP_VS_PROTO_TCP is not set -# CONFIG_IP_VS_PROTO_UDP is not set -# CONFIG_IP_VS_PROTO_ESP is not set -# CONFIG_IP_VS_PROTO_AH is not set -# CONFIG_IP_VS_PROTO_SCTP is not set - -# -# IPVS scheduler -# -# CONFIG_IP_VS_RR is not set -# CONFIG_IP_VS_WRR is not set -# CONFIG_IP_VS_LC is not set -# CONFIG_IP_VS_WLC is not set -# CONFIG_IP_VS_FO is not set -# CONFIG_IP_VS_OVF is not set -# CONFIG_IP_VS_LBLC is not set -# CONFIG_IP_VS_LBLCR is not set -# CONFIG_IP_VS_DH is not set -# CONFIG_IP_VS_SH is not set -# CONFIG_IP_VS_MH is not set -# CONFIG_IP_VS_SED is not set -# CONFIG_IP_VS_NQ is not set - -# -# IPVS SH scheduler -# -CONFIG_IP_VS_SH_TAB_BITS=8 - -# -# IPVS MH scheduler -# -CONFIG_IP_VS_MH_TAB_INDEX=12 - -# -# IPVS application helper -# -# CONFIG_IP_VS_NFCT is not set - -# -# IP: Netfilter Configuration -# -CONFIG_NF_DEFRAG_IPV4=m -CONFIG_NF_SOCKET_IPV4=m -CONFIG_NF_TPROXY_IPV4=m -# CONFIG_NF_TABLES_IPV4 is not set -# CONFIG_NF_TABLES_ARP is not set -CONFIG_NF_DUP_IPV4=m -# CONFIG_NF_LOG_ARP is not set +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m +CONFIG_IP_VS_NFCT=y +CONFIG_NF_LOG_ARP=m CONFIG_NF_LOG_IPV4=m -CONFIG_NF_REJECT_IPV4=m -CONFIG_NF_NAT_IPV4=m -CONFIG_NF_NAT_MASQUERADE_IPV4=y -CONFIG_NF_NAT_SNMP_BASIC=m -CONFIG_NF_NAT_PROTO_GRE=m -CONFIG_NF_NAT_PPTP=m -CONFIG_NF_NAT_H323=m -CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_RPFILTER=m CONFIG_IP_NF_MATCH_TTL=m -CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_SYNPROXY=m CONFIG_IP_NF_NAT=m @@ -1020,714 +275,158 @@ CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m -CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_TTL=m CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=y CONFIG_IP_NF_ARPTABLES=m -# CONFIG_IP_NF_ARPFILTER is not set -# CONFIG_IP_NF_ARP_MANGLE is not set - -# -# IPv6: Netfilter Configuration -# -CONFIG_NF_SOCKET_IPV6=m -CONFIG_NF_TPROXY_IPV6=m -# CONFIG_NF_TABLES_IPV6 is not set -CONFIG_NF_DUP_IPV6=m -CONFIG_NF_REJECT_IPV6=m -CONFIG_NF_LOG_IPV6=m -CONFIG_NF_NAT_IPV6=m -CONFIG_IP6_NF_IPTABLES=m -# CONFIG_IP6_NF_MATCH_AH is not set -# CONFIG_IP6_NF_MATCH_EUI64 is not set -# CONFIG_IP6_NF_MATCH_FRAG is not set -# CONFIG_IP6_NF_MATCH_OPTS is not set -# CONFIG_IP6_NF_MATCH_HL is not set -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -# CONFIG_IP6_NF_MATCH_MH is not set -# CONFIG_IP6_NF_MATCH_RT is not set -# CONFIG_IP6_NF_MATCH_SRH is not set -# CONFIG_IP6_NF_FILTER is not set -# CONFIG_IP6_NF_TARGET_SYNPROXY is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set -# CONFIG_IP6_NF_NAT is not set -CONFIG_NF_DEFRAG_IPV6=m -# CONFIG_NF_TABLES_BRIDGE is not set -# CONFIG_BRIDGE_NF_EBTABLES is not set -# CONFIG_BPFILTER is not set -# CONFIG_IP_DCCP is not set -# CONFIG_IP_SCTP is not set -# CONFIG_RDS is not set -# CONFIG_TIPC is not set -# CONFIG_ATM is not set -# CONFIG_L2TP is not set -CONFIG_STP=m -CONFIG_BRIDGE=m -CONFIG_BRIDGE_IGMP_SNOOPING=y -CONFIG_HAVE_NET_DSA=y -# CONFIG_NET_DSA is not set -# CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set -CONFIG_LLC=m -# CONFIG_LLC2 is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_PHONET is not set -# CONFIG_6LOWPAN is not set -# CONFIG_IEEE802154 is not set -# CONFIG_NET_SCHED is not set -# CONFIG_DCB is not set -# CONFIG_DNS_RESOLVER is not set -# CONFIG_BATMAN_ADV is not set -# CONFIG_OPENVSWITCH is not set -# CONFIG_VSOCKETS is not set -# CONFIG_NETLINK_DIAG is not set -# CONFIG_MPLS is not set -# CONFIG_NET_NSH is not set -# CONFIG_HSR is not set -# CONFIG_NET_SWITCHDEV is not set -# CONFIG_NET_L3_MASTER_DEV is not set -# CONFIG_NET_NCSI is not set -CONFIG_RPS=y -CONFIG_RFS_ACCEL=y -CONFIG_XPS=y -# CONFIG_CGROUP_NET_PRIO is not set -CONFIG_CGROUP_NET_CLASSID=y -CONFIG_NET_RX_BUSY_POLL=y -CONFIG_BQL=y -# CONFIG_BPF_JIT is not set -CONFIG_NET_FLOW_LIMIT=y - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -# CONFIG_NET_DROP_MONITOR is not set -# CONFIG_HAMRADIO is not set +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_NF_TABLES_BRIDGE=m +CONFIG_NFT_BRIDGE_META=m +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_NFLOG=m +CONFIG_BRIDGE=y +CONFIG_VLAN_8021Q=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_CODEL=y +CONFIG_NET_SCH_FQ_CODEL=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_CGROUP=y +CONFIG_DNS_RESOLVER=y +CONFIG_OPENVSWITCH=m +CONFIG_CGROUP_NET_PRIO=y CONFIG_CAN=y -CONFIG_CAN_RAW=y -CONFIG_CAN_BCM=y -CONFIG_CAN_GW=y - -# -# CAN Device Drivers -# -# CONFIG_CAN_VCAN is not set -# CONFIG_CAN_VXCAN is not set -# CONFIG_CAN_SLCAN is not set -CONFIG_CAN_DEV=y -CONFIG_CAN_CALC_BITTIMING=y -# CONFIG_CAN_GRCAN is not set -# CONFIG_CAN_XILINXCAN is not set -# CONFIG_CAN_C_CAN is not set -# CONFIG_CAN_CC770 is not set -# CONFIG_CAN_IFI_CANFD is not set -# CONFIG_CAN_M_CAN is not set -# CONFIG_CAN_PEAK_PCIEFD is not set -CONFIG_CAN_ROCKCHIP=y -CONFIG_CANFD_ROCKCHIP=y -# CONFIG_CAN_SJA1000 is not set -# CONFIG_CAN_SOFTING is not set - -# -# CAN SPI interfaces -# -# CONFIG_CAN_HI311X is not set -# CONFIG_CAN_MCP251X is not set - -# -# CAN USB interfaces -# -# CONFIG_CAN_8DEV_USB is not set -# CONFIG_CAN_EMS_USB is not set -# CONFIG_CAN_ESD_USB2 is not set -# CONFIG_CAN_GS_USB is not set -# CONFIG_CAN_KVASER_USB is not set -# CONFIG_CAN_MCBA_USB is not set -# CONFIG_CAN_PEAK_USB is not set -# CONFIG_CAN_UCAN is not set -# CONFIG_CAN_DEBUG_DEVICES is not set -CONFIG_BT=y -CONFIG_BT_BREDR=y +CONFIG_BT=m CONFIG_BT_RFCOMM=y -# CONFIG_BT_RFCOMM_TTY is not set -# CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=y CONFIG_BT_HS=y -CONFIG_BT_LE=y -# CONFIG_BT_LEDS is not set -# CONFIG_BT_SELFTEST is not set -CONFIG_BT_DEBUGFS=y - -# -# Bluetooth device drivers -# -CONFIG_BT_INTEL=y -CONFIG_BT_BCM=y -CONFIG_BT_RTL=y -CONFIG_BT_HCIBTUSB=y -# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set -CONFIG_BT_HCIBTUSB_BCM=y -CONFIG_BT_HCIBTUSB_RTL=y -# CONFIG_BT_HCIBTSDIO is not set -CONFIG_BT_HCIUART=y -CONFIG_BT_HCIUART_SERDEV=y -CONFIG_BT_HCIUART_H4=y -# CONFIG_BT_HCIUART_NOKIA is not set -# CONFIG_BT_HCIUART_BCSP is not set +CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_ATH3K=y -# CONFIG_BT_HCIUART_LL is not set -CONFIG_BT_HCIUART_3WIRE=y -# CONFIG_BT_HCIUART_INTEL is not set -CONFIG_BT_HCIUART_BCM=y -# CONFIG_BT_HCIUART_QCA is not set -# CONFIG_BT_HCIUART_AG6XX is not set -# CONFIG_BT_HCIUART_MRVL is not set -# CONFIG_BT_HCIBCM203X is not set -# CONFIG_BT_HCIBPA10X is not set -CONFIG_BT_HCIBFUSB=y -CONFIG_BT_HCIVHCI=y -CONFIG_BT_MRVL=y -CONFIG_BT_MRVL_SDIO=y -# CONFIG_BT_ATH3K is not set -# CONFIG_BT_MTKUART is not set -# CONFIG_AF_RXRPC is not set -# CONFIG_AF_KCM is not set -CONFIG_FIB_RULES=y -CONFIG_WIRELESS=y -CONFIG_WIRELESS_EXT=y -CONFIG_WEXT_CORE=y -CONFIG_WEXT_PROC=y -CONFIG_WEXT_PRIV=y -CONFIG_CFG80211=y -CONFIG_NL80211_TESTMODE=y -# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set -# CONFIG_CFG80211_CERTIFICATION_ONUS is not set -CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y -CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y -CONFIG_CFG80211_DEFAULT_PS=y -CONFIG_CFG80211_DEBUGFS=y -CONFIG_CFG80211_CRDA_SUPPORT=y -CONFIG_CFG80211_WEXT=y -CONFIG_MAC80211=y -CONFIG_MAC80211_HAS_RC=y -CONFIG_MAC80211_RC_MINSTREL=y -CONFIG_MAC80211_RC_MINSTREL_HT=y -# CONFIG_MAC80211_RC_MINSTREL_VHT is not set -CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y -CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" -# CONFIG_MAC80211_MESH is not set -CONFIG_MAC80211_LEDS=y -CONFIG_MAC80211_DEBUGFS=y -# CONFIG_MAC80211_MESSAGE_TRACING is not set -CONFIG_MAC80211_DEBUG_MENU=y -# CONFIG_MAC80211_NOINLINE is not set -CONFIG_MAC80211_VERBOSE_DEBUG=y -# CONFIG_MAC80211_MLME_DEBUG is not set -# CONFIG_MAC80211_STA_DEBUG is not set -# CONFIG_MAC80211_HT_DEBUG is not set -# CONFIG_MAC80211_OCB_DEBUG is not set -# CONFIG_MAC80211_IBSS_DEBUG is not set -# CONFIG_MAC80211_PS_DEBUG is not set -# CONFIG_MAC80211_TDLS_DEBUG is not set -# CONFIG_MAC80211_DEBUG_COUNTERS is not set -CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 -# CONFIG_WIMAX is not set -CONFIG_RFKILL=y -CONFIG_RFKILL_LEDS=y -# CONFIG_RFKILL_INPUT is not set -# CONFIG_RFKILL_GPIO is not set -CONFIG_RFKILL_RK=y -# CONFIG_NET_9P is not set -# CONFIG_CAIF is not set -# CONFIG_CEPH_LIB is not set -# CONFIG_NFC is not set -# CONFIG_PSAMPLE is not set -# CONFIG_NET_IFE is not set -CONFIG_LWTUNNEL=y -CONFIG_LWTUNNEL_BPF=y -CONFIG_DST_CACHE=y -CONFIG_GRO_CELLS=y -# CONFIG_NET_DEVLINK is not set -CONFIG_MAY_USE_DEVLINK=y -# CONFIG_FAILOVER is not set -CONFIG_HAVE_EBPF_JIT=y - -# -# Device Drivers -# -CONFIG_ARM_AMBA=y - -# -# Generic Driver Options -# +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIVHCI=m +CONFIG_BT_MRVL=m +CONFIG_BT_MRVL_SDIO=m +CONFIG_CFG80211=m +# CONFIG_CFG80211_DEFAULT_PS is not set +# CONFIG_CFG80211_CRDA_SUPPORT is not set +CONFIG_MAC80211=m +CONFIG_MAC80211_MESH=y +CONFIG_RFKILL=m +CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=m +# CONFIG_ETHTOOL_NETLINK is not set +CONFIG_PCI=y +CONFIG_PCIEPORTBUS=y +CONFIG_PCIEAER=y +CONFIG_PCIE_ROCKCHIP_HOST=y +CONFIG_PCIE_ROCKCHIP_DW_HOST=y CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y -CONFIG_STANDALONE=y -CONFIG_PREVENT_FIRMWARE_BUILD=y - -# -# Firmware loader -# -CONFIG_FW_LOADER=y -CONFIG_EXTRA_FIRMWARE="" -# CONFIG_FW_LOADER_USER_HELPER is not set -CONFIG_FW_CACHE=y -CONFIG_WANT_DEV_COREDUMP=y -CONFIG_ALLOW_DEV_COREDUMP=y -CONFIG_DEV_COREDUMP=y -# CONFIG_DEBUG_DRIVER is not set +CONFIG_DEVTMPFS_SAFE=y +CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +# CONFIG_ALLOW_DEV_COREDUMP is not set CONFIG_DEBUG_DEVRES=y -# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set -# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_REGMAP=y -CONFIG_REGMAP_I2C=y -CONFIG_REGMAP_SPI=y -CONFIG_REGMAP_MMIO=y -CONFIG_REGMAP_IRQ=y -# CONFIG_MALI_MEMORY_GROUP_MANAGER is not set -CONFIG_DMA_SHARED_BUFFER=y -# CONFIG_DMA_FENCE_TRACE is not set -CONFIG_DMA_CMA=y - -# -# Default contiguous memory area size: -# -CONFIG_CMA_SIZE_MBYTES=16 -CONFIG_CMA_SIZE_SEL_MBYTES=y -# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set -# CONFIG_CMA_SIZE_SEL_MIN is not set -# CONFIG_CMA_SIZE_SEL_MAX is not set -CONFIG_CMA_ALIGNMENT=8 -CONFIG_GENERIC_ARCH_TOPOLOGY=y - -# -# Bus devices -# -# CONFIG_BRCMSTB_GISB_ARB is not set -# CONFIG_SIMPLE_PM_BUS is not set -# CONFIG_VEXPRESS_CONFIG is not set CONFIG_CONNECTOR=y -CONFIG_PROC_EVENTS=y -# CONFIG_GNSS is not set +CONFIG_ARM_SCMI_PROTOCOL=y +CONFIG_ARM_SCMI_POWER_CONTROL=y +CONFIG_ARM_SCPI_PROTOCOL=y +CONFIG_ARM_FFA_TRANSPORT=y CONFIG_MTD=y -# CONFIG_MTD_TESTS is not set -# CONFIG_MTD_REDBOOT_PARTS is not set -CONFIG_MTD_CMDLINE_PARTS=y -# CONFIG_MTD_AFS_PARTS is not set -CONFIG_MTD_OF_PARTS=y -# CONFIG_MTD_AR7_PARTS is not set - -# -# Partition parsers -# - -# -# User Modules And Translation Layers -# -CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y -# CONFIG_FTL is not set -# CONFIG_NFTL is not set -# CONFIG_INFTL is not set -# CONFIG_RFD_FTL is not set -# CONFIG_SSFDC is not set -# CONFIG_SM_FTL is not set -# CONFIG_MTD_OOPS is not set -# CONFIG_MTD_SWAP is not set -# CONFIG_MTD_PARTITIONED_MASTER is not set - -# -# RAM/ROM/Flash chip drivers -# -# CONFIG_MTD_CFI is not set -# CONFIG_MTD_JEDECPROBE is not set -CONFIG_MTD_MAP_BANK_WIDTH_1=y -CONFIG_MTD_MAP_BANK_WIDTH_2=y -CONFIG_MTD_MAP_BANK_WIDTH_4=y -CONFIG_MTD_CFI_I1=y -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_ROM is not set -# CONFIG_MTD_ABSENT is not set - -# -# Mapping drivers for chip access -# -# CONFIG_MTD_COMPLEX_MAPPINGS is not set -# CONFIG_MTD_INTEL_VR_NOR is not set -# CONFIG_MTD_PLATRAM is not set - -# -# Self-contained MTD device drivers -# -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_DATAFLASH is not set -# CONFIG_MTD_MCHP23K256 is not set -# CONFIG_MTD_SST25L is not set -# CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_PHRAM is not set -# CONFIG_MTD_MTDRAM is not set -# CONFIG_MTD_BLOCK2MTD is not set - -# -# Disk-On-Chip Device Drivers -# -# CONFIG_MTD_DOCG3 is not set -# CONFIG_MTD_ONENAND is not set -# CONFIG_MTD_NAND is not set -# CONFIG_MTD_SPI_NAND is not set - -# -# LPDDR & LPDDR2 PCM memory drivers -# -# CONFIG_MTD_LPDDR is not set -# CONFIG_MTD_SPI_NOR is not set -CONFIG_MTD_UBI=y -CONFIG_MTD_UBI_WL_THRESHOLD=4096 -CONFIG_MTD_UBI_BEB_LIMIT=20 -# CONFIG_MTD_UBI_FASTMAP is not set -# CONFIG_MTD_UBI_GLUEBI is not set -# CONFIG_MTD_UBI_BLOCK is not set -CONFIG_DTC=y -CONFIG_OF=y -CONFIG_DTC_SYMBOLS=y -# CONFIG_DTC_OMIT_DISABLED is not set -# CONFIG_DTC_OMIT_EMPTY is not set -# CONFIG_OF_UNITTEST is not set -CONFIG_OF_FLATTREE=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_KOBJ=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_IRQ=y -CONFIG_OF_NET=y -CONFIG_OF_MDIO=y -CONFIG_OF_RESERVED_MEM=y -# CONFIG_OF_OVERLAY is not set -# CONFIG_PARPORT is not set -CONFIG_BLK_DEV=y -# CONFIG_BLK_DEV_NULL_BLK is not set -CONFIG_CDROM=y -# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +CONFIG_MTD_SPI_NOR=y +CONFIG_OF_OVERLAY=y CONFIG_ZRAM=y -# CONFIG_ZRAM_WRITEBACK is not set -# CONFIG_ZRAM_MEMORY_TRACKING is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set -# CONFIG_BLK_DEV_DRBD is not set -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set +CONFIG_BLK_DEV_DRBD=m +CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 -CONFIG_BLK_DEV_RAM_SIZE=4096 -# CONFIG_CDROM_PKTCDVD is not set -# CONFIG_ATA_OVER_ETH is not set -# CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set - -# -# NVME Support -# -CONFIG_NVME_CORE=y -CONFIG_BLK_DEV_NVME=y -# CONFIG_NVME_MULTIPATH is not set -# CONFIG_NVME_FC is not set -# CONFIG_NVME_TARGET is not set - -# -# Misc devices -# -# CONFIG_ROCKCHIP_SCR is not set -# CONFIG_AD525X_DPOT is not set -# CONFIG_DUMMY_IRQ is not set -# CONFIG_PHANTOM is not set -# CONFIG_SGI_IOC4 is not set -# CONFIG_TIFM_CORE is not set -# CONFIG_ICS932S401 is not set -# CONFIG_ENCLOSURE_SERVICES is not set -# CONFIG_HP_ILO is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_DS1682 is not set -# CONFIG_USB_SWITCH_FSA9480 is not set -# CONFIG_LATTICE_ECP3_CONFIG is not set +CONFIG_ATA_OVER_ETH=m +CONFIG_BLK_DEV_RBD=m +CONFIG_BLK_DEV_NVME=m CONFIG_SRAM=y -# CONFIG_PCI_ENDPOINT_TEST is not set -# CONFIG_PIR_ASCHIP is not set -# CONFIG_C2PORT is not set - -# -# EEPROM support -# -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_AT25 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set -# CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_93XX46 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_CB710_CORE is not set - -# -# Texas Instruments shared transport line discipline -# -# CONFIG_TI_ST is not set -# CONFIG_SENSORS_LIS3_SPI is not set -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set - -# -# Intel MIC & related support -# - -# -# Intel MIC Bus Driver -# - -# -# SCIF Bus Driver -# - -# -# VOP Bus Driver -# - -# -# Intel MIC Host Driver -# - -# -# Intel MIC Card Driver -# - -# -# SCIF Driver -# - -# -# Intel MIC Coprocessor State Management (COSM) Drivers -# - -# -# VOP Driver -# -# CONFIG_GENWQE is not set -# CONFIG_ECHO is not set -# CONFIG_MISC_RTSX_PCI is not set -# CONFIG_MISC_RTSX_USB is not set - -# -# SCSI device support -# -CONFIG_SCSI_MOD=y -# CONFIG_RAID_ATTRS is not set -CONFIG_SCSI=y -CONFIG_SCSI_DMA=y -CONFIG_SCSI_MQ_DEFAULT=y -CONFIG_SCSI_PROC_FS=y - -# -# SCSI support type (disk, tape, CD-ROM) -# +CONFIG_EEPROM_93CX6=y CONFIG_BLK_DEV_SD=y -# CONFIG_CHR_DEV_ST is not set -# CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y -# CONFIG_CHR_DEV_SG is not set -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_LOGGING is not set CONFIG_SCSI_SCAN_ASYNC=y - -# -# SCSI Transports -# CONFIG_SCSI_SPI_ATTRS=y -# CONFIG_SCSI_FC_ATTRS is not set -# CONFIG_SCSI_ISCSI_ATTRS is not set -# CONFIG_SCSI_SAS_ATTRS is not set -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SRP_ATTRS is not set -CONFIG_SCSI_LOWLEVEL=y -# CONFIG_ISCSI_TCP is not set -# CONFIG_ISCSI_BOOT_SYSFS is not set -# CONFIG_SCSI_CXGB3_ISCSI is not set -# CONFIG_SCSI_CXGB4_ISCSI is not set -# CONFIG_SCSI_BNX2_ISCSI is not set -# CONFIG_BE2ISCSI is not set -# CONFIG_BLK_DEV_3W_XXXX_RAID is not set -# CONFIG_SCSI_HPSA is not set -# CONFIG_SCSI_3W_9XXX is not set -# CONFIG_SCSI_3W_SAS is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_AACRAID is not set -# CONFIG_SCSI_AIC7XXX is not set -# CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_AIC94XX is not set -# CONFIG_SCSI_HISI_SAS is not set -# CONFIG_SCSI_MVSAS is not set -# CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_ADVANSYS is not set -# CONFIG_SCSI_ARCMSR is not set -# CONFIG_SCSI_ESAS2R is not set -# CONFIG_MEGARAID_NEWGEN is not set -# CONFIG_MEGARAID_LEGACY is not set -# CONFIG_MEGARAID_SAS is not set -# CONFIG_SCSI_MPT3SAS is not set -# CONFIG_SCSI_MPT2SAS is not set -# CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set -# CONFIG_SCSI_HPTIOP is not set -# CONFIG_SCSI_SNIC is not set -# CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_IPS is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_STEX is not set -# CONFIG_SCSI_SYM53C8XX_2 is not set -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_QLOGIC_1280 is not set -# CONFIG_SCSI_QLA_ISCSI is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_AM53C974 is not set -# CONFIG_SCSI_WD719X is not set -# CONFIG_SCSI_DEBUG is not set -# CONFIG_SCSI_PMCRAID is not set -# CONFIG_SCSI_PM8001 is not set -# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set -# CONFIG_SCSI_DH is not set -# CONFIG_SCSI_OSD_INITIATOR is not set -CONFIG_HAVE_PATA_PLATFORM=y +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_MPT2SAS=m CONFIG_ATA=y -CONFIG_ATA_VERBOSE_ERROR=y -CONFIG_SATA_PMP=y - -# -# Controllers with non-SFF native interface -# CONFIG_SATA_AHCI=y -CONFIG_SATA_MOBILE_LPM_POLICY=0 CONFIG_SATA_AHCI_PLATFORM=y -# CONFIG_AHCI_CEVA is not set -# CONFIG_AHCI_QORIQ is not set -# CONFIG_SATA_INIC162X is not set -# CONFIG_SATA_ACARD_AHCI is not set -# CONFIG_SATA_SIL24 is not set -# CONFIG_ATA_SFF is not set +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SIL=m CONFIG_MD=y -# CONFIG_BLK_DEV_MD is not set -# CONFIG_BCACHE is not set -# CONFIG_BLK_DEV_DM is not set -# CONFIG_TARGET_CORE is not set -# CONFIG_FUSION is not set - -# -# IEEE 1394 (FireWire) support -# -# CONFIG_FIREWIRE is not set -# CONFIG_FIREWIRE_NOSY is not set +CONFIG_MD_LINEAR=m +CONFIG_BCACHE=m +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=m +CONFIG_DM_RAID=y CONFIG_NETDEVICES=y -CONFIG_MII=y -CONFIG_NET_CORE=y -# CONFIG_BONDING is not set -# CONFIG_DUMMY is not set -CONFIG_WIREGUARD=m -# CONFIG_EQUALIZER is not set -# CONFIG_NET_FC is not set -# CONFIG_NET_TEAM is not set -# CONFIG_MACVLAN is not set -# CONFIG_IPVLAN is not set -# CONFIG_VXLAN is not set -# CONFIG_GENEVE is not set -# CONFIG_GTP is not set -# CONFIG_MACSEC is not set -# CONFIG_NETCONSOLE is not set -CONFIG_TUN=y -# CONFIG_TUN_VNET_CROSS_LE is not set -# CONFIG_VETH is not set -# CONFIG_NLMON is not set -# CONFIG_ARCNET is not set - -# -# CAIF transport drivers -# - -# -# Distributed Switch Architecture drivers -# -CONFIG_ETHERNET=y +CONFIG_WIREGUARD=y +CONFIG_MACVLAN=y +CONFIG_IPVLAN=y +CONFIG_VXLAN=m +CONFIG_TUN=m +CONFIG_VETH=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set -CONFIG_NET_VENDOR_ALACRITECH=y -# CONFIG_SLICOSS is not set # CONFIG_NET_VENDOR_ALTEON is not set -# CONFIG_ALTERA_TSE is not set -CONFIG_NET_VENDOR_AMAZON=y -# CONFIG_ENA_ETHERNET is not set # CONFIG_NET_VENDOR_AMD is not set -CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ATHEROS is not set -CONFIG_NET_VENDOR_AURORA=y -# CONFIG_AURORA_NB8800 is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set -CONFIG_NET_VENDOR_CADENCE=y -# CONFIG_MACB is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set -CONFIG_NET_VENDOR_CORTINA=y -# CONFIG_GEMINI_ETHERNET is not set -# CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_HISILICON is not set -# CONFIG_NET_VENDOR_HP is not set -CONFIG_NET_VENDOR_HUAWEI=y -# CONFIG_HINIC is not set -# CONFIG_NET_VENDOR_INTEL is not set -# CONFIG_JME is not set +CONFIG_E100=y +CONFIG_E1000=y +CONFIG_E1000E=y +CONFIG_IGB=y +CONFIG_IXGBE=y # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set -CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_NET_VENDOR_MYRI is not set -# CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NATSEMI is not set -CONFIG_NET_VENDOR_NETERION=y -# CONFIG_S2IO is not set -# CONFIG_VXGE is not set -CONFIG_NET_VENDOR_NETRONOME=y -# CONFIG_NFP is not set -CONFIG_NET_VENDOR_NI=y # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set -# CONFIG_ETHOC is not set -CONFIG_NET_VENDOR_PACKET_ENGINES=y -# CONFIG_HAMACHI is not set -# CONFIG_YELLOWFIN is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1735,4319 +434,680 @@ CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -CONFIG_NET_VENDOR_SOLARFLARE=y -# CONFIG_SFC is not set -# CONFIG_SFC_FALCON is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SMSC is not set -CONFIG_NET_VENDOR_SOCIONEXT=y -CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y -CONFIG_STMMAC_PLATFORM=y -# CONFIG_DWMAC_DWC_QOS_ETH is not set -CONFIG_DWMAC_GENERIC=y -CONFIG_DWMAC_ROCKCHIP=y -# CONFIG_STMMAC_PCI is not set # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -CONFIG_MDIO_DEVICE=y -CONFIG_MDIO_BUS=y -# CONFIG_MDIO_BCM_UNIMAC is not set -# CONFIG_MDIO_BITBANG is not set -# CONFIG_MDIO_BUS_MUX_GPIO is not set -# CONFIG_MDIO_BUS_MUX_MMIOREG is not set -# CONFIG_MDIO_HISI_FEMAC is not set -# CONFIG_MDIO_MSCC_MIIM is not set -# CONFIG_MDIO_OCTEON is not set -# CONFIG_MDIO_THUNDER is not set -CONFIG_PHYLIB=y -CONFIG_SWPHY=y -# CONFIG_LED_TRIGGER_PHY is not set - -# -# MII PHY device drivers -# -# CONFIG_AMD_PHY is not set -# CONFIG_AQUANTIA_PHY is not set -# CONFIG_AX88796B_PHY is not set -# CONFIG_AT803X_PHY is not set -# CONFIG_BCM7XXX_PHY is not set -# CONFIG_BCM87XX_PHY is not set -# CONFIG_BROADCOM_PHY is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_CORTINA_PHY is not set -# CONFIG_DAVICOM_PHY is not set -# CONFIG_DP83822_PHY is not set -# CONFIG_DP83TC811_PHY is not set -# CONFIG_DP83848_PHY is not set -# CONFIG_DP83867_PHY is not set -CONFIG_FIXED_PHY=y -# CONFIG_ICPLUS_PHY is not set -# CONFIG_INTEL_XWAY_PHY is not set -# CONFIG_LSI_ET1011C_PHY is not set -# CONFIG_LXT_PHY is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_MARVELL_10G_PHY is not set -# CONFIG_MICREL_PHY is not set -# CONFIG_MICROCHIP_PHY is not set -# CONFIG_MICROCHIP_T1_PHY is not set -# CONFIG_MICROSEMI_PHY is not set -# CONFIG_NATIONAL_PHY is not set -# CONFIG_QSEMI_PHY is not set -# CONFIG_REALTEK_PHY is not set -# CONFIG_RENESAS_PHY is not set CONFIG_ROCKCHIP_PHY=y -# CONFIG_SMSC_PHY is not set -# CONFIG_STE10XP is not set -# CONFIG_TERANETICS_PHY is not set -# CONFIG_VITESSE_PHY is not set -# CONFIG_XILINX_GMII2RGMII is not set -# CONFIG_MICREL_KS8995MA is not set -# CONFIG_PPP is not set -# CONFIG_SLIP is not set -CONFIG_USB_NET_DRIVERS=y -# CONFIG_USB_CATC is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_PEGASUS is not set +CONFIG_CAN_SJA1000=y +CONFIG_CAN_PLX_PCI=y +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPPOE=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m CONFIG_USB_RTL8150=y CONFIG_USB_RTL8152=y -# CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=y -CONFIG_USB_NET_AX8817X=y -CONFIG_USB_NET_AX88179_178A=y -CONFIG_USB_NET_CDCETHER=y -# CONFIG_USB_NET_CDC_EEM is not set -CONFIG_USB_NET_CDC_NCM=y -# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set CONFIG_USB_NET_CDC_MBIM=y -# CONFIG_USB_NET_DM9601 is not set -# CONFIG_USB_NET_SR9700 is not set -# CONFIG_USB_NET_SR9800 is not set -# CONFIG_USB_NET_SMSC75XX is not set -# CONFIG_USB_NET_SMSC95XX is not set -# CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set -# CONFIG_USB_NET_PLUSB is not set -# CONFIG_USB_NET_MCS7830 is not set CONFIG_USB_NET_RNDIS_HOST=y # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set -# CONFIG_USB_NET_CX82310_ETH is not set -# CONFIG_USB_NET_KALMIA is not set CONFIG_USB_NET_QMI_WWAN=y -# CONFIG_USB_HSO is not set -# CONFIG_USB_NET_INT51X1 is not set -# CONFIG_USB_IPHETH is not set -# CONFIG_USB_SIERRA_NET is not set -# CONFIG_USB_VL600 is not set -# CONFIG_USB_NET_CH9200 is not set -CONFIG_WLAN=y -# CONFIG_WIRELESS_WDS is not set -CONFIG_WLAN_VENDOR_ADMTEK=y -# CONFIG_ADM8211 is not set -CONFIG_WLAN_VENDOR_ATH=y -# CONFIG_ATH_DEBUG is not set -# CONFIG_ATH5K is not set -# CONFIG_ATH5K_PCI is not set -# CONFIG_ATH9K is not set -# CONFIG_ATH9K_HTC is not set -# CONFIG_CARL9170 is not set -# CONFIG_ATH6KL is not set -# CONFIG_AR5523 is not set -# CONFIG_WIL6210 is not set -# CONFIG_ATH10K is not set -# CONFIG_WCN36XX is not set -CONFIG_WLAN_VENDOR_ATMEL=y -# CONFIG_ATMEL is not set -# CONFIG_AT76C50X_USB is not set -CONFIG_WLAN_VENDOR_BROADCOM=y -# CONFIG_B43 is not set -# CONFIG_B43LEGACY is not set -# CONFIG_BRCMSMAC is not set -# CONFIG_BRCMFMAC is not set -CONFIG_WLAN_VENDOR_CISCO=y -CONFIG_WLAN_VENDOR_INTEL=y -# CONFIG_IPW2100 is not set -# CONFIG_IPW2200 is not set -# CONFIG_IWL4965 is not set -# CONFIG_IWL3945 is not set -# CONFIG_IWLWIFI is not set -CONFIG_WLAN_VENDOR_INTERSIL=y -# CONFIG_HOSTAP is not set -# CONFIG_HERMES is not set -# CONFIG_P54_COMMON is not set -# CONFIG_PRISM54 is not set -CONFIG_WLAN_VENDOR_MARVELL=y -# CONFIG_LIBERTAS is not set -CONFIG_LIBERTAS_THINFIRM=y -# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set -# CONFIG_LIBERTAS_THINFIRM_USB is not set +CONFIG_ATH5K=m +CONFIG_ATH9K=m +CONFIG_ATH6KL=m +CONFIG_ATH6KL_USB=m +CONFIG_AR5523=m +CONFIG_ATH10K=m +CONFIG_WCN36XX=m +CONFIG_AT76C50X_USB=m +CONFIG_B43=m +CONFIG_BRCMFMAC=m +# CONFIG_BRCMFMAC_SDIO is not set +CONFIG_BRCMFMAC_USB=y +CONFIG_BRCMFMAC_PCIE=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +CONFIG_LIBERTAS_THINFIRM=m CONFIG_MWIFIEX=m CONFIG_MWIFIEX_SDIO=m -# CONFIG_MWIFIEX_PCIE is not set -# CONFIG_MWIFIEX_USB is not set -# CONFIG_MWL8K is not set -CONFIG_WLAN_VENDOR_MEDIATEK=y -# CONFIG_MT7601U is not set -# CONFIG_MT76x0U is not set -# CONFIG_MT76x2E is not set -# CONFIG_MT76x2U is not set -CONFIG_WLAN_VENDOR_RALINK=y -# CONFIG_RT2X00 is not set -CONFIG_WLAN_VENDOR_REALTEK=y -# CONFIG_RTL8180 is not set -# CONFIG_RTL8187 is not set -CONFIG_RTL_CARDS=y -# CONFIG_RTL8192CE is not set -# CONFIG_RTL8192SE is not set -# CONFIG_RTL8192DE is not set -# CONFIG_RTL8723AE is not set -# CONFIG_RTL8723BE is not set -# CONFIG_RTL8188EE is not set -# CONFIG_RTL8192EE is not set -# CONFIG_RTL8821AE is not set -# CONFIG_RTL8192CU is not set -# CONFIG_RTL8XXXU is not set -CONFIG_WLAN_VENDOR_RSI=y -# CONFIG_RSI_91X is not set -CONFIG_WLAN_VENDOR_ST=y -# CONFIG_CW1200 is not set -CONFIG_WLAN_VENDOR_TI=y -# CONFIG_WL1251 is not set -# CONFIG_WL12XX is not set -# CONFIG_WL18XX is not set -# CONFIG_WLCORE is not set -CONFIG_WLAN_VENDOR_ZYDAS=y -# CONFIG_USB_ZD1201 is not set -# CONFIG_ZD1211RW is not set -CONFIG_WLAN_VENDOR_QUANTENNA=y -# CONFIG_QTNFMAC_PEARL_PCIE is not set -CONFIG_WL_ROCKCHIP=y -CONFIG_WIFI_BUILD_MODULE=y -CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y -# CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR is not set -CONFIG_BCMDHD=y -CONFIG_AP6XXX=m -CONFIG_AP6XXX_WIFI6=m -# CONFIG_AP6XXX_INDEP_POWER is not set -CONFIG_BCMDHD_FW_PATH="/etc/firmware/fw_bcmdhd.bin" -CONFIG_BCMDHD_NVRAM_PATH="/etc/firmware/nvram.txt" -# CONFIG_BCMDHD_STATIC_IF is not set -CONFIG_RTL_WIRELESS_SOLUTION=y -CONFIG_RTL8188EU=m -CONFIG_RTL8188FU=y -CONFIG_RTL8189FS=m -# CONFIG_RTL8723CS is not set -CONFIG_RTL8723DS=m -CONFIG_RTL8821CS=m -# CONFIG_RTL8822BS is not set -# CONFIG_MVL88W8977 is not set -# CONFIG_CYW_BCMDHD is not set -# CONFIG_MAC80211_HWSIM is not set -CONFIG_USB_NET_RNDIS_WLAN=y -# CONFIG_VIRT_WIFI is not set - -# -# Enable WiMAX (Networking options) to see the WiMAX drivers -# -# CONFIG_WAN is not set -# CONFIG_VMXNET3 is not set -# CONFIG_LTE is not set -# CONFIG_NETDEVSIM is not set -# CONFIG_NET_FAILOVER is not set -# CONFIG_ISDN is not set -# CONFIG_NVM is not set - -# -# Input device support -# -CONFIG_INPUT=y -CONFIG_INPUT_LEDS=y -CONFIG_INPUT_FF_MEMLESS=y -CONFIG_INPUT_POLLDEV=y -# CONFIG_INPUT_SPARSEKMAP is not set +CONFIG_MWIFIEX_USB=m +CONFIG_MT7601U=m +CONFIG_RT2X00=m +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_RTL8192CE=m +CONFIG_RTL8192SE=m +CONFIG_RTL8192DE=m +CONFIG_RTL8723AE=m +CONFIG_RTL8723BE=m +CONFIG_RTL8188EE=m +CONFIG_RTL8192EE=m +CONFIG_RTL8821AE=m +CONFIG_RTL8XXXU=m +CONFIG_RTL8XXXU_UNTESTED=y +CONFIG_RTW88=m +CONFIG_RTW88_8822BE=m +CONFIG_RTW88_8822BU=m +CONFIG_RTW88_8822CE=m +CONFIG_RTW88_8822CU=m +CONFIG_RTW88_8723DE=m +CONFIG_RTW88_8723DS=m +CONFIG_RTW88_8723DU=m +CONFIG_RTW88_8821CE=m +CONFIG_RTW88_8821CS=m +CONFIG_RTW89=m +CONFIG_RTW89_8852AE=m +CONFIG_RTW89_8852CE=m +CONFIG_ZD1211RW=m +CONFIG_ISDN=y CONFIG_INPUT_MATRIXKMAP=y - -# -# Userland interfaces -# -# CONFIG_INPUT_MOUSEDEV is not set CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_EVBUG is not set - -# -# Input Device Drivers -# -CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ADC=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set -# CONFIG_KEYBOARD_ATKBD is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set -# CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y CONFIG_KEYBOARD_GPIO_POLLED=y -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_MATRIX is not set -# CONFIG_KEYBOARD_LM8323 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set -# CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_OPENCORES is not set -# CONFIG_KEYBOARD_SAMSUNG is not set -# CONFIG_KEYBOARD_STOWAWAY is not set -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_OMAP4 is not set -# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set -# CONFIG_KEYBOARD_XTKBD is not set -CONFIG_KEYBOARD_CROS_EC=y -# CONFIG_KEYBOARD_CAP11XX is not set -# CONFIG_KEYBOARD_BCM is not set -CONFIG_INPUT_MOUSE=y # CONFIG_MOUSE_PS2 is not set -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_APPLETOUCH is not set -# CONFIG_MOUSE_BCM5974 is not set -CONFIG_MOUSE_CYAPA=y -CONFIG_MOUSE_ELAN_I2C=y -CONFIG_MOUSE_ELAN_I2C_I2C=y -# CONFIG_MOUSE_ELAN_I2C_SMBUS is not set -# CONFIG_MOUSE_VSXXXAA is not set -# CONFIG_MOUSE_GPIO is not set -# CONFIG_MOUSE_SYNAPTICS_I2C is not set -# CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y -CONFIG_JOYSTICK_ANALOG=m -CONFIG_JOYSTICK_A3D=m -CONFIG_JOYSTICK_ADI=m -CONFIG_JOYSTICK_COBRA=m -CONFIG_JOYSTICK_GF2K=m -CONFIG_JOYSTICK_GRIP=m -CONFIG_JOYSTICK_GRIP_MP=m -CONFIG_JOYSTICK_GUILLEMOT=m -CONFIG_JOYSTICK_INTERACT=m -CONFIG_JOYSTICK_SIDEWINDER=m -CONFIG_JOYSTICK_TMDC=m -CONFIG_JOYSTICK_IFORCE=m -CONFIG_JOYSTICK_IFORCE_USB=y -CONFIG_JOYSTICK_IFORCE_232=y -CONFIG_JOYSTICK_WARRIOR=m -CONFIG_JOYSTICK_MAGELLAN=m -CONFIG_JOYSTICK_SPACEORB=m -CONFIG_JOYSTICK_SPACEBALL=m -CONFIG_JOYSTICK_STINGER=m -CONFIG_JOYSTICK_TWIDJOY=m -CONFIG_JOYSTICK_ZHENHUA=m -CONFIG_JOYSTICK_AS5011=m -CONFIG_JOYSTICK_JOYDUMP=m +CONFIG_JOYSTICK_ADC=y CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y -CONFIG_JOYSTICK_XPAD_LEDS=y -CONFIG_JOYSTICK_SINGLEADCJOY=y -# CONFIG_JOYSTICK_PSXPAD_SPI is not set -# CONFIG_JOYSTICK_PXRC is not set -# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TABLET=y CONFIG_INPUT_TOUCHSCREEN=y -CONFIG_TOUCHSCREEN_PROPERTIES=y -# CONFIG_TOUCHSCREEN_ADS7846 is not set -# CONFIG_TOUCHSCREEN_AD7877 is not set -# CONFIG_TOUCHSCREEN_AD7879 is not set -# CONFIG_TOUCHSCREEN_ADC is not set -# CONFIG_TOUCHSCREEN_AR1021_I2C is not set CONFIG_TOUCHSCREEN_ATMEL_MXT=y -# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set -# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set -# CONFIG_TOUCHSCREEN_BU21013 is not set -# CONFIG_TOUCHSCREEN_BU21029 is not set -# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set -# CONFIG_TOUCHSCREEN_CY8C40XX is not set -# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set -# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set -# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set -# CONFIG_TOUCHSCREEN_DYNAPRO is not set -# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set -# CONFIG_TOUCHSCREEN_EETI is not set -# CONFIG_TOUCHSCREEN_EGALAX is not set -# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set -# CONFIG_TOUCHSCREEN_EXC3000 is not set -# CONFIG_TOUCHSCREEN_FUJITSU is not set -# CONFIG_TOUCHSCREEN_GOODIX is not set -# CONFIG_TOUCHSCREEN_GSLX6801 is not set -# CONFIG_TOUCHSCREEN_GSLX680A is not set -# CONFIG_TOUCHSCREEN_GSLX680_D708 is not set -# CONFIG_TOUCHSCREEN_GSLX680_PAD is not set -# CONFIG_TOUCHSCREEN_GSLX680_VR is not set -CONFIG_TOUCHSCREEN_GSLX680_FIREFLY=y -# CONFIG_TOUCHSCREEN_GSL3673 is not set -# CONFIG_TOUCHSCREEN_GSL3673_800X1280 is not set -# CONFIG_TOUCHSCREEN_GSL3676 is not set -# CONFIG_TOUCHSCREEN_GT9XX is not set -# CONFIG_TOUCHSCREEN_HIDEEP is not set -# CONFIG_TOUCHSCREEN_HYN_CST2XX is not set -# CONFIG_TOUCHSCREEN_ILI210X is not set -# CONFIG_TOUCHSCREEN_S6SY761 is not set -# CONFIG_TOUCHSCREEN_GUNZE is not set -# CONFIG_TOUCHSCREEN_EKTF2127 is not set -CONFIG_TOUCHSCREEN_ELAN=y -# CONFIG_TOUCHSCREEN_ELO is not set -# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set -# CONFIG_TOUCHSCREEN_WACOM_I2C is not set -CONFIG_TOUCHSCREEN_WACOM_W9013=y -# CONFIG_TOUCHSCREEN_MAX11801 is not set -# CONFIG_TOUCHSCREEN_MCS5000 is not set -# CONFIG_TOUCHSCREEN_MMS114 is not set -# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set -# CONFIG_TOUCHSCREEN_MTOUCH is not set -# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set -# CONFIG_TOUCHSCREEN_INEXIO is not set -# CONFIG_TOUCHSCREEN_MK712 is not set -# CONFIG_TOUCHSCREEN_PENMOUNT is not set -# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set -# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set -# CONFIG_TOUCHSCREEN_TOUCHWIN is not set -# CONFIG_TOUCHSCREEN_PIXCIR is not set -# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set +CONFIG_TOUCHSCREEN_GOODIX=y +CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX=y CONFIG_TOUCHSCREEN_USB_COMPOSITE=y -CONFIG_TOUCHSCREEN_USB_EGALAX=y -CONFIG_TOUCHSCREEN_USB_PANJIT=y -CONFIG_TOUCHSCREEN_USB_3M=y -CONFIG_TOUCHSCREEN_USB_ITM=y -CONFIG_TOUCHSCREEN_USB_ETURBO=y -CONFIG_TOUCHSCREEN_USB_GUNZE=y -CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y -CONFIG_TOUCHSCREEN_USB_IRTOUCH=y -CONFIG_TOUCHSCREEN_USB_IDEALTEK=y -CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y -CONFIG_TOUCHSCREEN_USB_GOTOP=y -CONFIG_TOUCHSCREEN_USB_JASTEC=y -CONFIG_TOUCHSCREEN_USB_ELO=y -CONFIG_TOUCHSCREEN_USB_E2I=y -CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y -CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y -CONFIG_TOUCHSCREEN_USB_NEXIO=y -CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y -# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set -# CONFIG_TOUCHSCREEN_TSC_SERIO is not set -# CONFIG_TOUCHSCREEN_TSC2004 is not set -# CONFIG_TOUCHSCREEN_TSC2005 is not set -# CONFIG_TOUCHSCREEN_TSC2007 is not set -# CONFIG_TOUCHSCREEN_RM_TS is not set -# CONFIG_TOUCHSCREEN_SILEAD is not set -# CONFIG_TOUCHSCREEN_SIS_I2C is not set -# CONFIG_TOUCHSCREEN_ST1232 is not set -# CONFIG_TOUCHSCREEN_STMFTS is not set -# CONFIG_TOUCHSCREEN_SUR40 is not set -# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set -# CONFIG_TOUCHSCREEN_SX8654 is not set -# CONFIG_TOUCHSCREEN_TPS6507X is not set -# CONFIG_TOUCHSCREEN_ZET6223 is not set -# CONFIG_TOUCHSCREEN_ZFORCE is not set -# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set -# CONFIG_TOUCHSCREEN_VTL_CT36X is not set -CONFIG_TOUCHSCREEN_GT1X=y -# CONFIG_TOUCHSCREEN_FTS is not set -# CONFIG_TOUCHSCREEN_FT5436 is not set -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5=y -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICETREE_SUPPORT=y -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_I2C=y -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_SPI is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MT_A is not set -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MT_B=y -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_BUTTON is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PROXIMITY is not set -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICE_ACCESS=y -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICE_ACCESS_API is not set -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_LOADER=y -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PLATFORM_FW_UPGRADE is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_BINARY_FW_UPGRADE is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PLATFORM_TTCONFIG_UPGRADE is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MANUAL_TTCONFIG_UPGRADE is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEBUG_MDL is not set -CONFIG_ROCKCHIP_REMOTECTL=y -CONFIG_ROCKCHIP_REMOTECTL_PWM=y - -# -# handle all sensors -# -CONFIG_SENSOR_DEVICE=y -# CONFIG_ANGLE_DEVICE is not set -CONFIG_GSENSOR_DEVICE=y -# CONFIG_GS_MMA8452 is not set -# CONFIG_STK8BAXX_ACC is not set -# CONFIG_MPU6880_ACC is not set -# CONFIG_MPU6500_ACC is not set -# CONFIG_GS_KXTIK is not set -# CONFIG_GS_KXTJ9 is not set -# CONFIG_GS_LIS3DH is not set -# CONFIG_GS_MMA7660 is not set -CONFIG_GS_MC3230=y -# CONFIG_GS_SC7660 is not set -# CONFIG_GS_SC7A20 is not set -# CONFIG_GS_SC7A30 is not set -# CONFIG_GS_MXC6225 is not set -# CONFIG_GS_MXC6655XA is not set -# CONFIG_GS_DMT10 is not set -# CONFIG_GS_LSM303D is not set -# CONFIG_GS_BMA023 is not set -# CONFIG_LSM330_ACC is not set -# CONFIG_BMA2XX_ACC is not set -# CONFIG_GS_DA223 is not set -# CONFIG_ICM2060X_ACC is not set -# CONFIG_COMPASS_DEVICE is not set -# CONFIG_GYROSCOPE_DEVICE is not set -# CONFIG_LIGHT_DEVICE is not set -# CONFIG_PROXIMITY_DEVICE is not set -# CONFIG_TEMPERATURE_DEVICE is not set -# CONFIG_PRESSURE_DEVICE is not set -# CONFIG_HALL_DEVICE is not set CONFIG_INPUT_MISC=y -# CONFIG_INPUT_AD714X is not set -# CONFIG_INPUT_ATMEL_CAPTOUCH is not set -# CONFIG_INPUT_BMA150 is not set -# CONFIG_INPUT_E3X0_BUTTON is not set -# CONFIG_INPUT_MMA8450 is not set -# CONFIG_INPUT_GP2A is not set -# CONFIG_INPUT_GPIO_BEEPER is not set -# CONFIG_INPUT_GPIO_DECODER is not set -# CONFIG_INPUT_ATI_REMOTE2 is not set -# CONFIG_INPUT_KEYSPAN_REMOTE is not set -# CONFIG_INPUT_KXTJ9 is not set -# CONFIG_INPUT_POWERMATE is not set -# CONFIG_INPUT_YEALINK is not set -# CONFIG_INPUT_CM109 is not set -# CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y -# CONFIG_INPUT_PCF8574 is not set -# CONFIG_INPUT_PWM_BEEPER is not set -# CONFIG_INPUT_PWM_VIBRA is not set +CONFIG_INPUT_PWM_VIBRA=y CONFIG_INPUT_RK805_PWRKEY=y -# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set -# CONFIG_INPUT_ADXL34X is not set -# CONFIG_INPUT_IMS_PCU is not set -# CONFIG_INPUT_CMA3000 is not set -# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set -# CONFIG_INPUT_DRV260X_HAPTICS is not set -# CONFIG_INPUT_DRV2665_HAPTICS is not set -# CONFIG_INPUT_DRV2667_HAPTICS is not set -# CONFIG_RMI4_CORE is not set - -# -# Hardware I/O ports -# -CONFIG_SERIO=m CONFIG_SERIO_SERPORT=m -# CONFIG_SERIO_AMBAKMI is not set -# CONFIG_SERIO_PCIPS2 is not set -# CONFIG_SERIO_LIBPS2 is not set -# CONFIG_SERIO_RAW is not set -# CONFIG_SERIO_ALTERA_PS2 is not set -# CONFIG_SERIO_PS2MULT is not set -# CONFIG_SERIO_ARC_PS2 is not set -# CONFIG_SERIO_APBPS2 is not set -# CONFIG_SERIO_GPIO_PS2 is not set -# CONFIG_USERIO is not set -CONFIG_GAMEPORT=m -# CONFIG_GAMEPORT_NS558 is not set -# CONFIG_GAMEPORT_L4 is not set -# CONFIG_GAMEPORT_EMU10K1 is not set -# CONFIG_GAMEPORT_FM801 is not set - -# -# Character devices -# -CONFIG_TTY=y -CONFIG_VT=y -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_HW_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_UNIX98_PTYS=y +CONFIG_GAMEPORT=y # CONFIG_LEGACY_PTYS is not set -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_NOZOMI is not set -# CONFIG_N_GSM is not set -# CONFIG_TRACE_SINK is not set -CONFIG_LDISC_AUTOLOAD=y -CONFIG_DEVMEM=y - -# -# Serial drivers -# -CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y -# CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_DMA=y # CONFIG_SERIAL_8250_PCI is not set -CONFIG_SERIAL_8250_NR_UARTS=10 -CONFIG_SERIAL_8250_RUNTIME_UARTS=10 -# CONFIG_SERIAL_8250_EXTENDED is not set -# CONFIG_SERIAL_8250_ASPEED_VUART is not set -CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_NR_UARTS=5 +CONFIG_SERIAL_8250_RUNTIME_UARTS=5 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_DW=y -# CONFIG_SERIAL_8250_RT288X is not set -# CONFIG_SERIAL_8250_MOXA is not set CONFIG_SERIAL_OF_PLATFORM=y - -# -# Non-8250 serial port support -# -# CONFIG_SERIAL_AMBA_PL010 is not set -# CONFIG_SERIAL_AMBA_PL011 is not set -# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set -# CONFIG_SERIAL_MAX3100 is not set -# CONFIG_SERIAL_MAX310X is not set -# CONFIG_SERIAL_UARTLITE is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_MSM_GENI_HALF_SAMPLING is not set -# CONFIG_SERIAL_MSM_GENI_EARLY_CONSOLE is not set -# CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set -# CONFIG_SERIAL_ALTERA_JTAGUART is not set -# CONFIG_SERIAL_ALTERA_UART is not set -# CONFIG_SERIAL_IFX6X60 is not set -# CONFIG_SERIAL_XILINX_PS_UART is not set -# CONFIG_SERIAL_ARC is not set -# CONFIG_SERIAL_RP2 is not set -# CONFIG_SERIAL_FSL_LPUART is not set -# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_DEV_BUS=y -CONFIG_SERIAL_DEV_CTRL_TTYPORT=y -# CONFIG_TTY_PRINTK is not set -# CONFIG_HVC_DCC is not set -# CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y -# CONFIG_HW_RANDOM_TIMERIOMEM is not set -CONFIG_HW_RANDOM_CAVIUM=y -CONFIG_HW_RANDOM_ROCKCHIP=y -# CONFIG_APPLICOM is not set - -# -# PCMCIA character devices -# -# CONFIG_RAW_DRIVER is not set CONFIG_TCG_TPM=y -CONFIG_HW_RANDOM_TPM=y -# CONFIG_TCG_TIS is not set -# CONFIG_TCG_TIS_SPI is not set -# CONFIG_TCG_TIS_I2C_ATMEL is not set -CONFIG_TCG_TIS_I2C_INFINEON=y -# CONFIG_TCG_TIS_I2C_NUVOTON is not set -# CONFIG_TCG_ATMEL is not set -# CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set -# CONFIG_TCG_TIS_ST33ZP24_SPI is not set -CONFIG_DEVPORT=y -# CONFIG_XILLYBUS is not set -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set - -# -# I2C support -# -CONFIG_I2C=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_COMPAT=y +# CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y -CONFIG_I2C_MUX=y - -# -# Multiplexer I2C Chip support -# -# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set -# CONFIG_I2C_MUX_GPIO is not set -# CONFIG_I2C_MUX_GPMUX is not set -# CONFIG_I2C_MUX_LTC4306 is not set -# CONFIG_I2C_MUX_PCA9541 is not set -# CONFIG_I2C_MUX_PCA954x is not set -# CONFIG_I2C_MUX_PINCTRL is not set -# CONFIG_I2C_MUX_REG is not set -# CONFIG_I2C_DEMUX_PINCTRL is not set -# CONFIG_I2C_MUX_MLXCPLD is not set -CONFIG_I2C_HELPER_AUTO=y -CONFIG_I2C_ALGOBIT=y - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_CADENCE is not set -# CONFIG_I2C_CBUS_GPIO is not set -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_GPIO is not set -# CONFIG_I2C_NOMADIK is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set +CONFIG_I2C_DESIGNWARE_PLATFORM=y CONFIG_I2C_RK3X=y -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_THUNDERX is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -CONFIG_I2C_CROS_EC_TUNNEL=y -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_SLAVE is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set CONFIG_SPI=y -# CONFIG_SPI_DEBUG is not set -CONFIG_SPI_MASTER=y -# CONFIG_SPI_MEM is not set - -# -# SPI Master Controller Drivers -# -# CONFIG_SPI_ALTERA is not set -# CONFIG_SPI_AXI_SPI_ENGINE is not set -CONFIG_SPI_BITBANG=y -# CONFIG_SPI_CADENCE is not set -# CONFIG_SPI_DESIGNWARE is not set -# CONFIG_SPI_GPIO is not set -# CONFIG_SPI_FSL_SPI is not set -# CONFIG_SPI_OC_TINY is not set -# CONFIG_SPI_PL022 is not set -# CONFIG_SPI_PXA2XX is not set +CONFIG_SPI_GPIO=y CONFIG_SPI_ROCKCHIP=y -# CONFIG_SPI_SC18IS602 is not set -# CONFIG_SPI_THUNDERX is not set -# CONFIG_SPI_XCOMM is not set -# CONFIG_SPI_XILINX is not set -# CONFIG_SPI_ZYNQMP_GQSPI is not set - -# -# SPI Protocol Masters -# +CONFIG_SPI_ROCKCHIP_SFC=y +CONFIG_SPI_MUX=y CONFIG_SPI_SPIDEV=y -# CONFIG_SPI_LOOPBACK_TEST is not set -# CONFIG_SPI_TLE62X0 is not set -# CONFIG_SPI_SLAVE is not set -# CONFIG_SPMI is not set -# CONFIG_HSI is not set -CONFIG_PPS=y -# CONFIG_PPS_DEBUG is not set - -# -# PPS clients support -# -# CONFIG_PPS_CLIENT_KTIMER is not set -# CONFIG_PPS_CLIENT_LDISC is not set -# CONFIG_PPS_CLIENT_GPIO is not set - -# -# PPS generators support -# - -# -# PTP clock support -# -CONFIG_PTP_1588_CLOCK=y - -# -# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. -# -CONFIG_PINCTRL=y -CONFIG_PINMUX=y -CONFIG_PINCONF=y -CONFIG_GENERIC_PINCONF=y -# CONFIG_DEBUG_PINCTRL is not set -# CONFIG_PINCTRL_AMD is not set -# CONFIG_PINCTRL_MCP23S08 is not set -CONFIG_PINCTRL_ROCKCHIP=y -# CONFIG_PINCTRL_SINGLE is not set -# CONFIG_PINCTRL_SX150X is not set -CONFIG_PINCTRL_RK628=y CONFIG_PINCTRL_RK805=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_FASTPATH_LIMIT=512 -CONFIG_OF_GPIO=y -CONFIG_GPIOLIB_IRQCHIP=y -# CONFIG_DEBUG_GPIO is not set +CONFIG_PINCTRL_SINGLE=y CONFIG_GPIO_SYSFS=y -CONFIG_GPIO_GENERIC=y - -# -# Memory mapped GPIO drivers -# -# CONFIG_GPIO_74XX_MMIO is not set -# CONFIG_GPIO_ALTERA is not set -# CONFIG_GPIO_DWAPB is not set -# CONFIG_GPIO_FTGPIO010 is not set +CONFIG_GPIO_DWAPB=y CONFIG_GPIO_GENERIC_PLATFORM=y -# CONFIG_GPIO_GRGPIO is not set -# CONFIG_GPIO_HLWD is not set -# CONFIG_GPIO_MB86S7X is not set -# CONFIG_GPIO_MOCKUP is not set -# CONFIG_GPIO_PL061 is not set -CONFIG_GPIO_ROCKCHIP=y -# CONFIG_GPIO_SYSCON is not set -# CONFIG_GPIO_XGENE is not set -# CONFIG_GPIO_XILINX is not set - -# -# I2C GPIO expanders -# -# CONFIG_GPIO_ADP5588 is not set -# CONFIG_GPIO_ADNP is not set -# CONFIG_GPIO_MAX7300 is not set -# CONFIG_GPIO_MAX732X is not set -CONFIG_GPIO_PCA953X=y -# CONFIG_GPIO_PCA953X_IRQ is not set -# CONFIG_GPIO_PCF857X is not set -# CONFIG_GPIO_TPIC2810 is not set - -# -# MFD GPIO expanders -# -# CONFIG_GPIO_TPS6586X is not set - -# -# PCI GPIO expanders -# -# CONFIG_GPIO_BT8XX is not set -# CONFIG_GPIO_PCI_IDIO_16 is not set -# CONFIG_GPIO_PCIE_IDIO_24 is not set -# CONFIG_GPIO_RDC321X is not set - -# -# SPI GPIO expanders -# -# CONFIG_GPIO_74X164 is not set -# CONFIG_GPIO_MAX3191X is not set -# CONFIG_GPIO_MAX7301 is not set -# CONFIG_GPIO_MC33880 is not set -# CONFIG_GPIO_PISOSR is not set -# CONFIG_GPIO_XRA1403 is not set - -# -# USB GPIO expanders -# -# CONFIG_W1 is not set -CONFIG_POWER_AVS=y -CONFIG_ROCKCHIP_IODOMAIN=y -CONFIG_POWER_RESET=y -# CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y -# CONFIG_POWER_RESET_LTC2952 is not set -# CONFIG_POWER_RESET_RESTART is not set -# CONFIG_POWER_RESET_XGENE is not set -# CONFIG_POWER_RESET_SYSCON is not set -# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set -CONFIG_REBOOT_MODE=y +CONFIG_POWER_RESET_SYSCON=y +CONFIG_POWER_RESET_SYSCON_POWEROFF=y CONFIG_SYSCON_REBOOT_MODE=y -CONFIG_POWER_SUPPLY=y -# CONFIG_POWER_SUPPLY_DEBUG is not set -# CONFIG_PDA_POWER is not set -# CONFIG_GENERIC_ADC_BATTERY is not set -# CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_DS2780 is not set -# CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_LEGO_EV3 is not set +CONFIG_BATTERY_CW2015=y CONFIG_BATTERY_SBS=y -# CONFIG_CHARGER_SBS is not set -# CONFIG_MANAGER_SBS is not set -# CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set -# CONFIG_CHARGER_ISP1704 is not set -# CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set CONFIG_CHARGER_GPIO=y -# CONFIG_CHARGER_MANAGER is not set -# CONFIG_CHARGER_LTC3651 is not set -# CONFIG_CHARGER_DETECTOR_MAX14656 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_BQ24190 is not set -# CONFIG_CHARGER_BQ24257 is not set CONFIG_CHARGER_BQ24735=y -# CONFIG_CHARGER_BQ25700 is not set -# CONFIG_CHARGER_BQ25890 is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_RT9455 is not set -# CONFIG_CHARGER_CROS_USBPD is not set -CONFIG_BATTERY_CW2015=y -# CONFIG_BATTERY_RK816 is not set -CONFIG_BATTERY_RK817=y CONFIG_CHARGER_RK817=y -# CONFIG_BATTERY_RK818 is not set -# CONFIG_CHARGER_RK818 is not set -CONFIG_HWMON=y -# CONFIG_HWMON_DEBUG_CHIP is not set - -# -# Native drivers -# -# CONFIG_SENSORS_AD7314 is not set -# CONFIG_SENSORS_AD7414 is not set -# CONFIG_SENSORS_AD7418 is not set -# CONFIG_SENSORS_ADM1021 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1029 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ADM9240 is not set -# CONFIG_SENSORS_ADT7310 is not set -# CONFIG_SENSORS_ADT7410 is not set -# CONFIG_SENSORS_ADT7411 is not set -# CONFIG_SENSORS_ADT7462 is not set -# CONFIG_SENSORS_ADT7470 is not set -# CONFIG_SENSORS_ADT7475 is not set -# CONFIG_SENSORS_ASC7621 is not set -# CONFIG_SENSORS_ARM_SCMI is not set -# CONFIG_SENSORS_ASPEED is not set -# CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_DS620 is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_I5K_AMB is not set -# CONFIG_SENSORS_F71805F is not set -# CONFIG_SENSORS_F71882FG is not set -# CONFIG_SENSORS_F75375S is not set -# CONFIG_SENSORS_FTSTEUTATES is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_G760A is not set -# CONFIG_SENSORS_G762 is not set -# CONFIG_SENSORS_GPIO_FAN is not set -# CONFIG_SENSORS_HIH6130 is not set -# CONFIG_SENSORS_IIO_HWMON is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_JC42 is not set -# CONFIG_SENSORS_POWR1220 is not set -# CONFIG_SENSORS_LINEAGE is not set -# CONFIG_SENSORS_LTC2945 is not set -# CONFIG_SENSORS_LTC2990 is not set -# CONFIG_SENSORS_LTC4151 is not set -# CONFIG_SENSORS_LTC4215 is not set -# CONFIG_SENSORS_LTC4222 is not set -# CONFIG_SENSORS_LTC4245 is not set -# CONFIG_SENSORS_LTC4260 is not set -# CONFIG_SENSORS_LTC4261 is not set -# CONFIG_SENSORS_MAX1111 is not set -# CONFIG_SENSORS_MAX16065 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_MAX1668 is not set -# CONFIG_SENSORS_MAX197 is not set -# CONFIG_SENSORS_MAX31722 is not set -# CONFIG_SENSORS_MAX6621 is not set -# CONFIG_SENSORS_MAX6639 is not set -# CONFIG_SENSORS_MAX6642 is not set -# CONFIG_SENSORS_MAX6650 is not set -# CONFIG_SENSORS_MAX6697 is not set -# CONFIG_SENSORS_MAX31790 is not set -# CONFIG_SENSORS_MCP3021 is not set -# CONFIG_SENSORS_TC654 is not set -# CONFIG_SENSORS_ADCXX is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM70 is not set -# CONFIG_SENSORS_LM73 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_LM92 is not set -# CONFIG_SENSORS_LM93 is not set -# CONFIG_SENSORS_LM95234 is not set -# CONFIG_SENSORS_LM95241 is not set -# CONFIG_SENSORS_LM95245 is not set -# CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set -# CONFIG_SENSORS_NCT6683 is not set -# CONFIG_SENSORS_NCT6775 is not set -# CONFIG_SENSORS_NCT7802 is not set -# CONFIG_SENSORS_NCT7904 is not set -# CONFIG_SENSORS_NPCM7XX is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_PMBUS is not set -# CONFIG_SENSORS_PWM_FAN is not set -# CONFIG_SENSORS_SHT15 is not set -# CONFIG_SENSORS_SHT21 is not set -# CONFIG_SENSORS_SHT3x is not set -# CONFIG_SENSORS_SHTC1 is not set -# CONFIG_SENSORS_SIS5595 is not set -# CONFIG_SENSORS_DME1737 is not set -# CONFIG_SENSORS_EMC1403 is not set -# CONFIG_SENSORS_EMC2103 is not set -# CONFIG_SENSORS_EMC6W201 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_SMSC47M192 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_SCH5627 is not set -# CONFIG_SENSORS_SCH5636 is not set -# CONFIG_SENSORS_STTS751 is not set -# CONFIG_SENSORS_SMM665 is not set -# CONFIG_SENSORS_ADC128D818 is not set -# CONFIG_SENSORS_ADS1015 is not set -# CONFIG_SENSORS_ADS7828 is not set -# CONFIG_SENSORS_ADS7871 is not set -# CONFIG_SENSORS_AMC6821 is not set -# CONFIG_SENSORS_INA209 is not set -# CONFIG_SENSORS_INA2XX is not set -# CONFIG_SENSORS_INA3221 is not set -# CONFIG_SENSORS_TC74 is not set -# CONFIG_SENSORS_THMC50 is not set -# CONFIG_SENSORS_TMP102 is not set -# CONFIG_SENSORS_TMP103 is not set -# CONFIG_SENSORS_TMP108 is not set -# CONFIG_SENSORS_TMP401 is not set -# CONFIG_SENSORS_TMP421 is not set -# CONFIG_SENSORS_VIA686A is not set -# CONFIG_SENSORS_VT1211 is not set -# CONFIG_SENSORS_VT8231 is not set -# CONFIG_SENSORS_W83773G is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83791D is not set -# CONFIG_SENSORS_W83792D is not set -# CONFIG_SENSORS_W83793 is not set -# CONFIG_SENSORS_W83795 is not set -# CONFIG_SENSORS_W83L785TS is not set -# CONFIG_SENSORS_W83L786NG is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83627EHF is not set +CONFIG_SENSORS_PWM_FAN=y CONFIG_THERMAL=y -# CONFIG_THERMAL_STATISTICS is not set -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y -# CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set -# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set -# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y -# CONFIG_THERMAL_GOV_BANG_BANG is not set -# CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y -# CONFIG_CLOCK_THERMAL is not set CONFIG_DEVFREQ_THERMAL=y -# CONFIG_THERMAL_EMULATION is not set -# CONFIG_QORIQ_THERMAL is not set CONFIG_ROCKCHIP_THERMAL=y -# CONFIG_RK_VIRTUAL_THERMAL is not set -# CONFIG_RK3368_THERMAL is not set - -# -# ACPI INT340X thermal drivers -# -# CONFIG_GENERIC_ADC_THERMAL is not set +CONFIG_GENERIC_ADC_THERMAL=y CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_CORE=y -# CONFIG_WATCHDOG_NOWAYOUT is not set -CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y -# CONFIG_WATCHDOG_SYSFS is not set - -# -# Watchdog Device Drivers -# -# CONFIG_SOFT_WATCHDOG is not set -# CONFIG_GPIO_WATCHDOG is not set -# CONFIG_XILINX_WATCHDOG is not set -# CONFIG_ZIIRAVE_WATCHDOG is not set -# CONFIG_ARM_SP805_WATCHDOG is not set -# CONFIG_ARM_SBSA_WATCHDOG is not set -# CONFIG_CADENCE_WATCHDOG is not set CONFIG_DW_WATCHDOG=y -# CONFIG_MAX63XX_WATCHDOG is not set -# CONFIG_ALIM7101_WDT is not set -# CONFIG_I6300ESB_WDT is not set -# CONFIG_MEN_A21_WDT is not set - -# -# PCI-based Watchdog Cards -# -# CONFIG_PCIPCWATCHDOG is not set -# CONFIG_WDTPCI is not set - -# -# USB-based Watchdog Cards -# -# CONFIG_USBPCWATCHDOG is not set - -# -# Watchdog Pretimeout Governors -# -# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set -CONFIG_SSB_POSSIBLE=y -# CONFIG_SSB is not set -CONFIG_BCMA_POSSIBLE=y -# CONFIG_BCMA is not set - -# -# Multifunction device drivers -# -CONFIG_MFD_CORE=y -# CONFIG_MFD_ACT8945A is not set -# CONFIG_MFD_AS3711 is not set -# CONFIG_MFD_AS3722 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_AAT2870_CORE is not set -# CONFIG_MFD_ATMEL_FLEXCOM is not set -# CONFIG_MFD_ATMEL_HLCDC is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set -CONFIG_MFD_CROS_EC=y -# CONFIG_MFD_CROS_EC_CHARDEV is not set -# CONFIG_MFD_MADERA is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_SPI is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set -# CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_MC13XXX_SPI is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_HI6421_PMIC is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_HTC_I2CPLD is not set -# CONFIG_LPC_ICH is not set -# CONFIG_LPC_SCH is not set -# CONFIG_MFD_JANZ_CMODIO is not set -# CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77620 is not set -# CONFIG_MFD_MAX77686 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set -# CONFIG_EZX_PCAP is not set -# CONFIG_MFD_CPCAP is not set -# CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RC5T583 is not set -CONFIG_MFD_RK618=y -CONFIG_MFD_RK628=y -# CONFIG_MFD_RK630 is not set -# CONFIG_MFD_RK630_I2C is not set -# CONFIG_MFD_RK630_SPI is not set -CONFIG_MFD_RK808=y -# CONFIG_MFD_RK1000 is not set -# CONFIG_MFD_RN5T618 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set -# CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_MFD_SMSC is not set -# CONFIG_ABX500_CORE is not set -# CONFIG_MFD_STMPE is not set -CONFIG_MFD_SYSCON=y -# CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS65010 is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TPS65217 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TI_LP87565 is not set -# CONFIG_MFD_TPS65218 is not set +CONFIG_SSB=y +CONFIG_BCMA=y +CONFIG_MFD_RK8XX_I2C=y CONFIG_MFD_TPS6586X=y -# CONFIG_MFD_TPS65910 is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS65912_SPI is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set -# CONFIG_MFD_TC3589X is not set -# CONFIG_MFD_VX855 is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_ARIZONA_SPI is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM831X_SPI is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set -# CONFIG_MFD_ROHM_BD718XX is not set -# CONFIG_RAVE_SP_CORE is not set -CONFIG_FUSB_30X=y CONFIG_REGULATOR=y CONFIG_REGULATOR_DEBUG=y CONFIG_REGULATOR_FIXED_VOLTAGE=y -# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set -# CONFIG_REGULATOR_PROXY_CONSUMER is not set -# CONFIG_REGULATOR_88PG86X is not set +CONFIG_REGULATOR_VIRTUAL_CONSUMER=y +CONFIG_REGULATOR_USERSPACE_CONSUMER=y CONFIG_REGULATOR_ACT8865=y -# CONFIG_REGULATOR_AD5398 is not set -# CONFIG_REGULATOR_ANATOP is not set -# CONFIG_REGULATOR_DA9210 is not set -# CONFIG_REGULATOR_DA9211 is not set +CONFIG_REGULATOR_ARM_SCMI=y CONFIG_REGULATOR_FAN53555=y CONFIG_REGULATOR_GPIO=y -# CONFIG_REGULATOR_ISL9305 is not set -# CONFIG_REGULATOR_ISL6271A is not set -# CONFIG_REGULATOR_LP3971 is not set -# CONFIG_REGULATOR_LP3972 is not set -# CONFIG_REGULATOR_LP872X is not set -CONFIG_REGULATOR_LP8752=y -# CONFIG_REGULATOR_LP8755 is not set -# CONFIG_REGULATOR_LTC3589 is not set -# CONFIG_REGULATOR_LTC3676 is not set -# CONFIG_REGULATOR_MAX1586 is not set -# CONFIG_REGULATOR_MAX8649 is not set -# CONFIG_REGULATOR_MAX8660 is not set -# CONFIG_REGULATOR_MAX8952 is not set -# CONFIG_REGULATOR_MAX8973 is not set -CONFIG_REGULATOR_MP8865=y -# CONFIG_REGULATOR_MT6311 is not set -# CONFIG_REGULATOR_PFUZE100 is not set -# CONFIG_REGULATOR_PV88060 is not set -# CONFIG_REGULATOR_PV88080 is not set -# CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y CONFIG_REGULATOR_RK808=y -# CONFIG_REGULATOR_SY8106A is not set -# CONFIG_REGULATOR_TPS51632 is not set -# CONFIG_REGULATOR_TPS549B22 is not set -# CONFIG_REGULATOR_TPS62360 is not set -# CONFIG_REGULATOR_TPS65023 is not set -# CONFIG_REGULATOR_TPS6507X is not set -CONFIG_REGULATOR_TPS65132=y -# CONFIG_REGULATOR_TPS6524X is not set CONFIG_REGULATOR_TPS6586X=y -# CONFIG_REGULATOR_VCTRL is not set -CONFIG_REGULATOR_XZ3216=y -# CONFIG_REGULATOR_DIO5632 is not set -CONFIG_CEC_CORE=y -CONFIG_CEC_NOTIFIER=y -# CONFIG_RC_CORE is not set +CONFIG_REGULATOR_VCTRL=y +CONFIG_RC_CORE=y +CONFIG_LIRC=y +CONFIG_RC_DECODERS=y +CONFIG_IR_JVC_DECODER=y +CONFIG_IR_MCE_KBD_DECODER=y +CONFIG_IR_NEC_DECODER=y +CONFIG_IR_RC5_DECODER=y +CONFIG_IR_RC6_DECODER=y +CONFIG_IR_SANYO_DECODER=y +CONFIG_IR_SHARP_DECODER=y +CONFIG_IR_SONY_DECODER=y +CONFIG_IR_XMP_DECODER=y +CONFIG_RC_DEVICES=y +CONFIG_IR_GPIO_CIR=y +CONFIG_MEDIA_CEC_RC=y +CONFIG_MEDIA_CEC_SUPPORT=y +CONFIG_USB_PULSE8_CEC=m +CONFIG_USB_RAINSHADOW_CEC=m CONFIG_MEDIA_SUPPORT=y - -# -# Multimedia core support -# +CONFIG_MEDIA_SUPPORT_FILTER=y CONFIG_MEDIA_CAMERA_SUPPORT=y -# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set -# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set -# CONFIG_MEDIA_RADIO_SUPPORT is not set -# CONFIG_MEDIA_SDR_SUPPORT is not set -CONFIG_MEDIA_CEC_SUPPORT=y -CONFIG_MEDIA_CONTROLLER=y -CONFIG_VIDEO_DEV=y -CONFIG_VIDEO_V4L2_SUBDEV_API=y -CONFIG_VIDEO_V4L2=y -# CONFIG_VIDEO_ADV_DEBUG is not set -# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set -# CONFIG_VIDEO_PCI_SKELETON is not set -CONFIG_V4L2_MEM2MEM_DEV=y -# CONFIG_V4L2_FLASH_LED_CLASS is not set -CONFIG_V4L2_FWNODE=y - -# -# Media drivers -# +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_MEDIA_TEST_SUPPORT=y +CONFIG_DVB_MAX_ADAPTERS=8 +# CONFIG_DVB_DYNAMIC_MINORS is not set CONFIG_MEDIA_USB_SUPPORT=y - -# -# Webcam devices -# +CONFIG_VIDEO_USBTV=m CONFIG_USB_VIDEO_CLASS=y # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set -# CONFIG_USB_GSPCA is not set -# CONFIG_USB_PWC is not set -# CONFIG_VIDEO_CPIA2 is not set -# CONFIG_USB_ZR364XX is not set -# CONFIG_USB_STKWEBCAM is not set -# CONFIG_USB_S2255 is not set -# CONFIG_VIDEO_USBTV is not set - -# -# Webcam, TV (analog/digital) USB devices -# -# CONFIG_VIDEO_EM28XX is not set - -# -# USB HDMI CEC adapters -# -# CONFIG_USB_PULSE8_CEC is not set -# CONFIG_USB_RAINSHADOW_CEC is not set -# CONFIG_MEDIA_PCI_SUPPORT is not set +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m +CONFIG_DVB_AS102=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m +CONFIG_DVB_USB=y +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_CXUSB=m +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_DIBUSB_MB=m +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_VP7045=m +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_USB_AIRSPY=m +CONFIG_USB_HACKRF=m +CONFIG_USB_MSI2500=m +CONFIG_MEDIA_PCI_SUPPORT=y +CONFIG_VIDEO_CX23885=m +CONFIG_VIDEO_CX25821=m CONFIG_V4L_PLATFORM_DRIVERS=y -# CONFIG_VIDEO_CAFE_CCIC is not set -# CONFIG_VIDEO_CADENCE is not set -# CONFIG_VIDEO_MUX is not set -CONFIG_SOC_CAMERA=y -# CONFIG_SOC_CAMERA_PLATFORM is not set -# CONFIG_VIDEO_XILINX is not set -CONFIG_VIDEO_ROCKCHIP_CIF=y -CONFIG_ROCKCHIP_CIF_WORKMODE_PINGPONG=y -# CONFIG_ROCKCHIP_CIF_WORKMODE_ONEFRAME is not set -CONFIG_VIDEO_ROCKCHIP_ISP1=y -CONFIG_VIDEO_ROCKCHIP_ISP=y -# CONFIG_VIDEO_ROCKCHIP_ISPP is not set +CONFIG_DVB_PLATFORM_DRIVERS=y CONFIG_V4L_MEM2MEM_DRIVERS=y -# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set -# CONFIG_VIDEO_SH_VEU is not set CONFIG_VIDEO_ROCKCHIP_RGA=y -# CONFIG_V4L_TEST_DRIVERS is not set -# CONFIG_CEC_PLATFORM_DRIVERS is not set - -# -# Supported MMC/SDIO adapters -# -# CONFIG_CYPRESS_FIRMWARE is not set -CONFIG_VIDEOBUF2_CORE=y -CONFIG_VIDEOBUF2_V4L2=y -CONFIG_VIDEOBUF2_MEMOPS=y -CONFIG_VIDEOBUF2_DMA_CONTIG=y -CONFIG_VIDEOBUF2_VMALLOC=y -CONFIG_VIDEOBUF2_DMA_SG=y - -# -# Media ancillary drivers (tuners, sensors, i2c, spi, frontends) -# -# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set - -# -# I2C Encoders, decoders, sensors and other helper chips -# - -# -# Audio decoders, processors and mixers -# -# CONFIG_VIDEO_TVAUDIO is not set -# CONFIG_VIDEO_TDA7432 is not set -# CONFIG_VIDEO_TDA9840 is not set -# CONFIG_VIDEO_TDA1997X is not set -# CONFIG_VIDEO_TEA6415C is not set -# CONFIG_VIDEO_TEA6420 is not set -# CONFIG_VIDEO_MSP3400 is not set -# CONFIG_VIDEO_CS3308 is not set -# CONFIG_VIDEO_CS5345 is not set -# CONFIG_VIDEO_CS53L32A is not set -# CONFIG_VIDEO_TLV320AIC23B is not set -# CONFIG_VIDEO_UDA1342 is not set -# CONFIG_VIDEO_WM8775 is not set -# CONFIG_VIDEO_WM8739 is not set -# CONFIG_VIDEO_VP27SMPX is not set -# CONFIG_VIDEO_SONY_BTF_MPX is not set - -# -# RDS decoders -# -# CONFIG_VIDEO_SAA6588 is not set - -# -# Video decoders -# -# CONFIG_VIDEO_ADV7180 is not set -# CONFIG_VIDEO_ADV7183 is not set -# CONFIG_VIDEO_ADV748X is not set -# CONFIG_VIDEO_ADV7604 is not set -# CONFIG_VIDEO_ADV7842 is not set -# CONFIG_VIDEO_BT819 is not set -# CONFIG_VIDEO_BT856 is not set -# CONFIG_VIDEO_BT866 is not set -# CONFIG_VIDEO_KS0127 is not set -# CONFIG_VIDEO_ML86V7667 is not set -# CONFIG_VIDEO_AD5820 is not set -# CONFIG_VIDEO_AK7375 is not set -# CONFIG_VIDEO_DW9714 is not set -# CONFIG_VIDEO_DW9807_VCM is not set -# CONFIG_VIDEO_FP5510 is not set -# CONFIG_VIDEO_GT9760S is not set -# CONFIG_VIDEO_VM149C is not set -# CONFIG_VIDEO_SAA7110 is not set -# CONFIG_VIDEO_SAA711X is not set -# CONFIG_VIDEO_TC358743 is not set -# CONFIG_VIDEO_TC35874X is not set -CONFIG_VIDEO_RK628_CSI=y -# CONFIG_VIDEO_TECHPOINT is not set -# CONFIG_VIDEO_TVP514X is not set -# CONFIG_VIDEO_TVP5150 is not set -# CONFIG_VIDEO_TVP7002 is not set -# CONFIG_VIDEO_TW2804 is not set -# CONFIG_VIDEO_TW9903 is not set -# CONFIG_VIDEO_TW9906 is not set -# CONFIG_VIDEO_TW9910 is not set -# CONFIG_VIDEO_VPX3220 is not set - -# -# Video and audio decoders -# -# CONFIG_VIDEO_SAA717X is not set -# CONFIG_VIDEO_CX25840 is not set - -# -# Video encoders -# -# CONFIG_VIDEO_SAA7127 is not set -# CONFIG_VIDEO_SAA7185 is not set -# CONFIG_VIDEO_ADV7170 is not set -# CONFIG_VIDEO_ADV7175 is not set -# CONFIG_VIDEO_ADV7343 is not set -# CONFIG_VIDEO_ADV7393 is not set -# CONFIG_VIDEO_ADV7511 is not set -# CONFIG_VIDEO_AD9389B is not set -# CONFIG_VIDEO_AK881X is not set -# CONFIG_VIDEO_THS8200 is not set - -# -# Camera sensor devices -# -# CONFIG_VIDEO_IMX178 is not set -# CONFIG_VIDEO_IMX219 is not set -# CONFIG_VIDEO_IMX258 is not set -# CONFIG_VIDEO_IMX274 is not set -# CONFIG_VIDEO_IMX307 is not set -# CONFIG_VIDEO_IMX317 is not set -# CONFIG_VIDEO_IMX323 is not set -# CONFIG_VIDEO_IMX327 is not set -# CONFIG_VIDEO_IMX334 is not set -# CONFIG_VIDEO_IMX335 is not set -# CONFIG_VIDEO_IMX347 is not set -# CONFIG_VIDEO_IMX378 is not set -# CONFIG_VIDEO_IMX415 is not set -# CONFIG_VIDEO_IMX464 is not set -# CONFIG_VIDEO_OS02G10 is not set -CONFIG_VIDEO_OS04A10=y -# CONFIG_VIDEO_OS04C10 is not set -# CONFIG_VIDEO_OS05A20 is not set -# CONFIG_VIDEO_OS08A10 is not set -# CONFIG_VIDEO_OV02B10 is not set -# CONFIG_VIDEO_OV02K10 is not set -# CONFIG_VIDEO_OV2640 is not set -# CONFIG_VIDEO_OV2659 is not set -# CONFIG_VIDEO_OV2680 is not set -# CONFIG_VIDEO_OV2685 is not set -# CONFIG_VIDEO_OV2718 is not set -# CONFIG_VIDEO_OV2735 is not set -# CONFIG_VIDEO_OV2775 is not set -# CONFIG_VIDEO_OV4686 is not set -# CONFIG_VIDEO_OV4688 is not set -CONFIG_VIDEO_OV4689=y -# CONFIG_VIDEO_OV5640 is not set -# CONFIG_VIDEO_OV5645 is not set -# CONFIG_VIDEO_OV5647 is not set -# CONFIG_VIDEO_OV5648 is not set -# CONFIG_VIDEO_OV5670 is not set -CONFIG_VIDEO_OV5695=y -# CONFIG_VIDEO_OV6650 is not set -CONFIG_VIDEO_OV7251=y -# CONFIG_VIDEO_OV772X is not set -# CONFIG_VIDEO_OV7640 is not set -# CONFIG_VIDEO_OV7670 is not set -# CONFIG_VIDEO_OV7740 is not set -# CONFIG_VIDEO_OV7750 is not set -# CONFIG_VIDEO_OV8858 is not set -# CONFIG_VIDEO_OV9281 is not set -# CONFIG_VIDEO_OV9650 is not set -# CONFIG_VIDEO_OV9750 is not set -# CONFIG_VIDEO_OV12D2Q is not set -CONFIG_VIDEO_OV13850=y -# CONFIG_VIDEO_OV13858 is not set -# CONFIG_VIDEO_PREISP_DUMMY_SENSOR is not set -# CONFIG_VIDEO_VS6624 is not set -# CONFIG_VIDEO_MT9M032 is not set -# CONFIG_VIDEO_MT9M111 is not set -# CONFIG_VIDEO_MT9P031 is not set -# CONFIG_VIDEO_MT9T001 is not set -# CONFIG_VIDEO_MT9T112 is not set -# CONFIG_VIDEO_MT9V011 is not set -# CONFIG_VIDEO_MT9V032 is not set -# CONFIG_VIDEO_MT9V111 is not set -# CONFIG_VIDEO_AR0230 is not set -# CONFIG_VIDEO_SR030PC30 is not set -# CONFIG_VIDEO_NOON010PC30 is not set -# CONFIG_VIDEO_M5MOLS is not set -# CONFIG_VIDEO_RJ54N1 is not set -# CONFIG_VIDEO_S5K6AA is not set -# CONFIG_VIDEO_S5K6A3 is not set -# CONFIG_VIDEO_S5KGM1SP is not set -# CONFIG_VIDEO_S5K4H7YX is not set -# CONFIG_VIDEO_S5K4ECGX is not set -# CONFIG_VIDEO_S5K5BAF is not set -# CONFIG_VIDEO_SMIAPP is not set -# CONFIG_VIDEO_ET8EK8 is not set -# CONFIG_VIDEO_S5C73M3 is not set -# CONFIG_VIDEO_GC02M2 is not set -# CONFIG_VIDEO_GC0312 is not set -# CONFIG_VIDEO_GC0329 is not set -# CONFIG_VIDEO_GC032A is not set -# CONFIG_VIDEO_GC0403 is not set -# CONFIG_VIDEO_GC2035 is not set -CONFIG_VIDEO_GC2053=y -CONFIG_VIDEO_GC2093=y -# CONFIG_VIDEO_GC2145 is not set -# CONFIG_VIDEO_GC2155 is not set -# CONFIG_VIDEO_GC2355 is not set -# CONFIG_VIDEO_GC2375H is not set -# CONFIG_VIDEO_GC2385 is not set -# CONFIG_VIDEO_GC4663 is not set -# CONFIG_VIDEO_GC4C33 is not set -# CONFIG_VIDEO_GC5024 is not set -# CONFIG_VIDEO_GC5025 is not set -# CONFIG_VIDEO_GC5035 is not set -CONFIG_VIDEO_GC8034=y -# CONFIG_VIDEO_BF3925 is not set -# CONFIG_VIDEO_JX_F37 is not set -# CONFIG_VIDEO_JX_H62 is not set -# CONFIG_VIDEO_JX_H65 is not set -# CONFIG_VIDEO_JX_K04 is not set -# CONFIG_VIDEO_SC031GS is not set -# CONFIG_VIDEO_SC035HGS is not set -# CONFIG_VIDEO_SC132GS is not set -# CONFIG_VIDEO_SC200AI is not set -# CONFIG_VIDEO_SC210IOT is not set -# CONFIG_VIDEO_SC2232 is not set -# CONFIG_VIDEO_SC2239 is not set -# CONFIG_VIDEO_SC2310 is not set -# CONFIG_VIDEO_SC2335 is not set -# CONFIG_VIDEO_SC401AI is not set -# CONFIG_VIDEO_SC4238 is not set -# CONFIG_VIDEO_SC430CS is not set -# CONFIG_VIDEO_SC500AI is not set -# CONFIG_VIDEO_SC8220 is not set -# CONFIG_VIDEO_SP250A is not set -# CONFIG_VIDEO_HYNIX_HI556 is not set -# CONFIG_VIDEO_HYNIX_HI846 is not set - -# -# Flash devices -# -# CONFIG_VIDEO_ADP1653 is not set -# CONFIG_VIDEO_LM3560 is not set -# CONFIG_VIDEO_LM3646 is not set -# CONFIG_VIDEO_SGM3784 is not set - -# -# Video improvement chips -# -# CONFIG_VIDEO_UPD64031A is not set -# CONFIG_VIDEO_UPD64083 is not set - -# -# Audio/Video compression chips -# -# CONFIG_VIDEO_SAA6752HS is not set - -# -# SDR tuner chips -# - -# -# Miscellaneous helper chips -# -# CONFIG_VIDEO_THS7303 is not set -# CONFIG_VIDEO_M52790 is not set -# CONFIG_VIDEO_I2C is not set -# CONFIG_VIDEO_NVP6158 is not set -# CONFIG_VIDEO_NVP6188 is not set -# CONFIG_VIDEO_NVP6324 is not set -# CONFIG_VIDEO_HALL_DC_MOTOR is not set -# CONFIG_VIDEO_RK_IRCUT is not set -# CONFIG_VIDEO_MP6507 is not set - -# -# Sensors used on soc_camera driver -# - -# -# soc_camera sensor drivers -# -# CONFIG_SOC_CAMERA_MT9M001 is not set -# CONFIG_SOC_CAMERA_MT9M111 is not set -# CONFIG_SOC_CAMERA_MT9T112 is not set -# CONFIG_SOC_CAMERA_MT9V022 is not set -# CONFIG_SOC_CAMERA_OV5642 is not set -# CONFIG_SOC_CAMERA_OV772X is not set -# CONFIG_SOC_CAMERA_OV9640 is not set -# CONFIG_SOC_CAMERA_OV9740 is not set -# CONFIG_SOC_CAMERA_RJ54N1 is not set -# CONFIG_SOC_CAMERA_TW9910 is not set - -# -# SPI helper chips -# -# CONFIG_VIDEO_GS1662 is not set -# CONFIG_VIDEO_ROCKCHIP_PREISP is not set - -# -# Media SPI Adapters -# - -# -# Customise DVB Frontends -# - -# -# Tools to develop new frontends -# - -# -# Graphics support -# -# CONFIG_VGA_ARB is not set +CONFIG_VIDEO_HANTRO=y +# CONFIG_VIDEO_IR_I2C is not set +CONFIG_VIDEO_IMX219=y +CONFIG_VIDEO_OV5645=y +CONFIG_CXD2880_SPI_DRV=m +CONFIG_DVB_ASCOT2E=m +CONFIG_DVB_HELENE=m +CONFIG_DVB_HORUS3A=m +CONFIG_DVB_ISL6405=m +CONFIG_DVB_LGS8GL5=m +CONFIG_DVB_LNBH25=m +CONFIG_DVB_LNBH29=m +CONFIG_DVB_TDA665x=m +CONFIG_DVB_CXD2099=m CONFIG_DRM=y -CONFIG_DRM_IGNORE_IOTCL_PERMIT=y -CONFIG_DRM_MIPI_DSI=y -# CONFIG_DRM_DP_AUX_CHARDEV is not set -# CONFIG_DRM_DEBUG_MM is not set -# CONFIG_DRM_DEBUG_SELFTEST is not set -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_KMS_FB_HELPER=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=200 -# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y -# CONFIG_DRM_DP_CEC is not set -CONFIG_DRM_TTM=m -CONFIG_DRM_GEM_CMA_HELPER=y - -# -# I2C encoder or helper chips -# -# CONFIG_DRM_I2C_CH7006 is not set -# CONFIG_DRM_I2C_SIL164 is not set -# CONFIG_DRM_I2C_NXP_TDA998X is not set -# CONFIG_DRM_I2C_NXP_TDA9950 is not set -# CONFIG_DRM_HDLCD is not set -# CONFIG_DRM_MALI_DISPLAY is not set -# CONFIG_DRM_RADEON is not set -# CONFIG_DRM_AMDGPU is not set - -# -# ACP (Audio CoProcessor) Configuration -# - -# -# AMD Library routines -# -# CONFIG_DRM_NOUVEAU is not set -# CONFIG_DRM_VGEM is not set -# CONFIG_DRM_VKMS is not set +CONFIG_DRM_MALI_DISPLAY=y CONFIG_DRM_ROCKCHIP=y -# CONFIG_ROCKCHIP_DRM_DEBUG is not set -CONFIG_ROCKCHIP_ANALOGIX_DP=y -CONFIG_ROCKCHIP_CDN_DP=y +CONFIG_ROCKCHIP_VOP2=y CONFIG_ROCKCHIP_DW_HDMI=y CONFIG_ROCKCHIP_DW_MIPI_DSI=y -CONFIG_ROCKCHIP_INNO_HDMI=y -CONFIG_ROCKCHIP_LVDS=y -CONFIG_ROCKCHIP_DRM_TVE=y -CONFIG_ROCKCHIP_RGB=y -# CONFIG_DRM_ROCKCHIP_VVOP is not set -# CONFIG_ROCKCHIP_EBC_DEV is not set -CONFIG_DRM_ROCKCHIP_RK618=y -# CONFIG_DRM_ROCKCHIP_RK628 is not set -# CONFIG_DRM_UDL is not set -# CONFIG_DRM_AST is not set -# CONFIG_DRM_MGAG200 is not set -# CONFIG_DRM_CIRRUS_QEMU is not set -# CONFIG_DRM_RCAR_DW_HDMI is not set -# CONFIG_DRM_RCAR_LVDS is not set -# CONFIG_DRM_QXL is not set -# CONFIG_DRM_BOCHS is not set -CONFIG_DRM_PANEL=y - -# -# Display Panels -# -# CONFIG_DRM_PANEL_ARM_VERSATILE is not set -# CONFIG_DRM_PANEL_LVDS is not set -CONFIG_DRM_PANEL_SIMPLE=y -# CONFIG_DRM_PANEL_SIMPLE_OF_ONLY is not set -# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set -# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set -# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set -# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set -# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set -# CONFIG_DRM_PANEL_LG_LG4573 is not set -# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set -# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set -# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set -# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set -# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set -# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_PANEL_BRIDGE=y - -# -# Display Interface Bridges -# -# CONFIG_DRM_ANALOGIX_ANX78XX is not set -# CONFIG_DRM_CDNS_DSI is not set -# CONFIG_DRM_DUMB_VGA_DAC is not set -# CONFIG_DRM_LVDS_ENCODER is not set -# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set -# CONFIG_DRM_NXP_PTN3460 is not set -# CONFIG_DRM_PARADE_PS8622 is not set -# CONFIG_DRM_RK1000_TVE is not set -# CONFIG_DRM_SIL_SII8620 is not set -CONFIG_DRM_SII902X=y -# CONFIG_DRM_SII9234 is not set -# CONFIG_DRM_THINE_THC63LVD1024 is not set -# CONFIG_DRM_TOSHIBA_TC358767 is not set -# CONFIG_DRM_TI_TFP410 is not set -CONFIG_DRM_ANALOGIX_DP=y -# CONFIG_DRM_I2C_ADV7511 is not set -CONFIG_DRM_DW_HDMI=y -# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set -CONFIG_DRM_DW_HDMI_I2S_AUDIO=y +CONFIG_DRM_PANEL_ELIDA_KD35T133=y +CONFIG_DRM_PANEL_HIMAX_HX8394=y +CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966=y +CONFIG_DRM_PANEL_NEWVISION_NV3051D=y +CONFIG_DRM_PANEL_SITRONIX_ST7701=y +CONFIG_DRM_PANEL_SITRONIX_ST7703=y +CONFIG_DRM_DISPLAY_CONNECTOR=y CONFIG_DRM_DW_HDMI_CEC=y -# CONFIG_DRM_ARCPGU is not set -# CONFIG_DRM_HISI_HIBMC is not set -# CONFIG_DRM_HISI_KIRIN is not set -# CONFIG_DRM_MXSFB is not set -# CONFIG_DRM_TINYDRM is not set -# CONFIG_DRM_PL111 is not set -# CONFIG_DRM_LEGACY is not set -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_MALI400=y -CONFIG_MALI450=y -# CONFIG_MALI470 is not set -# CONFIG_MALI400_DEBUG is not set -# CONFIG_MALI400_PROFILING is not set -# CONFIG_MALI400_UMP is not set -CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH=y -CONFIG_MALI_SHARED_INTERRUPTS=y -# CONFIG_MALI_PMU_PARALLEL_POWER_UP is not set -CONFIG_MALI_DT=y -CONFIG_MALI_DEVFREQ=y -# CONFIG_MALI_QUIET is not set -CONFIG_MALI_MIDGARD_FOR_ANDROID=y -# CONFIG_MALI_MIDGARD_FOR_LINUX is not set -CONFIG_MALI_MIDGARD=y -# CONFIG_MALI_GATOR_SUPPORT is not set -# CONFIG_MALI_MIDGARD_ENABLE_TRACE is not set -# CONFIG_MALI_DMA_FENCE is not set -CONFIG_MALI_EXPERT=y -# CONFIG_MALI_CORESTACK is not set -# CONFIG_MALI_PRFCNT_SET_SECONDARY is not set -# CONFIG_MALI_PLATFORM_FAKE is not set -# CONFIG_MALI_PLATFORM_DEVICETREE is not set -CONFIG_MALI_PLATFORM_THIRDPARTY=y -CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk" -CONFIG_MALI_DEBUG=y -CONFIG_MALI_FENCE_DEBUG=y -# CONFIG_MALI_NO_MALI is not set -# CONFIG_MALI_TRACE_TIMELINE is not set -# CONFIG_MALI_SYSTEM_TRACE is not set -# CONFIG_MALI_GPU_MMU_AARCH64 is not set -CONFIG_MALI_PWRSOFT_765=y -# CONFIG_MALI_KUTF is not set -CONFIG_MALI_BIFROST_FOR_ANDROID=y -# CONFIG_MALI_BIFROST_FOR_LINUX is not set -CONFIG_MALI_BIFROST=y -CONFIG_MALI_BIFROST_GATOR_SUPPORT=y -# CONFIG_MALI_BIFROST_ENABLE_TRACE is not set -CONFIG_MALI_BIFROST_DEVFREQ=y -# CONFIG_MALI_BIFROST_DMA_FENCE is not set -CONFIG_MALI_PLATFORM_NAME="rk" -# CONFIG_MALI_ARBITER_SUPPORT is not set -# CONFIG_MALI_BIFROST_EXPERT is not set -CONFIG_MALI_REAL_HW=y -# CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND is not set -# CONFIG_MALI_DMA_BUF_LEGACY_COMPAT is not set -# CONFIG_MALI_GEM5_BUILD is not set - -# -# Frame buffer Devices -# -CONFIG_FB_CMDLINE=y -CONFIG_FB_NOTIFY=y +CONFIG_DRM_PANEL_MIPI_DBI=y +CONFIG_DRM_PANFROST=y CONFIG_FB=y -# CONFIG_FIRMWARE_EDID is not set -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_FOREIGN_ENDIAN is not set -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_DEFERRED_IO=y -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_TILEBLITTING is not set - -# -# Frame buffer hardware drivers -# -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set -# CONFIG_FB_ARMCLCD is not set -# CONFIG_FB_CYBER2000 is not set -# CONFIG_FB_ASILIANT is not set -# CONFIG_FB_IMSTT is not set -# CONFIG_FB_UVESA is not set -# CONFIG_FB_OPENCORES is not set -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_NVIDIA is not set -# CONFIG_FB_RIVA is not set -# CONFIG_FB_I740 is not set -# CONFIG_FB_MATROX is not set -# CONFIG_FB_RADEON is not set -# CONFIG_FB_ATY128 is not set -# CONFIG_FB_ATY is not set -# CONFIG_FB_S3 is not set -# CONFIG_FB_SAVAGE is not set -# CONFIG_FB_SIS is not set -# CONFIG_FB_NEOMAGIC is not set -# CONFIG_FB_KYRO is not set -# CONFIG_FB_3DFX is not set -# CONFIG_FB_VOODOO1 is not set -# CONFIG_FB_VT8623 is not set -# CONFIG_FB_TRIDENT is not set -# CONFIG_FB_ARK is not set -# CONFIG_FB_PM3 is not set -# CONFIG_FB_CARMINE is not set -# CONFIG_FB_SMSCUFX is not set -# CONFIG_FB_UDL is not set -# CONFIG_FB_IBM_GXT4500 is not set -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FB_METRONOME is not set -# CONFIG_FB_MB862XX is not set -# CONFIG_FB_BROADSHEET is not set -# CONFIG_FB_SIMPLE is not set -# CONFIG_FB_SSD1307 is not set -# CONFIG_FB_SM712 is not set -CONFIG_BACKLIGHT_LCD_SUPPORT=y -# CONFIG_LCD_CLASS_DEVICE is not set -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BACKLIGHT_GENERIC=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_MODE_HELPERS=y CONFIG_BACKLIGHT_PWM=y -# CONFIG_BACKLIGHT_PM8941_WLED is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_LM3630A is not set -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LP855X is not set -# CONFIG_BACKLIGHT_GPIO is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set - -# -# Rockchip Misc Video driver -# - -# -# RGA -# -# CONFIG_ROCKCHIP_RGA is not set - -# -# RGA2 -# -CONFIG_ROCKCHIP_RGA2=y - -# -# IEP -# -# CONFIG_IEP is not set -# CONFIG_IEP_MMU is not set -CONFIG_ROCKCHIP_MPP_SERVICE=y -CONFIG_ROCKCHIP_MPP_RKVDEC=y -CONFIG_ROCKCHIP_MPP_RKVDEC2=y -CONFIG_ROCKCHIP_MPP_RKVENC=y -CONFIG_ROCKCHIP_MPP_VDPU1=y -CONFIG_ROCKCHIP_MPP_VEPU1=y -CONFIG_ROCKCHIP_MPP_VDPU2=y -CONFIG_ROCKCHIP_MPP_VEPU2=y -CONFIG_ROCKCHIP_MPP_IEP2=y -CONFIG_ROCKCHIP_MPP_JPGDEC=y -CONFIG_VIDEOMODE_HELPERS=y -CONFIG_HDMI=y - -# -# Console display driver support -# -CONFIG_DUMMY_CONSOLE=y -CONFIG_DUMMY_CONSOLE_COLUMNS=80 -CONFIG_DUMMY_CONSOLE_ROWS=25 -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_BACKLIGHT_LED=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y -# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set -# CONFIG_LOGO is not set CONFIG_SOUND=y CONFIG_SND=y -CONFIG_SND_TIMER=y -CONFIG_SND_PCM=y -CONFIG_SND_PCM_ELD=y -CONFIG_SND_PCM_IEC958=y -CONFIG_SND_DMAENGINE_PCM=y -CONFIG_SND_HWDEP=y -CONFIG_SND_SEQ_DEVICE=y -CONFIG_SND_RAWMIDI=y -CONFIG_SND_JACK=y -CONFIG_SND_JACK_INPUT_DEV=y -# CONFIG_SND_OSSEMUL is not set -CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=y CONFIG_SND_DYNAMIC_MINORS=y -CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set -CONFIG_SND_PROC_FS=y -CONFIG_SND_VERBOSE_PROCFS=y -# CONFIG_SND_VERBOSE_PRINTK is not set -# CONFIG_SND_DEBUG is not set +# CONFIG_SND_VERBOSE_PROCFS is not set +CONFIG_SND_VERBOSE_PRINTK=y CONFIG_SND_SEQUENCER=y CONFIG_SND_SEQ_DUMMY=y -CONFIG_SND_SEQ_HRTIMER_DEFAULT=y -CONFIG_SND_SEQ_MIDI_EVENT=y -CONFIG_SND_SEQ_MIDI=y -CONFIG_SND_DRIVERS=y -# CONFIG_SND_DUMMY is not set -# CONFIG_SND_ALOOP is not set -# CONFIG_SND_VIRMIDI is not set -# CONFIG_SND_MTPAV is not set -# CONFIG_SND_SERIAL_U16550 is not set -# CONFIG_SND_MPU401 is not set +# CONFIG_SND_DRIVERS is not set # CONFIG_SND_PCI is not set - -# -# HD-Audio -# -CONFIG_SND_HDA_PREALLOC_SIZE=64 # CONFIG_SND_SPI is not set -CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y -# CONFIG_SND_USB_UA101 is not set -# CONFIG_SND_USB_CAIAQ is not set -# CONFIG_SND_USB_6FIRE is not set -# CONFIG_SND_USB_HIFACE is not set -# CONFIG_SND_BCD2000 is not set -# CONFIG_SND_USB_POD is not set -# CONFIG_SND_USB_PODHD is not set -# CONFIG_SND_USB_TONEPORT is not set -# CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y -CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y -# CONFIG_SND_SOC_AMD_ACP is not set -# CONFIG_SND_ATMEL_SOC is not set -# CONFIG_SND_DESIGNWARE_I2S is not set - -# -# SoC Audio for Freescale CPUs -# - -# -# Common SoC Audio options for Freescale CPUs: -# -# CONFIG_SND_SOC_FSL_ASRC is not set -# CONFIG_SND_SOC_FSL_SAI is not set -# CONFIG_SND_SOC_FSL_SSI is not set -# CONFIG_SND_SOC_FSL_SPDIF is not set -# CONFIG_SND_SOC_FSL_ESAI is not set -# CONFIG_SND_SOC_IMX_AUDMUX is not set -# CONFIG_SND_I2S_HI6210_I2S is not set -# CONFIG_SND_SOC_IMG is not set +CONFIG_SND_SOC_FSL_SAI=y CONFIG_SND_SOC_ROCKCHIP=y -CONFIG_SND_SOC_ROCKCHIP_PREALLOC_BUFFER_SIZE=512 -# CONFIG_SND_SOC_ROCKCHIP_AUDIO_PWM is not set -CONFIG_SND_SOC_ROCKCHIP_I2S=y CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y CONFIG_SND_SOC_ROCKCHIP_PDM=y CONFIG_SND_SOC_ROCKCHIP_SPDIF=y -# CONFIG_SND_SOC_ROCKCHIP_VAD is not set -CONFIG_SND_SOC_ROCKCHIP_MAX98090=y -CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y -CONFIG_SND_SOC_ROCKCHIP_RT5645=y -# CONFIG_SND_SOC_ROCKCHIP_RT5651 is not set -CONFIG_SND_SOC_ROCKCHIP_RT5651_RK628=y -# CONFIG_SND_SOC_RK3288_HDMI_ANALOG is not set -# CONFIG_SND_SOC_RK3399_GRU_SOUND is not set - -# -# STMicroelectronics STM32 SOC audio support -# -# CONFIG_SND_SOC_XTFPGA_I2S is not set -# CONFIG_ZX_TDM is not set -CONFIG_SND_SOC_I2C_AND_SPI=y - -# -# CODEC drivers -# -# CONFIG_SND_SOC_AC97_CODEC is not set -# CONFIG_SND_SOC_ADAU1701 is not set -# CONFIG_SND_SOC_ADAU1761_I2C is not set -# CONFIG_SND_SOC_ADAU1761_SPI is not set -# CONFIG_SND_SOC_ADAU7002 is not set -# CONFIG_SND_SOC_AK4104 is not set -# CONFIG_SND_SOC_AK4458 is not set -# CONFIG_SND_SOC_AK4554 is not set -# CONFIG_SND_SOC_AK4613 is not set -# CONFIG_SND_SOC_AK4642 is not set -# CONFIG_SND_SOC_AK5386 is not set -# CONFIG_SND_SOC_AK5558 is not set -# CONFIG_SND_SOC_ALC5623 is not set -# CONFIG_SND_SOC_BD28623 is not set -# CONFIG_SND_SOC_BT_SCO is not set -# CONFIG_SND_SOC_CS35L32 is not set -# CONFIG_SND_SOC_CS35L33 is not set -# CONFIG_SND_SOC_CS35L34 is not set -# CONFIG_SND_SOC_CS35L35 is not set -# CONFIG_SND_SOC_CS42L42 is not set -# CONFIG_SND_SOC_CS42L51_I2C is not set -# CONFIG_SND_SOC_CS42L52 is not set -# CONFIG_SND_SOC_CS42L56 is not set -# CONFIG_SND_SOC_CS42L73 is not set -# CONFIG_SND_SOC_CS4265 is not set -# CONFIG_SND_SOC_CS4270 is not set -# CONFIG_SND_SOC_CS4271_I2C is not set -# CONFIG_SND_SOC_CS4271_SPI is not set -# CONFIG_SND_SOC_CS42XX8_I2C is not set -# CONFIG_SND_SOC_CS43130 is not set -# CONFIG_SND_SOC_CS4349 is not set -# CONFIG_SND_SOC_CS53L30 is not set -# CONFIG_SND_SOC_CX2072X is not set -CONFIG_SND_SOC_DUMMY_CODEC=y -CONFIG_SND_SOC_HDMI_CODEC=y -# CONFIG_SND_SOC_ES7134 is not set -CONFIG_SND_SOC_ES7202=y -# CONFIG_SND_SOC_ES7210 is not set -# CONFIG_SND_SOC_ES7241 is not set -CONFIG_SND_SOC_ES7243E=y -CONFIG_SND_SOC_ES8311=y +CONFIG_SND_SOC_RK3288_HDMI_ANALOG=y CONFIG_SND_SOC_ES8316=y -# CONFIG_SND_SOC_ES8323 is not set -# CONFIG_SND_SOC_ES8328_I2C is not set -# CONFIG_SND_SOC_ES8328_SPI is not set -# CONFIG_SND_SOC_ES8396 is not set -# CONFIG_SND_SOC_GTM601 is not set -# CONFIG_SND_SOC_INNO_RK3036 is not set CONFIG_SND_SOC_MAX98090=y -# CONFIG_SND_SOC_MAX98504 is not set -# CONFIG_SND_SOC_MAX9867 is not set -# CONFIG_SND_SOC_MAX98927 is not set -# CONFIG_SND_SOC_MAX98373 is not set -# CONFIG_SND_SOC_MAX9860 is not set -# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set -# CONFIG_SND_SOC_PCM1681 is not set -# CONFIG_SND_SOC_PCM1789_I2C is not set -# CONFIG_SND_SOC_PCM179X_I2C is not set -# CONFIG_SND_SOC_PCM179X_SPI is not set -# CONFIG_SND_SOC_PCM186X_I2C is not set -# CONFIG_SND_SOC_PCM186X_SPI is not set -# CONFIG_SND_SOC_PCM3168A_I2C is not set -# CONFIG_SND_SOC_PCM3168A_SPI is not set -# CONFIG_SND_SOC_PCM512x_I2C is not set -# CONFIG_SND_SOC_PCM512x_SPI is not set -# CONFIG_SND_SOC_RK312X is not set -# CONFIG_SND_SOC_RK3228 is not set -CONFIG_SND_SOC_RK3308=y -CONFIG_SND_SOC_RK3328=y CONFIG_SND_SOC_RK817=y -CONFIG_SND_SOC_RK_CODEC_DIGITAL=y -CONFIG_SND_SOC_RL6231=y -CONFIG_SND_SOC_RT5616=y -# CONFIG_SND_SOC_RT5631 is not set -CONFIG_SND_SOC_RT5640=y -CONFIG_SND_SOC_RT5645=y -CONFIG_SND_SOC_RT5651=y -# CONFIG_SND_SOC_SGTL5000 is not set -# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set -# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set +CONFIG_SND_SOC_SIMPLE_AMPLIFIER=y CONFIG_SND_SOC_SPDIF=y -# CONFIG_SND_SOC_SSM2305 is not set -# CONFIG_SND_SOC_SSM2602_SPI is not set -# CONFIG_SND_SOC_SSM2602_I2C is not set -# CONFIG_SND_SOC_SSM4567 is not set -# CONFIG_SND_SOC_STA32X is not set -# CONFIG_SND_SOC_STA350 is not set -# CONFIG_SND_SOC_STI_SAS is not set -# CONFIG_SND_SOC_TAS2552 is not set -# CONFIG_SND_SOC_TAS5086 is not set -# CONFIG_SND_SOC_TAS571X is not set -# CONFIG_SND_SOC_TAS5720 is not set -# CONFIG_SND_SOC_TAS6424 is not set -# CONFIG_SND_SOC_TDA7419 is not set -# CONFIG_SND_SOC_TFA9879 is not set -# CONFIG_SND_SOC_TLV320AIC23_I2C is not set -# CONFIG_SND_SOC_TLV320AIC23_SPI is not set -# CONFIG_SND_SOC_TLV320AIC31XX is not set -# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set -# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set -# CONFIG_SND_SOC_TLV320AIC3X is not set CONFIG_SND_SOC_TS3A227E=y -# CONFIG_SND_SOC_TSCS42XX is not set -# CONFIG_SND_SOC_TSCS454 is not set -# CONFIG_SND_SOC_WM8510 is not set -# CONFIG_SND_SOC_WM8523 is not set -# CONFIG_SND_SOC_WM8524 is not set -# CONFIG_SND_SOC_WM8580 is not set -# CONFIG_SND_SOC_WM8711 is not set -# CONFIG_SND_SOC_WM8728 is not set -# CONFIG_SND_SOC_WM8731 is not set -# CONFIG_SND_SOC_WM8737 is not set -# CONFIG_SND_SOC_WM8741 is not set -# CONFIG_SND_SOC_WM8750 is not set -# CONFIG_SND_SOC_WM8753 is not set -# CONFIG_SND_SOC_WM8770 is not set -# CONFIG_SND_SOC_WM8776 is not set -# CONFIG_SND_SOC_WM8782 is not set -# CONFIG_SND_SOC_WM8804_I2C is not set -# CONFIG_SND_SOC_WM8804_SPI is not set -# CONFIG_SND_SOC_WM8903 is not set -# CONFIG_SND_SOC_WM8960 is not set -# CONFIG_SND_SOC_WM8962 is not set -# CONFIG_SND_SOC_WM8974 is not set -# CONFIG_SND_SOC_WM8978 is not set -# CONFIG_SND_SOC_WM8985 is not set -# CONFIG_SND_SOC_ZX_AUD96P22 is not set -# CONFIG_SND_SOC_MAX9759 is not set -# CONFIG_SND_SOC_MT6351 is not set -# CONFIG_SND_SOC_NAU8540 is not set -# CONFIG_SND_SOC_NAU8810 is not set -# CONFIG_SND_SOC_NAU8824 is not set -# CONFIG_SND_SOC_TPA6130A2 is not set -CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y -# CONFIG_SND_SIMPLE_SCU_CARD is not set -# CONFIG_SND_AUDIO_GRAPH_CARD is not set -# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set - -# -# HID support -# -CONFIG_HID=y +CONFIG_SND_AUDIO_GRAPH_CARD=y +CONFIG_SND_AUDIO_GRAPH_CARD2=y +CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE=y +CONFIG_SND_TEST_COMPONENT=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y CONFIG_UHID=y -CONFIG_HID_GENERIC=y - -# -# Special HID drivers -# -# CONFIG_HID_A4TECH is not set -# CONFIG_HID_ACCUTOUCH is not set -# CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set -# CONFIG_HID_APPLEIR is not set -# CONFIG_HID_ASUS is not set -# CONFIG_HID_AUREAL is not set -# CONFIG_HID_BELKIN is not set -# CONFIG_HID_BETOP_FF is not set -# CONFIG_HID_CHERRY is not set -# CONFIG_HID_CHICONY is not set -# CONFIG_HID_CORSAIR is not set -# CONFIG_HID_COUGAR is not set -# CONFIG_HID_PRODIKEYS is not set -# CONFIG_HID_CMEDIA is not set -# CONFIG_HID_CP2112 is not set -# CONFIG_HID_CYPRESS is not set -# CONFIG_HID_DRAGONRISE is not set -# CONFIG_HID_EMS_FF is not set -# CONFIG_HID_ELAN is not set -# CONFIG_HID_ELECOM is not set -# CONFIG_HID_ELO is not set -# CONFIG_HID_EZKEY is not set -# CONFIG_HID_GEMBIRD is not set -# CONFIG_HID_GFRM is not set -# CONFIG_HID_HOLTEK is not set -# CONFIG_HID_GOOGLE_HAMMER is not set -# CONFIG_HID_GT683R is not set -# CONFIG_HID_KEYTOUCH is not set -# CONFIG_HID_KYE is not set -# CONFIG_HID_UCLOGIC is not set -# CONFIG_HID_WALTOP is not set -# CONFIG_HID_GYRATION is not set -# CONFIG_HID_ICADE is not set -# CONFIG_HID_ITE is not set -# CONFIG_HID_JABRA is not set -# CONFIG_HID_TWINHAN is not set +CONFIG_HID_A4TECH=y +CONFIG_HID_ACRUX=y +CONFIG_HID_APPLE=y +CONFIG_HID_APPLEIR=y +CONFIG_HID_AUREAL=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BETOP_FF=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CORSAIR=y +CONFIG_HID_PRODIKEYS=y +CONFIG_HID_CP2112=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_DRAGONRISE=y +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=y +CONFIG_HID_ELECOM=y +CONFIG_HID_ELO=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GEMBIRD=y +CONFIG_HID_GFRM=y +CONFIG_HID_HOLTEK=y +CONFIG_HOLTEK_FF=y +CONFIG_HID_GT683R=y +CONFIG_HID_KEYTOUCH=y +CONFIG_HID_KYE=y +CONFIG_HID_UCLOGIC=y +CONFIG_HID_WALTOP=y +CONFIG_HID_GYRATION=y +CONFIG_HID_ICADE=y +CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y -# CONFIG_HID_LCPOWER is not set -# CONFIG_HID_LED is not set -# CONFIG_HID_LENOVO is not set -# CONFIG_HID_LOGITECH is not set -# CONFIG_HID_MAGICMOUSE is not set -# CONFIG_HID_MAYFLASH is not set -# CONFIG_HID_REDRAGON is not set -# CONFIG_HID_MICROSOFT is not set -# CONFIG_HID_MONTEREY is not set +CONFIG_HID_LCPOWER=y +CONFIG_HID_LENOVO=y +CONFIG_HID_LOGITECH=y +CONFIG_HID_LOGITECH_DJ=y +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=y -# CONFIG_HID_NINTENDO is not set -# CONFIG_HID_NTI is not set -# CONFIG_HID_NTRIG is not set -# CONFIG_HID_ORTEK is not set -# CONFIG_HID_PANTHERLORD is not set -# CONFIG_HID_PENMOUNT is not set -# CONFIG_HID_PETALYNX is not set -# CONFIG_HID_PICOLCD is not set -# CONFIG_HID_PLANTRONICS is not set -# CONFIG_HID_PRIMAX is not set -# CONFIG_HID_RETRODE is not set -# CONFIG_HID_ROCCAT is not set -# CONFIG_HID_SAITEK is not set -# CONFIG_HID_SAMSUNG is not set -# CONFIG_HID_SONY is not set -# CONFIG_HID_SPEEDLINK is not set -# CONFIG_HID_STEAM is not set -# CONFIG_HID_STEELSERIES is not set -# CONFIG_HID_SUNPLUS is not set -# CONFIG_HID_RMI is not set -# CONFIG_HID_GREENASIA is not set -# CONFIG_HID_SMARTJOYPLUS is not set -# CONFIG_HID_TIVO is not set -# CONFIG_HID_TOPSEED is not set -# CONFIG_HID_THINGM is not set -# CONFIG_HID_THRUSTMASTER is not set -# CONFIG_HID_UDRAW_PS3 is not set -# CONFIG_HID_WACOM is not set -# CONFIG_HID_WIIMOTE is not set -# CONFIG_HID_XINMO is not set -# CONFIG_HID_ZEROPLUS is not set -# CONFIG_HID_ZYDACRON is not set -# CONFIG_HID_SENSOR_HUB is not set -# CONFIG_HID_ALPS is not set - -# -# USB HID support -# -CONFIG_USB_HID=y -# CONFIG_HID_PID is not set +CONFIG_HID_NTRIG=y +CONFIG_HID_ORTEK=y +CONFIG_HID_PANTHERLORD=y +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=y +CONFIG_HID_PETALYNX=y +CONFIG_HID_PLANTRONICS=y +CONFIG_HID_PRIMAX=y +CONFIG_HID_ROCCAT=y +CONFIG_HID_SAITEK=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_HID_SPEEDLINK=y +CONFIG_HID_STEELSERIES=y +CONFIG_HID_SUNPLUS=y +CONFIG_HID_RMI=y +CONFIG_HID_GREENASIA=y +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=y +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=y +CONFIG_HID_TOPSEED=y +CONFIG_HID_THINGM=y +CONFIG_HID_THRUSTMASTER=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_HID_WACOM=y +CONFIG_HID_WIIMOTE=y +CONFIG_HID_XINMO=y +CONFIG_HID_ZEROPLUS=y +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=y +CONFIG_HID_SENSOR_HUB=y +CONFIG_HID_SENSOR_CUSTOM_SENSOR=y +CONFIG_HID_ALPS=y CONFIG_USB_HIDDEV=y - -# -# I2C HID support -# -CONFIG_I2C_HID=y -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_COMMON=y -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB=y -CONFIG_USB_PCI=y +CONFIG_I2C_HID_OF_GOODIX=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y - -# -# Miscellaneous USB options -# # CONFIG_USB_DEFAULT_PERSIST is not set -# CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y -# CONFIG_USB_OTG_WHITELIST is not set -# CONFIG_USB_OTG_BLACKLIST_HUB is not set -# CONFIG_USB_OTG_FSM is not set -# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_OTG_PRODUCTLIST=y +CONFIG_USB_OTG_FSM=y +CONFIG_USB_LEDS_TRIGGER_USBPORT=y CONFIG_USB_MON=y -# CONFIG_USB_WUSB_CBAF is not set - -# -# USB Host Controller Drivers -# -# CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y -# CONFIG_USB_XHCI_DBGCAP is not set -CONFIG_USB_XHCI_PCI=y -CONFIG_USB_XHCI_PLATFORM=y CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y -CONFIG_USB_EHCI_TT_NEWSCHED=y -CONFIG_USB_EHCI_PCI=y CONFIG_USB_EHCI_HCD_PLATFORM=y -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_FOTG210_HCD is not set -# CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_OHCI_HCD_PCI is not set CONFIG_USB_OHCI_HCD_PLATFORM=y -# CONFIG_USB_UHCI_HCD is not set -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_R8A66597_HCD is not set -# CONFIG_USB_HCD_TEST_MODE is not set - -# -# USB Device Class drivers -# CONFIG_USB_ACM=y -# CONFIG_USB_PRINTER is not set -CONFIG_USB_WDM=y -# CONFIG_USB_TMC is not set - -# -# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -# - -# -# also be needed; see USB_STORAGE Help for more info -# CONFIG_USB_STORAGE=y -# CONFIG_USB_STORAGE_DEBUG is not set -# CONFIG_USB_STORAGE_REALTEK is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE_USBAT is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_ONETOUCH is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -# CONFIG_USB_STORAGE_ENE_UB6250 is not set +CONFIG_USB_STORAGE_REALTEK=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_ONETOUCH=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_STORAGE_ENE_UB6250=y CONFIG_USB_UAS=y - -# -# USB Imaging devices -# -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set -# CONFIG_USBIP_CORE is not set -# CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y -# CONFIG_USB_DWC3_HOST is not set -# CONFIG_USB_DWC3_GADGET is not set -CONFIG_USB_DWC3_DUAL_ROLE=y - -# -# Platform Glue Driver Support -# -CONFIG_USB_DWC3_HAPS=y -CONFIG_USB_DWC3_OF_SIMPLE=y -CONFIG_USB_DWC3_ROCKCHIP_INNO=y CONFIG_USB_DWC2=y -# CONFIG_USB_DWC2_HOST is not set - -# -# Gadget/Dual-role mode requires USB Gadget support to be enabled -# -# CONFIG_USB_DWC2_PERIPHERAL is not set -CONFIG_USB_DWC2_DUAL_ROLE=y -# CONFIG_USB_DWC2_PCI is not set -# CONFIG_USB_DWC2_DEBUG is not set -# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set -# CONFIG_USB_CHIPIDEA is not set -# CONFIG_USB_ISP1760 is not set - -# -# USB port drivers -# CONFIG_USB_SERIAL=y -# CONFIG_USB_SERIAL_CONSOLE is not set CONFIG_USB_SERIAL_GENERIC=y -# CONFIG_USB_SERIAL_SIMPLE is not set -# CONFIG_USB_SERIAL_AIRCABLE is not set -# CONFIG_USB_SERIAL_ARK3116 is not set -# CONFIG_USB_SERIAL_BELKIN is not set -# CONFIG_USB_SERIAL_CH341 is not set -# CONFIG_USB_SERIAL_WHITEHEAT is not set -# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +CONFIG_USB_SERIAL_CH341=y CONFIG_USB_SERIAL_CP210X=y -# CONFIG_USB_SERIAL_CYPRESS_M8 is not set -# CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=y -# CONFIG_USB_SERIAL_VISOR is not set -# CONFIG_USB_SERIAL_IPAQ is not set -# CONFIG_USB_SERIAL_IR is not set -# CONFIG_USB_SERIAL_EDGEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT_TI is not set -# CONFIG_USB_SERIAL_F81232 is not set -# CONFIG_USB_SERIAL_F8153X is not set -# CONFIG_USB_SERIAL_GARMIN is not set -# CONFIG_USB_SERIAL_IPW is not set -# CONFIG_USB_SERIAL_IUU is not set -# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set CONFIG_USB_SERIAL_KEYSPAN=y -# CONFIG_USB_SERIAL_KLSI is not set -# CONFIG_USB_SERIAL_KOBIL_SCT is not set -# CONFIG_USB_SERIAL_MCT_U232 is not set -# CONFIG_USB_SERIAL_METRO is not set -# CONFIG_USB_SERIAL_MOS7720 is not set -# CONFIG_USB_SERIAL_MOS7840 is not set -# CONFIG_USB_SERIAL_MXUPORT is not set -# CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=y CONFIG_USB_SERIAL_OTI6858=y -# CONFIG_USB_SERIAL_QCAUX is not set CONFIG_USB_SERIAL_QUALCOMM=y -# CONFIG_USB_SERIAL_SPCP8X5 is not set -# CONFIG_USB_SERIAL_SAFE is not set CONFIG_USB_SERIAL_SIERRAWIRELESS=y -# CONFIG_USB_SERIAL_SYMBOL is not set -# CONFIG_USB_SERIAL_TI is not set -# CONFIG_USB_SERIAL_CYBERJACK is not set -# CONFIG_USB_SERIAL_XIRCOM is not set -CONFIG_USB_SERIAL_WWAN=y CONFIG_USB_SERIAL_OPTION=y -# CONFIG_USB_SERIAL_OMNINET is not set -# CONFIG_USB_SERIAL_OPTICON is not set -# CONFIG_USB_SERIAL_XSENS_MT is not set -# CONFIG_USB_SERIAL_WISHBONE is not set -# CONFIG_USB_SERIAL_SSU100 is not set -# CONFIG_USB_SERIAL_QT2 is not set -# CONFIG_USB_SERIAL_UPD78F0730 is not set -# CONFIG_USB_SERIAL_DEBUG is not set - -# -# USB Miscellaneous drivers -# -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_ADUTUX is not set -# CONFIG_USB_SEVSEG is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_FTDI_ELAN is not set -# CONFIG_USB_APPLEDISPLAY is not set -# CONFIG_USB_SISUSBVGA is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB_TEST is not set -# CONFIG_USB_EHSET_TEST_FIXTURE is not set -# CONFIG_USB_ISIGHTFW is not set -# CONFIG_USB_YUREX is not set -CONFIG_USB_EZUSB_FX2=y -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set -# CONFIG_USB_LINK_LAYER_TEST is not set -# CONFIG_USB_CHAOSKEY is not set - -# -# USB Physical Layer drivers -# -CONFIG_USB_PHY=y -# CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_GPIO_VBUS is not set -# CONFIG_USB_ISP1301 is not set -# CONFIG_USB_ULPI is not set +CONFIG_NOP_USB_XCEIV=y CONFIG_USB_GADGET=y -# CONFIG_USB_GADGET_DEBUG is not set CONFIG_USB_GADGET_DEBUG_FILES=y -# CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=500 -CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 -# CONFIG_U_SERIAL_CONSOLE is not set - -# -# USB Peripheral Controller -# -# CONFIG_USB_FOTG210_UDC is not set -# CONFIG_USB_GR_UDC is not set -# CONFIG_USB_R8A66597 is not set -# CONFIG_USB_PXA27X is not set -# CONFIG_USB_MV_UDC is not set -# CONFIG_USB_MV_U3D is not set -# CONFIG_USB_SNP_UDC_PLAT is not set -# CONFIG_USB_M66592 is not set -# CONFIG_USB_BDC_UDC is not set -# CONFIG_USB_AMD5536UDC is not set -# CONFIG_USB_NET2272 is not set -# CONFIG_USB_NET2280 is not set -# CONFIG_USB_GOKU is not set -# CONFIG_USB_EG20T is not set -# CONFIG_USB_GADGET_XILINX is not set -# CONFIG_USB_DUMMY_HCD is not set -CONFIG_USB_LIBCOMPOSITE=y -CONFIG_USB_F_ACM=y -CONFIG_USB_U_SERIAL=y -CONFIG_USB_F_MASS_STORAGE=y -CONFIG_USB_F_FS=y -CONFIG_USB_F_UVC=y +CONFIG_U_SERIAL_CONSOLE=y CONFIG_USB_CONFIGFS=y -CONFIG_USB_CONFIGFS_UEVENT=y -# CONFIG_USB_CONFIGFS_SERIAL is not set CONFIG_USB_CONFIGFS_ACM=y -# CONFIG_USB_CONFIGFS_OBEX is not set -# CONFIG_USB_CONFIGFS_NCM is not set -# CONFIG_USB_CONFIGFS_ECM is not set -# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set -# CONFIG_USB_CONFIGFS_RNDIS is not set -# CONFIG_USB_CONFIGFS_EEM is not set CONFIG_USB_CONFIGFS_MASS_STORAGE=y -# CONFIG_USB_CONFIGFS_F_LB_SS is not set CONFIG_USB_CONFIGFS_F_FS=y -# CONFIG_USB_CONFIGFS_F_ACC is not set -# CONFIG_USB_CONFIGFS_F_AUDIO_SRC is not set -# CONFIG_USB_CONFIGFS_F_UAC1 is not set -# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set -# CONFIG_USB_CONFIGFS_F_UAC2 is not set -# CONFIG_USB_CONFIGFS_F_MIDI is not set -# CONFIG_USB_CONFIGFS_F_HID is not set CONFIG_USB_CONFIGFS_F_UVC=y -# CONFIG_USB_CONFIGFS_F_PRINTER is not set -# CONFIG_TYPEC is not set -# CONFIG_USB_ROLE_SWITCH is not set -# CONFIG_USB_LED_TRIG is not set -# CONFIG_USB_ULPI_BUS is not set -# CONFIG_UWB is not set -# CONFIG_USB_ZERO is not set -# CONFIG_USB_AUDIO is not set -# CONFIG_USB_ETH is not set -# CONFIG_USB_G_NCM is not set CONFIG_USB_GADGETFS=m CONFIG_USB_FUNCTIONFS=m -# CONFIG_USB_FUNCTIONFS_ETH is not set -# CONFIG_USB_FUNCTIONFS_RNDIS is not set -CONFIG_USB_FUNCTIONFS_GENERIC=y CONFIG_USB_MASS_STORAGE=m CONFIG_USB_G_SERIAL=m -# CONFIG_USB_MIDI_GADGET is not set -# CONFIG_USB_G_PRINTER is not set -# CONFIG_USB_CDC_COMPOSITE is not set -# CONFIG_USB_G_ACM_MS is not set -# CONFIG_USB_G_MULTI is not set -# CONFIG_USB_G_HID is not set -# CONFIG_USB_G_DBGP is not set -# CONFIG_USB_G_WEBCAM is not set -# CONFIG_USB_RAW_GADGET is not set - +CONFIG_TYPEC=y +CONFIG_TYPEC_TCPM=y +CONFIG_TYPEC_FUSB302=y +CONFIG_TYPEC_DP_ALTMODE=y CONFIG_MMC=y -CONFIG_PWRSEQ_EMMC=y -# CONFIG_PWRSEQ_SD8787 is not set -CONFIG_PWRSEQ_SIMPLE=y -CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 -# CONFIG_SDIO_UART is not set CONFIG_MMC_TEST=y -CONFIG_SDIO_KEEPALIVE=y - -# -# MMC/SD/SDIO Host Controller Drivers -# -# CONFIG_MMC_DEBUG is not set -# CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y -# CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y -CONFIG_MMC_SDHCI_OF_ARASAN=y -# CONFIG_MMC_SDHCI_OF_AT91 is not set CONFIG_MMC_SDHCI_OF_DWCMSHC=y -# CONFIG_MMC_SDHCI_CADENCE is not set -# CONFIG_MMC_SDHCI_F_SDH30 is not set -# CONFIG_MMC_TIFM_SD is not set -# CONFIG_MMC_SPI is not set -# CONFIG_MMC_CB710 is not set -# CONFIG_MMC_VIA_SDMMC is not set CONFIG_MMC_DW=y -CONFIG_MMC_DW_PLTFM=y -# CONFIG_MMC_DW_BLUEFIELD is not set -# CONFIG_MMC_DW_EXYNOS is not set -# CONFIG_MMC_DW_HI3798CV200 is not set -# CONFIG_MMC_DW_K3 is not set -# CONFIG_MMC_DW_PCI is not set CONFIG_MMC_DW_ROCKCHIP=y -# CONFIG_MMC_VUB300 is not set -# CONFIG_MMC_USHC is not set -# CONFIG_MMC_USDHI6ROL0 is not set -CONFIG_MMC_CQHCI=y -# CONFIG_MMC_TOSHIBA_PCI is not set -# CONFIG_MMC_MTK is not set -# CONFIG_MMC_SDHCI_XENON is not set -# CONFIG_MMC_SDHCI_OMAP is not set -# CONFIG_MEMSTICK is not set -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_CLASS_FLASH=y -# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set - -# -# LED drivers -# -# CONFIG_LEDS_AAT1290 is not set -# CONFIG_LEDS_AS3645A is not set -# CONFIG_LEDS_BCM6328 is not set -# CONFIG_LEDS_BCM6358 is not set -# CONFIG_LEDS_CR0014114 is not set -# CONFIG_LEDS_LM3530 is not set -# CONFIG_LEDS_LM3642 is not set -# CONFIG_LEDS_LM3692X is not set -# CONFIG_LEDS_LM3601X is not set -# CONFIG_LEDS_PCA9532 is not set +CONFIG_MMC_HSQ=y CONFIG_LEDS_GPIO=y -# CONFIG_LEDS_LP3944 is not set -# CONFIG_LEDS_LP3952 is not set -# CONFIG_LEDS_LP5521 is not set -# CONFIG_LEDS_LP5523 is not set -# CONFIG_LEDS_LP5562 is not set -# CONFIG_LEDS_LP8501 is not set -# CONFIG_LEDS_LP8860 is not set -# CONFIG_LEDS_PCA955X is not set -# CONFIG_LEDS_PCA963X is not set -# CONFIG_LEDS_DAC124S085 is not set -# CONFIG_LEDS_PWM is not set -# CONFIG_LEDS_REGULATOR is not set -# CONFIG_LEDS_BD2802 is not set -# CONFIG_LEDS_LT3593 is not set -# CONFIG_LEDS_TCA6507 is not set -# CONFIG_LEDS_TLC591XX is not set -# CONFIG_LEDS_LM355x is not set -# CONFIG_LEDS_KTD2692 is not set -# CONFIG_LEDS_IS31FL319X is not set +CONFIG_LEDS_PWM=y CONFIG_LEDS_IS31FL32XX=y -CONFIG_LEDS_RGB13H=y - -# -# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) -# -# CONFIG_LEDS_BLINKM is not set -# CONFIG_LEDS_SYSCON is not set -# CONFIG_LEDS_MLXREG is not set -# CONFIG_LEDS_USER is not set - -# -# LED Triggers -# -CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_SYSCON=y CONFIG_LEDS_TRIGGER_TIMER=y -# CONFIG_LEDS_TRIGGER_ONESHOT is not set -# CONFIG_LEDS_TRIGGER_DISK is not set -# CONFIG_LEDS_TRIGGER_MTD is not set -# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set -# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set -# CONFIG_LEDS_TRIGGER_CPU is not set -# CONFIG_LEDS_TRIGGER_ACTIVITY is not set -# CONFIG_LEDS_TRIGGER_GPIO is not set -# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set - -# -# iptables trigger is under Netfilter config (LED target) -# -# CONFIG_LEDS_TRIGGER_TRANSIENT is not set -# CONFIG_LEDS_TRIGGER_CAMERA is not set -# CONFIG_LEDS_TRIGGER_PANIC is not set -# CONFIG_LEDS_TRIGGER_NETDEV is not set -# CONFIG_ACCESSIBILITY is not set -# CONFIG_INFINIBAND is not set -CONFIG_EDAC_SUPPORT=y -# CONFIG_EDAC is not set -CONFIG_RTC_LIB=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y CONFIG_RTC_CLASS=y -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -CONFIG_RTC_SYSTOHC=y -CONFIG_RTC_SYSTOHC_DEVICE="rtc0" -# CONFIG_RTC_DEBUG is not set -CONFIG_RTC_NVMEM=y - -# -# RTC interfaces -# -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -# CONFIG_RTC_DRV_TEST is not set - -# -# I2C RTC drivers -# -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_FAKE is not set +# CONFIG_RTC_SYSTOHC is not set +# CONFIG_RTC_INTF_PROC is not set +# CONFIG_RTC_INTF_DEV is not set CONFIG_RTC_DRV_HYM8563=y -# CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_RK808=y -# CONFIG_RTC_DRV_RK_TIMER is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_ISL12026 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_TPS6586X is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV8803 is not set - -# -# SPI RTC drivers -# -# CONFIG_RTC_DRV_M41T93 is not set -# CONFIG_RTC_DRV_M41T94 is not set -# CONFIG_RTC_DRV_DS1302 is not set -# CONFIG_RTC_DRV_DS1305 is not set -# CONFIG_RTC_DRV_DS1343 is not set -# CONFIG_RTC_DRV_DS1347 is not set -# CONFIG_RTC_DRV_DS1390 is not set -# CONFIG_RTC_DRV_MAX6916 is not set -# CONFIG_RTC_DRV_R9701 is not set -# CONFIG_RTC_DRV_RX4581 is not set -# CONFIG_RTC_DRV_RX6110 is not set -# CONFIG_RTC_DRV_RS5C348 is not set -# CONFIG_RTC_DRV_MAX6902 is not set -# CONFIG_RTC_DRV_PCF2123 is not set -# CONFIG_RTC_DRV_MCP795 is not set -CONFIG_RTC_I2C_AND_SPI=y - -# -# SPI and I2C RTC drivers -# -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set - -# -# Platform RTC drivers -# -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1685_FAMILY is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_DS2404 is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_BQ4802 is not set -# CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_V3020 is not set -# CONFIG_RTC_DRV_ZYNQMP is not set -# CONFIG_RTC_DRV_CROS_EC is not set - -# -# on-CPU RTC drivers -# -# CONFIG_RTC_DRV_PL030 is not set -# CONFIG_RTC_DRV_PL031 is not set -# CONFIG_RTC_DRV_FTRTC010 is not set -# CONFIG_RTC_DRV_SNVS is not set -# CONFIG_RTC_DRV_R7301 is not set - -# -# HID Sensor RTC drivers -# -# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y -# CONFIG_DMADEVICES_DEBUG is not set - -# -# DMA Devices -# -CONFIG_DMA_ENGINE=y -CONFIG_DMA_OF=y -# CONFIG_ALTERA_MSGDMA is not set -# CONFIG_AMBA_PL08X is not set -# CONFIG_DW_AXI_DMAC is not set -# CONFIG_FSL_EDMA is not set -# CONFIG_INTEL_IDMA64 is not set -# CONFIG_MV_XOR_V2 is not set CONFIG_PL330_DMA=y -# CONFIG_XILINX_DMA is not set -# CONFIG_XILINX_ZYNQMP_DMA is not set -# CONFIG_QCOM_HIDMA_MGMT is not set -# CONFIG_QCOM_HIDMA is not set -# CONFIG_DW_DMAC is not set -# CONFIG_DW_DMAC_PCI is not set - -# -# DMA Clients -# -# CONFIG_ASYNC_TX_DMA is not set -# CONFIG_DMATEST is not set - -# -# DMABUF options -# -CONFIG_SYNC_FILE=y -# CONFIG_SW_SYNC is not set -# CONFIG_AUXDISPLAY is not set -# CONFIG_UIO is not set -# CONFIG_VFIO is not set -# CONFIG_VIRT_DRIVERS is not set -CONFIG_VIRTIO_MENU=y -# CONFIG_VIRTIO_PCI is not set -# CONFIG_VIRTIO_MMIO is not set - -# -# Microsoft Hyper-V guest support -# +CONFIG_UDMABUF=y +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VHOST_MENU is not set CONFIG_STAGING=y -# CONFIG_PRISM2_USB is not set -# CONFIG_COMEDI is not set -# CONFIG_RTL8192U is not set -# CONFIG_RTLLIB is not set -# CONFIG_RTL8723BS is not set -# CONFIG_R8712U is not set -# CONFIG_R8188EU is not set -# CONFIG_R8822BE is not set -# CONFIG_RTS5208 is not set -# CONFIG_VT6655 is not set -# CONFIG_VT6656 is not set - -# -# IIO staging drivers -# - -# -# Accelerometers -# -# CONFIG_ADIS16203 is not set -# CONFIG_ADIS16240 is not set - -# -# Analog to digital converters -# -# CONFIG_AD7606 is not set -# CONFIG_AD7780 is not set -# CONFIG_AD7816 is not set -# CONFIG_AD7192 is not set -# CONFIG_AD7280 is not set - -# -# Analog digital bi-direction converters -# -# CONFIG_ADT7316 is not set - -# -# Capacitance to digital converters -# -# CONFIG_AD7150 is not set -# CONFIG_AD7152 is not set -# CONFIG_AD7746 is not set - -# -# Direct Digital Synthesis -# -# CONFIG_AD9832 is not set -# CONFIG_AD9834 is not set - -# -# Network Analyzer, Impedance Converters -# -# CONFIG_AD5933 is not set - -# -# Active energy metering IC -# -# CONFIG_ADE7854 is not set - -# -# Resolver to digital converters -# -# CONFIG_AD2S90 is not set -# CONFIG_AD2S1210 is not set -# CONFIG_FB_SM750 is not set -# CONFIG_FB_XGI is not set - -# -# Speakup console speech -# -# CONFIG_SPEAKUP is not set -# CONFIG_STAGING_MEDIA is not set - -# -# Android -# -# CONFIG_ASHMEM is not set -# CONFIG_ANDROID_VSOC is not set -# CONFIG_ION is not set -CONFIG_FIQ_DEBUGGER=y -CONFIG_FIQ_DEBUGGER_NO_SLEEP=y -# CONFIG_FIQ_DEBUGGER_WAKEUP_IRQ_ALWAYS_ON is not set -CONFIG_FIQ_DEBUGGER_CONSOLE=y -CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y -CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y -# CONFIG_FIQ_DEBUGGER_UART_OVERLAY is not set -CONFIG_RK_CONSOLE_THREAD=y -# CONFIG_STAGING_BOARD is not set -# CONFIG_LTE_GDM724X is not set -# CONFIG_DGNC is not set -# CONFIG_GS_FPGABOOT is not set -# CONFIG_UNISYSSPAR is not set -# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set -# CONFIG_FB_TFT is not set -# CONFIG_WILC1000_SDIO is not set -# CONFIG_WILC1000_SPI is not set -# CONFIG_MOST is not set -# CONFIG_KS7010 is not set -# CONFIG_GREYBUS is not set -# CONFIG_PI433 is not set -# CONFIG_MTK_MMC is not set - -# -# Gasket devices -# -# CONFIG_STAGING_GASKET_FRAMEWORK is not set -# CONFIG_XIL_AXIS_FIFO is not set -# CONFIG_EROFS_FS is not set -# CONFIG_POWERVR_ROGUE_N is not set -# CONFIG_GOLDFISH is not set +CONFIG_RTL8723BS=m +CONFIG_R8712U=m +CONFIG_STAGING_MEDIA=y +CONFIG_VIDEO_ROCKCHIP_VDEC=y CONFIG_CHROME_PLATFORMS=y -# CONFIG_CROS_EC_I2C is not set -# CONFIG_CROS_EC_SPI is not set -CONFIG_CROS_EC_PROTO=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_HAVE_CLK_PREPARE=y -CONFIG_COMMON_CLK=y - -# -# Common Clock Framework -# -CONFIG_COMMON_CLK_DEBUGFS=y -# CONFIG_COMMON_CLK_PROCFS is not set -# CONFIG_COMMON_CLK_VERSATILE is not set -# CONFIG_CLK_HSDK is not set -# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_SURFACE_PLATFORMS is not set CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCMI=y -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI514 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_SI570 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CDCE925 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set -# CONFIG_CLK_QORIQ is not set +CONFIG_COMMON_CLK_SCPI=y CONFIG_COMMON_CLK_XGENE=y -# CONFIG_COMMON_CLK_PWM is not set -# CONFIG_COMMON_CLK_VC5 is not set -# CONFIG_ROCKCHIP_CLK_COMPENSATION is not set -CONFIG_COMMON_CLK_ROCKCHIP_REGMAP=y -CONFIG_CLK_RK618=y -CONFIG_CLK_RK628=y -# CONFIG_HWSPINLOCK is not set - -# -# Clock Source drivers -# -CONFIG_TIMER_OF=y -CONFIG_TIMER_PROBE=y -CONFIG_CLKSRC_MMIO=y -CONFIG_ROCKCHIP_TIMER=y -CONFIG_ARM_ARCH_TIMER=y -CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y -CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y -CONFIG_FSL_ERRATUM_A008585=y -CONFIG_HISILICON_ERRATUM_161010101=y -CONFIG_ARM64_ERRATUM_858921=y -# CONFIG_ARM_TIMER_SP804 is not set +CONFIG_COMMON_CLK_PWM=y +CONFIG_COMMON_CLK_FIXED_MMIO=y +# CONFIG_CLK_RK3308 is not set +# CONFIG_CLK_RK3328 is not set +# CONFIG_CLK_RK3368 is not set +# CONFIG_CLK_RK3399 is not set +# CONFIG_FSL_ERRATUM_A008585 is not set +# CONFIG_HISILICON_ERRATUM_161010101 is not set +# CONFIG_ARM64_ERRATUM_858921 is not set CONFIG_MAILBOX=y -# CONFIG_ARM_MHU is not set -# CONFIG_PLATFORM_MHU is not set -# CONFIG_PL320_MBOX is not set -# CONFIG_ROCKCHIP_MBOX is not set -# CONFIG_ALTERA_MBOX is not set -# CONFIG_MAILBOX_TEST is not set -# CONFIG_RK3368_MBOX is not set -CONFIG_IOMMU_API=y -CONFIG_IOMMU_SUPPORT=y - -# -# Generic IOMMU Pagetable Support -# -# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set -# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set -# CONFIG_IOMMU_DEBUGFS is not set -# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set -CONFIG_IOMMU_IOVA=y -CONFIG_OF_IOMMU=y -CONFIG_IOMMU_DMA=y +CONFIG_ARM_MHU=y +CONFIG_PLATFORM_MHU=y +CONFIG_ROCKCHIP_MBOX=y CONFIG_ROCKCHIP_IOMMU=y -# CONFIG_ARM_SMMU is not set -# CONFIG_ARM_SMMU_V3 is not set - -# -# Remoteproc drivers -# -# CONFIG_REMOTEPROC is not set - -# -# Rpmsg drivers -# -# CONFIG_RPMSG_QCOM_GLINK_RPM is not set -# CONFIG_RPMSG_VIRTIO is not set - -# -# SOC (System On Chip) specific Drivers -# - -# -# Amlogic SoC drivers -# - -# -# Broadcom SoC drivers -# -# CONFIG_SOC_BRCMSTB is not set - -# -# NXP/Freescale QorIQ SoC drivers -# - -# -# i.MX SoC drivers -# - -# -# Qualcomm SoC drivers -# - -# -# Rockchip CPU selection -# -CONFIG_CPU_PX30=y -CONFIG_CPU_RK1808=y -# CONFIG_CPU_RK3308 is not set -CONFIG_CPU_RK3328=y -# CONFIG_CPU_RK3368 is not set -CONFIG_CPU_RK3399=y -CONFIG_CPU_RK3568=y -CONFIG_ANDROID_VERSION=0x08010000 -CONFIG_ROCKCHIP_CPUINFO=y -CONFIG_ROCKCHIP_GRF=y -# CONFIG_ROCKCHIP_HW_DECOMPRESS is not set -CONFIG_ROCKCHIP_IPA=y -CONFIG_ROCKCHIP_OPP=y +CONFIG_ARM_SMMU=y +CONFIG_ARM_SMMU_V3=y +CONFIG_ROCKCHIP_IODOMAIN=y CONFIG_ROCKCHIP_PM_DOMAINS=y -CONFIG_ROCKCHIP_PVTM=y -# CONFIG_ROCKCHIP_RAMDISK is not set -CONFIG_ROCKCHIP_SUSPEND_MODE=y -CONFIG_ROCKCHIP_SYSTEM_MONITOR=y -CONFIG_ROCKCHIP_MTD_VENDOR_STORAGE=y -CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER=y -CONFIG_ROCKCHIP_DEBUG=y -# CONFIG_ROCKCHIP_LOW_PERFORMANCE is not set -# CONFIG_ROCKCHIP_THUNDER_BOOT is not set -CONFIG_ROCKCHIP_SCHED_PERFORMANCE_BIAS=y -# CONFIG_SOC_TI is not set - -# -# Xilinx SoC drivers -# -# CONFIG_XILINX_VCU is not set -CONFIG_PM_DEVFREQ=y - -# -# DEVFREQ Governors -# -CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y -CONFIG_DEVFREQ_GOV_USERSPACE=y -# CONFIG_DEVFREQ_GOV_PASSIVE is not set - -# -# DEVFREQ Drivers -# -CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y -CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y -# CONFIG_ARM_ROCKCHIP_DMC_DEBUG is not set -CONFIG_PM_DEVFREQ_EVENT=y -CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y -# CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP is not set -CONFIG_EXTCON=y - -# -# Extcon Device Drivers -# -# CONFIG_EXTCON_ADC_JACK is not set -# CONFIG_EXTCON_GPIO is not set -# CONFIG_EXTCON_MAX3355 is not set -# CONFIG_EXTCON_RT8973A is not set -# CONFIG_EXTCON_SM5502 is not set -# CONFIG_EXTCON_USB_GPIO is not set -# CONFIG_EXTCON_USBC_CROS_EC is not set +CONFIG_ARM_RK3399_DMC_DEVFREQ=y CONFIG_MEMORY=y -# CONFIG_ARM_PL172_MPMC is not set CONFIG_IIO=y -CONFIG_IIO_BUFFER=y -# CONFIG_IIO_BUFFER_CB is not set -# CONFIG_IIO_BUFFER_HW_CONSUMER is not set -CONFIG_IIO_KFIFO_BUF=y -# CONFIG_IIO_CONFIGFS is not set -CONFIG_IIO_TRIGGER=y -CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 -# CONFIG_IIO_SW_DEVICE is not set -# CONFIG_IIO_SW_TRIGGER is not set - -# -# Accelerometers -# -# CONFIG_ADIS16201 is not set -# CONFIG_ADIS16209 is not set -# CONFIG_ADXL345_I2C is not set -# CONFIG_ADXL345_SPI is not set -# CONFIG_BMA180 is not set -# CONFIG_BMA220 is not set -# CONFIG_BMC150_ACCEL is not set -# CONFIG_DA280 is not set -# CONFIG_DA311 is not set -# CONFIG_DMARD06 is not set -# CONFIG_DMARD09 is not set -# CONFIG_DMARD10 is not set -# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set -# CONFIG_IIO_ST_ACCEL_3AXIS is not set -# CONFIG_KXSD9 is not set -# CONFIG_KXCJK1013 is not set -# CONFIG_MC3230 is not set -# CONFIG_MMA7455_I2C is not set -# CONFIG_MMA7455_SPI is not set -# CONFIG_MMA7660 is not set -# CONFIG_MMA8452 is not set -# CONFIG_MMA9551 is not set -# CONFIG_MMA9553 is not set -# CONFIG_MXC4005 is not set -# CONFIG_MXC6255 is not set -# CONFIG_SCA3000 is not set -# CONFIG_STK8312 is not set -# CONFIG_STK8BA50 is not set - -# -# Analog to digital converters -# -# CONFIG_AD7266 is not set -# CONFIG_AD7291 is not set -# CONFIG_AD7298 is not set -# CONFIG_AD7476 is not set -# CONFIG_AD7766 is not set -# CONFIG_AD7791 is not set -# CONFIG_AD7793 is not set -# CONFIG_AD7887 is not set -# CONFIG_AD7923 is not set -# CONFIG_AD799X is not set -# CONFIG_CC10001_ADC is not set -# CONFIG_ENVELOPE_DETECTOR is not set -# CONFIG_HI8435 is not set -# CONFIG_HX711 is not set -# CONFIG_INA2XX_ADC is not set -# CONFIG_LTC2471 is not set -# CONFIG_LTC2485 is not set -# CONFIG_LTC2497 is not set -# CONFIG_MAX1027 is not set -# CONFIG_MAX11100 is not set -# CONFIG_MAX1118 is not set -# CONFIG_MAX1363 is not set -# CONFIG_MAX9611 is not set -# CONFIG_MCP320X is not set -# CONFIG_MCP3422 is not set -# CONFIG_NAU7802 is not set +CONFIG_IIO_BUFFER_HW_CONSUMER=y +CONFIG_IIO_SW_DEVICE=y +CONFIG_IIO_SW_TRIGGER=y +CONFIG_IIO_TRIGGERED_EVENT=y CONFIG_ROCKCHIP_SARADC=y -# CONFIG_ROCKCHIP_SARADC_TEST_CHN is not set -# CONFIG_SD_ADC_MODULATOR is not set -# CONFIG_TI_ADC081C is not set -# CONFIG_TI_ADC0832 is not set -# CONFIG_TI_ADC084S021 is not set -# CONFIG_TI_ADC12138 is not set -# CONFIG_TI_ADC108S102 is not set -# CONFIG_TI_ADC128S052 is not set -# CONFIG_TI_ADC161S626 is not set -# CONFIG_TI_ADS1015 is not set -# CONFIG_TI_ADS7950 is not set -# CONFIG_TI_ADS8688 is not set -# CONFIG_TI_TLC4541 is not set -# CONFIG_VF610_ADC is not set - -# -# Analog Front Ends -# -# CONFIG_IIO_RESCALE is not set - -# -# Amplifiers -# -# CONFIG_AD8366 is not set - -# -# Chemical Sensors -# -# CONFIG_ATLAS_PH_SENSOR is not set -# CONFIG_BME680 is not set -# CONFIG_CCS811 is not set -# CONFIG_IAQCORE is not set -# CONFIG_VZ89X is not set -# CONFIG_IIO_CROS_EC_SENSORS_CORE is not set - -# -# Hid Sensor IIO Common -# - -# -# SSP Sensor Common -# -# CONFIG_IIO_SSP_SENSORHUB is not set - -# -# Counters -# - -# -# Digital to analog converters -# -# CONFIG_AD5064 is not set -# CONFIG_AD5360 is not set -# CONFIG_AD5380 is not set -# CONFIG_AD5421 is not set -# CONFIG_AD5446 is not set -# CONFIG_AD5449 is not set -# CONFIG_AD5592R is not set -# CONFIG_AD5593R is not set -# CONFIG_AD5504 is not set -# CONFIG_AD5624R_SPI is not set -# CONFIG_LTC2632 is not set -# CONFIG_AD5686_SPI is not set -# CONFIG_AD5696_I2C is not set -# CONFIG_AD5755 is not set -# CONFIG_AD5758 is not set -# CONFIG_AD5761 is not set -# CONFIG_AD5764 is not set -# CONFIG_AD5791 is not set -# CONFIG_AD7303 is not set -# CONFIG_AD8801 is not set -# CONFIG_DPOT_DAC is not set -# CONFIG_DS4424 is not set -# CONFIG_M62332 is not set -# CONFIG_MAX517 is not set -# CONFIG_MAX5821 is not set -# CONFIG_MCP4725 is not set -# CONFIG_MCP4922 is not set -# CONFIG_TI_DAC082S085 is not set -# CONFIG_TI_DAC5571 is not set -# CONFIG_VF610_DAC is not set - -# -# IIO dummy driver -# - -# -# Frequency Synthesizers DDS/PLL -# - -# -# Clock Generator/Distribution -# -# CONFIG_AD9523 is not set - -# -# Phase-Locked Loop (PLL) frequency synthesizers -# -# CONFIG_ADF4350 is not set - -# -# Digital gyroscope sensors -# -# CONFIG_ADIS16080 is not set -# CONFIG_ADIS16130 is not set -# CONFIG_ADIS16136 is not set -# CONFIG_ADIS16260 is not set -# CONFIG_ADXRS450 is not set -# CONFIG_BMG160 is not set -# CONFIG_MPU3050_I2C is not set -# CONFIG_IIO_ST_GYRO_3AXIS is not set -# CONFIG_ITG3200 is not set - -# -# Health Sensors -# - -# -# Heart Rate Monitors -# -# CONFIG_AFE4403 is not set -# CONFIG_AFE4404 is not set -# CONFIG_MAX30100 is not set -# CONFIG_MAX30102 is not set - -# -# Humidity sensors -# -# CONFIG_AM2315 is not set -# CONFIG_DHT11 is not set -# CONFIG_HDC100X is not set -# CONFIG_HTS221 is not set -# CONFIG_HTU21 is not set -# CONFIG_SI7005 is not set -# CONFIG_SI7020 is not set - -# -# Inertial measurement units -# -# CONFIG_ADIS16400 is not set -# CONFIG_ADIS16480 is not set -# CONFIG_BMI160_I2C is not set -# CONFIG_BMI160_SPI is not set -# CONFIG_KMX61 is not set -# CONFIG_INV_MPU6050_I2C is not set -# CONFIG_INV_MPU6050_SPI is not set -# CONFIG_IIO_ST_LSM6DSX is not set - -# -# Light sensors -# -# CONFIG_ADJD_S311 is not set -# CONFIG_AL3320A is not set -# CONFIG_APDS9300 is not set -# CONFIG_APDS9960 is not set -# CONFIG_BH1750 is not set -# CONFIG_BH1780 is not set -# CONFIG_CM32181 is not set -# CONFIG_CM3232 is not set -# CONFIG_CM3323 is not set -# CONFIG_CM3605 is not set -# CONFIG_CM36651 is not set -# CONFIG_GP2AP020A00F is not set CONFIG_SENSORS_ISL29018=y -# CONFIG_SENSORS_ISL29028 is not set -# CONFIG_ISL29125 is not set -# CONFIG_JSA1212 is not set -# CONFIG_RPR0521 is not set -# CONFIG_LTR501 is not set -# CONFIG_LV0104CS is not set -# CONFIG_MAX44000 is not set -# CONFIG_OPT3001 is not set -# CONFIG_PA12203001 is not set -# CONFIG_SI1133 is not set -# CONFIG_SI1145 is not set -# CONFIG_STK3310 is not set -# CONFIG_ST_UVIS25 is not set -# CONFIG_TCS3414 is not set -# CONFIG_TCS3472 is not set CONFIG_SENSORS_TSL2563=y CONFIG_TSL2583=y -# CONFIG_TSL2772 is not set -# CONFIG_TSL4531 is not set -# CONFIG_US5182D is not set -# CONFIG_VCNL4000 is not set -# CONFIG_VEML6070 is not set -# CONFIG_VL6180 is not set -# CONFIG_ZOPT2201 is not set - -# -# Magnetometer sensors -# -# CONFIG_AK8974 is not set -# CONFIG_AK8975 is not set -# CONFIG_AK09911 is not set -# CONFIG_BMC150_MAGN_I2C is not set -# CONFIG_BMC150_MAGN_SPI is not set -# CONFIG_MAG3110 is not set -# CONFIG_MMC35240 is not set -# CONFIG_IIO_ST_MAGN_3AXIS is not set -# CONFIG_SENSORS_HMC5843_I2C is not set -# CONFIG_SENSORS_HMC5843_SPI is not set - -# -# Multiplexers -# -# CONFIG_IIO_MUX is not set - -# -# Inclinometer sensors -# - -# -# Triggers - standalone -# -# CONFIG_IIO_INTERRUPT_TRIGGER is not set +CONFIG_IIO_MUX=y +CONFIG_IIO_HRTIMER_TRIGGER=y CONFIG_IIO_SYSFS_TRIGGER=y - -# -# Digital potentiometers -# -# CONFIG_AD5272 is not set -# CONFIG_DS1803 is not set -# CONFIG_MAX5481 is not set -# CONFIG_MAX5487 is not set -# CONFIG_MCP4018 is not set -# CONFIG_MCP4131 is not set -# CONFIG_MCP4531 is not set -# CONFIG_TPL0102 is not set - -# -# Digital potentiostats -# -# CONFIG_LMP91000 is not set - -# -# Pressure sensors -# -# CONFIG_ABP060MG is not set -# CONFIG_BMP280 is not set -# CONFIG_HP03 is not set -# CONFIG_MPL115_I2C is not set -# CONFIG_MPL115_SPI is not set -# CONFIG_MPL3115 is not set -# CONFIG_MS5611 is not set -# CONFIG_MS5637 is not set -# CONFIG_IIO_ST_PRESS is not set -# CONFIG_T5403 is not set -# CONFIG_HP206C is not set -# CONFIG_ZPA2326 is not set - -# -# Lightning sensors -# -# CONFIG_AS3935 is not set - -# -# Proximity and distance sensors -# -# CONFIG_ISL29501 is not set -# CONFIG_LIDAR_LITE_V2 is not set -# CONFIG_RFD77402 is not set -# CONFIG_SRF04 is not set -# CONFIG_SX9500 is not set -# CONFIG_SRF08 is not set - -# -# Resolver to digital converters -# -# CONFIG_AD2S1200 is not set - -# -# Temperature sensors -# -# CONFIG_MAXIM_THERMOCOUPLE is not set -# CONFIG_MLX90614 is not set -# CONFIG_MLX90632 is not set -# CONFIG_TMP006 is not set -# CONFIG_TMP007 is not set -# CONFIG_TSYS01 is not set -# CONFIG_TSYS02D is not set -# CONFIG_NTB is not set -# CONFIG_VME_BUS is not set CONFIG_PWM=y -CONFIG_PWM_SYSFS=y -# CONFIG_PWM_CROS_EC is not set -# CONFIG_PWM_FSL_FTM is not set -# CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y -# CONFIG_PWM_ROCKCHIP_ONESHOT is not set - -# -# IRQ chip support -# -CONFIG_IRQCHIP=y -CONFIG_ARM_GIC=y -CONFIG_ARM_GIC_MAX_NR=1 -CONFIG_ARM_GIC_V2M=y -CONFIG_ARM_GIC_V3=y -CONFIG_ARM_GIC_V3_ITS=y -CONFIG_ARM_GIC_V3_ITS_PCI=y -CONFIG_PARTITION_PERCPU=y -# CONFIG_IPACK_BUS is not set -CONFIG_ARCH_HAS_RESET_CONTROLLER=y -CONFIG_RESET_CONTROLLER=y -# CONFIG_RESET_TI_SYSCON is not set -# CONFIG_FMC is not set - -# -# PHY Subsystem -# -CONFIG_GENERIC_PHY=y -# CONFIG_PHY_XGENE is not set -# CONFIG_BCM_KONA_USB2_PHY is not set -# CONFIG_PHY_PXA_28NM_HSIC is not set -# CONFIG_PHY_PXA_28NM_USB2 is not set -# CONFIG_PHY_CPCAP_USB is not set -# CONFIG_PHY_MAPPHONE_MDM6600 is not set -CONFIG_PHY_ROCKCHIP_CSI2_DPHY=y CONFIG_PHY_ROCKCHIP_DP=y +CONFIG_PHY_ROCKCHIP_DPHY_RX0=y CONFIG_PHY_ROCKCHIP_EMMC=y -# CONFIG_PHY_ROCKCHIP_INNO_COMBPHY is not set -CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY=y -CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY=y +CONFIG_PHY_ROCKCHIP_INNO_HDMI=y CONFIG_PHY_ROCKCHIP_INNO_USB2=y -CONFIG_PHY_ROCKCHIP_INNO_USB3=y -CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y -# CONFIG_PHY_ROCKCHIP_INNO_VIDEO_PHY is not set -CONFIG_PHY_ROCKCHIP_MIPI_RX=y +CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y +CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y -CONFIG_PHY_ROCKCHIP_NANENG_EDP=y -# CONFIG_PHY_ROCKCHIP_NANENG_USB2 is not set CONFIG_PHY_ROCKCHIP_PCIE=y CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y CONFIG_PHY_ROCKCHIP_TYPEC=y CONFIG_PHY_ROCKCHIP_USB=y -# CONFIG_PHY_SAMSUNG_USB2 is not set -# CONFIG_POWERCAP is not set -# CONFIG_MCB is not set -CONFIG_RAS=y - -# -# Android -# -CONFIG_ANDROID=y -# CONFIG_ANDROID_BINDER_IPC is not set -# CONFIG_LIBNVDIMM is not set -# CONFIG_DAX is not set -CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y -CONFIG_ROCKCHIP_EFUSE=y -CONFIG_ROCKCHIP_OTP=y - -# -# HW tracing support -# -# CONFIG_STM is not set -# CONFIG_INTEL_TH is not set -# CONFIG_FPGA is not set -# CONFIG_FSI is not set -# CONFIG_TEE is not set -CONFIG_PM_OPP=y -# CONFIG_SIOX is not set -# CONFIG_SLIMBUS is not set -# CONFIG_LEGACY_ENERGY_MODEL_DT is not set -CONFIG_RK_FLASH=y - -# -# Rockchip Flash Devices -# -# CONFIG_RK_NANDC_NAND is not set -CONFIG_RK_SFC_NAND=y -CONFIG_RK_SFC_NAND_MTD=y -CONFIG_RK_SFC_NOR=y -CONFIG_RK_SFC_NOR_MTD=y -# CONFIG_RK_NAND is not set - -# -# Headset device support -# -CONFIG_RK_HEADSET=y - -# -# File systems -# -CONFIG_DCACHE_WORD_ACCESS=y -CONFIG_FS_IOMAP=y -# CONFIG_EXT2_FS is not set -# CONFIG_EXT3_FS is not set +CONFIG_ARM_SMMU_V3_PMU=y +CONFIG_MUX_GPIO=y +CONFIG_MUX_MMIO=y CONFIG_EXT4_FS=y -CONFIG_EXT4_USE_FOR_EXT2=y +# CONFIG_EXT4_USE_FOR_EXT2 is not set CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_ENCRYPTION is not set -# CONFIG_EXT4_DEBUG is not set -CONFIG_JBD2=y -# CONFIG_JBD2_DEBUG is not set -CONFIG_FS_MBCACHE=y -# CONFIG_REISERFS_FS is not set -# CONFIG_JFS_FS is not set CONFIG_XFS_FS=y -# CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_POSIX_ACL is not set -# CONFIG_XFS_RT is not set -# CONFIG_XFS_ONLINE_SCRUB is not set -# CONFIG_XFS_WARN is not set -# CONFIG_XFS_DEBUG is not set -# CONFIG_GFS2_FS is not set -# CONFIG_OCFS2_FS is not set -# CONFIG_BTRFS_FS is not set -# CONFIG_NILFS2_FS is not set -# CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set -CONFIG_FS_POSIX_ACL=y -CONFIG_EXPORTFS=y -# CONFIG_EXPORTFS_BLOCK_OPS is not set -CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y -# CONFIG_FS_ENCRYPTION is not set -# CONFIG_FS_VERITY is not set -CONFIG_FSNOTIFY=y # CONFIG_DNOTIFY is not set -CONFIG_INOTIFY_USER=y -# CONFIG_FANOTIFY is not set -# CONFIG_QUOTA is not set -# CONFIG_AUTOFS4_FS is not set -# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=y -# CONFIG_CUSE is not set CONFIG_OVERLAY_FS=y -CONFIG_OVERLAY_FS_REDIRECT_DIR=y -CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y -# CONFIG_OVERLAY_FS_INDEX is not set -# CONFIG_OVERLAY_FS_XINO_AUTO is not set -# CONFIG_OVERLAY_FS_METACOPY is not set -# CONFIG_INCREMENTAL_FS is not set - -# -# Caches -# -# CONFIG_FSCACHE is not set - -# -# CD-ROM/DVD Filesystems -# +CONFIG_FSCACHE=y CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y -# CONFIG_UDF_FS is not set - -# -# DOS/FAT/NT Filesystems -# -CONFIG_FAT_FS=y -# CONFIG_MSDOS_FS is not set +CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y -CONFIG_FAT_DEFAULT_CODEPAGE=936 -CONFIG_FAT_DEFAULT_IOCHARSET="utf8" -CONFIG_FAT_DEFAULT_UTF8=y +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" CONFIG_EXFAT_FS=y -CONFIG_EXFAT_DEFAULT_CODEPAGE=437 -CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" -CONFIG_EXFAT_VIRTUAL_XATTR=y -CONFIG_EXFAT_VIRTUAL_XATTR_SELINUX_LABEL="u:object_r:exfat:s0" -# CONFIG_EXFAT_DEBUG is not set -# CONFIG_EXFAT_UEVENT is not set -# CONFIG_NTFS_FS is not set - -# -# Pseudo filesystems -# -CONFIG_PROC_FS=y -# CONFIG_PROC_KCORE is not set -CONFIG_PROC_SYSCTL=y -CONFIG_PROC_PAGE_MONITOR=y -# CONFIG_PROC_CHILDREN is not set -# CONFIG_PROC_UID is not set -CONFIG_KERNFS=y -CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y -CONFIG_TMPFS_XATTR=y -# CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y -CONFIG_ARCH_HAS_GIGANTIC_PAGE=y -CONFIG_CONFIGFS_FS=y -CONFIG_MISC_FILESYSTEMS=y -# CONFIG_ORANGEFS_FS is not set -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_ECRYPT_FS is not set -# CONFIG_SDCARD_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_EFS_FS is not set -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_FS_DEBUG=0 -CONFIG_JFFS2_FS_WRITEBUFFER=y -# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -# CONFIG_JFFS2_SUMMARY is not set -# CONFIG_JFFS2_FS_XATTR is not set -# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set -CONFIG_JFFS2_ZLIB=y -CONFIG_JFFS2_RTIME=y -CONFIG_UBIFS_FS=y -CONFIG_UBIFS_FS_ADVANCED_COMPR=y -CONFIG_UBIFS_FS_LZO=y -CONFIG_UBIFS_FS_ZLIB=y -# CONFIG_UBIFS_ATIME_SUPPORT is not set -CONFIG_UBIFS_FS_XATTR=y -CONFIG_UBIFS_FS_SECURITY=y -# CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y -CONFIG_SQUASHFS_FILE_CACHE=y -# CONFIG_SQUASHFS_FILE_DIRECT is not set -CONFIG_SQUASHFS_DECOMP_SINGLE=y -# CONFIG_SQUASHFS_DECOMP_MULTI is not set -# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set -# CONFIG_SQUASHFS_XATTR is not set -CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y -# CONFIG_SQUASHFS_ZSTD is not set -# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set -# CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -# CONFIG_VXFS_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_OMFS_FS is not set -# CONFIG_HPFS_FS is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX6FS_FS is not set -# CONFIG_ROMFS_FS is not set +CONFIG_SQUASHFS_ZSTD=y CONFIG_PSTORE=y -CONFIG_PSTORE_DEFLATE_COMPRESS=y -# CONFIG_PSTORE_LZO_COMPRESS is not set -# CONFIG_PSTORE_LZ4_COMPRESS is not set -# CONFIG_PSTORE_LZ4HC_COMPRESS is not set -# CONFIG_PSTORE_842_COMPRESS is not set -# CONFIG_PSTORE_ZSTD_COMPRESS is not set -CONFIG_PSTORE_COMPRESS=y -CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y -CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" -CONFIG_PSTORE_CONSOLE=y -# CONFIG_PSTORE_CONSOLE_FORCE is not set -# CONFIG_PSTORE_PMSG is not set -# CONFIG_PSTORE_FTRACE is not set -CONFIG_PSTORE_RAM=y -# CONFIG_PSTORE_MCU_LOG is not set -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set -CONFIG_NETWORK_FILESYSTEMS=y -# CONFIG_NFS_FS is not set -# CONFIG_NFSD is not set -# CONFIG_CEPH_FS is not set -# CONFIG_CIFS is not set -# CONFIG_CODA_FS is not set -# CONFIG_AFS_FS is not set -CONFIG_NLS=y -CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_DEFAULT="utf-8" CONFIG_NLS_CODEPAGE_437=y -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -CONFIG_NLS_CODEPAGE_936=y -# CONFIG_NLS_CODEPAGE_950 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_MAC_ROMAN is not set -# CONFIG_NLS_MAC_CELTIC is not set -# CONFIG_NLS_MAC_CENTEURO is not set -# CONFIG_NLS_MAC_CROATIAN is not set -# CONFIG_NLS_MAC_CYRILLIC is not set -# CONFIG_NLS_MAC_GAELIC is not set -# CONFIG_NLS_MAC_GREEK is not set -# CONFIG_NLS_MAC_ICELAND is not set -# CONFIG_NLS_MAC_INUIT is not set -# CONFIG_NLS_MAC_ROMANIAN is not set -# CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y -# CONFIG_DLM is not set -CONFIG_UNICODE=y -# CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set - -# -# Security options -# -CONFIG_KEYS=y -CONFIG_KEYS_COMPAT=y -# CONFIG_PERSISTENT_KEYRINGS is not set -# CONFIG_BIG_KEYS is not set -# CONFIG_TRUSTED_KEYS is not set -# CONFIG_ENCRYPTED_KEYS is not set -# CONFIG_KEY_DH_OPERATIONS is not set -# CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITY is not set -CONFIG_SECURITYFS=y -CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y -# CONFIG_HARDENED_USERCOPY is not set -# CONFIG_FORTIFY_SOURCE is not set -# CONFIG_STATIC_USERMODEHELPER is not set -# CONFIG_TEE_SUPPORT is not set -CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_DEFAULT_SECURITY="" - -# -# Kernel hardening options -# - -# -# Memory initialization -# +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_HARDENED_USERCOPY=y +CONFIG_STATIC_USERMODEHELPER=y +CONFIG_LSM="selinux,integrity" CONFIG_INIT_STACK_NONE=y -# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set -# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set -CONFIG_CRYPTO=y - -# -# Crypto core or helper -# -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_BLKCIPHER=y -CONFIG_CRYPTO_BLKCIPHER2=y -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_RNG=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_RNG_DEFAULT=y -CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_AKCIPHER=y -CONFIG_CRYPTO_KPP2=y -CONFIG_CRYPTO_KPP=y -CONFIG_CRYPTO_ACOMP2=y -CONFIG_CRYPTO_RSA=y -# CONFIG_CRYPTO_DH is not set -CONFIG_CRYPTO_ECDH=y -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -# CONFIG_CRYPTO_USER is not set -CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -CONFIG_CRYPTO_GF128MUL=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_NULL2=y -# CONFIG_CRYPTO_PCRYPT is not set -CONFIG_CRYPTO_WORKQUEUE=y +CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +CONFIG_INIT_ON_FREE_DEFAULT_ON=y +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_PCRYPT=y CONFIG_CRYPTO_CRYPTD=y -# CONFIG_CRYPTO_MCRYPTD is not set -CONFIG_CRYPTO_AUTHENC=m -# CONFIG_CRYPTO_TEST is not set -CONFIG_CRYPTO_SIMD=y -# CONFIG_CRYPTO_CURVE25519 is not set - -# -# Authenticated Encryption with Associated Data -# -CONFIG_CRYPTO_CCM=y -CONFIG_CRYPTO_GCM=y -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128L is not set -# CONFIG_CRYPTO_AEGIS256 is not set -# CONFIG_CRYPTO_MORUS640 is not set -# CONFIG_CRYPTO_MORUS1280 is not set -CONFIG_CRYPTO_SEQIV=y -CONFIG_CRYPTO_ECHAINIV=m - -# -# Block modes -# -CONFIG_CRYPTO_CBC=y -CONFIG_CRYPTO_CFB=y -CONFIG_CRYPTO_CTR=y -# CONFIG_CRYPTO_CTS is not set -CONFIG_CRYPTO_ECB=y -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_PCBC is not set +CONFIG_CRYPTO_ECDH=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_CTS=y CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_ADIANTUM is not set - -# -# Hash modes -# +CONFIG_CRYPTO_CHACHA20POLY1305=y +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_ESSIV=y CONFIG_CRYPTO_CMAC=y -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set - -# -# Digest -# -CONFIG_CRYPTO_CRC32C=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_BLAKE2S is not set -CONFIG_CRYPTO_CRCT10DIF=y -CONFIG_CRYPTO_GHASH=y -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_MD4 is not set -CONFIG_CRYPTO_MD5=y -# CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set -# CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_SHA512=y -# CONFIG_CRYPTO_SHA3 is not set -CONFIG_CRYPTO_SM3=y -# CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_WP512 is not set - -# -# Ciphers -# -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -# CONFIG_CRYPTO_ANUBIS is not set -CONFIG_CRYPTO_ARC4=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_SEED is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TEA is not set -CONFIG_CRYPTO_TWOFISH=y -CONFIG_CRYPTO_TWOFISH_COMMON=y - -# -# Compression -# -CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_LZO=y -# CONFIG_CRYPTO_842 is not set -# CONFIG_CRYPTO_LZ4 is not set -# CONFIG_CRYPTO_LZ4HC is not set -# CONFIG_CRYPTO_ZSTD is not set - -# -# Random Number Generation -# +CONFIG_CRYPTO_LZ4=y +CONFIG_CRYPTO_LZ4HC=y +CONFIG_CRYPTO_ZSTD=y CONFIG_CRYPTO_ANSI_CPRNG=y -CONFIG_CRYPTO_DRBG_MENU=y -CONFIG_CRYPTO_DRBG_HMAC=y -# CONFIG_CRYPTO_DRBG_HASH is not set -# CONFIG_CRYPTO_DRBG_CTR is not set -CONFIG_CRYPTO_DRBG=y -CONFIG_CRYPTO_JITTERENTROPY=y -CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y -# CONFIG_CRYPTO_USER_API_RNG is not set -# CONFIG_CRYPTO_USER_API_AEAD is not set -CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_HW=y -# CONFIG_CRYPTO_DEV_CCP is not set -# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set -# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set +CONFIG_CRYPTO_USER_API_RNG=y +CONFIG_CRYPTO_USER_API_AEAD=y +CONFIG_CRYPTO_STATS=y +CONFIG_CRYPTO_NHPOLY1305_NEON=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_SHA512_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_BS=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_DEV_ROCKCHIP=y -# CONFIG_CRYPTO_DEV_CCREE is not set -# CONFIG_CRYPTO_DEV_HISI_SEC is not set -CONFIG_ASYMMETRIC_KEY_TYPE=y -CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y -CONFIG_X509_CERTIFICATE_PARSER=y -CONFIG_PKCS7_MESSAGE_PARSER=y -# CONFIG_PKCS7_TEST_KEY is not set -# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set - -# -# Certificates for signature checking -# -CONFIG_SYSTEM_TRUSTED_KEYRING=y -CONFIG_SYSTEM_TRUSTED_KEYS="" -# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set -# CONFIG_SECONDARY_TRUSTED_KEYRING is not set -# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set -CONFIG_BINARY_PRINTF=y - -# -# Library routines -# -CONFIG_BITREVERSE=y -CONFIG_HAVE_ARCH_BITREVERSE=y -CONFIG_RATIONAL=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y -CONFIG_ARCH_HAS_FAST_MULTIPLIER=y -# CONFIG_INDIRECT_PIO is not set +CONFIG_CORDIC=y CONFIG_CRC_CCITT=y -CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y -CONFIG_CRC32=y -# CONFIG_CRC32_SELFTEST is not set -CONFIG_CRC32_SLICEBY8=y -# CONFIG_CRC32_SLICEBY4 is not set -# CONFIG_CRC32_SARWATE is not set -# CONFIG_CRC32_BIT is not set -# CONFIG_CRC64 is not set -# CONFIG_CRC4 is not set CONFIG_CRC7=y -CONFIG_LIBCRC32C=y -# CONFIG_CRC8 is not set -CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y -# CONFIG_RANDOM32_SELFTEST is not set -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=y -CONFIG_LZO_COMPRESS=y -CONFIG_LZO_DECOMPRESS=y -CONFIG_LZ4_DECOMPRESS=y -CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set -# CONFIG_XZ_DEC_IA64 is not set -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_ARMTHUMB=y # CONFIG_XZ_DEC_SPARC is not set -CONFIG_XZ_DEC_BCJ=y -# CONFIG_XZ_DEC_TEST is not set -CONFIG_DECOMPRESS_GZIP=y -CONFIG_DECOMPRESS_BZIP2=y -CONFIG_DECOMPRESS_LZMA=y -CONFIG_DECOMPRESS_XZ=y -CONFIG_DECOMPRESS_LZO=y -CONFIG_DECOMPRESS_LZ4=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_REED_SOLOMON=y -CONFIG_REED_SOLOMON_ENC8=y -CONFIG_REED_SOLOMON_DEC8=y -CONFIG_TEXTSEARCH=y -CONFIG_TEXTSEARCH_KMP=m -CONFIG_TEXTSEARCH_BM=m -CONFIG_TEXTSEARCH_FSM=m -CONFIG_ASSOCIATIVE_ARRAY=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HAS_DMA=y -CONFIG_NEED_SG_DMA_LENGTH=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_HAVE_GENERIC_DMA_COHERENT=y -CONFIG_DMA_DIRECT_OPS=y -CONFIG_SWIOTLB=y -CONFIG_SGL_ALLOC=y -CONFIG_CPU_RMAP=y -CONFIG_DQL=y -CONFIG_GLOB=y -# CONFIG_GLOB_SELFTEST is not set -CONFIG_NLATTR=y -CONFIG_CLZ_TAB=y -# CONFIG_CORDIC is not set -# CONFIG_DDR is not set -# CONFIG_IRQ_POLL is not set -CONFIG_MPILIB=y -CONFIG_LIBFDT=y -CONFIG_OID_REGISTRY=y -CONFIG_HAVE_GENERIC_VDSO=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_FONT_SUPPORT=y -# CONFIG_FONTS is not set -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y -CONFIG_SG_POOL=y -CONFIG_ARCH_HAS_SG_CHAIN=y -CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set - -# -# Kernel hacking -# - -# -# printk and dmesg options -# CONFIG_PRINTK_TIME=y -# CONFIG_PRINTK_TIME_FROM_ARM_ARCH_TIMER is not set -# CONFIG_PRINTK_PROCESS is not set -CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 -CONFIG_CONSOLE_LOGLEVEL_QUIET=4 -CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 -# CONFIG_BOOT_PRINTK_DELAY is not set +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7 CONFIG_DYNAMIC_DEBUG=y - -# -# Compile-time checks and compiler options -# -CONFIG_DEBUG_INFO=y -# CONFIG_DEBUG_INFO_REDUCED is not set -# CONFIG_DEBUG_INFO_SPLIT is not set -# CONFIG_DEBUG_INFO_DWARF4 is not set -# CONFIG_GDB_SCRIPTS is not set -CONFIG_ENABLE_MUST_CHECK=y -CONFIG_FRAME_WARN=2048 -# CONFIG_STRIP_ASM_SYMS is not set -# CONFIG_READABLE_ASM is not set -# CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_PAGE_OWNER is not set -CONFIG_DEBUG_FS=y -# CONFIG_HEADERS_CHECK is not set -# CONFIG_DEBUG_SECTION_MISMATCH is not set -CONFIG_SECTION_MISMATCH_WARN_ONLY=y -CONFIG_ARCH_WANT_FRAME_POINTERS=y -CONFIG_FRAME_POINTER=y -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# CONFIG_SYMBOLIC_ERRNAME is not set +# CONFIG_DEBUG_MISC is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 -CONFIG_MAGIC_SYSRQ_SERIAL=y -CONFIG_DEBUG_KERNEL=y - -# -# Memory Debugging -# -# CONFIG_PAGE_EXTENSION is not set -# CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_PAGE_POISONING is not set -# CONFIG_DEBUG_PAGE_REF is not set -# CONFIG_DEBUG_RODATA_TEST is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_DEBUG_ON is not set -# CONFIG_SLUB_STATS is not set -CONFIG_HAVE_DEBUG_KMEMLEAK=y -# CONFIG_DEBUG_KMEMLEAK is not set -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_DEBUG_VM is not set -CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y -# CONFIG_DEBUG_VIRTUAL is not set -# CONFIG_DEBUG_MEMORY_INIT is not set -# CONFIG_DEBUG_PER_CPU_MAPS is not set -CONFIG_HAVE_ARCH_KASAN=y -CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y -CONFIG_CC_HAS_KASAN_GENERIC=y -# CONFIG_KASAN is not set -CONFIG_KASAN_STACK=1 -CONFIG_ARCH_HAS_KCOV=y -CONFIG_CC_HAS_SANCOV_TRACE_PC=y -# CONFIG_KCOV is not set -# CONFIG_DEBUG_SHIRQ is not set - -# -# Debug Lockups and Hangs -# -# CONFIG_SOFTLOCKUP_DETECTOR is not set -# CONFIG_DETECT_HUNG_TASK is not set -# CONFIG_WQ_WATCHDOG is not set -# CONFIG_PANIC_ON_OOPS is not set -CONFIG_PANIC_ON_OOPS_VALUE=0 -CONFIG_PANIC_TIMEOUT=0 -CONFIG_SCHED_DEBUG=y -CONFIG_SCHED_INFO=y +CONFIG_DEBUG_FS=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PANIC_TIMEOUT=1 +CONFIG_DETECT_HUNG_TASK=y +CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y +# CONFIG_SCHED_DEBUG is not set CONFIG_SCHEDSTATS=y -# CONFIG_SCHED_STACK_END_CHECK is not set -# CONFIG_DEBUG_TIMEKEEPING is not set - -# -# Lock Debugging (spinlocks, mutexes, etc...) -# -CONFIG_LOCK_DEBUGGING_SUPPORT=y -# CONFIG_PROVE_LOCKING is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_DEBUG_RT_MUTEXES is not set CONFIG_DEBUG_SPINLOCK=y -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_RWSEMS is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_DEBUG_ATOMIC_SLEEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -# CONFIG_LOCK_TORTURE_TEST is not set -# CONFIG_WW_MUTEX_SELFTEST is not set CONFIG_STACKTRACE=y -# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set -# CONFIG_DEBUG_KOBJECT is not set -CONFIG_HAVE_DEBUG_BUGVERBOSE=y -CONFIG_DEBUG_BUGVERBOSE=y -# CONFIG_DEBUG_LIST is not set -# CONFIG_DEBUG_PI_LIST is not set -# CONFIG_DEBUG_SG is not set -# CONFIG_DEBUG_NOTIFIERS is not set CONFIG_DEBUG_CREDENTIALS=y - -# -# RCU Debugging -# -# CONFIG_RCU_PERF_TEST is not set -# CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 -CONFIG_RCU_TRACE=y -# CONFIG_RCU_EQS_DEBUG is not set -# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -# CONFIG_FAULT_INJECTION is not set -# CONFIG_LATENCYTOP is not set -CONFIG_NOP_TRACER=y -CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y -CONFIG_HAVE_DYNAMIC_FTRACE=y -CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y -CONFIG_HAVE_SYSCALL_TRACEPOINTS=y -CONFIG_HAVE_C_RECORDMCOUNT=y -CONFIG_TRACE_CLOCK=y -CONFIG_RING_BUFFER=y -CONFIG_EVENT_TRACING=y -CONFIG_CONTEXT_SWITCH_TRACER=y -CONFIG_TRACING=y -CONFIG_GENERIC_TRACER=y -CONFIG_TRACING_SUPPORT=y -CONFIG_FTRACE=y -CONFIG_FUNCTION_TRACER=y -CONFIG_FUNCTION_GRAPH_TRACER=y -# CONFIG_PREEMPTIRQ_EVENTS is not set -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_SCHED_TRACER is not set -# CONFIG_HWLAT_TRACER is not set -# CONFIG_FTRACE_SYSCALLS is not set -# CONFIG_TRACER_SNAPSHOT is not set -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -# CONFIG_PROFILE_ALL_BRANCHES is not set -# CONFIG_STACK_TRACER is not set -CONFIG_BLK_DEV_IO_TRACE=y -CONFIG_DYNAMIC_FTRACE=y -# CONFIG_FUNCTION_PROFILER is not set -CONFIG_FTRACE_MCOUNT_RECORD=y -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_HIST_TRIGGERS is not set -# CONFIG_TRACEPOINT_BENCHMARK is not set -# CONFIG_RING_BUFFER_BENCHMARK is not set -# CONFIG_RING_BUFFER_STARTUP_TEST is not set -# CONFIG_PREEMPTIRQ_DELAY_TEST is not set -# CONFIG_TRACE_EVAL_MAP_FILE is not set -CONFIG_TRACING_EVENTS_GPIO=y -# CONFIG_DMA_API_DEBUG is not set -CONFIG_RUNTIME_TESTING_MENU=y -CONFIG_LKDTM=y -# CONFIG_TEST_LIST_SORT is not set -# CONFIG_TEST_SORT is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_RBTREE_TEST is not set -# CONFIG_INTERVAL_TREE_TEST is not set -# CONFIG_PERCPU_TEST is not set -# CONFIG_ATOMIC64_SELFTEST is not set -# CONFIG_TEST_HEXDUMP is not set -# CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_KSTRTOX is not set -# CONFIG_TEST_PRINTF is not set -# CONFIG_TEST_BITMAP is not set -# CONFIG_TEST_BITFIELD is not set -# CONFIG_TEST_UUID is not set -# CONFIG_TEST_OVERFLOW is not set -# CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_HASH is not set -# CONFIG_TEST_IDA is not set -# CONFIG_TEST_LKM is not set -# CONFIG_TEST_USER_COPY is not set -# CONFIG_TEST_BPF is not set -# CONFIG_FIND_BIT_BENCHMARK is not set -# CONFIG_TEST_FIRMWARE is not set -# CONFIG_TEST_SYSCTL is not set -# CONFIG_TEST_UDELAY is not set -# CONFIG_TEST_STATIC_KEYS is not set -# CONFIG_TEST_KMOD is not set -# CONFIG_TEST_MEMINIT is not set -# CONFIG_TEST_STACKINIT is not set -# CONFIG_MEMTEST is not set -# CONFIG_BUG_ON_DATA_CORRUPTION is not set -# CONFIG_SAMPLES is not set -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y -# CONFIG_UBSAN is not set -CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y -CONFIG_STRICT_DEVMEM=y -# CONFIG_IO_STRICT_DEVMEM is not set -# CONFIG_ARM64_PTDUMP_DEBUGFS is not set -# CONFIG_PID_IN_CONTEXTIDR is not set -# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set -# CONFIG_DEBUG_WX is not set -# CONFIG_DEBUG_ALIGN_RODATA is not set -# CONFIG_ARM64_RELOC_TEST is not set -# CONFIG_CORESIGHT is not set - -CONFIG_ZED_GPIO_CONTROL=y -CONFIG_JOYSTICK_ZED=y +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=20 +# CONFIG_RCU_TRACE is not set +# CONFIG_FTRACE is not set +# CONFIG_STRICT_DEVMEM is not set +# CONFIG_RUNTIME_TESTING_MENU is not set diff --git a/projects/Rockchip/devices/RK3566-X55/options b/projects/Rockchip/devices/RK3566-X55/options index 84fba2cb9c..37c5e6cef1 100644 --- a/projects/Rockchip/devices/RK3566-X55/options +++ b/projects/Rockchip/devices/RK3566-X55/options @@ -32,39 +32,49 @@ PARTITION_TABLE="gpt" UBOOT_LABEL="uboot" TRUST_LABEL="trust" - DEVICE_DTB=("rk3566-evb2-lp4x-v10-linux") + DEVICE_DTB=("rk3566-powkiddy-x55") UBOOT_DTB="rk3566" - UBOOT_CONFIG="rk3568_defconfig" - PKG_SOC="rk356x" - PKG_DATAFILE="${PKG_RKBIN}/bin/rk35/rk3566_ddr_1056MHz_v1.16.bin" - PKG_LOADER="${PKG_RKBIN}/bin/rk35/rk356x_spl_v1.12.bin" - PKG_BL31="${PKG_RKBIN}/bin/rk35/rk3568_bl31_v1.42.elf" + UBOOT_CONFIG="powkiddy-x55-rk3566_defconfig" + PKG_SOC="rk3568" + PKG_DATAFILE="${PKG_RKBIN}/bin/rk35/rk3566_ddr_1056MHz_v1.18.bin" + PKG_LOADER="spl/u-boot-spl.bin" + PKG_BL31="${PKG_RKBIN}/bin/rk35/rk3568_bl31_v1.43.elf" PKG_LOAD_ADDR="0x0a100000" BOOT_INI=false EXT_LINUX_CONF=true # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD=" $(for DTB in "${DEVICE_DTB[@]}"; do echo -n "rockchip/${DTB}.dtb "; done)" + KERNEL_EXTRA_DEPENDS_TARGET="zstd libcap libtraceevent" # Define the CPU HW_CPU="Rockchip RK3566" # Mali GPU family MALI_FAMILY="bifrost-g52" - MALI_VERSION="g13p0" - OPENGLES="libmali" - VULKAN_SUPPORT="no" + # MALI_VERSION="g2p0" + # OPENGLES="libmali" + VULKAN_SUPPORT="" - GRAPHIC_DRIVERS="" + # OpenGL(X) implementation to use (mesa / no) + OPENGL="mesa" + + # OpenGL-ES implementation to use (mesa / no) + OPENGLES="mesa" + + GRAPHIC_DRIVERS="panfrost" # Displayserver to use (weston / x11 / no) - DISPLAYSERVER="no" + DISPLAYSERVER="wl" # Windowmanager to use (fluxbox / weston / no) - WINDOWMANAGER="no" + WINDOWMANAGER="weston" + + # debug tty path + DEBUG_TTY="/dev/ttyS2" # kernel serial console - EXTRA_CMDLINE="quiet rootwait console=ttyUSB0,1500000 fbcon=rotate:3 console=tty0 ssh consoleblank=0 systemd.show_status=0 loglevel=0 panic=20" + EXTRA_CMDLINE="quiet rootwait earlycon=uart8250,mmio32,0xfe660000 console=ttyS2,1500000n8 console=tty1 ssh consoleblank=0 systemd.show_status=0 loglevel=0 panic=20" # additional packages to install # ADDITIONAL_PACKAGES="" @@ -72,13 +82,13 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware RTL8821CS-firmware" + FIRMWARE="misc-firmware" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" - # ADDITIONAL_DRIVERS="RTL8821AU RTL8821CU RTL88x2BU" + ADDITIONAL_DRIVERS="jelos-gamepad" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" @@ -88,9 +98,6 @@ # Space separated list is supported, DRIVER_ADDONS="" #dvb-latest - # debug tty path - DEBUG_TTY="/dev/ttyUSB0" - # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="yes" @@ -109,11 +116,9 @@ # build and install SFTP Server (yes / no) SFTP_SERVER="yes" - # build and install Simple HTTP Server (yes / no) - SIMPLE_HTTP_SERVER="yes" - # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="no" + WIREGUARD_SUPPORT="no" # build and install ZeroTier support (yes / no) ZEROTIER_SUPPORT="yes" diff --git a/projects/Rockchip/devices/RK3566/linux/linux.aarch64.conf b/projects/Rockchip/devices/RK3566/linux/linux.aarch64.conf index f64fb821c0..721676b7f8 100644 --- a/projects/Rockchip/devices/RK3566/linux/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3566/linux/linux.aarch64.conf @@ -1,962 +1,149 @@ -# -# Automatically generated file; DO NOT EDIT. -# Linux/arm64 4.19.172 Kernel Configuration -# - -# -# Compiler: aarch64-libreelec-linux-gnueabi-gcc-10.3.0 (GCC) 10.3.0 -# -CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=100300 -CONFIG_CLANG_VERSION=0 -CONFIG_CC_HAS_ASM_GOTO=y -CONFIG_IRQ_WORK=y -CONFIG_BUILDTIME_EXTABLE_SORT=y -CONFIG_THREAD_INFO_IN_TASK=y - -# -# General setup -# -CONFIG_INIT_ENV_ARG_LIMIT=32 -# CONFIG_COMPILE_TEST is not set -CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set -CONFIG_BUILD_SALT="" -CONFIG_HAVE_KERNEL_GZIP=y -CONFIG_HAVE_KERNEL_LZ4=y -CONFIG_KERNEL_GZIP=y -# CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_HOSTNAME="@DEVICENAME@" -CONFIG_SWAP=y CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -# CONFIG_POSIX_MQUEUE is not set -CONFIG_CROSS_MEMORY_ATTACH=y -# CONFIG_USELIB is not set -# CONFIG_AUDIT is not set -CONFIG_HAVE_ARCH_AUDITSYSCALL=y - -# -# IRQ subsystem -# -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_SHOW_LEVEL=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_GENERIC_IRQ_CHIP=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_HANDLE_DOMAIN_IRQ=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_SPARSE_IRQ=y -# CONFIG_GENERIC_IRQ_DEBUGFS is not set -CONFIG_GENERIC_IRQ_MULTI_HANDLER=y -CONFIG_ARCH_CLOCKSOURCE_DATA=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_ARCH_HAS_TICK_BROADCAST=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y - -# -# Timers subsystem -# -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ_COMMON=y -# CONFIG_HZ_PERIODIC is not set +CONFIG_POSIX_MQUEUE=y +CONFIG_WATCH_QUEUE=y +# CONFIG_CROSS_MEMORY_ATTACH is not set +CONFIG_USELIB=y CONFIG_NO_HZ_IDLE=y -# CONFIG_NO_HZ_FULL is not set -CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y -# CONFIG_PREEMPT_NONE is not set -CONFIG_PREEMPT_VOLUNTARY=y -# CONFIG_PREEMPT is not set - -# -# CPU/Task time and stats accounting -# -CONFIG_TICK_CPU_ACCOUNTING=y -# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set -# CONFIG_IRQ_TIME_ACCOUNTING is not set -# CONFIG_BSD_PROCESS_ACCT is not set -# CONFIG_TASKSTATS is not set -# CONFIG_PSI is not set -CONFIG_CPU_ISOLATION=y - -# -# RCU Subsystem -# -CONFIG_TREE_RCU=y -# CONFIG_RCU_EXPERT is not set -CONFIG_SRCU=y -CONFIG_TREE_SRCU=y -CONFIG_RCU_STALL_COMMON=y -CONFIG_RCU_NEED_SEGCBLIST=y -CONFIG_BUILD_BIN2C=y +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set +CONFIG_PREEMPT=y +CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y -# CONFIG_IKHEADERS is not set CONFIG_LOG_BUF_SHIFT=18 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 -CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 -CONFIG_GENERIC_SCHED_CLOCK=y - -# -# Scheduler features -# -CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y -CONFIG_ARCH_SUPPORTS_INT128=y -CONFIG_CGROUPS=y -# CONFIG_MEMCG is not set +CONFIG_MEMCG=y CONFIG_BLK_CGROUP=y -# CONFIG_DEBUG_BLK_CGROUP is not set -CONFIG_CGROUP_SCHED=y -CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y -# CONFIG_RT_GROUP_SCHED is not set -# CONFIG_CGROUP_PIDS is not set -# CONFIG_CGROUP_RDMA is not set +CONFIG_RT_GROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y -CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y -# CONFIG_CGROUP_DEBUG is not set -CONFIG_SOCK_CGROUP_DATA=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y -CONFIG_UTS_NS=y -CONFIG_IPC_NS=y -CONFIG_USER_NS=y -CONFIG_PID_NS=y -CONFIG_NET_NS=y -# CONFIG_CHECKPOINT_RESTORE is not set -# CONFIG_SCHED_AUTOGROUP is not set -# CONFIG_SCHED_TUNE is not set -# CONFIG_SYSFS_DEPRECATED is not set +CONFIG_SCHED_AUTOGROUP=y CONFIG_RELAY=y -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_INITRAMFS_ROOT_UID=0 -CONFIG_INITRAMFS_ROOT_GID=0 -CONFIG_RD_GZIP=y -CONFIG_RD_BZIP2=y -CONFIG_RD_LZMA=y -CONFIG_RD_XZ=y -CONFIG_RD_LZO=y -CONFIG_RD_LZ4=y -CONFIG_INITRAMFS_COMPRESSION=".gz" -# CONFIG_INITRD_ASYNC is not set -# CONFIG_ROCKCHIP_ONE_INITRD is not set -CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -CONFIG_SYSCTL=y -CONFIG_HAVE_UID16=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -CONFIG_BPF=y +CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" +CONFIG_INITRAMFS_COMPRESSION_LZO=y +CONFIG_BOOT_CONFIG=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_EXPERT=y -CONFIG_UID16=y -CONFIG_MULTIUSER=y -# CONFIG_SGETMASK_SYSCALL is not set -CONFIG_SYSFS_SYSCALL=y -# CONFIG_SYSCTL_SYSCALL is not set -CONFIG_FHANDLE=y -CONFIG_POSIX_TIMERS=y -CONFIG_PRINTK=y -CONFIG_PRINTK_NMI=y -CONFIG_BUG=y -CONFIG_ELF_CORE=y -CONFIG_BASE_FULL=y -CONFIG_FUTEX=y -CONFIG_FUTEX_PI=y -CONFIG_EPOLL=y -CONFIG_SIGNALFD=y -CONFIG_TIMERFD=y -CONFIG_EVENTFD=y -CONFIG_SHMEM=y -CONFIG_AIO=y -CONFIG_ADVISE_SYSCALLS=y -CONFIG_MEMBARRIER=y -CONFIG_KALLSYMS=y -# CONFIG_KALLSYMS_ALL is not set -CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_BPF_SYSCALL is not set -# CONFIG_USERFAULTFD is not set -CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y -CONFIG_RSEQ=y -# CONFIG_DEBUG_RSEQ is not set -CONFIG_EMBEDDED=y -CONFIG_HAVE_PERF_EVENTS=y -# CONFIG_PC104 is not set - -# -# Kernel Performance Events And Counters -# -# CONFIG_PERF_EVENTS is not set -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_SLUB_SYSFS=y -CONFIG_SLUB_DEBUG=y -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_SLOB is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLAB_FREELIST_RANDOM is not set -# CONFIG_SLAB_FREELIST_HARDENED is not set -CONFIG_SLUB_CPU_PARTIAL=y -CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_SGETMASK_SYSCALL=y +CONFIG_KALLSYMS_ALL=y CONFIG_PROFILING=y -CONFIG_TRACEPOINTS=y -CONFIG_ARM64=y -CONFIG_64BIT=y -CONFIG_MMU=y -CONFIG_ARM64_PAGE_SHIFT=12 -CONFIG_ARM64_CONT_SHIFT=4 -CONFIG_ARCH_MMAP_RND_BITS_MIN=18 -CONFIG_ARCH_MMAP_RND_BITS_MAX=24 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_RWSEM_XCHGADD_ALGORITHM=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_HWEIGHT=y -CONFIG_GENERIC_CSUM=y -CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_ZONE_DMA32=y -CONFIG_HAVE_GENERIC_GUP=y -CONFIG_SMP=y -CONFIG_KERNEL_MODE_NEON=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_PGTABLE_LEVELS=3 -CONFIG_ARCH_SUPPORTS_UPROBES=y -CONFIG_ARCH_PROC_KCORE_TEXT=y - -# -# Platform selection -# -# CONFIG_ARCH_ACTIONS is not set -# CONFIG_ARCH_SUNXI is not set -# CONFIG_ARCH_ALPINE is not set -# CONFIG_ARCH_BCM2835 is not set -# CONFIG_ARCH_BCM_IPROC is not set -# CONFIG_ARCH_BERLIN is not set -# CONFIG_ARCH_BRCMSTB is not set -# CONFIG_ARCH_EXYNOS is not set -# CONFIG_ARCH_K3 is not set -# CONFIG_ARCH_LAYERSCAPE is not set -# CONFIG_ARCH_LG1K is not set -# CONFIG_ARCH_HISI is not set -# CONFIG_ARCH_MEDIATEK is not set -# CONFIG_ARCH_MESON is not set -# CONFIG_ARCH_MVEBU is not set -# CONFIG_ARCH_QCOM is not set -# CONFIG_ARCH_REALTEK is not set CONFIG_ARCH_ROCKCHIP=y -# CONFIG_ARCH_SEATTLE is not set -# CONFIG_ARCH_SYNQUACER is not set -# CONFIG_ARCH_RENESAS is not set -# CONFIG_ARCH_STRATIX10 is not set -# CONFIG_ARCH_TEGRA is not set -# CONFIG_ARCH_SPRD is not set -# CONFIG_ARCH_THUNDER is not set -# CONFIG_ARCH_THUNDER2 is not set -# CONFIG_ARCH_UNIPHIER is not set -# CONFIG_ARCH_VEXPRESS is not set -# CONFIG_ARCH_XGENE is not set -# CONFIG_ARCH_ZX is not set -# CONFIG_ARCH_ZYNQMP is not set - -# -# Bus support -# -CONFIG_PCI=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_DOMAINS_GENERIC=y -CONFIG_PCI_SYSCALL=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCIEAER=y -# CONFIG_PCIEAER_INJECT is not set -# CONFIG_PCIE_ECRC is not set -CONFIG_PCIEASPM=y -# CONFIG_PCIEASPM_DEBUG is not set -CONFIG_PCIEASPM_DEFAULT=y -# CONFIG_PCIEASPM_POWERSAVE is not set -# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set -# CONFIG_PCIEASPM_PERFORMANCE is not set -CONFIG_PCIE_PME=y -# CONFIG_PCIE_DPC is not set -# CONFIG_PCIE_PTM is not set -CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y -CONFIG_PCI_QUIRKS=y -# CONFIG_PCI_DEBUG is not set -# CONFIG_PCI_STUB is not set -# CONFIG_PCI_IOV is not set -# CONFIG_PCI_PRI is not set -# CONFIG_PCI_PASID is not set -# CONFIG_HOTPLUG_PCI is not set - -# -# PCI controller drivers -# - -# -# Cadence PCIe controllers support -# -# CONFIG_PCIE_CADENCE_HOST is not set -# CONFIG_PCI_FTPCI100 is not set -# CONFIG_PCI_HOST_GENERIC is not set -# CONFIG_PCIE_XILINX is not set -# CONFIG_PCI_XGENE is not set -# CONFIG_PCI_HOST_THUNDER_PEM is not set -# CONFIG_PCI_HOST_THUNDER_ECAM is not set -# CONFIG_PCIE_ROCKCHIP_HOST is not set -# CONFIG_ROCKCHIP_PCIE_DMA_OBJ is not set - -# -# DesignWare PCI Core Support -# -CONFIG_PCIE_DW=y -CONFIG_PCIE_DW_HOST=y -# CONFIG_PCIE_DW_PLAT_HOST is not set -CONFIG_PCIE_DW_ROCKCHIP=y -# CONFIG_PCI_HISI is not set -# CONFIG_PCIE_KIRIN is not set - -# -# PCI Endpoint -# -# CONFIG_PCI_ENDPOINT is not set - -# -# PCI switch controller drivers -# -# CONFIG_PCI_SW_SWITCHTEC is not set - -# -# Kernel Features -# - -# -# ARM errata workarounds via the alternatives framework -# -# CONFIG_ARM64_ERRATUM_826319 is not set -# CONFIG_ARM64_ERRATUM_827319 is not set -# CONFIG_ARM64_ERRATUM_824069 is not set -# CONFIG_ARM64_ERRATUM_819472 is not set -# CONFIG_ARM64_ERRATUM_832075 is not set -CONFIG_ARM64_ERRATUM_845719=y -CONFIG_ARM64_ERRATUM_843419=y -CONFIG_ARM64_ERRATUM_1024718=y -CONFIG_ARM64_ERRATUM_1463225=y -CONFIG_ARM64_ERRATUM_1542419=y # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set -CONFIG_CAVIUM_ERRATUM_27456=y -CONFIG_CAVIUM_ERRATUM_30115=y -CONFIG_QCOM_FALKOR_ERRATUM_1003=y -CONFIG_QCOM_FALKOR_ERRATUM_1009=y -CONFIG_QCOM_QDF2400_ERRATUM_0065=y -CONFIG_SOCIONEXT_SYNQUACER_PREITS=y -CONFIG_HISILICON_ERRATUM_161600802=y -CONFIG_QCOM_FALKOR_ERRATUM_E1041=y -CONFIG_ARM64_4K_PAGES=y -# CONFIG_ARM64_16K_PAGES is not set -# CONFIG_ARM64_64K_PAGES is not set -CONFIG_ARM64_VA_BITS_39=y -# CONFIG_ARM64_VA_BITS_48 is not set -CONFIG_ARM64_VA_BITS=39 -CONFIG_ARM64_PA_BITS_48=y -CONFIG_ARM64_PA_BITS=48 -# CONFIG_CPU_BIG_ENDIAN is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_CAVIUM_ERRATUM_30115 is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_FUJITSU_ERRATUM_010001 is not set +# CONFIG_HISILICON_ERRATUM_161600802 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set +# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set +# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set +# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set CONFIG_SCHED_MC=y -# CONFIG_SCHED_SMT is not set -CONFIG_NR_CPUS=8 -CONFIG_HOTPLUG_CPU=y -CONFIG_ARCH_NR_GPIO=256 -# CONFIG_NUMA is not set -CONFIG_HOLES_IN_ZONE=y -# CONFIG_HZ_100 is not set -# CONFIG_HZ_250 is not set -CONFIG_HZ_300=y -# CONFIG_HZ_1000 is not set -CONFIG_HZ=300 -CONFIG_SCHED_HRTICK=y -CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y -CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_FLATMEM_ENABLE=y -CONFIG_HAVE_ARCH_PFN_VALID=y -CONFIG_SYS_SUPPORTS_HUGETLBFS=y -CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y -CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y -# CONFIG_ARM64_DMA_USE_IOMMU is not set -CONFIG_SECCOMP=y -# CONFIG_PARAVIRT is not set -# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set -# CONFIG_KEXEC is not set -# CONFIG_CRASH_DUMP is not set -# CONFIG_XEN is not set -CONFIG_FORCE_MAX_ZONEORDER=11 -CONFIG_UNMAP_KERNEL_AT_EL0=y -CONFIG_HARDEN_BRANCH_PREDICTOR=y -CONFIG_HARDEN_EL2_VECTORS=y -CONFIG_ARM64_SSBD=y -CONFIG_ARM64_TAGGED_ADDR_ABI=y +CONFIG_SCHED_SMT=y +CONFIG_NR_CPUS=4 +CONFIG_ARM64_SW_TTBR0_PAN=y +CONFIG_COMPAT=y CONFIG_ARMV8_DEPRECATED=y -CONFIG_SWP_EMULATION=y -CONFIG_CP15_BARRIER_EMULATION=y -CONFIG_SETEND_EMULATION=y -# CONFIG_ARM64_SW_TTBR0_PAN is not set - -# -# ARMv8.1 architectural features -# -CONFIG_ARM64_HW_AFDBM=y -CONFIG_ARM64_PAN=y -CONFIG_ARM64_LSE_ATOMICS=y -CONFIG_ARM64_VHE=y - -# -# ARMv8.2 architectural features -# -CONFIG_ARM64_UAO=y -# CONFIG_ARM64_PMEM is not set -CONFIG_ARM64_RAS_EXTN=y -CONFIG_ARM64_SVE=y -CONFIG_ARM64_MODULE_PLTS=y -# CONFIG_RANDOMIZE_BASE is not set - -# -# Boot options -# -CONFIG_CMDLINE="" +CONFIG_ARM64_PMEM=y +# CONFIG_ARM64_BTI is not set +CONFIG_RANDOMIZE_BASE=y # CONFIG_EFI is not set -CONFIG_COMPAT=y -CONFIG_KUSER_HELPERS=y -CONFIG_SYSVIPC_COMPAT=y - -# -# Power management options -# -CONFIG_SUSPEND=y -CONFIG_SUSPEND_FREEZER=y -# CONFIG_SUSPEND_SKIP_SYNC is not set -CONFIG_HAS_WAKELOCK=y -CONFIG_WAKELOCK=y -# CONFIG_HIBERNATION is not set -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -# CONFIG_PM_AUTOSLEEP is not set -# CONFIG_PM_WAKELOCKS is not set -CONFIG_PM=y -CONFIG_PM_DEBUG=y -CONFIG_PM_ADVANCED_DEBUG=y -# CONFIG_PM_TEST_SUSPEND is not set -CONFIG_PM_SLEEP_DEBUG=y -# CONFIG_DPM_WATCHDOG is not set -CONFIG_PM_CLK=y -CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_SUSPEND_SKIP_SYNC=y +CONFIG_PM_AUTOSLEEP=y CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y -CONFIG_PM_GENERIC_DOMAINS_SLEEP=y -CONFIG_PM_GENERIC_DOMAINS_OF=y -CONFIG_CPU_PM=y CONFIG_ENERGY_MODEL=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y - -# -# CPU Power Management -# - -# -# CPU Idle -# CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y -# CONFIG_CPU_IDLE_GOV_LADDER is not set -CONFIG_CPU_IDLE_GOV_MENU=y -CONFIG_DT_IDLE_STATES=y - -# -# ARM CPU Idle Drivers -# -CONFIG_ARM_CPUIDLE=y - -# -# CPU Frequency scaling -# +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_ARM_PSCI_CPUIDLE=y CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_GOV_ATTR_SET=y -CONFIG_CPU_FREQ_GOV_COMMON=y -# CONFIG_CPU_FREQ_STAT is not set -# CONFIG_CPU_FREQ_TIMES is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y -CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_INTERACTIVE=y - -# -# CPU frequency scaling drivers -# CONFIG_CPUFREQ_DT=y -CONFIG_CPUFREQ_DT_PLATDEV=y -# CONFIG_CPUFREQ_DUMMY is not set -# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set -CONFIG_ARM_ROCKCHIP_CPUFREQ=y -# CONFIG_ARM_SCMI_CPUFREQ is not set -# CONFIG_QORIQ_CPUFREQ is not set - -# -# Firmware Drivers -# -CONFIG_ARM_PSCI_FW=y -# CONFIG_ARM_PSCI_CHECKER is not set -CONFIG_ARM_SCMI_PROTOCOL=y -CONFIG_ARM_SCMI_POWER_DOMAIN=y -# CONFIG_ARM_SCPI_PROTOCOL is not set -# CONFIG_ARM_SDE_INTERFACE is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_ROCKCHIP_SIP=y -CONFIG_HAVE_ARM_SMCCC=y -# CONFIG_GOOGLE_FIRMWARE is not set - -# -# Tegra firmware driver -# -# CONFIG_VIRTUALIZATION is not set -CONFIG_ARM64_CRYPTO=y -CONFIG_CRYPTO_SHA256_ARM64=y -# CONFIG_CRYPTO_SHA512_ARM64 is not set -CONFIG_CRYPTO_SHA1_ARM64_CE=y -CONFIG_CRYPTO_SHA2_ARM64_CE=y -# CONFIG_CRYPTO_SHA512_ARM64_CE is not set -# CONFIG_CRYPTO_SHA3_ARM64 is not set -# CONFIG_CRYPTO_SM3_ARM64_CE is not set -# CONFIG_CRYPTO_SM4_ARM64_CE is not set -CONFIG_CRYPTO_GHASH_ARM64_CE=y -# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set -# CONFIG_CRYPTO_CRC32_ARM64_CE is not set -CONFIG_CRYPTO_AES_ARM64=y -CONFIG_CRYPTO_AES_ARM64_CE=y -CONFIG_CRYPTO_AES_ARM64_CE_CCM=y -CONFIG_CRYPTO_AES_ARM64_CE_BLK=y -# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set -# CONFIG_CRYPTO_CHACHA20_NEON is not set -# CONFIG_CRYPTO_POLY1305_NEON is not set -# CONFIG_CRYPTO_AES_ARM64_BS is not set - -# -# General architecture-dependent options -# -# CONFIG_KPROBES is not set -# CONFIG_JUMP_LABEL is not set -CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y -CONFIG_HAVE_KPROBES=y -CONFIG_HAVE_KRETPROBES=y -CONFIG_HAVE_NMI=y -CONFIG_HAVE_ARCH_TRACEHOOK=y -CONFIG_HAVE_DMA_CONTIGUOUS=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_IDLE_POLL_SETUP=y -CONFIG_ARCH_HAS_FORTIFY_SOURCE=y -CONFIG_ARCH_HAS_SET_MEMORY=y -CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y -CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y -CONFIG_HAVE_RSEQ=y -CONFIG_HAVE_CLK=y -CONFIG_HAVE_PERF_REGS=y -CONFIG_HAVE_PERF_USER_STACK_DUMP=y -CONFIG_HAVE_ARCH_JUMP_LABEL=y -CONFIG_HAVE_RCU_TABLE_FREE=y -CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y -CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y -CONFIG_HAVE_CMPXCHG_LOCAL=y -CONFIG_HAVE_CMPXCHG_DOUBLE=y -CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y -CONFIG_HAVE_ARCH_SECCOMP_FILTER=y -CONFIG_SECCOMP_FILTER=y -CONFIG_HAVE_STACKPROTECTOR=y -CONFIG_CC_HAS_STACKPROTECTOR_NONE=y -CONFIG_STACKPROTECTOR=y -CONFIG_STACKPROTECTOR_STRONG=y -CONFIG_ARCH_SUPPORTS_LTO_CLANG=y -CONFIG_ARCH_SUPPORTS_THINLTO=y -CONFIG_LTO_NONE=y -CONFIG_HAVE_CONTEXT_TRACKING=y -CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y -CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y -CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y -CONFIG_HAVE_ARCH_HUGE_VMAP=y -CONFIG_HAVE_MOD_ARCH_SPECIFIC=y -CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_ARCH_HAS_ELF_RANDOMIZE=y -CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_ARM_SCMI_CPUFREQ=y CONFIG_ARCH_MMAP_RND_BITS=18 -CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 -CONFIG_CLONE_BACKWARDS=y -CONFIG_OLD_SIGSUSPEND3=y -CONFIG_COMPAT_OLD_SIGACTION=y -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_HAVE_ARCH_VMAP_STACK=y -CONFIG_VMAP_STACK=y -CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y -CONFIG_STRICT_KERNEL_RWX=y -CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y -CONFIG_STRICT_MODULE_RWX=y -CONFIG_REFCOUNT_FULL=y -CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y - -# -# GCOV-based kernel profiling -# -# CONFIG_GCOV_KERNEL is not set -CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y -CONFIG_PLUGIN_HOSTCC="" -CONFIG_HAVE_GCC_PLUGINS=y -CONFIG_RT_MUTEXES=y -CONFIG_BASE_SMALL=0 +# CONFIG_GCC_PLUGINS is not set CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y -# CONFIG_MODVERSIONS is not set -# CONFIG_MODULE_SRCVERSION_ALL is not set -# CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_COMPRESS is not set -# CONFIG_TRIM_UNUSED_KSYMS is not set -CONFIG_MODULES_TREE_LOOKUP=y -CONFIG_BLOCK=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_BLK_DEV_BSG=y -# CONFIG_BLK_DEV_BSGLIB is not set -# CONFIG_BLK_DEV_INTEGRITY is not set -# CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_DEV_THROTTLING is not set -# CONFIG_BLK_CMDLINE_PARSER is not set -# CONFIG_BLK_WBT is not set -# CONFIG_BLK_CGROUP_IOLATENCY is not set -CONFIG_BLK_DEBUG_FS=y -# CONFIG_BLK_SED_OPAL is not set -# CONFIG_BLK_INLINE_ENCRYPTION is not set - -# -# Partition Types -# CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -# CONFIG_AIX_PARTITION is not set -# CONFIG_OSF_PARTITION is not set -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_ATARI_PARTITION is not set -# CONFIG_MAC_PARTITION is not set -CONFIG_MSDOS_PARTITION=y -# CONFIG_BSD_DISKLABEL is not set -# CONFIG_MINIX_SUBPARTITION is not set -# CONFIG_SOLARIS_X86_PARTITION is not set -# CONFIG_UNIXWARE_DISKLABEL is not set -# CONFIG_LDM_PARTITION is not set -# CONFIG_SGI_PARTITION is not set -# CONFIG_ULTRIX_PARTITION is not set -# CONFIG_SUN_PARTITION is not set -# CONFIG_KARMA_PARTITION is not set -CONFIG_EFI_PARTITION=y -# CONFIG_SYSV68_PARTITION is not set -# CONFIG_CMDLINE_PARTITION is not set -CONFIG_BLOCK_COMPAT=y -CONFIG_BLK_MQ_PCI=y - -# -# IO Schedulers -# -CONFIG_IOSCHED_NOOP=y -CONFIG_IOSCHED_DEADLINE=y -CONFIG_IOSCHED_CFQ=y -# CONFIG_CFQ_GROUP_IOSCHED is not set -# CONFIG_DEFAULT_DEADLINE is not set -CONFIG_DEFAULT_CFQ=y -# CONFIG_DEFAULT_NOOP is not set -CONFIG_DEFAULT_IOSCHED="cfq" -CONFIG_MQ_IOSCHED_DEADLINE=y -CONFIG_MQ_IOSCHED_KYBER=y +CONFIG_MAC_PARTITION=y +# CONFIG_MQ_IOSCHED_KYBER is not set # CONFIG_IOSCHED_BFQ is not set -CONFIG_ASN1=y -CONFIG_ARCH_INLINE_SPIN_TRYLOCK=y -CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_LOCK=y -CONFIG_ARCH_INLINE_SPIN_LOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ=y -CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE=y -CONFIG_ARCH_INLINE_READ_LOCK=y -CONFIG_ARCH_INLINE_READ_LOCK_BH=y -CONFIG_ARCH_INLINE_READ_LOCK_IRQ=y -CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_READ_UNLOCK=y -CONFIG_ARCH_INLINE_READ_UNLOCK_BH=y -CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE=y -CONFIG_ARCH_INLINE_WRITE_LOCK=y -CONFIG_ARCH_INLINE_WRITE_LOCK_BH=y -CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ=y -CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ=y -CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE=y -CONFIG_UNINLINE_SPIN_UNLOCK=y -CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_ARCH_USE_QUEUED_RWLOCKS=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y -# CONFIG_GKI_HIDDEN_DRM_CONFIGS is not set -# CONFIG_GKI_HIDDEN_REGMAP_CONFIGS is not set -# CONFIG_GKI_HIDDEN_CRYPTO_CONFIGS is not set -# CONFIG_GKI_HIDDEN_SND_CONFIGS is not set -# CONFIG_GKI_HIDDEN_SND_SOC_CONFIGS is not set -# CONFIG_GKI_HIDDEN_GPIO_CONFIGS is not set -# CONFIG_GKI_HIDDEN_VIRTUAL_CONFIGS is not set -# CONFIG_GKI_LEGACY_WEXT_ALLCONFIG is not set -# CONFIG_GKI_HIDDEN_SOC_PM_CONFIGS is not set -# CONFIG_GKI_HIDDEN_VIDEOBUF2_CONFIGS is not set -# CONFIG_GKI_HIDDEN_USB_CONFIGS is not set -# CONFIG_GKI_HIDDEN_SOC_BUS_CONFIGS is not set -# CONFIG_GKI_HIDDEN_GPU_CONFIGS is not set -# CONFIG_GKI_HIDDEN_IRQ_CONFIGS is not set -# CONFIG_GKI_HACKS_TO_FIX is not set -CONFIG_FREEZER=y - -# -# Executable file formats -# -CONFIG_BINFMT_ELF=y -CONFIG_COMPAT_BINFMT_ELF=y -CONFIG_ELFCORE=y -CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y -CONFIG_BINFMT_SCRIPT=y CONFIG_BINFMT_MISC=y -CONFIG_COREDUMP=y - -# -# Memory Management options -# -CONFIG_SELECT_MEMORY_MODEL=y -# CONFIG_FLATMEM_MANUAL is not set -CONFIG_SPARSEMEM_MANUAL=y -CONFIG_SPARSEMEM=y -CONFIG_HAVE_MEMORY_PRESENT=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_HAVE_MEMBLOCK=y -CONFIG_NO_BOOTMEM=y -CONFIG_MEMORY_ISOLATION=y -CONFIG_SPLIT_PTLOCK_CPUS=4 +# CONFIG_SLAB_MERGE_DEFAULT is not set +# CONFIG_SLUB_CPU_PARTIAL is not set +# CONFIG_COMPAT_BRK is not set # CONFIG_COMPACTION is not set -CONFIG_MIGRATION=y -CONFIG_PHYS_ADDR_T_64BIT=y -# CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 -CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y -# CONFIG_MEMORY_FAILURE is not set -# CONFIG_TRANSPARENT_HUGEPAGE is not set -# CONFIG_CLEANCACHE is not set -# CONFIG_FRONTSWAP is not set -CONFIG_CMA=y -# CONFIG_CMA_DEBUG is not set -# CONFIG_CMA_DEBUGFS is not set -CONFIG_CMA_AREAS=7 -# CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set -CONFIG_ZSMALLOC=y -# CONFIG_PGTABLE_MAPPING is not set -# CONFIG_ZSMALLOC_STAT is not set -# CONFIG_MM_EVENT_STAT is not set -CONFIG_GENERIC_EARLY_IOREMAP=y -# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set -# CONFIG_IDLE_PAGE_TRACKING is not set -CONFIG_FRAME_VECTOR=y -# CONFIG_PERCPU_STATS is not set -# CONFIG_GUP_BENCHMARK is not set -CONFIG_ARCH_HAS_PTE_SPECIAL=y +# CONFIG_VM_EVENT_COUNTERS is not set CONFIG_NET=y -CONFIG_COMPAT_NETLINK_MESSAGES=y -CONFIG_NET_INGRESS=y - -# -# Networking options -# CONFIG_PACKET=y -CONFIG_PACKET_DIAG=y CONFIG_UNIX=y -CONFIG_UNIX_DIAG=y -# CONFIG_TLS is not set -CONFIG_XFRM=y -CONFIG_XFRM_ALGO=y +CONFIG_UNIX_DIAG=m CONFIG_XFRM_USER=y -# CONFIG_XFRM_INTERFACE is not set -# CONFIG_XFRM_SUB_POLICY is not set -CONFIG_XFRM_MIGRATE=y -# CONFIG_XFRM_STATISTICS is not set -CONFIG_XFRM_IPCOMP=m -CONFIG_NET_KEY=m -CONFIG_NET_KEY_MIGRATE=y +CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_FIB_TRIE_STATS=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y -CONFIG_IP_ROUTE_CLASSID=y -CONFIG_IP_PNP=y -# CONFIG_IP_PNP_DHCP is not set -# CONFIG_IP_PNP_BOOTP is not set -# CONFIG_IP_PNP_RARP is not set CONFIG_NET_IPIP=m CONFIG_NET_IPGRE_DEMUX=m -CONFIG_NET_IP_TUNNEL=m -# CONFIG_NET_IPGRE is not set -CONFIG_IP_MROUTE_COMMON=y +CONFIG_NET_IPGRE=m CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y -CONFIG_SYN_COOKIES=y -# CONFIG_NET_IPVTI is not set -CONFIG_NET_UDP_TUNNEL=m -CONFIG_NET_FOU=m -# CONFIG_NET_FOU_IP_TUNNELS is not set -CONFIG_INET_AH=m -CONFIG_INET_ESP=m -# CONFIG_INET_ESP_OFFLOAD is not set -CONFIG_INET_IPCOMP=m -CONFIG_INET_XFRM_TUNNEL=m -CONFIG_INET_TUNNEL=m -CONFIG_INET_XFRM_MODE_TRANSPORT=m -CONFIG_INET_XFRM_MODE_TUNNEL=m -CONFIG_INET_XFRM_MODE_BEET=m -CONFIG_INET_DIAG=m -CONFIG_INET_TCP_DIAG=m -# CONFIG_INET_UDP_DIAG is not set -# CONFIG_INET_RAW_DIAG is not set -# CONFIG_INET_DIAG_DESTROY is not set +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_DIAG is not set CONFIG_TCP_CONG_ADVANCED=y -CONFIG_TCP_CONG_BIC=m CONFIG_TCP_CONG_CUBIC=m -CONFIG_TCP_CONG_WESTWOOD=m -CONFIG_TCP_CONG_HTCP=m -# CONFIG_TCP_CONG_HSTCP is not set -# CONFIG_TCP_CONG_HYBLA is not set -# CONFIG_TCP_CONG_VEGAS is not set -# CONFIG_TCP_CONG_NV is not set -# CONFIG_TCP_CONG_SCALABLE is not set -# CONFIG_TCP_CONG_LP is not set -# CONFIG_TCP_CONG_VENO is not set -# CONFIG_TCP_CONG_YEAH is not set -# CONFIG_TCP_CONG_ILLINOIS is not set -# CONFIG_TCP_CONG_DCTCP is not set -# CONFIG_TCP_CONG_CDG is not set -# CONFIG_TCP_CONG_BBR is not set -CONFIG_DEFAULT_RENO=y -CONFIG_DEFAULT_TCP_CONG="reno" -# CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=m -# CONFIG_IPV6_ROUTER_PREF is not set -CONFIG_IPV6_OPTIMISTIC_DAD=y -CONFIG_INET6_AH=m -CONFIG_INET6_ESP=m -# CONFIG_INET6_ESP_OFFLOAD is not set -CONFIG_INET6_IPCOMP=m -CONFIG_IPV6_MIP6=m -CONFIG_IPV6_ILA=m -CONFIG_INET6_XFRM_TUNNEL=m -CONFIG_INET6_TUNNEL=m -CONFIG_INET6_XFRM_MODE_TRANSPORT=m -CONFIG_INET6_XFRM_MODE_TUNNEL=m -CONFIG_INET6_XFRM_MODE_BEET=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -# CONFIG_IPV6_VTI is not set -CONFIG_IPV6_SIT=m -# CONFIG_IPV6_SIT_6RD is not set -CONFIG_IPV6_NDISC_NODETYPE=y -CONFIG_IPV6_TUNNEL=m -# CONFIG_IPV6_GRE is not set -CONFIG_IPV6_FOU=m -CONFIG_IPV6_MULTIPLE_TABLES=y -# CONFIG_IPV6_SUBTREES is not set -CONFIG_IPV6_MROUTE=y -# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set -# CONFIG_IPV6_PIMSM_V2 is not set -# CONFIG_IPV6_SEG6_LWTUNNEL is not set -# CONFIG_IPV6_SEG6_HMAC is not set -CONFIG_NETWORK_SECMARK=y -CONFIG_NET_PTP_CLASSIFY=y -# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_CDG=m +CONFIG_TCP_MD5SIG=y +# CONFIG_IPV6 is not set CONFIG_NETFILTER=y -CONFIG_NETFILTER_ADVANCED=y -CONFIG_BRIDGE_NETFILTER=m - -# -# Core Netfilter Configuration -# -CONFIG_NETFILTER_INGRESS=y -CONFIG_NETFILTER_NETLINK=m -CONFIG_NETFILTER_FAMILY_BRIDGE=y -CONFIG_NETFILTER_FAMILY_ARP=y -CONFIG_NETFILTER_NETLINK_ACCT=m -CONFIG_NETFILTER_NETLINK_QUEUE=m -CONFIG_NETFILTER_NETLINK_LOG=m -CONFIG_NETFILTER_NETLINK_OSF=m +CONFIG_BRIDGE_NETFILTER=y +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y CONFIG_NF_CONNTRACK=m -CONFIG_NF_LOG_COMMON=m -# CONFIG_NF_LOG_NETDEV is not set -CONFIG_NETFILTER_CONNCOUNT=m -CONFIG_NF_CONNTRACK_MARK=y -# CONFIG_NF_CONNTRACK_SECMARK is not set -# CONFIG_NF_CONNTRACK_ZONES is not set CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_TIMEOUT=y CONFIG_NF_CONNTRACK_TIMESTAMP=y -CONFIG_NF_CONNTRACK_LABELS=y -CONFIG_NF_CT_PROTO_DCCP=y -CONFIG_NF_CT_PROTO_GRE=m -CONFIG_NF_CT_PROTO_SCTP=y -CONFIG_NF_CT_PROTO_UDPLITE=y CONFIG_NF_CONNTRACK_AMANDA=m CONFIG_NF_CONNTRACK_FTP=m CONFIG_NF_CONNTRACK_H323=m CONFIG_NF_CONNTRACK_IRC=m -CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m CONFIG_NF_CONNTRACK_SNMP=m CONFIG_NF_CONNTRACK_PPTP=m @@ -964,84 +151,36 @@ CONFIG_NF_CONNTRACK_SANE=m CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m -# CONFIG_NF_CT_NETLINK_TIMEOUT is not set -# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set -CONFIG_NF_NAT=m -CONFIG_NF_NAT_NEEDED=y -CONFIG_NF_NAT_PROTO_DCCP=y -CONFIG_NF_NAT_PROTO_UDPLITE=y -CONFIG_NF_NAT_PROTO_SCTP=y -CONFIG_NF_NAT_AMANDA=m -CONFIG_NF_NAT_FTP=m -CONFIG_NF_NAT_IRC=m -CONFIG_NF_NAT_SIP=m -CONFIG_NF_NAT_TFTP=m -CONFIG_NF_NAT_REDIRECT=y -CONFIG_NETFILTER_SYNPROXY=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m CONFIG_NF_TABLES=m -# CONFIG_NF_TABLES_SET is not set -# CONFIG_NF_TABLES_INET is not set -# CONFIG_NF_TABLES_NETDEV is not set -# CONFIG_NFT_NUMGEN is not set -# CONFIG_NFT_CT is not set -# CONFIG_NFT_COUNTER is not set -# CONFIG_NFT_CONNLIMIT is not set -# CONFIG_NFT_LOG is not set -# CONFIG_NFT_LIMIT is not set -# CONFIG_NFT_MASQ is not set -# CONFIG_NFT_REDIR is not set -# CONFIG_NFT_NAT is not set -# CONFIG_NFT_TUNNEL is not set -# CONFIG_NFT_OBJREF is not set -# CONFIG_NFT_QUEUE is not set -# CONFIG_NFT_QUOTA is not set -# CONFIG_NFT_REJECT is not set -# CONFIG_NFT_COMPAT is not set -# CONFIG_NFT_HASH is not set -# CONFIG_NFT_SOCKET is not set -# CONFIG_NFT_OSF is not set -# CONFIG_NFT_TPROXY is not set -# CONFIG_NF_FLOW_TABLE is not set -CONFIG_NETFILTER_XTABLES=y - -# -# Xtables combined modules -# -CONFIG_NETFILTER_XT_MARK=y -CONFIG_NETFILTER_XT_CONNMARK=m -# CONFIG_NETFILTER_XT_SET is not set - -# -# Xtables targets -# +CONFIG_NFT_CT=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_QUEUE=m +CONFIG_NFT_REJECT=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +CONFIG_NETFILTER_XTABLES_COMPAT=y +CONFIG_NETFILTER_XT_SET=m CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m CONFIG_NETFILTER_XT_TARGET_CONNMARK=m -# CONFIG_NETFILTER_XT_TARGET_CT is not set CONFIG_NETFILTER_XT_TARGET_DSCP=m -CONFIG_NETFILTER_XT_TARGET_HL=m CONFIG_NETFILTER_XT_TARGET_HMARK=m CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m CONFIG_NETFILTER_XT_TARGET_LED=m CONFIG_NETFILTER_XT_TARGET_LOG=m CONFIG_NETFILTER_XT_TARGET_MARK=m -CONFIG_NETFILTER_XT_NAT=m -CONFIG_NETFILTER_XT_TARGET_NETMAP=m CONFIG_NETFILTER_XT_TARGET_NFLOG=m CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m -# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set -CONFIG_NETFILTER_XT_TARGET_RATEEST=m -CONFIG_NETFILTER_XT_TARGET_REDIRECT=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m CONFIG_NETFILTER_XT_TARGET_TEE=m CONFIG_NETFILTER_XT_TARGET_TPROXY=m -# CONFIG_NETFILTER_XT_TARGET_TRACE is not set -# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set +CONFIG_NETFILTER_XT_TARGET_TRACE=m CONFIG_NETFILTER_XT_TARGET_TCPMSS=m CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m - -# -# Xtables matches -# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m CONFIG_NETFILTER_XT_MATCH_BPF=m CONFIG_NETFILTER_XT_MATCH_CGROUP=m @@ -1056,14 +195,12 @@ CONFIG_NETFILTER_XT_MATCH_CPU=m CONFIG_NETFILTER_XT_MATCH_DCCP=m CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m CONFIG_NETFILTER_XT_MATCH_DSCP=m -CONFIG_NETFILTER_XT_MATCH_ECN=m CONFIG_NETFILTER_XT_MATCH_ESP=m CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m CONFIG_NETFILTER_XT_MATCH_HELPER=m -CONFIG_NETFILTER_XT_MATCH_HL=m CONFIG_NETFILTER_XT_MATCH_IPCOMP=m CONFIG_NETFILTER_XT_MATCH_IPRANGE=m -# CONFIG_NETFILTER_XT_MATCH_IPVS is not set +CONFIG_NETFILTER_XT_MATCH_IPVS=m CONFIG_NETFILTER_XT_MATCH_L2TP=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NETFILTER_XT_MATCH_LIMIT=m @@ -1074,11 +211,9 @@ CONFIG_NETFILTER_XT_MATCH_NFACCT=m CONFIG_NETFILTER_XT_MATCH_OSF=m CONFIG_NETFILTER_XT_MATCH_OWNER=m CONFIG_NETFILTER_XT_MATCH_POLICY=m -# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m CONFIG_NETFILTER_XT_MATCH_QUOTA=m -CONFIG_NETFILTER_XT_MATCH_QUOTA2=m -# CONFIG_NETFILTER_XT_MATCH_QUOTA2_LOG is not set CONFIG_NETFILTER_XT_MATCH_RATEEST=m CONFIG_NETFILTER_XT_MATCH_REALM=m CONFIG_NETFILTER_XT_MATCH_RECENT=m @@ -1090,94 +225,49 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m CONFIG_NETFILTER_XT_MATCH_TCPMSS=m CONFIG_NETFILTER_XT_MATCH_TIME=m CONFIG_NETFILTER_XT_MATCH_U32=m -CONFIG_IP_SET=m -CONFIG_IP_SET_MAX=256 -# CONFIG_IP_SET_BITMAP_IP is not set -# CONFIG_IP_SET_BITMAP_IPMAC is not set -# CONFIG_IP_SET_BITMAP_PORT is not set -# CONFIG_IP_SET_HASH_IP is not set -# CONFIG_IP_SET_HASH_IPMARK is not set -# CONFIG_IP_SET_HASH_IPPORT is not set -# CONFIG_IP_SET_HASH_IPPORTIP is not set -# CONFIG_IP_SET_HASH_IPPORTNET is not set -# CONFIG_IP_SET_HASH_IPMAC is not set -# CONFIG_IP_SET_HASH_MAC is not set -# CONFIG_IP_SET_HASH_NETPORTNET is not set -# CONFIG_IP_SET_HASH_NET is not set -# CONFIG_IP_SET_HASH_NETNET is not set -# CONFIG_IP_SET_HASH_NETPORT is not set -# CONFIG_IP_SET_HASH_NETIFACE is not set -# CONFIG_IP_SET_LIST_SET is not set +CONFIG_IP_SET=y +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m CONFIG_IP_VS=m -# CONFIG_IP_VS_IPV6 is not set -# CONFIG_IP_VS_DEBUG is not set -CONFIG_IP_VS_TAB_BITS=12 - -# -# IPVS transport protocol load balancing support -# -# CONFIG_IP_VS_PROTO_TCP is not set -# CONFIG_IP_VS_PROTO_UDP is not set -# CONFIG_IP_VS_PROTO_ESP is not set -# CONFIG_IP_VS_PROTO_AH is not set -# CONFIG_IP_VS_PROTO_SCTP is not set - -# -# IPVS scheduler -# -# CONFIG_IP_VS_RR is not set -# CONFIG_IP_VS_WRR is not set -# CONFIG_IP_VS_LC is not set -# CONFIG_IP_VS_WLC is not set -# CONFIG_IP_VS_FO is not set -# CONFIG_IP_VS_OVF is not set -# CONFIG_IP_VS_LBLC is not set -# CONFIG_IP_VS_LBLCR is not set -# CONFIG_IP_VS_DH is not set -# CONFIG_IP_VS_SH is not set -# CONFIG_IP_VS_MH is not set -# CONFIG_IP_VS_SED is not set -# CONFIG_IP_VS_NQ is not set - -# -# IPVS SH scheduler -# -CONFIG_IP_VS_SH_TAB_BITS=8 - -# -# IPVS MH scheduler -# -CONFIG_IP_VS_MH_TAB_INDEX=12 - -# -# IPVS application helper -# -# CONFIG_IP_VS_NFCT is not set - -# -# IP: Netfilter Configuration -# -CONFIG_NF_DEFRAG_IPV4=m -CONFIG_NF_SOCKET_IPV4=m -CONFIG_NF_TPROXY_IPV4=m -# CONFIG_NF_TABLES_IPV4 is not set -# CONFIG_NF_TABLES_ARP is not set -CONFIG_NF_DUP_IPV4=m -# CONFIG_NF_LOG_ARP is not set +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m +CONFIG_IP_VS_NFCT=y +CONFIG_NF_LOG_ARP=m CONFIG_NF_LOG_IPV4=m -CONFIG_NF_REJECT_IPV4=m -CONFIG_NF_NAT_IPV4=m -CONFIG_NF_NAT_MASQUERADE_IPV4=y -CONFIG_NF_NAT_SNMP_BASIC=m -CONFIG_NF_NAT_PROTO_GRE=m -CONFIG_NF_NAT_PPTP=m -CONFIG_NF_NAT_H323=m -CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_RPFILTER=m CONFIG_IP_NF_MATCH_TTL=m -CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_SYNPROXY=m CONFIG_IP_NF_NAT=m @@ -1185,714 +275,158 @@ CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m -CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_TTL=m CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=y CONFIG_IP_NF_ARPTABLES=m -# CONFIG_IP_NF_ARPFILTER is not set -# CONFIG_IP_NF_ARP_MANGLE is not set - -# -# IPv6: Netfilter Configuration -# -CONFIG_NF_SOCKET_IPV6=m -CONFIG_NF_TPROXY_IPV6=m -# CONFIG_NF_TABLES_IPV6 is not set -CONFIG_NF_DUP_IPV6=m -CONFIG_NF_REJECT_IPV6=m -CONFIG_NF_LOG_IPV6=m -CONFIG_NF_NAT_IPV6=m -CONFIG_IP6_NF_IPTABLES=m -# CONFIG_IP6_NF_MATCH_AH is not set -# CONFIG_IP6_NF_MATCH_EUI64 is not set -# CONFIG_IP6_NF_MATCH_FRAG is not set -# CONFIG_IP6_NF_MATCH_OPTS is not set -# CONFIG_IP6_NF_MATCH_HL is not set -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -# CONFIG_IP6_NF_MATCH_MH is not set -# CONFIG_IP6_NF_MATCH_RT is not set -# CONFIG_IP6_NF_MATCH_SRH is not set -# CONFIG_IP6_NF_FILTER is not set -# CONFIG_IP6_NF_TARGET_SYNPROXY is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_RAW is not set -# CONFIG_IP6_NF_NAT is not set -CONFIG_NF_DEFRAG_IPV6=m -# CONFIG_NF_TABLES_BRIDGE is not set -# CONFIG_BRIDGE_NF_EBTABLES is not set -# CONFIG_BPFILTER is not set -# CONFIG_IP_DCCP is not set -# CONFIG_IP_SCTP is not set -# CONFIG_RDS is not set -# CONFIG_TIPC is not set -# CONFIG_ATM is not set -# CONFIG_L2TP is not set -CONFIG_STP=m -CONFIG_BRIDGE=m -CONFIG_BRIDGE_IGMP_SNOOPING=y -CONFIG_HAVE_NET_DSA=y -# CONFIG_NET_DSA is not set -# CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set -CONFIG_LLC=m -# CONFIG_LLC2 is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_PHONET is not set -# CONFIG_6LOWPAN is not set -# CONFIG_IEEE802154 is not set -# CONFIG_NET_SCHED is not set -# CONFIG_DCB is not set -# CONFIG_DNS_RESOLVER is not set -# CONFIG_BATMAN_ADV is not set -# CONFIG_OPENVSWITCH is not set -# CONFIG_VSOCKETS is not set -# CONFIG_NETLINK_DIAG is not set -# CONFIG_MPLS is not set -# CONFIG_NET_NSH is not set -# CONFIG_HSR is not set -# CONFIG_NET_SWITCHDEV is not set -# CONFIG_NET_L3_MASTER_DEV is not set -# CONFIG_NET_NCSI is not set -CONFIG_RPS=y -CONFIG_RFS_ACCEL=y -CONFIG_XPS=y -# CONFIG_CGROUP_NET_PRIO is not set -CONFIG_CGROUP_NET_CLASSID=y -CONFIG_NET_RX_BUSY_POLL=y -CONFIG_BQL=y -# CONFIG_BPF_JIT is not set -CONFIG_NET_FLOW_LIMIT=y - -# -# Network testing -# -# CONFIG_NET_PKTGEN is not set -# CONFIG_NET_DROP_MONITOR is not set -# CONFIG_HAMRADIO is not set +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_NF_TABLES_BRIDGE=m +CONFIG_NFT_BRIDGE_META=m +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_NFLOG=m +CONFIG_BRIDGE=y +CONFIG_VLAN_8021Q=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_CODEL=y +CONFIG_NET_SCH_FQ_CODEL=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_CGROUP=y +CONFIG_DNS_RESOLVER=y +CONFIG_OPENVSWITCH=m +CONFIG_CGROUP_NET_PRIO=y CONFIG_CAN=y -CONFIG_CAN_RAW=y -CONFIG_CAN_BCM=y -CONFIG_CAN_GW=y - -# -# CAN Device Drivers -# -# CONFIG_CAN_VCAN is not set -# CONFIG_CAN_VXCAN is not set -# CONFIG_CAN_SLCAN is not set -CONFIG_CAN_DEV=y -CONFIG_CAN_CALC_BITTIMING=y -# CONFIG_CAN_GRCAN is not set -# CONFIG_CAN_XILINXCAN is not set -# CONFIG_CAN_C_CAN is not set -# CONFIG_CAN_CC770 is not set -# CONFIG_CAN_IFI_CANFD is not set -# CONFIG_CAN_M_CAN is not set -# CONFIG_CAN_PEAK_PCIEFD is not set -CONFIG_CAN_ROCKCHIP=y -CONFIG_CANFD_ROCKCHIP=y -# CONFIG_CAN_SJA1000 is not set -# CONFIG_CAN_SOFTING is not set - -# -# CAN SPI interfaces -# -# CONFIG_CAN_HI311X is not set -# CONFIG_CAN_MCP251X is not set - -# -# CAN USB interfaces -# -# CONFIG_CAN_8DEV_USB is not set -# CONFIG_CAN_EMS_USB is not set -# CONFIG_CAN_ESD_USB2 is not set -# CONFIG_CAN_GS_USB is not set -# CONFIG_CAN_KVASER_USB is not set -# CONFIG_CAN_MCBA_USB is not set -# CONFIG_CAN_PEAK_USB is not set -# CONFIG_CAN_UCAN is not set -# CONFIG_CAN_DEBUG_DEVICES is not set -CONFIG_BT=y -CONFIG_BT_BREDR=y +CONFIG_BT=m CONFIG_BT_RFCOMM=y -# CONFIG_BT_RFCOMM_TTY is not set -# CONFIG_BT_BNEP is not set CONFIG_BT_HIDP=y CONFIG_BT_HS=y -CONFIG_BT_LE=y -# CONFIG_BT_LEDS is not set -# CONFIG_BT_SELFTEST is not set -CONFIG_BT_DEBUGFS=y - -# -# Bluetooth device drivers -# -CONFIG_BT_INTEL=y -CONFIG_BT_BCM=y -CONFIG_BT_RTL=y -CONFIG_BT_HCIBTUSB=y -# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set -CONFIG_BT_HCIBTUSB_BCM=y -CONFIG_BT_HCIBTUSB_RTL=y -# CONFIG_BT_HCIBTSDIO is not set -CONFIG_BT_HCIUART=y -CONFIG_BT_HCIUART_SERDEV=y -CONFIG_BT_HCIUART_H4=y -# CONFIG_BT_HCIUART_NOKIA is not set -# CONFIG_BT_HCIUART_BCSP is not set +CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_ATH3K=y -# CONFIG_BT_HCIUART_LL is not set -CONFIG_BT_HCIUART_3WIRE=y -# CONFIG_BT_HCIUART_INTEL is not set -CONFIG_BT_HCIUART_BCM=y -# CONFIG_BT_HCIUART_QCA is not set -# CONFIG_BT_HCIUART_AG6XX is not set -# CONFIG_BT_HCIUART_MRVL is not set -# CONFIG_BT_HCIBCM203X is not set -# CONFIG_BT_HCIBPA10X is not set -CONFIG_BT_HCIBFUSB=y -CONFIG_BT_HCIVHCI=y -CONFIG_BT_MRVL=y -CONFIG_BT_MRVL_SDIO=y -# CONFIG_BT_ATH3K is not set -# CONFIG_BT_MTKUART is not set -# CONFIG_AF_RXRPC is not set -# CONFIG_AF_KCM is not set -CONFIG_FIB_RULES=y -CONFIG_WIRELESS=y -CONFIG_WIRELESS_EXT=y -CONFIG_WEXT_CORE=y -CONFIG_WEXT_PROC=y -CONFIG_WEXT_PRIV=y -CONFIG_CFG80211=y -CONFIG_NL80211_TESTMODE=y -# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set -# CONFIG_CFG80211_CERTIFICATION_ONUS is not set -CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y -CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y -CONFIG_CFG80211_DEFAULT_PS=y -CONFIG_CFG80211_DEBUGFS=y -CONFIG_CFG80211_CRDA_SUPPORT=y -CONFIG_CFG80211_WEXT=y -CONFIG_MAC80211=y -CONFIG_MAC80211_HAS_RC=y -CONFIG_MAC80211_RC_MINSTREL=y -CONFIG_MAC80211_RC_MINSTREL_HT=y -# CONFIG_MAC80211_RC_MINSTREL_VHT is not set -CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y -CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" -# CONFIG_MAC80211_MESH is not set -CONFIG_MAC80211_LEDS=y -CONFIG_MAC80211_DEBUGFS=y -# CONFIG_MAC80211_MESSAGE_TRACING is not set -CONFIG_MAC80211_DEBUG_MENU=y -# CONFIG_MAC80211_NOINLINE is not set -CONFIG_MAC80211_VERBOSE_DEBUG=y -# CONFIG_MAC80211_MLME_DEBUG is not set -# CONFIG_MAC80211_STA_DEBUG is not set -# CONFIG_MAC80211_HT_DEBUG is not set -# CONFIG_MAC80211_OCB_DEBUG is not set -# CONFIG_MAC80211_IBSS_DEBUG is not set -# CONFIG_MAC80211_PS_DEBUG is not set -# CONFIG_MAC80211_TDLS_DEBUG is not set -# CONFIG_MAC80211_DEBUG_COUNTERS is not set -CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 -# CONFIG_WIMAX is not set -CONFIG_RFKILL=y -CONFIG_RFKILL_LEDS=y -# CONFIG_RFKILL_INPUT is not set -# CONFIG_RFKILL_GPIO is not set -CONFIG_RFKILL_RK=y -# CONFIG_NET_9P is not set -# CONFIG_CAIF is not set -# CONFIG_CEPH_LIB is not set -# CONFIG_NFC is not set -# CONFIG_PSAMPLE is not set -# CONFIG_NET_IFE is not set -CONFIG_LWTUNNEL=y -CONFIG_LWTUNNEL_BPF=y -CONFIG_DST_CACHE=y -CONFIG_GRO_CELLS=y -# CONFIG_NET_DEVLINK is not set -CONFIG_MAY_USE_DEVLINK=y -# CONFIG_FAILOVER is not set -CONFIG_HAVE_EBPF_JIT=y - -# -# Device Drivers -# -CONFIG_ARM_AMBA=y - -# -# Generic Driver Options -# +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIVHCI=m +CONFIG_BT_MRVL=m +CONFIG_BT_MRVL_SDIO=m +CONFIG_CFG80211=m +# CONFIG_CFG80211_DEFAULT_PS is not set +# CONFIG_CFG80211_CRDA_SUPPORT is not set +CONFIG_MAC80211=m +CONFIG_MAC80211_MESH=y +CONFIG_RFKILL=m +CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=m +# CONFIG_ETHTOOL_NETLINK is not set +CONFIG_PCI=y +CONFIG_PCIEPORTBUS=y +CONFIG_PCIEAER=y +CONFIG_PCIE_ROCKCHIP_HOST=y +CONFIG_PCIE_ROCKCHIP_DW_HOST=y CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y -CONFIG_STANDALONE=y -CONFIG_PREVENT_FIRMWARE_BUILD=y - -# -# Firmware loader -# -CONFIG_FW_LOADER=y -CONFIG_EXTRA_FIRMWARE="" -# CONFIG_FW_LOADER_USER_HELPER is not set -CONFIG_FW_CACHE=y -CONFIG_WANT_DEV_COREDUMP=y -CONFIG_ALLOW_DEV_COREDUMP=y -CONFIG_DEV_COREDUMP=y -# CONFIG_DEBUG_DRIVER is not set +CONFIG_DEVTMPFS_SAFE=y +CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +# CONFIG_ALLOW_DEV_COREDUMP is not set CONFIG_DEBUG_DEVRES=y -# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set -# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_REGMAP=y -CONFIG_REGMAP_I2C=y -CONFIG_REGMAP_SPI=y -CONFIG_REGMAP_MMIO=y -CONFIG_REGMAP_IRQ=y -# CONFIG_MALI_MEMORY_GROUP_MANAGER is not set -CONFIG_DMA_SHARED_BUFFER=y -# CONFIG_DMA_FENCE_TRACE is not set -CONFIG_DMA_CMA=y - -# -# Default contiguous memory area size: -# -CONFIG_CMA_SIZE_MBYTES=16 -CONFIG_CMA_SIZE_SEL_MBYTES=y -# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set -# CONFIG_CMA_SIZE_SEL_MIN is not set -# CONFIG_CMA_SIZE_SEL_MAX is not set -CONFIG_CMA_ALIGNMENT=8 -CONFIG_GENERIC_ARCH_TOPOLOGY=y - -# -# Bus devices -# -# CONFIG_BRCMSTB_GISB_ARB is not set -# CONFIG_SIMPLE_PM_BUS is not set -# CONFIG_VEXPRESS_CONFIG is not set CONFIG_CONNECTOR=y -CONFIG_PROC_EVENTS=y -# CONFIG_GNSS is not set +CONFIG_ARM_SCMI_PROTOCOL=y +CONFIG_ARM_SCMI_POWER_CONTROL=y +CONFIG_ARM_SCPI_PROTOCOL=y +CONFIG_ARM_FFA_TRANSPORT=y CONFIG_MTD=y -# CONFIG_MTD_TESTS is not set -# CONFIG_MTD_REDBOOT_PARTS is not set -CONFIG_MTD_CMDLINE_PARTS=y -# CONFIG_MTD_AFS_PARTS is not set -CONFIG_MTD_OF_PARTS=y -# CONFIG_MTD_AR7_PARTS is not set - -# -# Partition parsers -# - -# -# User Modules And Translation Layers -# -CONFIG_MTD_BLKDEVS=y CONFIG_MTD_BLOCK=y -# CONFIG_FTL is not set -# CONFIG_NFTL is not set -# CONFIG_INFTL is not set -# CONFIG_RFD_FTL is not set -# CONFIG_SSFDC is not set -# CONFIG_SM_FTL is not set -# CONFIG_MTD_OOPS is not set -# CONFIG_MTD_SWAP is not set -# CONFIG_MTD_PARTITIONED_MASTER is not set - -# -# RAM/ROM/Flash chip drivers -# -# CONFIG_MTD_CFI is not set -# CONFIG_MTD_JEDECPROBE is not set -CONFIG_MTD_MAP_BANK_WIDTH_1=y -CONFIG_MTD_MAP_BANK_WIDTH_2=y -CONFIG_MTD_MAP_BANK_WIDTH_4=y -CONFIG_MTD_CFI_I1=y -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_ROM is not set -# CONFIG_MTD_ABSENT is not set - -# -# Mapping drivers for chip access -# -# CONFIG_MTD_COMPLEX_MAPPINGS is not set -# CONFIG_MTD_INTEL_VR_NOR is not set -# CONFIG_MTD_PLATRAM is not set - -# -# Self-contained MTD device drivers -# -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_DATAFLASH is not set -# CONFIG_MTD_MCHP23K256 is not set -# CONFIG_MTD_SST25L is not set -# CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_PHRAM is not set -# CONFIG_MTD_MTDRAM is not set -# CONFIG_MTD_BLOCK2MTD is not set - -# -# Disk-On-Chip Device Drivers -# -# CONFIG_MTD_DOCG3 is not set -# CONFIG_MTD_ONENAND is not set -# CONFIG_MTD_NAND is not set -# CONFIG_MTD_SPI_NAND is not set - -# -# LPDDR & LPDDR2 PCM memory drivers -# -# CONFIG_MTD_LPDDR is not set -# CONFIG_MTD_SPI_NOR is not set -CONFIG_MTD_UBI=y -CONFIG_MTD_UBI_WL_THRESHOLD=4096 -CONFIG_MTD_UBI_BEB_LIMIT=20 -# CONFIG_MTD_UBI_FASTMAP is not set -# CONFIG_MTD_UBI_GLUEBI is not set -# CONFIG_MTD_UBI_BLOCK is not set -CONFIG_DTC=y -CONFIG_OF=y -CONFIG_DTC_SYMBOLS=y -# CONFIG_DTC_OMIT_DISABLED is not set -# CONFIG_DTC_OMIT_EMPTY is not set -# CONFIG_OF_UNITTEST is not set -CONFIG_OF_FLATTREE=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_KOBJ=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_IRQ=y -CONFIG_OF_NET=y -CONFIG_OF_MDIO=y -CONFIG_OF_RESERVED_MEM=y -# CONFIG_OF_OVERLAY is not set -# CONFIG_PARPORT is not set -CONFIG_BLK_DEV=y -# CONFIG_BLK_DEV_NULL_BLK is not set -CONFIG_CDROM=y -# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +CONFIG_MTD_SPI_NOR=y +CONFIG_OF_OVERLAY=y CONFIG_ZRAM=y -# CONFIG_ZRAM_WRITEBACK is not set -# CONFIG_ZRAM_MEMORY_TRACKING is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_CRYPTOLOOP is not set -# CONFIG_BLK_DEV_DRBD is not set -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SX8 is not set +CONFIG_BLK_DEV_DRBD=m +CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 -CONFIG_BLK_DEV_RAM_SIZE=4096 -# CONFIG_CDROM_PKTCDVD is not set -# CONFIG_ATA_OVER_ETH is not set -# CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set - -# -# NVME Support -# -CONFIG_NVME_CORE=y -CONFIG_BLK_DEV_NVME=y -# CONFIG_NVME_MULTIPATH is not set -# CONFIG_NVME_FC is not set -# CONFIG_NVME_TARGET is not set - -# -# Misc devices -# -# CONFIG_ROCKCHIP_SCR is not set -# CONFIG_AD525X_DPOT is not set -# CONFIG_DUMMY_IRQ is not set -# CONFIG_PHANTOM is not set -# CONFIG_SGI_IOC4 is not set -# CONFIG_TIFM_CORE is not set -# CONFIG_ICS932S401 is not set -# CONFIG_ENCLOSURE_SERVICES is not set -# CONFIG_HP_ILO is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_DS1682 is not set -# CONFIG_USB_SWITCH_FSA9480 is not set -# CONFIG_LATTICE_ECP3_CONFIG is not set +CONFIG_ATA_OVER_ETH=m +CONFIG_BLK_DEV_RBD=m +CONFIG_BLK_DEV_NVME=m CONFIG_SRAM=y -# CONFIG_PCI_ENDPOINT_TEST is not set -# CONFIG_PIR_ASCHIP is not set -# CONFIG_C2PORT is not set - -# -# EEPROM support -# -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_AT25 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set -# CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_93XX46 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_CB710_CORE is not set - -# -# Texas Instruments shared transport line discipline -# -# CONFIG_TI_ST is not set -# CONFIG_SENSORS_LIS3_SPI is not set -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_ALTERA_STAPL is not set - -# -# Intel MIC & related support -# - -# -# Intel MIC Bus Driver -# - -# -# SCIF Bus Driver -# - -# -# VOP Bus Driver -# - -# -# Intel MIC Host Driver -# - -# -# Intel MIC Card Driver -# - -# -# SCIF Driver -# - -# -# Intel MIC Coprocessor State Management (COSM) Drivers -# - -# -# VOP Driver -# -# CONFIG_GENWQE is not set -# CONFIG_ECHO is not set -# CONFIG_MISC_RTSX_PCI is not set -# CONFIG_MISC_RTSX_USB is not set - -# -# SCSI device support -# -CONFIG_SCSI_MOD=y -# CONFIG_RAID_ATTRS is not set -CONFIG_SCSI=y -CONFIG_SCSI_DMA=y -CONFIG_SCSI_MQ_DEFAULT=y -CONFIG_SCSI_PROC_FS=y - -# -# SCSI support type (disk, tape, CD-ROM) -# +CONFIG_EEPROM_93CX6=y CONFIG_BLK_DEV_SD=y -# CONFIG_CHR_DEV_ST is not set -# CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y -# CONFIG_CHR_DEV_SG is not set -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_LOGGING is not set CONFIG_SCSI_SCAN_ASYNC=y - -# -# SCSI Transports -# CONFIG_SCSI_SPI_ATTRS=y -# CONFIG_SCSI_FC_ATTRS is not set -# CONFIG_SCSI_ISCSI_ATTRS is not set -# CONFIG_SCSI_SAS_ATTRS is not set -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SRP_ATTRS is not set -CONFIG_SCSI_LOWLEVEL=y -# CONFIG_ISCSI_TCP is not set -# CONFIG_ISCSI_BOOT_SYSFS is not set -# CONFIG_SCSI_CXGB3_ISCSI is not set -# CONFIG_SCSI_CXGB4_ISCSI is not set -# CONFIG_SCSI_BNX2_ISCSI is not set -# CONFIG_BE2ISCSI is not set -# CONFIG_BLK_DEV_3W_XXXX_RAID is not set -# CONFIG_SCSI_HPSA is not set -# CONFIG_SCSI_3W_9XXX is not set -# CONFIG_SCSI_3W_SAS is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_AACRAID is not set -# CONFIG_SCSI_AIC7XXX is not set -# CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_AIC94XX is not set -# CONFIG_SCSI_HISI_SAS is not set -# CONFIG_SCSI_MVSAS is not set -# CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_ADVANSYS is not set -# CONFIG_SCSI_ARCMSR is not set -# CONFIG_SCSI_ESAS2R is not set -# CONFIG_MEGARAID_NEWGEN is not set -# CONFIG_MEGARAID_LEGACY is not set -# CONFIG_MEGARAID_SAS is not set -# CONFIG_SCSI_MPT3SAS is not set -# CONFIG_SCSI_MPT2SAS is not set -# CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_UFSHCD is not set -# CONFIG_SCSI_HPTIOP is not set -# CONFIG_SCSI_SNIC is not set -# CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_IPS is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_STEX is not set -# CONFIG_SCSI_SYM53C8XX_2 is not set -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_QLOGIC_1280 is not set -# CONFIG_SCSI_QLA_ISCSI is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_AM53C974 is not set -# CONFIG_SCSI_WD719X is not set -# CONFIG_SCSI_DEBUG is not set -# CONFIG_SCSI_PMCRAID is not set -# CONFIG_SCSI_PM8001 is not set -# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set -# CONFIG_SCSI_DH is not set -# CONFIG_SCSI_OSD_INITIATOR is not set -CONFIG_HAVE_PATA_PLATFORM=y +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_MPT2SAS=m CONFIG_ATA=y -CONFIG_ATA_VERBOSE_ERROR=y -CONFIG_SATA_PMP=y - -# -# Controllers with non-SFF native interface -# CONFIG_SATA_AHCI=y -CONFIG_SATA_MOBILE_LPM_POLICY=0 CONFIG_SATA_AHCI_PLATFORM=y -# CONFIG_AHCI_CEVA is not set -# CONFIG_AHCI_QORIQ is not set -# CONFIG_SATA_INIC162X is not set -# CONFIG_SATA_ACARD_AHCI is not set -# CONFIG_SATA_SIL24 is not set -# CONFIG_ATA_SFF is not set +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SIL=m CONFIG_MD=y -# CONFIG_BLK_DEV_MD is not set -# CONFIG_BCACHE is not set -# CONFIG_BLK_DEV_DM is not set -# CONFIG_TARGET_CORE is not set -# CONFIG_FUSION is not set - -# -# IEEE 1394 (FireWire) support -# -# CONFIG_FIREWIRE is not set -# CONFIG_FIREWIRE_NOSY is not set +CONFIG_MD_LINEAR=m +CONFIG_BCACHE=m +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=m +CONFIG_DM_RAID=y CONFIG_NETDEVICES=y -CONFIG_MII=y -CONFIG_NET_CORE=y -# CONFIG_BONDING is not set -# CONFIG_DUMMY is not set -# CONFIG_WIREGUARD is not set -# CONFIG_EQUALIZER is not set -# CONFIG_NET_FC is not set -# CONFIG_NET_TEAM is not set -# CONFIG_MACVLAN is not set -# CONFIG_IPVLAN is not set -# CONFIG_VXLAN is not set -# CONFIG_GENEVE is not set -# CONFIG_GTP is not set -# CONFIG_MACSEC is not set -# CONFIG_NETCONSOLE is not set -CONFIG_TUN=y -# CONFIG_TUN_VNET_CROSS_LE is not set -# CONFIG_VETH is not set -# CONFIG_NLMON is not set -# CONFIG_ARCNET is not set - -# -# CAIF transport drivers -# - -# -# Distributed Switch Architecture drivers -# -CONFIG_ETHERNET=y +CONFIG_WIREGUARD=y +CONFIG_MACVLAN=y +CONFIG_IPVLAN=y +CONFIG_VXLAN=m +CONFIG_TUN=m +CONFIG_VETH=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_AGERE is not set -CONFIG_NET_VENDOR_ALACRITECH=y -# CONFIG_SLICOSS is not set # CONFIG_NET_VENDOR_ALTEON is not set -# CONFIG_ALTERA_TSE is not set -CONFIG_NET_VENDOR_AMAZON=y -# CONFIG_ENA_ETHERNET is not set # CONFIG_NET_VENDOR_AMD is not set -CONFIG_NET_VENDOR_AQUANTIA=y # CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_ATHEROS is not set -CONFIG_NET_VENDOR_AURORA=y -# CONFIG_AURORA_NB8800 is not set # CONFIG_NET_VENDOR_BROADCOM is not set -# CONFIG_NET_VENDOR_BROCADE is not set -CONFIG_NET_VENDOR_CADENCE=y -# CONFIG_MACB is not set # CONFIG_NET_VENDOR_CAVIUM is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set -CONFIG_NET_VENDOR_CORTINA=y -# CONFIG_GEMINI_ETHERNET is not set -# CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_EZCHIP is not set # CONFIG_NET_VENDOR_HISILICON is not set -# CONFIG_NET_VENDOR_HP is not set -CONFIG_NET_VENDOR_HUAWEI=y -# CONFIG_HINIC is not set -# CONFIG_NET_VENDOR_INTEL is not set -# CONFIG_JME is not set +CONFIG_E100=y +CONFIG_E1000=y +CONFIG_E1000E=y +CONFIG_IGB=y +CONFIG_IXGBE=y # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set -CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_NET_VENDOR_MYRI is not set -# CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NATSEMI is not set -CONFIG_NET_VENDOR_NETERION=y -# CONFIG_S2IO is not set -# CONFIG_VXGE is not set -CONFIG_NET_VENDOR_NETRONOME=y -# CONFIG_NFP is not set -CONFIG_NET_VENDOR_NI=y # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set -# CONFIG_ETHOC is not set -CONFIG_NET_VENDOR_PACKET_ENGINES=y -# CONFIG_HAMACHI is not set -# CONFIG_YELLOWFIN is not set # CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_VENDOR_QUALCOMM is not set # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_REALTEK is not set @@ -1900,4317 +434,680 @@ CONFIG_NET_VENDOR_PACKET_ENGINES=y # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -CONFIG_NET_VENDOR_SOLARFLARE=y -# CONFIG_SFC is not set -# CONFIG_SFC_FALCON is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_NET_VENDOR_SMSC is not set -CONFIG_NET_VENDOR_SOCIONEXT=y -CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=y -CONFIG_STMMAC_PLATFORM=y -# CONFIG_DWMAC_DWC_QOS_ETH is not set -CONFIG_DWMAC_GENERIC=y -CONFIG_DWMAC_ROCKCHIP=y -# CONFIG_STMMAC_PCI is not set # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -CONFIG_MDIO_DEVICE=y -CONFIG_MDIO_BUS=y -# CONFIG_MDIO_BCM_UNIMAC is not set -# CONFIG_MDIO_BITBANG is not set -# CONFIG_MDIO_BUS_MUX_GPIO is not set -# CONFIG_MDIO_BUS_MUX_MMIOREG is not set -# CONFIG_MDIO_HISI_FEMAC is not set -# CONFIG_MDIO_MSCC_MIIM is not set -# CONFIG_MDIO_OCTEON is not set -# CONFIG_MDIO_THUNDER is not set -CONFIG_PHYLIB=y -CONFIG_SWPHY=y -# CONFIG_LED_TRIGGER_PHY is not set - -# -# MII PHY device drivers -# -# CONFIG_AMD_PHY is not set -# CONFIG_AQUANTIA_PHY is not set -# CONFIG_AX88796B_PHY is not set -# CONFIG_AT803X_PHY is not set -# CONFIG_BCM7XXX_PHY is not set -# CONFIG_BCM87XX_PHY is not set -# CONFIG_BROADCOM_PHY is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_CORTINA_PHY is not set -# CONFIG_DAVICOM_PHY is not set -# CONFIG_DP83822_PHY is not set -# CONFIG_DP83TC811_PHY is not set -# CONFIG_DP83848_PHY is not set -# CONFIG_DP83867_PHY is not set -CONFIG_FIXED_PHY=y -# CONFIG_ICPLUS_PHY is not set -# CONFIG_INTEL_XWAY_PHY is not set -# CONFIG_LSI_ET1011C_PHY is not set -# CONFIG_LXT_PHY is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_MARVELL_10G_PHY is not set -# CONFIG_MICREL_PHY is not set -# CONFIG_MICROCHIP_PHY is not set -# CONFIG_MICROCHIP_T1_PHY is not set -# CONFIG_MICROSEMI_PHY is not set -# CONFIG_NATIONAL_PHY is not set -# CONFIG_QSEMI_PHY is not set -# CONFIG_REALTEK_PHY is not set -# CONFIG_RENESAS_PHY is not set CONFIG_ROCKCHIP_PHY=y -# CONFIG_SMSC_PHY is not set -# CONFIG_STE10XP is not set -# CONFIG_TERANETICS_PHY is not set -# CONFIG_VITESSE_PHY is not set -# CONFIG_XILINX_GMII2RGMII is not set -# CONFIG_MICREL_KS8995MA is not set -# CONFIG_PPP is not set -# CONFIG_SLIP is not set -CONFIG_USB_NET_DRIVERS=y -# CONFIG_USB_CATC is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_PEGASUS is not set +CONFIG_CAN_SJA1000=y +CONFIG_CAN_PLX_PCI=y +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPPOE=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m CONFIG_USB_RTL8150=y CONFIG_USB_RTL8152=y -# CONFIG_USB_LAN78XX is not set CONFIG_USB_USBNET=y -CONFIG_USB_NET_AX8817X=y -CONFIG_USB_NET_AX88179_178A=y -CONFIG_USB_NET_CDCETHER=y -# CONFIG_USB_NET_CDC_EEM is not set -CONFIG_USB_NET_CDC_NCM=y -# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set CONFIG_USB_NET_CDC_MBIM=y -# CONFIG_USB_NET_DM9601 is not set -# CONFIG_USB_NET_SR9700 is not set -# CONFIG_USB_NET_SR9800 is not set -# CONFIG_USB_NET_SMSC75XX is not set -# CONFIG_USB_NET_SMSC95XX is not set -# CONFIG_USB_NET_GL620A is not set # CONFIG_USB_NET_NET1080 is not set -# CONFIG_USB_NET_PLUSB is not set -# CONFIG_USB_NET_MCS7830 is not set CONFIG_USB_NET_RNDIS_HOST=y # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set -# CONFIG_USB_NET_CX82310_ETH is not set -# CONFIG_USB_NET_KALMIA is not set CONFIG_USB_NET_QMI_WWAN=y -# CONFIG_USB_HSO is not set -# CONFIG_USB_NET_INT51X1 is not set -# CONFIG_USB_IPHETH is not set -# CONFIG_USB_SIERRA_NET is not set -# CONFIG_USB_VL600 is not set -# CONFIG_USB_NET_CH9200 is not set -CONFIG_WLAN=y -# CONFIG_WIRELESS_WDS is not set -CONFIG_WLAN_VENDOR_ADMTEK=y -# CONFIG_ADM8211 is not set -CONFIG_WLAN_VENDOR_ATH=y -# CONFIG_ATH_DEBUG is not set -# CONFIG_ATH5K is not set -# CONFIG_ATH5K_PCI is not set -# CONFIG_ATH9K is not set -# CONFIG_ATH9K_HTC is not set -# CONFIG_CARL9170 is not set -# CONFIG_ATH6KL is not set -# CONFIG_AR5523 is not set -# CONFIG_WIL6210 is not set -# CONFIG_ATH10K is not set -# CONFIG_WCN36XX is not set -CONFIG_WLAN_VENDOR_ATMEL=y -# CONFIG_ATMEL is not set -# CONFIG_AT76C50X_USB is not set -CONFIG_WLAN_VENDOR_BROADCOM=y -# CONFIG_B43 is not set -# CONFIG_B43LEGACY is not set -# CONFIG_BRCMSMAC is not set -# CONFIG_BRCMFMAC is not set -CONFIG_WLAN_VENDOR_CISCO=y -CONFIG_WLAN_VENDOR_INTEL=y -# CONFIG_IPW2100 is not set -# CONFIG_IPW2200 is not set -# CONFIG_IWL4965 is not set -# CONFIG_IWL3945 is not set -# CONFIG_IWLWIFI is not set -CONFIG_WLAN_VENDOR_INTERSIL=y -# CONFIG_HOSTAP is not set -# CONFIG_HERMES is not set -# CONFIG_P54_COMMON is not set -# CONFIG_PRISM54 is not set -CONFIG_WLAN_VENDOR_MARVELL=y -# CONFIG_LIBERTAS is not set -CONFIG_LIBERTAS_THINFIRM=y -# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set -# CONFIG_LIBERTAS_THINFIRM_USB is not set +CONFIG_ATH5K=m +CONFIG_ATH9K=m +CONFIG_ATH6KL=m +CONFIG_ATH6KL_USB=m +CONFIG_AR5523=m +CONFIG_ATH10K=m +CONFIG_WCN36XX=m +CONFIG_AT76C50X_USB=m +CONFIG_B43=m +CONFIG_BRCMFMAC=m +# CONFIG_BRCMFMAC_SDIO is not set +CONFIG_BRCMFMAC_USB=y +CONFIG_BRCMFMAC_PCIE=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +CONFIG_LIBERTAS_THINFIRM=m CONFIG_MWIFIEX=m CONFIG_MWIFIEX_SDIO=m -# CONFIG_MWIFIEX_PCIE is not set -# CONFIG_MWIFIEX_USB is not set -# CONFIG_MWL8K is not set -CONFIG_WLAN_VENDOR_MEDIATEK=y -# CONFIG_MT7601U is not set -# CONFIG_MT76x0U is not set -# CONFIG_MT76x2E is not set -# CONFIG_MT76x2U is not set -CONFIG_WLAN_VENDOR_RALINK=y -# CONFIG_RT2X00 is not set -CONFIG_WLAN_VENDOR_REALTEK=y -# CONFIG_RTL8180 is not set -# CONFIG_RTL8187 is not set -CONFIG_RTL_CARDS=y -# CONFIG_RTL8192CE is not set -# CONFIG_RTL8192SE is not set -# CONFIG_RTL8192DE is not set -# CONFIG_RTL8723AE is not set -# CONFIG_RTL8723BE is not set -# CONFIG_RTL8188EE is not set -# CONFIG_RTL8192EE is not set -# CONFIG_RTL8821AE is not set -# CONFIG_RTL8192CU is not set -# CONFIG_RTL8XXXU is not set -CONFIG_WLAN_VENDOR_RSI=y -# CONFIG_RSI_91X is not set -CONFIG_WLAN_VENDOR_ST=y -# CONFIG_CW1200 is not set -CONFIG_WLAN_VENDOR_TI=y -# CONFIG_WL1251 is not set -# CONFIG_WL12XX is not set -# CONFIG_WL18XX is not set -# CONFIG_WLCORE is not set -CONFIG_WLAN_VENDOR_ZYDAS=y -# CONFIG_USB_ZD1201 is not set -# CONFIG_ZD1211RW is not set -CONFIG_WLAN_VENDOR_QUANTENNA=y -# CONFIG_QTNFMAC_PEARL_PCIE is not set -CONFIG_WL_ROCKCHIP=y -CONFIG_WIFI_BUILD_MODULE=y -CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y -# CONFIG_WIFI_GENERATE_RANDOM_MAC_ADDR is not set -CONFIG_BCMDHD=y -CONFIG_AP6XXX=m -CONFIG_AP6XXX_WIFI6=m -# CONFIG_AP6XXX_INDEP_POWER is not set -CONFIG_BCMDHD_FW_PATH="/etc/firmware/fw_bcmdhd.bin" -CONFIG_BCMDHD_NVRAM_PATH="/etc/firmware/nvram.txt" -# CONFIG_BCMDHD_STATIC_IF is not set -CONFIG_RTL_WIRELESS_SOLUTION=y -CONFIG_RTL8188EU=m -CONFIG_RTL8188FU=y -CONFIG_RTL8189FS=m -# CONFIG_RTL8723CS is not set -CONFIG_RTL8723DS=m -CONFIG_RTL8821CS=m -# CONFIG_RTL8822BS is not set -# CONFIG_MVL88W8977 is not set -# CONFIG_CYW_BCMDHD is not set -# CONFIG_MAC80211_HWSIM is not set -CONFIG_USB_NET_RNDIS_WLAN=y -# CONFIG_VIRT_WIFI is not set - -# -# Enable WiMAX (Networking options) to see the WiMAX drivers -# -# CONFIG_WAN is not set -# CONFIG_VMXNET3 is not set -# CONFIG_LTE is not set -# CONFIG_NETDEVSIM is not set -# CONFIG_NET_FAILOVER is not set -# CONFIG_ISDN is not set -# CONFIG_NVM is not set - -# -# Input device support -# -CONFIG_INPUT=y -CONFIG_INPUT_LEDS=y -CONFIG_INPUT_FF_MEMLESS=y -CONFIG_INPUT_POLLDEV=y -# CONFIG_INPUT_SPARSEKMAP is not set +CONFIG_MWIFIEX_USB=m +CONFIG_MT7601U=m +CONFIG_RT2X00=m +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_RTL8192CE=m +CONFIG_RTL8192SE=m +CONFIG_RTL8192DE=m +CONFIG_RTL8723AE=m +CONFIG_RTL8723BE=m +CONFIG_RTL8188EE=m +CONFIG_RTL8192EE=m +CONFIG_RTL8821AE=m +CONFIG_RTL8XXXU=m +CONFIG_RTL8XXXU_UNTESTED=y +CONFIG_RTW88=m +CONFIG_RTW88_8822BE=m +CONFIG_RTW88_8822BU=m +CONFIG_RTW88_8822CE=m +CONFIG_RTW88_8822CU=m +CONFIG_RTW88_8723DE=m +CONFIG_RTW88_8723DS=m +CONFIG_RTW88_8723DU=m +CONFIG_RTW88_8821CE=m +CONFIG_RTW88_8821CS=m +CONFIG_RTW89=m +CONFIG_RTW89_8852AE=m +CONFIG_RTW89_8852CE=m +CONFIG_ZD1211RW=m +CONFIG_ISDN=y CONFIG_INPUT_MATRIXKMAP=y - -# -# Userland interfaces -# -# CONFIG_INPUT_MOUSEDEV is not set CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_EVBUG is not set - -# -# Input Device Drivers -# -CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ADC=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set -# CONFIG_KEYBOARD_ATKBD is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set -# CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_GPIO=y CONFIG_KEYBOARD_GPIO_POLLED=y -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_MATRIX is not set -# CONFIG_KEYBOARD_LM8323 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set -# CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_OPENCORES is not set -# CONFIG_KEYBOARD_SAMSUNG is not set -# CONFIG_KEYBOARD_STOWAWAY is not set -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_OMAP4 is not set -# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set -# CONFIG_KEYBOARD_XTKBD is not set -CONFIG_KEYBOARD_CROS_EC=y -# CONFIG_KEYBOARD_CAP11XX is not set -# CONFIG_KEYBOARD_BCM is not set -CONFIG_INPUT_MOUSE=y # CONFIG_MOUSE_PS2 is not set -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_APPLETOUCH is not set -# CONFIG_MOUSE_BCM5974 is not set -CONFIG_MOUSE_CYAPA=y -CONFIG_MOUSE_ELAN_I2C=y -CONFIG_MOUSE_ELAN_I2C_I2C=y -# CONFIG_MOUSE_ELAN_I2C_SMBUS is not set -# CONFIG_MOUSE_VSXXXAA is not set -# CONFIG_MOUSE_GPIO is not set -# CONFIG_MOUSE_SYNAPTICS_I2C is not set -# CONFIG_MOUSE_SYNAPTICS_USB is not set CONFIG_INPUT_JOYSTICK=y -CONFIG_JOYSTICK_ANALOG=m -CONFIG_JOYSTICK_A3D=m -CONFIG_JOYSTICK_ADI=m -CONFIG_JOYSTICK_COBRA=m -CONFIG_JOYSTICK_GF2K=m -CONFIG_JOYSTICK_GRIP=m -CONFIG_JOYSTICK_GRIP_MP=m -CONFIG_JOYSTICK_GUILLEMOT=m -CONFIG_JOYSTICK_INTERACT=m -CONFIG_JOYSTICK_SIDEWINDER=m -CONFIG_JOYSTICK_TMDC=m -CONFIG_JOYSTICK_IFORCE=m -CONFIG_JOYSTICK_IFORCE_USB=y -CONFIG_JOYSTICK_IFORCE_232=y -CONFIG_JOYSTICK_WARRIOR=m -CONFIG_JOYSTICK_MAGELLAN=m -CONFIG_JOYSTICK_SPACEORB=m -CONFIG_JOYSTICK_SPACEBALL=m -CONFIG_JOYSTICK_STINGER=m -CONFIG_JOYSTICK_TWIDJOY=m -CONFIG_JOYSTICK_ZHENHUA=m -CONFIG_JOYSTICK_AS5011=m -CONFIG_JOYSTICK_JOYDUMP=m +CONFIG_JOYSTICK_ADC=y CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y -CONFIG_JOYSTICK_XPAD_LEDS=y -CONFIG_JOYSTICK_SINGLEADCJOY=y -# CONFIG_JOYSTICK_PSXPAD_SPI is not set -# CONFIG_JOYSTICK_PXRC is not set -# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TABLET=y CONFIG_INPUT_TOUCHSCREEN=y -CONFIG_TOUCHSCREEN_PROPERTIES=y -# CONFIG_TOUCHSCREEN_ADS7846 is not set -# CONFIG_TOUCHSCREEN_AD7877 is not set -# CONFIG_TOUCHSCREEN_AD7879 is not set -# CONFIG_TOUCHSCREEN_ADC is not set -# CONFIG_TOUCHSCREEN_AR1021_I2C is not set -# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set -# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set -# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set -# CONFIG_TOUCHSCREEN_BU21013 is not set -# CONFIG_TOUCHSCREEN_BU21029 is not set -# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set -# CONFIG_TOUCHSCREEN_CY8C40XX is not set -# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set -# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set -# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set -# CONFIG_TOUCHSCREEN_DYNAPRO is not set -# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set -# CONFIG_TOUCHSCREEN_EETI is not set -# CONFIG_TOUCHSCREEN_EGALAX is not set -# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set -# CONFIG_TOUCHSCREEN_EXC3000 is not set -# CONFIG_TOUCHSCREEN_FUJITSU is not set -# CONFIG_TOUCHSCREEN_GOODIX is not set -# CONFIG_TOUCHSCREEN_GSLX6801 is not set -# CONFIG_TOUCHSCREEN_GSLX680A is not set -# CONFIG_TOUCHSCREEN_GSLX680_D708 is not set -# CONFIG_TOUCHSCREEN_GSLX680_PAD is not set -# CONFIG_TOUCHSCREEN_GSLX680_VR is not set -# CONFIG_TOUCHSCREEN_GSLX680_FIREFLY is not set -# CONFIG_TOUCHSCREEN_GSL3673 is not set -# CONFIG_TOUCHSCREEN_GSL3673_800X1280 is not set -# CONFIG_TOUCHSCREEN_GSL3676 is not set -# CONFIG_TOUCHSCREEN_GT9XX is not set -# CONFIG_TOUCHSCREEN_HIDEEP is not set -# CONFIG_TOUCHSCREEN_HYN_CST2XX is not set +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GOODIX=y CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX=y -# CONFIG_TOUCHSCREEN_ILI210X is not set -# CONFIG_TOUCHSCREEN_S6SY761 is not set -# CONFIG_TOUCHSCREEN_GUNZE is not set -# CONFIG_TOUCHSCREEN_EKTF2127 is not set -# CONFIG_TOUCHSCREEN_ELAN is not set -# CONFIG_TOUCHSCREEN_ELO is not set -# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set -# CONFIG_TOUCHSCREEN_WACOM_I2C is not set -# CONFIG_TOUCHSCREEN_WACOM_W9013 is not set -# CONFIG_TOUCHSCREEN_MAX11801 is not set -# CONFIG_TOUCHSCREEN_MCS5000 is not set -# CONFIG_TOUCHSCREEN_MMS114 is not set -# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set -# CONFIG_TOUCHSCREEN_MTOUCH is not set -# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set -# CONFIG_TOUCHSCREEN_INEXIO is not set -# CONFIG_TOUCHSCREEN_MK712 is not set -# CONFIG_TOUCHSCREEN_PENMOUNT is not set -# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set -# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set -# CONFIG_TOUCHSCREEN_TOUCHWIN is not set -# CONFIG_TOUCHSCREEN_PIXCIR is not set -# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=y -CONFIG_TOUCHSCREEN_USB_EGALAX=y -CONFIG_TOUCHSCREEN_USB_PANJIT=y -CONFIG_TOUCHSCREEN_USB_3M=y -CONFIG_TOUCHSCREEN_USB_ITM=y -CONFIG_TOUCHSCREEN_USB_ETURBO=y -CONFIG_TOUCHSCREEN_USB_GUNZE=y -CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y -CONFIG_TOUCHSCREEN_USB_IRTOUCH=y -CONFIG_TOUCHSCREEN_USB_IDEALTEK=y -CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y -CONFIG_TOUCHSCREEN_USB_GOTOP=y -CONFIG_TOUCHSCREEN_USB_JASTEC=y -CONFIG_TOUCHSCREEN_USB_ELO=y -CONFIG_TOUCHSCREEN_USB_E2I=y -CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y -CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y -CONFIG_TOUCHSCREEN_USB_NEXIO=y -CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y -# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set -# CONFIG_TOUCHSCREEN_TSC_SERIO is not set -# CONFIG_TOUCHSCREEN_TSC2004 is not set -# CONFIG_TOUCHSCREEN_TSC2005 is not set -# CONFIG_TOUCHSCREEN_TSC2007 is not set -# CONFIG_TOUCHSCREEN_RM_TS is not set -# CONFIG_TOUCHSCREEN_SILEAD is not set -# CONFIG_TOUCHSCREEN_SIS_I2C is not set -# CONFIG_TOUCHSCREEN_ST1232 is not set -# CONFIG_TOUCHSCREEN_STMFTS is not set -# CONFIG_TOUCHSCREEN_SUR40 is not set -# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set -# CONFIG_TOUCHSCREEN_SX8654 is not set -# CONFIG_TOUCHSCREEN_TPS6507X is not set -# CONFIG_TOUCHSCREEN_ZET6223 is not set -# CONFIG_TOUCHSCREEN_ZFORCE is not set -# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set -# CONFIG_TOUCHSCREEN_VTL_CT36X is not set -CONFIG_TOUCHSCREEN_GT1X=y -# CONFIG_TOUCHSCREEN_FTS is not set -# CONFIG_TOUCHSCREEN_FT5436 is not set -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5=y -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICETREE_SUPPORT=y -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_I2C=y -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_SPI is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MT_A is not set -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MT_B=y -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_BUTTON is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PROXIMITY is not set -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICE_ACCESS=y -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEVICE_ACCESS_API is not set -CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_LOADER=y -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PLATFORM_FW_UPGRADE is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_BINARY_FW_UPGRADE is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_PLATFORM_TTCONFIG_UPGRADE is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_MANUAL_TTCONFIG_UPGRADE is not set -# CONFIG_TOUCHSCREEN_CYPRESS_CYTTSP5_DEBUG_MDL is not set -CONFIG_ROCKCHIP_REMOTECTL=y -CONFIG_ROCKCHIP_REMOTECTL_PWM=y - -# -# handle all sensors -# -CONFIG_SENSOR_DEVICE=y -# CONFIG_ANGLE_DEVICE is not set -CONFIG_GSENSOR_DEVICE=y -# CONFIG_GS_MMA8452 is not set -# CONFIG_STK8BAXX_ACC is not set -# CONFIG_MPU6880_ACC is not set -# CONFIG_MPU6500_ACC is not set -# CONFIG_GS_KXTIK is not set -# CONFIG_GS_KXTJ9 is not set -# CONFIG_GS_LIS3DH is not set -# CONFIG_GS_MMA7660 is not set -CONFIG_GS_MC3230=y -# CONFIG_GS_SC7660 is not set -# CONFIG_GS_SC7A20 is not set -# CONFIG_GS_SC7A30 is not set -# CONFIG_GS_MXC6225 is not set -# CONFIG_GS_MXC6655XA is not set -# CONFIG_GS_DMT10 is not set -# CONFIG_GS_LSM303D is not set -# CONFIG_GS_BMA023 is not set -# CONFIG_LSM330_ACC is not set -# CONFIG_BMA2XX_ACC is not set -# CONFIG_GS_DA223 is not set -# CONFIG_ICM2060X_ACC is not set -# CONFIG_COMPASS_DEVICE is not set -# CONFIG_GYROSCOPE_DEVICE is not set -# CONFIG_LIGHT_DEVICE is not set -# CONFIG_PROXIMITY_DEVICE is not set -# CONFIG_TEMPERATURE_DEVICE is not set -# CONFIG_PRESSURE_DEVICE is not set -# CONFIG_HALL_DEVICE is not set CONFIG_INPUT_MISC=y -# CONFIG_INPUT_AD714X is not set -# CONFIG_INPUT_ATMEL_CAPTOUCH is not set -# CONFIG_INPUT_BMA150 is not set -# CONFIG_INPUT_E3X0_BUTTON is not set -# CONFIG_INPUT_MMA8450 is not set -# CONFIG_INPUT_GP2A is not set -# CONFIG_INPUT_GPIO_BEEPER is not set -# CONFIG_INPUT_GPIO_DECODER is not set -# CONFIG_INPUT_ATI_REMOTE2 is not set -# CONFIG_INPUT_KEYSPAN_REMOTE is not set -# CONFIG_INPUT_KXTJ9 is not set -# CONFIG_INPUT_POWERMATE is not set -# CONFIG_INPUT_YEALINK is not set -# CONFIG_INPUT_CM109 is not set -# CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y -# CONFIG_INPUT_PCF8574 is not set -# CONFIG_INPUT_PWM_BEEPER is not set -# CONFIG_INPUT_PWM_VIBRA is not set +CONFIG_INPUT_PWM_VIBRA=y CONFIG_INPUT_RK805_PWRKEY=y -# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set -# CONFIG_INPUT_ADXL34X is not set -# CONFIG_INPUT_IMS_PCU is not set -# CONFIG_INPUT_CMA3000 is not set -# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set -# CONFIG_INPUT_DRV260X_HAPTICS is not set -# CONFIG_INPUT_DRV2665_HAPTICS is not set -# CONFIG_INPUT_DRV2667_HAPTICS is not set -# CONFIG_RMI4_CORE is not set - -# -# Hardware I/O ports -# -CONFIG_SERIO=m CONFIG_SERIO_SERPORT=m -# CONFIG_SERIO_AMBAKMI is not set -# CONFIG_SERIO_PCIPS2 is not set -# CONFIG_SERIO_LIBPS2 is not set -# CONFIG_SERIO_RAW is not set -# CONFIG_SERIO_ALTERA_PS2 is not set -# CONFIG_SERIO_PS2MULT is not set -# CONFIG_SERIO_ARC_PS2 is not set -# CONFIG_SERIO_APBPS2 is not set -# CONFIG_SERIO_GPIO_PS2 is not set -# CONFIG_USERIO is not set -CONFIG_GAMEPORT=m -# CONFIG_GAMEPORT_NS558 is not set -# CONFIG_GAMEPORT_L4 is not set -# CONFIG_GAMEPORT_EMU10K1 is not set -# CONFIG_GAMEPORT_FM801 is not set - -# -# Character devices -# -CONFIG_TTY=y -CONFIG_VT=y -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_HW_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_UNIX98_PTYS=y +CONFIG_GAMEPORT=y # CONFIG_LEGACY_PTYS is not set -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_NOZOMI is not set -# CONFIG_N_GSM is not set -# CONFIG_TRACE_SINK is not set -CONFIG_LDISC_AUTOLOAD=y -CONFIG_DEVMEM=y - -# -# Serial drivers -# -CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y -# CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_DMA=y # CONFIG_SERIAL_8250_PCI is not set -CONFIG_SERIAL_8250_NR_UARTS=10 -CONFIG_SERIAL_8250_RUNTIME_UARTS=10 -# CONFIG_SERIAL_8250_EXTENDED is not set -# CONFIG_SERIAL_8250_ASPEED_VUART is not set -CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_NR_UARTS=5 +CONFIG_SERIAL_8250_RUNTIME_UARTS=5 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_DW=y -# CONFIG_SERIAL_8250_RT288X is not set -# CONFIG_SERIAL_8250_MOXA is not set CONFIG_SERIAL_OF_PLATFORM=y - -# -# Non-8250 serial port support -# -# CONFIG_SERIAL_AMBA_PL010 is not set -# CONFIG_SERIAL_AMBA_PL011 is not set -# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set -# CONFIG_SERIAL_MAX3100 is not set -# CONFIG_SERIAL_MAX310X is not set -# CONFIG_SERIAL_UARTLITE is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_MSM_GENI_HALF_SAMPLING is not set -# CONFIG_SERIAL_MSM_GENI_EARLY_CONSOLE is not set -# CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SC16IS7XX is not set -# CONFIG_SERIAL_ALTERA_JTAGUART is not set -# CONFIG_SERIAL_ALTERA_UART is not set -# CONFIG_SERIAL_IFX6X60 is not set -# CONFIG_SERIAL_XILINX_PS_UART is not set -# CONFIG_SERIAL_ARC is not set -# CONFIG_SERIAL_RP2 is not set -# CONFIG_SERIAL_FSL_LPUART is not set -# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_DEV_BUS=y -CONFIG_SERIAL_DEV_CTRL_TTYPORT=y -# CONFIG_TTY_PRINTK is not set -# CONFIG_HVC_DCC is not set -# CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y -# CONFIG_HW_RANDOM_TIMERIOMEM is not set -CONFIG_HW_RANDOM_CAVIUM=y -CONFIG_HW_RANDOM_ROCKCHIP=y -# CONFIG_APPLICOM is not set - -# -# PCMCIA character devices -# -# CONFIG_RAW_DRIVER is not set CONFIG_TCG_TPM=y -CONFIG_HW_RANDOM_TPM=y -# CONFIG_TCG_TIS is not set -# CONFIG_TCG_TIS_SPI is not set -# CONFIG_TCG_TIS_I2C_ATMEL is not set -CONFIG_TCG_TIS_I2C_INFINEON=y -# CONFIG_TCG_TIS_I2C_NUVOTON is not set -# CONFIG_TCG_ATMEL is not set -# CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set -# CONFIG_TCG_TIS_ST33ZP24_SPI is not set -CONFIG_DEVPORT=y -# CONFIG_XILLYBUS is not set -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set - -# -# I2C support -# -CONFIG_I2C=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_COMPAT=y +# CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y -CONFIG_I2C_MUX=y - -# -# Multiplexer I2C Chip support -# -# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set -# CONFIG_I2C_MUX_GPIO is not set -# CONFIG_I2C_MUX_GPMUX is not set -# CONFIG_I2C_MUX_LTC4306 is not set -# CONFIG_I2C_MUX_PCA9541 is not set -# CONFIG_I2C_MUX_PCA954x is not set -# CONFIG_I2C_MUX_PINCTRL is not set -# CONFIG_I2C_MUX_REG is not set -# CONFIG_I2C_DEMUX_PINCTRL is not set -# CONFIG_I2C_MUX_MLXCPLD is not set -CONFIG_I2C_HELPER_AUTO=y -CONFIG_I2C_ALGOBIT=y - -# -# I2C Hardware Bus support -# - -# -# PC SMBus host controller drivers -# -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_CADENCE is not set -# CONFIG_I2C_CBUS_GPIO is not set -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_GPIO is not set -# CONFIG_I2C_NOMADIK is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set +CONFIG_I2C_DESIGNWARE_PLATFORM=y CONFIG_I2C_RK3X=y -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_THUNDERX is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -CONFIG_I2C_CROS_EC_TUNNEL=y -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_SLAVE is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set CONFIG_SPI=y -# CONFIG_SPI_DEBUG is not set -CONFIG_SPI_MASTER=y -# CONFIG_SPI_MEM is not set - -# -# SPI Master Controller Drivers -# -# CONFIG_SPI_ALTERA is not set -# CONFIG_SPI_AXI_SPI_ENGINE is not set -CONFIG_SPI_BITBANG=y -# CONFIG_SPI_CADENCE is not set -# CONFIG_SPI_DESIGNWARE is not set -# CONFIG_SPI_GPIO is not set -# CONFIG_SPI_FSL_SPI is not set -# CONFIG_SPI_OC_TINY is not set -# CONFIG_SPI_PL022 is not set -# CONFIG_SPI_PXA2XX is not set +CONFIG_SPI_GPIO=y CONFIG_SPI_ROCKCHIP=y -# CONFIG_SPI_SC18IS602 is not set -# CONFIG_SPI_THUNDERX is not set -# CONFIG_SPI_XCOMM is not set -# CONFIG_SPI_XILINX is not set -# CONFIG_SPI_ZYNQMP_GQSPI is not set - -# -# SPI Protocol Masters -# +CONFIG_SPI_ROCKCHIP_SFC=y +CONFIG_SPI_MUX=y CONFIG_SPI_SPIDEV=y -# CONFIG_SPI_LOOPBACK_TEST is not set -# CONFIG_SPI_TLE62X0 is not set -# CONFIG_SPI_SLAVE is not set -# CONFIG_SPMI is not set -# CONFIG_HSI is not set -CONFIG_PPS=y -# CONFIG_PPS_DEBUG is not set - -# -# PPS clients support -# -# CONFIG_PPS_CLIENT_KTIMER is not set -# CONFIG_PPS_CLIENT_LDISC is not set -# CONFIG_PPS_CLIENT_GPIO is not set - -# -# PPS generators support -# - -# -# PTP clock support -# -CONFIG_PTP_1588_CLOCK=y - -# -# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. -# -CONFIG_PINCTRL=y -CONFIG_PINMUX=y -CONFIG_PINCONF=y -CONFIG_GENERIC_PINCONF=y -# CONFIG_DEBUG_PINCTRL is not set -# CONFIG_PINCTRL_AMD is not set -# CONFIG_PINCTRL_MCP23S08 is not set -CONFIG_PINCTRL_ROCKCHIP=y -# CONFIG_PINCTRL_SINGLE is not set -# CONFIG_PINCTRL_SX150X is not set -CONFIG_PINCTRL_RK628=y CONFIG_PINCTRL_RK805=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_FASTPATH_LIMIT=512 -CONFIG_OF_GPIO=y -CONFIG_GPIOLIB_IRQCHIP=y -# CONFIG_DEBUG_GPIO is not set +CONFIG_PINCTRL_SINGLE=y CONFIG_GPIO_SYSFS=y -CONFIG_GPIO_GENERIC=y - -# -# Memory mapped GPIO drivers -# -# CONFIG_GPIO_74XX_MMIO is not set -# CONFIG_GPIO_ALTERA is not set -# CONFIG_GPIO_DWAPB is not set -# CONFIG_GPIO_FTGPIO010 is not set +CONFIG_GPIO_DWAPB=y CONFIG_GPIO_GENERIC_PLATFORM=y -# CONFIG_GPIO_GRGPIO is not set -# CONFIG_GPIO_HLWD is not set -# CONFIG_GPIO_MB86S7X is not set -# CONFIG_GPIO_MOCKUP is not set -# CONFIG_GPIO_PL061 is not set -CONFIG_GPIO_ROCKCHIP=y -# CONFIG_GPIO_SYSCON is not set -# CONFIG_GPIO_XGENE is not set -# CONFIG_GPIO_XILINX is not set - -# -# I2C GPIO expanders -# -# CONFIG_GPIO_ADP5588 is not set -# CONFIG_GPIO_ADNP is not set -# CONFIG_GPIO_MAX7300 is not set -# CONFIG_GPIO_MAX732X is not set -CONFIG_GPIO_PCA953X=y -# CONFIG_GPIO_PCA953X_IRQ is not set -# CONFIG_GPIO_PCF857X is not set -# CONFIG_GPIO_TPIC2810 is not set - -# -# MFD GPIO expanders -# -# CONFIG_GPIO_TPS6586X is not set - -# -# PCI GPIO expanders -# -# CONFIG_GPIO_BT8XX is not set -# CONFIG_GPIO_PCI_IDIO_16 is not set -# CONFIG_GPIO_PCIE_IDIO_24 is not set -# CONFIG_GPIO_RDC321X is not set - -# -# SPI GPIO expanders -# -# CONFIG_GPIO_74X164 is not set -# CONFIG_GPIO_MAX3191X is not set -# CONFIG_GPIO_MAX7301 is not set -# CONFIG_GPIO_MC33880 is not set -# CONFIG_GPIO_PISOSR is not set -# CONFIG_GPIO_XRA1403 is not set - -# -# USB GPIO expanders -# -# CONFIG_W1 is not set -CONFIG_POWER_AVS=y -CONFIG_ROCKCHIP_IODOMAIN=y -CONFIG_POWER_RESET=y -# CONFIG_POWER_RESET_BRCMSTB is not set CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y -# CONFIG_POWER_RESET_LTC2952 is not set -# CONFIG_POWER_RESET_RESTART is not set -# CONFIG_POWER_RESET_XGENE is not set -# CONFIG_POWER_RESET_SYSCON is not set -# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set -CONFIG_REBOOT_MODE=y +CONFIG_POWER_RESET_SYSCON=y +CONFIG_POWER_RESET_SYSCON_POWEROFF=y CONFIG_SYSCON_REBOOT_MODE=y -CONFIG_POWER_SUPPLY=y -# CONFIG_POWER_SUPPLY_DEBUG is not set -# CONFIG_PDA_POWER is not set -# CONFIG_GENERIC_ADC_BATTERY is not set -# CONFIG_TEST_POWER is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_BATTERY_DS2780 is not set -# CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_LEGO_EV3 is not set +CONFIG_BATTERY_CW2015=y CONFIG_BATTERY_SBS=y -# CONFIG_CHARGER_SBS is not set -# CONFIG_MANAGER_SBS is not set -# CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set -# CONFIG_CHARGER_ISP1704 is not set -# CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set CONFIG_CHARGER_GPIO=y -# CONFIG_CHARGER_MANAGER is not set -# CONFIG_CHARGER_LTC3651 is not set -# CONFIG_CHARGER_DETECTOR_MAX14656 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_BQ24190 is not set -# CONFIG_CHARGER_BQ24257 is not set CONFIG_CHARGER_BQ24735=y -# CONFIG_CHARGER_BQ25700 is not set -# CONFIG_CHARGER_BQ25890 is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_CHARGER_RT9455 is not set -# CONFIG_CHARGER_CROS_USBPD is not set -# CONFIG_BATTERY_CW2015 is not set -# CONFIG_BATTERY_RK816 is not set -CONFIG_BATTERY_RK817=y CONFIG_CHARGER_RK817=y -# CONFIG_BATTERY_RK818 is not set -# CONFIG_CHARGER_RK818 is not set -CONFIG_HWMON=y -# CONFIG_HWMON_DEBUG_CHIP is not set - -# -# Native drivers -# -# CONFIG_SENSORS_AD7314 is not set -# CONFIG_SENSORS_AD7414 is not set -# CONFIG_SENSORS_AD7418 is not set -# CONFIG_SENSORS_ADM1021 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1029 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ADM9240 is not set -# CONFIG_SENSORS_ADT7310 is not set -# CONFIG_SENSORS_ADT7410 is not set -# CONFIG_SENSORS_ADT7411 is not set -# CONFIG_SENSORS_ADT7462 is not set -# CONFIG_SENSORS_ADT7470 is not set -# CONFIG_SENSORS_ADT7475 is not set -# CONFIG_SENSORS_ASC7621 is not set -# CONFIG_SENSORS_ARM_SCMI is not set -# CONFIG_SENSORS_ASPEED is not set -# CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_DS620 is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_I5K_AMB is not set -# CONFIG_SENSORS_F71805F is not set -# CONFIG_SENSORS_F71882FG is not set -# CONFIG_SENSORS_F75375S is not set -# CONFIG_SENSORS_FTSTEUTATES is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_G760A is not set -# CONFIG_SENSORS_G762 is not set -# CONFIG_SENSORS_GPIO_FAN is not set -# CONFIG_SENSORS_HIH6130 is not set -# CONFIG_SENSORS_IIO_HWMON is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_JC42 is not set -# CONFIG_SENSORS_POWR1220 is not set -# CONFIG_SENSORS_LINEAGE is not set -# CONFIG_SENSORS_LTC2945 is not set -# CONFIG_SENSORS_LTC2990 is not set -# CONFIG_SENSORS_LTC4151 is not set -# CONFIG_SENSORS_LTC4215 is not set -# CONFIG_SENSORS_LTC4222 is not set -# CONFIG_SENSORS_LTC4245 is not set -# CONFIG_SENSORS_LTC4260 is not set -# CONFIG_SENSORS_LTC4261 is not set -# CONFIG_SENSORS_MAX1111 is not set -# CONFIG_SENSORS_MAX16065 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_MAX1668 is not set -# CONFIG_SENSORS_MAX197 is not set -# CONFIG_SENSORS_MAX31722 is not set -# CONFIG_SENSORS_MAX6621 is not set -# CONFIG_SENSORS_MAX6639 is not set -# CONFIG_SENSORS_MAX6642 is not set -# CONFIG_SENSORS_MAX6650 is not set -# CONFIG_SENSORS_MAX6697 is not set -# CONFIG_SENSORS_MAX31790 is not set -# CONFIG_SENSORS_MCP3021 is not set -# CONFIG_SENSORS_TC654 is not set -# CONFIG_SENSORS_ADCXX is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM70 is not set -# CONFIG_SENSORS_LM73 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_LM92 is not set -# CONFIG_SENSORS_LM93 is not set -# CONFIG_SENSORS_LM95234 is not set -# CONFIG_SENSORS_LM95241 is not set -# CONFIG_SENSORS_LM95245 is not set -# CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set -# CONFIG_SENSORS_NCT6683 is not set -# CONFIG_SENSORS_NCT6775 is not set -# CONFIG_SENSORS_NCT7802 is not set -# CONFIG_SENSORS_NCT7904 is not set -# CONFIG_SENSORS_NPCM7XX is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_PMBUS is not set -# CONFIG_SENSORS_PWM_FAN is not set -# CONFIG_SENSORS_SHT15 is not set -# CONFIG_SENSORS_SHT21 is not set -# CONFIG_SENSORS_SHT3x is not set -# CONFIG_SENSORS_SHTC1 is not set -# CONFIG_SENSORS_SIS5595 is not set -# CONFIG_SENSORS_DME1737 is not set -# CONFIG_SENSORS_EMC1403 is not set -# CONFIG_SENSORS_EMC2103 is not set -# CONFIG_SENSORS_EMC6W201 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_SMSC47M192 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_SCH5627 is not set -# CONFIG_SENSORS_SCH5636 is not set -# CONFIG_SENSORS_STTS751 is not set -# CONFIG_SENSORS_SMM665 is not set -# CONFIG_SENSORS_ADC128D818 is not set -# CONFIG_SENSORS_ADS1015 is not set -# CONFIG_SENSORS_ADS7828 is not set -# CONFIG_SENSORS_ADS7871 is not set -# CONFIG_SENSORS_AMC6821 is not set -# CONFIG_SENSORS_INA209 is not set -# CONFIG_SENSORS_INA2XX is not set -# CONFIG_SENSORS_INA3221 is not set -# CONFIG_SENSORS_TC74 is not set -# CONFIG_SENSORS_THMC50 is not set -# CONFIG_SENSORS_TMP102 is not set -# CONFIG_SENSORS_TMP103 is not set -# CONFIG_SENSORS_TMP108 is not set -# CONFIG_SENSORS_TMP401 is not set -# CONFIG_SENSORS_TMP421 is not set -# CONFIG_SENSORS_VIA686A is not set -# CONFIG_SENSORS_VT1211 is not set -# CONFIG_SENSORS_VT8231 is not set -# CONFIG_SENSORS_W83773G is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83791D is not set -# CONFIG_SENSORS_W83792D is not set -# CONFIG_SENSORS_W83793 is not set -# CONFIG_SENSORS_W83795 is not set -# CONFIG_SENSORS_W83L785TS is not set -# CONFIG_SENSORS_W83L786NG is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83627EHF is not set +CONFIG_SENSORS_PWM_FAN=y CONFIG_THERMAL=y -# CONFIG_THERMAL_STATISTICS is not set -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y -# CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set -# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set -# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y -# CONFIG_THERMAL_GOV_BANG_BANG is not set -# CONFIG_THERMAL_GOV_USER_SPACE is not set CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y -# CONFIG_CLOCK_THERMAL is not set CONFIG_DEVFREQ_THERMAL=y -# CONFIG_THERMAL_EMULATION is not set -# CONFIG_QORIQ_THERMAL is not set CONFIG_ROCKCHIP_THERMAL=y -# CONFIG_RK_VIRTUAL_THERMAL is not set -# CONFIG_RK3368_THERMAL is not set - -# -# ACPI INT340X thermal drivers -# -# CONFIG_GENERIC_ADC_THERMAL is not set +CONFIG_GENERIC_ADC_THERMAL=y CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_CORE=y -# CONFIG_WATCHDOG_NOWAYOUT is not set -CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y -# CONFIG_WATCHDOG_SYSFS is not set - -# -# Watchdog Device Drivers -# -# CONFIG_SOFT_WATCHDOG is not set -# CONFIG_GPIO_WATCHDOG is not set -# CONFIG_XILINX_WATCHDOG is not set -# CONFIG_ZIIRAVE_WATCHDOG is not set -# CONFIG_ARM_SP805_WATCHDOG is not set -# CONFIG_ARM_SBSA_WATCHDOG is not set -# CONFIG_CADENCE_WATCHDOG is not set CONFIG_DW_WATCHDOG=y -# CONFIG_MAX63XX_WATCHDOG is not set -# CONFIG_ALIM7101_WDT is not set -# CONFIG_I6300ESB_WDT is not set -# CONFIG_MEN_A21_WDT is not set - -# -# PCI-based Watchdog Cards -# -# CONFIG_PCIPCWATCHDOG is not set -# CONFIG_WDTPCI is not set - -# -# USB-based Watchdog Cards -# -# CONFIG_USBPCWATCHDOG is not set - -# -# Watchdog Pretimeout Governors -# -# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set -CONFIG_SSB_POSSIBLE=y -# CONFIG_SSB is not set -CONFIG_BCMA_POSSIBLE=y -# CONFIG_BCMA is not set - -# -# Multifunction device drivers -# -CONFIG_MFD_CORE=y -# CONFIG_MFD_ACT8945A is not set -# CONFIG_MFD_AS3711 is not set -# CONFIG_MFD_AS3722 is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_AAT2870_CORE is not set -# CONFIG_MFD_ATMEL_FLEXCOM is not set -# CONFIG_MFD_ATMEL_HLCDC is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_AXP20X_I2C is not set -CONFIG_MFD_CROS_EC=y -# CONFIG_MFD_CROS_EC_CHARDEV is not set -# CONFIG_MFD_MADERA is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_SPI is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set -# CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_MC13XXX_SPI is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_HI6421_PMIC is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_HTC_I2CPLD is not set -# CONFIG_LPC_ICH is not set -# CONFIG_LPC_SCH is not set -# CONFIG_MFD_JANZ_CMODIO is not set -# CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77620 is not set -# CONFIG_MFD_MAX77686 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_MENF21BMC is not set -# CONFIG_EZX_PCAP is not set -# CONFIG_MFD_CPCAP is not set -# CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RC5T583 is not set -CONFIG_MFD_RK618=y -CONFIG_MFD_RK628=y -# CONFIG_MFD_RK630 is not set -# CONFIG_MFD_RK630_I2C is not set -# CONFIG_MFD_RK630_SPI is not set -CONFIG_MFD_RK808=y -# CONFIG_MFD_RK1000 is not set -# CONFIG_MFD_RN5T618 is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set -# CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_MFD_SMSC is not set -# CONFIG_ABX500_CORE is not set -# CONFIG_MFD_STMPE is not set -CONFIG_MFD_SYSCON=y -# CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS65010 is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TPS65217 is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TI_LP87565 is not set -# CONFIG_MFD_TPS65218 is not set +CONFIG_SSB=y +CONFIG_BCMA=y +CONFIG_MFD_RK8XX_I2C=y CONFIG_MFD_TPS6586X=y -# CONFIG_MFD_TPS65910 is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS65912_SPI is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_LM3533 is not set -# CONFIG_MFD_TC3589X is not set -# CONFIG_MFD_VX855 is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_ARIZONA_SPI is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM831X_SPI is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set -# CONFIG_MFD_ROHM_BD718XX is not set -# CONFIG_RAVE_SP_CORE is not set -CONFIG_FUSB_30X=y CONFIG_REGULATOR=y CONFIG_REGULATOR_DEBUG=y CONFIG_REGULATOR_FIXED_VOLTAGE=y -# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set -# CONFIG_REGULATOR_PROXY_CONSUMER is not set -# CONFIG_REGULATOR_88PG86X is not set +CONFIG_REGULATOR_VIRTUAL_CONSUMER=y +CONFIG_REGULATOR_USERSPACE_CONSUMER=y CONFIG_REGULATOR_ACT8865=y -# CONFIG_REGULATOR_AD5398 is not set -# CONFIG_REGULATOR_ANATOP is not set -# CONFIG_REGULATOR_DA9210 is not set -# CONFIG_REGULATOR_DA9211 is not set +CONFIG_REGULATOR_ARM_SCMI=y CONFIG_REGULATOR_FAN53555=y CONFIG_REGULATOR_GPIO=y -# CONFIG_REGULATOR_ISL9305 is not set -# CONFIG_REGULATOR_ISL6271A is not set -# CONFIG_REGULATOR_LP3971 is not set -# CONFIG_REGULATOR_LP3972 is not set -# CONFIG_REGULATOR_LP872X is not set -CONFIG_REGULATOR_LP8752=y -# CONFIG_REGULATOR_LP8755 is not set -# CONFIG_REGULATOR_LTC3589 is not set -# CONFIG_REGULATOR_LTC3676 is not set -# CONFIG_REGULATOR_MAX1586 is not set -# CONFIG_REGULATOR_MAX8649 is not set -# CONFIG_REGULATOR_MAX8660 is not set -# CONFIG_REGULATOR_MAX8952 is not set -# CONFIG_REGULATOR_MAX8973 is not set -CONFIG_REGULATOR_MP8865=y -# CONFIG_REGULATOR_MT6311 is not set -# CONFIG_REGULATOR_PFUZE100 is not set -# CONFIG_REGULATOR_PV88060 is not set -# CONFIG_REGULATOR_PV88080 is not set -# CONFIG_REGULATOR_PV88090 is not set CONFIG_REGULATOR_PWM=y CONFIG_REGULATOR_RK808=y -# CONFIG_REGULATOR_SY8106A is not set -# CONFIG_REGULATOR_TPS51632 is not set -# CONFIG_REGULATOR_TPS549B22 is not set -# CONFIG_REGULATOR_TPS62360 is not set -# CONFIG_REGULATOR_TPS65023 is not set -# CONFIG_REGULATOR_TPS6507X is not set -CONFIG_REGULATOR_TPS65132=y -# CONFIG_REGULATOR_TPS6524X is not set CONFIG_REGULATOR_TPS6586X=y -# CONFIG_REGULATOR_VCTRL is not set -CONFIG_REGULATOR_XZ3216=y -# CONFIG_REGULATOR_DIO5632 is not set -CONFIG_CEC_CORE=y -CONFIG_CEC_NOTIFIER=y -# CONFIG_RC_CORE is not set +CONFIG_REGULATOR_VCTRL=y +CONFIG_RC_CORE=y +CONFIG_LIRC=y +CONFIG_RC_DECODERS=y +CONFIG_IR_JVC_DECODER=y +CONFIG_IR_MCE_KBD_DECODER=y +CONFIG_IR_NEC_DECODER=y +CONFIG_IR_RC5_DECODER=y +CONFIG_IR_RC6_DECODER=y +CONFIG_IR_SANYO_DECODER=y +CONFIG_IR_SHARP_DECODER=y +CONFIG_IR_SONY_DECODER=y +CONFIG_IR_XMP_DECODER=y +CONFIG_RC_DEVICES=y +CONFIG_IR_GPIO_CIR=y +CONFIG_MEDIA_CEC_RC=y +CONFIG_MEDIA_CEC_SUPPORT=y +CONFIG_USB_PULSE8_CEC=m +CONFIG_USB_RAINSHADOW_CEC=m CONFIG_MEDIA_SUPPORT=y - -# -# Multimedia core support -# +CONFIG_MEDIA_SUPPORT_FILTER=y CONFIG_MEDIA_CAMERA_SUPPORT=y -# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set -# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set -# CONFIG_MEDIA_RADIO_SUPPORT is not set -# CONFIG_MEDIA_SDR_SUPPORT is not set -CONFIG_MEDIA_CEC_SUPPORT=y -CONFIG_MEDIA_CONTROLLER=y -CONFIG_VIDEO_DEV=y -CONFIG_VIDEO_V4L2_SUBDEV_API=y -CONFIG_VIDEO_V4L2=y -# CONFIG_VIDEO_ADV_DEBUG is not set -# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set -# CONFIG_VIDEO_PCI_SKELETON is not set -CONFIG_V4L2_MEM2MEM_DEV=y -# CONFIG_V4L2_FLASH_LED_CLASS is not set -CONFIG_V4L2_FWNODE=y - -# -# Media drivers -# +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_MEDIA_TEST_SUPPORT=y +CONFIG_DVB_MAX_ADAPTERS=8 +# CONFIG_DVB_DYNAMIC_MINORS is not set CONFIG_MEDIA_USB_SUPPORT=y - -# -# Webcam devices -# +CONFIG_VIDEO_USBTV=m CONFIG_USB_VIDEO_CLASS=y # CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set -# CONFIG_USB_GSPCA is not set -# CONFIG_USB_PWC is not set -# CONFIG_VIDEO_CPIA2 is not set -# CONFIG_USB_ZR364XX is not set -# CONFIG_USB_STKWEBCAM is not set -# CONFIG_USB_S2255 is not set -# CONFIG_VIDEO_USBTV is not set - -# -# Webcam, TV (analog/digital) USB devices -# -# CONFIG_VIDEO_EM28XX is not set - -# -# USB HDMI CEC adapters -# -# CONFIG_USB_PULSE8_CEC is not set -# CONFIG_USB_RAINSHADOW_CEC is not set -# CONFIG_MEDIA_PCI_SUPPORT is not set +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m +CONFIG_DVB_AS102=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m +CONFIG_DVB_USB=y +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_CXUSB=m +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_DIBUSB_MB=m +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_VP7045=m +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_USB_AIRSPY=m +CONFIG_USB_HACKRF=m +CONFIG_USB_MSI2500=m +CONFIG_MEDIA_PCI_SUPPORT=y +CONFIG_VIDEO_CX23885=m +CONFIG_VIDEO_CX25821=m CONFIG_V4L_PLATFORM_DRIVERS=y -# CONFIG_VIDEO_CAFE_CCIC is not set -# CONFIG_VIDEO_CADENCE is not set -# CONFIG_VIDEO_MUX is not set -CONFIG_SOC_CAMERA=y -# CONFIG_SOC_CAMERA_PLATFORM is not set -# CONFIG_VIDEO_XILINX is not set -CONFIG_VIDEO_ROCKCHIP_CIF=y -CONFIG_ROCKCHIP_CIF_WORKMODE_PINGPONG=y -# CONFIG_ROCKCHIP_CIF_WORKMODE_ONEFRAME is not set -CONFIG_VIDEO_ROCKCHIP_ISP1=y -CONFIG_VIDEO_ROCKCHIP_ISP=y -# CONFIG_VIDEO_ROCKCHIP_ISPP is not set +CONFIG_DVB_PLATFORM_DRIVERS=y CONFIG_V4L_MEM2MEM_DRIVERS=y -# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set -# CONFIG_VIDEO_SH_VEU is not set CONFIG_VIDEO_ROCKCHIP_RGA=y -# CONFIG_V4L_TEST_DRIVERS is not set -# CONFIG_CEC_PLATFORM_DRIVERS is not set - -# -# Supported MMC/SDIO adapters -# -# CONFIG_CYPRESS_FIRMWARE is not set -CONFIG_VIDEOBUF2_CORE=y -CONFIG_VIDEOBUF2_V4L2=y -CONFIG_VIDEOBUF2_MEMOPS=y -CONFIG_VIDEOBUF2_DMA_CONTIG=y -CONFIG_VIDEOBUF2_VMALLOC=y -CONFIG_VIDEOBUF2_DMA_SG=y - -# -# Media ancillary drivers (tuners, sensors, i2c, spi, frontends) -# -# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set - -# -# I2C Encoders, decoders, sensors and other helper chips -# - -# -# Audio decoders, processors and mixers -# -# CONFIG_VIDEO_TVAUDIO is not set -# CONFIG_VIDEO_TDA7432 is not set -# CONFIG_VIDEO_TDA9840 is not set -# CONFIG_VIDEO_TDA1997X is not set -# CONFIG_VIDEO_TEA6415C is not set -# CONFIG_VIDEO_TEA6420 is not set -# CONFIG_VIDEO_MSP3400 is not set -# CONFIG_VIDEO_CS3308 is not set -# CONFIG_VIDEO_CS5345 is not set -# CONFIG_VIDEO_CS53L32A is not set -# CONFIG_VIDEO_TLV320AIC23B is not set -# CONFIG_VIDEO_UDA1342 is not set -# CONFIG_VIDEO_WM8775 is not set -# CONFIG_VIDEO_WM8739 is not set -# CONFIG_VIDEO_VP27SMPX is not set -# CONFIG_VIDEO_SONY_BTF_MPX is not set - -# -# RDS decoders -# -# CONFIG_VIDEO_SAA6588 is not set - -# -# Video decoders -# -# CONFIG_VIDEO_ADV7180 is not set -# CONFIG_VIDEO_ADV7183 is not set -# CONFIG_VIDEO_ADV748X is not set -# CONFIG_VIDEO_ADV7604 is not set -# CONFIG_VIDEO_ADV7842 is not set -# CONFIG_VIDEO_BT819 is not set -# CONFIG_VIDEO_BT856 is not set -# CONFIG_VIDEO_BT866 is not set -# CONFIG_VIDEO_KS0127 is not set -# CONFIG_VIDEO_ML86V7667 is not set -# CONFIG_VIDEO_AD5820 is not set -# CONFIG_VIDEO_AK7375 is not set -# CONFIG_VIDEO_DW9714 is not set -# CONFIG_VIDEO_DW9807_VCM is not set -# CONFIG_VIDEO_FP5510 is not set -# CONFIG_VIDEO_GT9760S is not set -# CONFIG_VIDEO_VM149C is not set -# CONFIG_VIDEO_SAA7110 is not set -# CONFIG_VIDEO_SAA711X is not set -# CONFIG_VIDEO_TC358743 is not set -# CONFIG_VIDEO_TC35874X is not set -CONFIG_VIDEO_RK628_CSI=y -# CONFIG_VIDEO_TECHPOINT is not set -# CONFIG_VIDEO_TVP514X is not set -# CONFIG_VIDEO_TVP5150 is not set -# CONFIG_VIDEO_TVP7002 is not set -# CONFIG_VIDEO_TW2804 is not set -# CONFIG_VIDEO_TW9903 is not set -# CONFIG_VIDEO_TW9906 is not set -# CONFIG_VIDEO_TW9910 is not set -# CONFIG_VIDEO_VPX3220 is not set - -# -# Video and audio decoders -# -# CONFIG_VIDEO_SAA717X is not set -# CONFIG_VIDEO_CX25840 is not set - -# -# Video encoders -# -# CONFIG_VIDEO_SAA7127 is not set -# CONFIG_VIDEO_SAA7185 is not set -# CONFIG_VIDEO_ADV7170 is not set -# CONFIG_VIDEO_ADV7175 is not set -# CONFIG_VIDEO_ADV7343 is not set -# CONFIG_VIDEO_ADV7393 is not set -# CONFIG_VIDEO_ADV7511 is not set -# CONFIG_VIDEO_AD9389B is not set -# CONFIG_VIDEO_AK881X is not set -# CONFIG_VIDEO_THS8200 is not set - -# -# Camera sensor devices -# -# CONFIG_VIDEO_IMX178 is not set -# CONFIG_VIDEO_IMX219 is not set -# CONFIG_VIDEO_IMX258 is not set -# CONFIG_VIDEO_IMX274 is not set -# CONFIG_VIDEO_IMX307 is not set -# CONFIG_VIDEO_IMX317 is not set -# CONFIG_VIDEO_IMX323 is not set -# CONFIG_VIDEO_IMX327 is not set -# CONFIG_VIDEO_IMX334 is not set -# CONFIG_VIDEO_IMX335 is not set -# CONFIG_VIDEO_IMX347 is not set -# CONFIG_VIDEO_IMX378 is not set -# CONFIG_VIDEO_IMX415 is not set -# CONFIG_VIDEO_IMX464 is not set -# CONFIG_VIDEO_OS02G10 is not set -CONFIG_VIDEO_OS04A10=y -# CONFIG_VIDEO_OS04C10 is not set -# CONFIG_VIDEO_OS05A20 is not set -# CONFIG_VIDEO_OS08A10 is not set -# CONFIG_VIDEO_OV02B10 is not set -# CONFIG_VIDEO_OV02K10 is not set -# CONFIG_VIDEO_OV2640 is not set -# CONFIG_VIDEO_OV2659 is not set -# CONFIG_VIDEO_OV2680 is not set -# CONFIG_VIDEO_OV2685 is not set -# CONFIG_VIDEO_OV2718 is not set -# CONFIG_VIDEO_OV2735 is not set -# CONFIG_VIDEO_OV2775 is not set -# CONFIG_VIDEO_OV4686 is not set -# CONFIG_VIDEO_OV4688 is not set -CONFIG_VIDEO_OV4689=y -# CONFIG_VIDEO_OV5640 is not set -# CONFIG_VIDEO_OV5645 is not set -# CONFIG_VIDEO_OV5647 is not set -# CONFIG_VIDEO_OV5648 is not set -# CONFIG_VIDEO_OV5670 is not set -CONFIG_VIDEO_OV5695=y -# CONFIG_VIDEO_OV6650 is not set -CONFIG_VIDEO_OV7251=y -# CONFIG_VIDEO_OV772X is not set -# CONFIG_VIDEO_OV7640 is not set -# CONFIG_VIDEO_OV7670 is not set -# CONFIG_VIDEO_OV7740 is not set -# CONFIG_VIDEO_OV7750 is not set -# CONFIG_VIDEO_OV8858 is not set -# CONFIG_VIDEO_OV9281 is not set -# CONFIG_VIDEO_OV9650 is not set -# CONFIG_VIDEO_OV9750 is not set -# CONFIG_VIDEO_OV12D2Q is not set -CONFIG_VIDEO_OV13850=y -# CONFIG_VIDEO_OV13858 is not set -# CONFIG_VIDEO_PREISP_DUMMY_SENSOR is not set -# CONFIG_VIDEO_VS6624 is not set -# CONFIG_VIDEO_MT9M032 is not set -# CONFIG_VIDEO_MT9M111 is not set -# CONFIG_VIDEO_MT9P031 is not set -# CONFIG_VIDEO_MT9T001 is not set -# CONFIG_VIDEO_MT9T112 is not set -# CONFIG_VIDEO_MT9V011 is not set -# CONFIG_VIDEO_MT9V032 is not set -# CONFIG_VIDEO_MT9V111 is not set -# CONFIG_VIDEO_AR0230 is not set -# CONFIG_VIDEO_SR030PC30 is not set -# CONFIG_VIDEO_NOON010PC30 is not set -# CONFIG_VIDEO_M5MOLS is not set -# CONFIG_VIDEO_RJ54N1 is not set -# CONFIG_VIDEO_S5K6AA is not set -# CONFIG_VIDEO_S5K6A3 is not set -# CONFIG_VIDEO_S5KGM1SP is not set -# CONFIG_VIDEO_S5K4H7YX is not set -# CONFIG_VIDEO_S5K4ECGX is not set -# CONFIG_VIDEO_S5K5BAF is not set -# CONFIG_VIDEO_SMIAPP is not set -# CONFIG_VIDEO_ET8EK8 is not set -# CONFIG_VIDEO_S5C73M3 is not set -# CONFIG_VIDEO_GC02M2 is not set -# CONFIG_VIDEO_GC0312 is not set -# CONFIG_VIDEO_GC0329 is not set -# CONFIG_VIDEO_GC032A is not set -# CONFIG_VIDEO_GC0403 is not set -# CONFIG_VIDEO_GC2035 is not set -CONFIG_VIDEO_GC2053=y -CONFIG_VIDEO_GC2093=y -# CONFIG_VIDEO_GC2145 is not set -# CONFIG_VIDEO_GC2155 is not set -# CONFIG_VIDEO_GC2355 is not set -# CONFIG_VIDEO_GC2375H is not set -# CONFIG_VIDEO_GC2385 is not set -# CONFIG_VIDEO_GC4663 is not set -# CONFIG_VIDEO_GC4C33 is not set -# CONFIG_VIDEO_GC5024 is not set -# CONFIG_VIDEO_GC5025 is not set -# CONFIG_VIDEO_GC5035 is not set -CONFIG_VIDEO_GC8034=y -# CONFIG_VIDEO_BF3925 is not set -# CONFIG_VIDEO_JX_F37 is not set -# CONFIG_VIDEO_JX_H62 is not set -# CONFIG_VIDEO_JX_H65 is not set -# CONFIG_VIDEO_JX_K04 is not set -# CONFIG_VIDEO_SC031GS is not set -# CONFIG_VIDEO_SC035HGS is not set -# CONFIG_VIDEO_SC132GS is not set -# CONFIG_VIDEO_SC200AI is not set -# CONFIG_VIDEO_SC210IOT is not set -# CONFIG_VIDEO_SC2232 is not set -# CONFIG_VIDEO_SC2239 is not set -# CONFIG_VIDEO_SC2310 is not set -# CONFIG_VIDEO_SC2335 is not set -# CONFIG_VIDEO_SC401AI is not set -# CONFIG_VIDEO_SC4238 is not set -# CONFIG_VIDEO_SC430CS is not set -# CONFIG_VIDEO_SC500AI is not set -# CONFIG_VIDEO_SC8220 is not set -# CONFIG_VIDEO_SP250A is not set -# CONFIG_VIDEO_HYNIX_HI556 is not set -# CONFIG_VIDEO_HYNIX_HI846 is not set - -# -# Flash devices -# -# CONFIG_VIDEO_ADP1653 is not set -# CONFIG_VIDEO_LM3560 is not set -# CONFIG_VIDEO_LM3646 is not set -# CONFIG_VIDEO_SGM3784 is not set - -# -# Video improvement chips -# -# CONFIG_VIDEO_UPD64031A is not set -# CONFIG_VIDEO_UPD64083 is not set - -# -# Audio/Video compression chips -# -# CONFIG_VIDEO_SAA6752HS is not set - -# -# SDR tuner chips -# - -# -# Miscellaneous helper chips -# -# CONFIG_VIDEO_THS7303 is not set -# CONFIG_VIDEO_M52790 is not set -# CONFIG_VIDEO_I2C is not set -# CONFIG_VIDEO_NVP6158 is not set -# CONFIG_VIDEO_NVP6188 is not set -# CONFIG_VIDEO_NVP6324 is not set -# CONFIG_VIDEO_HALL_DC_MOTOR is not set -# CONFIG_VIDEO_RK_IRCUT is not set -# CONFIG_VIDEO_MP6507 is not set - -# -# Sensors used on soc_camera driver -# - -# -# soc_camera sensor drivers -# -# CONFIG_SOC_CAMERA_MT9M001 is not set -# CONFIG_SOC_CAMERA_MT9M111 is not set -# CONFIG_SOC_CAMERA_MT9T112 is not set -# CONFIG_SOC_CAMERA_MT9V022 is not set -# CONFIG_SOC_CAMERA_OV5642 is not set -# CONFIG_SOC_CAMERA_OV772X is not set -# CONFIG_SOC_CAMERA_OV9640 is not set -# CONFIG_SOC_CAMERA_OV9740 is not set -# CONFIG_SOC_CAMERA_RJ54N1 is not set -# CONFIG_SOC_CAMERA_TW9910 is not set - -# -# SPI helper chips -# -# CONFIG_VIDEO_GS1662 is not set -# CONFIG_VIDEO_ROCKCHIP_PREISP is not set - -# -# Media SPI Adapters -# - -# -# Customise DVB Frontends -# - -# -# Tools to develop new frontends -# - -# -# Graphics support -# -# CONFIG_VGA_ARB is not set +CONFIG_VIDEO_HANTRO=y +# CONFIG_VIDEO_IR_I2C is not set +CONFIG_VIDEO_IMX219=y +CONFIG_VIDEO_OV5645=y +CONFIG_CXD2880_SPI_DRV=m +CONFIG_DVB_ASCOT2E=m +CONFIG_DVB_HELENE=m +CONFIG_DVB_HORUS3A=m +CONFIG_DVB_ISL6405=m +CONFIG_DVB_LGS8GL5=m +CONFIG_DVB_LNBH25=m +CONFIG_DVB_LNBH29=m +CONFIG_DVB_TDA665x=m +CONFIG_DVB_CXD2099=m CONFIG_DRM=y -CONFIG_DRM_IGNORE_IOTCL_PERMIT=y -CONFIG_DRM_MIPI_DSI=y -# CONFIG_DRM_DP_AUX_CHARDEV is not set -# CONFIG_DRM_DEBUG_MM is not set -# CONFIG_DRM_DEBUG_SELFTEST is not set -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_KMS_FB_HELPER=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=200 -# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set CONFIG_DRM_LOAD_EDID_FIRMWARE=y -# CONFIG_DRM_DP_CEC is not set -CONFIG_DRM_TTM=m -CONFIG_DRM_GEM_CMA_HELPER=y - -# -# I2C encoder or helper chips -# -# CONFIG_DRM_I2C_CH7006 is not set -# CONFIG_DRM_I2C_SIL164 is not set -# CONFIG_DRM_I2C_NXP_TDA998X is not set -# CONFIG_DRM_I2C_NXP_TDA9950 is not set -# CONFIG_DRM_HDLCD is not set -# CONFIG_DRM_MALI_DISPLAY is not set -# CONFIG_DRM_RADEON is not set -# CONFIG_DRM_AMDGPU is not set - -# -# ACP (Audio CoProcessor) Configuration -# - -# -# AMD Library routines -# -# CONFIG_DRM_NOUVEAU is not set -# CONFIG_DRM_VGEM is not set -# CONFIG_DRM_VKMS is not set +CONFIG_DRM_MALI_DISPLAY=y CONFIG_DRM_ROCKCHIP=y -# CONFIG_ROCKCHIP_DRM_DEBUG is not set -CONFIG_ROCKCHIP_ANALOGIX_DP=y -CONFIG_ROCKCHIP_CDN_DP=y +CONFIG_ROCKCHIP_VOP2=y CONFIG_ROCKCHIP_DW_HDMI=y CONFIG_ROCKCHIP_DW_MIPI_DSI=y -CONFIG_ROCKCHIP_INNO_HDMI=y -CONFIG_ROCKCHIP_LVDS=y -CONFIG_ROCKCHIP_DRM_TVE=y -CONFIG_ROCKCHIP_RGB=y -# CONFIG_DRM_ROCKCHIP_VVOP is not set -# CONFIG_ROCKCHIP_EBC_DEV is not set -CONFIG_DRM_ROCKCHIP_RK618=y -# CONFIG_DRM_ROCKCHIP_RK628 is not set -# CONFIG_DRM_UDL is not set -# CONFIG_DRM_AST is not set -# CONFIG_DRM_MGAG200 is not set -# CONFIG_DRM_CIRRUS_QEMU is not set -# CONFIG_DRM_RCAR_DW_HDMI is not set -# CONFIG_DRM_RCAR_LVDS is not set -# CONFIG_DRM_QXL is not set -# CONFIG_DRM_BOCHS is not set -CONFIG_DRM_PANEL=y - -# -# Display Panels -# -# CONFIG_DRM_PANEL_ARM_VERSATILE is not set -# CONFIG_DRM_PANEL_LVDS is not set -CONFIG_DRM_PANEL_SIMPLE=y -# CONFIG_DRM_PANEL_SIMPLE_OF_ONLY is not set -# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set -# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set -# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set -# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set -# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set -# CONFIG_DRM_PANEL_LG_LG4573 is not set -# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set -# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set -# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set -# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set -# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set -# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_PANEL_BRIDGE=y - -# -# Display Interface Bridges -# -# CONFIG_DRM_ANALOGIX_ANX78XX is not set -# CONFIG_DRM_CDNS_DSI is not set -# CONFIG_DRM_DUMB_VGA_DAC is not set -# CONFIG_DRM_LVDS_ENCODER is not set -# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set -# CONFIG_DRM_NXP_PTN3460 is not set -# CONFIG_DRM_PARADE_PS8622 is not set -# CONFIG_DRM_RK1000_TVE is not set -# CONFIG_DRM_SIL_SII8620 is not set -CONFIG_DRM_SII902X=y -# CONFIG_DRM_SII9234 is not set -# CONFIG_DRM_THINE_THC63LVD1024 is not set -# CONFIG_DRM_TOSHIBA_TC358767 is not set -# CONFIG_DRM_TI_TFP410 is not set -CONFIG_DRM_ANALOGIX_DP=y -# CONFIG_DRM_I2C_ADV7511 is not set -CONFIG_DRM_DW_HDMI=y -# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set -CONFIG_DRM_DW_HDMI_I2S_AUDIO=y +CONFIG_DRM_PANEL_ELIDA_KD35T133=y +CONFIG_DRM_PANEL_HIMAX_HX8394=y +CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966=y +CONFIG_DRM_PANEL_NEWVISION_NV3051D=y +CONFIG_DRM_PANEL_SITRONIX_ST7701=y +CONFIG_DRM_PANEL_SITRONIX_ST7703=y +CONFIG_DRM_DISPLAY_CONNECTOR=y CONFIG_DRM_DW_HDMI_CEC=y -# CONFIG_DRM_ARCPGU is not set -# CONFIG_DRM_HISI_HIBMC is not set -# CONFIG_DRM_HISI_KIRIN is not set -# CONFIG_DRM_MXSFB is not set -# CONFIG_DRM_TINYDRM is not set -# CONFIG_DRM_PL111 is not set -# CONFIG_DRM_LEGACY is not set -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_MALI400=y -CONFIG_MALI450=y -# CONFIG_MALI470 is not set -# CONFIG_MALI400_DEBUG is not set -# CONFIG_MALI400_PROFILING is not set -# CONFIG_MALI400_UMP is not set -CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH=y -CONFIG_MALI_SHARED_INTERRUPTS=y -# CONFIG_MALI_PMU_PARALLEL_POWER_UP is not set -CONFIG_MALI_DT=y -CONFIG_MALI_DEVFREQ=y -# CONFIG_MALI_QUIET is not set -CONFIG_MALI_MIDGARD_FOR_ANDROID=y -# CONFIG_MALI_MIDGARD_FOR_LINUX is not set -CONFIG_MALI_MIDGARD=y -# CONFIG_MALI_GATOR_SUPPORT is not set -# CONFIG_MALI_MIDGARD_ENABLE_TRACE is not set -# CONFIG_MALI_DMA_FENCE is not set -CONFIG_MALI_EXPERT=y -# CONFIG_MALI_CORESTACK is not set -# CONFIG_MALI_PRFCNT_SET_SECONDARY is not set -# CONFIG_MALI_PLATFORM_FAKE is not set -# CONFIG_MALI_PLATFORM_DEVICETREE is not set -CONFIG_MALI_PLATFORM_THIRDPARTY=y -CONFIG_MALI_PLATFORM_THIRDPARTY_NAME="rk" -CONFIG_MALI_DEBUG=y -CONFIG_MALI_FENCE_DEBUG=y -# CONFIG_MALI_NO_MALI is not set -# CONFIG_MALI_TRACE_TIMELINE is not set -# CONFIG_MALI_SYSTEM_TRACE is not set -# CONFIG_MALI_GPU_MMU_AARCH64 is not set -CONFIG_MALI_PWRSOFT_765=y -# CONFIG_MALI_KUTF is not set -CONFIG_MALI_BIFROST_FOR_ANDROID=y -# CONFIG_MALI_BIFROST_FOR_LINUX is not set -CONFIG_MALI_BIFROST=y -CONFIG_MALI_BIFROST_GATOR_SUPPORT=y -# CONFIG_MALI_BIFROST_ENABLE_TRACE is not set -CONFIG_MALI_BIFROST_DEVFREQ=y -# CONFIG_MALI_BIFROST_DMA_FENCE is not set -CONFIG_MALI_PLATFORM_NAME="rk" -# CONFIG_MALI_ARBITER_SUPPORT is not set -# CONFIG_MALI_BIFROST_EXPERT is not set -CONFIG_MALI_REAL_HW=y -# CONFIG_MALI_DMA_BUF_MAP_ON_DEMAND is not set -# CONFIG_MALI_DMA_BUF_LEGACY_COMPAT is not set -# CONFIG_MALI_GEM5_BUILD is not set - -# -# Frame buffer Devices -# -CONFIG_FB_CMDLINE=y -CONFIG_FB_NOTIFY=y +CONFIG_DRM_PANEL_MIPI_DBI=y +CONFIG_DRM_PANFROST=y CONFIG_FB=y -# CONFIG_FIRMWARE_EDID is not set -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_FOREIGN_ENDIAN is not set -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_DEFERRED_IO=y -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_TILEBLITTING is not set - -# -# Frame buffer hardware drivers -# -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set -# CONFIG_FB_ARMCLCD is not set -# CONFIG_FB_CYBER2000 is not set -# CONFIG_FB_ASILIANT is not set -# CONFIG_FB_IMSTT is not set -# CONFIG_FB_UVESA is not set -# CONFIG_FB_OPENCORES is not set -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_NVIDIA is not set -# CONFIG_FB_RIVA is not set -# CONFIG_FB_I740 is not set -# CONFIG_FB_MATROX is not set -# CONFIG_FB_RADEON is not set -# CONFIG_FB_ATY128 is not set -# CONFIG_FB_ATY is not set -# CONFIG_FB_S3 is not set -# CONFIG_FB_SAVAGE is not set -# CONFIG_FB_SIS is not set -# CONFIG_FB_NEOMAGIC is not set -# CONFIG_FB_KYRO is not set -# CONFIG_FB_3DFX is not set -# CONFIG_FB_VOODOO1 is not set -# CONFIG_FB_VT8623 is not set -# CONFIG_FB_TRIDENT is not set -# CONFIG_FB_ARK is not set -# CONFIG_FB_PM3 is not set -# CONFIG_FB_CARMINE is not set -# CONFIG_FB_SMSCUFX is not set -# CONFIG_FB_UDL is not set -# CONFIG_FB_IBM_GXT4500 is not set -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FB_METRONOME is not set -# CONFIG_FB_MB862XX is not set -# CONFIG_FB_BROADSHEET is not set -# CONFIG_FB_SIMPLE is not set -# CONFIG_FB_SSD1307 is not set -# CONFIG_FB_SM712 is not set -CONFIG_BACKLIGHT_LCD_SUPPORT=y -# CONFIG_LCD_CLASS_DEVICE is not set -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BACKLIGHT_GENERIC=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_MODE_HELPERS=y CONFIG_BACKLIGHT_PWM=y -# CONFIG_BACKLIGHT_PM8941_WLED is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_LM3630A is not set -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LP855X is not set -# CONFIG_BACKLIGHT_GPIO is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set - -# -# Rockchip Misc Video driver -# - -# -# RGA -# -# CONFIG_ROCKCHIP_RGA is not set - -# -# RGA2 -# -CONFIG_ROCKCHIP_RGA2=y - -# -# IEP -# -# CONFIG_IEP is not set -# CONFIG_IEP_MMU is not set -CONFIG_ROCKCHIP_MPP_SERVICE=y -CONFIG_ROCKCHIP_MPP_RKVDEC=y -CONFIG_ROCKCHIP_MPP_RKVDEC2=y -CONFIG_ROCKCHIP_MPP_RKVENC=y -CONFIG_ROCKCHIP_MPP_VDPU1=y -CONFIG_ROCKCHIP_MPP_VEPU1=y -CONFIG_ROCKCHIP_MPP_VDPU2=y -CONFIG_ROCKCHIP_MPP_VEPU2=y -CONFIG_ROCKCHIP_MPP_IEP2=y -CONFIG_ROCKCHIP_MPP_JPGDEC=y -CONFIG_VIDEOMODE_HELPERS=y -CONFIG_HDMI=y - -# -# Console display driver support -# -CONFIG_DUMMY_CONSOLE=y -CONFIG_DUMMY_CONSOLE_COLUMNS=80 -CONFIG_DUMMY_CONSOLE_ROWS=25 -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_BACKLIGHT_LED=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y -# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set -# CONFIG_LOGO is not set CONFIG_SOUND=y CONFIG_SND=y -CONFIG_SND_TIMER=y -CONFIG_SND_PCM=y -CONFIG_SND_PCM_ELD=y -CONFIG_SND_PCM_IEC958=y -CONFIG_SND_DMAENGINE_PCM=y -CONFIG_SND_HWDEP=y -CONFIG_SND_SEQ_DEVICE=y -CONFIG_SND_RAWMIDI=y -CONFIG_SND_JACK=y -CONFIG_SND_JACK_INPUT_DEV=y -# CONFIG_SND_OSSEMUL is not set -CONFIG_SND_PCM_TIMER=y CONFIG_SND_HRTIMER=y CONFIG_SND_DYNAMIC_MINORS=y -CONFIG_SND_MAX_CARDS=32 # CONFIG_SND_SUPPORT_OLD_API is not set -CONFIG_SND_PROC_FS=y -CONFIG_SND_VERBOSE_PROCFS=y -# CONFIG_SND_VERBOSE_PRINTK is not set -# CONFIG_SND_DEBUG is not set +# CONFIG_SND_VERBOSE_PROCFS is not set +CONFIG_SND_VERBOSE_PRINTK=y CONFIG_SND_SEQUENCER=y CONFIG_SND_SEQ_DUMMY=y -CONFIG_SND_SEQ_HRTIMER_DEFAULT=y -CONFIG_SND_SEQ_MIDI_EVENT=y -CONFIG_SND_SEQ_MIDI=y -CONFIG_SND_DRIVERS=y -# CONFIG_SND_DUMMY is not set -# CONFIG_SND_ALOOP is not set -# CONFIG_SND_VIRMIDI is not set -# CONFIG_SND_MTPAV is not set -# CONFIG_SND_SERIAL_U16550 is not set -# CONFIG_SND_MPU401 is not set +# CONFIG_SND_DRIVERS is not set # CONFIG_SND_PCI is not set - -# -# HD-Audio -# -CONFIG_SND_HDA_PREALLOC_SIZE=64 # CONFIG_SND_SPI is not set -CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y -# CONFIG_SND_USB_UA101 is not set -# CONFIG_SND_USB_CAIAQ is not set -# CONFIG_SND_USB_6FIRE is not set -# CONFIG_SND_USB_HIFACE is not set -# CONFIG_SND_BCD2000 is not set -# CONFIG_SND_USB_POD is not set -# CONFIG_SND_USB_PODHD is not set -# CONFIG_SND_USB_TONEPORT is not set -# CONFIG_SND_USB_VARIAX is not set CONFIG_SND_SOC=y -CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y -# CONFIG_SND_SOC_AMD_ACP is not set -# CONFIG_SND_ATMEL_SOC is not set -# CONFIG_SND_DESIGNWARE_I2S is not set - -# -# SoC Audio for Freescale CPUs -# - -# -# Common SoC Audio options for Freescale CPUs: -# -# CONFIG_SND_SOC_FSL_ASRC is not set -# CONFIG_SND_SOC_FSL_SAI is not set -# CONFIG_SND_SOC_FSL_SSI is not set -# CONFIG_SND_SOC_FSL_SPDIF is not set -# CONFIG_SND_SOC_FSL_ESAI is not set -# CONFIG_SND_SOC_IMX_AUDMUX is not set -# CONFIG_SND_I2S_HI6210_I2S is not set -# CONFIG_SND_SOC_IMG is not set +CONFIG_SND_SOC_FSL_SAI=y CONFIG_SND_SOC_ROCKCHIP=y -CONFIG_SND_SOC_ROCKCHIP_PREALLOC_BUFFER_SIZE=512 -# CONFIG_SND_SOC_ROCKCHIP_AUDIO_PWM is not set -CONFIG_SND_SOC_ROCKCHIP_I2S=y CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y CONFIG_SND_SOC_ROCKCHIP_PDM=y CONFIG_SND_SOC_ROCKCHIP_SPDIF=y -# CONFIG_SND_SOC_ROCKCHIP_VAD is not set -CONFIG_SND_SOC_ROCKCHIP_MAX98090=y -CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y -CONFIG_SND_SOC_ROCKCHIP_RT5645=y -# CONFIG_SND_SOC_ROCKCHIP_RT5651 is not set -CONFIG_SND_SOC_ROCKCHIP_RT5651_RK628=y -# CONFIG_SND_SOC_RK3288_HDMI_ANALOG is not set -# CONFIG_SND_SOC_RK3399_GRU_SOUND is not set - -# -# STMicroelectronics STM32 SOC audio support -# -# CONFIG_SND_SOC_XTFPGA_I2S is not set -# CONFIG_ZX_TDM is not set -CONFIG_SND_SOC_I2C_AND_SPI=y - -# -# CODEC drivers -# -# CONFIG_SND_SOC_AC97_CODEC is not set -# CONFIG_SND_SOC_ADAU1701 is not set -# CONFIG_SND_SOC_ADAU1761_I2C is not set -# CONFIG_SND_SOC_ADAU1761_SPI is not set -# CONFIG_SND_SOC_ADAU7002 is not set -# CONFIG_SND_SOC_AK4104 is not set -# CONFIG_SND_SOC_AK4458 is not set -# CONFIG_SND_SOC_AK4554 is not set -# CONFIG_SND_SOC_AK4613 is not set -# CONFIG_SND_SOC_AK4642 is not set -# CONFIG_SND_SOC_AK5386 is not set -# CONFIG_SND_SOC_AK5558 is not set -# CONFIG_SND_SOC_ALC5623 is not set -# CONFIG_SND_SOC_BD28623 is not set -# CONFIG_SND_SOC_BT_SCO is not set -# CONFIG_SND_SOC_CS35L32 is not set -# CONFIG_SND_SOC_CS35L33 is not set -# CONFIG_SND_SOC_CS35L34 is not set -# CONFIG_SND_SOC_CS35L35 is not set -# CONFIG_SND_SOC_CS42L42 is not set -# CONFIG_SND_SOC_CS42L51_I2C is not set -# CONFIG_SND_SOC_CS42L52 is not set -# CONFIG_SND_SOC_CS42L56 is not set -# CONFIG_SND_SOC_CS42L73 is not set -# CONFIG_SND_SOC_CS4265 is not set -# CONFIG_SND_SOC_CS4270 is not set -# CONFIG_SND_SOC_CS4271_I2C is not set -# CONFIG_SND_SOC_CS4271_SPI is not set -# CONFIG_SND_SOC_CS42XX8_I2C is not set -# CONFIG_SND_SOC_CS43130 is not set -# CONFIG_SND_SOC_CS4349 is not set -# CONFIG_SND_SOC_CS53L30 is not set -# CONFIG_SND_SOC_CX2072X is not set -CONFIG_SND_SOC_DUMMY_CODEC=y -CONFIG_SND_SOC_HDMI_CODEC=y -# CONFIG_SND_SOC_ES7134 is not set -CONFIG_SND_SOC_ES7202=y -# CONFIG_SND_SOC_ES7210 is not set -# CONFIG_SND_SOC_ES7241 is not set -CONFIG_SND_SOC_ES7243E=y -CONFIG_SND_SOC_ES8311=y +CONFIG_SND_SOC_RK3288_HDMI_ANALOG=y CONFIG_SND_SOC_ES8316=y -# CONFIG_SND_SOC_ES8323 is not set -# CONFIG_SND_SOC_ES8328_I2C is not set -# CONFIG_SND_SOC_ES8328_SPI is not set -# CONFIG_SND_SOC_ES8396 is not set -# CONFIG_SND_SOC_GTM601 is not set -# CONFIG_SND_SOC_INNO_RK3036 is not set CONFIG_SND_SOC_MAX98090=y -# CONFIG_SND_SOC_MAX98504 is not set -# CONFIG_SND_SOC_MAX9867 is not set -# CONFIG_SND_SOC_MAX98927 is not set -# CONFIG_SND_SOC_MAX98373 is not set -# CONFIG_SND_SOC_MAX9860 is not set -# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set -# CONFIG_SND_SOC_PCM1681 is not set -# CONFIG_SND_SOC_PCM1789_I2C is not set -# CONFIG_SND_SOC_PCM179X_I2C is not set -# CONFIG_SND_SOC_PCM179X_SPI is not set -# CONFIG_SND_SOC_PCM186X_I2C is not set -# CONFIG_SND_SOC_PCM186X_SPI is not set -# CONFIG_SND_SOC_PCM3168A_I2C is not set -# CONFIG_SND_SOC_PCM3168A_SPI is not set -# CONFIG_SND_SOC_PCM512x_I2C is not set -# CONFIG_SND_SOC_PCM512x_SPI is not set -# CONFIG_SND_SOC_RK312X is not set -# CONFIG_SND_SOC_RK3228 is not set -CONFIG_SND_SOC_RK3308=y -CONFIG_SND_SOC_RK3328=y CONFIG_SND_SOC_RK817=y -CONFIG_SND_SOC_RK_CODEC_DIGITAL=y -CONFIG_SND_SOC_RL6231=y -CONFIG_SND_SOC_RT5616=y -# CONFIG_SND_SOC_RT5631 is not set -CONFIG_SND_SOC_RT5640=y -CONFIG_SND_SOC_RT5645=y -CONFIG_SND_SOC_RT5651=y -# CONFIG_SND_SOC_SGTL5000 is not set -# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set -# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set +CONFIG_SND_SOC_SIMPLE_AMPLIFIER=y CONFIG_SND_SOC_SPDIF=y -# CONFIG_SND_SOC_SSM2305 is not set -# CONFIG_SND_SOC_SSM2602_SPI is not set -# CONFIG_SND_SOC_SSM2602_I2C is not set -# CONFIG_SND_SOC_SSM4567 is not set -# CONFIG_SND_SOC_STA32X is not set -# CONFIG_SND_SOC_STA350 is not set -# CONFIG_SND_SOC_STI_SAS is not set -# CONFIG_SND_SOC_TAS2552 is not set -# CONFIG_SND_SOC_TAS5086 is not set -# CONFIG_SND_SOC_TAS571X is not set -# CONFIG_SND_SOC_TAS5720 is not set -# CONFIG_SND_SOC_TAS6424 is not set -# CONFIG_SND_SOC_TDA7419 is not set -# CONFIG_SND_SOC_TFA9879 is not set -# CONFIG_SND_SOC_TLV320AIC23_I2C is not set -# CONFIG_SND_SOC_TLV320AIC23_SPI is not set -# CONFIG_SND_SOC_TLV320AIC31XX is not set -# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set -# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set -# CONFIG_SND_SOC_TLV320AIC3X is not set CONFIG_SND_SOC_TS3A227E=y -# CONFIG_SND_SOC_TSCS42XX is not set -# CONFIG_SND_SOC_TSCS454 is not set -# CONFIG_SND_SOC_WM8510 is not set -# CONFIG_SND_SOC_WM8523 is not set -# CONFIG_SND_SOC_WM8524 is not set -# CONFIG_SND_SOC_WM8580 is not set -# CONFIG_SND_SOC_WM8711 is not set -# CONFIG_SND_SOC_WM8728 is not set -# CONFIG_SND_SOC_WM8731 is not set -# CONFIG_SND_SOC_WM8737 is not set -# CONFIG_SND_SOC_WM8741 is not set -# CONFIG_SND_SOC_WM8750 is not set -# CONFIG_SND_SOC_WM8753 is not set -# CONFIG_SND_SOC_WM8770 is not set -# CONFIG_SND_SOC_WM8776 is not set -# CONFIG_SND_SOC_WM8782 is not set -# CONFIG_SND_SOC_WM8804_I2C is not set -# CONFIG_SND_SOC_WM8804_SPI is not set -# CONFIG_SND_SOC_WM8903 is not set -# CONFIG_SND_SOC_WM8960 is not set -# CONFIG_SND_SOC_WM8962 is not set -# CONFIG_SND_SOC_WM8974 is not set -# CONFIG_SND_SOC_WM8978 is not set -# CONFIG_SND_SOC_WM8985 is not set -# CONFIG_SND_SOC_ZX_AUD96P22 is not set -# CONFIG_SND_SOC_MAX9759 is not set -# CONFIG_SND_SOC_MT6351 is not set -# CONFIG_SND_SOC_NAU8540 is not set -# CONFIG_SND_SOC_NAU8810 is not set -# CONFIG_SND_SOC_NAU8824 is not set -# CONFIG_SND_SOC_TPA6130A2 is not set -CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y -# CONFIG_SND_SIMPLE_SCU_CARD is not set -# CONFIG_SND_AUDIO_GRAPH_CARD is not set -# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set - -# -# HID support -# -CONFIG_HID=y +CONFIG_SND_AUDIO_GRAPH_CARD=y +CONFIG_SND_AUDIO_GRAPH_CARD2=y +CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE=y +CONFIG_SND_TEST_COMPONENT=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y CONFIG_UHID=y -CONFIG_HID_GENERIC=y - -# -# Special HID drivers -# -# CONFIG_HID_A4TECH is not set -# CONFIG_HID_ACCUTOUCH is not set -# CONFIG_HID_ACRUX is not set -# CONFIG_HID_APPLE is not set -# CONFIG_HID_APPLEIR is not set -# CONFIG_HID_ASUS is not set -# CONFIG_HID_AUREAL is not set -# CONFIG_HID_BELKIN is not set -# CONFIG_HID_BETOP_FF is not set -# CONFIG_HID_CHERRY is not set -# CONFIG_HID_CHICONY is not set -# CONFIG_HID_CORSAIR is not set -# CONFIG_HID_COUGAR is not set -# CONFIG_HID_PRODIKEYS is not set -# CONFIG_HID_CMEDIA is not set -# CONFIG_HID_CP2112 is not set -# CONFIG_HID_CYPRESS is not set -# CONFIG_HID_DRAGONRISE is not set -# CONFIG_HID_EMS_FF is not set -# CONFIG_HID_ELAN is not set -# CONFIG_HID_ELECOM is not set -# CONFIG_HID_ELO is not set -# CONFIG_HID_EZKEY is not set -# CONFIG_HID_GEMBIRD is not set -# CONFIG_HID_GFRM is not set -# CONFIG_HID_HOLTEK is not set -# CONFIG_HID_GOOGLE_HAMMER is not set -# CONFIG_HID_GT683R is not set -# CONFIG_HID_KEYTOUCH is not set -# CONFIG_HID_KYE is not set -# CONFIG_HID_UCLOGIC is not set -# CONFIG_HID_WALTOP is not set -# CONFIG_HID_GYRATION is not set -# CONFIG_HID_ICADE is not set -# CONFIG_HID_ITE is not set -# CONFIG_HID_JABRA is not set -# CONFIG_HID_TWINHAN is not set +CONFIG_HID_A4TECH=y +CONFIG_HID_ACRUX=y +CONFIG_HID_APPLE=y +CONFIG_HID_APPLEIR=y +CONFIG_HID_AUREAL=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BETOP_FF=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CORSAIR=y +CONFIG_HID_PRODIKEYS=y +CONFIG_HID_CP2112=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_DRAGONRISE=y +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=y +CONFIG_HID_ELECOM=y +CONFIG_HID_ELO=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GEMBIRD=y +CONFIG_HID_GFRM=y +CONFIG_HID_HOLTEK=y +CONFIG_HOLTEK_FF=y +CONFIG_HID_GT683R=y +CONFIG_HID_KEYTOUCH=y +CONFIG_HID_KYE=y +CONFIG_HID_UCLOGIC=y +CONFIG_HID_WALTOP=y +CONFIG_HID_GYRATION=y +CONFIG_HID_ICADE=y +CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y -# CONFIG_HID_LCPOWER is not set -# CONFIG_HID_LED is not set -# CONFIG_HID_LENOVO is not set -# CONFIG_HID_LOGITECH is not set -# CONFIG_HID_MAGICMOUSE is not set -# CONFIG_HID_MAYFLASH is not set -# CONFIG_HID_REDRAGON is not set -# CONFIG_HID_MICROSOFT is not set -# CONFIG_HID_MONTEREY is not set +CONFIG_HID_LCPOWER=y +CONFIG_HID_LENOVO=y +CONFIG_HID_LOGITECH=y +CONFIG_HID_LOGITECH_DJ=y +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=y -# CONFIG_HID_NINTENDO is not set -# CONFIG_HID_NTI is not set -# CONFIG_HID_NTRIG is not set -# CONFIG_HID_ORTEK is not set -# CONFIG_HID_PANTHERLORD is not set -# CONFIG_HID_PENMOUNT is not set -# CONFIG_HID_PETALYNX is not set -# CONFIG_HID_PICOLCD is not set -# CONFIG_HID_PLANTRONICS is not set -# CONFIG_HID_PRIMAX is not set -# CONFIG_HID_RETRODE is not set -# CONFIG_HID_ROCCAT is not set -# CONFIG_HID_SAITEK is not set -# CONFIG_HID_SAMSUNG is not set -# CONFIG_HID_SONY is not set -# CONFIG_HID_SPEEDLINK is not set -# CONFIG_HID_STEAM is not set -# CONFIG_HID_STEELSERIES is not set -# CONFIG_HID_SUNPLUS is not set -# CONFIG_HID_RMI is not set -# CONFIG_HID_GREENASIA is not set -# CONFIG_HID_SMARTJOYPLUS is not set -# CONFIG_HID_TIVO is not set -# CONFIG_HID_TOPSEED is not set -# CONFIG_HID_THINGM is not set -# CONFIG_HID_THRUSTMASTER is not set -# CONFIG_HID_UDRAW_PS3 is not set -# CONFIG_HID_WACOM is not set -# CONFIG_HID_WIIMOTE is not set -# CONFIG_HID_XINMO is not set -# CONFIG_HID_ZEROPLUS is not set -# CONFIG_HID_ZYDACRON is not set -# CONFIG_HID_SENSOR_HUB is not set -# CONFIG_HID_ALPS is not set - -# -# USB HID support -# -CONFIG_USB_HID=y -# CONFIG_HID_PID is not set +CONFIG_HID_NTRIG=y +CONFIG_HID_ORTEK=y +CONFIG_HID_PANTHERLORD=y +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=y +CONFIG_HID_PETALYNX=y +CONFIG_HID_PLANTRONICS=y +CONFIG_HID_PRIMAX=y +CONFIG_HID_ROCCAT=y +CONFIG_HID_SAITEK=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_HID_SPEEDLINK=y +CONFIG_HID_STEELSERIES=y +CONFIG_HID_SUNPLUS=y +CONFIG_HID_RMI=y +CONFIG_HID_GREENASIA=y +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=y +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=y +CONFIG_HID_TOPSEED=y +CONFIG_HID_THINGM=y +CONFIG_HID_THRUSTMASTER=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_HID_WACOM=y +CONFIG_HID_WIIMOTE=y +CONFIG_HID_XINMO=y +CONFIG_HID_ZEROPLUS=y +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=y +CONFIG_HID_SENSOR_HUB=y +CONFIG_HID_SENSOR_CUSTOM_SENSOR=y +CONFIG_HID_ALPS=y CONFIG_USB_HIDDEV=y - -# -# I2C HID support -# -CONFIG_I2C_HID=y -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_COMMON=y -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB=y -CONFIG_USB_PCI=y +CONFIG_I2C_HID_OF_GOODIX=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y - -# -# Miscellaneous USB options -# # CONFIG_USB_DEFAULT_PERSIST is not set -# CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_OTG=y -# CONFIG_USB_OTG_WHITELIST is not set -# CONFIG_USB_OTG_BLACKLIST_HUB is not set -# CONFIG_USB_OTG_FSM is not set -# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_OTG_PRODUCTLIST=y +CONFIG_USB_OTG_FSM=y +CONFIG_USB_LEDS_TRIGGER_USBPORT=y CONFIG_USB_MON=y -# CONFIG_USB_WUSB_CBAF is not set - -# -# USB Host Controller Drivers -# -# CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y -# CONFIG_USB_XHCI_DBGCAP is not set -CONFIG_USB_XHCI_PCI=y -CONFIG_USB_XHCI_PLATFORM=y CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y -CONFIG_USB_EHCI_TT_NEWSCHED=y -CONFIG_USB_EHCI_PCI=y CONFIG_USB_EHCI_HCD_PLATFORM=y -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_FOTG210_HCD is not set -# CONFIG_USB_MAX3421_HCD is not set CONFIG_USB_OHCI_HCD=y # CONFIG_USB_OHCI_HCD_PCI is not set CONFIG_USB_OHCI_HCD_PLATFORM=y -# CONFIG_USB_UHCI_HCD is not set -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_R8A66597_HCD is not set -# CONFIG_USB_HCD_TEST_MODE is not set - -# -# USB Device Class drivers -# CONFIG_USB_ACM=y -# CONFIG_USB_PRINTER is not set -CONFIG_USB_WDM=y -# CONFIG_USB_TMC is not set - -# -# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -# - -# -# also be needed; see USB_STORAGE Help for more info -# CONFIG_USB_STORAGE=y -# CONFIG_USB_STORAGE_DEBUG is not set -# CONFIG_USB_STORAGE_REALTEK is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE_USBAT is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_ONETOUCH is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -# CONFIG_USB_STORAGE_ENE_UB6250 is not set +CONFIG_USB_STORAGE_REALTEK=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_ONETOUCH=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_STORAGE_ENE_UB6250=y CONFIG_USB_UAS=y - -# -# USB Imaging devices -# -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set -# CONFIG_USBIP_CORE is not set -# CONFIG_USB_MUSB_HDRC is not set CONFIG_USB_DWC3=y -# CONFIG_USB_DWC3_HOST is not set -# CONFIG_USB_DWC3_GADGET is not set -CONFIG_USB_DWC3_DUAL_ROLE=y - -# -# Platform Glue Driver Support -# -CONFIG_USB_DWC3_HAPS=y -CONFIG_USB_DWC3_OF_SIMPLE=y -CONFIG_USB_DWC3_ROCKCHIP_INNO=y CONFIG_USB_DWC2=y -# CONFIG_USB_DWC2_HOST is not set - -# -# Gadget/Dual-role mode requires USB Gadget support to be enabled -# -# CONFIG_USB_DWC2_PERIPHERAL is not set -CONFIG_USB_DWC2_DUAL_ROLE=y -# CONFIG_USB_DWC2_PCI is not set -# CONFIG_USB_DWC2_DEBUG is not set -# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set -# CONFIG_USB_CHIPIDEA is not set -# CONFIG_USB_ISP1760 is not set - -# -# USB port drivers -# CONFIG_USB_SERIAL=y -CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_GENERIC=y -# CONFIG_USB_SERIAL_SIMPLE is not set -# CONFIG_USB_SERIAL_AIRCABLE is not set -# CONFIG_USB_SERIAL_ARK3116 is not set -# CONFIG_USB_SERIAL_BELKIN is not set CONFIG_USB_SERIAL_CH341=y -# CONFIG_USB_SERIAL_WHITEHEAT is not set -# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set CONFIG_USB_SERIAL_CP210X=y -# CONFIG_USB_SERIAL_CYPRESS_M8 is not set -# CONFIG_USB_SERIAL_EMPEG is not set CONFIG_USB_SERIAL_FTDI_SIO=y -# CONFIG_USB_SERIAL_VISOR is not set -# CONFIG_USB_SERIAL_IPAQ is not set -# CONFIG_USB_SERIAL_IR is not set -# CONFIG_USB_SERIAL_EDGEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT_TI is not set -# CONFIG_USB_SERIAL_F81232 is not set -# CONFIG_USB_SERIAL_F8153X is not set -# CONFIG_USB_SERIAL_GARMIN is not set -# CONFIG_USB_SERIAL_IPW is not set -# CONFIG_USB_SERIAL_IUU is not set -# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set CONFIG_USB_SERIAL_KEYSPAN=y -# CONFIG_USB_SERIAL_KLSI is not set -# CONFIG_USB_SERIAL_KOBIL_SCT is not set -# CONFIG_USB_SERIAL_MCT_U232 is not set -# CONFIG_USB_SERIAL_METRO is not set -# CONFIG_USB_SERIAL_MOS7720 is not set -# CONFIG_USB_SERIAL_MOS7840 is not set -# CONFIG_USB_SERIAL_MXUPORT is not set -# CONFIG_USB_SERIAL_NAVMAN is not set CONFIG_USB_SERIAL_PL2303=y CONFIG_USB_SERIAL_OTI6858=y -# CONFIG_USB_SERIAL_QCAUX is not set CONFIG_USB_SERIAL_QUALCOMM=y -# CONFIG_USB_SERIAL_SPCP8X5 is not set -# CONFIG_USB_SERIAL_SAFE is not set CONFIG_USB_SERIAL_SIERRAWIRELESS=y -# CONFIG_USB_SERIAL_SYMBOL is not set -# CONFIG_USB_SERIAL_TI is not set -# CONFIG_USB_SERIAL_CYBERJACK is not set -# CONFIG_USB_SERIAL_XIRCOM is not set -CONFIG_USB_SERIAL_WWAN=y CONFIG_USB_SERIAL_OPTION=y -# CONFIG_USB_SERIAL_OMNINET is not set -# CONFIG_USB_SERIAL_OPTICON is not set -# CONFIG_USB_SERIAL_XSENS_MT is not set -# CONFIG_USB_SERIAL_WISHBONE is not set -# CONFIG_USB_SERIAL_SSU100 is not set -# CONFIG_USB_SERIAL_QT2 is not set -# CONFIG_USB_SERIAL_UPD78F0730 is not set -# CONFIG_USB_SERIAL_DEBUG is not set - -# -# USB Miscellaneous drivers -# -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_ADUTUX is not set -# CONFIG_USB_SEVSEG is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_FTDI_ELAN is not set -# CONFIG_USB_APPLEDISPLAY is not set -# CONFIG_USB_SISUSBVGA is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB_TEST is not set -# CONFIG_USB_EHSET_TEST_FIXTURE is not set -# CONFIG_USB_ISIGHTFW is not set -# CONFIG_USB_YUREX is not set -CONFIG_USB_EZUSB_FX2=y -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set -# CONFIG_USB_LINK_LAYER_TEST is not set -# CONFIG_USB_CHAOSKEY is not set - -# -# USB Physical Layer drivers -# -CONFIG_USB_PHY=y -# CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_GPIO_VBUS is not set -# CONFIG_USB_ISP1301 is not set -# CONFIG_USB_ULPI is not set +CONFIG_NOP_USB_XCEIV=y CONFIG_USB_GADGET=y -# CONFIG_USB_GADGET_DEBUG is not set CONFIG_USB_GADGET_DEBUG_FILES=y -# CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=500 -CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 -# CONFIG_U_SERIAL_CONSOLE is not set - -# -# USB Peripheral Controller -# -# CONFIG_USB_FOTG210_UDC is not set -# CONFIG_USB_GR_UDC is not set -# CONFIG_USB_R8A66597 is not set -# CONFIG_USB_PXA27X is not set -# CONFIG_USB_MV_UDC is not set -# CONFIG_USB_MV_U3D is not set -# CONFIG_USB_SNP_UDC_PLAT is not set -# CONFIG_USB_M66592 is not set -# CONFIG_USB_BDC_UDC is not set -# CONFIG_USB_AMD5536UDC is not set -# CONFIG_USB_NET2272 is not set -# CONFIG_USB_NET2280 is not set -# CONFIG_USB_GOKU is not set -# CONFIG_USB_EG20T is not set -# CONFIG_USB_GADGET_XILINX is not set -# CONFIG_USB_DUMMY_HCD is not set -CONFIG_USB_LIBCOMPOSITE=y -CONFIG_USB_F_ACM=y -CONFIG_USB_U_SERIAL=y -CONFIG_USB_F_MASS_STORAGE=y -CONFIG_USB_F_FS=y -CONFIG_USB_F_UVC=y +CONFIG_U_SERIAL_CONSOLE=y CONFIG_USB_CONFIGFS=y -CONFIG_USB_CONFIGFS_UEVENT=y -# CONFIG_USB_CONFIGFS_SERIAL is not set CONFIG_USB_CONFIGFS_ACM=y -# CONFIG_USB_CONFIGFS_OBEX is not set -# CONFIG_USB_CONFIGFS_NCM is not set -# CONFIG_USB_CONFIGFS_ECM is not set -# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set -# CONFIG_USB_CONFIGFS_RNDIS is not set -# CONFIG_USB_CONFIGFS_EEM is not set CONFIG_USB_CONFIGFS_MASS_STORAGE=y -# CONFIG_USB_CONFIGFS_F_LB_SS is not set CONFIG_USB_CONFIGFS_F_FS=y -# CONFIG_USB_CONFIGFS_F_ACC is not set -# CONFIG_USB_CONFIGFS_F_AUDIO_SRC is not set -# CONFIG_USB_CONFIGFS_F_UAC1 is not set -# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set -# CONFIG_USB_CONFIGFS_F_UAC2 is not set -# CONFIG_USB_CONFIGFS_F_MIDI is not set -# CONFIG_USB_CONFIGFS_F_HID is not set CONFIG_USB_CONFIGFS_F_UVC=y -# CONFIG_USB_CONFIGFS_F_PRINTER is not set -# CONFIG_TYPEC is not set -# CONFIG_USB_ROLE_SWITCH is not set -# CONFIG_USB_LED_TRIG is not set -# CONFIG_USB_ULPI_BUS is not set -# CONFIG_UWB is not set -# CONFIG_USB_ZERO is not set -# CONFIG_USB_AUDIO is not set -# CONFIG_USB_ETH is not set -# CONFIG_USB_G_NCM is not set CONFIG_USB_GADGETFS=m CONFIG_USB_FUNCTIONFS=m -# CONFIG_USB_FUNCTIONFS_ETH is not set -# CONFIG_USB_FUNCTIONFS_RNDIS is not set -CONFIG_USB_FUNCTIONFS_GENERIC=y CONFIG_USB_MASS_STORAGE=m CONFIG_USB_G_SERIAL=m -# CONFIG_USB_MIDI_GADGET is not set -# CONFIG_USB_G_PRINTER is not set -# CONFIG_USB_CDC_COMPOSITE is not set -# CONFIG_USB_G_ACM_MS is not set -# CONFIG_USB_G_MULTI is not set -# CONFIG_USB_G_HID is not set -# CONFIG_USB_G_DBGP is not set -# CONFIG_USB_G_WEBCAM is not set -# CONFIG_USB_RAW_GADGET is not set - +CONFIG_TYPEC=y +CONFIG_TYPEC_TCPM=y +CONFIG_TYPEC_FUSB302=y +CONFIG_TYPEC_DP_ALTMODE=y CONFIG_MMC=y -CONFIG_PWRSEQ_EMMC=y -# CONFIG_PWRSEQ_SD8787 is not set -CONFIG_PWRSEQ_SIMPLE=y -CONFIG_MMC_BLOCK=y CONFIG_MMC_BLOCK_MINORS=32 -# CONFIG_SDIO_UART is not set CONFIG_MMC_TEST=y -CONFIG_SDIO_KEEPALIVE=y - -# -# MMC/SD/SDIO Host Controller Drivers -# -# CONFIG_MMC_DEBUG is not set -# CONFIG_MMC_ARMMMCI is not set CONFIG_MMC_SDHCI=y -# CONFIG_MMC_SDHCI_PCI is not set CONFIG_MMC_SDHCI_PLTFM=y -CONFIG_MMC_SDHCI_OF_ARASAN=y -# CONFIG_MMC_SDHCI_OF_AT91 is not set CONFIG_MMC_SDHCI_OF_DWCMSHC=y -# CONFIG_MMC_SDHCI_CADENCE is not set -# CONFIG_MMC_SDHCI_F_SDH30 is not set -# CONFIG_MMC_TIFM_SD is not set -# CONFIG_MMC_SPI is not set -# CONFIG_MMC_CB710 is not set -# CONFIG_MMC_VIA_SDMMC is not set CONFIG_MMC_DW=y -CONFIG_MMC_DW_PLTFM=y -# CONFIG_MMC_DW_BLUEFIELD is not set -# CONFIG_MMC_DW_EXYNOS is not set -# CONFIG_MMC_DW_HI3798CV200 is not set -# CONFIG_MMC_DW_K3 is not set -# CONFIG_MMC_DW_PCI is not set CONFIG_MMC_DW_ROCKCHIP=y -# CONFIG_MMC_VUB300 is not set -# CONFIG_MMC_USHC is not set -# CONFIG_MMC_USDHI6ROL0 is not set -CONFIG_MMC_CQHCI=y -# CONFIG_MMC_TOSHIBA_PCI is not set -# CONFIG_MMC_MTK is not set -# CONFIG_MMC_SDHCI_XENON is not set -# CONFIG_MMC_SDHCI_OMAP is not set -# CONFIG_MEMSTICK is not set -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y -CONFIG_LEDS_CLASS_FLASH=y -# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set - -# -# LED drivers -# -# CONFIG_LEDS_AAT1290 is not set -# CONFIG_LEDS_AS3645A is not set -# CONFIG_LEDS_BCM6328 is not set -# CONFIG_LEDS_BCM6358 is not set -# CONFIG_LEDS_CR0014114 is not set -# CONFIG_LEDS_LM3530 is not set -# CONFIG_LEDS_LM3642 is not set -# CONFIG_LEDS_LM3692X is not set -# CONFIG_LEDS_LM3601X is not set -# CONFIG_LEDS_PCA9532 is not set +CONFIG_MMC_HSQ=y CONFIG_LEDS_GPIO=y -# CONFIG_LEDS_LP3944 is not set -# CONFIG_LEDS_LP3952 is not set -# CONFIG_LEDS_LP5521 is not set -# CONFIG_LEDS_LP5523 is not set -# CONFIG_LEDS_LP5562 is not set -# CONFIG_LEDS_LP8501 is not set -# CONFIG_LEDS_LP8860 is not set -# CONFIG_LEDS_PCA955X is not set -# CONFIG_LEDS_PCA963X is not set -# CONFIG_LEDS_DAC124S085 is not set -# CONFIG_LEDS_PWM is not set -# CONFIG_LEDS_REGULATOR is not set -# CONFIG_LEDS_BD2802 is not set -# CONFIG_LEDS_LT3593 is not set -# CONFIG_LEDS_TCA6507 is not set -# CONFIG_LEDS_TLC591XX is not set -# CONFIG_LEDS_LM355x is not set -# CONFIG_LEDS_KTD2692 is not set -# CONFIG_LEDS_IS31FL319X is not set +CONFIG_LEDS_PWM=y CONFIG_LEDS_IS31FL32XX=y -CONFIG_LEDS_RGB13H=y - -# -# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) -# -# CONFIG_LEDS_BLINKM is not set -# CONFIG_LEDS_SYSCON is not set -# CONFIG_LEDS_MLXREG is not set -# CONFIG_LEDS_USER is not set - -# -# LED Triggers -# -CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_SYSCON=y CONFIG_LEDS_TRIGGER_TIMER=y -# CONFIG_LEDS_TRIGGER_ONESHOT is not set -# CONFIG_LEDS_TRIGGER_DISK is not set -# CONFIG_LEDS_TRIGGER_MTD is not set -# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set -# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set -# CONFIG_LEDS_TRIGGER_CPU is not set -# CONFIG_LEDS_TRIGGER_ACTIVITY is not set -# CONFIG_LEDS_TRIGGER_GPIO is not set -# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set - -# -# iptables trigger is under Netfilter config (LED target) -# -# CONFIG_LEDS_TRIGGER_TRANSIENT is not set -# CONFIG_LEDS_TRIGGER_CAMERA is not set -# CONFIG_LEDS_TRIGGER_PANIC is not set -# CONFIG_LEDS_TRIGGER_NETDEV is not set -# CONFIG_ACCESSIBILITY is not set -# CONFIG_INFINIBAND is not set -CONFIG_EDAC_SUPPORT=y -# CONFIG_EDAC is not set -CONFIG_RTC_LIB=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y CONFIG_RTC_CLASS=y -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -CONFIG_RTC_SYSTOHC=y -CONFIG_RTC_SYSTOHC_DEVICE="rtc0" -# CONFIG_RTC_DEBUG is not set -CONFIG_RTC_NVMEM=y - -# -# RTC interfaces -# -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -# CONFIG_RTC_DRV_TEST is not set - -# -# I2C RTC drivers -# -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_FAKE is not set +# CONFIG_RTC_SYSTOHC is not set +# CONFIG_RTC_INTF_PROC is not set +# CONFIG_RTC_INTF_DEV is not set CONFIG_RTC_DRV_HYM8563=y -# CONFIG_RTC_DRV_MAX6900 is not set CONFIG_RTC_DRV_RK808=y -# CONFIG_RTC_DRV_RK_TIMER is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_ISL12026 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_TPS6586X is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV8803 is not set - -# -# SPI RTC drivers -# -# CONFIG_RTC_DRV_M41T93 is not set -# CONFIG_RTC_DRV_M41T94 is not set -# CONFIG_RTC_DRV_DS1302 is not set -# CONFIG_RTC_DRV_DS1305 is not set -# CONFIG_RTC_DRV_DS1343 is not set -# CONFIG_RTC_DRV_DS1347 is not set -# CONFIG_RTC_DRV_DS1390 is not set -# CONFIG_RTC_DRV_MAX6916 is not set -# CONFIG_RTC_DRV_R9701 is not set -# CONFIG_RTC_DRV_RX4581 is not set -# CONFIG_RTC_DRV_RX6110 is not set -# CONFIG_RTC_DRV_RS5C348 is not set -# CONFIG_RTC_DRV_MAX6902 is not set -# CONFIG_RTC_DRV_PCF2123 is not set -# CONFIG_RTC_DRV_MCP795 is not set -CONFIG_RTC_I2C_AND_SPI=y - -# -# SPI and I2C RTC drivers -# -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set - -# -# Platform RTC drivers -# -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1685_FAMILY is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_DS2404 is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_BQ4802 is not set -# CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_V3020 is not set -# CONFIG_RTC_DRV_ZYNQMP is not set -# CONFIG_RTC_DRV_CROS_EC is not set - -# -# on-CPU RTC drivers -# -# CONFIG_RTC_DRV_PL030 is not set -# CONFIG_RTC_DRV_PL031 is not set -# CONFIG_RTC_DRV_FTRTC010 is not set -# CONFIG_RTC_DRV_SNVS is not set -# CONFIG_RTC_DRV_R7301 is not set - -# -# HID Sensor RTC drivers -# -# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y -# CONFIG_DMADEVICES_DEBUG is not set - -# -# DMA Devices -# -CONFIG_DMA_ENGINE=y -CONFIG_DMA_OF=y -# CONFIG_ALTERA_MSGDMA is not set -# CONFIG_AMBA_PL08X is not set -# CONFIG_DW_AXI_DMAC is not set -# CONFIG_FSL_EDMA is not set -# CONFIG_INTEL_IDMA64 is not set -# CONFIG_MV_XOR_V2 is not set CONFIG_PL330_DMA=y -# CONFIG_XILINX_DMA is not set -# CONFIG_XILINX_ZYNQMP_DMA is not set -# CONFIG_QCOM_HIDMA_MGMT is not set -# CONFIG_QCOM_HIDMA is not set -# CONFIG_DW_DMAC is not set -# CONFIG_DW_DMAC_PCI is not set - -# -# DMA Clients -# -# CONFIG_ASYNC_TX_DMA is not set -# CONFIG_DMATEST is not set - -# -# DMABUF options -# -CONFIG_SYNC_FILE=y -# CONFIG_SW_SYNC is not set -# CONFIG_AUXDISPLAY is not set -# CONFIG_UIO is not set -# CONFIG_VFIO is not set -# CONFIG_VIRT_DRIVERS is not set -CONFIG_VIRTIO_MENU=y -# CONFIG_VIRTIO_PCI is not set -# CONFIG_VIRTIO_MMIO is not set - -# -# Microsoft Hyper-V guest support -# +CONFIG_UDMABUF=y +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VHOST_MENU is not set CONFIG_STAGING=y -# CONFIG_PRISM2_USB is not set -# CONFIG_COMEDI is not set -# CONFIG_RTL8192U is not set -# CONFIG_RTLLIB is not set -# CONFIG_RTL8723BS is not set -# CONFIG_R8712U is not set -# CONFIG_R8188EU is not set -# CONFIG_R8822BE is not set -# CONFIG_RTS5208 is not set -# CONFIG_VT6655 is not set -# CONFIG_VT6656 is not set - -# -# IIO staging drivers -# - -# -# Accelerometers -# -# CONFIG_ADIS16203 is not set -# CONFIG_ADIS16240 is not set - -# -# Analog to digital converters -# -# CONFIG_AD7606 is not set -# CONFIG_AD7780 is not set -# CONFIG_AD7816 is not set -# CONFIG_AD7192 is not set -# CONFIG_AD7280 is not set - -# -# Analog digital bi-direction converters -# -# CONFIG_ADT7316 is not set - -# -# Capacitance to digital converters -# -# CONFIG_AD7150 is not set -# CONFIG_AD7152 is not set -# CONFIG_AD7746 is not set - -# -# Direct Digital Synthesis -# -# CONFIG_AD9832 is not set -# CONFIG_AD9834 is not set - -# -# Network Analyzer, Impedance Converters -# -# CONFIG_AD5933 is not set - -# -# Active energy metering IC -# -# CONFIG_ADE7854 is not set - -# -# Resolver to digital converters -# -# CONFIG_AD2S90 is not set -# CONFIG_AD2S1210 is not set -# CONFIG_FB_SM750 is not set -# CONFIG_FB_XGI is not set - -# -# Speakup console speech -# -# CONFIG_SPEAKUP is not set -# CONFIG_STAGING_MEDIA is not set - -# -# Android -# -# CONFIG_ASHMEM is not set -# CONFIG_ANDROID_VSOC is not set -# CONFIG_ION is not set -CONFIG_FIQ_DEBUGGER=y -CONFIG_FIQ_DEBUGGER_NO_SLEEP=y -# CONFIG_FIQ_DEBUGGER_WAKEUP_IRQ_ALWAYS_ON is not set -CONFIG_FIQ_DEBUGGER_CONSOLE=y -CONFIG_FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE=y -CONFIG_FIQ_DEBUGGER_TRUST_ZONE=y -# CONFIG_FIQ_DEBUGGER_UART_OVERLAY is not set -CONFIG_RK_CONSOLE_THREAD=y -# CONFIG_STAGING_BOARD is not set -# CONFIG_LTE_GDM724X is not set -# CONFIG_DGNC is not set -# CONFIG_GS_FPGABOOT is not set -# CONFIG_UNISYSSPAR is not set -# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set -# CONFIG_FB_TFT is not set -# CONFIG_WILC1000_SDIO is not set -# CONFIG_WILC1000_SPI is not set -# CONFIG_MOST is not set -# CONFIG_KS7010 is not set -# CONFIG_GREYBUS is not set -# CONFIG_PI433 is not set -# CONFIG_MTK_MMC is not set - -# -# Gasket devices -# -# CONFIG_STAGING_GASKET_FRAMEWORK is not set -# CONFIG_XIL_AXIS_FIFO is not set -# CONFIG_EROFS_FS is not set -# CONFIG_POWERVR_ROGUE_N is not set -# CONFIG_GOLDFISH is not set +CONFIG_RTL8723BS=m +CONFIG_R8712U=m +CONFIG_STAGING_MEDIA=y +CONFIG_VIDEO_ROCKCHIP_VDEC=y CONFIG_CHROME_PLATFORMS=y -# CONFIG_CROS_EC_I2C is not set -# CONFIG_CROS_EC_SPI is not set -CONFIG_CROS_EC_PROTO=y -CONFIG_CLKDEV_LOOKUP=y -CONFIG_HAVE_CLK_PREPARE=y -CONFIG_COMMON_CLK=y - -# -# Common Clock Framework -# -CONFIG_COMMON_CLK_DEBUGFS=y -# CONFIG_COMMON_CLK_PROCFS is not set -# CONFIG_COMMON_CLK_VERSATILE is not set -# CONFIG_CLK_HSDK is not set -# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_SURFACE_PLATFORMS is not set CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCMI=y -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI514 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_SI570 is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CDCE925 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set -# CONFIG_CLK_QORIQ is not set +CONFIG_COMMON_CLK_SCPI=y CONFIG_COMMON_CLK_XGENE=y -# CONFIG_COMMON_CLK_PWM is not set -# CONFIG_COMMON_CLK_VC5 is not set -# CONFIG_ROCKCHIP_CLK_COMPENSATION is not set -CONFIG_COMMON_CLK_ROCKCHIP_REGMAP=y -CONFIG_CLK_RK618=y -CONFIG_CLK_RK628=y -# CONFIG_HWSPINLOCK is not set - -# -# Clock Source drivers -# -CONFIG_TIMER_OF=y -CONFIG_TIMER_PROBE=y -CONFIG_CLKSRC_MMIO=y -CONFIG_ROCKCHIP_TIMER=y -CONFIG_ARM_ARCH_TIMER=y -CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y -CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y -CONFIG_FSL_ERRATUM_A008585=y -CONFIG_HISILICON_ERRATUM_161010101=y -CONFIG_ARM64_ERRATUM_858921=y -# CONFIG_ARM_TIMER_SP804 is not set +CONFIG_COMMON_CLK_PWM=y +CONFIG_COMMON_CLK_FIXED_MMIO=y +# CONFIG_CLK_RK3308 is not set +# CONFIG_CLK_RK3328 is not set +# CONFIG_CLK_RK3368 is not set +# CONFIG_CLK_RK3399 is not set +# CONFIG_FSL_ERRATUM_A008585 is not set +# CONFIG_HISILICON_ERRATUM_161010101 is not set +# CONFIG_ARM64_ERRATUM_858921 is not set CONFIG_MAILBOX=y -# CONFIG_ARM_MHU is not set -# CONFIG_PLATFORM_MHU is not set -# CONFIG_PL320_MBOX is not set -# CONFIG_ROCKCHIP_MBOX is not set -# CONFIG_ALTERA_MBOX is not set -# CONFIG_MAILBOX_TEST is not set -# CONFIG_RK3368_MBOX is not set -CONFIG_IOMMU_API=y -CONFIG_IOMMU_SUPPORT=y - -# -# Generic IOMMU Pagetable Support -# -# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set -# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set -# CONFIG_IOMMU_DEBUGFS is not set -# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set -CONFIG_IOMMU_IOVA=y -CONFIG_OF_IOMMU=y -CONFIG_IOMMU_DMA=y +CONFIG_ARM_MHU=y +CONFIG_PLATFORM_MHU=y +CONFIG_ROCKCHIP_MBOX=y CONFIG_ROCKCHIP_IOMMU=y -# CONFIG_ARM_SMMU is not set -# CONFIG_ARM_SMMU_V3 is not set - -# -# Remoteproc drivers -# -# CONFIG_REMOTEPROC is not set - -# -# Rpmsg drivers -# -# CONFIG_RPMSG_QCOM_GLINK_RPM is not set -# CONFIG_RPMSG_VIRTIO is not set - -# -# SOC (System On Chip) specific Drivers -# - -# -# Amlogic SoC drivers -# - -# -# Broadcom SoC drivers -# -# CONFIG_SOC_BRCMSTB is not set - -# -# NXP/Freescale QorIQ SoC drivers -# - -# -# i.MX SoC drivers -# - -# -# Qualcomm SoC drivers -# - -# -# Rockchip CPU selection -# -CONFIG_CPU_PX30=y -CONFIG_CPU_RK1808=y -# CONFIG_CPU_RK3308 is not set -CONFIG_CPU_RK3328=y -# CONFIG_CPU_RK3368 is not set -CONFIG_CPU_RK3399=y -CONFIG_CPU_RK3568=y -CONFIG_ANDROID_VERSION=0x08010000 -CONFIG_ROCKCHIP_CPUINFO=y -CONFIG_ROCKCHIP_GRF=y -# CONFIG_ROCKCHIP_HW_DECOMPRESS is not set -CONFIG_ROCKCHIP_IPA=y -CONFIG_ROCKCHIP_OPP=y +CONFIG_ARM_SMMU=y +CONFIG_ARM_SMMU_V3=y +CONFIG_ROCKCHIP_IODOMAIN=y CONFIG_ROCKCHIP_PM_DOMAINS=y -CONFIG_ROCKCHIP_PVTM=y -# CONFIG_ROCKCHIP_RAMDISK is not set -CONFIG_ROCKCHIP_SUSPEND_MODE=y -CONFIG_ROCKCHIP_SYSTEM_MONITOR=y -CONFIG_ROCKCHIP_MTD_VENDOR_STORAGE=y -CONFIG_ROCKCHIP_VENDOR_STORAGE_UPDATE_LOADER=y -CONFIG_ROCKCHIP_DEBUG=y -# CONFIG_ROCKCHIP_LOW_PERFORMANCE is not set -# CONFIG_ROCKCHIP_THUNDER_BOOT is not set -CONFIG_ROCKCHIP_SCHED_PERFORMANCE_BIAS=y -# CONFIG_SOC_TI is not set - -# -# Xilinx SoC drivers -# -# CONFIG_XILINX_VCU is not set -CONFIG_PM_DEVFREQ=y - -# -# DEVFREQ Governors -# -CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DEVFREQ_GOV_PERFORMANCE=y CONFIG_DEVFREQ_GOV_POWERSAVE=y -CONFIG_DEVFREQ_GOV_USERSPACE=y -# CONFIG_DEVFREQ_GOV_PASSIVE is not set - -# -# DEVFREQ Drivers -# -CONFIG_ARM_ROCKCHIP_BUS_DEVFREQ=y -CONFIG_ARM_ROCKCHIP_DMC_DEVFREQ=y -# CONFIG_ARM_ROCKCHIP_DMC_DEBUG is not set -CONFIG_PM_DEVFREQ_EVENT=y -CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y -# CONFIG_DEVFREQ_EVENT_ROCKCHIP_NOCP is not set -CONFIG_EXTCON=y - -# -# Extcon Device Drivers -# -# CONFIG_EXTCON_ADC_JACK is not set -# CONFIG_EXTCON_GPIO is not set -# CONFIG_EXTCON_MAX3355 is not set -# CONFIG_EXTCON_RT8973A is not set -# CONFIG_EXTCON_SM5502 is not set -# CONFIG_EXTCON_USB_GPIO is not set -# CONFIG_EXTCON_USBC_CROS_EC is not set +CONFIG_ARM_RK3399_DMC_DEVFREQ=y CONFIG_MEMORY=y -# CONFIG_ARM_PL172_MPMC is not set CONFIG_IIO=y -CONFIG_IIO_BUFFER=y -# CONFIG_IIO_BUFFER_CB is not set -# CONFIG_IIO_BUFFER_HW_CONSUMER is not set -CONFIG_IIO_KFIFO_BUF=y -# CONFIG_IIO_CONFIGFS is not set -CONFIG_IIO_TRIGGER=y -CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 -# CONFIG_IIO_SW_DEVICE is not set -# CONFIG_IIO_SW_TRIGGER is not set - -# -# Accelerometers -# -# CONFIG_ADIS16201 is not set -# CONFIG_ADIS16209 is not set -# CONFIG_ADXL345_I2C is not set -# CONFIG_ADXL345_SPI is not set -# CONFIG_BMA180 is not set -# CONFIG_BMA220 is not set -# CONFIG_BMC150_ACCEL is not set -# CONFIG_DA280 is not set -# CONFIG_DA311 is not set -# CONFIG_DMARD06 is not set -# CONFIG_DMARD09 is not set -# CONFIG_DMARD10 is not set -# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set -# CONFIG_IIO_ST_ACCEL_3AXIS is not set -# CONFIG_KXSD9 is not set -# CONFIG_KXCJK1013 is not set -# CONFIG_MC3230 is not set -# CONFIG_MMA7455_I2C is not set -# CONFIG_MMA7455_SPI is not set -# CONFIG_MMA7660 is not set -# CONFIG_MMA8452 is not set -# CONFIG_MMA9551 is not set -# CONFIG_MMA9553 is not set -# CONFIG_MXC4005 is not set -# CONFIG_MXC6255 is not set -# CONFIG_SCA3000 is not set -# CONFIG_STK8312 is not set -# CONFIG_STK8BA50 is not set - -# -# Analog to digital converters -# -# CONFIG_AD7266 is not set -# CONFIG_AD7291 is not set -# CONFIG_AD7298 is not set -# CONFIG_AD7476 is not set -# CONFIG_AD7766 is not set -# CONFIG_AD7791 is not set -# CONFIG_AD7793 is not set -# CONFIG_AD7887 is not set -# CONFIG_AD7923 is not set -# CONFIG_AD799X is not set -# CONFIG_CC10001_ADC is not set -# CONFIG_ENVELOPE_DETECTOR is not set -# CONFIG_HI8435 is not set -# CONFIG_HX711 is not set -# CONFIG_INA2XX_ADC is not set -# CONFIG_LTC2471 is not set -# CONFIG_LTC2485 is not set -# CONFIG_LTC2497 is not set -# CONFIG_MAX1027 is not set -# CONFIG_MAX11100 is not set -# CONFIG_MAX1118 is not set -# CONFIG_MAX1363 is not set -# CONFIG_MAX9611 is not set -# CONFIG_MCP320X is not set -# CONFIG_MCP3422 is not set -# CONFIG_NAU7802 is not set +CONFIG_IIO_BUFFER_HW_CONSUMER=y +CONFIG_IIO_SW_DEVICE=y +CONFIG_IIO_SW_TRIGGER=y +CONFIG_IIO_TRIGGERED_EVENT=y CONFIG_ROCKCHIP_SARADC=y -# CONFIG_ROCKCHIP_SARADC_TEST_CHN is not set -# CONFIG_SD_ADC_MODULATOR is not set -# CONFIG_TI_ADC081C is not set -# CONFIG_TI_ADC0832 is not set -# CONFIG_TI_ADC084S021 is not set -# CONFIG_TI_ADC12138 is not set -# CONFIG_TI_ADC108S102 is not set -# CONFIG_TI_ADC128S052 is not set -# CONFIG_TI_ADC161S626 is not set -# CONFIG_TI_ADS1015 is not set -# CONFIG_TI_ADS7950 is not set -# CONFIG_TI_ADS8688 is not set -# CONFIG_TI_TLC4541 is not set -# CONFIG_VF610_ADC is not set - -# -# Analog Front Ends -# -# CONFIG_IIO_RESCALE is not set - -# -# Amplifiers -# -# CONFIG_AD8366 is not set - -# -# Chemical Sensors -# -# CONFIG_ATLAS_PH_SENSOR is not set -# CONFIG_BME680 is not set -# CONFIG_CCS811 is not set -# CONFIG_IAQCORE is not set -# CONFIG_VZ89X is not set -# CONFIG_IIO_CROS_EC_SENSORS_CORE is not set - -# -# Hid Sensor IIO Common -# - -# -# SSP Sensor Common -# -# CONFIG_IIO_SSP_SENSORHUB is not set - -# -# Counters -# - -# -# Digital to analog converters -# -# CONFIG_AD5064 is not set -# CONFIG_AD5360 is not set -# CONFIG_AD5380 is not set -# CONFIG_AD5421 is not set -# CONFIG_AD5446 is not set -# CONFIG_AD5449 is not set -# CONFIG_AD5592R is not set -# CONFIG_AD5593R is not set -# CONFIG_AD5504 is not set -# CONFIG_AD5624R_SPI is not set -# CONFIG_LTC2632 is not set -# CONFIG_AD5686_SPI is not set -# CONFIG_AD5696_I2C is not set -# CONFIG_AD5755 is not set -# CONFIG_AD5758 is not set -# CONFIG_AD5761 is not set -# CONFIG_AD5764 is not set -# CONFIG_AD5791 is not set -# CONFIG_AD7303 is not set -# CONFIG_AD8801 is not set -# CONFIG_DPOT_DAC is not set -# CONFIG_DS4424 is not set -# CONFIG_M62332 is not set -# CONFIG_MAX517 is not set -# CONFIG_MAX5821 is not set -# CONFIG_MCP4725 is not set -# CONFIG_MCP4922 is not set -# CONFIG_TI_DAC082S085 is not set -# CONFIG_TI_DAC5571 is not set -# CONFIG_VF610_DAC is not set - -# -# IIO dummy driver -# - -# -# Frequency Synthesizers DDS/PLL -# - -# -# Clock Generator/Distribution -# -# CONFIG_AD9523 is not set - -# -# Phase-Locked Loop (PLL) frequency synthesizers -# -# CONFIG_ADF4350 is not set - -# -# Digital gyroscope sensors -# -# CONFIG_ADIS16080 is not set -# CONFIG_ADIS16130 is not set -# CONFIG_ADIS16136 is not set -# CONFIG_ADIS16260 is not set -# CONFIG_ADXRS450 is not set -# CONFIG_BMG160 is not set -# CONFIG_MPU3050_I2C is not set -# CONFIG_IIO_ST_GYRO_3AXIS is not set -# CONFIG_ITG3200 is not set - -# -# Health Sensors -# - -# -# Heart Rate Monitors -# -# CONFIG_AFE4403 is not set -# CONFIG_AFE4404 is not set -# CONFIG_MAX30100 is not set -# CONFIG_MAX30102 is not set - -# -# Humidity sensors -# -# CONFIG_AM2315 is not set -# CONFIG_DHT11 is not set -# CONFIG_HDC100X is not set -# CONFIG_HTS221 is not set -# CONFIG_HTU21 is not set -# CONFIG_SI7005 is not set -# CONFIG_SI7020 is not set - -# -# Inertial measurement units -# -# CONFIG_ADIS16400 is not set -# CONFIG_ADIS16480 is not set -# CONFIG_BMI160_I2C is not set -# CONFIG_BMI160_SPI is not set -# CONFIG_KMX61 is not set -# CONFIG_INV_MPU6050_I2C is not set -# CONFIG_INV_MPU6050_SPI is not set -# CONFIG_IIO_ST_LSM6DSX is not set - -# -# Light sensors -# -# CONFIG_ADJD_S311 is not set -# CONFIG_AL3320A is not set -# CONFIG_APDS9300 is not set -# CONFIG_APDS9960 is not set -# CONFIG_BH1750 is not set -# CONFIG_BH1780 is not set -# CONFIG_CM32181 is not set -# CONFIG_CM3232 is not set -# CONFIG_CM3323 is not set -# CONFIG_CM3605 is not set -# CONFIG_CM36651 is not set -# CONFIG_GP2AP020A00F is not set CONFIG_SENSORS_ISL29018=y -# CONFIG_SENSORS_ISL29028 is not set -# CONFIG_ISL29125 is not set -# CONFIG_JSA1212 is not set -# CONFIG_RPR0521 is not set -# CONFIG_LTR501 is not set -# CONFIG_LV0104CS is not set -# CONFIG_MAX44000 is not set -# CONFIG_OPT3001 is not set -# CONFIG_PA12203001 is not set -# CONFIG_SI1133 is not set -# CONFIG_SI1145 is not set -# CONFIG_STK3310 is not set -# CONFIG_ST_UVIS25 is not set -# CONFIG_TCS3414 is not set -# CONFIG_TCS3472 is not set CONFIG_SENSORS_TSL2563=y CONFIG_TSL2583=y -# CONFIG_TSL2772 is not set -# CONFIG_TSL4531 is not set -# CONFIG_US5182D is not set -# CONFIG_VCNL4000 is not set -# CONFIG_VEML6070 is not set -# CONFIG_VL6180 is not set -# CONFIG_ZOPT2201 is not set - -# -# Magnetometer sensors -# -# CONFIG_AK8974 is not set -# CONFIG_AK8975 is not set -# CONFIG_AK09911 is not set -# CONFIG_BMC150_MAGN_I2C is not set -# CONFIG_BMC150_MAGN_SPI is not set -# CONFIG_MAG3110 is not set -# CONFIG_MMC35240 is not set -# CONFIG_IIO_ST_MAGN_3AXIS is not set -# CONFIG_SENSORS_HMC5843_I2C is not set -# CONFIG_SENSORS_HMC5843_SPI is not set - -# -# Multiplexers -# -# CONFIG_IIO_MUX is not set - -# -# Inclinometer sensors -# - -# -# Triggers - standalone -# -# CONFIG_IIO_INTERRUPT_TRIGGER is not set +CONFIG_IIO_MUX=y +CONFIG_IIO_HRTIMER_TRIGGER=y CONFIG_IIO_SYSFS_TRIGGER=y - -# -# Digital potentiometers -# -# CONFIG_AD5272 is not set -# CONFIG_DS1803 is not set -# CONFIG_MAX5481 is not set -# CONFIG_MAX5487 is not set -# CONFIG_MCP4018 is not set -# CONFIG_MCP4131 is not set -# CONFIG_MCP4531 is not set -# CONFIG_TPL0102 is not set - -# -# Digital potentiostats -# -# CONFIG_LMP91000 is not set - -# -# Pressure sensors -# -# CONFIG_ABP060MG is not set -# CONFIG_BMP280 is not set -# CONFIG_HP03 is not set -# CONFIG_MPL115_I2C is not set -# CONFIG_MPL115_SPI is not set -# CONFIG_MPL3115 is not set -# CONFIG_MS5611 is not set -# CONFIG_MS5637 is not set -# CONFIG_IIO_ST_PRESS is not set -# CONFIG_T5403 is not set -# CONFIG_HP206C is not set -# CONFIG_ZPA2326 is not set - -# -# Lightning sensors -# -# CONFIG_AS3935 is not set - -# -# Proximity and distance sensors -# -# CONFIG_ISL29501 is not set -# CONFIG_LIDAR_LITE_V2 is not set -# CONFIG_RFD77402 is not set -# CONFIG_SRF04 is not set -# CONFIG_SX9500 is not set -# CONFIG_SRF08 is not set - -# -# Resolver to digital converters -# -# CONFIG_AD2S1200 is not set - -# -# Temperature sensors -# -# CONFIG_MAXIM_THERMOCOUPLE is not set -# CONFIG_MLX90614 is not set -# CONFIG_MLX90632 is not set -# CONFIG_TMP006 is not set -# CONFIG_TMP007 is not set -# CONFIG_TSYS01 is not set -# CONFIG_TSYS02D is not set -# CONFIG_NTB is not set -# CONFIG_VME_BUS is not set CONFIG_PWM=y -CONFIG_PWM_SYSFS=y -# CONFIG_PWM_CROS_EC is not set -# CONFIG_PWM_FSL_FTM is not set -# CONFIG_PWM_PCA9685 is not set CONFIG_PWM_ROCKCHIP=y -# CONFIG_PWM_ROCKCHIP_ONESHOT is not set - -# -# IRQ chip support -# -CONFIG_IRQCHIP=y -CONFIG_ARM_GIC=y -CONFIG_ARM_GIC_MAX_NR=1 -CONFIG_ARM_GIC_V2M=y -CONFIG_ARM_GIC_V3=y -CONFIG_ARM_GIC_V3_ITS=y -CONFIG_ARM_GIC_V3_ITS_PCI=y -CONFIG_PARTITION_PERCPU=y -# CONFIG_IPACK_BUS is not set -CONFIG_ARCH_HAS_RESET_CONTROLLER=y -CONFIG_RESET_CONTROLLER=y -# CONFIG_RESET_TI_SYSCON is not set -# CONFIG_FMC is not set - -# -# PHY Subsystem -# -CONFIG_GENERIC_PHY=y -# CONFIG_PHY_XGENE is not set -# CONFIG_BCM_KONA_USB2_PHY is not set -# CONFIG_PHY_PXA_28NM_HSIC is not set -# CONFIG_PHY_PXA_28NM_USB2 is not set -# CONFIG_PHY_CPCAP_USB is not set -# CONFIG_PHY_MAPPHONE_MDM6600 is not set -CONFIG_PHY_ROCKCHIP_CSI2_DPHY=y CONFIG_PHY_ROCKCHIP_DP=y +CONFIG_PHY_ROCKCHIP_DPHY_RX0=y CONFIG_PHY_ROCKCHIP_EMMC=y -# CONFIG_PHY_ROCKCHIP_INNO_COMBPHY is not set -CONFIG_PHY_ROCKCHIP_INNO_HDMI_PHY=y -CONFIG_PHY_ROCKCHIP_INNO_MIPI_DPHY=y +CONFIG_PHY_ROCKCHIP_INNO_HDMI=y CONFIG_PHY_ROCKCHIP_INNO_USB2=y -CONFIG_PHY_ROCKCHIP_INNO_USB3=y -CONFIG_PHY_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y -# CONFIG_PHY_ROCKCHIP_INNO_VIDEO_PHY is not set -CONFIG_PHY_ROCKCHIP_MIPI_RX=y +CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y +CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y -CONFIG_PHY_ROCKCHIP_NANENG_EDP=y -# CONFIG_PHY_ROCKCHIP_NANENG_USB2 is not set CONFIG_PHY_ROCKCHIP_PCIE=y CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y CONFIG_PHY_ROCKCHIP_TYPEC=y CONFIG_PHY_ROCKCHIP_USB=y -# CONFIG_PHY_SAMSUNG_USB2 is not set -# CONFIG_POWERCAP is not set -# CONFIG_MCB is not set -CONFIG_RAS=y - -# -# Android -# -CONFIG_ANDROID=y -# CONFIG_ANDROID_BINDER_IPC is not set -# CONFIG_LIBNVDIMM is not set -# CONFIG_DAX is not set -CONFIG_NVMEM=y -CONFIG_NVMEM_SYSFS=y -CONFIG_ROCKCHIP_EFUSE=y -CONFIG_ROCKCHIP_OTP=y - -# -# HW tracing support -# -# CONFIG_STM is not set -# CONFIG_INTEL_TH is not set -# CONFIG_FPGA is not set -# CONFIG_FSI is not set -# CONFIG_TEE is not set -CONFIG_PM_OPP=y -# CONFIG_SIOX is not set -# CONFIG_SLIMBUS is not set -# CONFIG_LEGACY_ENERGY_MODEL_DT is not set -CONFIG_RK_FLASH=y - -# -# Rockchip Flash Devices -# -# CONFIG_RK_NANDC_NAND is not set -CONFIG_RK_SFC_NAND=y -CONFIG_RK_SFC_NAND_MTD=y -CONFIG_RK_SFC_NOR=y -CONFIG_RK_SFC_NOR_MTD=y -# CONFIG_RK_NAND is not set - -# -# Headset device support -# -CONFIG_RK_HEADSET=y - -# -# File systems -# -CONFIG_DCACHE_WORD_ACCESS=y -CONFIG_FS_IOMAP=y -# CONFIG_EXT2_FS is not set -# CONFIG_EXT3_FS is not set +CONFIG_ARM_SMMU_V3_PMU=y +CONFIG_MUX_GPIO=y +CONFIG_MUX_MMIO=y CONFIG_EXT4_FS=y -CONFIG_EXT4_USE_FOR_EXT2=y +# CONFIG_EXT4_USE_FOR_EXT2 is not set CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_ENCRYPTION is not set -# CONFIG_EXT4_DEBUG is not set -CONFIG_JBD2=y -# CONFIG_JBD2_DEBUG is not set -CONFIG_FS_MBCACHE=y -# CONFIG_REISERFS_FS is not set -# CONFIG_JFS_FS is not set CONFIG_XFS_FS=y -# CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_POSIX_ACL is not set -# CONFIG_XFS_RT is not set -# CONFIG_XFS_ONLINE_SCRUB is not set -# CONFIG_XFS_WARN is not set -# CONFIG_XFS_DEBUG is not set -# CONFIG_GFS2_FS is not set -# CONFIG_OCFS2_FS is not set -# CONFIG_BTRFS_FS is not set -# CONFIG_NILFS2_FS is not set -# CONFIG_F2FS_FS is not set -# CONFIG_FS_DAX is not set -CONFIG_FS_POSIX_ACL=y -CONFIG_EXPORTFS=y -# CONFIG_EXPORTFS_BLOCK_OPS is not set -CONFIG_FILE_LOCKING=y -CONFIG_MANDATORY_FILE_LOCKING=y -# CONFIG_FS_ENCRYPTION is not set -# CONFIG_FS_VERITY is not set -CONFIG_FSNOTIFY=y # CONFIG_DNOTIFY is not set -CONFIG_INOTIFY_USER=y -# CONFIG_FANOTIFY is not set -# CONFIG_QUOTA is not set -# CONFIG_AUTOFS4_FS is not set -# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=y -# CONFIG_CUSE is not set CONFIG_OVERLAY_FS=y -CONFIG_OVERLAY_FS_REDIRECT_DIR=y -CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y -# CONFIG_OVERLAY_FS_INDEX is not set -# CONFIG_OVERLAY_FS_XINO_AUTO is not set -# CONFIG_OVERLAY_FS_METACOPY is not set -# CONFIG_INCREMENTAL_FS is not set - -# -# Caches -# -# CONFIG_FSCACHE is not set - -# -# CD-ROM/DVD Filesystems -# +CONFIG_FSCACHE=y CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y -# CONFIG_UDF_FS is not set - -# -# DOS/FAT/NT Filesystems -# -CONFIG_FAT_FS=y -# CONFIG_MSDOS_FS is not set +CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y -CONFIG_FAT_DEFAULT_CODEPAGE=936 -CONFIG_FAT_DEFAULT_IOCHARSET="utf8" -CONFIG_FAT_DEFAULT_UTF8=y +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" CONFIG_EXFAT_FS=y -CONFIG_EXFAT_DEFAULT_CODEPAGE=437 -CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" -CONFIG_EXFAT_VIRTUAL_XATTR=y -CONFIG_EXFAT_VIRTUAL_XATTR_SELINUX_LABEL="u:object_r:exfat:s0" -# CONFIG_EXFAT_DEBUG is not set -# CONFIG_EXFAT_UEVENT is not set -# CONFIG_NTFS_FS is not set - -# -# Pseudo filesystems -# -CONFIG_PROC_FS=y -# CONFIG_PROC_KCORE is not set -CONFIG_PROC_SYSCTL=y -CONFIG_PROC_PAGE_MONITOR=y -# CONFIG_PROC_CHILDREN is not set -# CONFIG_PROC_UID is not set -CONFIG_KERNFS=y -CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y -CONFIG_TMPFS_XATTR=y -# CONFIG_HUGETLBFS is not set -CONFIG_MEMFD_CREATE=y -CONFIG_ARCH_HAS_GIGANTIC_PAGE=y -CONFIG_CONFIGFS_FS=y -CONFIG_MISC_FILESYSTEMS=y -# CONFIG_ORANGEFS_FS is not set -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_ECRYPT_FS is not set -# CONFIG_SDCARD_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_EFS_FS is not set -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_FS_DEBUG=0 -CONFIG_JFFS2_FS_WRITEBUFFER=y -# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -# CONFIG_JFFS2_SUMMARY is not set -# CONFIG_JFFS2_FS_XATTR is not set -# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set -CONFIG_JFFS2_ZLIB=y -CONFIG_JFFS2_RTIME=y -CONFIG_UBIFS_FS=y -CONFIG_UBIFS_FS_ADVANCED_COMPR=y -CONFIG_UBIFS_FS_LZO=y -CONFIG_UBIFS_FS_ZLIB=y -# CONFIG_UBIFS_ATIME_SUPPORT is not set -CONFIG_UBIFS_FS_XATTR=y -CONFIG_UBIFS_FS_SECURITY=y -# CONFIG_CRAMFS is not set CONFIG_SQUASHFS=y -CONFIG_SQUASHFS_FILE_CACHE=y -# CONFIG_SQUASHFS_FILE_DIRECT is not set -CONFIG_SQUASHFS_DECOMP_SINGLE=y -# CONFIG_SQUASHFS_DECOMP_MULTI is not set -# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set -# CONFIG_SQUASHFS_XATTR is not set -CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y -# CONFIG_SQUASHFS_ZSTD is not set -# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set -# CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -# CONFIG_VXFS_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_OMFS_FS is not set -# CONFIG_HPFS_FS is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX6FS_FS is not set -# CONFIG_ROMFS_FS is not set +CONFIG_SQUASHFS_ZSTD=y CONFIG_PSTORE=y -CONFIG_PSTORE_DEFLATE_COMPRESS=y -# CONFIG_PSTORE_LZO_COMPRESS is not set -# CONFIG_PSTORE_LZ4_COMPRESS is not set -# CONFIG_PSTORE_LZ4HC_COMPRESS is not set -# CONFIG_PSTORE_842_COMPRESS is not set -# CONFIG_PSTORE_ZSTD_COMPRESS is not set -CONFIG_PSTORE_COMPRESS=y -CONFIG_PSTORE_DEFLATE_COMPRESS_DEFAULT=y -CONFIG_PSTORE_COMPRESS_DEFAULT="deflate" -CONFIG_PSTORE_CONSOLE=y -# CONFIG_PSTORE_CONSOLE_FORCE is not set -# CONFIG_PSTORE_PMSG is not set -# CONFIG_PSTORE_FTRACE is not set -CONFIG_PSTORE_RAM=y -# CONFIG_PSTORE_MCU_LOG is not set -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set -CONFIG_NETWORK_FILESYSTEMS=y -# CONFIG_NFS_FS is not set -# CONFIG_NFSD is not set -# CONFIG_CEPH_FS is not set -# CONFIG_CIFS is not set -# CONFIG_CODA_FS is not set -# CONFIG_AFS_FS is not set -CONFIG_NLS=y -CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_DEFAULT="utf-8" CONFIG_NLS_CODEPAGE_437=y -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -CONFIG_NLS_CODEPAGE_936=y -# CONFIG_NLS_CODEPAGE_950 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=y -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_MAC_ROMAN is not set -# CONFIG_NLS_MAC_CELTIC is not set -# CONFIG_NLS_MAC_CENTEURO is not set -# CONFIG_NLS_MAC_CROATIAN is not set -# CONFIG_NLS_MAC_CYRILLIC is not set -# CONFIG_NLS_MAC_GAELIC is not set -# CONFIG_NLS_MAC_GREEK is not set -# CONFIG_NLS_MAC_ICELAND is not set -# CONFIG_NLS_MAC_INUIT is not set -# CONFIG_NLS_MAC_ROMANIAN is not set -# CONFIG_NLS_MAC_TURKISH is not set CONFIG_NLS_UTF8=y -# CONFIG_DLM is not set -CONFIG_UNICODE=y -# CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set - -# -# Security options -# -CONFIG_KEYS=y -CONFIG_KEYS_COMPAT=y -# CONFIG_PERSISTENT_KEYRINGS is not set -# CONFIG_BIG_KEYS is not set -# CONFIG_TRUSTED_KEYS is not set -# CONFIG_ENCRYPTED_KEYS is not set -# CONFIG_KEY_DH_OPERATIONS is not set -# CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITY is not set -CONFIG_SECURITYFS=y -CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y -# CONFIG_HARDENED_USERCOPY is not set -# CONFIG_FORTIFY_SOURCE is not set -# CONFIG_STATIC_USERMODEHELPER is not set -# CONFIG_TEE_SUPPORT is not set -CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_DEFAULT_SECURITY="" - -# -# Kernel hardening options -# - -# -# Memory initialization -# +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_HARDENED_USERCOPY=y +CONFIG_STATIC_USERMODEHELPER=y +CONFIG_LSM="selinux,integrity" CONFIG_INIT_STACK_NONE=y -# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set -# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set -CONFIG_CRYPTO=y - -# -# Crypto core or helper -# -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_BLKCIPHER=y -CONFIG_CRYPTO_BLKCIPHER2=y -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_RNG=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_RNG_DEFAULT=y -CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_AKCIPHER=y -CONFIG_CRYPTO_KPP2=y -CONFIG_CRYPTO_KPP=y -CONFIG_CRYPTO_ACOMP2=y -CONFIG_CRYPTO_RSA=y -# CONFIG_CRYPTO_DH is not set -CONFIG_CRYPTO_ECDH=y -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -# CONFIG_CRYPTO_USER is not set -CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -CONFIG_CRYPTO_GF128MUL=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_NULL2=y -# CONFIG_CRYPTO_PCRYPT is not set -CONFIG_CRYPTO_WORKQUEUE=y +CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +CONFIG_INIT_ON_FREE_DEFAULT_ON=y +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_PCRYPT=y CONFIG_CRYPTO_CRYPTD=y -# CONFIG_CRYPTO_MCRYPTD is not set -CONFIG_CRYPTO_AUTHENC=m -# CONFIG_CRYPTO_TEST is not set -CONFIG_CRYPTO_SIMD=y -# CONFIG_CRYPTO_CURVE25519 is not set - -# -# Authenticated Encryption with Associated Data -# -CONFIG_CRYPTO_CCM=y -CONFIG_CRYPTO_GCM=y -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128L is not set -# CONFIG_CRYPTO_AEGIS256 is not set -# CONFIG_CRYPTO_MORUS640 is not set -# CONFIG_CRYPTO_MORUS1280 is not set -CONFIG_CRYPTO_SEQIV=y -CONFIG_CRYPTO_ECHAINIV=m - -# -# Block modes -# -CONFIG_CRYPTO_CBC=y -CONFIG_CRYPTO_CFB=y -CONFIG_CRYPTO_CTR=y -# CONFIG_CRYPTO_CTS is not set -CONFIG_CRYPTO_ECB=y -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_PCBC is not set +CONFIG_CRYPTO_ECDH=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_CTS=y CONFIG_CRYPTO_XTS=y -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_ADIANTUM is not set - -# -# Hash modes -# +CONFIG_CRYPTO_CHACHA20POLY1305=y +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_ESSIV=y CONFIG_CRYPTO_CMAC=y -CONFIG_CRYPTO_HMAC=y -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_VMAC is not set - -# -# Digest -# -CONFIG_CRYPTO_CRC32C=y -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_BLAKE2S is not set -CONFIG_CRYPTO_CRCT10DIF=y -CONFIG_CRYPTO_GHASH=y -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_MD4 is not set -CONFIG_CRYPTO_MD5=y -# CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_RMD128 is not set -# CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA256=y -CONFIG_CRYPTO_SHA512=y -# CONFIG_CRYPTO_SHA3 is not set -CONFIG_CRYPTO_SM3=y -# CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_WP512 is not set - -# -# Ciphers -# -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_TI is not set -# CONFIG_CRYPTO_ANUBIS is not set -CONFIG_CRYPTO_ARC4=y -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_SEED is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_TEA is not set -CONFIG_CRYPTO_TWOFISH=y -CONFIG_CRYPTO_TWOFISH_COMMON=y - -# -# Compression -# -CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_LZO=y -# CONFIG_CRYPTO_842 is not set -# CONFIG_CRYPTO_LZ4 is not set -# CONFIG_CRYPTO_LZ4HC is not set -# CONFIG_CRYPTO_ZSTD is not set - -# -# Random Number Generation -# +CONFIG_CRYPTO_LZ4=y +CONFIG_CRYPTO_LZ4HC=y +CONFIG_CRYPTO_ZSTD=y CONFIG_CRYPTO_ANSI_CPRNG=y -CONFIG_CRYPTO_DRBG_MENU=y -CONFIG_CRYPTO_DRBG_HMAC=y -# CONFIG_CRYPTO_DRBG_HASH is not set -# CONFIG_CRYPTO_DRBG_CTR is not set -CONFIG_CRYPTO_DRBG=y -CONFIG_CRYPTO_JITTERENTROPY=y -CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y -# CONFIG_CRYPTO_USER_API_RNG is not set -# CONFIG_CRYPTO_USER_API_AEAD is not set -CONFIG_CRYPTO_HASH_INFO=y - -# -# Crypto library routines -# -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_LIB_CHACHA is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -CONFIG_CRYPTO_HW=y -# CONFIG_CRYPTO_DEV_CCP is not set -# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set -# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set +CONFIG_CRYPTO_USER_API_RNG=y +CONFIG_CRYPTO_USER_API_AEAD=y +CONFIG_CRYPTO_STATS=y +CONFIG_CRYPTO_NHPOLY1305_NEON=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_SHA512_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_BS=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_DEV_ROCKCHIP=y -# CONFIG_CRYPTO_DEV_CCREE is not set -# CONFIG_CRYPTO_DEV_HISI_SEC is not set -CONFIG_ASYMMETRIC_KEY_TYPE=y -CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y -CONFIG_X509_CERTIFICATE_PARSER=y -CONFIG_PKCS7_MESSAGE_PARSER=y -# CONFIG_PKCS7_TEST_KEY is not set -# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set - -# -# Certificates for signature checking -# -CONFIG_SYSTEM_TRUSTED_KEYRING=y -CONFIG_SYSTEM_TRUSTED_KEYS="" -# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set -# CONFIG_SECONDARY_TRUSTED_KEYRING is not set -# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set -CONFIG_BINARY_PRINTF=y - -# -# Library routines -# -CONFIG_BITREVERSE=y -CONFIG_HAVE_ARCH_BITREVERSE=y -CONFIG_RATIONAL=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_NET_UTILS=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y -CONFIG_ARCH_HAS_FAST_MULTIPLIER=y -# CONFIG_INDIRECT_PIO is not set +CONFIG_CORDIC=y CONFIG_CRC_CCITT=y -CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y -CONFIG_CRC32=y -# CONFIG_CRC32_SELFTEST is not set -CONFIG_CRC32_SLICEBY8=y -# CONFIG_CRC32_SLICEBY4 is not set -# CONFIG_CRC32_SARWATE is not set -# CONFIG_CRC32_BIT is not set -# CONFIG_CRC64 is not set -# CONFIG_CRC4 is not set CONFIG_CRC7=y -CONFIG_LIBCRC32C=y -# CONFIG_CRC8 is not set -CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y -# CONFIG_RANDOM32_SELFTEST is not set -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=y -CONFIG_LZO_COMPRESS=y -CONFIG_LZO_DECOMPRESS=y -CONFIG_LZ4_DECOMPRESS=y -CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set -# CONFIG_XZ_DEC_IA64 is not set -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_ARMTHUMB=y # CONFIG_XZ_DEC_SPARC is not set -CONFIG_XZ_DEC_BCJ=y -# CONFIG_XZ_DEC_TEST is not set -CONFIG_DECOMPRESS_GZIP=y -CONFIG_DECOMPRESS_BZIP2=y -CONFIG_DECOMPRESS_LZMA=y -CONFIG_DECOMPRESS_XZ=y -CONFIG_DECOMPRESS_LZO=y -CONFIG_DECOMPRESS_LZ4=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_REED_SOLOMON=y -CONFIG_REED_SOLOMON_ENC8=y -CONFIG_REED_SOLOMON_DEC8=y -CONFIG_TEXTSEARCH=y -CONFIG_TEXTSEARCH_KMP=m -CONFIG_TEXTSEARCH_BM=m -CONFIG_TEXTSEARCH_FSM=m -CONFIG_ASSOCIATIVE_ARRAY=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HAS_DMA=y -CONFIG_NEED_SG_DMA_LENGTH=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_HAVE_GENERIC_DMA_COHERENT=y -CONFIG_DMA_DIRECT_OPS=y -CONFIG_SWIOTLB=y -CONFIG_SGL_ALLOC=y -CONFIG_CPU_RMAP=y -CONFIG_DQL=y -CONFIG_GLOB=y -# CONFIG_GLOB_SELFTEST is not set -CONFIG_NLATTR=y -CONFIG_CLZ_TAB=y -# CONFIG_CORDIC is not set -# CONFIG_DDR is not set -# CONFIG_IRQ_POLL is not set -CONFIG_MPILIB=y -CONFIG_LIBFDT=y -CONFIG_OID_REGISTRY=y -CONFIG_HAVE_GENERIC_VDSO=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_FONT_SUPPORT=y -# CONFIG_FONTS is not set -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y -CONFIG_SG_POOL=y -CONFIG_ARCH_HAS_SG_CHAIN=y -CONFIG_SBITMAP=y -# CONFIG_STRING_SELFTEST is not set - -# -# Kernel hacking -# - -# -# printk and dmesg options -# CONFIG_PRINTK_TIME=y -# CONFIG_PRINTK_TIME_FROM_ARM_ARCH_TIMER is not set -# CONFIG_PRINTK_PROCESS is not set -CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 -CONFIG_CONSOLE_LOGLEVEL_QUIET=4 -CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 -# CONFIG_BOOT_PRINTK_DELAY is not set +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7 CONFIG_DYNAMIC_DEBUG=y - -# -# Compile-time checks and compiler options -# -CONFIG_DEBUG_INFO=y -# CONFIG_DEBUG_INFO_REDUCED is not set -# CONFIG_DEBUG_INFO_SPLIT is not set -# CONFIG_DEBUG_INFO_DWARF4 is not set -# CONFIG_GDB_SCRIPTS is not set -CONFIG_ENABLE_MUST_CHECK=y -CONFIG_FRAME_WARN=2048 -# CONFIG_STRIP_ASM_SYMS is not set -# CONFIG_READABLE_ASM is not set -# CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_PAGE_OWNER is not set -CONFIG_DEBUG_FS=y -# CONFIG_HEADERS_CHECK is not set -# CONFIG_DEBUG_SECTION_MISMATCH is not set -CONFIG_SECTION_MISMATCH_WARN_ONLY=y -CONFIG_ARCH_WANT_FRAME_POINTERS=y -CONFIG_FRAME_POINTER=y -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# CONFIG_SYMBOLIC_ERRNAME is not set +# CONFIG_DEBUG_MISC is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 -CONFIG_MAGIC_SYSRQ_SERIAL=y -CONFIG_DEBUG_KERNEL=y - -# -# Memory Debugging -# -# CONFIG_PAGE_EXTENSION is not set -# CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_PAGE_POISONING is not set -# CONFIG_DEBUG_PAGE_REF is not set -# CONFIG_DEBUG_RODATA_TEST is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_DEBUG_ON is not set -# CONFIG_SLUB_STATS is not set -CONFIG_HAVE_DEBUG_KMEMLEAK=y -# CONFIG_DEBUG_KMEMLEAK is not set -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_DEBUG_VM is not set -CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y -# CONFIG_DEBUG_VIRTUAL is not set -# CONFIG_DEBUG_MEMORY_INIT is not set -# CONFIG_DEBUG_PER_CPU_MAPS is not set -CONFIG_HAVE_ARCH_KASAN=y -CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y -CONFIG_CC_HAS_KASAN_GENERIC=y -# CONFIG_KASAN is not set -CONFIG_KASAN_STACK=1 -CONFIG_ARCH_HAS_KCOV=y -CONFIG_CC_HAS_SANCOV_TRACE_PC=y -# CONFIG_KCOV is not set -# CONFIG_DEBUG_SHIRQ is not set - -# -# Debug Lockups and Hangs -# -# CONFIG_SOFTLOCKUP_DETECTOR is not set -# CONFIG_DETECT_HUNG_TASK is not set -# CONFIG_WQ_WATCHDOG is not set -# CONFIG_PANIC_ON_OOPS is not set -CONFIG_PANIC_ON_OOPS_VALUE=0 -CONFIG_PANIC_TIMEOUT=0 -CONFIG_SCHED_DEBUG=y -CONFIG_SCHED_INFO=y +CONFIG_DEBUG_FS=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PANIC_TIMEOUT=1 +CONFIG_DETECT_HUNG_TASK=y +CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y +# CONFIG_SCHED_DEBUG is not set CONFIG_SCHEDSTATS=y -# CONFIG_SCHED_STACK_END_CHECK is not set -# CONFIG_DEBUG_TIMEKEEPING is not set - -# -# Lock Debugging (spinlocks, mutexes, etc...) -# -CONFIG_LOCK_DEBUGGING_SUPPORT=y -# CONFIG_PROVE_LOCKING is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_DEBUG_RT_MUTEXES is not set CONFIG_DEBUG_SPINLOCK=y -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_RWSEMS is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_DEBUG_ATOMIC_SLEEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -# CONFIG_LOCK_TORTURE_TEST is not set -# CONFIG_WW_MUTEX_SELFTEST is not set CONFIG_STACKTRACE=y -# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set -# CONFIG_DEBUG_KOBJECT is not set -CONFIG_HAVE_DEBUG_BUGVERBOSE=y -CONFIG_DEBUG_BUGVERBOSE=y -# CONFIG_DEBUG_LIST is not set -# CONFIG_DEBUG_PI_LIST is not set -# CONFIG_DEBUG_SG is not set -# CONFIG_DEBUG_NOTIFIERS is not set CONFIG_DEBUG_CREDENTIALS=y - -# -# RCU Debugging -# -# CONFIG_RCU_PERF_TEST is not set -# CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 -CONFIG_RCU_TRACE=y -# CONFIG_RCU_EQS_DEBUG is not set -# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -# CONFIG_FAULT_INJECTION is not set -# CONFIG_LATENCYTOP is not set -CONFIG_NOP_TRACER=y -CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y -CONFIG_HAVE_DYNAMIC_FTRACE=y -CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y -CONFIG_HAVE_SYSCALL_TRACEPOINTS=y -CONFIG_HAVE_C_RECORDMCOUNT=y -CONFIG_TRACE_CLOCK=y -CONFIG_RING_BUFFER=y -CONFIG_EVENT_TRACING=y -CONFIG_CONTEXT_SWITCH_TRACER=y -CONFIG_TRACING=y -CONFIG_GENERIC_TRACER=y -CONFIG_TRACING_SUPPORT=y -CONFIG_FTRACE=y -CONFIG_FUNCTION_TRACER=y -CONFIG_FUNCTION_GRAPH_TRACER=y -# CONFIG_PREEMPTIRQ_EVENTS is not set -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_SCHED_TRACER is not set -# CONFIG_HWLAT_TRACER is not set -# CONFIG_FTRACE_SYSCALLS is not set -# CONFIG_TRACER_SNAPSHOT is not set -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -# CONFIG_PROFILE_ALL_BRANCHES is not set -# CONFIG_STACK_TRACER is not set -CONFIG_BLK_DEV_IO_TRACE=y -CONFIG_DYNAMIC_FTRACE=y -# CONFIG_FUNCTION_PROFILER is not set -CONFIG_FTRACE_MCOUNT_RECORD=y -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_HIST_TRIGGERS is not set -# CONFIG_TRACEPOINT_BENCHMARK is not set -# CONFIG_RING_BUFFER_BENCHMARK is not set -# CONFIG_RING_BUFFER_STARTUP_TEST is not set -# CONFIG_PREEMPTIRQ_DELAY_TEST is not set -# CONFIG_TRACE_EVAL_MAP_FILE is not set -CONFIG_TRACING_EVENTS_GPIO=y -# CONFIG_DMA_API_DEBUG is not set -CONFIG_RUNTIME_TESTING_MENU=y -CONFIG_LKDTM=y -# CONFIG_TEST_LIST_SORT is not set -# CONFIG_TEST_SORT is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_RBTREE_TEST is not set -# CONFIG_INTERVAL_TREE_TEST is not set -# CONFIG_PERCPU_TEST is not set -# CONFIG_ATOMIC64_SELFTEST is not set -# CONFIG_TEST_HEXDUMP is not set -# CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_KSTRTOX is not set -# CONFIG_TEST_PRINTF is not set -# CONFIG_TEST_BITMAP is not set -# CONFIG_TEST_BITFIELD is not set -# CONFIG_TEST_UUID is not set -# CONFIG_TEST_OVERFLOW is not set -# CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_HASH is not set -# CONFIG_TEST_IDA is not set -# CONFIG_TEST_LKM is not set -# CONFIG_TEST_USER_COPY is not set -# CONFIG_TEST_BPF is not set -# CONFIG_FIND_BIT_BENCHMARK is not set -# CONFIG_TEST_FIRMWARE is not set -# CONFIG_TEST_SYSCTL is not set -# CONFIG_TEST_UDELAY is not set -# CONFIG_TEST_STATIC_KEYS is not set -# CONFIG_TEST_KMOD is not set -# CONFIG_TEST_MEMINIT is not set -# CONFIG_TEST_STACKINIT is not set -# CONFIG_MEMTEST is not set -# CONFIG_BUG_ON_DATA_CORRUPTION is not set -# CONFIG_SAMPLES is not set -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y -# CONFIG_UBSAN is not set -CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y -CONFIG_STRICT_DEVMEM=y -# CONFIG_IO_STRICT_DEVMEM is not set -# CONFIG_ARM64_PTDUMP_DEBUGFS is not set -# CONFIG_PID_IN_CONTEXTIDR is not set -# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set -# CONFIG_DEBUG_WX is not set -# CONFIG_DEBUG_ALIGN_RODATA is not set -# CONFIG_ARM64_RELOC_TEST is not set -# CONFIG_CORESIGHT is not set +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=20 +# CONFIG_RCU_TRACE is not set +# CONFIG_FTRACE is not set +# CONFIG_STRICT_DEVMEM is not set +# CONFIG_RUNTIME_TESTING_MENU is not set diff --git a/projects/Rockchip/devices/RK3566/linux/linux.aarch64.old.conf b/projects/Rockchip/devices/RK3566/linux/linux.aarch64.old.conf new file mode 100644 index 0000000000..418d04e18f --- /dev/null +++ b/projects/Rockchip/devices/RK3566/linux/linux.aarch64.old.conf @@ -0,0 +1,8098 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm64 6.6.0-rc3 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="aarch64-linux-gnueabi-gcc-12.3.0 (GCC) 12.3.0" +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=120300 +CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=24100 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=24100 +CONFIG_LLD_VERSION=0 +CONFIG_CC_CAN_LINK=y +CONFIG_CC_CAN_LINK_STATIC=y +CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y +CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_PAHOLE_VERSION=0 +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_BUILD_SALT="" +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="@DEVICENAME@" +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_SYSVIPC_COMPAT=y +CONFIG_POSIX_MQUEUE=y +CONFIG_POSIX_MQUEUE_SYSCTL=y +CONFIG_WATCH_QUEUE=y +# CONFIG_CROSS_MEMORY_ATTACH is not set +CONFIG_USELIB=y +# CONFIG_AUDIT is not set +CONFIG_HAVE_ARCH_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_IRQ_IPI=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +# end of IRQ subsystem + +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y +# end of Timers subsystem + +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +CONFIG_BPF_JIT_DEFAULT_ON=y +# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set +# CONFIG_BPF_PRELOAD is not set +# end of BPF subsystem + +CONFIG_PREEMPT_BUILD=y +# CONFIG_PREEMPT_NONE is not set +# CONFIG_PREEMPT_VOLUNTARY is not set +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +CONFIG_PREEMPTION=y +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_SCHED_CORE is not set + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_SCHED_AVG_IRQ=y +CONFIG_SCHED_THERMAL_PRESSURE=y +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_PSI is not set +# end of CPU/Task time and stats accounting + +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +CONFIG_PREEMPT_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU_GENERIC=y +CONFIG_TASKS_RCU=y +CONFIG_TASKS_TRACE_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +# end of RCU Subsystem + +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +# CONFIG_IKHEADERS is not set +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +# CONFIG_PRINTK_INDEX is not set +CONFIG_GENERIC_SCHED_CLOCK=y + +# +# Scheduler features +# +# CONFIG_UCLAMP_TASK is not set +# end of Scheduler features + +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y +CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_GCC11_NO_ARRAY_BOUNDS=y +CONFIG_CC_NO_ARRAY_BOUNDS=y +CONFIG_ARCH_SUPPORTS_INT128=y +CONFIG_CGROUPS=y +CONFIG_PAGE_COUNTER=y +# CONFIG_CGROUP_FAVOR_DYNMODS is not set +CONFIG_MEMCG=y +CONFIG_MEMCG_KMEM=y +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_WRITEBACK=y +CONFIG_CGROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_SCHED_MM_CID=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CPUSETS=y +CONFIG_PROC_PID_CPUSET=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +# CONFIG_CGROUP_MISC is not set +# CONFIG_CGROUP_DEBUG is not set +CONFIG_SOCK_CGROUP_DATA=y +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +CONFIG_TIME_NS=y +CONFIG_IPC_NS=y +# CONFIG_USER_NS is not set +CONFIG_PID_NS=y +CONFIG_NET_NS=y +# CONFIG_CHECKPOINT_RESTORE is not set +CONFIG_SCHED_AUTOGROUP=y +CONFIG_RELAY=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="@INITRAMFS_SOURCE@" +CONFIG_INITRAMFS_ROOT_UID=0 +CONFIG_INITRAMFS_ROOT_GID=0 +CONFIG_RD_GZIP=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_RD_XZ=y +CONFIG_RD_LZO=y +CONFIG_RD_LZ4=y +CONFIG_RD_ZSTD=y +# CONFIG_INITRAMFS_COMPRESSION_GZIP is not set +# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set +# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set +# CONFIG_INITRAMFS_COMPRESSION_XZ is not set +CONFIG_INITRAMFS_COMPRESSION_LZO=y +# CONFIG_INITRAMFS_COMPRESSION_LZ4 is not set +# CONFIG_INITRAMFS_COMPRESSION_ZSTD is not set +# CONFIG_INITRAMFS_COMPRESSION_NONE is not set +CONFIG_BOOT_CONFIG=y +# CONFIG_BOOT_CONFIG_FORCE is not set +# CONFIG_BOOT_CONFIG_EMBED is not set +CONFIG_INITRAMFS_PRESERVE_MTIME=y +# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_LD_ORPHAN_WARN=y +CONFIG_LD_ORPHAN_WARN_LEVEL="warn" +CONFIG_SYSCTL=y +CONFIG_HAVE_UID16=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_EXPERT=y +CONFIG_UID16=y +CONFIG_MULTIUSER=y +CONFIG_SGETMASK_SYSCALL=y +CONFIG_SYSFS_SYSCALL=y +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_IO_URING=y +CONFIG_ADVISE_SYSCALLS=y +CONFIG_MEMBARRIER=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_SELFTEST is not set +CONFIG_KALLSYMS_ALL=y +CONFIG_KALLSYMS_BASE_RELATIVE=y +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_KCMP=y +CONFIG_RSEQ=y +CONFIG_CACHESTAT_SYSCALL=y +# CONFIG_DEBUG_RSEQ is not set +CONFIG_HAVE_PERF_EVENTS=y +# CONFIG_PC104 is not set + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# end of Kernel Performance Events And Counters + +CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_PROFILING=y + +# +# Kexec and crash features +# +# CONFIG_KEXEC is not set +# CONFIG_KEXEC_FILE is not set +# CONFIG_CRASH_DUMP is not set +# end of Kexec and crash features +# end of General setup + +CONFIG_ARM64=y +CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_64BIT=y +CONFIG_MMU=y +CONFIG_ARM64_PAGE_SHIFT=12 +CONFIG_ARM64_CONT_PTE_SHIFT=4 +CONFIG_ARM64_CONT_PMD_SHIFT=4 +CONFIG_ARCH_MMAP_RND_BITS_MIN=18 +CONFIG_ARCH_MMAP_RND_BITS_MAX=24 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CSUM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_SMP=y +CONFIG_KERNEL_MODE_NEON=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=3 +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y + +# +# Platform selection +# +# CONFIG_ARCH_ACTIONS is not set +# CONFIG_ARCH_SUNXI is not set +# CONFIG_ARCH_ALPINE is not set +# CONFIG_ARCH_APPLE is not set +# CONFIG_ARCH_BCM is not set +# CONFIG_ARCH_BERLIN is not set +# CONFIG_ARCH_BITMAIN is not set +# CONFIG_ARCH_EXYNOS is not set +# CONFIG_ARCH_SPARX5 is not set +# CONFIG_ARCH_K3 is not set +# CONFIG_ARCH_LG1K is not set +# CONFIG_ARCH_HISI is not set +# CONFIG_ARCH_KEEMBAY is not set +# CONFIG_ARCH_MEDIATEK is not set +# CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MVEBU is not set +# CONFIG_ARCH_NXP is not set +# CONFIG_ARCH_MA35 is not set +# CONFIG_ARCH_NPCM is not set +# CONFIG_ARCH_QCOM is not set +# CONFIG_ARCH_REALTEK is not set +# CONFIG_ARCH_RENESAS is not set +CONFIG_ARCH_ROCKCHIP=y +# CONFIG_ARCH_SEATTLE is not set +# CONFIG_ARCH_INTEL_SOCFPGA is not set +# CONFIG_ARCH_STM32 is not set +# CONFIG_ARCH_SYNQUACER is not set +# CONFIG_ARCH_TEGRA is not set +# CONFIG_ARCH_SPRD is not set +# CONFIG_ARCH_THUNDER is not set +# CONFIG_ARCH_THUNDER2 is not set +# CONFIG_ARCH_UNIPHIER is not set +# CONFIG_ARCH_VEXPRESS is not set +# CONFIG_ARCH_VISCONTI is not set +# CONFIG_ARCH_XGENE is not set +# CONFIG_ARCH_ZYNQMP is not set +# end of Platform selection + +# +# Kernel Features +# + +# +# ARM errata workarounds via the alternatives framework +# +CONFIG_AMPERE_ERRATUM_AC03_CPU_38=y +CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y +CONFIG_ARM64_ERRATUM_826319=y +CONFIG_ARM64_ERRATUM_827319=y +CONFIG_ARM64_ERRATUM_824069=y +CONFIG_ARM64_ERRATUM_819472=y +CONFIG_ARM64_ERRATUM_832075=y +CONFIG_ARM64_ERRATUM_1742098=y +CONFIG_ARM64_ERRATUM_845719=y +CONFIG_ARM64_ERRATUM_843419=y +CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y +CONFIG_ARM64_ERRATUM_1024718=y +CONFIG_ARM64_ERRATUM_1418040=y +CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y +CONFIG_ARM64_ERRATUM_1165522=y +CONFIG_ARM64_ERRATUM_1319367=y +CONFIG_ARM64_ERRATUM_1530923=y +CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y +CONFIG_ARM64_ERRATUM_2441007=y +CONFIG_ARM64_ERRATUM_1286807=y +CONFIG_ARM64_ERRATUM_1463225=y +CONFIG_ARM64_ERRATUM_1542419=y +CONFIG_ARM64_ERRATUM_1508412=y +CONFIG_ARM64_ERRATUM_2051678=y +CONFIG_ARM64_ERRATUM_2077057=y +CONFIG_ARM64_ERRATUM_2658417=y +CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y +CONFIG_ARM64_ERRATUM_2054223=y +CONFIG_ARM64_ERRATUM_2067961=y +CONFIG_ARM64_ERRATUM_2441009=y +CONFIG_ARM64_ERRATUM_2457168=y +CONFIG_ARM64_ERRATUM_2645198=y +# CONFIG_CAVIUM_ERRATUM_22375 is not set +# CONFIG_CAVIUM_ERRATUM_23154 is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_CAVIUM_ERRATUM_30115 is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_FUJITSU_ERRATUM_010001 is not set +# CONFIG_HISILICON_ERRATUM_161600802 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set +# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set +# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set +CONFIG_ROCKCHIP_ERRATUM_3588001=y +# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set +# end of ARM errata workarounds via the alternatives framework + +CONFIG_ARM64_4K_PAGES=y +# CONFIG_ARM64_16K_PAGES is not set +# CONFIG_ARM64_64K_PAGES is not set +CONFIG_ARM64_VA_BITS_39=y +# CONFIG_ARM64_VA_BITS_48 is not set +CONFIG_ARM64_VA_BITS=39 +CONFIG_ARM64_PA_BITS_48=y +CONFIG_ARM64_PA_BITS=48 +# CONFIG_CPU_BIG_ENDIAN is not set +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_SCHED_MC=y +# CONFIG_SCHED_CLUSTER is not set +CONFIG_SCHED_SMT=y +CONFIG_NR_CPUS=4 +CONFIG_HOTPLUG_CPU=y +# CONFIG_NUMA is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_300 is not set +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +CONFIG_SCHED_HRTICK=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_HW_PERF_EVENTS=y +CONFIG_CC_HAVE_SHADOW_CALL_STACK=y +# CONFIG_PARAVIRT is not set +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set +CONFIG_ARCH_SUPPORTS_KEXEC=y +CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y +CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y +CONFIG_ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG=y +CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y +CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y +# CONFIG_XEN is not set +CONFIG_ARCH_FORCE_MAX_ORDER=10 +CONFIG_UNMAP_KERNEL_AT_EL0=y +CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y +CONFIG_RODATA_FULL_DEFAULT_ENABLED=y +CONFIG_ARM64_SW_TTBR0_PAN=y +CONFIG_ARM64_TAGGED_ADDR_ABI=y +CONFIG_COMPAT=y +CONFIG_KUSER_HELPERS=y +# CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set +CONFIG_ARMV8_DEPRECATED=y +# CONFIG_SWP_EMULATION is not set +# CONFIG_CP15_BARRIER_EMULATION is not set +# CONFIG_SETEND_EMULATION is not set + +# +# ARMv8.1 architectural features +# +CONFIG_ARM64_HW_AFDBM=y +CONFIG_ARM64_PAN=y +CONFIG_AS_HAS_LSE_ATOMICS=y +CONFIG_ARM64_LSE_ATOMICS=y +CONFIG_ARM64_USE_LSE_ATOMICS=y +# end of ARMv8.1 architectural features + +# +# ARMv8.2 architectural features +# +CONFIG_AS_HAS_ARMV8_2=y +CONFIG_AS_HAS_SHA3=y +CONFIG_ARM64_PMEM=y +CONFIG_ARM64_RAS_EXTN=y +CONFIG_ARM64_CNP=y +# end of ARMv8.2 architectural features + +# +# ARMv8.3 architectural features +# +CONFIG_ARM64_PTR_AUTH=y +CONFIG_ARM64_PTR_AUTH_KERNEL=y +CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y +CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y +CONFIG_AS_HAS_ARMV8_3=y +CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y +CONFIG_AS_HAS_LDAPR=y +# end of ARMv8.3 architectural features + +# +# ARMv8.4 architectural features +# +CONFIG_ARM64_AMU_EXTN=y +CONFIG_AS_HAS_ARMV8_4=y +CONFIG_ARM64_TLB_RANGE=y +# end of ARMv8.4 architectural features + +# +# ARMv8.5 architectural features +# +CONFIG_AS_HAS_ARMV8_5=y +# CONFIG_ARM64_BTI is not set +CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y +CONFIG_ARM64_E0PD=y +CONFIG_ARM64_AS_HAS_MTE=y +CONFIG_ARM64_MTE=y +# end of ARMv8.5 architectural features + +# +# ARMv8.7 architectural features +# +CONFIG_ARM64_EPAN=y +# end of ARMv8.7 architectural features + +CONFIG_ARM64_SVE=y +CONFIG_ARM64_SME=y +# CONFIG_ARM64_PSEUDO_NMI is not set +CONFIG_RELOCATABLE=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_RANDOMIZE_MODULE_REGION_FULL=y +CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y +CONFIG_STACKPROTECTOR_PER_TASK=y +# end of Kernel Features + +# +# Boot options +# +CONFIG_CMDLINE="" +# CONFIG_EFI is not set +# end of Boot options + +# +# Power management options +# +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_SUSPEND_SKIP_SYNC=y +# CONFIG_HIBERNATION is not set +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_PM_AUTOSLEEP=y +# CONFIG_PM_USERSPACE_AUTOSLEEP is not set +# CONFIG_PM_WAKELOCKS is not set +CONFIG_PM=y +# CONFIG_PM_DEBUG is not set +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_CPU_PM=y +CONFIG_ENERGY_MODEL=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +# end of Power management options + +# +# CPU Power Management +# + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set +CONFIG_DT_IDLE_STATES=y +CONFIG_DT_IDLE_GENPD=y + +# +# ARM CPU Idle Drivers +# +CONFIG_ARM_PSCI_CPUIDLE=y +CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y +# end of ARM CPU Idle Drivers +# end of CPU Idle + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y + +# +# CPU frequency scaling drivers +# +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +# CONFIG_ARM_SCPI_CPUFREQ is not set +# CONFIG_ARM_SCMI_CPUFREQ is not set +# end of CPU Frequency scaling +# end of CPU Power Management + +CONFIG_HAVE_KVM=y +# CONFIG_VIRTUALIZATION is not set + +# +# General architecture-dependent options +# +CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y +CONFIG_HOTPLUG_CORE_SYNC=y +CONFIG_HOTPLUG_CORE_SYNC_DEAD=y +# CONFIG_KPROBES is not set +# CONFIG_JUMP_LABEL is not set +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_KEEPINITRD=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_SET_DIRECT_MAP=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_HAVE_ASM_MODVERSIONS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_MMU_LAZY_TLB_REFCOUNT=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP=y +CONFIG_SECCOMP_FILTER=y +# CONFIG_SECCOMP_CACHE_DEBUG is not set +CONFIG_HAVE_ARCH_STACKLEAK=y +CONFIG_HAVE_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y +# CONFIG_SHADOW_CALL_STACK is not set +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI_CLANG=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_MOVE_PUD=y +CONFIG_HAVE_MOVE_PMD=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_COMPAT_OLD_SIGACTION=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_HAVE_ARCH_COMPILER_H=y +CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +# CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_ARCH_HAS_RELR=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +CONFIG_GCC_PLUGINS=y +# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +CONFIG_FUNCTION_ALIGNMENT_4B=y +CONFIG_FUNCTION_ALIGNMENT=4 +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +# CONFIG_MODULE_DEBUG is not set +CONFIG_MODULE_FORCE_LOAD=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +CONFIG_MODULE_COMPRESS_NONE=y +# CONFIG_MODULE_COMPRESS_GZIP is not set +# CONFIG_MODULE_COMPRESS_XZ is not set +# CONFIG_MODULE_COMPRESS_ZSTD is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_DEV_BSG_COMMON=y +CONFIG_BLK_DEV_BSGLIB=y +# CONFIG_BLK_DEV_INTEGRITY is not set +# CONFIG_BLK_DEV_ZONED is not set +# CONFIG_BLK_DEV_THROTTLING is not set +# CONFIG_BLK_WBT is not set +# CONFIG_BLK_CGROUP_IOLATENCY is not set +# CONFIG_BLK_CGROUP_IOCOST is not set +# CONFIG_BLK_CGROUP_IOPRIO is not set +CONFIG_BLK_DEBUG_FS=y +# CONFIG_BLK_SED_OPAL is not set +# CONFIG_BLK_INLINE_ENCRYPTION is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_AIX_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +CONFIG_EFI_PARTITION=y +# CONFIG_SYSV68_PARTITION is not set +# CONFIG_CMDLINE_PARTITION is not set +# end of Partition Types + +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_PM=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y + +# +# IO Schedulers +# +CONFIG_MQ_IOSCHED_DEADLINE=y +# CONFIG_MQ_IOSCHED_KYBER is not set +# CONFIG_IOSCHED_BFQ is not set +# end of IO Schedulers + +CONFIG_PADATA=y +CONFIG_ASN1=y +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y +CONFIG_FREEZER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_COMPAT_BINFMT_ELF=y +CONFIG_ARCH_BINFMT_ELF_STATE=y +CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y +CONFIG_ARCH_HAVE_ELF_PROT=y +CONFIG_ARCH_USE_GNU_PROPERTY=y +CONFIG_ELFCORE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_BINFMT_SCRIPT=y +CONFIG_BINFMT_MISC=y +CONFIG_COREDUMP=y +# end of Executable file formats + +# +# Memory Management options +# +CONFIG_SWAP=y +# CONFIG_ZSWAP is not set +CONFIG_ZSMALLOC=y +# CONFIG_ZSMALLOC_STAT is not set +CONFIG_ZSMALLOC_CHAIN_SIZE=8 + +# +# SLAB allocator options +# +# CONFIG_SLAB_DEPRECATED is not set +CONFIG_SLUB=y +# CONFIG_SLUB_TINY is not set +# CONFIG_SLAB_MERGE_DEFAULT is not set +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLUB_STATS is not set +# CONFIG_SLUB_CPU_PARTIAL is not set +# CONFIG_RANDOM_KMALLOC_CACHES is not set +# end of SLAB allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_HAVE_FAST_GUP=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +# CONFIG_MEMORY_HOTPLUG is not set +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_SPLIT_PTLOCK_CPUS=4 +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +# CONFIG_COMPACTION is not set +# CONFIG_PAGE_REPORTING is not set +CONFIG_MIGRATION=y +CONFIG_PHYS_ADDR_T_64BIT=y +# CONFIG_KSM is not set +CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +# CONFIG_MEMORY_FAILURE is not set +CONFIG_ARCH_WANTS_THP_SWAP=y +# CONFIG_TRANSPARENT_HUGEPAGE is not set +# CONFIG_CMA is not set +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y +CONFIG_ARCH_HAS_PTE_DEVMAP=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +CONFIG_ZONE_DMA=y +CONFIG_ZONE_DMA32=y +CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y +CONFIG_ARCH_USES_PG_ARCH_X=y +# CONFIG_VM_EVENT_COUNTERS is not set +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_TEST is not set +# CONFIG_DMAPOOL_TEST is not set +CONFIG_ARCH_HAS_PTE_SPECIAL=y +CONFIG_MEMFD_CREATE=y +CONFIG_SECRETMEM=y +# CONFIG_ANON_VMA_NAME is not set +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set +CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y +CONFIG_PER_VMA_LOCK=y +CONFIG_LOCK_MM_AND_FIND_VMA=y + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring +# end of Memory Management options + +CONFIG_NET=y +CONFIG_COMPAT_NETLINK_MESSAGES=y +CONFIG_NET_INGRESS=y +CONFIG_NET_EGRESS=y +CONFIG_NET_XGRESS=y +CONFIG_SKB_EXTENSIONS=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_DIAG is not set +CONFIG_UNIX=y +CONFIG_UNIX_SCM=y +CONFIG_AF_UNIX_OOB=y +CONFIG_UNIX_DIAG=m +# CONFIG_TLS is not set +CONFIG_XFRM=y +CONFIG_XFRM_ALGO=y +CONFIG_XFRM_USER=y +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_AH=y +CONFIG_XFRM_ESP=y +CONFIG_XFRM_IPCOMP=y +CONFIG_NET_KEY=y +# CONFIG_NET_KEY_MIGRATE is not set +# CONFIG_XDP_SOCKETS is not set +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +# CONFIG_IP_FIB_TRIE_STATS is not set +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_ROUTE_CLASSID=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IP_TUNNEL=y +CONFIG_NET_IPGRE=m +# CONFIG_NET_IPGRE_BROADCAST is not set +CONFIG_IP_MROUTE_COMMON=y +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_SYN_COOKIES=y +# CONFIG_NET_IPVTI is not set +CONFIG_NET_UDP_TUNNEL=y +# CONFIG_NET_FOU is not set +# CONFIG_NET_FOU_IP_TUNNELS is not set +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +# CONFIG_INET_ESP_OFFLOAD is not set +# CONFIG_INET_ESPINTCP is not set +CONFIG_INET_IPCOMP=y +CONFIG_INET_TABLE_PERTURB_ORDER=16 +CONFIG_INET_XFRM_TUNNEL=y +CONFIG_INET_TUNNEL=y +# CONFIG_INET_DIAG is not set +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_BIC=m +CONFIG_TCP_CONG_CUBIC=m +CONFIG_TCP_CONG_WESTWOOD=m +CONFIG_TCP_CONG_HTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_VEGAS=m +# CONFIG_TCP_CONG_NV is not set +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_CDG=m +# CONFIG_TCP_CONG_BBR is not set +CONFIG_DEFAULT_RENO=y +CONFIG_DEFAULT_TCP_CONG="reno" +CONFIG_TCP_MD5SIG=y +# CONFIG_IPV6 is not set +# CONFIG_NETLABEL is not set +# CONFIG_MPTCP is not set +# CONFIG_NETWORK_SECMARK is not set +CONFIG_NET_PTP_CLASSIFY=y +# CONFIG_NETWORK_PHY_TIMESTAMPING is not set +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_INGRESS=y +CONFIG_NETFILTER_EGRESS=y +CONFIG_NETFILTER_NETLINK=y +CONFIG_NETFILTER_FAMILY_BRIDGE=y +CONFIG_NETFILTER_FAMILY_ARP=y +CONFIG_NETFILTER_BPF_LINK=y +# CONFIG_NETFILTER_NETLINK_HOOK is not set +CONFIG_NETFILTER_NETLINK_ACCT=m +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y +CONFIG_NETFILTER_NETLINK_OSF=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_LOG_SYSLOG=m +CONFIG_NETFILTER_CONNCOUNT=m +CONFIG_NF_CONNTRACK_MARK=y +# CONFIG_NF_CONNTRACK_ZONES is not set +CONFIG_NF_CONNTRACK_PROCFS=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_TIMEOUT=y +CONFIG_NF_CONNTRACK_TIMESTAMP=y +CONFIG_NF_CONNTRACK_LABELS=y +CONFIG_NF_CONNTRACK_OVS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_GRE=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_BROADCAST=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m +# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set +CONFIG_NF_NAT=m +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_SIP=m +CONFIG_NF_NAT_TFTP=m +CONFIG_NF_NAT_REDIRECT=y +CONFIG_NF_NAT_MASQUERADE=y +CONFIG_NF_NAT_OVS=y +CONFIG_NETFILTER_SYNPROXY=m +CONFIG_NF_TABLES=m +# CONFIG_NF_TABLES_NETDEV is not set +# CONFIG_NFT_NUMGEN is not set +CONFIG_NFT_CT=m +# CONFIG_NFT_CONNLIMIT is not set +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +# CONFIG_NFT_TUNNEL is not set +CONFIG_NFT_QUEUE=m +# CONFIG_NFT_QUOTA is not set +CONFIG_NFT_REJECT=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +# CONFIG_NFT_XFRM is not set +# CONFIG_NFT_SOCKET is not set +# CONFIG_NFT_OSF is not set +# CONFIG_NFT_TPROXY is not set +# CONFIG_NFT_SYNPROXY is not set +# CONFIG_NF_FLOW_TABLE is not set +CONFIG_NETFILTER_XTABLES=y +CONFIG_NETFILTER_XTABLES_COMPAT=y + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=m +CONFIG_NETFILTER_XT_CONNMARK=m +CONFIG_NETFILTER_XT_SET=m + +# +# Xtables targets +# +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_CT=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HL=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_NAT=m +CONFIG_NETFILTER_XT_TARGET_NETMAP=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_RATEEST=m +CONFIG_NETFILTER_XT_TARGET_REDIRECT=m +CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m +CONFIG_NETFILTER_XT_TARGET_TEE=m +CONFIG_NETFILTER_XT_TARGET_TPROXY=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m + +# +# Xtables matches +# +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ECN=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_HL=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_L2TP=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_RECENT=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +# end of Core Netfilter Configuration + +CONFIG_IP_SET=y +CONFIG_IP_SET_MAX=256 +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +# CONFIG_IP_SET_HASH_IPMAC is not set +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_AH_ESP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +# CONFIG_IP_VS_MH is not set +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m +# CONFIG_IP_VS_TWOS is not set + +# +# IPVS SH scheduler +# +CONFIG_IP_VS_SH_TAB_BITS=8 + +# +# IPVS MH scheduler +# +CONFIG_IP_VS_MH_TAB_INDEX=12 + +# +# IPVS application helper +# +# CONFIG_IP_VS_FTP is not set +CONFIG_IP_VS_NFCT=y +# CONFIG_IP_VS_PE_SIP is not set + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=m +CONFIG_NF_SOCKET_IPV4=m +CONFIG_NF_TPROXY_IPV4=m +# CONFIG_NF_TABLES_IPV4 is not set +# CONFIG_NF_TABLES_ARP is not set +CONFIG_NF_DUP_IPV4=m +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_NF_REJECT_IPV4=m +CONFIG_NF_NAT_SNMP_BASIC=m +CONFIG_NF_NAT_PPTP=m +CONFIG_NF_NAT_H323=m +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_SYNPROXY=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# end of IP: Netfilter Configuration + +CONFIG_NF_TABLES_BRIDGE=m +CONFIG_NFT_BRIDGE_META=m +# CONFIG_NF_CONNTRACK_BRIDGE is not set +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_NFLOG=m +# CONFIG_BPFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_RDS is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_L2TP is not set +CONFIG_STP=y +CONFIG_BRIDGE=y +CONFIG_BRIDGE_IGMP_SNOOPING=y +# CONFIG_BRIDGE_VLAN_FILTERING is not set +# CONFIG_BRIDGE_MRP is not set +# CONFIG_BRIDGE_CFM is not set +# CONFIG_NET_DSA is not set +CONFIG_VLAN_8021Q=y +# CONFIG_VLAN_8021Q_GVRP is not set +# CONFIG_VLAN_8021Q_MVRP is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +# CONFIG_IEEE802154 is not set +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +CONFIG_NET_SCH_HTB=y +# CONFIG_NET_SCH_HFSC is not set +# CONFIG_NET_SCH_PRIO is not set +# CONFIG_NET_SCH_MULTIQ is not set +# CONFIG_NET_SCH_RED is not set +# CONFIG_NET_SCH_SFB is not set +# CONFIG_NET_SCH_SFQ is not set +# CONFIG_NET_SCH_TEQL is not set +# CONFIG_NET_SCH_TBF is not set +# CONFIG_NET_SCH_CBS is not set +# CONFIG_NET_SCH_ETF is not set +# CONFIG_NET_SCH_TAPRIO is not set +# CONFIG_NET_SCH_GRED is not set +# CONFIG_NET_SCH_NETEM is not set +# CONFIG_NET_SCH_DRR is not set +# CONFIG_NET_SCH_MQPRIO is not set +# CONFIG_NET_SCH_SKBPRIO is not set +# CONFIG_NET_SCH_CHOKE is not set +# CONFIG_NET_SCH_QFQ is not set +CONFIG_NET_SCH_CODEL=y +CONFIG_NET_SCH_FQ_CODEL=y +# CONFIG_NET_SCH_CAKE is not set +# CONFIG_NET_SCH_FQ is not set +# CONFIG_NET_SCH_HHF is not set +# CONFIG_NET_SCH_PIE is not set +# CONFIG_NET_SCH_PLUG is not set +# CONFIG_NET_SCH_ETS is not set +# CONFIG_NET_SCH_DEFAULT is not set + +# +# Classification +# +CONFIG_NET_CLS=y +# CONFIG_NET_CLS_BASIC is not set +# CONFIG_NET_CLS_ROUTE4 is not set +# CONFIG_NET_CLS_FW is not set +CONFIG_NET_CLS_U32=y +# CONFIG_CLS_U32_PERF is not set +CONFIG_CLS_U32_MARK=y +# CONFIG_NET_CLS_FLOW is not set +CONFIG_NET_CLS_CGROUP=y +# CONFIG_NET_CLS_BPF is not set +# CONFIG_NET_CLS_FLOWER is not set +# CONFIG_NET_CLS_MATCHALL is not set +# CONFIG_NET_EMATCH is not set +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_SCH_FIFO=y +# CONFIG_DCB is not set +CONFIG_DNS_RESOLVER=y +# CONFIG_BATMAN_ADV is not set +CONFIG_OPENVSWITCH=m +CONFIG_OPENVSWITCH_GRE=m +CONFIG_OPENVSWITCH_VXLAN=m +# CONFIG_VSOCKETS is not set +# CONFIG_NETLINK_DIAG is not set +CONFIG_MPLS=y +CONFIG_NET_MPLS_GSO=m +# CONFIG_MPLS_ROUTING is not set +CONFIG_NET_NSH=m +# CONFIG_HSR is not set +# CONFIG_NET_SWITCHDEV is not set +CONFIG_NET_L3_MASTER_DEV=y +# CONFIG_QRTR is not set +# CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y +CONFIG_MAX_SKB_FRAGS=17 +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_XPS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_NET_CLASSID=y +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +# CONFIG_BPF_STREAM_PARSER is not set +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# end of Network testing +# end of Networking options + +# CONFIG_HAMRADIO is not set +CONFIG_CAN=y +CONFIG_CAN_RAW=y +CONFIG_CAN_BCM=y +CONFIG_CAN_GW=y +# CONFIG_CAN_J1939 is not set +# CONFIG_CAN_ISOTP is not set +CONFIG_BT=m +CONFIG_BT_BREDR=y +CONFIG_BT_RFCOMM=y +# CONFIG_BT_RFCOMM_TTY is not set +# CONFIG_BT_BNEP is not set +# CONFIG_BT_CMTP is not set +CONFIG_BT_HIDP=y +CONFIG_BT_HS=y +CONFIG_BT_LE=y +CONFIG_BT_LE_L2CAP_ECRED=y +# CONFIG_BT_LEDS is not set +# CONFIG_BT_MSFTEXT is not set +# CONFIG_BT_AOSPEXT is not set +CONFIG_BT_DEBUGFS=y +# CONFIG_BT_SELFTEST is not set + +# +# Bluetooth device drivers +# +CONFIG_BT_INTEL=m +CONFIG_BT_BCM=m +CONFIG_BT_RTL=m +CONFIG_BT_HCIBTUSB=m +# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set +CONFIG_BT_HCIBTUSB_POLL_SYNC=y +CONFIG_BT_HCIBTUSB_BCM=y +# CONFIG_BT_HCIBTUSB_MTK is not set +CONFIG_BT_HCIBTUSB_RTL=y +# CONFIG_BT_HCIBTSDIO is not set +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_SERDEV=y +CONFIG_BT_HCIUART_H4=y +# CONFIG_BT_HCIUART_NOKIA is not set +# CONFIG_BT_HCIUART_BCSP is not set +CONFIG_BT_HCIUART_ATH3K=y +# CONFIG_BT_HCIUART_LL is not set +# CONFIG_BT_HCIUART_3WIRE is not set +# CONFIG_BT_HCIUART_INTEL is not set +# CONFIG_BT_HCIUART_BCM is not set +# CONFIG_BT_HCIUART_RTL is not set +# CONFIG_BT_HCIUART_QCA is not set +# CONFIG_BT_HCIUART_AG6XX is not set +# CONFIG_BT_HCIUART_MRVL is not set +# CONFIG_BT_HCIBCM203X is not set +# CONFIG_BT_HCIBCM4377 is not set +# CONFIG_BT_HCIBPA10X is not set +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIVHCI=m +CONFIG_BT_MRVL=m +CONFIG_BT_MRVL_SDIO=m +# CONFIG_BT_ATH3K is not set +# CONFIG_BT_MTKSDIO is not set +# CONFIG_BT_MTKUART is not set +# CONFIG_BT_NXPUART is not set +# end of Bluetooth device drivers + +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +# CONFIG_MCTP is not set +CONFIG_FIB_RULES=y +CONFIG_WIRELESS=y +CONFIG_WIRELESS_EXT=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_WEXT_SPY=y +CONFIG_WEXT_PRIV=y +CONFIG_CFG80211=m +# CONFIG_NL80211_TESTMODE is not set +# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set +# CONFIG_CFG80211_CERTIFICATION_ONUS is not set +CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y +CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y +# CONFIG_CFG80211_DEFAULT_PS is not set +# CONFIG_CFG80211_DEBUGFS is not set +# CONFIG_CFG80211_CRDA_SUPPORT is not set +CONFIG_CFG80211_WEXT=y +CONFIG_LIB80211=m +# CONFIG_LIB80211_DEBUG is not set +CONFIG_MAC80211=m +CONFIG_MAC80211_HAS_RC=y +CONFIG_MAC80211_RC_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" +CONFIG_MAC80211_MESH=y +CONFIG_MAC80211_LEDS=y +# CONFIG_MAC80211_DEBUGFS is not set +# CONFIG_MAC80211_MESSAGE_TRACING is not set +# CONFIG_MAC80211_DEBUG_MENU is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +CONFIG_RFKILL=m +CONFIG_RFKILL_LEDS=y +CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=m +# CONFIG_NET_9P is not set +# CONFIG_CAIF is not set +CONFIG_CEPH_LIB=m +# CONFIG_CEPH_LIB_PRETTYDEBUG is not set +# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set +# CONFIG_NFC is not set +# CONFIG_PSAMPLE is not set +# CONFIG_NET_IFE is not set +# CONFIG_LWTUNNEL is not set +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +CONFIG_NET_SELFTESTS=y +CONFIG_NET_SOCK_MSG=y +CONFIG_PAGE_POOL=y +# CONFIG_PAGE_POOL_STATS is not set +# CONFIG_FAILOVER is not set +# CONFIG_ETHTOOL_NETLINK is not set + +# +# Device Drivers +# +CONFIG_ARM_AMBA=y +CONFIG_HAVE_PCI=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_SYSCALL=y +CONFIG_PCIEPORTBUS=y +CONFIG_PCIEAER=y +# CONFIG_PCIEAER_INJECT is not set +# CONFIG_PCIE_ECRC is not set +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set +CONFIG_PCIE_PME=y +# CONFIG_PCIE_DPC is not set +# CONFIG_PCIE_PTM is not set +CONFIG_PCI_MSI=y +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set +# CONFIG_PCI_IOV is not set +# CONFIG_PCI_PRI is not set +# CONFIG_PCI_PASID is not set +# CONFIG_PCI_DYNAMIC_OF_NODES is not set +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 +# CONFIG_HOTPLUG_PCI is not set + +# +# PCI controller drivers +# +# CONFIG_PCIE_ALTERA is not set +# CONFIG_PCI_HOST_THUNDER_PEM is not set +# CONFIG_PCI_HOST_THUNDER_ECAM is not set +# CONFIG_PCI_FTPCI100 is not set +# CONFIG_PCI_HOST_GENERIC is not set +# CONFIG_PCIE_MICROCHIP_HOST is not set +CONFIG_PCIE_ROCKCHIP=y +CONFIG_PCIE_ROCKCHIP_HOST=y +# CONFIG_PCI_XGENE is not set +# CONFIG_PCIE_XILINX is not set + +# +# Cadence-based PCIe controllers +# +# CONFIG_PCIE_CADENCE_PLAT_HOST is not set +# CONFIG_PCI_J721E_HOST is not set +# end of Cadence-based PCIe controllers + +# +# DesignWare-based PCIe controllers +# +CONFIG_PCIE_DW=y +CONFIG_PCIE_DW_HOST=y +# CONFIG_PCIE_AL is not set +# CONFIG_PCI_MESON is not set +# CONFIG_PCI_HISI is not set +# CONFIG_PCIE_KIRIN is not set +# CONFIG_PCIE_DW_PLAT_HOST is not set +CONFIG_PCIE_ROCKCHIP_DW_HOST=y +# end of DesignWare-based PCIe controllers + +# +# Mobiveil-based PCIe controllers +# +# end of Mobiveil-based PCIe controllers +# end of PCI controller drivers + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# end of PCI Endpoint + +# +# PCI switch controller drivers +# +# CONFIG_PCI_SW_SWITCHTEC is not set +# end of PCI switch controller drivers + +# CONFIG_CXL_BUS is not set +# CONFIG_PCCARD is not set +# CONFIG_RAPIDIO is not set + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER=y +CONFIG_UEVENT_HELPER_PATH="" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_DEVTMPFS_SAFE=y +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_FW_LOADER_DEBUG=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_FW_LOADER_SYSFS=y +CONFIG_EXTRA_FIRMWARE="" +CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +# CONFIG_FW_LOADER_COMPRESS is not set +CONFIG_FW_CACHE=y +# CONFIG_FW_UPLOAD is not set +# end of Firmware loader + +CONFIG_WANT_DEV_COREDUMP=y +# CONFIG_ALLOW_DEV_COREDUMP is not set +# CONFIG_DEBUG_DRIVER is not set +CONFIG_DEBUG_DEVRES=y +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_SOC_BUS=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_SPI=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGMAP_IRQ=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +CONFIG_GENERIC_ARCH_TOPOLOGY=y +# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set +# end of Generic Driver Options + +# +# Bus devices +# +# CONFIG_BRCMSTB_GISB_ARB is not set +# CONFIG_MOXTET is not set +# CONFIG_VEXPRESS_CONFIG is not set +# CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set +# end of Bus devices + +# +# Cache Drivers +# +# end of Cache Drivers + +CONFIG_CONNECTOR=y +CONFIG_PROC_EVENTS=y + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +CONFIG_ARM_SCMI_PROTOCOL=y +# CONFIG_ARM_SCMI_RAW_MODE_SUPPORT is not set +CONFIG_ARM_SCMI_HAVE_TRANSPORT=y +CONFIG_ARM_SCMI_HAVE_SHMEM=y +CONFIG_ARM_SCMI_TRANSPORT_MAILBOX=y +CONFIG_ARM_SCMI_TRANSPORT_SMC=y +# CONFIG_ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE is not set +CONFIG_ARM_SCMI_POWER_DOMAIN=y +CONFIG_ARM_SCMI_POWER_CONTROL=y +# end of ARM System Control and Management Interface Protocol + +CONFIG_ARM_SCPI_PROTOCOL=y +CONFIG_ARM_SCPI_POWER_DOMAIN=y +# CONFIG_FIRMWARE_MEMMAP is not set +# CONFIG_FW_CFG_SYSFS is not set +CONFIG_ARM_FFA_TRANSPORT=y +CONFIG_ARM_FFA_SMCCC=y +# CONFIG_GOOGLE_FIRMWARE is not set +CONFIG_ARM_PSCI_FW=y +# CONFIG_ARM_PSCI_CHECKER is not set +CONFIG_HAVE_ARM_SMCCC=y +CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y +CONFIG_ARM_SMCCC_SOC_ID=y + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +# CONFIG_GNSS is not set +CONFIG_MTD=y +# CONFIG_MTD_TESTS is not set + +# +# Partition parsers +# +# CONFIG_MTD_AR7_PARTS is not set +# CONFIG_MTD_CMDLINE_PARTS is not set +CONFIG_MTD_OF_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_REDBOOT_PARTS is not set +# end of Partition parsers + +# +# User Modules And Translation Layers +# +CONFIG_MTD_BLKDEVS=y +CONFIG_MTD_BLOCK=y + +# +# Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. +# +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_SM_FTL is not set +# CONFIG_MTD_OOPS is not set +# CONFIG_MTD_SWAP is not set +# CONFIG_MTD_PARTITIONED_MASTER is not set + +# +# RAM/ROM/Flash chip drivers +# +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# end of RAM/ROM/Flash chip drivers + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_INTEL_VR_NOR is not set +# CONFIG_MTD_PLATRAM is not set +# end of Mapping drivers for chip access + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_MCHP23K256 is not set +# CONFIG_MTD_MCHP48L640 is not set +# CONFIG_MTD_SST25L is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOCG3 is not set +# end of Self-contained MTD device drivers + +# +# NAND +# +# CONFIG_MTD_ONENAND is not set +# CONFIG_MTD_RAW_NAND is not set +# CONFIG_MTD_SPI_NAND is not set + +# +# ECC engine support +# +# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set +# CONFIG_MTD_NAND_ECC_SW_BCH is not set +# CONFIG_MTD_NAND_ECC_MXIC is not set +# end of ECC engine support +# end of NAND + +# +# LPDDR & LPDDR2 PCM memory drivers +# +# CONFIG_MTD_LPDDR is not set +# end of LPDDR & LPDDR2 PCM memory drivers + +CONFIG_MTD_SPI_NOR=y +CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y +# CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set +CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y +# CONFIG_MTD_SPI_NOR_SWP_KEEP is not set +# CONFIG_MTD_UBI is not set +# CONFIG_MTD_HYPERBUS is not set +CONFIG_DTC=y +CONFIG_OF=y +# CONFIG_OF_UNITTEST is not set +CONFIG_OF_FLATTREE=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_KOBJ=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_IRQ=y +CONFIG_OF_RESERVED_MEM=y +CONFIG_OF_RESOLVE=y +CONFIG_OF_OVERLAY=y +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_NULL_BLK is not set +CONFIG_CDROM=y +# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +CONFIG_ZRAM=y +CONFIG_ZRAM_DEF_COMP_LZORLE=y +# CONFIG_ZRAM_DEF_COMP_ZSTD is not set +# CONFIG_ZRAM_DEF_COMP_LZ4 is not set +# CONFIG_ZRAM_DEF_COMP_LZO is not set +# CONFIG_ZRAM_DEF_COMP_LZ4HC is not set +CONFIG_ZRAM_DEF_COMP="lzo-rle" +# CONFIG_ZRAM_WRITEBACK is not set +# CONFIG_ZRAM_MEMORY_TRACKING is not set +# CONFIG_ZRAM_MULTI_COMP is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +CONFIG_BLK_DEV_DRBD=m +# CONFIG_DRBD_FAULT_INJECTION is not set +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=1 +CONFIG_BLK_DEV_RAM_SIZE=4096 +# CONFIG_CDROM_PKTCDVD is not set +CONFIG_ATA_OVER_ETH=m +CONFIG_BLK_DEV_RBD=m +# CONFIG_BLK_DEV_UBLK is not set + +# +# NVME Support +# +CONFIG_NVME_CORE=m +CONFIG_BLK_DEV_NVME=m +# CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set +# CONFIG_NVME_HWMON is not set +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_AUTH is not set +# CONFIG_NVME_TARGET is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_PHANTOM is not set +# CONFIG_TIFM_CORE is not set +# CONFIG_ICS932S401 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +CONFIG_SRAM=y +# CONFIG_DW_XDATA_PCIE is not set +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_HISI_HIKEY_USB is not set +# CONFIG_OPEN_DICE is not set +# CONFIG_VCPU_STALL_DETECTOR is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_MAX6875 is not set +CONFIG_EEPROM_93CX6=y +# CONFIG_EEPROM_93XX46 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set +# CONFIG_EEPROM_EE1004 is not set +# end of EEPROM support + +# CONFIG_CB710_CORE is not set + +# +# Texas Instruments shared transport line discipline +# +# CONFIG_TI_ST is not set +# end of Texas Instruments shared transport line discipline + +# CONFIG_SENSORS_LIS3_SPI is not set +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_ALTERA_STAPL is not set +# CONFIG_VMWARE_VMCI is not set +# CONFIG_GENWQE is not set +# CONFIG_ECHO is not set +# CONFIG_BCM_VK is not set +# CONFIG_MISC_ALCOR_PCI is not set +# CONFIG_MISC_RTSX_PCI is not set +# CONFIG_MISC_RTSX_USB is not set +# CONFIG_UACCE is not set +# CONFIG_PVPANIC is not set +# CONFIG_GP_PCI1XXXX is not set +# end of Misc devices + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +CONFIG_RAID_ATTRS=m +CONFIG_SCSI_COMMON=y +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +# CONFIG_CHR_DEV_ST is not set +CONFIG_BLK_DEV_SR=y +# CONFIG_CHR_DEV_SG is not set +CONFIG_BLK_DEV_BSG=y +# CONFIG_CHR_DEV_SCH is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +CONFIG_SCSI_SPI_ATTRS=y +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set +CONFIG_SCSI_SAS_ATTRS=m +# CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# end of SCSI Transports + +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_ISCSI_BOOT_SYSFS is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_HISI_SAS is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_MPT3SAS=m +CONFIG_SCSI_MPT2SAS_MAX_SGE=128 +CONFIG_SCSI_MPT3SAS_MAX_SGE=128 +CONFIG_SCSI_MPT2SAS=m +# CONFIG_SCSI_MPI3MR is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_WD719X is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set +# CONFIG_SCSI_DH is not set +# end of SCSI device support + +CONFIG_ATA=y +CONFIG_SATA_HOST=y +CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_ATA_FORCE=y +CONFIG_SATA_PMP=y + +# +# Controllers with non-SFF native interface +# +CONFIG_SATA_AHCI=y +CONFIG_SATA_MOBILE_LPM_POLICY=0 +CONFIG_SATA_AHCI_PLATFORM=y +# CONFIG_AHCI_DWC is not set +# CONFIG_AHCI_CEVA is not set +# CONFIG_SATA_INIC162X is not set +# CONFIG_SATA_ACARD_AHCI is not set +# CONFIG_SATA_SIL24 is not set +CONFIG_ATA_SFF=y + +# +# SFF controllers with custom DMA interface +# +# CONFIG_PDC_ADMA is not set +# CONFIG_SATA_QSTOR is not set +# CONFIG_SATA_SX4 is not set +CONFIG_ATA_BMDMA=y + +# +# SATA SFF controllers with BMDMA +# +# CONFIG_ATA_PIIX is not set +# CONFIG_SATA_DWC is not set +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SIL=m +# CONFIG_SATA_SIS is not set +# CONFIG_SATA_SVW is not set +# CONFIG_SATA_ULI is not set +# CONFIG_SATA_VIA is not set +# CONFIG_SATA_VITESSE is not set + +# +# PATA SFF controllers with BMDMA +# +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_ATP867X is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_MARVELL is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PDC2027X is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RDC is not set +# CONFIG_PATA_SCH is not set +# CONFIG_PATA_SERVERWORKS is not set +# CONFIG_PATA_SIL680 is not set +# CONFIG_PATA_SIS is not set +# CONFIG_PATA_TOSHIBA is not set +# CONFIG_PATA_TRIFLEX is not set +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set + +# +# PIO-only SFF controllers +# +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_OF_PLATFORM is not set +# CONFIG_PATA_RZ1000 is not set + +# +# Generic fallback / legacy drivers +# +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_LEGACY is not set +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_AUTODETECT=y +CONFIG_MD_BITMAP_FILE=y +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=y +CONFIG_MD_RAID1=y +CONFIG_MD_RAID10=y +CONFIG_MD_RAID456=y +# CONFIG_MD_MULTIPATH is not set +# CONFIG_MD_FAULTY is not set +CONFIG_BCACHE=m +# CONFIG_BCACHE_DEBUG is not set +# CONFIG_BCACHE_CLOSURES_DEBUG is not set +# CONFIG_BCACHE_ASYNC_REGISTRATION is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=y +# CONFIG_DM_DEBUG is not set +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=m +# CONFIG_DM_SNAPSHOT is not set +# CONFIG_DM_THIN_PROVISIONING is not set +# CONFIG_DM_CACHE is not set +# CONFIG_DM_WRITECACHE is not set +# CONFIG_DM_EBS is not set +# CONFIG_DM_ERA is not set +# CONFIG_DM_CLONE is not set +# CONFIG_DM_MIRROR is not set +CONFIG_DM_RAID=y +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_DELAY is not set +# CONFIG_DM_DUST is not set +# CONFIG_DM_INIT is not set +# CONFIG_DM_UEVENT is not set +# CONFIG_DM_FLAKEY is not set +# CONFIG_DM_VERITY is not set +# CONFIG_DM_SWITCH is not set +# CONFIG_DM_LOG_WRITES is not set +# CONFIG_DM_INTEGRITY is not set +# CONFIG_TARGET_CORE is not set +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# end of IEEE 1394 (FireWire) support + +CONFIG_NETDEVICES=y +CONFIG_MII=y +CONFIG_NET_CORE=y +# CONFIG_BONDING is not set +# CONFIG_DUMMY is not set +CONFIG_WIREGUARD=y +# CONFIG_WIREGUARD_DEBUG is not set +# CONFIG_EQUALIZER is not set +# CONFIG_NET_FC is not set +# CONFIG_NET_TEAM is not set +CONFIG_MACVLAN=y +# CONFIG_MACVTAP is not set +CONFIG_IPVLAN_L3S=y +CONFIG_IPVLAN=y +# CONFIG_IPVTAP is not set +CONFIG_VXLAN=m +# CONFIG_GENEVE is not set +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_AMT is not set +# CONFIG_MACSEC is not set +# CONFIG_NETCONSOLE is not set +CONFIG_TUN=m +# CONFIG_TUN_VNET_CROSS_LE is not set +CONFIG_VETH=y +# CONFIG_NLMON is not set +# CONFIG_NET_VRF is not set +# CONFIG_ARCNET is not set +CONFIG_ETHERNET=y +CONFIG_MDIO=y +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_NET_VENDOR_ADAPTEC is not set +# CONFIG_NET_VENDOR_AGERE is not set +CONFIG_NET_VENDOR_ALACRITECH=y +# CONFIG_SLICOSS is not set +# CONFIG_NET_VENDOR_ALTEON is not set +# CONFIG_ALTERA_TSE is not set +CONFIG_NET_VENDOR_AMAZON=y +# CONFIG_ENA_ETHERNET is not set +# CONFIG_NET_VENDOR_AMD is not set +CONFIG_NET_VENDOR_AQUANTIA=y +# CONFIG_AQTION is not set +# CONFIG_NET_VENDOR_ARC is not set +CONFIG_NET_VENDOR_ASIX=y +# CONFIG_SPI_AX88796C is not set +# CONFIG_NET_VENDOR_ATHEROS is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +CONFIG_NET_VENDOR_CADENCE=y +# CONFIG_MACB is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_CISCO is not set +CONFIG_NET_VENDOR_CORTINA=y +# CONFIG_GEMINI_ETHERNET is not set +CONFIG_NET_VENDOR_DAVICOM=y +# CONFIG_DM9051 is not set +# CONFIG_DNET is not set +# CONFIG_NET_VENDOR_DEC is not set +# CONFIG_NET_VENDOR_DLINK is not set +# CONFIG_NET_VENDOR_EMULEX is not set +CONFIG_NET_VENDOR_ENGLEDER=y +# CONFIG_TSNEP is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +CONFIG_NET_VENDOR_FUNGIBLE=y +# CONFIG_FUN_ETH is not set +CONFIG_NET_VENDOR_GOOGLE=y +# CONFIG_GVE is not set +# CONFIG_NET_VENDOR_HISILICON is not set +CONFIG_NET_VENDOR_HUAWEI=y +# CONFIG_HINIC is not set +CONFIG_NET_VENDOR_I825XX=y +CONFIG_NET_VENDOR_INTEL=y +CONFIG_E100=y +CONFIG_E1000=y +CONFIG_E1000E=y +CONFIG_IGB=y +CONFIG_IGB_HWMON=y +# CONFIG_IGBVF is not set +CONFIG_IXGBE=y +CONFIG_IXGBE_HWMON=y +# CONFIG_IXGBEVF is not set +# CONFIG_I40E is not set +# CONFIG_I40EVF is not set +# CONFIG_ICE is not set +# CONFIG_FM10K is not set +# CONFIG_IGC is not set +# CONFIG_JME is not set +CONFIG_NET_VENDOR_ADI=y +CONFIG_NET_VENDOR_LITEX=y +# CONFIG_LITEX_LITEETH is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MELLANOX is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +CONFIG_NET_VENDOR_MICROSEMI=y +CONFIG_NET_VENDOR_MICROSOFT=y +# CONFIG_NET_VENDOR_MYRI is not set +# CONFIG_FEALNX is not set +CONFIG_NET_VENDOR_NI=y +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +CONFIG_NET_VENDOR_NETERION=y +# CONFIG_S2IO is not set +CONFIG_NET_VENDOR_NETRONOME=y +# CONFIG_NFP is not set +# CONFIG_NET_VENDOR_NVIDIA is not set +# CONFIG_NET_VENDOR_OKI is not set +# CONFIG_ETHOC is not set +CONFIG_NET_VENDOR_PACKET_ENGINES=y +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +CONFIG_NET_VENDOR_PENSANDO=y +# CONFIG_IONIC is not set +# CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RDC is not set +# CONFIG_NET_VENDOR_REALTEK is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set +CONFIG_NET_VENDOR_SOLARFLARE=y +# CONFIG_SFC is not set +# CONFIG_SFC_FALCON is not set +# CONFIG_SFC_SIENA is not set +# CONFIG_NET_VENDOR_SMSC is not set +CONFIG_NET_VENDOR_SOCIONEXT=y +CONFIG_NET_VENDOR_STMICRO=y +CONFIG_STMMAC_ETH=y +# CONFIG_STMMAC_SELFTESTS is not set +CONFIG_STMMAC_PLATFORM=y +# CONFIG_DWMAC_DWC_QOS_ETH is not set +CONFIG_DWMAC_GENERIC=y +CONFIG_DWMAC_ROCKCHIP=y +# CONFIG_DWMAC_INTEL_PLAT is not set +# CONFIG_DWMAC_LOONGSON is not set +# CONFIG_STMMAC_PCI is not set +# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_TEHUTI is not set +# CONFIG_NET_VENDOR_TI is not set +CONFIG_NET_VENDOR_VERTEXCOM=y +# CONFIG_MSE102X is not set +# CONFIG_NET_VENDOR_VIA is not set +CONFIG_NET_VENDOR_WANGXUN=y +# CONFIG_NGBE is not set +# CONFIG_TXGBE is not set +# CONFIG_NET_VENDOR_WIZNET is not set +CONFIG_NET_VENDOR_XILINX=y +# CONFIG_XILINX_EMACLITE is not set +# CONFIG_XILINX_AXI_EMAC is not set +# CONFIG_XILINX_LL_TEMAC is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +CONFIG_PHYLINK=y +CONFIG_PHYLIB=y +CONFIG_SWPHY=y +# CONFIG_LED_TRIGGER_PHY is not set +CONFIG_PHYLIB_LEDS=y +CONFIG_FIXED_PHY=y +# CONFIG_SFP is not set + +# +# MII PHY device drivers +# +# CONFIG_AMD_PHY is not set +# CONFIG_ADIN_PHY is not set +# CONFIG_ADIN1100_PHY is not set +# CONFIG_AQUANTIA_PHY is not set +CONFIG_AX88796B_PHY=y +# CONFIG_BROADCOM_PHY is not set +# CONFIG_BCM54140_PHY is not set +# CONFIG_BCM7XXX_PHY is not set +# CONFIG_BCM84881_PHY is not set +# CONFIG_BCM87XX_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_CORTINA_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_INTEL_XWAY_PHY is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_MARVELL_PHY is not set +# CONFIG_MARVELL_10G_PHY is not set +# CONFIG_MARVELL_88Q2XXX_PHY is not set +# CONFIG_MARVELL_88X2222_PHY is not set +# CONFIG_MAXLINEAR_GPHY is not set +# CONFIG_MEDIATEK_GE_PHY is not set +# CONFIG_MICREL_PHY is not set +# CONFIG_MICROCHIP_T1S_PHY is not set +# CONFIG_MICROCHIP_PHY is not set +# CONFIG_MICROCHIP_T1_PHY is not set +# CONFIG_MICROSEMI_PHY is not set +# CONFIG_MOTORCOMM_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_NXP_CBTX_PHY is not set +# CONFIG_NXP_C45_TJA11XX_PHY is not set +# CONFIG_NXP_TJA11XX_PHY is not set +# CONFIG_NCN26000_PHY is not set +# CONFIG_AT803X_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_RENESAS_PHY is not set +CONFIG_ROCKCHIP_PHY=y +# CONFIG_SMSC_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_TERANETICS_PHY is not set +# CONFIG_DP83822_PHY is not set +# CONFIG_DP83TC811_PHY is not set +# CONFIG_DP83848_PHY is not set +# CONFIG_DP83867_PHY is not set +# CONFIG_DP83869_PHY is not set +# CONFIG_DP83TD510_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_XILINX_GMII2RGMII is not set +# CONFIG_MICREL_KS8995MA is not set +# CONFIG_PSE_CONTROLLER is not set +CONFIG_CAN_DEV=y +# CONFIG_CAN_VCAN is not set +# CONFIG_CAN_VXCAN is not set +CONFIG_CAN_NETLINK=y +CONFIG_CAN_CALC_BITTIMING=y +# CONFIG_CAN_CAN327 is not set +# CONFIG_CAN_FLEXCAN is not set +# CONFIG_CAN_GRCAN is not set +# CONFIG_CAN_KVASER_PCIEFD is not set +# CONFIG_CAN_SLCAN is not set +# CONFIG_CAN_XILINXCAN is not set +# CONFIG_CAN_C_CAN is not set +# CONFIG_CAN_CC770 is not set +# CONFIG_CAN_CTUCANFD_PCI is not set +# CONFIG_CAN_CTUCANFD_PLATFORM is not set +# CONFIG_CAN_IFI_CANFD is not set +# CONFIG_CAN_M_CAN is not set +# CONFIG_CAN_PEAK_PCIEFD is not set +CONFIG_CAN_SJA1000=y +# CONFIG_CAN_EMS_PCI is not set +# CONFIG_CAN_F81601 is not set +# CONFIG_CAN_KVASER_PCI is not set +# CONFIG_CAN_PEAK_PCI is not set +CONFIG_CAN_PLX_PCI=y +# CONFIG_CAN_SJA1000_ISA is not set +# CONFIG_CAN_SJA1000_PLATFORM is not set +# CONFIG_CAN_SOFTING is not set + +# +# CAN SPI interfaces +# +# CONFIG_CAN_HI311X is not set +# CONFIG_CAN_MCP251X is not set +# CONFIG_CAN_MCP251XFD is not set +# end of CAN SPI interfaces + +# +# CAN USB interfaces +# +# CONFIG_CAN_8DEV_USB is not set +# CONFIG_CAN_EMS_USB is not set +# CONFIG_CAN_ESD_USB is not set +# CONFIG_CAN_ETAS_ES58X is not set +# CONFIG_CAN_F81604 is not set +# CONFIG_CAN_GS_USB is not set +# CONFIG_CAN_KVASER_USB is not set +# CONFIG_CAN_MCBA_USB is not set +# CONFIG_CAN_PEAK_USB is not set +# CONFIG_CAN_UCAN is not set +# end of CAN USB interfaces + +# CONFIG_CAN_DEBUG_DEVICES is not set +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_BUS=y +CONFIG_FWNODE_MDIO=y +CONFIG_OF_MDIO=y +CONFIG_MDIO_DEVRES=y +# CONFIG_MDIO_BITBANG is not set +# CONFIG_MDIO_BCM_UNIMAC is not set +# CONFIG_MDIO_HISI_FEMAC is not set +# CONFIG_MDIO_MVUSB is not set +# CONFIG_MDIO_MSCC_MIIM is not set +# CONFIG_MDIO_OCTEON is not set +# CONFIG_MDIO_IPQ4019 is not set +# CONFIG_MDIO_IPQ8064 is not set +# CONFIG_MDIO_THUNDER is not set + +# +# MDIO Multiplexers +# +# CONFIG_MDIO_BUS_MUX_GPIO is not set +# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set +# CONFIG_MDIO_BUS_MUX_MMIOREG is not set + +# +# PCS device drivers +# +CONFIG_PCS_XPCS=y +# end of PCS device drivers + +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +# CONFIG_PPP_FILTER is not set +# CONFIG_PPP_MPPE is not set +# CONFIG_PPP_MULTILINK is not set +CONFIG_PPPOE=m +# CONFIG_PPPOE_HASH_BITS_1 is not set +# CONFIG_PPPOE_HASH_BITS_2 is not set +CONFIG_PPPOE_HASH_BITS_4=y +# CONFIG_PPPOE_HASH_BITS_8 is not set +CONFIG_PPPOE_HASH_BITS=4 +# CONFIG_PPTP is not set +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +# CONFIG_SLIP is not set +CONFIG_SLHC=m +CONFIG_USB_NET_DRIVERS=y +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +CONFIG_USB_RTL8150=y +CONFIG_USB_RTL8152=y +# CONFIG_USB_LAN78XX is not set +CONFIG_USB_USBNET=y +CONFIG_USB_NET_AX8817X=y +CONFIG_USB_NET_AX88179_178A=y +CONFIG_USB_NET_CDCETHER=y +# CONFIG_USB_NET_CDC_EEM is not set +CONFIG_USB_NET_CDC_NCM=y +# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set +CONFIG_USB_NET_CDC_MBIM=y +# CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SR9700 is not set +# CONFIG_USB_NET_SR9800 is not set +# CONFIG_USB_NET_SMSC75XX is not set +# CONFIG_USB_NET_SMSC95XX is not set +# CONFIG_USB_NET_GL620A is not set +# CONFIG_USB_NET_NET1080 is not set +# CONFIG_USB_NET_PLUSB is not set +# CONFIG_USB_NET_MCS7830 is not set +CONFIG_USB_NET_RNDIS_HOST=y +# CONFIG_USB_NET_CDC_SUBSET is not set +# CONFIG_USB_NET_ZAURUS is not set +# CONFIG_USB_NET_CX82310_ETH is not set +# CONFIG_USB_NET_KALMIA is not set +CONFIG_USB_NET_QMI_WWAN=y +# CONFIG_USB_HSO is not set +# CONFIG_USB_NET_INT51X1 is not set +# CONFIG_USB_IPHETH is not set +# CONFIG_USB_SIERRA_NET is not set +# CONFIG_USB_VL600 is not set +# CONFIG_USB_NET_CH9200 is not set +# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_RTL8153_ECM=y +CONFIG_WLAN=y +CONFIG_WLAN_VENDOR_ADMTEK=y +# CONFIG_ADM8211 is not set +CONFIG_ATH_COMMON=m +CONFIG_WLAN_VENDOR_ATH=y +# CONFIG_ATH_DEBUG is not set +CONFIG_ATH5K=m +# CONFIG_ATH5K_DEBUG is not set +CONFIG_ATH5K_PCI=y +CONFIG_ATH9K_HW=m +CONFIG_ATH9K_COMMON=m +CONFIG_ATH9K_BTCOEX_SUPPORT=y +CONFIG_ATH9K=m +CONFIG_ATH9K_PCI=y +# CONFIG_ATH9K_AHB is not set +# CONFIG_ATH9K_DEBUGFS is not set +# CONFIG_ATH9K_DYNACK is not set +# CONFIG_ATH9K_WOW is not set +CONFIG_ATH9K_RFKILL=y +# CONFIG_ATH9K_CHANNEL_CONTEXT is not set +CONFIG_ATH9K_PCOEM=y +# CONFIG_ATH9K_PCI_NO_EEPROM is not set +# CONFIG_ATH9K_HTC is not set +# CONFIG_ATH9K_HWRNG is not set +# CONFIG_CARL9170 is not set +CONFIG_ATH6KL=m +# CONFIG_ATH6KL_SDIO is not set +CONFIG_ATH6KL_USB=m +# CONFIG_ATH6KL_DEBUG is not set +CONFIG_AR5523=m +# CONFIG_WIL6210 is not set +CONFIG_ATH10K=m +CONFIG_ATH10K_CE=y +# CONFIG_ATH10K_PCI is not set +# CONFIG_ATH10K_SDIO is not set +# CONFIG_ATH10K_USB is not set +# CONFIG_ATH10K_DEBUG is not set +# CONFIG_ATH10K_DEBUGFS is not set +CONFIG_WCN36XX=m +# CONFIG_WCN36XX_DEBUGFS is not set +CONFIG_WLAN_VENDOR_ATMEL=y +# CONFIG_ATMEL is not set +CONFIG_AT76C50X_USB=m +CONFIG_WLAN_VENDOR_BROADCOM=y +CONFIG_B43=m +CONFIG_B43_BCMA=y +CONFIG_B43_SSB=y +CONFIG_B43_BUSES_BCMA_AND_SSB=y +# CONFIG_B43_BUSES_BCMA is not set +# CONFIG_B43_BUSES_SSB is not set +CONFIG_B43_PCI_AUTOSELECT=y +CONFIG_B43_PCICORE_AUTOSELECT=y +# CONFIG_B43_SDIO is not set +CONFIG_B43_BCMA_PIO=y +CONFIG_B43_PIO=y +CONFIG_B43_PHY_G=y +CONFIG_B43_PHY_N=y +CONFIG_B43_PHY_LP=y +CONFIG_B43_PHY_HT=y +CONFIG_B43_LEDS=y +CONFIG_B43_HWRNG=y +# CONFIG_B43_DEBUG is not set +# CONFIG_B43LEGACY is not set +CONFIG_BRCMUTIL=m +# CONFIG_BRCMSMAC is not set +CONFIG_BRCMFMAC=m +CONFIG_BRCMFMAC_PROTO_BCDC=y +CONFIG_BRCMFMAC_PROTO_MSGBUF=y +# CONFIG_BRCMFMAC_SDIO is not set +CONFIG_BRCMFMAC_USB=y +CONFIG_BRCMFMAC_PCIE=y +# CONFIG_BRCM_TRACING is not set +# CONFIG_BRCMDBG is not set +CONFIG_WLAN_VENDOR_CISCO=y +# CONFIG_AIRO is not set +CONFIG_WLAN_VENDOR_INTEL=y +# CONFIG_IPW2100 is not set +# CONFIG_IPW2200 is not set +# CONFIG_IWL4965 is not set +# CONFIG_IWL3945 is not set +# CONFIG_IWLWIFI is not set +CONFIG_WLAN_VENDOR_INTERSIL=y +# CONFIG_HOSTAP is not set +# CONFIG_HERMES is not set +# CONFIG_P54_COMMON is not set +CONFIG_WLAN_VENDOR_MARVELL=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +# CONFIG_LIBERTAS_SDIO is not set +# CONFIG_LIBERTAS_SPI is not set +# CONFIG_LIBERTAS_DEBUG is not set +# CONFIG_LIBERTAS_MESH is not set +CONFIG_LIBERTAS_THINFIRM=m +# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set +# CONFIG_LIBERTAS_THINFIRM_USB is not set +CONFIG_MWIFIEX=m +CONFIG_MWIFIEX_SDIO=m +# CONFIG_MWIFIEX_PCIE is not set +CONFIG_MWIFIEX_USB=m +# CONFIG_MWL8K is not set +CONFIG_WLAN_VENDOR_MEDIATEK=y +CONFIG_MT7601U=m +# CONFIG_MT76x0U is not set +# CONFIG_MT76x0E is not set +# CONFIG_MT76x2E is not set +# CONFIG_MT76x2U is not set +# CONFIG_MT7603E is not set +# CONFIG_MT7615E is not set +# CONFIG_MT7663U is not set +# CONFIG_MT7663S is not set +# CONFIG_MT7915E is not set +# CONFIG_MT7921E is not set +# CONFIG_MT7921S is not set +# CONFIG_MT7921U is not set +# CONFIG_MT7996E is not set +CONFIG_WLAN_VENDOR_MICROCHIP=y +# CONFIG_WILC1000_SDIO is not set +# CONFIG_WILC1000_SPI is not set +CONFIG_WLAN_VENDOR_PURELIFI=y +# CONFIG_PLFXLC is not set +CONFIG_WLAN_VENDOR_RALINK=y +CONFIG_RT2X00=m +# CONFIG_RT2400PCI is not set +# CONFIG_RT2500PCI is not set +# CONFIG_RT61PCI is not set +# CONFIG_RT2800PCI is not set +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT33XX=y +CONFIG_RT2800USB_RT35XX=y +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RT2800_LIB=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2X00_LIB_CRYPTO=y +CONFIG_RT2X00_LIB_LEDS=y +# CONFIG_RT2X00_DEBUG is not set +CONFIG_WLAN_VENDOR_REALTEK=y +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_RTL8187_LEDS=y +CONFIG_RTL_CARDS=m +CONFIG_RTL8192CE=m +CONFIG_RTL8192SE=m +CONFIG_RTL8192DE=m +CONFIG_RTL8723AE=m +CONFIG_RTL8723BE=m +CONFIG_RTL8188EE=m +CONFIG_RTL8192EE=m +CONFIG_RTL8821AE=m +# CONFIG_RTL8192CU is not set +CONFIG_RTLWIFI=m +CONFIG_RTLWIFI_PCI=m +CONFIG_RTLWIFI_DEBUG=y +CONFIG_RTL8192C_COMMON=m +CONFIG_RTL8723_COMMON=m +CONFIG_RTLBTCOEXIST=m +CONFIG_RTL8XXXU=m +CONFIG_RTL8XXXU_UNTESTED=y +CONFIG_RTW88=m +CONFIG_RTW88_CORE=m +CONFIG_RTW88_PCI=m +CONFIG_RTW88_SDIO=m +CONFIG_RTW88_USB=m +CONFIG_RTW88_8822B=m +CONFIG_RTW88_8822C=m +CONFIG_RTW88_8723D=m +CONFIG_RTW88_8821C=m +CONFIG_RTW88_8822BE=m +# CONFIG_RTW88_8822BS is not set +CONFIG_RTW88_8822BU=m +CONFIG_RTW88_8822CE=m +# CONFIG_RTW88_8822CS is not set +CONFIG_RTW88_8822CU=m +CONFIG_RTW88_8723DE=m +CONFIG_RTW88_8723DS=m +CONFIG_RTW88_8723DU=m +CONFIG_RTW88_8821CE=m +CONFIG_RTW88_8821CS=m +# CONFIG_RTW88_8821CU is not set +# CONFIG_RTW88_DEBUG is not set +# CONFIG_RTW88_DEBUGFS is not set +CONFIG_RTW89=m +CONFIG_RTW89_CORE=m +CONFIG_RTW89_PCI=m +CONFIG_RTW89_8852A=m +CONFIG_RTW89_8852C=m +# CONFIG_RTW89_8851BE is not set +CONFIG_RTW89_8852AE=m +# CONFIG_RTW89_8852BE is not set +CONFIG_RTW89_8852CE=m +# CONFIG_RTW89_DEBUGMSG is not set +# CONFIG_RTW89_DEBUGFS is not set +CONFIG_WLAN_VENDOR_RSI=y +# CONFIG_RSI_91X is not set +CONFIG_WLAN_VENDOR_SILABS=y +# CONFIG_WFX is not set +CONFIG_WLAN_VENDOR_ST=y +# CONFIG_CW1200 is not set +CONFIG_WLAN_VENDOR_TI=y +# CONFIG_WL1251 is not set +# CONFIG_WL12XX is not set +# CONFIG_WL18XX is not set +# CONFIG_WLCORE is not set +CONFIG_WLAN_VENDOR_ZYDAS=y +# CONFIG_USB_ZD1201 is not set +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +CONFIG_WLAN_VENDOR_QUANTENNA=y +# CONFIG_QTNFMAC_PCIE is not set +CONFIG_USB_NET_RNDIS_WLAN=m +# CONFIG_MAC80211_HWSIM is not set +# CONFIG_VIRT_WIFI is not set +# CONFIG_WAN is not set + +# +# Wireless WAN +# +# CONFIG_WWAN is not set +# end of Wireless WAN + +# CONFIG_VMXNET3 is not set +# CONFIG_NETDEVSIM is not set +# CONFIG_NET_FAILOVER is not set +CONFIG_ISDN=y +CONFIG_ISDN_CAPI=y +# CONFIG_MISDN is not set + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_LEDS=y +CONFIG_INPUT_FF_MEMLESS=y +# CONFIG_INPUT_SPARSEKMAP is not set +CONFIG_INPUT_MATRIXKMAP=y +CONFIG_INPUT_VIVALDIFMAP=y + +# +# Userland interfaces +# +# CONFIG_INPUT_MOUSEDEV is not set +CONFIG_INPUT_JOYDEV=y +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ADC=y +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ADP5589 is not set +CONFIG_KEYBOARD_ATKBD=y +# CONFIG_KEYBOARD_QT1050 is not set +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_LKKBD is not set +CONFIG_KEYBOARD_GPIO=y +CONFIG_KEYBOARD_GPIO_POLLED=y +# CONFIG_KEYBOARD_TCA6416 is not set +# CONFIG_KEYBOARD_TCA8418 is not set +# CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MCS is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_PINEPHONE is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_OMAP4 is not set +# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CAP11XX is not set +# CONFIG_KEYBOARD_BCM is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set +CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_PS2 is not set +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_BCM5974 is not set +# CONFIG_MOUSE_CYAPA is not set +# CONFIG_MOUSE_ELAN_I2C is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MOUSE_GPIO is not set +# CONFIG_MOUSE_SYNAPTICS_I2C is not set +# CONFIG_MOUSE_SYNAPTICS_USB is not set +CONFIG_INPUT_JOYSTICK=y +# CONFIG_JOYSTICK_ANALOG is not set +# CONFIG_JOYSTICK_A3D is not set +CONFIG_JOYSTICK_ADC=y +# CONFIG_JOYSTICK_ADI is not set +# CONFIG_JOYSTICK_COBRA is not set +# CONFIG_JOYSTICK_GF2K is not set +# CONFIG_JOYSTICK_GRIP is not set +# CONFIG_JOYSTICK_GRIP_MP is not set +# CONFIG_JOYSTICK_GUILLEMOT is not set +# CONFIG_JOYSTICK_INTERACT is not set +# CONFIG_JOYSTICK_SIDEWINDER is not set +# CONFIG_JOYSTICK_TMDC is not set +# CONFIG_JOYSTICK_IFORCE is not set +# CONFIG_JOYSTICK_WARRIOR is not set +# CONFIG_JOYSTICK_MAGELLAN is not set +# CONFIG_JOYSTICK_SPACEORB is not set +# CONFIG_JOYSTICK_SPACEBALL is not set +# CONFIG_JOYSTICK_STINGER is not set +# CONFIG_JOYSTICK_TWIDJOY is not set +# CONFIG_JOYSTICK_ZHENHUA is not set +# CONFIG_JOYSTICK_AS5011 is not set +# CONFIG_JOYSTICK_JOYDUMP is not set +CONFIG_JOYSTICK_XPAD=m +CONFIG_JOYSTICK_XPAD_FF=y +# CONFIG_JOYSTICK_XPAD_LEDS is not set +# CONFIG_JOYSTICK_PSXPAD_SPI is not set +# CONFIG_JOYSTICK_PXRC is not set +# CONFIG_JOYSTICK_QWIIC is not set +# CONFIG_JOYSTICK_FSIA6B is not set +# CONFIG_JOYSTICK_SENSEHAT is not set +CONFIG_INPUT_TABLET=y +# CONFIG_TABLET_USB_ACECAD is not set +# CONFIG_TABLET_USB_AIPTEK is not set +# CONFIG_TABLET_USB_HANWANG is not set +# CONFIG_TABLET_USB_KBTAB is not set +# CONFIG_TABLET_USB_PEGASUS is not set +# CONFIG_TABLET_SERIAL_WACOM4 is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_ADC is not set +# CONFIG_TOUCHSCREEN_AR1021_I2C is not set +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_BU21029 is not set +# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set +# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP5 is not set +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_EGALAX is not set +# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +CONFIG_TOUCHSCREEN_GOODIX=y +# CONFIG_TOUCHSCREEN_HIDEEP is not set +# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set +CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX=y +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_ILITEK is not set +# CONFIG_TOUCHSCREEN_S6SY761 is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_EKTF2127 is not set +# CONFIG_TOUCHSCREEN_ELAN is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +# CONFIG_TOUCHSCREEN_MCS5000 is not set +# CONFIG_TOUCHSCREEN_MMS114 is not set +# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set +# CONFIG_TOUCHSCREEN_MSG2638 is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set +# CONFIG_TOUCHSCREEN_IMAGIS is not set +# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set +CONFIG_TOUCHSCREEN_USB_COMPOSITE=y +CONFIG_TOUCHSCREEN_USB_EGALAX=y +CONFIG_TOUCHSCREEN_USB_PANJIT=y +CONFIG_TOUCHSCREEN_USB_3M=y +CONFIG_TOUCHSCREEN_USB_ITM=y +CONFIG_TOUCHSCREEN_USB_ETURBO=y +CONFIG_TOUCHSCREEN_USB_GUNZE=y +CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y +CONFIG_TOUCHSCREEN_USB_IRTOUCH=y +CONFIG_TOUCHSCREEN_USB_IDEALTEK=y +CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y +CONFIG_TOUCHSCREEN_USB_GOTOP=y +CONFIG_TOUCHSCREEN_USB_JASTEC=y +CONFIG_TOUCHSCREEN_USB_ELO=y +CONFIG_TOUCHSCREEN_USB_E2I=y +CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y +CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y +CONFIG_TOUCHSCREEN_USB_NEXIO=y +CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2004 is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_RM_TS is not set +# CONFIG_TOUCHSCREEN_SILEAD is not set +# CONFIG_TOUCHSCREEN_SIS_I2C is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_STMFTS is not set +# CONFIG_TOUCHSCREEN_SUR40 is not set +# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set +# CONFIG_TOUCHSCREEN_SX8654 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_ZET6223 is not set +# CONFIG_TOUCHSCREEN_ZFORCE is not set +# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set +# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set +# CONFIG_TOUCHSCREEN_IQS5XX is not set +# CONFIG_TOUCHSCREEN_IQS7211 is not set +# CONFIG_TOUCHSCREEN_ZINITIX is not set +# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_ATMEL_CAPTOUCH is not set +# CONFIG_INPUT_BMA150 is not set +# CONFIG_INPUT_E3X0_BUTTON is not set +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_GPIO_BEEPER is not set +# CONFIG_INPUT_GPIO_DECODER is not set +# CONFIG_INPUT_GPIO_VIBRA is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_KXTJ9 is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_CM109 is not set +# CONFIG_INPUT_REGULATOR_HAPTIC is not set +CONFIG_INPUT_UINPUT=y +# CONFIG_INPUT_PCF8574 is not set +# CONFIG_INPUT_PWM_BEEPER is not set +CONFIG_INPUT_PWM_VIBRA=y +CONFIG_INPUT_RK805_PWRKEY=y +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_DA7280_HAPTICS is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_IQS269A is not set +# CONFIG_INPUT_IQS626A is not set +# CONFIG_INPUT_IQS7222 is not set +# CONFIG_INPUT_CMA3000 is not set +# CONFIG_INPUT_DRV260X_HAPTICS is not set +# CONFIG_INPUT_DRV2665_HAPTICS is not set +# CONFIG_INPUT_DRV2667_HAPTICS is not set +CONFIG_RMI4_CORE=y +# CONFIG_RMI4_I2C is not set +# CONFIG_RMI4_SPI is not set +# CONFIG_RMI4_SMB is not set +CONFIG_RMI4_F03=y +CONFIG_RMI4_F03_SERIO=y +CONFIG_RMI4_2D_SENSOR=y +CONFIG_RMI4_F11=y +CONFIG_RMI4_F12=y +CONFIG_RMI4_F30=y +# CONFIG_RMI4_F34 is not set +# CONFIG_RMI4_F3A is not set +# CONFIG_RMI4_F54 is not set +# CONFIG_RMI4_F55 is not set + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_SERPORT=m +# CONFIG_SERIO_AMBAKMI is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +# CONFIG_SERIO_RAW is not set +# CONFIG_SERIO_ALTERA_PS2 is not set +# CONFIG_SERIO_PS2MULT is not set +# CONFIG_SERIO_ARC_PS2 is not set +# CONFIG_SERIO_APBPS2 is not set +# CONFIG_SERIO_GPIO_PS2 is not set +# CONFIG_USERIO is not set +CONFIG_GAMEPORT=y +# CONFIG_GAMEPORT_EMU10K1 is not set +# CONFIG_GAMEPORT_FM801 is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_LEGACY_TIOCSTI=y +CONFIG_LDISC_AUTOLOAD=y + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y +CONFIG_SERIAL_8250_16550A_VARIANTS=y +# CONFIG_SERIAL_8250_FINTEK is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_DMA=y +# CONFIG_SERIAL_8250_PCI is not set +CONFIG_SERIAL_8250_NR_UARTS=5 +CONFIG_SERIAL_8250_RUNTIME_UARTS=5 +CONFIG_SERIAL_8250_EXTENDED=y +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_PCI1XXXX is not set +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_RSA is not set +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_DW=y +# CONFIG_SERIAL_8250_RT288X is not set +CONFIG_SERIAL_8250_PERICOM=y +CONFIG_SERIAL_OF_PLATFORM=y + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_AMBA_PL010 is not set +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set +# CONFIG_SERIAL_SIFIVE is not set +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_XILINX_PS_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_RP2 is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +# CONFIG_SERIAL_SPRD is not set +# end of Serial drivers + +CONFIG_SERIAL_MCTRL_GPIO=y +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_N_GSM is not set +# CONFIG_NOZOMI is not set +# CONFIG_NULL_TTY is not set +# CONFIG_HVC_DCC is not set +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y +# CONFIG_TTY_PRINTK is not set +# CONFIG_VIRTIO_CONSOLE is not set +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +# CONFIG_HW_RANDOM_BA431 is not set +# CONFIG_HW_RANDOM_CCTRNG is not set +# CONFIG_HW_RANDOM_XIPHERA is not set +CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y +CONFIG_HW_RANDOM_CN10K=y +# CONFIG_APPLICOM is not set +CONFIG_DEVMEM=y +CONFIG_DEVPORT=y +CONFIG_TCG_TPM=y +CONFIG_HW_RANDOM_TPM=y +# CONFIG_TCG_TIS is not set +# CONFIG_TCG_TIS_SPI is not set +# CONFIG_TCG_TIS_I2C is not set +# CONFIG_TCG_TIS_I2C_CR50 is not set +# CONFIG_TCG_TIS_I2C_ATMEL is not set +# CONFIG_TCG_TIS_I2C_INFINEON is not set +# CONFIG_TCG_TIS_I2C_NUVOTON is not set +# CONFIG_TCG_ATMEL is not set +# CONFIG_TCG_VTPM_PROXY is not set +# CONFIG_TCG_TIS_ST33ZP24_I2C is not set +# CONFIG_TCG_TIS_ST33ZP24_SPI is not set +# CONFIG_XILLYBUS is not set +# CONFIG_XILLYUSB is not set +# end of Character devices + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +# CONFIG_I2C_COMPAT is not set +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MUX=y + +# +# Multiplexer I2C Chip support +# +# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set +# CONFIG_I2C_MUX_GPIO is not set +# CONFIG_I2C_MUX_GPMUX is not set +# CONFIG_I2C_MUX_LTC4306 is not set +# CONFIG_I2C_MUX_PCA9541 is not set +# CONFIG_I2C_MUX_PCA954x is not set +# CONFIG_I2C_MUX_PINCTRL is not set +# CONFIG_I2C_MUX_REG is not set +# CONFIG_I2C_DEMUX_PINCTRL is not set +# CONFIG_I2C_MUX_MLXCPLD is not set +# end of Multiplexer I2C Chip support + +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_ALGOBIT=y + +# +# I2C Hardware Bus support +# + +# +# PC SMBus host controller drivers +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_ISCH is not set +# CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_NVIDIA_GPU is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CADENCE is not set +# CONFIG_I2C_CBUS_GPIO is not set +CONFIG_I2C_DESIGNWARE_CORE=y +# CONFIG_I2C_DESIGNWARE_SLAVE is not set +CONFIG_I2C_DESIGNWARE_PLATFORM=y +# CONFIG_I2C_DESIGNWARE_PCI is not set +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_HISI is not set +# CONFIG_I2C_NOMADIK is not set +# CONFIG_I2C_OCORES is not set +# CONFIG_I2C_PCA_PLATFORM is not set +CONFIG_I2C_RK3X=y +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_THUNDERX is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_VIRTIO is not set +# end of I2C Hardware Bus support + +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_SLAVE is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# end of I2C support + +# CONFIG_I3C is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y +CONFIG_SPI_MEM=y + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +# CONFIG_SPI_AXI_SPI_ENGINE is not set +CONFIG_SPI_BITBANG=y +# CONFIG_SPI_CADENCE is not set +# CONFIG_SPI_CADENCE_QUADSPI is not set +# CONFIG_SPI_CADENCE_XSPI is not set +# CONFIG_SPI_DESIGNWARE is not set +CONFIG_SPI_GPIO=y +# CONFIG_SPI_FSL_SPI is not set +# CONFIG_SPI_MICROCHIP_CORE is not set +# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PCI1XXXX is not set +# CONFIG_SPI_PL022 is not set +# CONFIG_SPI_PXA2XX is not set +CONFIG_SPI_ROCKCHIP=y +CONFIG_SPI_ROCKCHIP_SFC=y +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set +# CONFIG_SPI_SN_F_OSPI is not set +# CONFIG_SPI_MXIC is not set +# CONFIG_SPI_THUNDERX is not set +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_ZYNQMP_GQSPI is not set +# CONFIG_SPI_AMD is not set + +# +# SPI Multiplexer support +# +CONFIG_SPI_MUX=y + +# +# SPI Protocol Masters +# +CONFIG_SPI_SPIDEV=y +# CONFIG_SPI_LOOPBACK_TEST is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_SLAVE is not set +CONFIG_SPI_DYNAMIC=y +# CONFIG_SPMI is not set +# CONFIG_HSI is not set +CONFIG_PPS=y +# CONFIG_PPS_DEBUG is not set + +# +# PPS clients support +# +# CONFIG_PPS_CLIENT_KTIMER is not set +# CONFIG_PPS_CLIENT_LDISC is not set +# CONFIG_PPS_CLIENT_GPIO is not set + +# +# PPS generators support +# + +# +# PTP clock support +# +CONFIG_PTP_1588_CLOCK=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +CONFIG_PTP_1588_CLOCK_KVM=y +# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set +# CONFIG_PTP_1588_CLOCK_IDTCM is not set +# CONFIG_PTP_1588_CLOCK_MOCK is not set +# CONFIG_PTP_1588_CLOCK_OCP is not set +# end of PTP clock support + +CONFIG_PINCTRL=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_PINMUX=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_PINCONF=y +CONFIG_GENERIC_PINCONF=y +# CONFIG_DEBUG_PINCTRL is not set +# CONFIG_PINCTRL_CY8C95X0 is not set +# CONFIG_PINCTRL_MCP23S08 is not set +# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set +# CONFIG_PINCTRL_OCELOT is not set +CONFIG_PINCTRL_RK805=y +CONFIG_PINCTRL_ROCKCHIP=y +CONFIG_PINCTRL_SINGLE=y +# CONFIG_PINCTRL_STMFX is not set +# CONFIG_PINCTRL_SX150X is not set + +# +# Renesas pinctrl drivers +# +# end of Renesas pinctrl drivers + +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_FASTPATH_LIMIT=512 +CONFIG_OF_GPIO=y +CONFIG_GPIOLIB_IRQCHIP=y +# CONFIG_DEBUG_GPIO is not set +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_CDEV_V1=y +CONFIG_GPIO_GENERIC=y + +# +# Memory mapped GPIO drivers +# +# CONFIG_GPIO_74XX_MMIO is not set +# CONFIG_GPIO_ALTERA is not set +# CONFIG_GPIO_CADENCE is not set +CONFIG_GPIO_DWAPB=y +# CONFIG_GPIO_FTGPIO010 is not set +CONFIG_GPIO_GENERIC_PLATFORM=y +# CONFIG_GPIO_GRGPIO is not set +# CONFIG_GPIO_HISI is not set +# CONFIG_GPIO_HLWD is not set +# CONFIG_GPIO_LOGICVC is not set +# CONFIG_GPIO_MB86S7X is not set +# CONFIG_GPIO_PL061 is not set +CONFIG_GPIO_ROCKCHIP=y +# CONFIG_GPIO_SIFIVE is not set +# CONFIG_GPIO_SYSCON is not set +# CONFIG_GPIO_XGENE is not set +# CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_AMD_FCH is not set +# end of Memory mapped GPIO drivers + +# +# I2C GPIO expanders +# +# CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_FXL6408 is not set +# CONFIG_GPIO_DS4520 is not set +# CONFIG_GPIO_GW_PLD is not set +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCA9570 is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_TPIC2810 is not set +# end of I2C GPIO expanders + +# +# MFD GPIO expanders +# +# CONFIG_GPIO_TPS6586X is not set +# end of MFD GPIO expanders + +# +# PCI GPIO expanders +# +# CONFIG_GPIO_BT8XX is not set +# CONFIG_GPIO_PCI_IDIO_16 is not set +# CONFIG_GPIO_PCIE_IDIO_24 is not set +# CONFIG_GPIO_RDC321X is not set +# end of PCI GPIO expanders + +# +# SPI GPIO expanders +# +# CONFIG_GPIO_74X164 is not set +# CONFIG_GPIO_MAX3191X is not set +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_XRA1403 is not set +# end of SPI GPIO expanders + +# +# USB GPIO expanders +# +# end of USB GPIO expanders + +# +# Virtual GPIO drivers +# +# CONFIG_GPIO_AGGREGATOR is not set +# CONFIG_GPIO_LATCH is not set +# CONFIG_GPIO_MOCKUP is not set +# CONFIG_GPIO_SIM is not set +# end of Virtual GPIO drivers + +# CONFIG_W1 is not set +CONFIG_POWER_RESET=y +# CONFIG_POWER_RESET_BRCMSTB is not set +CONFIG_POWER_RESET_GPIO=y +CONFIG_POWER_RESET_GPIO_RESTART=y +# CONFIG_POWER_RESET_LTC2952 is not set +# CONFIG_POWER_RESET_REGULATOR is not set +# CONFIG_POWER_RESET_RESTART is not set +# CONFIG_POWER_RESET_XGENE is not set +CONFIG_POWER_RESET_SYSCON=y +CONFIG_POWER_RESET_SYSCON_POWEROFF=y +CONFIG_REBOOT_MODE=y +CONFIG_SYSCON_REBOOT_MODE=y +# CONFIG_NVMEM_REBOOT_MODE is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_POWER_SUPPLY_HWMON=y +# CONFIG_GENERIC_ADC_BATTERY is not set +# CONFIG_IP5XXX_POWER is not set +# CONFIG_TEST_POWER is not set +# CONFIG_CHARGER_ADP5061 is not set +CONFIG_BATTERY_CW2015=y +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set +CONFIG_BATTERY_SBS=y +# CONFIG_CHARGER_SBS is not set +# CONFIG_MANAGER_SBS is not set +# CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +# CONFIG_CHARGER_ISP1704 is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +CONFIG_CHARGER_GPIO=y +# CONFIG_CHARGER_MANAGER is not set +# CONFIG_CHARGER_LT3651 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_DETECTOR_MAX14656 is not set +# CONFIG_CHARGER_MAX77976 is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_BQ24190 is not set +# CONFIG_CHARGER_BQ24257 is not set +CONFIG_CHARGER_BQ24735=y +# CONFIG_CHARGER_BQ2515X is not set +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_BQ25980 is not set +# CONFIG_CHARGER_BQ256XX is not set +CONFIG_CHARGER_RK817=y +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set +# CONFIG_CHARGER_RT9455 is not set +# CONFIG_CHARGER_RT9467 is not set +# CONFIG_CHARGER_RT9471 is not set +# CONFIG_CHARGER_UCS1002 is not set +# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +# CONFIG_SENSORS_AD7314 is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM1177 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADT7310 is not set +# CONFIG_SENSORS_ADT7410 is not set +# CONFIG_SENSORS_ADT7411 is not set +# CONFIG_SENSORS_ADT7462 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_AHT10 is not set +# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set +# CONFIG_SENSORS_AS370 is not set +# CONFIG_SENSORS_ASC7621 is not set +# CONFIG_SENSORS_AXI_FAN_CONTROL is not set +# CONFIG_SENSORS_ARM_SCMI is not set +# CONFIG_SENSORS_ARM_SCPI is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_CORSAIR_CPRO is not set +# CONFIG_SENSORS_CORSAIR_PSU is not set +# CONFIG_SENSORS_DRIVETEMP is not set +# CONFIG_SENSORS_DS620 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_I5K_AMB is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_FTSTEUTATES is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_G760A is not set +# CONFIG_SENSORS_G762 is not set +# CONFIG_SENSORS_GPIO_FAN is not set +# CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_HS3001 is not set +# CONFIG_SENSORS_IIO_HWMON is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_POWR1220 is not set +# CONFIG_SENSORS_LINEAGE is not set +# CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2947_I2C is not set +# CONFIG_SENSORS_LTC2947_SPI is not set +# CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC2992 is not set +# CONFIG_SENSORS_LTC4151 is not set +# CONFIG_SENSORS_LTC4215 is not set +# CONFIG_SENSORS_LTC4222 is not set +# CONFIG_SENSORS_LTC4245 is not set +# CONFIG_SENSORS_LTC4260 is not set +# CONFIG_SENSORS_LTC4261 is not set +# CONFIG_SENSORS_MAX1111 is not set +# CONFIG_SENSORS_MAX127 is not set +# CONFIG_SENSORS_MAX16065 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX1668 is not set +# CONFIG_SENSORS_MAX197 is not set +# CONFIG_SENSORS_MAX31722 is not set +# CONFIG_SENSORS_MAX31730 is not set +# CONFIG_SENSORS_MAX31760 is not set +# CONFIG_MAX31827 is not set +# CONFIG_SENSORS_MAX6620 is not set +# CONFIG_SENSORS_MAX6621 is not set +# CONFIG_SENSORS_MAX6639 is not set +# CONFIG_SENSORS_MAX6642 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_MAX6697 is not set +# CONFIG_SENSORS_MAX31790 is not set +# CONFIG_SENSORS_MC34VR500 is not set +# CONFIG_SENSORS_MCP3021 is not set +# CONFIG_SENSORS_TC654 is not set +# CONFIG_SENSORS_TPS23861 is not set +# CONFIG_SENSORS_MR75203 is not set +# CONFIG_SENSORS_ADCXX is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM73 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95234 is not set +# CONFIG_SENSORS_LM95241 is not set +# CONFIG_SENSORS_LM95245 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_NTC_THERMISTOR is not set +# CONFIG_SENSORS_NCT6683 is not set +# CONFIG_SENSORS_NCT6775 is not set +# CONFIG_SENSORS_NCT6775_I2C is not set +# CONFIG_SENSORS_NCT7802 is not set +# CONFIG_SENSORS_NCT7904 is not set +# CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_NZXT_KRAKEN2 is not set +# CONFIG_SENSORS_NZXT_SMART2 is not set +# CONFIG_SENSORS_OCC_P8_I2C is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_PMBUS is not set +CONFIG_SENSORS_PWM_FAN=y +# CONFIG_SENSORS_SBTSI is not set +# CONFIG_SENSORS_SBRMI is not set +# CONFIG_SENSORS_SHT15 is not set +# CONFIG_SENSORS_SHT21 is not set +# CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHT4x is not set +# CONFIG_SENSORS_SHTC1 is not set +# CONFIG_SENSORS_SIS5595 is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_EMC1403 is not set +# CONFIG_SENSORS_EMC2103 is not set +# CONFIG_SENSORS_EMC2305 is not set +# CONFIG_SENSORS_EMC6W201 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_SCH5627 is not set +# CONFIG_SENSORS_SCH5636 is not set +# CONFIG_SENSORS_STTS751 is not set +# CONFIG_SENSORS_ADC128D818 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_ADS7871 is not set +# CONFIG_SENSORS_AMC6821 is not set +# CONFIG_SENSORS_INA209 is not set +# CONFIG_SENSORS_INA2XX is not set +# CONFIG_SENSORS_INA238 is not set +# CONFIG_SENSORS_INA3221 is not set +# CONFIG_SENSORS_TC74 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP102 is not set +# CONFIG_SENSORS_TMP103 is not set +# CONFIG_SENSORS_TMP108 is not set +# CONFIG_SENSORS_TMP401 is not set +# CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP464 is not set +# CONFIG_SENSORS_TMP513 is not set +# CONFIG_SENSORS_VIA686A is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_VT8231 is not set +# CONFIG_SENSORS_W83773G is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83795 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +CONFIG_THERMAL=y +# CONFIG_THERMAL_NETLINK is not set +# CONFIG_THERMAL_STATISTICS is not set +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +# CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y +CONFIG_THERMAL_GOV_FAIR_SHARE=y +CONFIG_THERMAL_GOV_STEP_WISE=y +# CONFIG_THERMAL_GOV_BANG_BANG is not set +# CONFIG_THERMAL_GOV_USER_SPACE is not set +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_CPU_THERMAL=y +CONFIG_CPU_FREQ_THERMAL=y +CONFIG_DEVFREQ_THERMAL=y +# CONFIG_THERMAL_EMULATION is not set +# CONFIG_THERMAL_MMIO is not set +CONFIG_ROCKCHIP_THERMAL=y +# CONFIG_GENERIC_ADC_THERMAL is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y +CONFIG_WATCHDOG_OPEN_TIMEOUT=0 +# CONFIG_WATCHDOG_SYSFS is not set +# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set + +# +# Watchdog Pretimeout Governors +# +# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +# CONFIG_GPIO_WATCHDOG is not set +# CONFIG_XILINX_WATCHDOG is not set +# CONFIG_XILINX_WINDOW_WATCHDOG is not set +# CONFIG_ZIIRAVE_WATCHDOG is not set +# CONFIG_ARM_SP805_WATCHDOG is not set +# CONFIG_ARM_SBSA_WATCHDOG is not set +# CONFIG_CADENCE_WATCHDOG is not set +CONFIG_DW_WATCHDOG=y +# CONFIG_MAX63XX_WATCHDOG is not set +# CONFIG_ARM_SMC_WATCHDOG is not set +# CONFIG_ALIM7101_WDT is not set +# CONFIG_I6300ESB_WDT is not set +# CONFIG_HP_WATCHDOG is not set +# CONFIG_MEN_A21_WDT is not set + +# +# PCI-based Watchdog Cards +# +# CONFIG_PCIPCWATCHDOG is not set +# CONFIG_WDTPCI is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +CONFIG_SSB=y +CONFIG_SSB_SPROM=y +CONFIG_SSB_BLOCKIO=y +CONFIG_SSB_PCIHOST_POSSIBLE=y +CONFIG_SSB_PCIHOST=y +CONFIG_SSB_B43_PCI_BRIDGE=y +CONFIG_SSB_SDIOHOST_POSSIBLE=y +# CONFIG_SSB_SDIOHOST is not set +CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y +CONFIG_SSB_DRIVER_PCICORE=y +# CONFIG_SSB_DRIVER_GPIO is not set +CONFIG_BCMA_POSSIBLE=y +CONFIG_BCMA=y +CONFIG_BCMA_BLOCKIO=y +CONFIG_BCMA_HOST_PCI_POSSIBLE=y +CONFIG_BCMA_HOST_PCI=y +# CONFIG_BCMA_HOST_SOC is not set +CONFIG_BCMA_DRIVER_PCI=y +# CONFIG_BCMA_DRIVER_GMAC_CMN is not set +# CONFIG_BCMA_DRIVER_GPIO is not set +# CONFIG_BCMA_DEBUG is not set + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=y +# CONFIG_MFD_ACT8945A is not set +# CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_SMPRO is not set +# CONFIG_MFD_AS3722 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_ATMEL_FLEXCOM is not set +# CONFIG_MFD_ATMEL_HLCDC is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +# CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_CS42L43_I2C is not set +# CONFIG_MFD_MADERA is not set +# CONFIG_MFD_MAX5970 is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_GATEWORKS_GSC is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_MP2629 is not set +# CONFIG_MFD_HI6421_PMIC is not set +# CONFIG_LPC_ICH is not set +# CONFIG_LPC_SCH is not set +# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77541 is not set +# CONFIG_MFD_MAX77620 is not set +# CONFIG_MFD_MAX77650 is not set +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77714 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_MFD_OCELOT is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_MFD_CPCAP is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_NTXEC is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_PCF50633 is not set +# CONFIG_MFD_SY7636A is not set +# CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set +# CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set +# CONFIG_MFD_RC5T583 is not set +CONFIG_MFD_RK8XX=y +CONFIG_MFD_RK8XX_I2C=y +# CONFIG_MFD_RK8XX_SPI is not set +# CONFIG_MFD_RN5T618 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_MFD_STMPE is not set +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_TI_AM335X_TSCADC is not set +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TI_LP87565 is not set +# CONFIG_MFD_TPS65218 is not set +# CONFIG_MFD_TPS65219 is not set +CONFIG_MFD_TPS6586X=y +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS6594_I2C is not set +# CONFIG_MFD_TPS6594_SPI is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_MFD_WL1273_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_VX855 is not set +# CONFIG_MFD_LOCHNAGAR is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ROHM_BD718XX is not set +# CONFIG_MFD_ROHM_BD71828 is not set +# CONFIG_MFD_ROHM_BD957XMUF is not set +# CONFIG_MFD_STPMIC1 is not set +# CONFIG_MFD_STMFX is not set +# CONFIG_MFD_ATC260X_I2C is not set +# CONFIG_MFD_KHADAS_MCU is not set +# CONFIG_MFD_QCOM_PM8008 is not set +# CONFIG_RAVE_SP_CORE is not set +# CONFIG_MFD_INTEL_M10_BMC_SPI is not set +# CONFIG_MFD_RSMU_I2C is not set +# CONFIG_MFD_RSMU_SPI is not set +# end of Multifunction device drivers + +CONFIG_REGULATOR=y +CONFIG_REGULATOR_DEBUG=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_VIRTUAL_CONSUMER=y +CONFIG_REGULATOR_USERSPACE_CONSUMER=y +# CONFIG_REGULATOR_88PG86X is not set +CONFIG_REGULATOR_ACT8865=y +# CONFIG_REGULATOR_AD5398 is not set +CONFIG_REGULATOR_ARM_SCMI=y +# CONFIG_REGULATOR_AW37503 is not set +# CONFIG_REGULATOR_DA9121 is not set +# CONFIG_REGULATOR_DA9210 is not set +# CONFIG_REGULATOR_DA9211 is not set +CONFIG_REGULATOR_FAN53555=y +# CONFIG_REGULATOR_FAN53880 is not set +CONFIG_REGULATOR_GPIO=y +# CONFIG_REGULATOR_ISL9305 is not set +# CONFIG_REGULATOR_ISL6271A is not set +# CONFIG_REGULATOR_LP3971 is not set +# CONFIG_REGULATOR_LP3972 is not set +# CONFIG_REGULATOR_LP872X is not set +# CONFIG_REGULATOR_LP8755 is not set +# CONFIG_REGULATOR_LTC3589 is not set +# CONFIG_REGULATOR_LTC3676 is not set +# CONFIG_REGULATOR_MAX1586 is not set +# CONFIG_REGULATOR_MAX77857 is not set +# CONFIG_REGULATOR_MAX8649 is not set +# CONFIG_REGULATOR_MAX8660 is not set +# CONFIG_REGULATOR_MAX8893 is not set +# CONFIG_REGULATOR_MAX8952 is not set +# CONFIG_REGULATOR_MAX8973 is not set +# CONFIG_REGULATOR_MAX20086 is not set +# CONFIG_REGULATOR_MAX20411 is not set +# CONFIG_REGULATOR_MAX77826 is not set +# CONFIG_REGULATOR_MCP16502 is not set +# CONFIG_REGULATOR_MP5416 is not set +# CONFIG_REGULATOR_MP8859 is not set +# CONFIG_REGULATOR_MP886X is not set +# CONFIG_REGULATOR_MPQ7920 is not set +# CONFIG_REGULATOR_MT6311 is not set +# CONFIG_REGULATOR_PCA9450 is not set +# CONFIG_REGULATOR_PF8X00 is not set +# CONFIG_REGULATOR_PFUZE100 is not set +# CONFIG_REGULATOR_PV88060 is not set +# CONFIG_REGULATOR_PV88080 is not set +# CONFIG_REGULATOR_PV88090 is not set +CONFIG_REGULATOR_PWM=y +# CONFIG_REGULATOR_RAA215300 is not set +# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set +CONFIG_REGULATOR_RK808=y +# CONFIG_REGULATOR_RT4801 is not set +# CONFIG_REGULATOR_RT4803 is not set +# CONFIG_REGULATOR_RT5190A is not set +# CONFIG_REGULATOR_RT5739 is not set +# CONFIG_REGULATOR_RT5759 is not set +# CONFIG_REGULATOR_RT6160 is not set +# CONFIG_REGULATOR_RT6190 is not set +# CONFIG_REGULATOR_RT6245 is not set +# CONFIG_REGULATOR_RTQ2134 is not set +# CONFIG_REGULATOR_RTMV20 is not set +# CONFIG_REGULATOR_RTQ6752 is not set +# CONFIG_REGULATOR_RTQ2208 is not set +# CONFIG_REGULATOR_SLG51000 is not set +# CONFIG_REGULATOR_SY8106A is not set +# CONFIG_REGULATOR_SY8824X is not set +# CONFIG_REGULATOR_SY8827N is not set +# CONFIG_REGULATOR_TPS51632 is not set +# CONFIG_REGULATOR_TPS62360 is not set +# CONFIG_REGULATOR_TPS6286X is not set +# CONFIG_REGULATOR_TPS6287X is not set +# CONFIG_REGULATOR_TPS65023 is not set +# CONFIG_REGULATOR_TPS6507X is not set +# CONFIG_REGULATOR_TPS65132 is not set +# CONFIG_REGULATOR_TPS6524X is not set +CONFIG_REGULATOR_TPS6586X=y +CONFIG_REGULATOR_VCTRL=y +CONFIG_RC_CORE=y +# CONFIG_BPF_LIRC_MODE2 is not set +CONFIG_LIRC=y +CONFIG_RC_MAP=y +CONFIG_RC_DECODERS=y +# CONFIG_IR_IMON_DECODER is not set +CONFIG_IR_JVC_DECODER=y +CONFIG_IR_MCE_KBD_DECODER=y +CONFIG_IR_NEC_DECODER=y +CONFIG_IR_RC5_DECODER=y +CONFIG_IR_RC6_DECODER=y +# CONFIG_IR_RCMM_DECODER is not set +CONFIG_IR_SANYO_DECODER=y +CONFIG_IR_SHARP_DECODER=y +CONFIG_IR_SONY_DECODER=y +CONFIG_IR_XMP_DECODER=y +CONFIG_RC_DEVICES=y +CONFIG_IR_GPIO_CIR=y +# CONFIG_IR_GPIO_TX is not set +# CONFIG_IR_HIX5HD2 is not set +# CONFIG_IR_IGORPLUGUSB is not set +# CONFIG_IR_IGUANA is not set +# CONFIG_IR_IMON is not set +# CONFIG_IR_IMON_RAW is not set +# CONFIG_IR_MCEUSB is not set +# CONFIG_IR_PWM_TX is not set +# CONFIG_IR_REDRAT3 is not set +# CONFIG_IR_SERIAL is not set +# CONFIG_IR_SPI is not set +# CONFIG_IR_STREAMZAP is not set +# CONFIG_IR_TOY is not set +# CONFIG_IR_TTUSBIR is not set +# CONFIG_RC_ATI_REMOTE is not set +# CONFIG_RC_LOOPBACK is not set +# CONFIG_RC_XBOX_DVD is not set +CONFIG_CEC_CORE=y +CONFIG_CEC_NOTIFIER=y + +# +# CEC support +# +CONFIG_MEDIA_CEC_RC=y +CONFIG_MEDIA_CEC_SUPPORT=y +# CONFIG_CEC_CH7322 is not set +# CONFIG_CEC_GPIO is not set +CONFIG_USB_PULSE8_CEC=m +CONFIG_USB_RAINSHADOW_CEC=m +# end of CEC support + +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_SUPPORT_FILTER=y +CONFIG_MEDIA_SUBDRV_AUTOSELECT=y + +# +# Media device types +# +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_MEDIA_TEST_SUPPORT=y +# end of Media device types + +CONFIG_VIDEO_DEV=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_DVB_CORE=y + +# +# Video4Linux options +# +CONFIG_VIDEO_V4L2_I2C=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +CONFIG_VIDEO_TUNER=m +CONFIG_V4L2_H264=y +CONFIG_V4L2_VP9=y +CONFIG_V4L2_MEM2MEM_DEV=y +CONFIG_V4L2_FWNODE=y +CONFIG_V4L2_ASYNC=y +# end of Video4Linux options + +# +# Media controller options +# +CONFIG_MEDIA_CONTROLLER_DVB=y +CONFIG_MEDIA_CONTROLLER_REQUEST_API=y +# end of Media controller options + +# +# Digital TV options +# +# CONFIG_DVB_MMAP is not set +CONFIG_DVB_NET=y +CONFIG_DVB_MAX_ADAPTERS=8 +# CONFIG_DVB_DYNAMIC_MINORS is not set +# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set +# CONFIG_DVB_ULE_DEBUG is not set +# end of Digital TV options + +# +# Media drivers +# + +# +# Drivers filtered as selected at 'Filter media drivers' +# + +# +# Media drivers +# +CONFIG_MEDIA_USB_SUPPORT=y + +# +# Webcam devices +# +# CONFIG_USB_GSPCA is not set +# CONFIG_USB_PWC is not set +# CONFIG_USB_S2255 is not set +CONFIG_VIDEO_USBTV=m +CONFIG_USB_VIDEO_CLASS=y +# CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set + +# +# Analog TV USB devices +# +# CONFIG_VIDEO_GO7007 is not set +# CONFIG_VIDEO_HDPVR is not set +# CONFIG_VIDEO_PVRUSB2 is not set +# CONFIG_VIDEO_STK1160 is not set + +# +# Analog/digital TV USB devices +# +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_AU0828_V4L2=y +# CONFIG_VIDEO_AU0828_RC is not set +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_RC=y +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m + +# +# Digital TV USB devices +# +CONFIG_DVB_AS102=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m +# CONFIG_DVB_USB_ZD1301 is not set +CONFIG_DVB_USB=y +# CONFIG_DVB_USB_DEBUG is not set +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_CXUSB=m +# CONFIG_DVB_USB_CXUSB_ANALOG is not set +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_DIB3000MC=m +CONFIG_DVB_USB_DIBUSB_MB=m +# CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_VP7045=m +# CONFIG_SMS_USB_DRV is not set +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Webcam, TV (analog/digital) USB devices +# +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_VIDEO_EM28XX_RC=m + +# +# Software defined radio USB devices +# +CONFIG_USB_AIRSPY=m +CONFIG_USB_HACKRF=m +CONFIG_USB_MSI2500=m +CONFIG_MEDIA_PCI_SUPPORT=y + +# +# Media capture support +# +# CONFIG_VIDEO_SOLO6X10 is not set +# CONFIG_VIDEO_TW5864 is not set +# CONFIG_VIDEO_TW68 is not set +# CONFIG_VIDEO_TW686X is not set +# CONFIG_VIDEO_ZORAN is not set + +# +# Media capture/analog TV support +# +# CONFIG_VIDEO_DT3155 is not set +# CONFIG_VIDEO_IVTV is not set +# CONFIG_VIDEO_HEXIUM_GEMINI is not set +# CONFIG_VIDEO_HEXIUM_ORION is not set +# CONFIG_VIDEO_MXB is not set + +# +# Media capture/analog/hybrid TV support +# +# CONFIG_VIDEO_BT848 is not set +# CONFIG_VIDEO_CX18 is not set +CONFIG_VIDEO_CX23885=m +# CONFIG_MEDIA_ALTERA_CI is not set +CONFIG_VIDEO_CX25821=m +# CONFIG_VIDEO_CX25821_ALSA is not set +# CONFIG_VIDEO_CX88 is not set +# CONFIG_VIDEO_SAA7134 is not set +# CONFIG_VIDEO_SAA7164 is not set + +# +# Media digital TV PCI Adapters +# +# CONFIG_DVB_B2C2_FLEXCOP_PCI is not set +# CONFIG_DVB_DDBRIDGE is not set +# CONFIG_DVB_DM1105 is not set +# CONFIG_MANTIS_CORE is not set +# CONFIG_DVB_NETUP_UNIDVB is not set +# CONFIG_DVB_NGENE is not set +# CONFIG_DVB_PLUTO2 is not set +# CONFIG_DVB_PT1 is not set +# CONFIG_DVB_PT3 is not set +# CONFIG_DVB_SMIPCIE is not set +# CONFIG_DVB_BUDGET_CORE is not set +CONFIG_RADIO_ADAPTERS=y +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_SAA7706H is not set +# CONFIG_RADIO_SHARK is not set +# CONFIG_RADIO_SHARK2 is not set +# CONFIG_RADIO_SI4713 is not set +# CONFIG_RADIO_TEA5764 is not set +# CONFIG_RADIO_TEF6862 is not set +# CONFIG_RADIO_WL1273 is not set +# CONFIG_USB_DSBR is not set +# CONFIG_USB_KEENE is not set +# CONFIG_USB_MA901 is not set +# CONFIG_USB_MR800 is not set +# CONFIG_USB_RAREMONO is not set +# CONFIG_RADIO_SI470X is not set +CONFIG_MEDIA_PLATFORM_DRIVERS=y +CONFIG_V4L_PLATFORM_DRIVERS=y +# CONFIG_SDR_PLATFORM_DRIVERS is not set +CONFIG_DVB_PLATFORM_DRIVERS=y +CONFIG_V4L_MEM2MEM_DRIVERS=y +# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set +# CONFIG_VIDEO_MUX is not set + +# +# Allegro DVT media platform drivers +# + +# +# Amlogic media platform drivers +# + +# +# Amphion drivers +# + +# +# Aspeed media platform drivers +# + +# +# Atmel media platform drivers +# + +# +# Cadence media platform drivers +# +# CONFIG_VIDEO_CADENCE_CSI2RX is not set +# CONFIG_VIDEO_CADENCE_CSI2TX is not set + +# +# Chips&Media media platform drivers +# + +# +# Intel media platform drivers +# + +# +# Marvell media platform drivers +# +# CONFIG_VIDEO_CAFE_CCIC is not set + +# +# Mediatek media platform drivers +# + +# +# Microchip Technology, Inc. media platform drivers +# + +# +# NVidia media platform drivers +# + +# +# NXP media platform drivers +# + +# +# Qualcomm media platform drivers +# + +# +# Renesas media platform drivers +# + +# +# Rockchip media platform drivers +# +CONFIG_VIDEO_ROCKCHIP_RGA=y +# CONFIG_VIDEO_ROCKCHIP_ISP1 is not set + +# +# Samsung media platform drivers +# + +# +# STMicroelectronics media platform drivers +# + +# +# Sunxi media platform drivers +# + +# +# Texas Instruments drivers +# + +# +# Verisilicon media platform drivers +# +CONFIG_VIDEO_HANTRO=y +CONFIG_VIDEO_HANTRO_ROCKCHIP=y + +# +# VIA media platform drivers +# + +# +# Xilinx media platform drivers +# +# CONFIG_VIDEO_XILINX is not set + +# +# MMC/SDIO DVB adapters +# +# CONFIG_SMS_SDIO_DRV is not set +# CONFIG_V4L_TEST_DRIVERS is not set +# CONFIG_DVB_TEST_DRIVERS is not set +CONFIG_CYPRESS_FIRMWARE=y +CONFIG_TTPCI_EEPROM=m +CONFIG_UVC_COMMON=y +CONFIG_VIDEO_CX2341X=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_DVB_B2C2_FLEXCOP=m +CONFIG_VIDEOBUF2_CORE=y +CONFIG_VIDEOBUF2_V4L2=y +CONFIG_VIDEOBUF2_MEMOPS=y +CONFIG_VIDEOBUF2_DMA_CONTIG=y +CONFIG_VIDEOBUF2_VMALLOC=y +CONFIG_VIDEOBUF2_DMA_SG=y +CONFIG_VIDEOBUF2_DVB=m +# end of Media drivers + +# +# Media ancillary drivers +# +CONFIG_MEDIA_ATTACH=y + +# +# IR I2C driver auto-selected by 'Autoselect ancillary drivers' +# +# CONFIG_VIDEO_IR_I2C is not set +CONFIG_VIDEO_CAMERA_SENSOR=y +# CONFIG_VIDEO_AR0521 is not set +# CONFIG_VIDEO_HI556 is not set +# CONFIG_VIDEO_HI846 is not set +# CONFIG_VIDEO_HI847 is not set +# CONFIG_VIDEO_IMX208 is not set +# CONFIG_VIDEO_IMX214 is not set +CONFIG_VIDEO_IMX219=y +# CONFIG_VIDEO_IMX258 is not set +# CONFIG_VIDEO_IMX274 is not set +# CONFIG_VIDEO_IMX290 is not set +# CONFIG_VIDEO_IMX296 is not set +# CONFIG_VIDEO_IMX319 is not set +# CONFIG_VIDEO_IMX334 is not set +# CONFIG_VIDEO_IMX335 is not set +# CONFIG_VIDEO_IMX355 is not set +# CONFIG_VIDEO_IMX412 is not set +# CONFIG_VIDEO_IMX415 is not set +# CONFIG_VIDEO_MT9M001 is not set +# CONFIG_VIDEO_MT9M111 is not set +# CONFIG_VIDEO_MT9P031 is not set +# CONFIG_VIDEO_MT9T112 is not set +CONFIG_VIDEO_MT9V011=m +# CONFIG_VIDEO_MT9V032 is not set +# CONFIG_VIDEO_MT9V111 is not set +# CONFIG_VIDEO_OG01A1B is not set +# CONFIG_VIDEO_OV01A10 is not set +# CONFIG_VIDEO_OV02A10 is not set +# CONFIG_VIDEO_OV08D10 is not set +# CONFIG_VIDEO_OV08X40 is not set +# CONFIG_VIDEO_OV13858 is not set +# CONFIG_VIDEO_OV13B10 is not set +CONFIG_VIDEO_OV2640=m +# CONFIG_VIDEO_OV2659 is not set +# CONFIG_VIDEO_OV2680 is not set +# CONFIG_VIDEO_OV2685 is not set +# CONFIG_VIDEO_OV4689 is not set +# CONFIG_VIDEO_OV5640 is not set +CONFIG_VIDEO_OV5645=y +# CONFIG_VIDEO_OV5647 is not set +# CONFIG_VIDEO_OV5648 is not set +# CONFIG_VIDEO_OV5670 is not set +# CONFIG_VIDEO_OV5675 is not set +# CONFIG_VIDEO_OV5693 is not set +# CONFIG_VIDEO_OV5695 is not set +# CONFIG_VIDEO_OV6650 is not set +# CONFIG_VIDEO_OV7251 is not set +# CONFIG_VIDEO_OV7640 is not set +# CONFIG_VIDEO_OV7670 is not set +# CONFIG_VIDEO_OV772X is not set +# CONFIG_VIDEO_OV7740 is not set +# CONFIG_VIDEO_OV8856 is not set +# CONFIG_VIDEO_OV8858 is not set +# CONFIG_VIDEO_OV8865 is not set +# CONFIG_VIDEO_OV9282 is not set +# CONFIG_VIDEO_OV9640 is not set +# CONFIG_VIDEO_OV9650 is not set +# CONFIG_VIDEO_RDACM20 is not set +# CONFIG_VIDEO_RDACM21 is not set +# CONFIG_VIDEO_RJ54N1 is not set +# CONFIG_VIDEO_S5C73M3 is not set +# CONFIG_VIDEO_S5K5BAF is not set +# CONFIG_VIDEO_S5K6A3 is not set +# CONFIG_VIDEO_ST_VGXY61 is not set +# CONFIG_VIDEO_CCS is not set +# CONFIG_VIDEO_ET8EK8 is not set + +# +# Lens drivers +# +# CONFIG_VIDEO_AD5820 is not set +# CONFIG_VIDEO_AK7375 is not set +# CONFIG_VIDEO_DW9714 is not set +# CONFIG_VIDEO_DW9719 is not set +# CONFIG_VIDEO_DW9768 is not set +# CONFIG_VIDEO_DW9807_VCM is not set +# end of Lens drivers + +# +# Flash devices +# +# CONFIG_VIDEO_ADP1653 is not set +# CONFIG_VIDEO_LM3560 is not set +# CONFIG_VIDEO_LM3646 is not set +# end of Flash devices + +# +# Audio decoders, processors and mixers +# +CONFIG_VIDEO_CS3308=m +# CONFIG_VIDEO_CS5345 is not set +# CONFIG_VIDEO_CS53L32A is not set +CONFIG_VIDEO_MSP3400=m +# CONFIG_VIDEO_SONY_BTF_MPX is not set +# CONFIG_VIDEO_TDA1997X is not set +# CONFIG_VIDEO_TDA7432 is not set +# CONFIG_VIDEO_TDA9840 is not set +# CONFIG_VIDEO_TEA6415C is not set +# CONFIG_VIDEO_TEA6420 is not set +# CONFIG_VIDEO_TLV320AIC23B is not set +# CONFIG_VIDEO_TVAUDIO is not set +# CONFIG_VIDEO_UDA1342 is not set +# CONFIG_VIDEO_VP27SMPX is not set +# CONFIG_VIDEO_WM8739 is not set +# CONFIG_VIDEO_WM8775 is not set +# end of Audio decoders, processors and mixers + +# +# RDS decoders +# +# CONFIG_VIDEO_SAA6588 is not set +# end of RDS decoders + +# +# Video decoders +# +# CONFIG_VIDEO_ADV7180 is not set +# CONFIG_VIDEO_ADV7183 is not set +# CONFIG_VIDEO_ADV748X is not set +# CONFIG_VIDEO_ADV7604 is not set +# CONFIG_VIDEO_ADV7842 is not set +# CONFIG_VIDEO_BT819 is not set +# CONFIG_VIDEO_BT856 is not set +# CONFIG_VIDEO_BT866 is not set +# CONFIG_VIDEO_ISL7998X is not set +# CONFIG_VIDEO_KS0127 is not set +# CONFIG_VIDEO_MAX9286 is not set +# CONFIG_VIDEO_ML86V7667 is not set +# CONFIG_VIDEO_SAA7110 is not set +CONFIG_VIDEO_SAA711X=m +# CONFIG_VIDEO_TC358743 is not set +# CONFIG_VIDEO_TC358746 is not set +# CONFIG_VIDEO_TVP514X is not set +CONFIG_VIDEO_TVP5150=m +# CONFIG_VIDEO_TVP7002 is not set +# CONFIG_VIDEO_TW2804 is not set +# CONFIG_VIDEO_TW9903 is not set +# CONFIG_VIDEO_TW9906 is not set +# CONFIG_VIDEO_TW9910 is not set +# CONFIG_VIDEO_VPX3220 is not set + +# +# Video and audio decoders +# +# CONFIG_VIDEO_SAA717X is not set +CONFIG_VIDEO_CX25840=m +# end of Video decoders + +# +# Video encoders +# +# CONFIG_VIDEO_ADV7170 is not set +# CONFIG_VIDEO_ADV7175 is not set +# CONFIG_VIDEO_ADV7343 is not set +# CONFIG_VIDEO_ADV7393 is not set +# CONFIG_VIDEO_ADV7511 is not set +# CONFIG_VIDEO_AK881X is not set +# CONFIG_VIDEO_SAA7127 is not set +# CONFIG_VIDEO_SAA7185 is not set +# CONFIG_VIDEO_THS8200 is not set +# end of Video encoders + +# +# Video improvement chips +# +# CONFIG_VIDEO_UPD64031A is not set +# CONFIG_VIDEO_UPD64083 is not set +# end of Video improvement chips + +# +# Audio/Video compression chips +# +# CONFIG_VIDEO_SAA6752HS is not set +# end of Audio/Video compression chips + +# +# SDR tuner chips +# +# CONFIG_SDR_MAX2175 is not set +# end of SDR tuner chips + +# +# Miscellaneous helper chips +# +# CONFIG_VIDEO_I2C is not set +# CONFIG_VIDEO_M52790 is not set +# CONFIG_VIDEO_ST_MIPID02 is not set +# CONFIG_VIDEO_THS7303 is not set +# end of Miscellaneous helper chips + +# +# Video serializers and deserializers +# +# CONFIG_VIDEO_DS90UB913 is not set +# CONFIG_VIDEO_DS90UB953 is not set +# CONFIG_VIDEO_DS90UB960 is not set +# end of Video serializers and deserializers + +# +# Media SPI Adapters +# +CONFIG_CXD2880_SPI_DRV=m +# CONFIG_VIDEO_GS1662 is not set +# end of Media SPI Adapters + +CONFIG_MEDIA_TUNER=y + +# +# Customize TV tuners +# +CONFIG_MEDIA_TUNER_E4000=m +CONFIG_MEDIA_TUNER_FC0011=m +CONFIG_MEDIA_TUNER_FC0012=m +CONFIG_MEDIA_TUNER_FC0013=m +CONFIG_MEDIA_TUNER_FC2580=m +CONFIG_MEDIA_TUNER_IT913X=m +CONFIG_MEDIA_TUNER_M88RS6000T=m +CONFIG_MEDIA_TUNER_MAX2165=m +CONFIG_MEDIA_TUNER_MC44S803=y +CONFIG_MEDIA_TUNER_MSI001=m +CONFIG_MEDIA_TUNER_MT2060=m +CONFIG_MEDIA_TUNER_MT2063=m +CONFIG_MEDIA_TUNER_MT20XX=y +CONFIG_MEDIA_TUNER_MT2131=m +CONFIG_MEDIA_TUNER_MT2266=m +# CONFIG_MEDIA_TUNER_MXL301RF is not set +CONFIG_MEDIA_TUNER_MXL5005S=m +CONFIG_MEDIA_TUNER_MXL5007T=m +# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set +CONFIG_MEDIA_TUNER_QM1D1C0042=m +CONFIG_MEDIA_TUNER_QT1010=m +CONFIG_MEDIA_TUNER_R820T=m +CONFIG_MEDIA_TUNER_SI2157=m +CONFIG_MEDIA_TUNER_SIMPLE=y +CONFIG_MEDIA_TUNER_TDA18212=m +CONFIG_MEDIA_TUNER_TDA18218=m +CONFIG_MEDIA_TUNER_TDA18250=m +CONFIG_MEDIA_TUNER_TDA18271=y +CONFIG_MEDIA_TUNER_TDA827X=y +CONFIG_MEDIA_TUNER_TDA8290=y +CONFIG_MEDIA_TUNER_TDA9887=y +CONFIG_MEDIA_TUNER_TEA5761=y +CONFIG_MEDIA_TUNER_TEA5767=y +CONFIG_MEDIA_TUNER_TUA9001=m +CONFIG_MEDIA_TUNER_XC2028=y +CONFIG_MEDIA_TUNER_XC4000=y +CONFIG_MEDIA_TUNER_XC5000=y +# end of Customize TV tuners + +# +# Customise DVB Frontends +# + +# +# Multistandard (satellite) frontends +# +CONFIG_DVB_M88DS3103=m +# CONFIG_DVB_MXL5XX is not set +CONFIG_DVB_STB0899=m +CONFIG_DVB_STB6100=m +CONFIG_DVB_STV090x=m +# CONFIG_DVB_STV0910 is not set +CONFIG_DVB_STV6110x=m +# CONFIG_DVB_STV6111 is not set + +# +# Multistandard (cable + terrestrial) frontends +# +CONFIG_DVB_DRXK=m +CONFIG_DVB_MN88472=m +CONFIG_DVB_MN88473=m +CONFIG_DVB_SI2165=m +CONFIG_DVB_TDA18271C2DD=m + +# +# DVB-S (satellite) frontends +# +# CONFIG_DVB_CX24110 is not set +CONFIG_DVB_CX24116=m +CONFIG_DVB_CX24117=m +CONFIG_DVB_CX24120=m +CONFIG_DVB_CX24123=m +CONFIG_DVB_DS3000=m +# CONFIG_DVB_MB86A16 is not set +CONFIG_DVB_MT312=m +CONFIG_DVB_S5H1420=m +CONFIG_DVB_SI21XX=m +CONFIG_DVB_STB6000=m +CONFIG_DVB_STV0288=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_STV0900=m +CONFIG_DVB_STV6110=m +CONFIG_DVB_TDA10071=m +CONFIG_DVB_TDA10086=m +CONFIG_DVB_TDA8083=m +# CONFIG_DVB_TDA8261 is not set +CONFIG_DVB_TDA826X=m +CONFIG_DVB_TS2020=m +# CONFIG_DVB_TUA6100 is not set +CONFIG_DVB_TUNER_CX24113=m +CONFIG_DVB_TUNER_ITD1000=m +# CONFIG_DVB_VES1X93 is not set +# CONFIG_DVB_ZL10036 is not set +CONFIG_DVB_ZL10039=m + +# +# DVB-T (terrestrial) frontends +# +CONFIG_DVB_AF9013=m +CONFIG_DVB_AS102_FE=m +CONFIG_DVB_CX22700=m +CONFIG_DVB_CX22702=m +CONFIG_DVB_CXD2820R=m +CONFIG_DVB_CXD2841ER=m +CONFIG_DVB_DIB3000MB=m +CONFIG_DVB_DIB3000MC=m +CONFIG_DVB_DIB7000M=m +CONFIG_DVB_DIB7000P=m +# CONFIG_DVB_DIB9000 is not set +CONFIG_DVB_DRXD=m +CONFIG_DVB_EC100=m +CONFIG_DVB_GP8PSK_FE=m +# CONFIG_DVB_L64781 is not set +CONFIG_DVB_MT352=m +CONFIG_DVB_NXT6000=m +CONFIG_DVB_RTL2830=m +CONFIG_DVB_RTL2832=m +CONFIG_DVB_RTL2832_SDR=m +# CONFIG_DVB_S5H1432 is not set +CONFIG_DVB_SI2168=m +# CONFIG_DVB_SP887X is not set +CONFIG_DVB_STV0367=m +CONFIG_DVB_TDA10048=m +CONFIG_DVB_TDA1004X=m +# CONFIG_DVB_ZD1301_DEMOD is not set +CONFIG_DVB_ZL10353=m +# CONFIG_DVB_CXD2880 is not set + +# +# DVB-C (cable) frontends +# +CONFIG_DVB_STV0297=m +# CONFIG_DVB_TDA10021 is not set +CONFIG_DVB_TDA10023=m +CONFIG_DVB_VES1820=m + +# +# ATSC (North American/Korean Terrestrial/Cable DTV) frontends +# +CONFIG_DVB_AU8522=m +CONFIG_DVB_AU8522_DTV=m +CONFIG_DVB_AU8522_V4L=m +CONFIG_DVB_BCM3510=m +CONFIG_DVB_LG2160=m +CONFIG_DVB_LGDT3305=m +CONFIG_DVB_LGDT3306A=m +CONFIG_DVB_LGDT330X=m +CONFIG_DVB_MXL692=m +CONFIG_DVB_NXT200X=m +# CONFIG_DVB_OR51132 is not set +# CONFIG_DVB_OR51211 is not set +CONFIG_DVB_S5H1409=m +CONFIG_DVB_S5H1411=m + +# +# ISDB-T (terrestrial) frontends +# +CONFIG_DVB_DIB8000=m +CONFIG_DVB_MB86A20S=m +CONFIG_DVB_S921=m + +# +# ISDB-S (satellite) & ISDB-T (terrestrial) frontends +# +# CONFIG_DVB_MN88443X is not set +CONFIG_DVB_TC90522=m + +# +# Digital terrestrial only tuners/PLL +# +CONFIG_DVB_PLL=m +CONFIG_DVB_TUNER_DIB0070=m +CONFIG_DVB_TUNER_DIB0090=m + +# +# SEC control devices for DVB-S +# +CONFIG_DVB_A8293=m +CONFIG_DVB_AF9033=m +CONFIG_DVB_ASCOT2E=m +CONFIG_DVB_ATBM8830=m +CONFIG_DVB_HELENE=m +CONFIG_DVB_HORUS3A=m +CONFIG_DVB_ISL6405=m +CONFIG_DVB_ISL6421=m +CONFIG_DVB_ISL6423=m +CONFIG_DVB_IX2505V=m +CONFIG_DVB_LGS8GL5=m +CONFIG_DVB_LGS8GXX=m +CONFIG_DVB_LNBH25=m +CONFIG_DVB_LNBH29=m +CONFIG_DVB_LNBP21=m +CONFIG_DVB_LNBP22=m +CONFIG_DVB_M88RS2000=m +CONFIG_DVB_TDA665x=m +CONFIG_DVB_DRX39XYJ=m + +# +# Common Interface (EN50221) controller drivers +# +CONFIG_DVB_CXD2099=m +CONFIG_DVB_SP2=m +# end of Customise DVB Frontends + +# +# Tools to develop new frontends +# +# CONFIG_DVB_DUMMY_FE is not set +# end of Media ancillary drivers + +# +# Graphics support +# +CONFIG_VIDEO_CMDLINE=y +CONFIG_VIDEO_NOMODESET=y +# CONFIG_AUXDISPLAY is not set +CONFIG_DRM=y +CONFIG_DRM_MIPI_DBI=y +CONFIG_DRM_MIPI_DSI=y +# CONFIG_DRM_DEBUG_MM is not set +CONFIG_DRM_KMS_HELPER=y +# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set +CONFIG_DRM_LOAD_EDID_FIRMWARE=y +CONFIG_DRM_DISPLAY_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_HELPER=y +# CONFIG_DRM_DP_AUX_CHARDEV is not set +# CONFIG_DRM_DP_CEC is not set +CONFIG_DRM_GEM_DMA_HELPER=y +CONFIG_DRM_GEM_SHMEM_HELPER=y +CONFIG_DRM_SCHED=y + +# +# I2C encoder or helper chips +# +# CONFIG_DRM_I2C_CH7006 is not set +# CONFIG_DRM_I2C_SIL164 is not set +# CONFIG_DRM_I2C_NXP_TDA998X is not set +# CONFIG_DRM_I2C_NXP_TDA9950 is not set +# end of I2C encoder or helper chips + +# +# ARM devices +# +# CONFIG_DRM_HDLCD is not set +CONFIG_DRM_MALI_DISPLAY=y +# CONFIG_DRM_KOMEDA is not set +# end of ARM devices + +# CONFIG_DRM_RADEON is not set +# CONFIG_DRM_AMDGPU is not set +# CONFIG_DRM_NOUVEAU is not set +# CONFIG_DRM_VGEM is not set +# CONFIG_DRM_VKMS is not set +CONFIG_DRM_ROCKCHIP=y +CONFIG_ROCKCHIP_VOP=y +CONFIG_ROCKCHIP_VOP2=y +# CONFIG_ROCKCHIP_ANALOGIX_DP is not set +# CONFIG_ROCKCHIP_CDN_DP is not set +CONFIG_ROCKCHIP_DW_HDMI=y +CONFIG_ROCKCHIP_DW_MIPI_DSI=y +# CONFIG_ROCKCHIP_INNO_HDMI is not set +# CONFIG_ROCKCHIP_LVDS is not set +# CONFIG_ROCKCHIP_RGB is not set +# CONFIG_ROCKCHIP_RK3066_HDMI is not set +# CONFIG_DRM_VMWGFX is not set +# CONFIG_DRM_UDL is not set +# CONFIG_DRM_AST is not set +# CONFIG_DRM_MGAG200 is not set +# CONFIG_DRM_QXL is not set +CONFIG_DRM_PANEL=y + +# +# Display Panels +# +# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set +# CONFIG_DRM_PANEL_ARM_VERSATILE is not set +# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set +# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set +# CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set +# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set +# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set +# CONFIG_DRM_PANEL_DSI_CM is not set +# CONFIG_DRM_PANEL_LVDS is not set +# CONFIG_DRM_PANEL_SIMPLE is not set +# CONFIG_DRM_PANEL_EDP is not set +# CONFIG_DRM_PANEL_EBBG_FT8719 is not set +CONFIG_DRM_PANEL_ELIDA_KD35T133=y +# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set +# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set +# CONFIG_DRM_PANEL_HIMAX_HX8394 is not set +# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set +# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set +# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set +# CONFIG_DRM_PANEL_JADARD_JD9365DA_H3 is not set +# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set +# CONFIG_DRM_PANEL_JDI_R63452 is not set +# CONFIG_DRM_PANEL_KHADAS_TS050 is not set +# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set +# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set +# CONFIG_DRM_PANEL_LG_LB035Q02 is not set +# CONFIG_DRM_PANEL_LG_LG4573 is not set +CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966=y +# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set +CONFIG_DRM_PANEL_NEWVISION_NV3051D=y +# CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36523 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set +# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set +# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set +# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set +# CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set +# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set +# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set +# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set +# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set +# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set +# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set +# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set +# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set +# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set +# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set +# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set +# CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set +CONFIG_DRM_PANEL_SITRONIX_ST7703=y +# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set +# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set +# CONFIG_DRM_PANEL_SONY_TD4353_JDI is not set +# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set +# CONFIG_DRM_PANEL_STARTEK_KD070FHFID015 is not set +# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set +# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set +# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set +# CONFIG_DRM_PANEL_TPO_TPG110 is not set +# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set +# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set +# CONFIG_DRM_PANEL_VISIONOX_VTDR6130 is not set +# CONFIG_DRM_PANEL_VISIONOX_R66451 is not set +# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set +# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set +# end of Display Panels + +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y + +# +# Display Interface Bridges +# +# CONFIG_DRM_CHIPONE_ICN6211 is not set +# CONFIG_DRM_CHRONTEL_CH7033 is not set +CONFIG_DRM_DISPLAY_CONNECTOR=y +# CONFIG_DRM_ITE_IT6505 is not set +# CONFIG_DRM_LONTIUM_LT8912B is not set +# CONFIG_DRM_LONTIUM_LT9211 is not set +# CONFIG_DRM_LONTIUM_LT9611 is not set +# CONFIG_DRM_LONTIUM_LT9611UXC is not set +# CONFIG_DRM_ITE_IT66121 is not set +# CONFIG_DRM_LVDS_CODEC is not set +# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set +# CONFIG_DRM_NWL_MIPI_DSI is not set +# CONFIG_DRM_NXP_PTN3460 is not set +# CONFIG_DRM_PARADE_PS8622 is not set +# CONFIG_DRM_PARADE_PS8640 is not set +# CONFIG_DRM_SAMSUNG_DSIM is not set +# CONFIG_DRM_SIL_SII8620 is not set +# CONFIG_DRM_SII902X is not set +# CONFIG_DRM_SII9234 is not set +# CONFIG_DRM_SIMPLE_BRIDGE is not set +# CONFIG_DRM_THINE_THC63LVD1024 is not set +# CONFIG_DRM_TOSHIBA_TC358762 is not set +# CONFIG_DRM_TOSHIBA_TC358764 is not set +# CONFIG_DRM_TOSHIBA_TC358767 is not set +# CONFIG_DRM_TOSHIBA_TC358768 is not set +# CONFIG_DRM_TOSHIBA_TC358775 is not set +# CONFIG_DRM_TI_DLPC3433 is not set +# CONFIG_DRM_TI_TFP410 is not set +# CONFIG_DRM_TI_SN65DSI83 is not set +# CONFIG_DRM_TI_SN65DSI86 is not set +# CONFIG_DRM_TI_TPD12S015 is not set +# CONFIG_DRM_ANALOGIX_ANX6345 is not set +# CONFIG_DRM_ANALOGIX_ANX78XX is not set +# CONFIG_DRM_ANALOGIX_ANX7625 is not set +# CONFIG_DRM_I2C_ADV7511 is not set +# CONFIG_DRM_CDNS_DSI is not set +# CONFIG_DRM_CDNS_MHDP8546 is not set +CONFIG_DRM_DW_HDMI=y +# CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set +CONFIG_DRM_DW_HDMI_I2S_AUDIO=m +# CONFIG_DRM_DW_HDMI_GP_AUDIO is not set +CONFIG_DRM_DW_HDMI_CEC=y +CONFIG_DRM_DW_MIPI_DSI=y +# end of Display Interface Bridges + +# CONFIG_DRM_LOONGSON is not set +# CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_HISI_HIBMC is not set +# CONFIG_DRM_HISI_KIRIN is not set +# CONFIG_DRM_LOGICVC is not set +# CONFIG_DRM_ARCPGU is not set +# CONFIG_DRM_BOCHS is not set +# CONFIG_DRM_CIRRUS_QEMU is not set +# CONFIG_DRM_GM12U320 is not set +CONFIG_DRM_PANEL_MIPI_DBI=y +# CONFIG_DRM_SIMPLEDRM is not set +# CONFIG_TINYDRM_HX8357D is not set +# CONFIG_TINYDRM_ILI9163 is not set +# CONFIG_TINYDRM_ILI9225 is not set +# CONFIG_TINYDRM_ILI9341 is not set +# CONFIG_TINYDRM_ILI9486 is not set +# CONFIG_TINYDRM_MI0283QT is not set +# CONFIG_TINYDRM_REPAPER is not set +# CONFIG_TINYDRM_ST7586 is not set +# CONFIG_TINYDRM_ST7735R is not set +# CONFIG_DRM_PL111 is not set +# CONFIG_DRM_LIMA is not set +CONFIG_DRM_PANFROST=y +# CONFIG_DRM_TIDSS is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_SSD130X is not set +# CONFIG_DRM_LEGACY is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y + +# +# Frame buffer Devices +# +CONFIG_FB=y +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_ARMCLCD is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_UVESA is not set +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_I740 is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set +# CONFIG_FB_SMSCUFX is not set +# CONFIG_FB_UDL is not set +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_SIMPLE is not set +# CONFIG_FB_SSD1307 is not set +# CONFIG_FB_SM712 is not set +CONFIG_FB_CORE=y +CONFIG_FB_NOTIFY=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_DEVICE=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYS_FOPS=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_DMAMEM_HELPERS=y +CONFIG_FB_SYSMEM_HELPERS=y +CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y +CONFIG_FB_MODE_HELPERS=y +# CONFIG_FB_TILEBLITTING is not set +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +# CONFIG_LCD_CLASS_DEVICE is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_KTD253 is not set +# CONFIG_BACKLIGHT_KTZ8866 is not set +CONFIG_BACKLIGHT_PWM=y +# CONFIG_BACKLIGHT_QCOM_WLED is not set +# CONFIG_BACKLIGHT_ADP8860 is not set +# CONFIG_BACKLIGHT_ADP8870 is not set +# CONFIG_BACKLIGHT_LM3630A is not set +# CONFIG_BACKLIGHT_LM3639 is not set +# CONFIG_BACKLIGHT_LP855X is not set +# CONFIG_BACKLIGHT_GPIO is not set +# CONFIG_BACKLIGHT_LV5207LP is not set +# CONFIG_BACKLIGHT_BD6107 is not set +# CONFIG_BACKLIGHT_ARCXCNN is not set +CONFIG_BACKLIGHT_LED=y +# end of Backlight & LCD device support + +CONFIG_VIDEOMODE_HELPERS=y +CONFIG_HDMI=y + +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# end of Console display driver support + +# CONFIG_LOGO is not set +# end of Graphics support + +# CONFIG_DRM_ACCEL is not set +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_PCM_ELD=y +CONFIG_SND_PCM_IEC958=y +CONFIG_SND_DMAENGINE_PCM=y +CONFIG_SND_HWDEP=y +CONFIG_SND_SEQ_DEVICE=y +CONFIG_SND_RAWMIDI=y +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +# CONFIG_SND_OSSEMUL is not set +CONFIG_SND_PCM_TIMER=y +CONFIG_SND_HRTIMER=y +CONFIG_SND_DYNAMIC_MINORS=y +CONFIG_SND_MAX_CARDS=32 +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_PROC_FS=y +# CONFIG_SND_VERBOSE_PROCFS is not set +CONFIG_SND_VERBOSE_PRINTK=y +CONFIG_SND_CTL_FAST_LOOKUP=y +# CONFIG_SND_DEBUG is not set +# CONFIG_SND_CTL_INPUT_VALIDATION is not set +CONFIG_SND_SEQUENCER=y +CONFIG_SND_SEQ_DUMMY=y +CONFIG_SND_SEQ_HRTIMER_DEFAULT=y +CONFIG_SND_SEQ_MIDI_EVENT=y +CONFIG_SND_SEQ_MIDI=y +# CONFIG_SND_SEQ_UMP is not set +# CONFIG_SND_DRIVERS is not set +# CONFIG_SND_PCI is not set + +# +# HD-Audio +# +# end of HD-Audio + +CONFIG_SND_HDA_PREALLOC_SIZE=64 +# CONFIG_SND_SPI is not set +CONFIG_SND_USB=y +CONFIG_SND_USB_AUDIO=y +# CONFIG_SND_USB_AUDIO_MIDI_V2 is not set +CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y +# CONFIG_SND_USB_UA101 is not set +# CONFIG_SND_USB_CAIAQ is not set +# CONFIG_SND_USB_6FIRE is not set +# CONFIG_SND_USB_HIFACE is not set +# CONFIG_SND_BCD2000 is not set +# CONFIG_SND_USB_POD is not set +# CONFIG_SND_USB_PODHD is not set +# CONFIG_SND_USB_TONEPORT is not set +# CONFIG_SND_USB_VARIAX is not set +CONFIG_SND_SOC=y +CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y +# CONFIG_SND_SOC_ADI is not set +# CONFIG_SND_SOC_AMD_ACP is not set +# CONFIG_SND_AMD_ACP_CONFIG is not set +# CONFIG_SND_ATMEL_SOC is not set +# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set +# CONFIG_SND_DESIGNWARE_I2S is not set + +# +# SoC Audio for Freescale CPUs +# + +# +# Common SoC Audio options for Freescale CPUs: +# +# CONFIG_SND_SOC_FSL_ASRC is not set +CONFIG_SND_SOC_FSL_SAI=y +# CONFIG_SND_SOC_FSL_MQS is not set +# CONFIG_SND_SOC_FSL_AUDMIX is not set +# CONFIG_SND_SOC_FSL_SSI is not set +# CONFIG_SND_SOC_FSL_SPDIF is not set +# CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_FSL_MICFIL is not set +# CONFIG_SND_SOC_FSL_XCVR is not set +CONFIG_SND_SOC_FSL_UTILS=y +# CONFIG_SND_SOC_IMX_AUDMUX is not set +# end of SoC Audio for Freescale CPUs + +# CONFIG_SND_SOC_CHV3_I2S is not set +# CONFIG_SND_I2S_HI6210_I2S is not set +# CONFIG_SND_SOC_IMG is not set +# CONFIG_SND_SOC_MTK_BTCVSD is not set +CONFIG_SND_SOC_ROCKCHIP=y +CONFIG_SND_SOC_ROCKCHIP_I2S=y +CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y +CONFIG_SND_SOC_ROCKCHIP_PDM=y +CONFIG_SND_SOC_ROCKCHIP_SPDIF=y +# CONFIG_SND_SOC_ROCKCHIP_MAX98090 is not set +# CONFIG_SND_SOC_ROCKCHIP_RT5645 is not set +# CONFIG_SND_SOC_RK3288_HDMI_ANALOG is not set +# CONFIG_SND_SOC_RK3399_GRU_SOUND is not set +# CONFIG_SND_SOC_SOF_TOPLEVEL is not set + +# +# STMicroelectronics STM32 SOC audio support +# +# end of STMicroelectronics STM32 SOC audio support + +# CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set +# CONFIG_SND_SOC_XTFPGA_I2S is not set +CONFIG_SND_SOC_I2C_AND_SPI=y + +# +# CODEC drivers +# +# CONFIG_SND_SOC_AC97_CODEC is not set +# CONFIG_SND_SOC_ADAU1372_I2C is not set +# CONFIG_SND_SOC_ADAU1372_SPI is not set +# CONFIG_SND_SOC_ADAU1701 is not set +# CONFIG_SND_SOC_ADAU1761_I2C is not set +# CONFIG_SND_SOC_ADAU1761_SPI is not set +# CONFIG_SND_SOC_ADAU7002 is not set +# CONFIG_SND_SOC_ADAU7118_HW is not set +# CONFIG_SND_SOC_ADAU7118_I2C is not set +# CONFIG_SND_SOC_AK4104 is not set +# CONFIG_SND_SOC_AK4118 is not set +# CONFIG_SND_SOC_AK4375 is not set +# CONFIG_SND_SOC_AK4458 is not set +# CONFIG_SND_SOC_AK4554 is not set +# CONFIG_SND_SOC_AK4613 is not set +# CONFIG_SND_SOC_AK4642 is not set +# CONFIG_SND_SOC_AK5386 is not set +# CONFIG_SND_SOC_AK5558 is not set +# CONFIG_SND_SOC_ALC5623 is not set +# CONFIG_SND_SOC_AUDIO_IIO_AUX is not set +# CONFIG_SND_SOC_AW8738 is not set +# CONFIG_SND_SOC_AW88395 is not set +# CONFIG_SND_SOC_AW88261 is not set +# CONFIG_SND_SOC_BD28623 is not set +# CONFIG_SND_SOC_BT_SCO is not set +# CONFIG_SND_SOC_CHV3_CODEC is not set +# CONFIG_SND_SOC_CS35L32 is not set +# CONFIG_SND_SOC_CS35L33 is not set +# CONFIG_SND_SOC_CS35L34 is not set +# CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS35L36 is not set +# CONFIG_SND_SOC_CS35L41_SPI is not set +# CONFIG_SND_SOC_CS35L41_I2C is not set +# CONFIG_SND_SOC_CS35L45_SPI is not set +# CONFIG_SND_SOC_CS35L45_I2C is not set +# CONFIG_SND_SOC_CS35L56_I2C is not set +# CONFIG_SND_SOC_CS35L56_SPI is not set +# CONFIG_SND_SOC_CS42L42 is not set +# CONFIG_SND_SOC_CS42L51_I2C is not set +# CONFIG_SND_SOC_CS42L52 is not set +# CONFIG_SND_SOC_CS42L56 is not set +# CONFIG_SND_SOC_CS42L73 is not set +# CONFIG_SND_SOC_CS42L83 is not set +# CONFIG_SND_SOC_CS4234 is not set +# CONFIG_SND_SOC_CS4265 is not set +# CONFIG_SND_SOC_CS4270 is not set +# CONFIG_SND_SOC_CS4271_I2C is not set +# CONFIG_SND_SOC_CS4271_SPI is not set +# CONFIG_SND_SOC_CS42XX8_I2C is not set +# CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4341 is not set +# CONFIG_SND_SOC_CS4349 is not set +# CONFIG_SND_SOC_CS53L30 is not set +# CONFIG_SND_SOC_CX2072X is not set +# CONFIG_SND_SOC_DA7213 is not set +# CONFIG_SND_SOC_DMIC is not set +CONFIG_SND_SOC_HDMI_CODEC=m +# CONFIG_SND_SOC_ES7134 is not set +# CONFIG_SND_SOC_ES7241 is not set +CONFIG_SND_SOC_ES8316=y +# CONFIG_SND_SOC_ES8326 is not set +# CONFIG_SND_SOC_ES8328_I2C is not set +# CONFIG_SND_SOC_ES8328_SPI is not set +# CONFIG_SND_SOC_GTM601 is not set +# CONFIG_SND_SOC_HDA is not set +# CONFIG_SND_SOC_ICS43432 is not set +# CONFIG_SND_SOC_IDT821034 is not set +# CONFIG_SND_SOC_INNO_RK3036 is not set +# CONFIG_SND_SOC_MAX98088 is not set +CONFIG_SND_SOC_MAX98090=y +# CONFIG_SND_SOC_MAX98357A is not set +# CONFIG_SND_SOC_MAX98504 is not set +# CONFIG_SND_SOC_MAX9867 is not set +# CONFIG_SND_SOC_MAX98927 is not set +# CONFIG_SND_SOC_MAX98520 is not set +# CONFIG_SND_SOC_MAX98373_I2C is not set +# CONFIG_SND_SOC_MAX98388 is not set +# CONFIG_SND_SOC_MAX98390 is not set +# CONFIG_SND_SOC_MAX98396 is not set +# CONFIG_SND_SOC_MAX9860 is not set +# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set +# CONFIG_SND_SOC_PCM1681 is not set +# CONFIG_SND_SOC_PCM1789_I2C is not set +# CONFIG_SND_SOC_PCM179X_I2C is not set +# CONFIG_SND_SOC_PCM179X_SPI is not set +# CONFIG_SND_SOC_PCM186X_I2C is not set +# CONFIG_SND_SOC_PCM186X_SPI is not set +# CONFIG_SND_SOC_PCM3060_I2C is not set +# CONFIG_SND_SOC_PCM3060_SPI is not set +# CONFIG_SND_SOC_PCM3168A_I2C is not set +# CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM5102A is not set +# CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_PEB2466 is not set +# CONFIG_SND_SOC_RK3328 is not set +CONFIG_SND_SOC_RK817=y +# CONFIG_SND_SOC_RT5616 is not set +# CONFIG_SND_SOC_RT5631 is not set +# CONFIG_SND_SOC_RT5640 is not set +# CONFIG_SND_SOC_RT5659 is not set +# CONFIG_SND_SOC_RT9120 is not set +# CONFIG_SND_SOC_SGTL5000 is not set +CONFIG_SND_SOC_SIMPLE_AMPLIFIER=y +# CONFIG_SND_SOC_SIMPLE_MUX is not set +# CONFIG_SND_SOC_SMA1303 is not set +CONFIG_SND_SOC_SPDIF=y +# CONFIG_SND_SOC_SRC4XXX_I2C is not set +# CONFIG_SND_SOC_SSM2305 is not set +# CONFIG_SND_SOC_SSM2518 is not set +# CONFIG_SND_SOC_SSM2602_SPI is not set +# CONFIG_SND_SOC_SSM2602_I2C is not set +# CONFIG_SND_SOC_SSM3515 is not set +# CONFIG_SND_SOC_SSM4567 is not set +# CONFIG_SND_SOC_STA32X is not set +# CONFIG_SND_SOC_STA350 is not set +# CONFIG_SND_SOC_STI_SAS is not set +# CONFIG_SND_SOC_TAS2552 is not set +# CONFIG_SND_SOC_TAS2562 is not set +# CONFIG_SND_SOC_TAS2764 is not set +# CONFIG_SND_SOC_TAS2770 is not set +# CONFIG_SND_SOC_TAS2780 is not set +# CONFIG_SND_SOC_TAS2781_I2C is not set +# CONFIG_SND_SOC_TAS5086 is not set +# CONFIG_SND_SOC_TAS571X is not set +# CONFIG_SND_SOC_TAS5720 is not set +# CONFIG_SND_SOC_TAS5805M is not set +# CONFIG_SND_SOC_TAS6424 is not set +# CONFIG_SND_SOC_TDA7419 is not set +# CONFIG_SND_SOC_TFA9879 is not set +# CONFIG_SND_SOC_TFA989X is not set +# CONFIG_SND_SOC_TLV320ADC3XXX is not set +# CONFIG_SND_SOC_TLV320AIC23_I2C is not set +# CONFIG_SND_SOC_TLV320AIC23_SPI is not set +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set +# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set +# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set +# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set +# CONFIG_SND_SOC_TLV320ADCX140 is not set +CONFIG_SND_SOC_TS3A227E=y +# CONFIG_SND_SOC_TSCS42XX is not set +# CONFIG_SND_SOC_TSCS454 is not set +# CONFIG_SND_SOC_UDA1334 is not set +# CONFIG_SND_SOC_WM8510 is not set +# CONFIG_SND_SOC_WM8523 is not set +# CONFIG_SND_SOC_WM8524 is not set +# CONFIG_SND_SOC_WM8580 is not set +# CONFIG_SND_SOC_WM8711 is not set +# CONFIG_SND_SOC_WM8728 is not set +# CONFIG_SND_SOC_WM8731_I2C is not set +# CONFIG_SND_SOC_WM8731_SPI is not set +# CONFIG_SND_SOC_WM8737 is not set +# CONFIG_SND_SOC_WM8741 is not set +# CONFIG_SND_SOC_WM8750 is not set +# CONFIG_SND_SOC_WM8753 is not set +# CONFIG_SND_SOC_WM8770 is not set +# CONFIG_SND_SOC_WM8776 is not set +# CONFIG_SND_SOC_WM8782 is not set +# CONFIG_SND_SOC_WM8804_I2C is not set +# CONFIG_SND_SOC_WM8804_SPI is not set +# CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8904 is not set +# CONFIG_SND_SOC_WM8940 is not set +# CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8961 is not set +# CONFIG_SND_SOC_WM8962 is not set +# CONFIG_SND_SOC_WM8974 is not set +# CONFIG_SND_SOC_WM8978 is not set +# CONFIG_SND_SOC_WM8985 is not set +# CONFIG_SND_SOC_ZL38060 is not set +# CONFIG_SND_SOC_MAX9759 is not set +# CONFIG_SND_SOC_MT6351 is not set +# CONFIG_SND_SOC_MT6358 is not set +# CONFIG_SND_SOC_MT6660 is not set +# CONFIG_SND_SOC_NAU8315 is not set +# CONFIG_SND_SOC_NAU8540 is not set +# CONFIG_SND_SOC_NAU8810 is not set +# CONFIG_SND_SOC_NAU8821 is not set +# CONFIG_SND_SOC_NAU8822 is not set +# CONFIG_SND_SOC_NAU8824 is not set +# CONFIG_SND_SOC_TPA6130A2 is not set +# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set +# CONFIG_SND_SOC_LPASS_VA_MACRO is not set +# CONFIG_SND_SOC_LPASS_RX_MACRO is not set +# CONFIG_SND_SOC_LPASS_TX_MACRO is not set +# end of CODEC drivers + +CONFIG_SND_SIMPLE_CARD_UTILS=y +CONFIG_SND_SIMPLE_CARD=y +CONFIG_SND_AUDIO_GRAPH_CARD=y +CONFIG_SND_AUDIO_GRAPH_CARD2=y +CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE=y +CONFIG_SND_TEST_COMPONENT=y +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_GENERIC=y + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=y +# CONFIG_HID_ACCUTOUCH is not set +CONFIG_HID_ACRUX=y +# CONFIG_HID_ACRUX_FF is not set +CONFIG_HID_APPLE=y +CONFIG_HID_APPLEIR=y +# CONFIG_HID_ASUS is not set +CONFIG_HID_AUREAL=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BETOP_FF=y +# CONFIG_HID_BIGBEN_FF is not set +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CORSAIR=y +# CONFIG_HID_COUGAR is not set +# CONFIG_HID_MACALLY is not set +CONFIG_HID_PRODIKEYS=y +# CONFIG_HID_CMEDIA is not set +CONFIG_HID_CP2112=y +# CONFIG_HID_CREATIVE_SB0540 is not set +CONFIG_HID_CYPRESS=y +CONFIG_HID_DRAGONRISE=y +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=y +# CONFIG_HID_ELAN is not set +CONFIG_HID_ELECOM=y +CONFIG_HID_ELO=y +# CONFIG_HID_EVISION is not set +CONFIG_HID_EZKEY=y +# CONFIG_HID_FT260 is not set +CONFIG_HID_GEMBIRD=y +CONFIG_HID_GFRM=y +# CONFIG_HID_GLORIOUS is not set +CONFIG_HID_HOLTEK=y +CONFIG_HOLTEK_FF=y +# CONFIG_HID_GOOGLE_STADIA_FF is not set +# CONFIG_HID_VIVALDI is not set +CONFIG_HID_GT683R=y +CONFIG_HID_KEYTOUCH=y +CONFIG_HID_KYE=y +CONFIG_HID_UCLOGIC=y +CONFIG_HID_WALTOP=y +# CONFIG_HID_VIEWSONIC is not set +# CONFIG_HID_VRC2 is not set +# CONFIG_HID_XIAOMI is not set +CONFIG_HID_GYRATION=y +CONFIG_HID_ICADE=y +# CONFIG_HID_ITE is not set +# CONFIG_HID_JABRA is not set +CONFIG_HID_TWINHAN=y +CONFIG_HID_KENSINGTON=y +CONFIG_HID_LCPOWER=y +CONFIG_HID_LED=y +CONFIG_HID_LENOVO=y +# CONFIG_HID_LETSKETCH is not set +CONFIG_HID_LOGITECH=y +CONFIG_HID_LOGITECH_DJ=y +CONFIG_HID_LOGITECH_HIDPP=y +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_LOGIWHEELS_FF=y +CONFIG_HID_MAGICMOUSE=y +# CONFIG_HID_MALTRON is not set +# CONFIG_HID_MAYFLASH is not set +# CONFIG_HID_MEGAWORLD_FF is not set +# CONFIG_HID_REDRAGON is not set +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_MULTITOUCH=y +# CONFIG_HID_NINTENDO is not set +# CONFIG_HID_NTI is not set +CONFIG_HID_NTRIG=y +# CONFIG_HID_NVIDIA_SHIELD is not set +CONFIG_HID_ORTEK=y +CONFIG_HID_PANTHERLORD=y +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=y +CONFIG_HID_PETALYNX=y +# CONFIG_HID_PICOLCD is not set +CONFIG_HID_PLANTRONICS=y +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAZER is not set +CONFIG_HID_PRIMAX=y +# CONFIG_HID_RETRODE is not set +CONFIG_HID_ROCCAT=y +CONFIG_HID_SAITEK=y +CONFIG_HID_SAMSUNG=y +# CONFIG_HID_SEMITEK is not set +# CONFIG_HID_SIGMAMICRO is not set +CONFIG_HID_SONY=y +# CONFIG_SONY_FF is not set +CONFIG_HID_SPEEDLINK=y +# CONFIG_HID_STEAM is not set +CONFIG_HID_STEELSERIES=y +CONFIG_HID_SUNPLUS=y +CONFIG_HID_RMI=y +CONFIG_HID_GREENASIA=y +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=y +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=y +CONFIG_HID_TOPSEED=y +# CONFIG_HID_TOPRE is not set +CONFIG_HID_THINGM=y +CONFIG_HID_THRUSTMASTER=y +CONFIG_THRUSTMASTER_FF=y +# CONFIG_HID_UDRAW_PS3 is not set +# CONFIG_HID_U2FZERO is not set +CONFIG_HID_WACOM=y +CONFIG_HID_WIIMOTE=y +CONFIG_HID_XINMO=y +CONFIG_HID_ZEROPLUS=y +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=y +CONFIG_HID_SENSOR_HUB=y +CONFIG_HID_SENSOR_CUSTOM_SENSOR=y +CONFIG_HID_ALPS=y +# CONFIG_HID_MCP2221 is not set +# end of Special HID drivers + +# +# HID-BPF support +# +# end of HID-BPF support + +# +# USB HID support +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +CONFIG_USB_HIDDEV=y +# end of USB HID support + +CONFIG_I2C_HID=y +# CONFIG_I2C_HID_OF is not set +# CONFIG_I2C_HID_OF_ELAN is not set +CONFIG_I2C_HID_OF_GOODIX=y +CONFIG_I2C_HID_CORE=y +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +# CONFIG_USB_LED_TRIG is not set +# CONFIG_USB_ULPI_BUS is not set +# CONFIG_USB_CONN_GPIO is not set +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +CONFIG_USB_PCI=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +# CONFIG_USB_DEFAULT_PERSIST is not set +# CONFIG_USB_FEW_INIT_RETRIES is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +CONFIG_USB_OTG=y +CONFIG_USB_OTG_PRODUCTLIST=y +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +CONFIG_USB_OTG_FSM=y +CONFIG_USB_LEDS_TRIGGER_USBPORT=y +CONFIG_USB_AUTOSUSPEND_DELAY=2 +CONFIG_USB_MON=y + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +CONFIG_USB_XHCI_HCD=y +# CONFIG_USB_XHCI_DBGCAP is not set +CONFIG_USB_XHCI_PCI=y +# CONFIG_USB_XHCI_PCI_RENESAS is not set +CONFIG_USB_XHCI_PLATFORM=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_EHCI_PCI=y +# CONFIG_USB_EHCI_FSL is not set +CONFIG_USB_EHCI_HCD_PLATFORM=y +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_MAX3421_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_HCD_PCI is not set +# CONFIG_USB_OHCI_HCD_SSB is not set +CONFIG_USB_OHCI_HCD_PLATFORM=y +# CONFIG_USB_UHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_BCMA is not set +# CONFIG_USB_HCD_SSB is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=y +# CONFIG_USB_PRINTER is not set +CONFIG_USB_WDM=y +# CONFIG_USB_TMC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may +# + +# +# also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_REALTEK=y +CONFIG_REALTEK_AUTOPM=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_ONETOUCH=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_STORAGE_ENE_UB6250=y +CONFIG_USB_UAS=y + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USBIP_CORE is not set + +# +# USB dual-mode controller drivers +# +# CONFIG_USB_CDNS_SUPPORT is not set +# CONFIG_USB_MUSB_HDRC is not set +CONFIG_USB_DWC3=y +# CONFIG_USB_DWC3_HOST is not set +# CONFIG_USB_DWC3_GADGET is not set +CONFIG_USB_DWC3_DUAL_ROLE=y + +# +# Platform Glue Driver Support +# +CONFIG_USB_DWC3_HAPS=y +CONFIG_USB_DWC3_OF_SIMPLE=y +CONFIG_USB_DWC2=y +# CONFIG_USB_DWC2_HOST is not set + +# +# Gadget/Dual-role mode requires USB Gadget support to be enabled +# +# CONFIG_USB_DWC2_PERIPHERAL is not set +CONFIG_USB_DWC2_DUAL_ROLE=y +# CONFIG_USB_DWC2_PCI is not set +# CONFIG_USB_DWC2_DEBUG is not set +# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set +# CONFIG_USB_CHIPIDEA is not set +# CONFIG_USB_ISP1760 is not set + +# +# USB port drivers +# +CONFIG_USB_SERIAL=y +# CONFIG_USB_SERIAL_CONSOLE is not set +CONFIG_USB_SERIAL_GENERIC=y +# CONFIG_USB_SERIAL_SIMPLE is not set +# CONFIG_USB_SERIAL_AIRCABLE is not set +# CONFIG_USB_SERIAL_ARK3116 is not set +# CONFIG_USB_SERIAL_BELKIN is not set +CONFIG_USB_SERIAL_CH341=y +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +CONFIG_USB_SERIAL_CP210X=y +# CONFIG_USB_SERIAL_CYPRESS_M8 is not set +# CONFIG_USB_SERIAL_EMPEG is not set +CONFIG_USB_SERIAL_FTDI_SIO=y +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IPAQ is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_EDGEPORT_TI is not set +# CONFIG_USB_SERIAL_F81232 is not set +# CONFIG_USB_SERIAL_F8153X is not set +# CONFIG_USB_SERIAL_GARMIN is not set +# CONFIG_USB_SERIAL_IPW is not set +# CONFIG_USB_SERIAL_IUU is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +CONFIG_USB_SERIAL_KEYSPAN=y +# CONFIG_USB_SERIAL_KLSI is not set +# CONFIG_USB_SERIAL_KOBIL_SCT is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_METRO is not set +# CONFIG_USB_SERIAL_MOS7720 is not set +# CONFIG_USB_SERIAL_MOS7840 is not set +# CONFIG_USB_SERIAL_MXUPORT is not set +# CONFIG_USB_SERIAL_NAVMAN is not set +CONFIG_USB_SERIAL_PL2303=y +CONFIG_USB_SERIAL_OTI6858=y +# CONFIG_USB_SERIAL_QCAUX is not set +CONFIG_USB_SERIAL_QUALCOMM=y +# CONFIG_USB_SERIAL_SPCP8X5 is not set +# CONFIG_USB_SERIAL_SAFE is not set +CONFIG_USB_SERIAL_SIERRAWIRELESS=y +# CONFIG_USB_SERIAL_SYMBOL is not set +# CONFIG_USB_SERIAL_TI is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +CONFIG_USB_SERIAL_WWAN=y +CONFIG_USB_SERIAL_OPTION=y +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_SERIAL_OPTICON is not set +# CONFIG_USB_SERIAL_XSENS_MT is not set +# CONFIG_USB_SERIAL_WISHBONE is not set +# CONFIG_USB_SERIAL_SSU100 is not set +# CONFIG_USB_SERIAL_QT2 is not set +# CONFIG_USB_SERIAL_UPD78F0730 is not set +# CONFIG_USB_SERIAL_XR is not set +# CONFIG_USB_SERIAL_DEBUG is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 is not set +# CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_APPLEDISPLAY is not set +# CONFIG_APPLE_MFI_FASTCHARGE is not set +# CONFIG_USB_SISUSBVGA is not set +# CONFIG_USB_LD is not set +# CONFIG_USB_TRANCEVIBRATOR is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_YUREX is not set +CONFIG_USB_EZUSB_FX2=y +# CONFIG_USB_HUB_USB251XB is not set +# CONFIG_USB_HSIC_USB3503 is not set +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +# CONFIG_USB_CHAOSKEY is not set +# CONFIG_USB_ONBOARD_HUB is not set + +# +# USB Physical Layer drivers +# +CONFIG_USB_PHY=y +CONFIG_NOP_USB_XCEIV=y +# CONFIG_USB_GPIO_VBUS is not set +# CONFIG_USB_ISP1301 is not set +# CONFIG_USB_ULPI is not set +# end of USB Physical Layer drivers + +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG is not set +CONFIG_USB_GADGET_DEBUG_FILES=y +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 +CONFIG_U_SERIAL_CONSOLE=y + +# +# USB Peripheral Controller +# +# CONFIG_USB_GR_UDC is not set +# CONFIG_USB_R8A66597 is not set +# CONFIG_USB_PXA27X is not set +# CONFIG_USB_MV_UDC is not set +# CONFIG_USB_MV_U3D is not set +# CONFIG_USB_SNP_UDC_PLAT is not set +# CONFIG_USB_M66592 is not set +# CONFIG_USB_BDC_UDC is not set +# CONFIG_USB_AMD5536UDC is not set +# CONFIG_USB_NET2272 is not set +# CONFIG_USB_NET2280 is not set +# CONFIG_USB_GOKU is not set +# CONFIG_USB_EG20T is not set +# CONFIG_USB_GADGET_XILINX is not set +# CONFIG_USB_MAX3420_UDC is not set +# CONFIG_USB_DUMMY_HCD is not set +# end of USB Peripheral Controller + +CONFIG_USB_LIBCOMPOSITE=y +CONFIG_USB_F_ACM=y +CONFIG_USB_U_SERIAL=y +CONFIG_USB_F_SERIAL=m +CONFIG_USB_F_OBEX=m +CONFIG_USB_F_MASS_STORAGE=y +CONFIG_USB_F_FS=y +CONFIG_USB_F_UVC=y +CONFIG_USB_CONFIGFS=y +# CONFIG_USB_CONFIGFS_SERIAL is not set +CONFIG_USB_CONFIGFS_ACM=y +# CONFIG_USB_CONFIGFS_OBEX is not set +# CONFIG_USB_CONFIGFS_NCM is not set +# CONFIG_USB_CONFIGFS_ECM is not set +# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set +# CONFIG_USB_CONFIGFS_RNDIS is not set +# CONFIG_USB_CONFIGFS_EEM is not set +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +# CONFIG_USB_CONFIGFS_F_LB_SS is not set +CONFIG_USB_CONFIGFS_F_FS=y +# CONFIG_USB_CONFIGFS_F_UAC1 is not set +# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set +# CONFIG_USB_CONFIGFS_F_UAC2 is not set +# CONFIG_USB_CONFIGFS_F_MIDI is not set +# CONFIG_USB_CONFIGFS_F_MIDI2 is not set +# CONFIG_USB_CONFIGFS_F_HID is not set +CONFIG_USB_CONFIGFS_F_UVC=y +# CONFIG_USB_CONFIGFS_F_PRINTER is not set + +# +# USB Gadget precomposed configurations +# +# CONFIG_USB_ZERO is not set +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_ETH is not set +# CONFIG_USB_G_NCM is not set +CONFIG_USB_GADGETFS=m +CONFIG_USB_FUNCTIONFS=m +# CONFIG_USB_FUNCTIONFS_ETH is not set +# CONFIG_USB_FUNCTIONFS_RNDIS is not set +CONFIG_USB_FUNCTIONFS_GENERIC=y +CONFIG_USB_MASS_STORAGE=m +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +# CONFIG_USB_CDC_COMPOSITE is not set +# CONFIG_USB_G_ACM_MS is not set +# CONFIG_USB_G_MULTI is not set +# CONFIG_USB_G_HID is not set +# CONFIG_USB_G_DBGP is not set +# CONFIG_USB_G_WEBCAM is not set +# CONFIG_USB_RAW_GADGET is not set +# end of USB Gadget precomposed configurations + +CONFIG_TYPEC=y +CONFIG_TYPEC_TCPM=y +# CONFIG_TYPEC_TCPCI is not set +CONFIG_TYPEC_FUSB302=y +# CONFIG_TYPEC_UCSI is not set +# CONFIG_TYPEC_TPS6598X is not set +# CONFIG_TYPEC_ANX7411 is not set +# CONFIG_TYPEC_RT1719 is not set +# CONFIG_TYPEC_HD3SS3220 is not set +# CONFIG_TYPEC_STUSB160X is not set +# CONFIG_TYPEC_WUSB3801 is not set + +# +# USB Type-C Multiplexer/DeMultiplexer Switch support +# +# CONFIG_TYPEC_MUX_FSA4480 is not set +# CONFIG_TYPEC_MUX_GPIO_SBU is not set +# CONFIG_TYPEC_MUX_PI3USB30532 is not set +# CONFIG_TYPEC_MUX_NB7VPQ904M is not set +# end of USB Type-C Multiplexer/DeMultiplexer Switch support + +# +# USB Type-C Alternate Mode drivers +# +CONFIG_TYPEC_DP_ALTMODE=y +# CONFIG_TYPEC_NVIDIA_ALTMODE is not set +# end of USB Type-C Alternate Mode drivers + +CONFIG_USB_ROLE_SWITCH=y +CONFIG_MMC=y +CONFIG_PWRSEQ_EMMC=y +# CONFIG_PWRSEQ_SD8787 is not set +CONFIG_PWRSEQ_SIMPLE=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +# CONFIG_SDIO_UART is not set +CONFIG_MMC_TEST=y + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_ARMMMCI is not set +CONFIG_MMC_SDHCI=y +# CONFIG_MMC_SDHCI_PCI is not set +CONFIG_MMC_SDHCI_PLTFM=y +# CONFIG_MMC_SDHCI_OF_ARASAN is not set +# CONFIG_MMC_SDHCI_OF_AT91 is not set +# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set +# CONFIG_MMC_SDHCI_CADENCE is not set +# CONFIG_MMC_SDHCI_F_SDH30 is not set +# CONFIG_MMC_SDHCI_MILBEAUT is not set +# CONFIG_MMC_TIFM_SD is not set +# CONFIG_MMC_SPI is not set +# CONFIG_MMC_CB710 is not set +# CONFIG_MMC_VIA_SDMMC is not set +CONFIG_MMC_DW=y +CONFIG_MMC_DW_PLTFM=y +# CONFIG_MMC_DW_BLUEFIELD is not set +# CONFIG_MMC_DW_EXYNOS is not set +# CONFIG_MMC_DW_HI3798CV200 is not set +# CONFIG_MMC_DW_K3 is not set +# CONFIG_MMC_DW_PCI is not set +CONFIG_MMC_DW_ROCKCHIP=y +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MMC_USDHI6ROL0 is not set +# CONFIG_MMC_CQHCI is not set +# CONFIG_MMC_HSQ is not set +# CONFIG_MMC_TOSHIBA_PCI is not set +# CONFIG_MMC_MTK is not set +# CONFIG_MMC_SDHCI_XENON is not set +# CONFIG_MMC_SDHCI_OMAP is not set +# CONFIG_MMC_SDHCI_AM654 is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_MEMSTICK is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +# CONFIG_LEDS_CLASS_FLASH is not set +# CONFIG_LEDS_CLASS_MULTICOLOR is not set +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set + +# +# LED drivers +# +# CONFIG_LEDS_AN30259A is not set +# CONFIG_LEDS_AW200XX is not set +# CONFIG_LEDS_AW2013 is not set +# CONFIG_LEDS_BCM6328 is not set +# CONFIG_LEDS_BCM6358 is not set +# CONFIG_LEDS_CR0014114 is not set +# CONFIG_LEDS_EL15203000 is not set +# CONFIG_LEDS_LM3530 is not set +# CONFIG_LEDS_LM3532 is not set +# CONFIG_LEDS_LM3642 is not set +# CONFIG_LEDS_LM3692X is not set +# CONFIG_LEDS_PCA9532 is not set +CONFIG_LEDS_GPIO=y +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP3952 is not set +# CONFIG_LEDS_LP50XX is not set +# CONFIG_LEDS_LP55XX_COMMON is not set +# CONFIG_LEDS_LP8860 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_PCA963X is not set +# CONFIG_LEDS_PCA995X is not set +# CONFIG_LEDS_DAC124S085 is not set +CONFIG_LEDS_PWM=y +# CONFIG_LEDS_REGULATOR is not set +# CONFIG_LEDS_BD2606MVV is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_TCA6507 is not set +# CONFIG_LEDS_TLC591XX is not set +# CONFIG_LEDS_LM355x is not set +# CONFIG_LEDS_IS31FL319X is not set +CONFIG_LEDS_IS31FL32XX=y + +# +# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) +# +# CONFIG_LEDS_BLINKM is not set +CONFIG_LEDS_SYSCON=y +# CONFIG_LEDS_MLXREG is not set +# CONFIG_LEDS_USER is not set +# CONFIG_LEDS_SPI_BYTE is not set +# CONFIG_LEDS_LM3697 is not set + +# +# Flash and Torch LED drivers +# + +# +# RGB LED drivers +# + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_DISK=y +# CONFIG_LEDS_TRIGGER_MTD is not set +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_CPU=y +# CONFIG_LEDS_TRIGGER_ACTIVITY is not set +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y + +# +# iptables trigger is under Netfilter config (LED target) +# +# CONFIG_LEDS_TRIGGER_TRANSIENT is not set +# CONFIG_LEDS_TRIGGER_CAMERA is not set +# CONFIG_LEDS_TRIGGER_PANIC is not set +# CONFIG_LEDS_TRIGGER_NETDEV is not set +# CONFIG_LEDS_TRIGGER_PATTERN is not set +# CONFIG_LEDS_TRIGGER_AUDIO is not set +# CONFIG_LEDS_TRIGGER_TTY is not set + +# +# Simple LED drivers +# +# CONFIG_ACCESSIBILITY is not set +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_SUPPORT=y +# CONFIG_EDAC is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_SYSTOHC is not set +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +# CONFIG_RTC_INTF_PROC is not set +# CONFIG_RTC_INTF_DEV is not set +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set +# CONFIG_RTC_DRV_ABX80X is not set +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +CONFIG_RTC_DRV_HYM8563=y +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_NCT3018Y is not set +CONFIG_RTC_DRV_RK808=y +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_ISL12026 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF85063 is not set +# CONFIG_RTC_DRV_PCF85363 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_TPS6586X is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8010 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3028 is not set +# CONFIG_RTC_DRV_RV3032 is not set +# CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_SD3078 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1302 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1343 is not set +# CONFIG_RTC_DRV_DS1347 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6916 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RX4581 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_MCP795 is not set +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_PCF2127 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_ZYNQMP is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_PL030 is not set +# CONFIG_RTC_DRV_PL031 is not set +# CONFIG_RTC_DRV_CADENCE is not set +# CONFIG_RTC_DRV_FTRTC010 is not set +# CONFIG_RTC_DRV_R7301 is not set + +# +# HID Sensor RTC drivers +# +# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set +# CONFIG_RTC_DRV_GOLDFISH is not set +CONFIG_DMADEVICES=y +# CONFIG_DMADEVICES_DEBUG is not set + +# +# DMA Devices +# +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +# CONFIG_ALTERA_MSGDMA is not set +# CONFIG_AMBA_PL08X is not set +# CONFIG_BCM_SBA_RAID is not set +# CONFIG_DW_AXI_DMAC is not set +# CONFIG_FSL_EDMA is not set +# CONFIG_FSL_QDMA is not set +# CONFIG_INTEL_IDMA64 is not set +# CONFIG_MV_XOR_V2 is not set +CONFIG_PL330_DMA=y +# CONFIG_PLX_DMA is not set +# CONFIG_XILINX_DMA is not set +# CONFIG_XILINX_XDMA is not set +# CONFIG_XILINX_ZYNQMP_DMA is not set +# CONFIG_XILINX_ZYNQMP_DPDMA is not set +# CONFIG_QCOM_HIDMA_MGMT is not set +# CONFIG_QCOM_HIDMA is not set +# CONFIG_DW_DMAC is not set +# CONFIG_DW_DMAC_PCI is not set +# CONFIG_DW_EDMA is not set +# CONFIG_SF_PDMA is not set + +# +# DMA Clients +# +# CONFIG_ASYNC_TX_DMA is not set +# CONFIG_DMATEST is not set + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_SW_SYNC is not set +CONFIG_UDMABUF=y +# CONFIG_DMABUF_MOVE_NOTIFY is not set +# CONFIG_DMABUF_DEBUG is not set +# CONFIG_DMABUF_SELFTESTS is not set +CONFIG_DMABUF_HEAPS=y +# CONFIG_DMABUF_SYSFS_STATS is not set +CONFIG_DMABUF_HEAPS_SYSTEM=y +# end of DMABUF options + +# CONFIG_UIO is not set +# CONFIG_VFIO is not set +# CONFIG_VIRT_DRIVERS is not set +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VDPA is not set +# CONFIG_VHOST_MENU is not set + +# +# Microsoft Hyper-V guest support +# +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set +CONFIG_STAGING=y +# CONFIG_PRISM2_USB is not set +# CONFIG_RTL8192U is not set +# CONFIG_RTLLIB is not set +CONFIG_RTL8723BS=m +CONFIG_R8712U=m +# CONFIG_RTS5208 is not set +# CONFIG_VT6655 is not set +# CONFIG_VT6656 is not set + +# +# IIO staging drivers +# + +# +# Accelerometers +# +# CONFIG_ADIS16203 is not set +# CONFIG_ADIS16240 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD7816 is not set +# end of Analog to digital converters + +# +# Analog digital bi-direction converters +# +# CONFIG_ADT7316 is not set +# end of Analog digital bi-direction converters + +# +# Direct Digital Synthesis +# +# CONFIG_AD9832 is not set +# CONFIG_AD9834 is not set +# end of Direct Digital Synthesis + +# +# Network Analyzer, Impedance Converters +# +# CONFIG_AD5933 is not set +# end of Network Analyzer, Impedance Converters + +# +# Resolver to digital converters +# +# CONFIG_AD2S1210 is not set +# end of Resolver to digital converters +# end of IIO staging drivers + +# CONFIG_FB_SM750 is not set +CONFIG_STAGING_MEDIA=y +# CONFIG_DVB_AV7110 is not set +# CONFIG_VIDEO_MAX96712 is not set +CONFIG_VIDEO_ROCKCHIP_VDEC=y +# CONFIG_STAGING_MEDIA_DEPRECATED is not set +# CONFIG_STAGING_BOARD is not set +# CONFIG_LTE_GDM724X is not set +# CONFIG_FB_TFT is not set +# CONFIG_KS7010 is not set +# CONFIG_PI433 is not set +# CONFIG_XIL_AXIS_FIFO is not set +# CONFIG_FIELDBUS_DEV is not set +# CONFIG_QLGE is not set +# CONFIG_VME_BUS is not set +# CONFIG_GOLDFISH is not set +CONFIG_CHROME_PLATFORMS=y +# CONFIG_CROS_EC is not set +# CONFIG_CROS_HPS_I2C is not set +# CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_HAVE_CLK=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y + +# +# Clock driver for ARM Reference designs +# +# CONFIG_CLK_ICST is not set +# CONFIG_CLK_SP810 is not set +# end of Clock driver for ARM Reference designs + +# CONFIG_LMK04832 is not set +# CONFIG_COMMON_CLK_MAX9485 is not set +CONFIG_COMMON_CLK_RK808=y +CONFIG_COMMON_CLK_SCMI=y +CONFIG_COMMON_CLK_SCPI=y +# CONFIG_COMMON_CLK_SI5341 is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI514 is not set +# CONFIG_COMMON_CLK_SI544 is not set +# CONFIG_COMMON_CLK_SI570 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CDCE925 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_COMMON_CLK_AXI_CLKGEN is not set +CONFIG_COMMON_CLK_XGENE=y +CONFIG_COMMON_CLK_PWM=y +# CONFIG_COMMON_CLK_RS9_PCIE is not set +# CONFIG_COMMON_CLK_SI521XX is not set +# CONFIG_COMMON_CLK_VC3 is not set +# CONFIG_COMMON_CLK_VC5 is not set +# CONFIG_COMMON_CLK_VC7 is not set +CONFIG_COMMON_CLK_FIXED_MMIO=y +CONFIG_COMMON_CLK_ROCKCHIP=y +CONFIG_CLK_PX30=y +# CONFIG_CLK_RK3308 is not set +# CONFIG_CLK_RK3328 is not set +# CONFIG_CLK_RK3368 is not set +# CONFIG_CLK_RK3399 is not set +CONFIG_CLK_RK3568=y +CONFIG_CLK_RK3588=y +# CONFIG_XILINX_VCU is not set +# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_CLKSRC_MMIO=y +CONFIG_ROCKCHIP_TIMER=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +# CONFIG_FSL_ERRATUM_A008585 is not set +# CONFIG_HISILICON_ERRATUM_161010101 is not set +# CONFIG_ARM64_ERRATUM_858921 is not set +# end of Clock Source drivers + +CONFIG_MAILBOX=y +CONFIG_ARM_MHU=y +# CONFIG_ARM_MHU_V2 is not set +CONFIG_PLATFORM_MHU=y +# CONFIG_PL320_MBOX is not set +CONFIG_ROCKCHIP_MBOX=y +# CONFIG_ALTERA_MBOX is not set +# CONFIG_MAILBOX_TEST is not set +CONFIG_IOMMU_IOVA=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +CONFIG_IOMMU_IO_PGTABLE=y +CONFIG_IOMMU_IO_PGTABLE_LPAE=y +# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set +# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set +# CONFIG_IOMMU_IO_PGTABLE_DART is not set +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEBUGFS is not set +CONFIG_IOMMU_DEFAULT_DMA_STRICT=y +# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_OF_IOMMU=y +CONFIG_IOMMU_DMA=y +# CONFIG_IOMMUFD is not set +CONFIG_ROCKCHIP_IOMMU=y +CONFIG_ARM_SMMU=y +# CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set +CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y +CONFIG_ARM_SMMU_V3=y +# CONFIG_ARM_SMMU_V3_SVA is not set + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_QCOM_GLINK_RPM is not set +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Broadcom SoC drivers +# +# CONFIG_SOC_BRCMSTB is not set +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# CONFIG_QUICC_ENGINE is not set +# CONFIG_FSL_RCPM is not set +# end of NXP/Freescale QorIQ SoC drivers + +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Enable LiteX SoC Builder specific drivers +# +# CONFIG_LITEX_SOC_CONTROLLER is not set +# end of Enable LiteX SoC Builder specific drivers + +# CONFIG_WPCM450_SOC is not set + +# +# Qualcomm SoC drivers +# +# end of Qualcomm SoC drivers + +CONFIG_ROCKCHIP_GRF=y +CONFIG_ROCKCHIP_IODOMAIN=y +CONFIG_ROCKCHIP_PM_DOMAINS=y +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +CONFIG_PM_DEVFREQ=y + +# +# DEVFREQ Governors +# +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +# CONFIG_DEVFREQ_GOV_USERSPACE is not set +# CONFIG_DEVFREQ_GOV_PASSIVE is not set + +# +# DEVFREQ Drivers +# +CONFIG_ARM_RK3399_DMC_DEVFREQ=y +CONFIG_PM_DEVFREQ_EVENT=y +CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y +CONFIG_EXTCON=y + +# +# Extcon Device Drivers +# +# CONFIG_EXTCON_ADC_JACK is not set +# CONFIG_EXTCON_FSA9480 is not set +# CONFIG_EXTCON_GPIO is not set +# CONFIG_EXTCON_MAX3355 is not set +# CONFIG_EXTCON_PTN5150 is not set +# CONFIG_EXTCON_RT8973A is not set +# CONFIG_EXTCON_SM5502 is not set +# CONFIG_EXTCON_USB_GPIO is not set +# CONFIG_EXTCON_USBC_TUSB320 is not set +CONFIG_MEMORY=y +# CONFIG_ARM_PL172_MPMC is not set +CONFIG_IIO=y +CONFIG_IIO_BUFFER=y +CONFIG_IIO_BUFFER_CB=y +# CONFIG_IIO_BUFFER_DMA is not set +# CONFIG_IIO_BUFFER_DMAENGINE is not set +CONFIG_IIO_BUFFER_HW_CONSUMER=y +CONFIG_IIO_KFIFO_BUF=y +CONFIG_IIO_TRIGGERED_BUFFER=y +CONFIG_IIO_CONFIGFS=y +CONFIG_IIO_TRIGGER=y +CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 +CONFIG_IIO_SW_DEVICE=y +CONFIG_IIO_SW_TRIGGER=y +CONFIG_IIO_TRIGGERED_EVENT=y + +# +# Accelerometers +# +# CONFIG_ADIS16201 is not set +# CONFIG_ADIS16209 is not set +# CONFIG_ADXL313_I2C is not set +# CONFIG_ADXL313_SPI is not set +# CONFIG_ADXL345_I2C is not set +# CONFIG_ADXL345_SPI is not set +# CONFIG_ADXL355_I2C is not set +# CONFIG_ADXL355_SPI is not set +# CONFIG_ADXL367_SPI is not set +# CONFIG_ADXL367_I2C is not set +# CONFIG_ADXL372_SPI is not set +# CONFIG_ADXL372_I2C is not set +# CONFIG_BMA180 is not set +# CONFIG_BMA220 is not set +# CONFIG_BMA400 is not set +# CONFIG_BMC150_ACCEL is not set +# CONFIG_BMI088_ACCEL is not set +# CONFIG_DA280 is not set +# CONFIG_DA311 is not set +# CONFIG_DMARD06 is not set +# CONFIG_DMARD09 is not set +# CONFIG_DMARD10 is not set +# CONFIG_FXLS8962AF_I2C is not set +# CONFIG_FXLS8962AF_SPI is not set +# CONFIG_HID_SENSOR_ACCEL_3D is not set +# CONFIG_IIO_ST_ACCEL_3AXIS is not set +# CONFIG_IIO_KX022A_SPI is not set +# CONFIG_IIO_KX022A_I2C is not set +# CONFIG_KXSD9 is not set +# CONFIG_KXCJK1013 is not set +# CONFIG_MC3230 is not set +# CONFIG_MMA7455_I2C is not set +# CONFIG_MMA7455_SPI is not set +# CONFIG_MMA7660 is not set +# CONFIG_MMA8452 is not set +# CONFIG_MMA9551 is not set +# CONFIG_MMA9553 is not set +# CONFIG_MSA311 is not set +# CONFIG_MXC4005 is not set +# CONFIG_MXC6255 is not set +# CONFIG_SCA3000 is not set +# CONFIG_SCA3300 is not set +# CONFIG_STK8312 is not set +# CONFIG_STK8BA50 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD4130 is not set +# CONFIG_AD7091R5 is not set +# CONFIG_AD7124 is not set +# CONFIG_AD7192 is not set +# CONFIG_AD7266 is not set +# CONFIG_AD7280 is not set +# CONFIG_AD7291 is not set +# CONFIG_AD7292 is not set +# CONFIG_AD7298 is not set +# CONFIG_AD7476 is not set +# CONFIG_AD7606_IFACE_PARALLEL is not set +# CONFIG_AD7606_IFACE_SPI is not set +# CONFIG_AD7766 is not set +# CONFIG_AD7768_1 is not set +# CONFIG_AD7780 is not set +# CONFIG_AD7791 is not set +# CONFIG_AD7793 is not set +# CONFIG_AD7887 is not set +# CONFIG_AD7923 is not set +# CONFIG_AD7949 is not set +# CONFIG_AD799X is not set +# CONFIG_ADI_AXI_ADC is not set +# CONFIG_CC10001_ADC is not set +# CONFIG_ENVELOPE_DETECTOR is not set +# CONFIG_HI8435 is not set +# CONFIG_HX711 is not set +# CONFIG_INA2XX_ADC is not set +# CONFIG_LTC2471 is not set +# CONFIG_LTC2485 is not set +# CONFIG_LTC2496 is not set +# CONFIG_LTC2497 is not set +# CONFIG_MAX1027 is not set +# CONFIG_MAX11100 is not set +# CONFIG_MAX1118 is not set +# CONFIG_MAX11205 is not set +# CONFIG_MAX11410 is not set +# CONFIG_MAX1241 is not set +# CONFIG_MAX1363 is not set +# CONFIG_MAX9611 is not set +# CONFIG_MCP320X is not set +# CONFIG_MCP3422 is not set +# CONFIG_MCP3911 is not set +# CONFIG_NAU7802 is not set +CONFIG_ROCKCHIP_SARADC=y +# CONFIG_RICHTEK_RTQ6056 is not set +# CONFIG_SD_ADC_MODULATOR is not set +# CONFIG_TI_ADC081C is not set +# CONFIG_TI_ADC0832 is not set +# CONFIG_TI_ADC084S021 is not set +# CONFIG_TI_ADC12138 is not set +# CONFIG_TI_ADC108S102 is not set +# CONFIG_TI_ADC128S052 is not set +# CONFIG_TI_ADC161S626 is not set +# CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS7924 is not set +# CONFIG_TI_ADS1100 is not set +# CONFIG_TI_ADS7950 is not set +# CONFIG_TI_ADS8344 is not set +# CONFIG_TI_ADS8688 is not set +# CONFIG_TI_ADS124S08 is not set +# CONFIG_TI_ADS131E08 is not set +# CONFIG_TI_LMP92064 is not set +# CONFIG_TI_TLC4541 is not set +# CONFIG_TI_TSC2046 is not set +# CONFIG_VF610_ADC is not set +# CONFIG_XILINX_XADC is not set +# end of Analog to digital converters + +# +# Analog to digital and digital to analog converters +# +# CONFIG_AD74115 is not set +# CONFIG_AD74413R is not set +# end of Analog to digital and digital to analog converters + +# +# Analog Front Ends +# +# CONFIG_IIO_RESCALE is not set +# end of Analog Front Ends + +# +# Amplifiers +# +# CONFIG_AD8366 is not set +# CONFIG_ADA4250 is not set +# CONFIG_HMC425 is not set +# end of Amplifiers + +# +# Capacitance to digital converters +# +# CONFIG_AD7150 is not set +# CONFIG_AD7746 is not set +# end of Capacitance to digital converters + +# +# Chemical Sensors +# +# CONFIG_ATLAS_PH_SENSOR is not set +# CONFIG_ATLAS_EZO_SENSOR is not set +# CONFIG_BME680 is not set +# CONFIG_CCS811 is not set +# CONFIG_IAQCORE is not set +# CONFIG_PMS7003 is not set +# CONFIG_SCD30_CORE is not set +# CONFIG_SCD4X is not set +# CONFIG_SENSIRION_SGP30 is not set +# CONFIG_SENSIRION_SGP40 is not set +# CONFIG_SPS30_I2C is not set +# CONFIG_SPS30_SERIAL is not set +# CONFIG_SENSEAIR_SUNRISE_CO2 is not set +# CONFIG_VZ89X is not set +# end of Chemical Sensors + +# +# Hid Sensor IIO Common +# +# CONFIG_HID_SENSOR_IIO_COMMON is not set +# end of Hid Sensor IIO Common + +# +# IIO SCMI Sensors +# +# CONFIG_IIO_SCMI is not set +# end of IIO SCMI Sensors + +# +# SSP Sensor Common +# +# CONFIG_IIO_SSP_SENSORHUB is not set +# end of SSP Sensor Common + +# +# Digital to analog converters +# +# CONFIG_AD3552R is not set +# CONFIG_AD5064 is not set +# CONFIG_AD5360 is not set +# CONFIG_AD5380 is not set +# CONFIG_AD5421 is not set +# CONFIG_AD5446 is not set +# CONFIG_AD5449 is not set +# CONFIG_AD5592R is not set +# CONFIG_AD5593R is not set +# CONFIG_AD5504 is not set +# CONFIG_AD5624R_SPI is not set +# CONFIG_LTC2688 is not set +# CONFIG_AD5686_SPI is not set +# CONFIG_AD5696_I2C is not set +# CONFIG_AD5755 is not set +# CONFIG_AD5758 is not set +# CONFIG_AD5761 is not set +# CONFIG_AD5764 is not set +# CONFIG_AD5766 is not set +# CONFIG_AD5770R is not set +# CONFIG_AD5791 is not set +# CONFIG_AD7293 is not set +# CONFIG_AD7303 is not set +# CONFIG_AD8801 is not set +# CONFIG_DPOT_DAC is not set +# CONFIG_DS4424 is not set +# CONFIG_LTC1660 is not set +# CONFIG_LTC2632 is not set +# CONFIG_M62332 is not set +# CONFIG_MAX517 is not set +# CONFIG_MAX5522 is not set +# CONFIG_MAX5821 is not set +# CONFIG_MCP4725 is not set +# CONFIG_MCP4728 is not set +# CONFIG_MCP4922 is not set +# CONFIG_TI_DAC082S085 is not set +# CONFIG_TI_DAC5571 is not set +# CONFIG_TI_DAC7311 is not set +# CONFIG_TI_DAC7612 is not set +# CONFIG_VF610_DAC is not set +# end of Digital to analog converters + +# +# IIO dummy driver +# +# CONFIG_IIO_SIMPLE_DUMMY is not set +# end of IIO dummy driver + +# +# Filters +# +# CONFIG_ADMV8818 is not set +# end of Filters + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +# CONFIG_AD9523 is not set +# end of Clock Generator/Distribution + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +# CONFIG_ADF4350 is not set +# CONFIG_ADF4371 is not set +# CONFIG_ADF4377 is not set +# CONFIG_ADMV1013 is not set +# CONFIG_ADMV1014 is not set +# CONFIG_ADMV4420 is not set +# CONFIG_ADRF6780 is not set +# end of Phase-Locked Loop (PLL) frequency synthesizers +# end of Frequency Synthesizers DDS/PLL + +# +# Digital gyroscope sensors +# +# CONFIG_ADIS16080 is not set +# CONFIG_ADIS16130 is not set +# CONFIG_ADIS16136 is not set +# CONFIG_ADIS16260 is not set +# CONFIG_ADXRS290 is not set +# CONFIG_ADXRS450 is not set +# CONFIG_BMG160 is not set +# CONFIG_FXAS21002C is not set +# CONFIG_HID_SENSOR_GYRO_3D is not set +# CONFIG_MPU3050_I2C is not set +# CONFIG_IIO_ST_GYRO_3AXIS is not set +# CONFIG_ITG3200 is not set +# end of Digital gyroscope sensors + +# +# Health Sensors +# + +# +# Heart Rate Monitors +# +# CONFIG_AFE4403 is not set +# CONFIG_AFE4404 is not set +# CONFIG_MAX30100 is not set +# CONFIG_MAX30102 is not set +# end of Heart Rate Monitors +# end of Health Sensors + +# +# Humidity sensors +# +# CONFIG_AM2315 is not set +# CONFIG_DHT11 is not set +# CONFIG_HDC100X is not set +# CONFIG_HDC2010 is not set +# CONFIG_HID_SENSOR_HUMIDITY is not set +# CONFIG_HTS221 is not set +# CONFIG_HTU21 is not set +# CONFIG_SI7005 is not set +# CONFIG_SI7020 is not set +# end of Humidity sensors + +# +# Inertial measurement units +# +# CONFIG_ADIS16400 is not set +# CONFIG_ADIS16460 is not set +# CONFIG_ADIS16475 is not set +# CONFIG_ADIS16480 is not set +# CONFIG_BMI160_I2C is not set +# CONFIG_BMI160_SPI is not set +# CONFIG_BOSCH_BNO055_SERIAL is not set +# CONFIG_BOSCH_BNO055_I2C is not set +# CONFIG_FXOS8700_I2C is not set +# CONFIG_FXOS8700_SPI is not set +# CONFIG_KMX61 is not set +# CONFIG_INV_ICM42600_I2C is not set +# CONFIG_INV_ICM42600_SPI is not set +# CONFIG_INV_MPU6050_I2C is not set +# CONFIG_INV_MPU6050_SPI is not set +# CONFIG_IIO_ST_LSM6DSX is not set +# CONFIG_IIO_ST_LSM9DS0 is not set +# end of Inertial measurement units + +# +# Light sensors +# +# CONFIG_ADJD_S311 is not set +# CONFIG_ADUX1020 is not set +# CONFIG_AL3010 is not set +# CONFIG_AL3320A is not set +# CONFIG_APDS9300 is not set +# CONFIG_APDS9960 is not set +# CONFIG_AS73211 is not set +# CONFIG_BH1750 is not set +# CONFIG_BH1780 is not set +# CONFIG_CM32181 is not set +# CONFIG_CM3232 is not set +# CONFIG_CM3323 is not set +# CONFIG_CM3605 is not set +# CONFIG_CM36651 is not set +# CONFIG_GP2AP002 is not set +# CONFIG_GP2AP020A00F is not set +CONFIG_SENSORS_ISL29018=y +# CONFIG_SENSORS_ISL29028 is not set +# CONFIG_ISL29125 is not set +# CONFIG_HID_SENSOR_ALS is not set +# CONFIG_HID_SENSOR_PROX is not set +# CONFIG_JSA1212 is not set +# CONFIG_ROHM_BU27008 is not set +# CONFIG_ROHM_BU27034 is not set +# CONFIG_RPR0521 is not set +# CONFIG_LTR501 is not set +# CONFIG_LTRF216A is not set +# CONFIG_LV0104CS is not set +# CONFIG_MAX44000 is not set +# CONFIG_MAX44009 is not set +# CONFIG_NOA1305 is not set +# CONFIG_OPT3001 is not set +# CONFIG_OPT4001 is not set +# CONFIG_PA12203001 is not set +# CONFIG_SI1133 is not set +# CONFIG_SI1145 is not set +# CONFIG_STK3310 is not set +# CONFIG_ST_UVIS25 is not set +# CONFIG_TCS3414 is not set +# CONFIG_TCS3472 is not set +CONFIG_SENSORS_TSL2563=y +CONFIG_TSL2583=y +# CONFIG_TSL2591 is not set +# CONFIG_TSL2772 is not set +# CONFIG_TSL4531 is not set +# CONFIG_US5182D is not set +# CONFIG_VCNL4000 is not set +# CONFIG_VCNL4035 is not set +# CONFIG_VEML6030 is not set +# CONFIG_VEML6070 is not set +# CONFIG_VL6180 is not set +# CONFIG_ZOPT2201 is not set +# end of Light sensors + +# +# Magnetometer sensors +# +# CONFIG_AK8974 is not set +# CONFIG_AK8975 is not set +# CONFIG_AK09911 is not set +# CONFIG_BMC150_MAGN_I2C is not set +# CONFIG_BMC150_MAGN_SPI is not set +# CONFIG_MAG3110 is not set +# CONFIG_HID_SENSOR_MAGNETOMETER_3D is not set +# CONFIG_MMC35240 is not set +# CONFIG_IIO_ST_MAGN_3AXIS is not set +# CONFIG_SENSORS_HMC5843_I2C is not set +# CONFIG_SENSORS_HMC5843_SPI is not set +# CONFIG_SENSORS_RM3100_I2C is not set +# CONFIG_SENSORS_RM3100_SPI is not set +# CONFIG_TI_TMAG5273 is not set +# CONFIG_YAMAHA_YAS530 is not set +# end of Magnetometer sensors + +# +# Multiplexers +# +CONFIG_IIO_MUX=y +# end of Multiplexers + +# +# Inclinometer sensors +# +# CONFIG_HID_SENSOR_INCLINOMETER_3D is not set +# CONFIG_HID_SENSOR_DEVICE_ROTATION is not set +# end of Inclinometer sensors + +# +# Triggers - standalone +# +CONFIG_IIO_HRTIMER_TRIGGER=y +# CONFIG_IIO_INTERRUPT_TRIGGER is not set +# CONFIG_IIO_TIGHTLOOP_TRIGGER is not set +CONFIG_IIO_SYSFS_TRIGGER=y +# end of Triggers - standalone + +# +# Linear and angular position sensors +# +# CONFIG_HID_SENSOR_CUSTOM_INTEL_HINGE is not set +# end of Linear and angular position sensors + +# +# Digital potentiometers +# +# CONFIG_AD5110 is not set +# CONFIG_AD5272 is not set +# CONFIG_DS1803 is not set +# CONFIG_MAX5432 is not set +# CONFIG_MAX5481 is not set +# CONFIG_MAX5487 is not set +# CONFIG_MCP4018 is not set +# CONFIG_MCP4131 is not set +# CONFIG_MCP4531 is not set +# CONFIG_MCP41010 is not set +# CONFIG_TPL0102 is not set +# CONFIG_X9250 is not set +# end of Digital potentiometers + +# +# Digital potentiostats +# +# CONFIG_LMP91000 is not set +# end of Digital potentiostats + +# +# Pressure sensors +# +# CONFIG_ABP060MG is not set +# CONFIG_BMP280 is not set +# CONFIG_DLHL60D is not set +# CONFIG_DPS310 is not set +# CONFIG_HID_SENSOR_PRESS is not set +# CONFIG_HP03 is not set +# CONFIG_ICP10100 is not set +# CONFIG_MPL115_I2C is not set +# CONFIG_MPL115_SPI is not set +# CONFIG_MPL3115 is not set +# CONFIG_MPRLS0025PA is not set +# CONFIG_MS5611 is not set +# CONFIG_MS5637 is not set +# CONFIG_IIO_ST_PRESS is not set +# CONFIG_T5403 is not set +# CONFIG_HP206C is not set +# CONFIG_ZPA2326 is not set +# end of Pressure sensors + +# +# Lightning sensors +# +# CONFIG_AS3935 is not set +# end of Lightning sensors + +# +# Proximity and distance sensors +# +# CONFIG_IRSD200 is not set +# CONFIG_ISL29501 is not set +# CONFIG_LIDAR_LITE_V2 is not set +# CONFIG_MB1232 is not set +# CONFIG_PING is not set +# CONFIG_RFD77402 is not set +# CONFIG_SRF04 is not set +# CONFIG_SX9310 is not set +# CONFIG_SX9324 is not set +# CONFIG_SX9360 is not set +# CONFIG_SX9500 is not set +# CONFIG_SRF08 is not set +# CONFIG_VCNL3020 is not set +# CONFIG_VL53L0X_I2C is not set +# end of Proximity and distance sensors + +# +# Resolver to digital converters +# +# CONFIG_AD2S90 is not set +# CONFIG_AD2S1200 is not set +# end of Resolver to digital converters + +# +# Temperature sensors +# +# CONFIG_LTC2983 is not set +# CONFIG_MAXIM_THERMOCOUPLE is not set +# CONFIG_HID_SENSOR_TEMP is not set +# CONFIG_MLX90614 is not set +# CONFIG_MLX90632 is not set +# CONFIG_TMP006 is not set +# CONFIG_TMP007 is not set +# CONFIG_TMP117 is not set +# CONFIG_TSYS01 is not set +# CONFIG_TSYS02D is not set +# CONFIG_MAX30208 is not set +# CONFIG_MAX31856 is not set +# CONFIG_MAX31865 is not set +# end of Temperature sensors + +# CONFIG_NTB is not set +CONFIG_PWM=y +CONFIG_PWM_SYSFS=y +# CONFIG_PWM_DEBUG is not set +# CONFIG_PWM_ATMEL_TCB is not set +# CONFIG_PWM_CLK is not set +# CONFIG_PWM_DWC is not set +# CONFIG_PWM_FSL_FTM is not set +# CONFIG_PWM_PCA9685 is not set +CONFIG_PWM_ROCKCHIP=y +# CONFIG_PWM_XILINX is not set + +# +# IRQ chip support +# +CONFIG_IRQCHIP=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_MAX_NR=1 +CONFIG_ARM_GIC_V2M=y +CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_V3_ITS=y +CONFIG_ARM_GIC_V3_ITS_PCI=y +# CONFIG_AL_FIC is not set +# CONFIG_XILINX_INTC is not set +CONFIG_PARTITION_PERCPU=y +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +CONFIG_ARCH_HAS_RESET_CONTROLLER=y +CONFIG_RESET_CONTROLLER=y +CONFIG_RESET_SCMI=y +# CONFIG_RESET_SIMPLE is not set +# CONFIG_RESET_TI_SYSCON is not set +# CONFIG_RESET_TI_TPS380X is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PHY_MIPI_DPHY=y +# CONFIG_PHY_CAN_TRANSCEIVER is not set + +# +# PHY drivers for Broadcom platforms +# +# CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + +# CONFIG_PHY_CADENCE_TORRENT is not set +# CONFIG_PHY_CADENCE_DPHY is not set +# CONFIG_PHY_CADENCE_DPHY_RX is not set +# CONFIG_PHY_CADENCE_SIERRA is not set +# CONFIG_PHY_CADENCE_SALVO is not set +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_LAN966X_SERDES is not set +# CONFIG_PHY_CPCAP_USB is not set +# CONFIG_PHY_MAPPHONE_MDM6600 is not set +# CONFIG_PHY_OCELOT_SERDES is not set +# CONFIG_PHY_RTK_RTD_USB2PHY is not set +# CONFIG_PHY_RTK_RTD_USB3PHY is not set +CONFIG_PHY_ROCKCHIP_DP=y +CONFIG_PHY_ROCKCHIP_DPHY_RX0=y +CONFIG_PHY_ROCKCHIP_EMMC=y +CONFIG_PHY_ROCKCHIP_INNO_HDMI=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y +CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y +CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y +CONFIG_PHY_ROCKCHIP_PCIE=y +CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y +CONFIG_PHY_ROCKCHIP_TYPEC=y +CONFIG_PHY_ROCKCHIP_USB=y +# CONFIG_PHY_SAMSUNG_USB2 is not set +# end of PHY Subsystem + +# CONFIG_POWERCAP is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +# CONFIG_ARM_CCI_PMU is not set +# CONFIG_ARM_CCN is not set +# CONFIG_ARM_CMN is not set +CONFIG_ARM_PMU=y +CONFIG_ARM_SMMU_V3_PMU=y +CONFIG_ARM_PMUV3=y +# CONFIG_ARM_DSU_PMU is not set +# CONFIG_ARM_SPE_PMU is not set +# CONFIG_HISI_PCIE_PMU is not set +# CONFIG_HNS3_PMU is not set +# CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU is not set +# end of Performance monitor support + +CONFIG_RAS=y +# CONFIG_USB4 is not set + +# +# Android +# +# CONFIG_ANDROID_BINDER_IPC is not set +# end of Android + +# CONFIG_LIBNVDIMM is not set +# CONFIG_DAX is not set +CONFIG_NVMEM=y +CONFIG_NVMEM_SYSFS=y + +# +# Layout Types +# +# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set +# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set +# end of Layout Types + +# CONFIG_NVMEM_RMEM is not set +# CONFIG_NVMEM_ROCKCHIP_EFUSE is not set +# CONFIG_NVMEM_ROCKCHIP_OTP is not set +# CONFIG_NVMEM_U_BOOT_ENV is not set + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# CONFIG_HISI_PTT is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_FSI is not set +# CONFIG_TEE is not set +CONFIG_MULTIPLEXER=y + +# +# Multiplexer drivers +# +# CONFIG_MUX_ADG792A is not set +# CONFIG_MUX_ADGS1408 is not set +CONFIG_MUX_GPIO=y +CONFIG_MUX_MMIO=y +# end of Multiplexer drivers + +CONFIG_PM_OPP=y +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set +# CONFIG_COUNTER is not set +# CONFIG_MOST is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set +# CONFIG_CDX_BUS is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +# CONFIG_VALIDATE_FS_PARSER is not set +CONFIG_FS_IOMAP=y +CONFIG_BUFFER_HEAD=y +CONFIG_LEGACY_DIRECT_IO=y +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +CONFIG_EXT4_FS=y +# CONFIG_EXT4_USE_FOR_EXT2 is not set +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_XFS_FS=y +CONFIG_XFS_SUPPORT_V4=y +CONFIG_XFS_SUPPORT_ASCII_CI=y +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_XFS_RT is not set +# CONFIG_XFS_ONLINE_SCRUB is not set +# CONFIG_XFS_WARN is not set +# CONFIG_XFS_DEBUG is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +# CONFIG_BTRFS_FS is not set +# CONFIG_NILFS2_FS is not set +# CONFIG_F2FS_FS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +# CONFIG_EXPORTFS_BLOCK_OPS is not set +CONFIG_FILE_LOCKING=y +# CONFIG_FS_ENCRYPTION is not set +# CONFIG_FS_VERITY is not set +CONFIG_FSNOTIFY=y +# CONFIG_DNOTIFY is not set +CONFIG_INOTIFY_USER=y +# CONFIG_FANOTIFY is not set +# CONFIG_QUOTA is not set +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=y +# CONFIG_CUSE is not set +# CONFIG_VIRTIO_FS is not set +CONFIG_OVERLAY_FS=y +# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +# CONFIG_OVERLAY_FS_INDEX is not set +# CONFIG_OVERLAY_FS_XINO_AUTO is not set +# CONFIG_OVERLAY_FS_METACOPY is not set +# CONFIG_OVERLAY_FS_DEBUG is not set + +# +# Caches +# +CONFIG_NETFS_SUPPORT=y +# CONFIG_NETFS_STATS is not set +CONFIG_FSCACHE=y +# CONFIG_FSCACHE_STATS is not set +# CONFIG_FSCACHE_DEBUG is not set +# CONFIG_CACHEFILES is not set +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +# CONFIG_UDF_FS is not set +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +# CONFIG_FAT_DEFAULT_UTF8 is not set +CONFIG_EXFAT_FS=y +CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS3_FS is not set +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +# CONFIG_PROC_KCORE is not set +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +# CONFIG_PROC_CHILDREN is not set +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS_QUOTA is not set +CONFIG_ARCH_SUPPORTS_HUGETLBFS=y +# CONFIG_HUGETLBFS is not set +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +CONFIG_CONFIGFS_FS=y +# end of Pseudo filesystems + +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ORANGEFS_FS is not set +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_ECRYPT_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS2_FS is not set +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_FILE_CACHE=y +# CONFIG_SQUASHFS_FILE_DIRECT is not set +CONFIG_SQUASHFS_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT is not set +CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI is not set +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU is not set +# CONFIG_SQUASHFS_XATTR is not set +CONFIG_SQUASHFS_ZLIB=y +CONFIG_SQUASHFS_LZ4=y +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_ZSTD=y +# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_PSTORE=y +CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 +CONFIG_PSTORE_COMPRESS=y +# CONFIG_PSTORE_CONSOLE is not set +# CONFIG_PSTORE_PMSG is not set +# CONFIG_PSTORE_RAM is not set +# CONFIG_PSTORE_BLK is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +# CONFIG_EROFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +# CONFIG_NFS_FS is not set +# CONFIG_NFSD is not set +# CONFIG_CEPH_FS is not set +# CONFIG_CIFS is not set +# CONFIG_SMB_SERVER is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf-8" +CONFIG_NLS_CODEPAGE_437=y +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1250 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_MAC_ROMAN is not set +# CONFIG_NLS_MAC_CELTIC is not set +# CONFIG_NLS_MAC_CENTEURO is not set +# CONFIG_NLS_MAC_CROATIAN is not set +# CONFIG_NLS_MAC_CYRILLIC is not set +# CONFIG_NLS_MAC_GAELIC is not set +# CONFIG_NLS_MAC_GREEK is not set +# CONFIG_NLS_MAC_ICELAND is not set +# CONFIG_NLS_MAC_INUIT is not set +# CONFIG_NLS_MAC_ROMANIAN is not set +# CONFIG_NLS_MAC_TURKISH is not set +CONFIG_NLS_UTF8=y +# CONFIG_DLM is not set +# CONFIG_UNICODE is not set +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +CONFIG_KEYS=y +# CONFIG_KEYS_REQUEST_CACHE is not set +# CONFIG_PERSISTENT_KEYRINGS is not set +# CONFIG_BIG_KEYS is not set +# CONFIG_TRUSTED_KEYS is not set +# CONFIG_ENCRYPTED_KEYS is not set +# CONFIG_KEY_DH_OPERATIONS is not set +# CONFIG_KEY_NOTIFICATIONS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_SECURITY=y +CONFIG_SECURITYFS=y +CONFIG_SECURITY_NETWORK=y +# CONFIG_SECURITY_NETWORK_XFRM is not set +# CONFIG_SECURITY_PATH is not set +CONFIG_HARDENED_USERCOPY=y +# CONFIG_FORTIFY_SOURCE is not set +CONFIG_STATIC_USERMODEHELPER=y +CONFIG_STATIC_USERMODEHELPER_PATH="/sbin/usermode-helper" +# CONFIG_SECURITY_SMACK is not set +# CONFIG_SECURITY_TOMOYO is not set +# CONFIG_SECURITY_APPARMOR is not set +# CONFIG_SECURITY_LOADPIN is not set +# CONFIG_SECURITY_YAMA is not set +# CONFIG_SECURITY_SAFESETID is not set +# CONFIG_SECURITY_LOCKDOWN_LSM is not set +# CONFIG_SECURITY_LANDLOCK is not set +CONFIG_INTEGRITY=y +# CONFIG_INTEGRITY_SIGNATURE is not set +# CONFIG_IMA is not set +# CONFIG_EVM is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="selinux,integrity" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y +CONFIG_INIT_STACK_NONE=y +# CONFIG_INIT_STACK_ALL_PATTERN is not set +# CONFIG_INIT_STACK_ALL_ZERO is not set +# CONFIG_GCC_PLUGIN_STACKLEAK is not set +CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +CONFIG_INIT_ON_FREE_DEFAULT_ON=y +CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y +# CONFIG_ZERO_CALL_USED_REGS is not set +# end of Memory initialization + +# +# Hardening of kernel data structures +# +# CONFIG_LIST_HARDENED is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Hardening of kernel data structures + +CONFIG_RANDSTRUCT_NONE=y +# CONFIG_RANDSTRUCT_FULL is not set +# CONFIG_RANDSTRUCT_PERFORMANCE is not set +# end of Kernel hardening options +# end of Security options + +CONFIG_XOR_BLOCKS=y +CONFIG_ASYNC_CORE=y +CONFIG_ASYNC_MEMCPY=y +CONFIG_ASYNC_XOR=y +CONFIG_ASYNC_PQ=y +CONFIG_ASYNC_RAID6_RECOV=y +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SIG2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +CONFIG_CRYPTO_PCRYPT=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_AUTHENC=y +# CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_ENGINE=y +# end of Crypto core or helper + +# +# Public-key cryptography +# +CONFIG_CRYPTO_RSA=y +# CONFIG_CRYPTO_DH is not set +CONFIG_CRYPTO_ECC=y +CONFIG_CRYPTO_ECDH=y +# CONFIG_CRYPTO_ECDSA is not set +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_SM2 is not set +# CONFIG_CRYPTO_CURVE25519 is not set +# end of Public-key cryptography + +# +# Block ciphers +# +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_AES_TI is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARIA is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set +# CONFIG_CRYPTO_CAST5 is not set +# CONFIG_CRYPTO_CAST6 is not set +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set +# CONFIG_CRYPTO_KHAZAD is not set +# CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_SM4_GENERIC is not set +# CONFIG_CRYPTO_TEA is not set +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_TWOFISH_COMMON=y +# end of Block ciphers + +# +# Length-preserving ciphers and modes +# +# CONFIG_CRYPTO_ADIANTUM is not set +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_CHACHA20=y +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CFB=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +# CONFIG_CRYPTO_KEYWRAP is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_OFB is not set +# CONFIG_CRYPTO_PCBC is not set +CONFIG_CRYPTO_XTS=y +CONFIG_CRYPTO_NHPOLY1305=y +# end of Length-preserving ciphers and modes + +# +# AEAD (authenticated encryption with associated data) ciphers +# +# CONFIG_CRYPTO_AEGIS128 is not set +CONFIG_CRYPTO_CHACHA20POLY1305=y +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_GCM=y +CONFIG_CRYPTO_GENIV=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_ECHAINIV=y +CONFIG_CRYPTO_ESSIV=y +# end of AEAD (authenticated encryption with associated data) ciphers + +# +# Hashes, digests, and MACs +# +# CONFIG_CRYPTO_BLAKE2B is not set +CONFIG_CRYPTO_CMAC=y +CONFIG_CRYPTO_GHASH=y +CONFIG_CRYPTO_HMAC=y +# CONFIG_CRYPTO_MD4 is not set +CONFIG_CRYPTO_MD5=y +# CONFIG_CRYPTO_MICHAEL_MIC is not set +CONFIG_CRYPTO_POLY1305=y +# CONFIG_CRYPTO_RMD160 is not set +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_SHA3=y +# CONFIG_CRYPTO_SM3_GENERIC is not set +# CONFIG_CRYPTO_STREEBOG is not set +# CONFIG_CRYPTO_VMAC is not set +# CONFIG_CRYPTO_WP512 is not set +CONFIG_CRYPTO_XCBC=y +# CONFIG_CRYPTO_XXHASH is not set +# end of Hashes, digests, and MACs + +# +# CRCs (cyclic redundancy checks) +# +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRCT10DIF=y +# CONFIG_CRYPTO_CRC64_ROCKSOFT is not set +# end of CRCs (cyclic redundancy checks) + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_LZO=y +# CONFIG_CRYPTO_842 is not set +CONFIG_CRYPTO_LZ4=y +CONFIG_CRYPTO_LZ4HC=y +CONFIG_CRYPTO_ZSTD=y +# end of Compression + +# +# Random number generation +# +CONFIG_CRYPTO_ANSI_CPRNG=y +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_DRBG_HMAC=y +# CONFIG_CRYPTO_DRBG_HASH is not set +# CONFIG_CRYPTO_DRBG_CTR is not set +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_JITTERENTROPY=y +# CONFIG_CRYPTO_JITTERENTROPY_TESTINTERFACE is not set +# end of Random number generation + +# +# Userspace interface +# +CONFIG_CRYPTO_USER_API=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_USER_API_RNG=y +# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set +CONFIG_CRYPTO_USER_API_AEAD=y +CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y +CONFIG_CRYPTO_STATS=y +# end of Userspace interface + +CONFIG_CRYPTO_HASH_INFO=y +CONFIG_CRYPTO_NHPOLY1305_NEON=y +CONFIG_CRYPTO_CHACHA20_NEON=y + +# +# Accelerated Cryptographic Algorithms for CPU (arm64) +# +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_POLY1305_NEON=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA256_ARM64=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_SHA512_ARM64=y +CONFIG_CRYPTO_SHA512_ARM64_CE=y +# CONFIG_CRYPTO_SHA3_ARM64 is not set +# CONFIG_CRYPTO_SM3_NEON is not set +# CONFIG_CRYPTO_SM3_ARM64_CE is not set +# CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_CRYPTO_AES_ARM64_BS=y +# CONFIG_CRYPTO_SM4_ARM64_CE is not set +# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set +# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +# CONFIG_CRYPTO_SM4_ARM64_CE_CCM is not set +# CONFIG_CRYPTO_SM4_ARM64_CE_GCM is not set +# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set +# end of Accelerated Cryptographic Algorithms for CPU (arm64) + +CONFIG_CRYPTO_HW=y +# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set +# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set +# CONFIG_CRYPTO_DEV_CCP is not set +# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set +# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set +# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set +# CONFIG_CRYPTO_DEV_QAT_C62X is not set +# CONFIG_CRYPTO_DEV_QAT_4XXX is not set +# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set +# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set +# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set +# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set +CONFIG_CRYPTO_DEV_ROCKCHIP=y +# CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG is not set +# CONFIG_CRYPTO_DEV_SAFEXCEL is not set +# CONFIG_CRYPTO_DEV_CCREE is not set +# CONFIG_CRYPTO_DEV_HISI_SEC is not set +# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set +CONFIG_ASYMMETRIC_KEY_TYPE=y +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y +CONFIG_X509_CERTIFICATE_PARSER=y +# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set +CONFIG_PKCS7_MESSAGE_PARSER=y +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set +# CONFIG_FIPS_SIGNATURE_SELFTEST is not set + +# +# Certificates for signature checking +# +CONFIG_SYSTEM_TRUSTED_KEYRING=y +CONFIG_SYSTEM_TRUSTED_KEYS="" +# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +# end of Certificates for signature checking + +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_RAID6_PQ=y +CONFIG_RAID6_PQ_BENCHMARK=y +CONFIG_LINEAR_RANGES=y +# CONFIG_PACKING is not set +CONFIG_BITREVERSE=y +CONFIG_HAVE_ARCH_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +CONFIG_CORDIC=y +# CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_ARCH_USE_SYM_ANNOTATIONS=y +# CONFIG_INDIRECT_PIO is not set + +# +# Crypto library routines +# +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_ARC4=y +CONFIG_CRYPTO_LIB_GF128MUL=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y +CONFIG_CRYPTO_LIB_CHACHA_GENERIC=y +CONFIG_CRYPTO_LIB_CHACHA=y +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y +CONFIG_CRYPTO_LIB_CURVE25519=y +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=y +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + +CONFIG_CRC_CCITT=y +CONFIG_CRC16=y +CONFIG_CRC_T10DIF=y +# CONFIG_CRC64_ROCKSOFT is not set +CONFIG_CRC_ITU_T=y +CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set +CONFIG_CRC64=m +# CONFIG_CRC4 is not set +CONFIG_CRC7=y +CONFIG_LIBCRC32C=y +# CONFIG_CRC8 is not set +CONFIG_XXHASH=y +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_COMPRESS=y +CONFIG_LZ4HC_COMPRESS=y +CONFIG_LZ4_DECOMPRESS=y +CONFIG_ZSTD_COMMON=y +CONFIG_ZSTD_COMPRESS=y +CONFIG_ZSTD_DECOMPRESS=y +CONFIG_XZ_DEC=y +# CONFIG_XZ_DEC_X86 is not set +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_IA64 is not set +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +# CONFIG_XZ_DEC_SPARC is not set +# CONFIG_XZ_DEC_MICROLZMA is not set +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DECOMPRESS_XZ=y +CONFIG_DECOMPRESS_LZO=y +CONFIG_DECOMPRESS_LZ4=y +CONFIG_DECOMPRESS_ZSTD=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_XARRAY_MULTI=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_DMA_OPS=y +CONFIG_NEED_SG_DMA_FLAGS=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_DMA_DECLARE_COHERENT=y +CONFIG_ARCH_HAS_SETUP_DMA_OPS=y +CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y +CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y +CONFIG_SWIOTLB=y +# CONFIG_SWIOTLB_DYNAMIC is not set +CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC=y +# CONFIG_DMA_RESTRICTED_POOL is not set +CONFIG_DMA_NONCOHERENT_MMAP=y +CONFIG_DMA_COHERENT_POOL=y +CONFIG_DMA_DIRECT_REMAP=y +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set +CONFIG_SGL_ALLOC=y +# CONFIG_FORCE_NR_CPUS is not set +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +# CONFIG_GLOB_SELFTEST is not set +CONFIG_NLATTR=y +CONFIG_LRU_CACHE=m +CONFIG_CLZ_TAB=y +CONFIG_IRQ_POLL=y +CONFIG_MPILIB=y +CONFIG_LIBFDT=y +CONFIG_OID_REGISTRY=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_VDSO_TIME_NS=y +CONFIG_FONT_SUPPORT=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_PMEM_API=y +CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE=y +CONFIG_ARCH_STACKWALK=y +CONFIG_SBITMAP=y +# end of Library routines + +CONFIG_GENERIC_IOREMAP=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7 +# CONFIG_BOOT_PRINTK_DELAY is not set +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DYNAMIC_DEBUG_CORE=y +# CONFIG_SYMBOLIC_ERRNAME is not set +CONFIG_DEBUG_BUGVERBOSE=y +# end of printk and dmesg options + +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_MISC is not set + +# +# Compile-time checks and compiler options +# +CONFIG_AS_HAS_NON_CONST_LEB128=y +CONFIG_DEBUG_INFO_NONE=y +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +# CONFIG_DEBUG_INFO_DWARF5 is not set +CONFIG_FRAME_WARN=2048 +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_READABLE_ASM is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_ARCH_WANT_FRAME_POINTERS=y +CONFIG_FRAME_POINTER=y +# CONFIG_VMLINUX_MAP is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set +# CONFIG_DEBUG_FS_ALLOW_NONE is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y +# CONFIG_UBSAN is not set +CONFIG_HAVE_ARCH_KCSAN=y +CONFIG_HAVE_KCSAN_COMPILER=y +# CONFIG_KCSAN is not set +# end of Generic Kernel Debugging Instruments + +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# end of Networking Debugging + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +# CONFIG_DEBUG_WX is not set +CONFIG_GENERIC_PTDUMP=y +# CONFIG_PTDUMP_DEBUGFS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_PER_VMA_LOCK_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SHRINKER_DEBUG is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_SCHED_STACK_END_CHECK is not set +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y +CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_CC_HAS_KASAN_SW_TAGS=y +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=1 +# CONFIG_SOFTLOCKUP_DETECTOR is not set +CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y +# CONFIG_HARDLOCKUP_DETECTOR is not set +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y +# CONFIG_WQ_WATCHDOG is not set +# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set +# CONFIG_TEST_LOCKUP is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHED_INFO=y +CONFIG_SCHEDSTATS=y +# end of Scheduler Debugging + +# CONFIG_DEBUG_TIMEKEEPING is not set +# CONFIG_DEBUG_PREEMPT is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +CONFIG_DEBUG_SPINLOCK=y +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +# CONFIG_DEBUG_IRQFLAGS is not set +CONFIG_STACKTRACE=y +# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set +# CONFIG_DEBUG_KOBJECT is not set + +# +# Debug kernel data structures +# +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_DEBUG_MAPLE_TREE is not set +# end of Debug kernel data structures + +CONFIG_DEBUG_CREDENTIALS=y + +# +# RCU Debugging +# +# CONFIG_RCU_SCALE_TEST is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_REF_SCALE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=20 +# CONFIG_RCU_CPU_STALL_CPUTIME is not set +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_LATENCYTOP is not set +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACING_SUPPORT=y +# CONFIG_FTRACE is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y +# CONFIG_STRICT_DEVMEM is not set + +# +# arm64 Debugging +# +# CONFIG_PID_IN_CONTEXTIDR is not set +# CONFIG_ARM64_RELOC_TEST is not set +# CONFIG_CORESIGHT is not set +# end of arm64 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +# CONFIG_FAULT_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +CONFIG_CC_HAS_SANCOV_TRACE_PC=y +# CONFIG_KCOV is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y +# CONFIG_MEMTEST is not set +# end of Kernel Testing and Coverage + +# +# Rust hacking +# +# end of Rust hacking +# end of Kernel hacking diff --git a/projects/Rockchip/devices/RK3566/linux/linux.jelos.compact.config b/projects/Rockchip/devices/RK3566/linux/linux.jelos.compact.config new file mode 100644 index 0000000000..bb29c1bef5 --- /dev/null +++ b/projects/Rockchip/devices/RK3566/linux/linux.jelos.compact.config @@ -0,0 +1,1113 @@ +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_DEFAULT_HOSTNAME="" +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_WATCH_QUEUE=y +# CONFIG_CROSS_MEMORY_ATTACH is not set +CONFIG_USELIB=y +CONFIG_NO_HZ_IDLE=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set +CONFIG_PREEMPT=y +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_MEMCG=y +CONFIG_BLK_CGROUP=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_NAMESPACES=y +CONFIG_SCHED_AUTOGROUP=y +CONFIG_RELAY=y +CONFIG_INITRAMFS_SOURCE="${BR_BINARIES_DIR}/rootfs.cpio" +CONFIG_INITRAMFS_COMPRESSION_LZO=y +CONFIG_BOOT_CONFIG=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_EXPERT=y +CONFIG_SGETMASK_SYSCALL=y +CONFIG_KALLSYMS_ALL=y +CONFIG_PROFILING=y +CONFIG_ARCH_ROCKCHIP=y +# CONFIG_CAVIUM_ERRATUM_22375 is not set +# CONFIG_CAVIUM_ERRATUM_23154 is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_CAVIUM_ERRATUM_30115 is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_FUJITSU_ERRATUM_010001 is not set +# CONFIG_HISILICON_ERRATUM_161600802 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set +# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set +# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set +# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set +CONFIG_SCHED_MC=y +CONFIG_SCHED_SMT=y +CONFIG_NR_CPUS=4 +CONFIG_ARM64_SW_TTBR0_PAN=y +CONFIG_COMPAT=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_ARM64_PMEM=y +# CONFIG_ARM64_BTI is not set +CONFIG_RANDOMIZE_BASE=y +# CONFIG_EFI is not set +CONFIG_SUSPEND_SKIP_SYNC=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y +CONFIG_ENERGY_MODEL=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_ARM_PSCI_CPUIDLE=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPUFREQ_DT=y +CONFIG_ARM_SCMI_CPUFREQ=y +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 +# CONFIG_GCC_PLUGINS is not set +CONFIG_MODULES=y +CONFIG_MODULE_FORCE_LOAD=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_MAC_PARTITION=y +# CONFIG_MQ_IOSCHED_KYBER is not set +# CONFIG_IOSCHED_BFQ is not set +CONFIG_BINFMT_MISC=y +# CONFIG_SLAB_MERGE_DEFAULT is not set +# CONFIG_SLUB_CPU_PARTIAL is not set +# CONFIG_COMPAT_BRK is not set +# CONFIG_COMPACTION is not set +CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 +# CONFIG_VM_EVENT_COUNTERS is not set +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_USER=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IPGRE=m +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_DIAG is not set +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_CUBIC=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_CDG=m +CONFIG_TCP_MD5SIG=y +# CONFIG_IPV6 is not set +CONFIG_NETFILTER=y +CONFIG_BRIDGE_NETFILTER=y +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_PROCFS=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_TIMEOUT=y +CONFIG_NF_CONNTRACK_TIMESTAMP=y +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m +CONFIG_NF_TABLES=m +CONFIG_NFT_CT=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_QUEUE=m +CONFIG_NFT_REJECT=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +CONFIG_NETFILTER_XTABLES_COMPAT=y +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m +CONFIG_NETFILTER_XT_TARGET_TPROXY=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_L2TP=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_RECENT=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=y +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m +CONFIG_IP_VS=m +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m +CONFIG_IP_VS_NFCT=y +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_SYNPROXY=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_NF_TABLES_BRIDGE=m +CONFIG_NFT_BRIDGE_META=m +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_NFLOG=m +CONFIG_BRIDGE=y +CONFIG_VLAN_8021Q=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_CODEL=y +CONFIG_NET_SCH_FQ_CODEL=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_CGROUP=y +CONFIG_DNS_RESOLVER=y +CONFIG_OPENVSWITCH=m +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CAN=y +CONFIG_BT=m +CONFIG_BT_RFCOMM=y +CONFIG_BT_HIDP=y +CONFIG_BT_HS=y +CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIVHCI=m +CONFIG_BT_MRVL=m +CONFIG_BT_MRVL_SDIO=m +CONFIG_CFG80211=m +# CONFIG_CFG80211_DEFAULT_PS is not set +# CONFIG_CFG80211_CRDA_SUPPORT is not set +CONFIG_MAC80211=m +CONFIG_MAC80211_MESH=y +CONFIG_RFKILL=m +CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=m +# CONFIG_ETHTOOL_NETLINK is not set +CONFIG_PCI=y +CONFIG_PCIEPORTBUS=y +CONFIG_PCIEAER=y +CONFIG_PCIE_ROCKCHIP_HOST=y +CONFIG_PCIE_ROCKCHIP_DW_HOST=y +CONFIG_UEVENT_HELPER=y +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_DEVTMPFS_SAFE=y +CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +# CONFIG_ALLOW_DEV_COREDUMP is not set +CONFIG_DEBUG_DEVRES=y +CONFIG_CONNECTOR=y +CONFIG_ARM_SCMI_PROTOCOL=y +CONFIG_ARM_SCMI_POWER_CONTROL=y +CONFIG_ARM_SCPI_PROTOCOL=y +CONFIG_ARM_FFA_TRANSPORT=y +CONFIG_MTD=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_SPI_NOR=y +CONFIG_OF_OVERLAY=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_DRBD=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=1 +CONFIG_ATA_OVER_ETH=m +CONFIG_BLK_DEV_RBD=m +CONFIG_BLK_DEV_NVME=m +CONFIG_SRAM=y +CONFIG_EEPROM_93CX6=y +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_DEV_SR=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_SPI_ATTRS=y +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_MPT2SAS=m +CONFIG_ATA=y +CONFIG_SATA_AHCI=y +CONFIG_SATA_AHCI_PLATFORM=y +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SIL=m +CONFIG_MD=y +CONFIG_MD_LINEAR=m +CONFIG_BCACHE=m +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=m +CONFIG_DM_RAID=y +CONFIG_NETDEVICES=y +CONFIG_WIREGUARD=y +CONFIG_MACVLAN=y +CONFIG_IPVLAN=y +CONFIG_VXLAN=m +CONFIG_TUN=m +CONFIG_VETH=y +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_NET_VENDOR_ADAPTEC is not set +# CONFIG_NET_VENDOR_AGERE is not set +# CONFIG_NET_VENDOR_ALTEON is not set +# CONFIG_NET_VENDOR_AMD is not set +# CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ATHEROS is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_CISCO is not set +# CONFIG_NET_VENDOR_DEC is not set +# CONFIG_NET_VENDOR_DLINK is not set +# CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_HISILICON is not set +CONFIG_E100=y +CONFIG_E1000=y +CONFIG_E1000E=y +CONFIG_IGB=y +CONFIG_IXGBE=y +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MELLANOX is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_MYRI is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_NVIDIA is not set +# CONFIG_NET_VENDOR_OKI is not set +# CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RDC is not set +# CONFIG_NET_VENDOR_REALTEK is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SMSC is not set +CONFIG_STMMAC_ETH=y +# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_TEHUTI is not set +# CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WIZNET is not set +CONFIG_ROCKCHIP_PHY=y +CONFIG_CAN_SJA1000=y +CONFIG_CAN_PLX_PCI=y +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPPOE=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_USB_RTL8150=y +CONFIG_USB_RTL8152=y +CONFIG_USB_USBNET=y +CONFIG_USB_NET_CDC_MBIM=y +# CONFIG_USB_NET_NET1080 is not set +CONFIG_USB_NET_RNDIS_HOST=y +# CONFIG_USB_NET_CDC_SUBSET is not set +# CONFIG_USB_NET_ZAURUS is not set +CONFIG_USB_NET_QMI_WWAN=y +CONFIG_ATH5K=m +CONFIG_ATH9K=m +CONFIG_ATH6KL=m +CONFIG_ATH6KL_USB=m +CONFIG_AR5523=m +CONFIG_ATH10K=m +CONFIG_WCN36XX=m +CONFIG_AT76C50X_USB=m +CONFIG_B43=m +CONFIG_BRCMFMAC=m +# CONFIG_BRCMFMAC_SDIO is not set +CONFIG_BRCMFMAC_USB=y +CONFIG_BRCMFMAC_PCIE=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +CONFIG_LIBERTAS_THINFIRM=m +CONFIG_MWIFIEX=m +CONFIG_MWIFIEX_SDIO=m +CONFIG_MWIFIEX_USB=m +CONFIG_MT7601U=m +CONFIG_RT2X00=m +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_RTL8192CE=m +CONFIG_RTL8192SE=m +CONFIG_RTL8192DE=m +CONFIG_RTL8723AE=m +CONFIG_RTL8723BE=m +CONFIG_RTL8188EE=m +CONFIG_RTL8192EE=m +CONFIG_RTL8821AE=m +CONFIG_RTL8XXXU=m +CONFIG_RTL8XXXU_UNTESTED=y +CONFIG_RTW88=m +CONFIG_RTW88_8822BE=m +CONFIG_RTW88_8822BU=m +CONFIG_RTW88_8822CE=m +CONFIG_RTW88_8822CU=m +CONFIG_RTW88_8723DE=m +CONFIG_RTW88_8723DS=m +CONFIG_RTW88_8723DU=m +CONFIG_RTW88_8821CE=m +CONFIG_RTW88_8821CS=m +CONFIG_RTW89=m +CONFIG_RTW89_8852AE=m +CONFIG_RTW89_8852CE=m +CONFIG_ZD1211RW=m +CONFIG_ISDN=y +CONFIG_INPUT_MATRIXKMAP=y +CONFIG_INPUT_JOYDEV=y +CONFIG_INPUT_EVDEV=y +CONFIG_KEYBOARD_ADC=y +CONFIG_KEYBOARD_GPIO=y +CONFIG_KEYBOARD_GPIO_POLLED=y +# CONFIG_MOUSE_PS2 is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ADC=y +CONFIG_JOYSTICK_XPAD=m +CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GOODIX=y +CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX=y +CONFIG_TOUCHSCREEN_USB_COMPOSITE=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_PWM_VIBRA=y +CONFIG_INPUT_RK805_PWRKEY=y +CONFIG_SERIO_SERPORT=m +CONFIG_GAMEPORT=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_PCI is not set +CONFIG_SERIAL_8250_NR_UARTS=5 +CONFIG_SERIAL_8250_RUNTIME_UARTS=5 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_DEV_BUS=y +CONFIG_HW_RANDOM=y +CONFIG_TCG_TPM=y +# CONFIG_I2C_COMPAT is not set +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_DESIGNWARE_PLATFORM=y +CONFIG_I2C_RK3X=y +CONFIG_SPI=y +CONFIG_SPI_GPIO=y +CONFIG_SPI_ROCKCHIP=y +CONFIG_SPI_ROCKCHIP_SFC=y +CONFIG_SPI_MUX=y +CONFIG_SPI_SPIDEV=y +CONFIG_PINCTRL_RK805=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_DWAPB=y +CONFIG_GPIO_GENERIC_PLATFORM=y +CONFIG_POWER_RESET_GPIO=y +CONFIG_POWER_RESET_GPIO_RESTART=y +CONFIG_POWER_RESET_SYSCON=y +CONFIG_POWER_RESET_SYSCON_POWEROFF=y +CONFIG_SYSCON_REBOOT_MODE=y +CONFIG_BATTERY_CW2015=y +CONFIG_BATTERY_SBS=y +CONFIG_CHARGER_GPIO=y +CONFIG_CHARGER_BQ24735=y +CONFIG_CHARGER_RK817=y +CONFIG_SENSORS_PWM_FAN=y +CONFIG_THERMAL=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y +CONFIG_THERMAL_GOV_FAIR_SHARE=y +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_CPU_THERMAL=y +CONFIG_DEVFREQ_THERMAL=y +CONFIG_ROCKCHIP_THERMAL=y +CONFIG_GENERIC_ADC_THERMAL=y +CONFIG_WATCHDOG=y +CONFIG_DW_WATCHDOG=y +CONFIG_SSB=y +CONFIG_BCMA=y +CONFIG_MFD_RK8XX_I2C=y +CONFIG_MFD_TPS6586X=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_DEBUG=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_VIRTUAL_CONSUMER=y +CONFIG_REGULATOR_USERSPACE_CONSUMER=y +CONFIG_REGULATOR_ACT8865=y +CONFIG_REGULATOR_ARM_SCMI=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_PWM=y +CONFIG_REGULATOR_RK808=y +CONFIG_REGULATOR_TPS6586X=y +CONFIG_REGULATOR_VCTRL=y +CONFIG_RC_CORE=y +CONFIG_LIRC=y +CONFIG_RC_DECODERS=y +CONFIG_IR_JVC_DECODER=y +CONFIG_IR_MCE_KBD_DECODER=y +CONFIG_IR_NEC_DECODER=y +CONFIG_IR_RC5_DECODER=y +CONFIG_IR_RC6_DECODER=y +CONFIG_IR_SANYO_DECODER=y +CONFIG_IR_SHARP_DECODER=y +CONFIG_IR_SONY_DECODER=y +CONFIG_IR_XMP_DECODER=y +CONFIG_RC_DEVICES=y +CONFIG_IR_GPIO_CIR=y +CONFIG_MEDIA_CEC_RC=y +CONFIG_MEDIA_CEC_SUPPORT=y +CONFIG_USB_PULSE8_CEC=m +CONFIG_USB_RAINSHADOW_CEC=m +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_SUPPORT_FILTER=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_MEDIA_TEST_SUPPORT=y +CONFIG_DVB_MAX_ADAPTERS=8 +# CONFIG_DVB_DYNAMIC_MINORS is not set +CONFIG_MEDIA_USB_SUPPORT=y +CONFIG_VIDEO_USBTV=m +CONFIG_USB_VIDEO_CLASS=y +# CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m +CONFIG_DVB_AS102=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m +CONFIG_DVB_USB=y +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_CXUSB=m +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_DIBUSB_MB=m +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_VP7045=m +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_USB_AIRSPY=m +CONFIG_USB_HACKRF=m +CONFIG_USB_MSI2500=m +CONFIG_MEDIA_PCI_SUPPORT=y +CONFIG_VIDEO_CX23885=m +CONFIG_VIDEO_CX25821=m +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_DVB_PLATFORM_DRIVERS=y +CONFIG_V4L_MEM2MEM_DRIVERS=y +CONFIG_VIDEO_ROCKCHIP_RGA=y +CONFIG_VIDEO_HANTRO=y +# CONFIG_VIDEO_IR_I2C is not set +CONFIG_VIDEO_IMX219=y +CONFIG_VIDEO_OV5645=y +CONFIG_CXD2880_SPI_DRV=m +CONFIG_DVB_ASCOT2E=m +CONFIG_DVB_HELENE=m +CONFIG_DVB_HORUS3A=m +CONFIG_DVB_ISL6405=m +CONFIG_DVB_LGS8GL5=m +CONFIG_DVB_LNBH25=m +CONFIG_DVB_LNBH29=m +CONFIG_DVB_TDA665x=m +CONFIG_DVB_CXD2099=m +CONFIG_DRM=y +CONFIG_DRM_LOAD_EDID_FIRMWARE=y +CONFIG_DRM_MALI_DISPLAY=y +CONFIG_DRM_ROCKCHIP=y +CONFIG_ROCKCHIP_VOP2=y +CONFIG_ROCKCHIP_DW_HDMI=y +CONFIG_ROCKCHIP_DW_MIPI_DSI=y +CONFIG_DRM_PANEL_ELIDA_KD35T133=y +CONFIG_DRM_PANEL_HIMAX_HX8394=y +CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966=y +CONFIG_DRM_PANEL_NEWVISION_NV3051D=y +CONFIG_DRM_PANEL_SITRONIX_ST7701=y +CONFIG_DRM_PANEL_SITRONIX_ST7703=y +CONFIG_DRM_DISPLAY_CONNECTOR=y +CONFIG_DRM_DW_HDMI_CEC=y +CONFIG_DRM_PANEL_MIPI_DBI=y +CONFIG_DRM_PANFROST=y +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_MODE_HELPERS=y +CONFIG_BACKLIGHT_PWM=y +CONFIG_BACKLIGHT_LED=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_HRTIMER=y +CONFIG_SND_DYNAMIC_MINORS=y +# CONFIG_SND_SUPPORT_OLD_API is not set +# CONFIG_SND_VERBOSE_PROCFS is not set +CONFIG_SND_VERBOSE_PRINTK=y +CONFIG_SND_SEQUENCER=y +CONFIG_SND_SEQ_DUMMY=y +# CONFIG_SND_DRIVERS is not set +# CONFIG_SND_PCI is not set +# CONFIG_SND_SPI is not set +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_FSL_SAI=y +CONFIG_SND_SOC_ROCKCHIP=y +CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y +CONFIG_SND_SOC_ROCKCHIP_PDM=y +CONFIG_SND_SOC_ROCKCHIP_SPDIF=y +CONFIG_SND_SOC_RK3288_HDMI_ANALOG=y +CONFIG_SND_SOC_ES8316=y +CONFIG_SND_SOC_MAX98090=y +CONFIG_SND_SOC_RK817=y +CONFIG_SND_SOC_SIMPLE_AMPLIFIER=y +CONFIG_SND_SOC_SPDIF=y +CONFIG_SND_SOC_TS3A227E=y +CONFIG_SND_SIMPLE_CARD=y +CONFIG_SND_AUDIO_GRAPH_CARD=y +CONFIG_SND_AUDIO_GRAPH_CARD2=y +CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE=y +CONFIG_SND_TEST_COMPONENT=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_A4TECH=y +CONFIG_HID_ACRUX=y +CONFIG_HID_APPLE=y +CONFIG_HID_APPLEIR=y +CONFIG_HID_AUREAL=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BETOP_FF=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CORSAIR=y +CONFIG_HID_PRODIKEYS=y +CONFIG_HID_CP2112=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_DRAGONRISE=y +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=y +CONFIG_HID_ELECOM=y +CONFIG_HID_ELO=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GEMBIRD=y +CONFIG_HID_GFRM=y +CONFIG_HID_HOLTEK=y +CONFIG_HOLTEK_FF=y +CONFIG_HID_GT683R=y +CONFIG_HID_KEYTOUCH=y +CONFIG_HID_KYE=y +CONFIG_HID_UCLOGIC=y +CONFIG_HID_WALTOP=y +CONFIG_HID_GYRATION=y +CONFIG_HID_ICADE=y +CONFIG_HID_TWINHAN=y +CONFIG_HID_KENSINGTON=y +CONFIG_HID_LCPOWER=y +CONFIG_HID_LENOVO=y +CONFIG_HID_LOGITECH=y +CONFIG_HID_LOGITECH_DJ=y +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_MULTITOUCH=y +CONFIG_HID_NTRIG=y +CONFIG_HID_ORTEK=y +CONFIG_HID_PANTHERLORD=y +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=y +CONFIG_HID_PETALYNX=y +CONFIG_HID_PLANTRONICS=y +CONFIG_HID_PRIMAX=y +CONFIG_HID_ROCCAT=y +CONFIG_HID_SAITEK=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_HID_SPEEDLINK=y +CONFIG_HID_STEELSERIES=y +CONFIG_HID_SUNPLUS=y +CONFIG_HID_RMI=y +CONFIG_HID_GREENASIA=y +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=y +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=y +CONFIG_HID_TOPSEED=y +CONFIG_HID_THINGM=y +CONFIG_HID_THRUSTMASTER=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_HID_WACOM=y +CONFIG_HID_WIIMOTE=y +CONFIG_HID_XINMO=y +CONFIG_HID_ZEROPLUS=y +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=y +CONFIG_HID_SENSOR_HUB=y +CONFIG_HID_SENSOR_CUSTOM_SENSOR=y +CONFIG_HID_ALPS=y +CONFIG_USB_HIDDEV=y +CONFIG_I2C_HID_OF_GOODIX=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +# CONFIG_USB_DEFAULT_PERSIST is not set +CONFIG_USB_OTG=y +CONFIG_USB_OTG_PRODUCTLIST=y +CONFIG_USB_OTG_FSM=y +CONFIG_USB_LEDS_TRIGGER_USBPORT=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_HCD_PCI is not set +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_REALTEK=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_ONETOUCH=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_STORAGE_ENE_UB6250=y +CONFIG_USB_UAS=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC2=y +CONFIG_USB_SERIAL=y +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_CH341=y +CONFIG_USB_SERIAL_CP210X=y +CONFIG_USB_SERIAL_FTDI_SIO=y +CONFIG_USB_SERIAL_KEYSPAN=y +CONFIG_USB_SERIAL_PL2303=y +CONFIG_USB_SERIAL_OTI6858=y +CONFIG_USB_SERIAL_QUALCOMM=y +CONFIG_USB_SERIAL_SIERRAWIRELESS=y +CONFIG_USB_SERIAL_OPTION=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_U_SERIAL_CONSOLE=y +CONFIG_USB_CONFIGFS=y +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_FS=y +CONFIG_USB_CONFIGFS_F_UVC=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FUNCTIONFS=m +CONFIG_USB_MASS_STORAGE=m +CONFIG_USB_G_SERIAL=m +CONFIG_TYPEC=y +CONFIG_TYPEC_TCPM=y +CONFIG_TYPEC_FUSB302=y +CONFIG_TYPEC_DP_ALTMODE=y +CONFIG_MMC=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_TEST=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_OF_DWCMSHC=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_ROCKCHIP=y +CONFIG_MMC_HSQ=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +CONFIG_LEDS_IS31FL32XX=y +CONFIG_LEDS_SYSCON=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y +CONFIG_RTC_CLASS=y +# CONFIG_RTC_SYSTOHC is not set +# CONFIG_RTC_INTF_PROC is not set +# CONFIG_RTC_INTF_DEV is not set +CONFIG_RTC_DRV_HYM8563=y +CONFIG_RTC_DRV_RK808=y +CONFIG_DMADEVICES=y +CONFIG_PL330_DMA=y +CONFIG_UDMABUF=y +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VHOST_MENU is not set +CONFIG_STAGING=y +CONFIG_RTL8723BS=m +CONFIG_R8712U=m +CONFIG_STAGING_MEDIA=y +CONFIG_VIDEO_ROCKCHIP_VDEC=y +CONFIG_CHROME_PLATFORMS=y +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_COMMON_CLK_RK808=y +CONFIG_COMMON_CLK_SCMI=y +CONFIG_COMMON_CLK_SCPI=y +CONFIG_COMMON_CLK_XGENE=y +CONFIG_COMMON_CLK_PWM=y +CONFIG_COMMON_CLK_FIXED_MMIO=y +# CONFIG_CLK_RK3308 is not set +# CONFIG_CLK_RK3328 is not set +# CONFIG_CLK_RK3368 is not set +# CONFIG_CLK_RK3399 is not set +# CONFIG_FSL_ERRATUM_A008585 is not set +# CONFIG_HISILICON_ERRATUM_161010101 is not set +# CONFIG_ARM64_ERRATUM_858921 is not set +CONFIG_MAILBOX=y +CONFIG_ARM_MHU=y +CONFIG_PLATFORM_MHU=y +CONFIG_ROCKCHIP_MBOX=y +CONFIG_ROCKCHIP_IOMMU=y +CONFIG_ARM_SMMU=y +CONFIG_ARM_SMMU_V3=y +CONFIG_ROCKCHIP_IODOMAIN=y +CONFIG_ROCKCHIP_PM_DOMAINS=y +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_ARM_RK3399_DMC_DEVFREQ=y +CONFIG_MEMORY=y +CONFIG_IIO=y +CONFIG_IIO_BUFFER_HW_CONSUMER=y +CONFIG_IIO_SW_DEVICE=y +CONFIG_IIO_SW_TRIGGER=y +CONFIG_IIO_TRIGGERED_EVENT=y +CONFIG_ROCKCHIP_SARADC=y +CONFIG_SENSORS_ISL29018=y +CONFIG_SENSORS_TSL2563=y +CONFIG_TSL2583=y +CONFIG_IIO_MUX=y +CONFIG_IIO_HRTIMER_TRIGGER=y +CONFIG_IIO_SYSFS_TRIGGER=y +CONFIG_PWM=y +CONFIG_PWM_ROCKCHIP=y +CONFIG_PHY_ROCKCHIP_DP=y +CONFIG_PHY_ROCKCHIP_DPHY_RX0=y +CONFIG_PHY_ROCKCHIP_EMMC=y +CONFIG_PHY_ROCKCHIP_INNO_HDMI=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y +CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y +CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y +CONFIG_PHY_ROCKCHIP_PCIE=y +CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y +CONFIG_PHY_ROCKCHIP_TYPEC=y +CONFIG_PHY_ROCKCHIP_USB=y +CONFIG_ARM_SMMU_V3_PMU=y +CONFIG_MUX_GPIO=y +CONFIG_MUX_MMIO=y +CONFIG_EXT4_FS=y +# CONFIG_EXT4_USE_FOR_EXT2 is not set +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_XFS_FS=y +# CONFIG_DNOTIFY is not set +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y +CONFIG_FSCACHE=y +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +CONFIG_EXFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_LZ4=y +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_ZSTD=y +CONFIG_PSTORE=y +CONFIG_NLS_DEFAULT="utf-8" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_HARDENED_USERCOPY=y +CONFIG_STATIC_USERMODEHELPER=y +CONFIG_LSM="selinux,integrity" +CONFIG_INIT_STACK_NONE=y +CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +CONFIG_INIT_ON_FREE_DEFAULT_ON=y +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_PCRYPT=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_ECDH=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_XTS=y +CONFIG_CRYPTO_CHACHA20POLY1305=y +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_ESSIV=y +CONFIG_CRYPTO_CMAC=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_LZ4=y +CONFIG_CRYPTO_LZ4HC=y +CONFIG_CRYPTO_ZSTD=y +CONFIG_CRYPTO_ANSI_CPRNG=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_USER_API_RNG=y +CONFIG_CRYPTO_USER_API_AEAD=y +CONFIG_CRYPTO_STATS=y +CONFIG_CRYPTO_NHPOLY1305_NEON=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_SHA512_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_BS=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_DEV_ROCKCHIP=y +CONFIG_CORDIC=y +CONFIG_CRC_CCITT=y +CONFIG_CRC_T10DIF=y +CONFIG_CRC_ITU_T=y +CONFIG_CRC7=y +# CONFIG_XZ_DEC_X86 is not set +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_SPARC is not set +CONFIG_PRINTK_TIME=y +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7 +CONFIG_DYNAMIC_DEBUG=y +# CONFIG_SYMBOLIC_ERRNAME is not set +# CONFIG_DEBUG_MISC is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 +CONFIG_DEBUG_FS=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PANIC_TIMEOUT=1 +CONFIG_DETECT_HUNG_TASK=y +CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_STACKTRACE=y +CONFIG_DEBUG_CREDENTIALS=y +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=20 +# CONFIG_RCU_TRACE is not set +# CONFIG_FTRACE is not set +# CONFIG_STRICT_DEVMEM is not set +# CONFIG_RUNTIME_TESTING_MENU is not set diff --git a/projects/Rockchip/devices/RK3566/options b/projects/Rockchip/devices/RK3566/options index baf3ff453e..e6e2636b2a 100644 --- a/projects/Rockchip/devices/RK3566/options +++ b/projects/Rockchip/devices/RK3566/options @@ -31,40 +31,50 @@ BOOTLOADER="u-boot" PARTITION_TABLE="gpt" UBOOT_LABEL="uboot" - TRUST_LABEL="resource" - DEVICE_DTB=("rk3566-rg353p-linux" "rk3566-rg353v-linux" "rk3566-rg353m-linux" "rk3566-rg503-linux" "rk3566-rk2023-linux" "rk3566-rgb30-linux" "rk3566-max3pro-linux") + TRUST_LABEL="trust" + DEVICE_DTB=("rk3566-anbernic-rg353ps" "rk3566-anbernic-rg353vs" "rk3566-anbernic-rg503" "rk3566-anbernic-rg353p" "rk3566-anbernic-rg353v" "rk3566-powkiddy-rk2023" "rk3566-powkiddy-rgb30" "rk3566-powkiddy-rgb10max3") UBOOT_DTB="rk3566" - UBOOT_CONFIG="rk3568_defconfig" - PKG_SOC="rk356x" - PKG_DATAFILE="${PKG_RKBIN}/bin/rk35/rk3566_ddr_1056MHz_v1.16.bin" - PKG_LOADER="${PKG_RKBIN}/bin/rk35/rk356x_spl_v1.12.bin" - PKG_BL31="${PKG_RKBIN}/bin/rk35/rk3568_bl31_v1.42.elf" + UBOOT_CONFIG="anbernic-rgxx3-rk3566_defconfig" + PKG_SOC="rk3568" + PKG_DATAFILE="${PKG_RKBIN}/bin/rk35/rk3566_ddr_1056MHz_v1.18.bin" + PKG_LOADER="spl/u-boot-spl.bin" + PKG_BL31="${PKG_RKBIN}/bin/rk35/rk3568_bl31_v1.43.elf" PKG_LOAD_ADDR="0x0a100000" BOOT_INI=false EXT_LINUX_CONF=true # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD=" $(for DTB in "${DEVICE_DTB[@]}"; do echo -n "rockchip/${DTB}.dtb "; done)" + KERNEL_EXTRA_DEPENDS_TARGET="zstd libcap libtraceevent" # Define the CPU HW_CPU="Rockchip RK3566" # Mali GPU family MALI_FAMILY="bifrost-g52" - MALI_VERSION="g13p0" - OPENGLES="libmali" - VULKAN_SUPPORT="no" + # MALI_VERSION="g2p0" + # OPENGLES="libmali" + VULKAN_SUPPORT="" - GRAPHIC_DRIVERS="" + # OpenGL(X) implementation to use (mesa / no) + OPENGL="mesa" + + # OpenGL-ES implementation to use (mesa / no) + OPENGLES="mesa" + + GRAPHIC_DRIVERS="panfrost" # Displayserver to use (weston / x11 / no) - DISPLAYSERVER="no" + DISPLAYSERVER="wl" # Windowmanager to use (fluxbox / weston / no) - WINDOWMANAGER="no" + WINDOWMANAGER="weston" + + # debug tty path + DEBUG_TTY="/dev/ttyS2" # kernel serial console - EXTRA_CMDLINE="quiet rootwait console=ttyUSB0,1500000 console=tty0 ssh consoleblank=0 systemd.show_status=0 loglevel=0 panic=20 video=HDMI-A-1:1280x720@60" + EXTRA_CMDLINE="quiet rootwait earlycon=uart8250,mmio32,0xfe660000 console=ttyS2,1500000n8 console=tty1 ssh consoleblank=0 systemd.show_status=0 loglevel=0 panic=20" # additional packages to install # ADDITIONAL_PACKAGES="" @@ -72,13 +82,13 @@ # additional Firmware to use (dvb-firmware, misc-firmware, wlan-firmware) # Space separated list is supported, # e.g. FIRMWARE="dvb-firmware misc-firmware wlan-firmware" - FIRMWARE="misc-firmware wlan-firmware RTL8821CS-firmware RTL8723DS-firmware" + FIRMWARE="misc-firmware" # additional drivers to install: # for a list of additional drivers see packages/linux-drivers # Space separated list is supported, # e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2" - ADDITIONAL_DRIVERS="RTL8821AU RTL8821CU RTL88x2BU" + ADDITIONAL_DRIVERS="jelos-gamepad" # build and install driver addons (yes / no) DRIVER_ADDONS_SUPPORT="no" @@ -88,9 +98,6 @@ # Space separated list is supported, DRIVER_ADDONS="" #dvb-latest - # debug tty path - DEBUG_TTY="/dev/ttyUSB0" - # build and install bluetooth support (yes / no) BLUETOOTH_SUPPORT="yes" @@ -109,11 +116,9 @@ # build and install SFTP Server (yes / no) SFTP_SERVER="yes" - # build and install Simple HTTP Server (yes / no) - SIMPLE_HTTP_SERVER="yes" - # build and install OpenVPN support (yes / no) OPENVPN_SUPPORT="no" + WIREGUARD_SUPPORT="no" # build and install ZeroTier support (yes / no) ZEROTIER_SUPPORT="yes" diff --git a/projects/Rockchip/devices/RK3588/linux/linux.aarch64.conf b/projects/Rockchip/devices/RK3588/linux/linux.aarch64.conf index 5099143706..e46317436c 100644 --- a/projects/Rockchip/devices/RK3588/linux/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3588/linux/linux.aarch64.conf @@ -2,7 +2,7 @@ # Automatically generated file; DO NOT EDIT. # Linux/arm64 5.10.110 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-libreelec-linux-gnueabi-gcc-12.2.0 (GCC) 12.2.0" +CONFIG_CC_VERSION_TEXT="aarch64-linux-gnueabi-gcc-12.2.0 (GCC) 12.2.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=120200 CONFIG_LD_VERSION=239000000 diff --git a/projects/Rockchip/devices/RK3588/options b/projects/Rockchip/devices/RK3588/options index 83e6145ae5..d079036579 100755 --- a/projects/Rockchip/devices/RK3588/options +++ b/projects/Rockchip/devices/RK3588/options @@ -74,7 +74,7 @@ WINDOWMANAGER="weston" # kernel serial console - EXTRA_CMDLINE="rootwait quiet loglevel=0 console=ttyUSB0,1500000 console=tty0 coherent_pool=2M ssh consoleblank=0 panic=20" + EXTRA_CMDLINE="rootwait quiet systemd.debug_shell=ttyFIQ0 earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 console=tty0 coherent_pool=2M" # additional packages to install # ADDITIONAL_PACKAGES="" diff --git a/projects/Rockchip/packages/linux/package.mk b/projects/Rockchip/packages/linux/package.mk index 57e98a1039..fc9d2db5ed 100644 --- a/projects/Rockchip/packages/linux/package.mk +++ b/projects/Rockchip/packages/linux/package.mk @@ -7,8 +7,8 @@ PKG_NAME="linux" PKG_LICENSE="GPL" PKG_SITE="https://github.com/JustEnoughLinuxOS" -PKG_DEPENDS_HOST="ccache:host rsync:host openssl:host rdfind:host" -PKG_DEPENDS_TARGET="toolchain linux:host cpio:host kmod:host xz:host lz4:host wireless-regdb keyutils util-linux binutils ncurses openssl:host ${KERNEL_EXTRA_DEPENDS_TARGET}" +PKG_DEPENDS_HOST="ccache:host rdfind:host rsync:host openssl:host" +PKG_DEPENDS_TARGET="toolchain rdfind:host linux:host cpio:host kmod:host xz:host lz4:host wireless-regdb keyutils util-linux binutils ncurses openssl:host ${KERNEL_EXTRA_DEPENDS_TARGET}" PKG_DEPENDS_INIT="toolchain" PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory initramfs) $(get_pkg_variable initramfs PKG_NEED_UNPACK)" PKG_LONGDESC="This package builds the kernel for Rockchip devices" @@ -18,27 +18,19 @@ PKG_PATCH_DIRS+="${DEVICE}" case ${DEVICE} in RK358*) - PKG_VERSION="a7c264a8249f2058cf8ca624ee5034403412a2c1" + PKG_VERSION="eef98210c4984831d1706f884c95eec132c791e1" PKG_URL="${PKG_SITE}/rk358x-kernel.git" GET_HANDLER_SUPPORT="git" PKG_GIT_CLONE_BRANCH="main" ;; - RK3566) - PKG_URL="${PKG_SITE}/rk356x-kernel.git" - PKG_VERSION="c741d56477939654bb4056be240f93d1ad1ae91e" - GET_HANDLER_SUPPORT="git" - PKG_GIT_CLONE_BRANCH="main" - ;; - *X55) - PKG_URL="${PKG_SITE}/rk3566-x55-kernel.git" - PKG_VERSION="9e8f3703fe49d5d12bbb951e233248f5f3eb9efd" - GET_HANDLER_SUPPORT="git" - PKG_GIT_CLONE_BRANCH="main" - ;; RK3399|RK3326|RK-ARMV8-A) - PKG_VERSION="6.7.3" + PKG_VERSION="6.7.4" PKG_URL="https://www.kernel.org/pub/linux/kernel/v6.x/${PKG_NAME}-${PKG_VERSION}.tar.xz" ;; + RK356*) + PKG_VERSION="6.8-rc3" + PKG_URL="https://git.kernel.org/torvalds/t/${PKG_NAME}-${PKG_VERSION}.tar.gz" + ;; esac PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die @@ -268,19 +260,6 @@ makeinstall_target() { cp -v resource.img ${INSTALL}/usr/share/bootloader ARCH=${TARGET_ARCH} fi - elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then - mkdir -p ${INSTALL}/usr/share/bootloader/overlays - - # install platform dtbs, but remove upstream kernel dtbs (i.e. without downstream - # drivers and decent USB support) as these are not required by LibreELEC - cp -p arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb ${INSTALL}/usr/share/bootloader - rm -f ${INSTALL}/usr/share/bootloader/bcm283*.dtb - - # install overlay dtbs - for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/*.dtbo; do - cp ${dtb} ${INSTALL}/usr/share/bootloader/overlays 2>/dev/null || : - done - cp -p arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/README ${INSTALL}/usr/share/bootloader/overlays fi } diff --git a/projects/Rockchip/packages/linux/patches/RK3326/000-rk3326-dts.patch b/projects/Rockchip/packages/linux/patches/RK3326/000-rk3326-dts.patch index 516f3fd13e..07eae5c474 100644 --- a/projects/Rockchip/packages/linux/patches/RK3326/000-rk3326-dts.patch +++ b/projects/Rockchip/packages/linux/patches/RK3326/000-rk3326-dts.patch @@ -1,12 +1,13 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/Makefile linux/arch/arm64/boot/dts/rockchip/Makefile ---- linux.orig/arch/arm64/boot/dts/rockchip/Makefile 2024-01-29 05:07:30.179290843 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/Makefile 2024-01-29 06:17:10.562382315 +0000 -@@ -9,9 +9,14 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-ro +--- linux.orig/arch/arm64/boot/dts/rockchip/Makefile 2024-02-03 14:24:30.507369024 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/Makefile 2024-02-03 14:49:01.857898202 +0000 +@@ -9,9 +9,15 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-ro dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-rock-pi-s.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3318-a95x-z2.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-anbernic-rg351m.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-anbernic-rg351v.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-gameconsole-r33s.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-gameconsole-r36s.dtb +dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-magicx-xu10.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2-v11.dtb @@ -17,8 +18,8 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/Makefile linux/arch/arm64/boo dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2c.dtb diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/px30.dtsi linux/arch/arm64/boot/dts/rockchip/px30.dtsi ---- linux.orig/arch/arm64/boot/dts/rockchip/px30.dtsi 2024-01-29 05:07:30.179290843 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/px30.dtsi 2024-01-29 05:08:22.844542450 +0000 +--- linux.orig/arch/arm64/boot/dts/rockchip/px30.dtsi 2024-02-03 14:24:30.507369024 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/px30.dtsi 2024-02-03 14:25:41.221185291 +0000 @@ -114,32 +114,22 @@ compatible = "operating-points-v2"; opp-shared; @@ -117,8 +118,8 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/px30.dtsi linux/arch/arm64/bo }; diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351m.dts linux/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351m.dts ---- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351m.dts 2024-01-29 05:07:30.179290843 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351m.dts 2024-01-29 05:08:22.844542450 +0000 +--- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351m.dts 2024-02-03 14:24:30.507369024 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351m.dts 2024-02-03 14:25:41.221185291 +0000 @@ -12,6 +12,25 @@ model = "Anbernic RG351M"; compatible = "anbernic,rg351m", "rockchip,rk3326"; @@ -171,7 +172,7 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351m.dts li +}; diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351v.dts linux/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351v.dts --- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351v.dts 1970-01-01 00:00:00.000000000 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351v.dts 2024-01-29 05:08:22.844542450 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351v.dts 2024-02-03 14:25:41.221185291 +0000 @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* @@ -299,93 +300,19 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-anbernic-rg351v.dts li +}; diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r33s.dts linux/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r33s.dts --- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r33s.dts 1970-01-01 00:00:00.000000000 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r33s.dts 2024-01-29 05:08:22.844542450 +0000 -@@ -0,0 +1,646 @@ ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r33s.dts 2024-02-03 14:53:29.435899433 +0000 +@@ -0,0 +1,117 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* -+ * Copyright (c) 2019 Hardkernel Co., Ltd -+ * Copyright (c) 2020 Theobroma Systems Design und Consulting GmbH -+ * Copyright (c) 2022 Maya Matuszczyk ++ * # Copyright (C) 2024-present JELOS (https://github.com/JustEnoughLinuxOS) + */ + +/dts-v1/; -+#include -+#include -+#include -+#include -+#include "rk3326.dtsi" ++#include "rk3326-gameconsole-r3xs.dtsi" + +/ { + model = "Game Console R33S"; -+ compatible = "gameconsolec,r33s", "rockchip,rk3326"; -+ -+ aliases { -+ mmc0 = &sdio; -+ mmc1 = &sdmmc; -+ }; -+ -+ chosen { -+ stdout-path = "serial2:115200n8"; -+ }; -+ -+ backlight: backlight { -+ compatible = "pwm-backlight"; -+ power-supply = <&vcc_bl>; -+ pwms = <&pwm1 0 25000 0>; -+ brightness-levels = < -+ 0 1 2 3 4 5 6 7 -+ 8 9 10 11 12 13 14 15 -+ 16 17 18 19 20 21 22 23 -+ 24 25 26 27 28 29 30 31 -+ 32 33 34 35 36 37 38 39 -+ 40 41 42 43 44 45 46 47 -+ 48 49 50 51 52 53 54 55 -+ 56 57 58 59 60 61 62 63 -+ 64 65 66 67 68 69 70 71 -+ 72 73 74 75 76 77 78 79 -+ 80 81 82 83 84 85 86 87 -+ 88 89 90 91 92 93 94 95 -+ 96 97 98 99 100 101 102 103 -+ 104 105 106 107 108 109 110 111 -+ 112 113 114 115 116 117 118 119 -+ 120 121 122 123 124 125 126 127 -+ 128 129 130 131 132 133 134 135 -+ 136 137 138 139 140 141 142 143 -+ 144 145 146 147 148 149 150 151 -+ 152 153 154 155 156 157 158 159 -+ 160 161 162 163 164 165 166 167 -+ 168 169 170 171 172 173 174 175 -+ 176 177 178 179 180 181 182 183 -+ 184 185 186 187 188 189 190 191 -+ 192 193 194 195 196 197 198 199 -+ 200 201 202 203 204 205 206 207 -+ 208 209 210 211 212 213 214 215 -+ 216 217 218 219 220 221 222 223 -+ 224 225 226 227 228 229 230 231 -+ 232 233 234 235 236 237 238 239 -+ 240 241 242 243 244 245 246 247 -+ 248 249 250 251 252 253 254 255>; -+ default-brightness-level = <128>; -+ }; -+ -+ gpio-keys-vol { -+ compatible = "gpio-keys"; -+ autorepeat; -+ pinctrl-0 = <&btn_pins_vol>; -+ pinctrl-names = "default"; -+ -+ button-vol-down { -+ gpios = <&gpio2 RK_PA1 GPIO_ACTIVE_LOW>; -+ label = "VOLUMEDOWN"; -+ linux,code = ; -+ }; -+ -+ button-volume-up { -+ gpios = <&gpio2 RK_PA0 GPIO_ACTIVE_LOW>; -+ label = "VOLUMEUP"; -+ linux,code = ; -+ }; -+ }; ++ compatible = "gameconsole,r33s", "rockchip,rk3326"; + + builtin_gamepad: r33s_joypad { + compatible = "gpio-keys"; @@ -464,6 +391,333 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r33s.dts l + }; + }; + ++ vibrator { ++ compatible = "pwm-vibrator"; ++ pwms = <&pwm0 0 1000000 0>; ++ pwm-names = "enable"; ++ }; ++}; ++ ++&pinctrl { ++ btns { ++ btn_pins: btn-pins { ++ rockchip,pins = <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PB4 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PB6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PB7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <2 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PB4 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ ++ }; ++}; +diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r36s.dts linux/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r36s.dts +--- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r36s.dts 1970-01-01 00:00:00.000000000 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r36s.dts 2024-02-03 14:56:33.563329307 +0000 +@@ -0,0 +1,207 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++/* ++ * # Copyright (C) 2024-present JELOS (https://github.com/JustEnoughLinuxOS) ++ */ ++ ++/dts-v1/; ++#include "rk3326-gameconsole-r3xs.dtsi" ++ ++/ { ++ model = "Game Console R36S"; ++ compatible = "gameconsole,r35s", "gameconsole,r36s", "rockchip,rk3326"; ++ ++ joypad: odroidgo3-joypad { ++ compatible = "odroidgo3-joypad"; ++ pwms = <&pwm0 0 200000000 0>; ++ pwm-names = "enable"; ++ rumble-boost-weak = <0x0000>; ++ rumble-boost-strong = <0x0000>; ++ ++ joypad-name = "r36s_Gamepad"; ++ joypad-product = <0x1188>; ++ joypad-revision = <0x0188>; ++ ++ status = "okay"; ++ ++ /* gpio pincontrol setup */ ++ pinctrl-names = "default"; ++ pinctrl-0 = <&btn_pins>; ++ pinctrl-1 = <&pwm0_pin>; ++ ++ /* Analog mux define */ ++ io-channel-names = "amux_adc"; ++ io-channels = <&saradc 1>; ++ ++ /* adc mux channel count */ ++ amux-count = <4>; ++ /* adc mux select(a,b) gpio */ ++ amux-a-gpios = <&gpio3 RK_PB3 GPIO_ACTIVE_LOW>; ++ amux-b-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>; ++ /* adc mux enable gpio */ ++ amux-en-gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_LOW>; ++ ++ /* adc calculate scale */ ++ button-adc-scale = <2>; ++ ++ /* adc deadzone range */ ++ button-adc-deadzone = <64>; ++ ++ /* ++ specifies fuzz value that is used to filter noise from ++ the event stream. ++ */ ++ button-adc-fuzz = <32>; ++ button-adc-flat = <32>; ++ ++ /* ++ Analog Stick data tuning value(precent) ++ p = positive direction, n = negative direction ++ report value = (real_adc_data * tuning_value) / 100 ++ */ ++ abs_x-p-tuning = <200>; ++ abs_x-n-tuning = <200>; ++ ++ abs_y-p-tuning = <200>; ++ abs_y-n-tuning = <200>; ++ ++ abs_rx-p-tuning = <200>; ++ abs_rx-n-tuning = <200>; ++ ++ abs_ry-p-tuning = <200>; ++ abs_ry-n-tuning = <200>; ++ ++ /* poll device interval (ms), adc read interval */ ++ poll-interval = <10>; ++ ++ /* required for RG36S */ ++ invert-absx; ++ invert-absy; ++ ++ /* gpio button auto repeat set value : default disable */ ++ /* ++ autorepeat; ++ */ ++ ++ /* ++ joypad driver is poll-device driver. ++ poll-device is does not support wakeup-source. ++ */ ++ sw1 { ++ gpios = <&gpio1 RK_PB4 GPIO_ACTIVE_LOW>; ++ label = "GPIO DPAD-UP"; ++ linux,code = ; // 0x220 ++ }; ++ sw2 { ++ gpios = <&gpio1 RK_PB5 GPIO_ACTIVE_LOW>; ++ label = "GPIO DPAD-DOWN"; ++ linux,code = ; // 0x221 ++ }; ++ sw3 { ++ gpios = <&gpio1 RK_PB6 GPIO_ACTIVE_LOW>; ++ label = "GPIO DPAD-LEFT"; ++ linux,code = ; // 0x222 ++ }; ++ sw4 { ++ gpios = <&gpio1 RK_PB7 GPIO_ACTIVE_LOW>; ++ label = "GPIO DPAD-RIGHT"; ++ linux,code = ; // 0x223 ++ }; ++ sw5 { ++ gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_LOW>; ++ label = "GPIO KEY BTN-A"; ++ linux,code = ; // 0x131 ++ }; ++ sw6 { ++ gpios = <&gpio1 RK_PA5 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN-B"; ++ linux,code = ; // 0x130 ++ }; ++ sw7 { ++ gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN-Y"; ++ linux,code = ; // 0x134 ++ }; ++ sw8 { ++ gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN-X"; ++ linux,code = ; // 0x133 ++ }; ++ sw11 { ++ gpios = <&gpio2 RK_PA2 GPIO_ACTIVE_LOW>; ++ label = "GPIO F3"; ++ linux,code = ; // 0x2c2 ++ }; ++ sw12 { ++ gpios = <&gpio2 RK_PA3 GPIO_ACTIVE_LOW>; ++ label = "GPIO F4"; ++ linux,code = ; // 0x2c3 ++ }; ++ /*sw13 { ++ gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_LOW>; ++ label = "GPIO F5"; ++ linux,code = ; // 0x2c4 ++ }; ++ sw14 { ++ gpios = <&gpio2 RK_PA5 GPIO_ACTIVE_LOW>; ++ label = "GPIO F6"; ++ linux,code = ; // 0x13c ++ };*/ ++ sw15 { ++ gpios = <&gpio2 RK_PA6 GPIO_ACTIVE_LOW>; ++ label = "GPIO TOP-LEFT"; ++ linux,code = ; // 0x02 ++ }; ++ sw16 { ++ gpios = <&gpio2 RK_PA7 GPIO_ACTIVE_LOW>; ++ label = "GPIO TOP-RIGHT"; ++ linux,code = ; // 0x05 ++ }; ++ sw19 { ++ gpios = <&gpio3 RK_PB1 GPIO_ACTIVE_LOW>; ++ label = "GPIO F1"; ++ linux,code = ; ++ }; ++ sw20 { ++ gpios = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>; ++ label = "GPIO TOP-RIGHT2"; ++ linux,code = ; ++ }; ++ sw21 { ++ gpios = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>; ++ label = "GPIO TOP-LEFT2"; ++ linux,code = ; ++ }; ++ sw22 { ++ gpios = <&gpio3 RK_PB4 GPIO_ACTIVE_LOW>; ++ label = "GPIO F2"; ++ linux,code = ; ++ }; ++ }; ++}; ++ ++&pinctrl { ++ btns { ++ btn_pins: btn-pins { ++ rockchip,pins = <1 RK_PB4 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PB6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PB7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <2 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>, ++ <2 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>, ++ <2 RK_PA4 RK_FUNC_GPIO &pcfg_pull_up>, ++ <2 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>, ++ <2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <2 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PB4 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_up>; ++ ++ }; ++ ++ }; ++}; +diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r3xs.dtsi linux/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r3xs.dtsi +--- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r3xs.dtsi 1970-01-01 00:00:00.000000000 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r3xs.dtsi 2024-02-03 14:46:31.754519839 +0000 +@@ -0,0 +1,545 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++/* ++ * # Copyright (C) 2024-present JELOS (https://github.com/JustEnoughLinuxOS) ++ */ ++ ++/dts-v1/; ++#include ++#include ++#include ++#include ++#include "rk3326.dtsi" ++ ++/ { ++ model = "Game Console R33S"; ++ compatible = "gameconsolec,r33s", "rockchip,rk3326"; ++ ++ aliases { ++ mmc0 = &sdio; ++ mmc1 = &sdmmc; ++ }; ++ ++ chosen { ++ stdout-path = "serial2:115200n8"; ++ }; ++ ++ backlight: backlight { ++ compatible = "pwm-backlight"; ++ power-supply = <&vcc_bl>; ++ pwms = <&pwm1 0 25000 0>; ++ brightness-levels = < ++ 0 1 2 3 4 5 6 7 ++ 8 9 10 11 12 13 14 15 ++ 16 17 18 19 20 21 22 23 ++ 24 25 26 27 28 29 30 31 ++ 32 33 34 35 36 37 38 39 ++ 40 41 42 43 44 45 46 47 ++ 48 49 50 51 52 53 54 55 ++ 56 57 58 59 60 61 62 63 ++ 64 65 66 67 68 69 70 71 ++ 72 73 74 75 76 77 78 79 ++ 80 81 82 83 84 85 86 87 ++ 88 89 90 91 92 93 94 95 ++ 96 97 98 99 100 101 102 103 ++ 104 105 106 107 108 109 110 111 ++ 112 113 114 115 116 117 118 119 ++ 120 121 122 123 124 125 126 127 ++ 128 129 130 131 132 133 134 135 ++ 136 137 138 139 140 141 142 143 ++ 144 145 146 147 148 149 150 151 ++ 152 153 154 155 156 157 158 159 ++ 160 161 162 163 164 165 166 167 ++ 168 169 170 171 172 173 174 175 ++ 176 177 178 179 180 181 182 183 ++ 184 185 186 187 188 189 190 191 ++ 192 193 194 195 196 197 198 199 ++ 200 201 202 203 204 205 206 207 ++ 208 209 210 211 212 213 214 215 ++ 216 217 218 219 220 221 222 223 ++ 224 225 226 227 228 229 230 231 ++ 232 233 234 235 236 237 238 239 ++ 240 241 242 243 244 245 246 247 ++ 248 249 250 251 252 253 254 255>; ++ default-brightness-level = <128>; ++ }; ++ ++ gpio-keys-vol { ++ compatible = "gpio-keys"; ++ autorepeat; ++ pinctrl-0 = <&btn_pins_vol>; ++ pinctrl-names = "default"; ++ ++ button-vol-down { ++ gpios = <&gpio2 RK_PA1 GPIO_ACTIVE_LOW>; ++ label = "VOLUMEDOWN"; ++ linux,code = ; ++ }; ++ ++ button-volume-up { ++ gpios = <&gpio2 RK_PA0 GPIO_ACTIVE_LOW>; ++ label = "VOLUMEUP"; ++ linux,code = ; ++ }; ++ }; ++ + battery: battery { + compatible = "simple-battery"; + charge-full-design-microamp-hours = <3200000>; @@ -482,12 +736,6 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r33s.dts l + <3649470 20>, <3635260 15>, <3616920 10>, <3592440 5>, + <3574170 0>; + -+ }; -+ -+ vibrator { -+ compatible = "pwm-vibrator"; -+ pwms = <&pwm0 0 1000000 0>; -+ pwm-names = "enable"; + }; + + rk817-sound { @@ -896,29 +1144,13 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r33s.dts l +}; + +&pinctrl { -+ btns { -+ btn_pins: btn-pins { -+ rockchip,pins = <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>, -+ <1 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>, -+ <1 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>, -+ <1 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>, -+ <1 RK_PB4 RK_FUNC_GPIO &pcfg_pull_up>, -+ <1 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>, -+ <1 RK_PB6 RK_FUNC_GPIO &pcfg_pull_up>, -+ <1 RK_PB7 RK_FUNC_GPIO &pcfg_pull_up>, -+ <2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>, -+ <2 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>, -+ <3 RK_PB1 RK_FUNC_GPIO &pcfg_pull_up>, -+ <3 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up>, -+ <3 RK_PB4 RK_FUNC_GPIO &pcfg_pull_up>, -+ <3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_up>; -+ }; -+ btn_pins_vol: btn-pins-vol { -+ rockchip,pins = <2 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>, -+ <2 RK_PA1 RK_FUNC_GPIO &pcfg_pull_up>; ++ btns { ++ btn_pins_vol: btn-pins-vol { ++ rockchip,pins = <2 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>, ++ <2 RK_PA1 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; + }; -+ }; -+ ++ + headphone { + hp_det: hp-det { + rockchip,pins = <2 RK_PC6 RK_FUNC_GPIO &pcfg_pull_down>; @@ -948,8 +1180,8 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r33s.dts l + }; +}; diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-magicx-xu10.dts linux/arch/arm64/boot/dts/rockchip/rk3326-magicx-xu10.dts ---- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-magicx-xu10.dts 1969-12-31 19:00:00.000000000 -0500 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-magicx-xu10.dts 2024-02-01 21:39:27.594961980 -0500 +--- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-magicx-xu10.dts 1970-01-01 00:00:00.000000000 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-magicx-xu10.dts 2024-02-03 14:25:41.221185291 +0000 @@ -0,0 +1,828 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* @@ -1780,8 +2012,8 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-magicx-xu10.dts linux/ + }; +}; diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go.dtsi linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go.dtsi ---- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go.dtsi 2024-01-29 05:07:30.179290843 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go.dtsi 2024-01-29 05:08:22.844542450 +0000 +--- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go.dtsi 2024-02-03 14:24:30.507369024 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go.dtsi 2024-02-03 14:25:41.221185291 +0000 @@ -25,93 +25,40 @@ compatible = "pwm-backlight"; power-supply = <&vcc_bl>; @@ -1938,8 +2170,8 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go.dtsi linux/a #clock-cells = <1>; #sound-dai-cells = <0>; diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2-v11.dts linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2-v11.dts ---- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2-v11.dts 2024-01-29 05:07:30.179290843 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2-v11.dts 2024-01-29 05:08:22.844542450 +0000 +--- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2-v11.dts 2024-02-03 14:24:30.507369024 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2-v11.dts 2024-02-03 14:25:41.221185291 +0000 @@ -16,31 +16,187 @@ mmc1 = &sdio; }; @@ -2221,8 +2453,8 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2-v11.dts lin <2 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>, <2 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>, diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts ---- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts 2024-01-29 05:07:30.179290843 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts 2024-01-29 05:08:22.844542450 +0000 +--- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts 2024-02-03 14:24:30.507369024 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts 2024-02-03 14:25:41.221185291 +0000 @@ -12,30 +12,175 @@ model = "ODROID-GO Advance"; compatible = "hardkernel,rk3326-odroid-go2", "rockchip,rk3326"; @@ -2455,8 +2687,8 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts linux/a + }; +}; diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go3.dts linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go3.dts ---- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go3.dts 2024-01-29 05:07:30.179290843 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go3.dts 2024-01-29 05:08:22.844542450 +0000 +--- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go3.dts 2024-02-03 14:24:30.507369024 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-odroid-go3.dts 2024-02-03 14:25:41.221185291 +0000 @@ -12,67 +12,196 @@ model = "ODROID-GO Super"; compatible = "hardkernel,rk3326-odroid-go3", "rockchip,rk3326"; @@ -2766,7 +2998,7 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-odroid-go3.dts linux/a }; diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb10.dts linux/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb10.dts --- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb10.dts 1970-01-01 00:00:00.000000000 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb10.dts 2024-01-29 05:08:22.844542450 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb10.dts 2024-02-03 14:25:41.221185291 +0000 @@ -0,0 +1,280 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* @@ -3050,7 +3282,7 @@ diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb10.dts lin +}; diff -rupN linux.orig/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb20s.dts linux/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb20s.dts --- linux.orig/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb20s.dts 1970-01-01 00:00:00.000000000 +0000 -+++ linux/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb20s.dts 2024-01-29 20:21:55.821942737 +0000 ++++ linux/arch/arm64/boot/dts/rockchip/rk3326-powkiddy-rgb20s.dts 2024-02-03 14:25:41.221185291 +0000 @@ -0,0 +1,340 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* diff --git a/projects/Rockchip/packages/linux/patches/RK3566-X55 b/projects/Rockchip/packages/linux/patches/RK3566-X55 new file mode 120000 index 0000000000..9207b5754b --- /dev/null +++ b/projects/Rockchip/packages/linux/patches/RK3566-X55 @@ -0,0 +1 @@ +RK3566 \ No newline at end of file diff --git a/projects/Rockchip/packages/linux/patches/RK3566-X55/0001-drm-panel-Add-helper-for-reading-DT-rotation.patch b/projects/Rockchip/packages/linux/patches/RK3566-X55/0001-drm-panel-Add-helper-for-reading-DT-rotation.patch deleted file mode 100644 index a02e062c41..0000000000 --- a/projects/Rockchip/packages/linux/patches/RK3566-X55/0001-drm-panel-Add-helper-for-reading-DT-rotation.patch +++ /dev/null @@ -1,103 +0,0 @@ -From c74b76bb8a4da44a9f8cf06f4aba9f3334e1a148 Mon Sep 17 00:00:00 2001 -From: Derek Basehore -Date: Tue, 9 Jul 2019 19:16:56 -0700 -Subject: [PATCH 1/4] drm/panel: Add helper for reading DT rotation - -This adds a helper function for reading the rotation (panel -orientation) from the device tree. - -Signed-off-by: Derek Basehore ---- - drivers/gpu/drm/drm_panel.c | 43 +++++++++++++++++++++++++++++++++++++ - include/drm/drm_panel.h | 9 ++++++++ - 2 files changed, 52 insertions(+) - -diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c -index d37b83f40..b2d8fa2c3 100644 ---- a/drivers/gpu/drm/drm_panel.c -+++ b/drivers/gpu/drm/drm_panel.c -@@ -168,6 +168,49 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np) - return ERR_PTR(-EPROBE_DEFER); - } - EXPORT_SYMBOL(of_drm_find_panel); -+ -+/** -+ * of_drm_get_panel_orientation - look up the orientation of the panel through -+ * the "rotation" binding from a device tree node -+ * @np: device tree node of the panel -+ * @orientation: orientation enum to be filled in -+ * -+ * Looks up the rotation of a panel in the device tree. The orientation of the -+ * panel is expressed as a property name "rotation" in the device tree. The -+ * rotation in the device tree is counter clockwise. -+ * -+ * Return: 0 when a valid rotation value (0, 90, 180, or 270) is read or the -+ * rotation property doesn't exist. -EERROR otherwise. -+ */ -+int of_drm_get_panel_orientation(const struct device_node *np, -+ enum drm_panel_orientation *orientation) -+{ -+ int rotation, ret; -+ -+ ret = of_property_read_u32(np, "rotation", &rotation); -+ if (ret == -EINVAL) { -+ /* Don't return an error if there's no rotation property. */ -+ *orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN; -+ return 0; -+ } -+ -+ if (ret < 0) -+ return ret; -+ -+ if (rotation == 0) -+ *orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL; -+ else if (rotation == 90) -+ *orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP; -+ else if (rotation == 180) -+ *orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP; -+ else if (rotation == 270) -+ *orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP; -+ else -+ return -EINVAL; -+ -+ return 0; -+} -+EXPORT_SYMBOL(of_drm_get_panel_orientation); - #endif - - int drm_panel_notifier_register(struct drm_panel *panel, -diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h -index 6aab8fefc..c58c4c19f 100644 ---- a/include/drm/drm_panel.h -+++ b/include/drm/drm_panel.h -@@ -53,6 +53,8 @@ struct drm_device; - struct drm_panel; - struct display_timing; - -+enum drm_panel_orientation; -+ - /** - * @loader_protect: protect loader logo panel's power - * struct drm_panel_funcs - perform operations on a given panel -@@ -240,11 +242,18 @@ int drm_panel_notifier_call_chain(struct drm_panel *panel, - - #if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL) - struct drm_panel *of_drm_find_panel(const struct device_node *np); -+int of_drm_get_panel_orientation(const struct device_node *np, -+ enum drm_panel_orientation *orientation); - #else - static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) - { - return ERR_PTR(-ENODEV); - } -+static inline int of_drm_get_panel_orientation(const struct device_node *np, -+ enum drm_panel_orientation *orientation) -+{ -+ return -ENODEV; -+} - #endif - - #endif --- -2.34.1 - diff --git a/projects/Rockchip/packages/linux/patches/RK3566-X55/0002-drm-connector-Split-out-orientation-quirk-detection-.patch b/projects/Rockchip/packages/linux/patches/RK3566-X55/0002-drm-connector-Split-out-orientation-quirk-detection-.patch deleted file mode 100644 index 23f41607b7..0000000000 --- a/projects/Rockchip/packages/linux/patches/RK3566-X55/0002-drm-connector-Split-out-orientation-quirk-detection-.patch +++ /dev/null @@ -1,171 +0,0 @@ -From b76306d4adb2e169f8425fb417de565d555fcf22 Mon Sep 17 00:00:00 2001 -From: Derek Basehore -Date: Sun, 5 Jan 2020 16:51:19 +0100 -Subject: [PATCH 2/4] drm/connector: Split out orientation quirk detection (v2) - -Not every platform needs quirk detection for panel orientation, so -split the drm_connector_init_panel_orientation_property into two -functions. One for platforms without the need for quirks, and the -other for platforms that need quirks. - -Hans de Goede (changes in v2): - -Rename the function from drm_connector_init_panel_orientation_property -to drm_connector_set_panel_orientation[_with_quirk] and pass in the -panel-orientation to set. - -Beside the rename, also make the function set the passed in value -only once, if the value was set before (to a value other then -DRM_MODE_PANEL_ORIENTATION_UNKNOWN) make any further set calls a no-op. - -This change is preparation for allowing the user to override the -panel-orientation for any connector from the kernel commandline. -When the panel-orientation is overridden this way, then we must ignore -the panel-orientation detection done by the driver. - -Reviewed-by: Rodrigo Vivi -Signed-off-by: Derek Basehore -Signed-off-by: Hans de Goede -Acked-by: Jani Nikula -Link: https://patchwork.freedesktop.org/patch/msgid/20200105155120.96466-1-hdegoede@redhat.com ---- - drivers/gpu/drm/drm_connector.c | 74 ++++++++++++++++++++++++--------- - include/drm/drm_connector.h | 9 +++- - 2 files changed, 61 insertions(+), 22 deletions(-) - -diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c -index 8a2a1965e..77a2087bf 100644 ---- a/drivers/gpu/drm/drm_connector.c -+++ b/drivers/gpu/drm/drm_connector.c -@@ -996,7 +996,8 @@ static const struct drm_prop_enum_list dp_colorspaces[] = { - * coordinates, so if userspace rotates the picture to adjust for - * the orientation it must also apply the same transformation to the - * touchscreen input coordinates. This property is initialized by calling -- * drm_connector_init_panel_orientation_property(). -+ * drm_connector_set_panel_orientation() or -+ * drm_connector_set_panel_orientation_with_quirk() - * - * scaling mode: - * This property defines how a non-native mode is upscaled to the native -@@ -1713,38 +1714,41 @@ void drm_connector_set_link_status_property(struct drm_connector *connector, - EXPORT_SYMBOL(drm_connector_set_link_status_property); - - /** -- * drm_connector_init_panel_orientation_property - -- * initialize the connecters panel_orientation property -- * @connector: connector for which to init the panel-orientation property. -- * @width: width in pixels of the panel, used for panel quirk detection -- * @height: height in pixels of the panel, used for panel quirk detection -+ * drm_connector_set_panel_orientation - sets the connecter's panel_orientation -+ * @connector: connector for which to set the panel-orientation property. -+ * @panel_orientation: drm_panel_orientation value to set -+ * -+ * This function sets the connector's panel_orientation and attaches -+ * a "panel orientation" property to the connector. - * -- * This function should only be called for built-in panels, after setting -- * connector->display_info.panel_orientation first (if known). -+ * Calling this function on a connector where the panel_orientation has -+ * already been set is a no-op (e.g. the orientation has been overridden with -+ * a kernel commandline option). - * -- * This function will check for platform specific (e.g. DMI based) quirks -- * overriding display_info.panel_orientation first, then if panel_orientation -- * is not DRM_MODE_PANEL_ORIENTATION_UNKNOWN it will attach the -- * "panel orientation" property to the connector. -+ * It is allowed to call this function with a panel_orientation of -+ * DRM_MODE_PANEL_ORIENTATION_UNKNOWN, in which case it is a no-op. - * - * Returns: - * Zero on success, negative errno on failure. - */ --int drm_connector_init_panel_orientation_property( -- struct drm_connector *connector, int width, int height) -+int drm_connector_set_panel_orientation( -+ struct drm_connector *connector, -+ enum drm_panel_orientation panel_orientation) - { - struct drm_device *dev = connector->dev; - struct drm_display_info *info = &connector->display_info; - struct drm_property *prop; -- int orientation_quirk; - -- orientation_quirk = drm_get_panel_orientation_quirk(width, height); -- if (orientation_quirk != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) -- info->panel_orientation = orientation_quirk; -+ /* Already set? */ -+ if (info->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) -+ return 0; - -- if (info->panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN) -+ /* Don't attach the property if the orientation is unknown */ -+ if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN) - return 0; - -+ info->panel_orientation = panel_orientation; -+ - prop = dev->mode_config.panel_orientation_property; - if (!prop) { - prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE, -@@ -1761,7 +1765,37 @@ int drm_connector_init_panel_orientation_property( - info->panel_orientation); - return 0; - } --EXPORT_SYMBOL(drm_connector_init_panel_orientation_property); -+EXPORT_SYMBOL(drm_connector_set_panel_orientation); -+ -+/** -+ * drm_connector_set_panel_orientation_with_quirk - -+ * set the connecter's panel_orientation after checking for quirks -+ * @connector: connector for which to init the panel-orientation property. -+ * @panel_orientation: drm_panel_orientation value to set -+ * @width: width in pixels of the panel, used for panel quirk detection -+ * @height: height in pixels of the panel, used for panel quirk detection -+ * -+ * Like drm_connector_set_panel_orientation(), but with a check for platform -+ * specific (e.g. DMI based) quirks overriding the passed in panel_orientation. -+ * -+ * Returns: -+ * Zero on success, negative errno on failure. -+ */ -+int drm_connector_set_panel_orientation_with_quirk( -+ struct drm_connector *connector, -+ enum drm_panel_orientation panel_orientation, -+ int width, int height) -+{ -+ int orientation_quirk; -+ -+ orientation_quirk = drm_get_panel_orientation_quirk(width, height); -+ if (orientation_quirk != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) -+ panel_orientation = orientation_quirk; -+ -+ return drm_connector_set_panel_orientation(connector, -+ panel_orientation); -+} -+EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk); - - int drm_connector_set_obj_prop(struct drm_mode_object *obj, - struct drm_property *property, -diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h -index 1d81bb31f..44b6c7f85 100644 ---- a/include/drm/drm_connector.h -+++ b/include/drm/drm_connector.h -@@ -1473,8 +1473,13 @@ int drm_connector_update_edid_property(struct drm_connector *connector, - const struct edid *edid); - void drm_connector_set_link_status_property(struct drm_connector *connector, - uint64_t link_status); --int drm_connector_init_panel_orientation_property( -- struct drm_connector *connector, int width, int height); -+int drm_connector_set_panel_orientation( -+ struct drm_connector *connector, -+ enum drm_panel_orientation panel_orientation); -+int drm_connector_set_panel_orientation_with_quirk( -+ struct drm_connector *connector, -+ enum drm_panel_orientation panel_orientation, -+ int width, int height); - - /** - * struct drm_tile_group - Tile group metadata --- -2.34.1 - diff --git a/projects/Rockchip/packages/linux/patches/RK3566-X55/0003-drm-panel-simple-Read-panel-orientation.patch b/projects/Rockchip/packages/linux/patches/RK3566-X55/0003-drm-panel-simple-Read-panel-orientation.patch deleted file mode 100644 index c76a3747d4..0000000000 --- a/projects/Rockchip/packages/linux/patches/RK3566-X55/0003-drm-panel-simple-Read-panel-orientation.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 953791baf27ea161378af5c78d8db337472507c8 Mon Sep 17 00:00:00 2001 -From: Dmitry Osipenko -Date: Fri, 14 Aug 2020 00:56:09 +0300 -Subject: [PATCH 3/4] drm/panel-simple: Read panel orientation - -The panel orientation needs to parsed from a device-tree and assigned to -the panel's connector in order to make orientation property available to -userspace. That's what this patch does for the panel-simple driver. - -Signed-off-by: Dmitry Osipenko -Signed-off-by: Sam Ravnborg -Link: https://patchwork.freedesktop.org/patch/msgid/20200813215609.28643-5-digetx@gmail.com ---- - drivers/gpu/drm/panel/panel-simple.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c -index f41d4e091..f10181b93 100644 ---- a/drivers/gpu/drm/panel/panel-simple.c -+++ b/drivers/gpu/drm/panel/panel-simple.c -@@ -127,6 +127,8 @@ struct panel_simple { - struct gpio_desc *spi_scl_gpio; - struct gpio_desc *spi_cs_gpio; - struct device_node *np_crtc; -+ -+ enum drm_panel_orientation orientation; - }; - - enum rockchip_cmd_type { -@@ -442,6 +444,9 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel) - if (panel->desc->bus_flags) - connector->display_info.bus_flags = panel->desc->bus_flags; - -+ /* set up connector's "panel orientation" property */ -+ drm_connector_set_panel_orientation(connector, panel->orientation); -+ - return num; - } - -@@ -789,6 +794,12 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc) - return -EPROBE_DEFER; - } - -+ err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation); -+ if (err) { -+ dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err); -+ return err; -+ } -+ - ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0); - if (ddc) { - panel->ddc = of_find_i2c_adapter_by_node(ddc); --- -2.34.1 - diff --git a/projects/Rockchip/packages/linux/patches/RK3566-X55/0004-dts-Define-the-orientation-of-the-Powkiddy-X55-panel.patch b/projects/Rockchip/packages/linux/patches/RK3566-X55/0004-dts-Define-the-orientation-of-the-Powkiddy-X55-panel.patch deleted file mode 100644 index 8db6d4847b..0000000000 --- a/projects/Rockchip/packages/linux/patches/RK3566-X55/0004-dts-Define-the-orientation-of-the-Powkiddy-X55-panel.patch +++ /dev/null @@ -1,25 +0,0 @@ -From ad469e3890607d81f4b6ee0f8035537d76937370 Mon Sep 17 00:00:00 2001 -From: Johnny on Flame -Date: Mon, 7 Aug 2023 20:59:28 +0000 -Subject: [PATCH 4/4] dts: Define the orientation of the Powkiddy X55 panel. - ---- - .../boot/dts/rockchip/lcd/lcd_HX8394F_720x1280_mipi_dsi0.dtsi | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/arm64/boot/dts/rockchip/lcd/lcd_HX8394F_720x1280_mipi_dsi0.dtsi b/arch/arm64/boot/dts/rockchip/lcd/lcd_HX8394F_720x1280_mipi_dsi0.dtsi -index 5eb492203..b3745a81b 100755 ---- a/arch/arm64/boot/dts/rockchip/lcd/lcd_HX8394F_720x1280_mipi_dsi0.dtsi -+++ b/arch/arm64/boot/dts/rockchip/lcd/lcd_HX8394F_720x1280_mipi_dsi0.dtsi -@@ -16,7 +16,7 @@ - init-delay-ms = <60>; - unprepare-delay-ms = <60>; - disable-delay-ms = <60>; -- -+ rotation = <90>; - - dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | - MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>; --- -2.34.1 - diff --git a/projects/Rockchip/packages/linux/patches/RK3566-X55/0005-disable-enum-int-mismatch-warning.patch b/projects/Rockchip/packages/linux/patches/RK3566-X55/0005-disable-enum-int-mismatch-warning.patch deleted file mode 100644 index 4789856575..0000000000 --- a/projects/Rockchip/packages/linux/patches/RK3566-X55/0005-disable-enum-int-mismatch-warning.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/Makefile b/Makefile -index 1c06eae06..9465e5561 100755 ---- a/Makefile -+++ b/Makefile -@@ -710,6 +710,7 @@ KBUILD_CFLAGS += $(call cc-disable-warning, array-compare) - KBUILD_CFLAGS += $(call cc-disable-warning, stringop-overread) - KBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer) - KBUILD_CFLAGS += $(call cc-disable-warning, address) -+KBUILD_CFLAGS += $(call cc-disable-warning, enum-int-mismatch) - - ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE - KBUILD_CFLAGS += -Os diff --git a/projects/Rockchip/packages/linux/patches/RK3566/0001-drm-panel-Add-helper-for-reading-DT-rotation.patch b/projects/Rockchip/packages/linux/patches/RK3566/0001-drm-panel-Add-helper-for-reading-DT-rotation.patch deleted file mode 100644 index b0cc4f5e31..0000000000 --- a/projects/Rockchip/packages/linux/patches/RK3566/0001-drm-panel-Add-helper-for-reading-DT-rotation.patch +++ /dev/null @@ -1,103 +0,0 @@ -From c74b76bb8a4da44a9f8cf06f4aba9f3334e1a148 Mon Sep 17 00:00:00 2001 -From: Derek Basehore -Date: Tue, 9 Jul 2019 19:16:56 -0700 -Subject: [PATCH 1/4] drm/panel: Add helper for reading DT rotation - -This adds a helper function for reading the rotation (panel -orientation) from the device tree. - -Signed-off-by: Derek Basehore ---- - drivers/gpu/drm/drm_panel.c | 43 +++++++++++++++++++++++++++++++++++++ - include/drm/drm_panel.h | 9 ++++++++ - 2 files changed, 52 insertions(+) - -diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c -index d37b83f40..b2d8fa2c3 100644 ---- a/drivers/gpu/drm/drm_panel.c -+++ b/drivers/gpu/drm/drm_panel.c -@@ -168,6 +168,49 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np) - return ERR_PTR(-EPROBE_DEFER); - } - EXPORT_SYMBOL(of_drm_find_panel); -+ -+/** -+ * of_drm_get_panel_orientation - look up the orientation of the panel through -+ * the "rotation" binding from a device tree node -+ * @np: device tree node of the panel -+ * @orientation: orientation enum to be filled in -+ * -+ * Looks up the rotation of a panel in the device tree. The orientation of the -+ * panel is expressed as a property name "rotation" in the device tree. The -+ * rotation in the device tree is counter clockwise. -+ * -+ * Return: 0 when a valid rotation value (0, 90, 180, or 270) is read or the -+ * rotation property doesn't exist. -EERROR otherwise. -+ */ -+int of_drm_get_panel_orientation(const struct device_node *np, -+ enum drm_panel_orientation *orientation) -+{ -+ int rotation, ret; -+ -+ ret = of_property_read_u32(np, "rotation", &rotation); -+ if (ret == -EINVAL) { -+ /* Don't return an error if there's no rotation property. */ -+ *orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN; -+ return 0; -+ } -+ -+ if (ret < 0) -+ return ret; -+ -+ if (rotation == 0) -+ *orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL; -+ else if (rotation == 90) -+ *orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP; -+ else if (rotation == 180) -+ *orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP; -+ else if (rotation == 270) -+ *orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP; -+ else -+ return -EINVAL; -+ -+ return 0; -+} -+EXPORT_SYMBOL(of_drm_get_panel_orientation); - #endif - - int drm_panel_notifier_register(struct drm_panel *panel, -diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h -index 6aab8fefc..c58c4c19f 100644 ---- a/include/drm/drm_panel.h -+++ b/include/drm/drm_panel.h -@@ -53,6 +53,8 @@ struct drm_device; - struct drm_panel; - struct display_timing; - -+enum drm_panel_orientation; -+ - /** - * @loader_protect: protect loader logo panel's power - * struct drm_panel_funcs - perform operations on a given panel -@@ -240,11 +242,18 @@ int drm_panel_notifier_call_chain(struct drm_panel *panel, - - #if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL) - struct drm_panel *of_drm_find_panel(const struct device_node *np); -+int of_drm_get_panel_orientation(const struct device_node *np, -+ enum drm_panel_orientation *orientation); - #else - static inline struct drm_panel *of_drm_find_panel(const struct device_node *np) - { - return ERR_PTR(-ENODEV); - } -+static inline int of_drm_get_panel_orientation(const struct device_node *np, -+ enum drm_panel_orientation *orientation) -+{ -+ return -ENODEV; -+} - #endif - - #endif --- -2.34.1 - diff --git a/projects/Rockchip/packages/linux/patches/RK3566/0002-drm-connector-Split-out-orientation-quirk-detection-.patch b/projects/Rockchip/packages/linux/patches/RK3566/0002-drm-connector-Split-out-orientation-quirk-detection-.patch deleted file mode 100644 index 23f41607b7..0000000000 --- a/projects/Rockchip/packages/linux/patches/RK3566/0002-drm-connector-Split-out-orientation-quirk-detection-.patch +++ /dev/null @@ -1,171 +0,0 @@ -From b76306d4adb2e169f8425fb417de565d555fcf22 Mon Sep 17 00:00:00 2001 -From: Derek Basehore -Date: Sun, 5 Jan 2020 16:51:19 +0100 -Subject: [PATCH 2/4] drm/connector: Split out orientation quirk detection (v2) - -Not every platform needs quirk detection for panel orientation, so -split the drm_connector_init_panel_orientation_property into two -functions. One for platforms without the need for quirks, and the -other for platforms that need quirks. - -Hans de Goede (changes in v2): - -Rename the function from drm_connector_init_panel_orientation_property -to drm_connector_set_panel_orientation[_with_quirk] and pass in the -panel-orientation to set. - -Beside the rename, also make the function set the passed in value -only once, if the value was set before (to a value other then -DRM_MODE_PANEL_ORIENTATION_UNKNOWN) make any further set calls a no-op. - -This change is preparation for allowing the user to override the -panel-orientation for any connector from the kernel commandline. -When the panel-orientation is overridden this way, then we must ignore -the panel-orientation detection done by the driver. - -Reviewed-by: Rodrigo Vivi -Signed-off-by: Derek Basehore -Signed-off-by: Hans de Goede -Acked-by: Jani Nikula -Link: https://patchwork.freedesktop.org/patch/msgid/20200105155120.96466-1-hdegoede@redhat.com ---- - drivers/gpu/drm/drm_connector.c | 74 ++++++++++++++++++++++++--------- - include/drm/drm_connector.h | 9 +++- - 2 files changed, 61 insertions(+), 22 deletions(-) - -diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c -index 8a2a1965e..77a2087bf 100644 ---- a/drivers/gpu/drm/drm_connector.c -+++ b/drivers/gpu/drm/drm_connector.c -@@ -996,7 +996,8 @@ static const struct drm_prop_enum_list dp_colorspaces[] = { - * coordinates, so if userspace rotates the picture to adjust for - * the orientation it must also apply the same transformation to the - * touchscreen input coordinates. This property is initialized by calling -- * drm_connector_init_panel_orientation_property(). -+ * drm_connector_set_panel_orientation() or -+ * drm_connector_set_panel_orientation_with_quirk() - * - * scaling mode: - * This property defines how a non-native mode is upscaled to the native -@@ -1713,38 +1714,41 @@ void drm_connector_set_link_status_property(struct drm_connector *connector, - EXPORT_SYMBOL(drm_connector_set_link_status_property); - - /** -- * drm_connector_init_panel_orientation_property - -- * initialize the connecters panel_orientation property -- * @connector: connector for which to init the panel-orientation property. -- * @width: width in pixels of the panel, used for panel quirk detection -- * @height: height in pixels of the panel, used for panel quirk detection -+ * drm_connector_set_panel_orientation - sets the connecter's panel_orientation -+ * @connector: connector for which to set the panel-orientation property. -+ * @panel_orientation: drm_panel_orientation value to set -+ * -+ * This function sets the connector's panel_orientation and attaches -+ * a "panel orientation" property to the connector. - * -- * This function should only be called for built-in panels, after setting -- * connector->display_info.panel_orientation first (if known). -+ * Calling this function on a connector where the panel_orientation has -+ * already been set is a no-op (e.g. the orientation has been overridden with -+ * a kernel commandline option). - * -- * This function will check for platform specific (e.g. DMI based) quirks -- * overriding display_info.panel_orientation first, then if panel_orientation -- * is not DRM_MODE_PANEL_ORIENTATION_UNKNOWN it will attach the -- * "panel orientation" property to the connector. -+ * It is allowed to call this function with a panel_orientation of -+ * DRM_MODE_PANEL_ORIENTATION_UNKNOWN, in which case it is a no-op. - * - * Returns: - * Zero on success, negative errno on failure. - */ --int drm_connector_init_panel_orientation_property( -- struct drm_connector *connector, int width, int height) -+int drm_connector_set_panel_orientation( -+ struct drm_connector *connector, -+ enum drm_panel_orientation panel_orientation) - { - struct drm_device *dev = connector->dev; - struct drm_display_info *info = &connector->display_info; - struct drm_property *prop; -- int orientation_quirk; - -- orientation_quirk = drm_get_panel_orientation_quirk(width, height); -- if (orientation_quirk != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) -- info->panel_orientation = orientation_quirk; -+ /* Already set? */ -+ if (info->panel_orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) -+ return 0; - -- if (info->panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN) -+ /* Don't attach the property if the orientation is unknown */ -+ if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN) - return 0; - -+ info->panel_orientation = panel_orientation; -+ - prop = dev->mode_config.panel_orientation_property; - if (!prop) { - prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE, -@@ -1761,7 +1765,37 @@ int drm_connector_init_panel_orientation_property( - info->panel_orientation); - return 0; - } --EXPORT_SYMBOL(drm_connector_init_panel_orientation_property); -+EXPORT_SYMBOL(drm_connector_set_panel_orientation); -+ -+/** -+ * drm_connector_set_panel_orientation_with_quirk - -+ * set the connecter's panel_orientation after checking for quirks -+ * @connector: connector for which to init the panel-orientation property. -+ * @panel_orientation: drm_panel_orientation value to set -+ * @width: width in pixels of the panel, used for panel quirk detection -+ * @height: height in pixels of the panel, used for panel quirk detection -+ * -+ * Like drm_connector_set_panel_orientation(), but with a check for platform -+ * specific (e.g. DMI based) quirks overriding the passed in panel_orientation. -+ * -+ * Returns: -+ * Zero on success, negative errno on failure. -+ */ -+int drm_connector_set_panel_orientation_with_quirk( -+ struct drm_connector *connector, -+ enum drm_panel_orientation panel_orientation, -+ int width, int height) -+{ -+ int orientation_quirk; -+ -+ orientation_quirk = drm_get_panel_orientation_quirk(width, height); -+ if (orientation_quirk != DRM_MODE_PANEL_ORIENTATION_UNKNOWN) -+ panel_orientation = orientation_quirk; -+ -+ return drm_connector_set_panel_orientation(connector, -+ panel_orientation); -+} -+EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk); - - int drm_connector_set_obj_prop(struct drm_mode_object *obj, - struct drm_property *property, -diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h -index 1d81bb31f..44b6c7f85 100644 ---- a/include/drm/drm_connector.h -+++ b/include/drm/drm_connector.h -@@ -1473,8 +1473,13 @@ int drm_connector_update_edid_property(struct drm_connector *connector, - const struct edid *edid); - void drm_connector_set_link_status_property(struct drm_connector *connector, - uint64_t link_status); --int drm_connector_init_panel_orientation_property( -- struct drm_connector *connector, int width, int height); -+int drm_connector_set_panel_orientation( -+ struct drm_connector *connector, -+ enum drm_panel_orientation panel_orientation); -+int drm_connector_set_panel_orientation_with_quirk( -+ struct drm_connector *connector, -+ enum drm_panel_orientation panel_orientation, -+ int width, int height); - - /** - * struct drm_tile_group - Tile group metadata --- -2.34.1 - diff --git a/projects/Rockchip/packages/linux/patches/RK3566/0003-drm-panel-simple-Read-panel-orientation.patch b/projects/Rockchip/packages/linux/patches/RK3566/0003-drm-panel-simple-Read-panel-orientation.patch deleted file mode 100644 index c76a3747d4..0000000000 --- a/projects/Rockchip/packages/linux/patches/RK3566/0003-drm-panel-simple-Read-panel-orientation.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 953791baf27ea161378af5c78d8db337472507c8 Mon Sep 17 00:00:00 2001 -From: Dmitry Osipenko -Date: Fri, 14 Aug 2020 00:56:09 +0300 -Subject: [PATCH 3/4] drm/panel-simple: Read panel orientation - -The panel orientation needs to parsed from a device-tree and assigned to -the panel's connector in order to make orientation property available to -userspace. That's what this patch does for the panel-simple driver. - -Signed-off-by: Dmitry Osipenko -Signed-off-by: Sam Ravnborg -Link: https://patchwork.freedesktop.org/patch/msgid/20200813215609.28643-5-digetx@gmail.com ---- - drivers/gpu/drm/panel/panel-simple.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c -index f41d4e091..f10181b93 100644 ---- a/drivers/gpu/drm/panel/panel-simple.c -+++ b/drivers/gpu/drm/panel/panel-simple.c -@@ -127,6 +127,8 @@ struct panel_simple { - struct gpio_desc *spi_scl_gpio; - struct gpio_desc *spi_cs_gpio; - struct device_node *np_crtc; -+ -+ enum drm_panel_orientation orientation; - }; - - enum rockchip_cmd_type { -@@ -442,6 +444,9 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel) - if (panel->desc->bus_flags) - connector->display_info.bus_flags = panel->desc->bus_flags; - -+ /* set up connector's "panel orientation" property */ -+ drm_connector_set_panel_orientation(connector, panel->orientation); -+ - return num; - } - -@@ -789,6 +794,12 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc) - return -EPROBE_DEFER; - } - -+ err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation); -+ if (err) { -+ dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err); -+ return err; -+ } -+ - ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0); - if (ddc) { - panel->ddc = of_find_i2c_adapter_by_node(ddc); --- -2.34.1 - diff --git a/projects/Rockchip/packages/linux/patches/RK3566/0005-disable-enum-int-mismatch-warning.patch b/projects/Rockchip/packages/linux/patches/RK3566/0005-disable-enum-int-mismatch-warning.patch deleted file mode 100644 index 0d5460e5a9..0000000000 --- a/projects/Rockchip/packages/linux/patches/RK3566/0005-disable-enum-int-mismatch-warning.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/Makefile b/Makefile -index 60197900e..b0d6dbe83 100644 ---- a/Makefile -+++ b/Makefile -@@ -710,6 +710,7 @@ KBUILD_CFLAGS += $(call cc-disable-warning, array-compare) - KBUILD_CFLAGS += $(call cc-disable-warning, stringop-overread) - KBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer) - KBUILD_CFLAGS += $(call cc-disable-warning, address) -+KBUILD_CFLAGS += $(call cc-disable-warning, enum-int-mismatch) - - ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE - KBUILD_CFLAGS += -Os diff --git a/projects/Rockchip/packages/linux/patches/RK3566/001-fix-anbernic-model-names.patch b/projects/Rockchip/packages/linux/patches/RK3566/001-fix-anbernic-model-names.patch new file mode 100644 index 0000000000..aac0fbffaa --- /dev/null +++ b/projects/Rockchip/packages/linux/patches/RK3566/001-fix-anbernic-model-names.patch @@ -0,0 +1,60 @@ +diff -rupN linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts +--- linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts 2023-10-03 23:48:15.144113656 +0000 ++++ linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts 2023-10-03 23:48:55.102040451 +0000 +@@ -8,7 +8,7 @@ + #include "rk3566-anbernic-rg353x.dtsi" + + / { +- model = "RG353P"; ++ model = "Anbernic RG353P"; + compatible = "anbernic,rg353p", "rockchip,rk3566"; + + aliases { +diff -rupN linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts +--- linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts 2023-10-03 23:48:15.144113656 +0000 ++++ linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts 2023-10-03 23:49:18.163158275 +0000 +@@ -8,7 +8,7 @@ + #include "rk3566-anbernic-rg353x.dtsi" + + / { +- model = "RG353PS"; ++ model = "Anbernic RG353PS"; + compatible = "anbernic,rg353ps", "rockchip,rk3566"; + + aliases { +diff -rupN linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353v.dts linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353v.dts +--- linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353v.dts 2023-10-03 23:48:15.144113656 +0000 ++++ linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353v.dts 2023-10-03 23:49:09.254725978 +0000 +@@ -8,7 +8,7 @@ + #include "rk3566-anbernic-rg353x.dtsi" + + / { +- model = "RG353V"; ++ model = "Anbernic RG353V"; + compatible = "anbernic,rg353v", "rockchip,rk3566"; + + aliases { +diff -rupN linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353vs.dts linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353vs.dts +--- linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353vs.dts 2023-10-03 23:48:15.144113656 +0000 ++++ linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353vs.dts 2023-10-03 23:49:30.947779716 +0000 +@@ -8,7 +8,7 @@ + #include "rk3566-anbernic-rg353x.dtsi" + + / { +- model = "RG353VS"; ++ model = "Anbernic RG353VS"; + compatible = "anbernic,rg353vs", "rockchip,rk3566"; + + aliases { +diff -rupN linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts +--- linux-6.6-rc3.orig/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts 2023-10-03 23:48:15.144113656 +0000 ++++ linux-6.6-rc3/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts 2023-10-03 23:49:41.912313646 +0000 +@@ -8,7 +8,7 @@ + #include "rk3566-anbernic-rgxx3.dtsi" + + / { +- model = "RG503"; ++ model = "Anbernic RG503"; + compatible = "anbernic,rg503", "rockchip,rk3566"; + + aliases { diff --git a/projects/Rockchip/packages/linux/patches/RK3566/002-rk817-power-driver-names.patch b/projects/Rockchip/packages/linux/patches/RK3566/002-rk817-power-driver-names.patch new file mode 100644 index 0000000000..265df75ad8 --- /dev/null +++ b/projects/Rockchip/packages/linux/patches/RK3566/002-rk817-power-driver-names.patch @@ -0,0 +1,21 @@ +diff -rupN linux-6.6-orig/drivers/power/supply/rk817_charger.c linux-6.6/drivers/power/supply/rk817_charger.c +--- linux-6.6-orig/drivers/power/supply/rk817_charger.c 2023-10-30 02:31:08.000000000 +0000 ++++ linux-6.6/drivers/power/supply/rk817_charger.c 2023-11-22 19:43:15.957223087 +0000 +@@ -679,7 +679,7 @@ static enum power_supply_usb_type rk817_ + }; + + static const struct power_supply_desc rk817_bat_desc = { +- .name = "rk817-battery", ++ .name = "battery", + .type = POWER_SUPPLY_TYPE_BATTERY, + .properties = rk817_bat_props, + .num_properties = ARRAY_SIZE(rk817_bat_props), +@@ -687,7 +687,7 @@ static const struct power_supply_desc rk + }; + + static const struct power_supply_desc rk817_chg_desc = { +- .name = "rk817-charger", ++ .name = "charger", + .type = POWER_SUPPLY_TYPE_USB, + .usb_types = rk817_usb_type, + .num_usb_types = ARRAY_SIZE(rk817_usb_type), diff --git a/projects/Rockchip/packages/linux/patches/RK3566/007-rk2023-display-mode.patch b/projects/Rockchip/packages/linux/patches/RK3566/007-rk2023-display-mode.patch new file mode 100644 index 0000000000..3d029df049 --- /dev/null +++ b/projects/Rockchip/packages/linux/patches/RK3566/007-rk2023-display-mode.patch @@ -0,0 +1,32 @@ +diff --git a/drivers/gpu/drm/panel/panel-newvision-nv3051d.c b/drivers/gpu/drm/panel/panel-newvision-nv3051d.c +index 94d89ffd596..923e4df1420 100644 +--- a/drivers/gpu/drm/panel/panel-newvision-nv3051d.c ++++ b/drivers/gpu/drm/panel/panel-newvision-nv3051d.c +@@ -477,18 +477,18 @@ static const struct drm_display_mode nv3051d_rgxx3_modes[] = { + }; + + static const struct drm_display_mode nv3051d_rk2023_modes[] = { +- { ++ { + .hdisplay = 640, +- .hsync_start = 640 + 40, +- .hsync_end = 640 + 40 + 2, +- .htotal = 640 + 40 + 2 + 80, ++ .hsync_start = 640 + 64, ++ .hsync_end = 640 + 64 + 2, ++ .htotal = 640 + 64 + 2 + 80, + .vdisplay = 480, +- .vsync_start = 480 + 18, +- .vsync_end = 480 + 18 + 2, +- .vtotal = 480 + 18 + 2 + 4, +- .clock = 24150, ++ .vsync_start = 480 + 2, ++ .vsync_end = 480 + 2 + 4, ++ .vtotal = 480 + 2 + 4 + 3, ++ .clock = 23040, + .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, +- }, ++ } + }; + + static const struct nv3051d_panel_info nv3051d_rg351v_info = { diff --git a/projects/Rockchip/packages/linux/patches/RK3566/008-invert-abs-helper.patch b/projects/Rockchip/packages/linux/patches/RK3566/008-invert-abs-helper.patch new file mode 100644 index 0000000000..afb829f4a2 --- /dev/null +++ b/projects/Rockchip/packages/linux/patches/RK3566/008-invert-abs-helper.patch @@ -0,0 +1,71 @@ +From: Chris Morgan +To: linux-input@vger.kernel.org +Cc: dmitry.torokhov@gmail.com, hdegoede@redhat.com, + paul@crapouillou.net, peter.hutterer@who-t.net, svv@google.com, + biswarupp@google.com, contact@artur-rojek.eu, + Chris Morgan +Subject: [PATCH 1/2] Input: add input_invert_abs() +Date: Sun, 31 Dec 2023 14:56:42 -0600 [thread overview] +Message-ID: <20231231205643.129435-2-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231231205643.129435-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Add a helper function to make it easier for a driver to invert abs +values when needed. It is up to the driver itself to track axes that +need to be inverted and normalize the data before it is passed on. + +This function assumes that drivers will set the min and max values +so that min < max and then will simply call this function each time +the values need to be inverted. + +Signed-off-by: Chris Morgan +--- + drivers/input/input.c | 19 +++++++++++++++++++ + include/linux/input.h | 1 + + 2 files changed, 20 insertions(+) + +diff --git a/drivers/input/input.c b/drivers/input/input.c +index 8c5fdb0f858a..f135aed165a1 100644 +--- a/drivers/input/input.c ++++ b/drivers/input/input.c +@@ -552,6 +552,25 @@ void input_copy_abs(struct input_dev *dst, unsigned int dst_axis, + } + EXPORT_SYMBOL(input_copy_abs); + ++/** ++ * input_invert_abs - Invert the abs value for an inverted axis. ++ * @dev: Input device with absolute events ++ * @axis: ABS_* value selecting the destination axis for the event to ++ * invert. ++ * @val: Value to be inverted based on min and max values of the axis. ++ * ++ * Return an inverted value for a given ABS axis based on its min and ++ * max values. ++ */ ++int input_invert_abs(struct input_dev *dev, unsigned int axis, int val) ++{ ++ int min = dev->absinfo[axis].minimum; ++ int max = dev->absinfo[axis].maximum; ++ ++ return (max + min) - val; ++} ++EXPORT_SYMBOL(input_invert_abs); ++ + /** + * input_grab_device - grabs device for exclusive use + * @handle: input handle that wants to own the device +diff --git a/include/linux/input.h b/include/linux/input.h +index de6503c0edb8..deb5f8bb0ec7 100644 +--- a/include/linux/input.h ++++ b/include/linux/input.h +@@ -477,6 +477,7 @@ void input_set_abs_params(struct input_dev *dev, unsigned int axis, + int min, int max, int fuzz, int flat); + void input_copy_abs(struct input_dev *dst, unsigned int dst_axis, + const struct input_dev *src, unsigned int src_axis); ++int input_invert_abs(struct input_dev *dev, unsigned int axis, int val); + + #define INPUT_GENERATE_ABS_ACCESSORS(_suffix, _item) \ + static inline int input_abs_get_##_suffix(struct input_dev *dev, \ +-- +2.34.1 diff --git a/projects/Rockchip/packages/linux/patches/RK3566/009-invert-abs.patch b/projects/Rockchip/packages/linux/patches/RK3566/009-invert-abs.patch new file mode 100644 index 0000000000..5635651a1c --- /dev/null +++ b/projects/Rockchip/packages/linux/patches/RK3566/009-invert-abs.patch @@ -0,0 +1,77 @@ +From: Chris Morgan +To: linux-input@vger.kernel.org +Cc: dmitry.torokhov@gmail.com, hdegoede@redhat.com, + paul@crapouillou.net, peter.hutterer@who-t.net, svv@google.com, + biswarupp@google.com, contact@artur-rojek.eu, + Chris Morgan +Subject: [PATCH 2/2] Input: adc-joystick: Handle inverted axes +Date: Sun, 31 Dec 2023 14:56:43 -0600 [thread overview] +Message-ID: <20231231205643.129435-3-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231231205643.129435-1-macroalpha82@gmail.com> + +From: Chris Morgan + +When one or more axes are inverted, (where min > max), normalize the +data so that min < max and call a helper function to invert the +values reported to the input stack. + +This ensures we can continue defining the device correctly in the +device tree while not breaking downstream assumptions that min is +always less than max. + +Signed-off-by: Chris Morgan +--- + drivers/input/joystick/adc-joystick.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/drivers/input/joystick/adc-joystick.c b/drivers/input/joystick/adc-joystick.c +index c0deff5d4282..4e8d446987b6 100644 +--- a/drivers/input/joystick/adc-joystick.c ++++ b/drivers/input/joystick/adc-joystick.c +@@ -18,6 +18,7 @@ struct adc_joystick_axis { + s32 range[2]; + s32 fuzz; + s32 flat; ++ bool inverted; + }; + + struct adc_joystick { +@@ -38,6 +39,8 @@ static void adc_joystick_poll(struct input_dev *input) + ret = iio_read_channel_raw(&joy->chans[i], &val); + if (ret < 0) + return; ++ if (joy->axes[i].inverted) ++ val = input_invert_abs(input, i, val); + input_report_abs(input, joy->axes[i].code, val); + } + input_sync(input); +@@ -86,6 +89,8 @@ static int adc_joystick_handle(const void *data, void *private) + val = sign_extend32(val, msb); + else + val &= GENMASK(msb, 0); ++ if (joy->axes[i].inverted) ++ val = input_invert_abs(joy->input, i, val); + input_report_abs(joy->input, joy->axes[i].code, val); + } + +@@ -168,11 +173,17 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy) + goto err_fwnode_put; + } + ++ if (axes[i].range[0] > axes[i].range[1]) { ++ dev_dbg(dev, "abs-axis %d inverted\n", i); ++ axes[i].inverted = 1; ++ } ++ + fwnode_property_read_u32(child, "abs-fuzz", &axes[i].fuzz); + fwnode_property_read_u32(child, "abs-flat", &axes[i].flat); + + input_set_abs_params(joy->input, axes[i].code, +- axes[i].range[0], axes[i].range[1], ++ min_array(axes[i].range, 2), ++ max_array(axes[i].range, 2), + axes[i].fuzz, axes[i].flat); + input_set_capability(joy->input, EV_ABS, axes[i].code); + } +-- +2.34.1 diff --git a/projects/Rockchip/packages/linux/patches/RK3566/010-powkiddy-rgb10max3.patch b/projects/Rockchip/packages/linux/patches/RK3566/010-powkiddy-rgb10max3.patch new file mode 100644 index 0000000000..3b9a63ddef --- /dev/null +++ b/projects/Rockchip/packages/linux/patches/RK3566/010-powkiddy-rgb10max3.patch @@ -0,0 +1,261 @@ +diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile +index b7371afb6227..2ee31fc6bd8e 100644 +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -79,6 +79,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-anbernic-rg503.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.1.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.2.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-rgb30.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-rgb10max3.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-rk2023.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-quartz64-a.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-quartz64-b.dtb +diff --git a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts +new file mode 100644 +index 000000000000..26884dfda818 +--- /dev/null ++++ b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts +@@ -0,0 +1,40 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++ ++/dts-v1/; ++ ++#include ++#include ++#include ++#include "rk3566-powkiddy-rk2023.dtsi" ++ ++/ { ++ model = "Powkiddy RGB10 Max 3"; ++ compatible = "powkiddy,rgb10max3", "rockchip,rk3566"; ++}; ++ ++&cru { ++ assigned-clocks = <&pmucru CLK_RTC_32K>, <&cru PLL_GPLL>, ++ <&pmucru PLL_PPLL>, <&cru PLL_VPLL>; ++ assigned-clock-rates = <32768>, <1200000000>, ++ <200000000>, <292500000>; ++}; ++ ++&dsi0 { ++ panel: panel@0 { ++ compatible = "powkiddy,rgb10max3-panel"; ++ reg = <0>; ++ backlight = <&backlight>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&lcd_rst>; ++ reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>; ++ vcc-supply = <&vcc3v3_lcd0_n>; ++ iovcc-supply = <&vcc3v3_lcd0_n>; ++ rotation = <270>; ++ ++ port { ++ mipi_in_panel: endpoint { ++ remote-endpoint = <&mipi_out_panel>; ++ }; ++ }; ++ }; ++}; +diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c +index b55bafd1a8be..e8d1730241b4 100644 +--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c ++++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c +@@ -58,7 +58,7 @@ struct st7703 { + struct gpio_desc *reset_gpio; + struct regulator *vcc; + struct regulator *iovcc; +- bool prepared; ++ enum drm_panel_orientation orientation; + + struct dentry *debugfs; + const struct st7703_panel_desc *desc; +@@ -493,6 +493,76 @@ static int rgb30panel_init_sequence(struct st7703 *ctx) + 0x13, 0x15, 0x14, 0x15, 0x10, 0x17, 0x00, 0x0a, + 0x0f, 0x29, 0x3b, 0x3f, 0x42, 0x39, 0x06, 0x0d, + 0x10, 0x13, 0x15, 0x14, 0x15, 0x10, 0x17); ++ return 0; ++} ++ ++static int rgb10max3_init_sequence(struct st7703 *ctx) ++{ ++ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); ++ ++ /* ++ * Init sequence was supplied by the panel vendor. ++ */ ++ ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETEXTC, 0xf1, 0x12, 0x83); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETAPID, 0x00, 0x00, 0x00, ++ 0xda, 0x80); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETDISP, 0xc8, 0x02, 0x30); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETRGBIF, 0x10, 0x10, 0x28, ++ 0x28, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETCYC, 0x80); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETBGP, 0x04, 0x04); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETVCOM, 0x78, 0x78); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER_EXT, 0x25, 0x22, 0xf0, ++ 0x63); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETMIPI, 0x33, 0x81, 0x05, 0xf9, ++ 0x0e, 0x0e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x44, 0x25, 0x00, 0x90, 0x0a, 0x00, ++ 0x00, 0x01, 0x4f, 0x01, 0x00, 0x00, 0x37); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETVDC, 0x47); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_BF, 0x02, 0x11, 0x00); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETSCR, 0x73, 0x73, 0x50, 0x50, ++ 0x00, 0x00, 0x12, 0x70, 0x00); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER, 0x25, 0x00, 0x32, ++ 0x32, 0x77, 0xe1, 0xff, 0xff, 0xcc, 0xcc, 0x77, ++ 0x77); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETECO, 0x82, 0x00, 0xbf, 0xff, ++ 0x00, 0xff); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETIO, 0xb8, 0x00, 0x0a, 0x00, ++ 0x00, 0x00); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETCABC, 0x10, 0x40, 0x1e, ++ 0x02); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETPANEL, 0x0b); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETGAMMA, 0x00, 0x04, 0x07, ++ 0x2a, 0x39, 0x3f, 0x36, 0x31, 0x06, 0x0b, 0x0e, ++ 0x12, 0x14, 0x12, 0x13, 0x0f, 0x17, 0x00, 0x04, ++ 0x07, 0x2a, 0x39, 0x3f, 0x36, 0x31, 0x06, 0x0b, ++ 0x0e, 0x12, 0x14, 0x12, 0x13, 0x0f, 0x17); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETEQ, 0x03, 0x03, 0x03, 0x03, ++ 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, ++ 0xc0, 0x10); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP1, 0xc8, 0x10, 0x08, 0x00, ++ 0x00, 0x41, 0xf8, 0x12, 0x31, 0x23, 0x37, 0x86, ++ 0x11, 0xc8, 0x37, 0x2a, 0x00, 0x00, 0x0c, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, ++ 0x88, 0x20, 0x46, 0x02, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0xff, 0x88, 0x31, 0x57, 0x13, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP2, 0x00, 0x1a, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x8f, 0x13, 0x31, 0x75, 0x88, 0x88, 0x88, 0x88, ++ 0x88, 0x88, 0xf8, 0x8f, 0x02, 0x20, 0x64, 0x88, ++ 0x88, 0x88, 0x88, 0x88, 0x88, 0xf8, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00); ++ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_EF, 0xff, 0xff, 0x01); ++ ++ ++ + + return 0; + } +@@ -512,6 +582,21 @@ static const struct drm_display_mode rgb30panel_mode = { + .height_mm = 76, + }; + ++static const struct drm_display_mode rgb10max3panel_mode = { ++ .hdisplay = 720, ++ .hsync_start = 720 + 60, ++ .hsync_end = 720 + 60 + 10, ++ .htotal = 720 + 60 + 10 + 20, ++ .vdisplay = 1280, ++ .vsync_start = 1280 + 16, ++ .vsync_end = 1280 + 16 + 4, ++ .vtotal = 1280 + 16 + 4 + 14, ++ .clock = 60000, ++ .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, ++ .width_mm = 63, ++ .height_mm = 111, ++}; ++ + static const struct st7703_panel_desc rgb30panel_desc = { + .mode = &rgb30panel_mode, + .lanes = 4, +@@ -521,6 +606,15 @@ static const struct st7703_panel_desc rgb30panel_desc = { + .init_sequence = rgb30panel_init_sequence, + }; + ++static const struct st7703_panel_desc rgb10max3panel_desc = { ++ .mode = &rgb10max3panel_mode, ++ .lanes = 4, ++ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | ++ MIPI_DSI_MODE_NO_EOT_PACKET | MIPI_DSI_MODE_LPM, ++ .format = MIPI_DSI_FMT_RGB888, ++ .init_sequence = rgb10max3_init_sequence, ++}; ++ + static int st7703_enable(struct drm_panel *panel) + { + struct st7703 *ctx = panel_to_st7703(panel); +@@ -575,13 +669,9 @@ static int st7703_unprepare(struct drm_panel *panel) + { + struct st7703 *ctx = panel_to_st7703(panel); + +- if (!ctx->prepared) +- return 0; +- + gpiod_set_value_cansleep(ctx->reset_gpio, 1); + regulator_disable(ctx->iovcc); + regulator_disable(ctx->vcc); +- ctx->prepared = false; + + return 0; + } +@@ -591,9 +681,6 @@ static int st7703_prepare(struct drm_panel *panel) + struct st7703 *ctx = panel_to_st7703(panel); + int ret; + +- if (ctx->prepared) +- return 0; +- + dev_dbg(ctx->dev, "Resetting the panel\n"); + gpiod_set_value_cansleep(ctx->reset_gpio, 1); + +@@ -616,8 +703,6 @@ static int st7703_prepare(struct drm_panel *panel) + gpiod_set_value_cansleep(ctx->reset_gpio, 0); + usleep_range(15000, 20000); + +- ctx->prepared = true; +- + return 0; + } + +@@ -653,12 +738,20 @@ static int st7703_get_modes(struct drm_panel *panel, + return 1; + } + ++static enum drm_panel_orientation st7703_get_orientation(struct drm_panel *panel) ++{ ++ struct st7703 *ctx = panel_to_st7703(panel); ++ ++ return ctx->orientation; ++} ++ + static const struct drm_panel_funcs st7703_drm_funcs = { + .disable = st7703_disable, + .unprepare = st7703_unprepare, + .prepare = st7703_prepare, + .enable = st7703_enable, + .get_modes = st7703_get_modes, ++ .get_orientation = st7703_get_orientation, + }; + + static int allpixelson_set(void *data, u64 val) +@@ -709,6 +802,12 @@ static int st7703_probe(struct mipi_dsi_device *dsi) + if (IS_ERR(ctx->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio), "Failed to get reset gpio\n"); + ++ ret = of_drm_get_panel_orientation(dev->of_node, &ctx->orientation); ++ if (ret < 0) { ++ dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, ret); ++ return ret; ++ } ++ + mipi_dsi_set_drvdata(dsi, ctx); + + ctx->dev = dev; +@@ -785,6 +884,7 @@ static void st7703_remove(struct mipi_dsi_device *dsi) + static const struct of_device_id st7703_of_match[] = { + { .compatible = "anbernic,rg353v-panel-v2", .data = &rg353v2_desc }, + { .compatible = "powkiddy,rgb30-panel", .data = &rgb30panel_desc }, ++ { .compatible = "powkiddy,rgb10max3-panel", .data = &rgb10max3panel_desc }, + { .compatible = "rocktech,jh057n00900", .data = &jh057n00900_panel_desc }, + { .compatible = "xingbangda,xbd599", .data = &xbd599_desc }, + { /* sentinel */ } diff --git a/projects/Rockchip/packages/linux/patches/RK3566/011-fix-powkiddy-model-names.patch b/projects/Rockchip/packages/linux/patches/RK3566/011-fix-powkiddy-model-names.patch new file mode 100644 index 0000000000..d990dab2e5 --- /dev/null +++ b/projects/Rockchip/packages/linux/patches/RK3566/011-fix-powkiddy-model-names.patch @@ -0,0 +1,26 @@ +diff --git a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts +index 0ac64f043b80..ae7627216cd6 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts +@@ -8,7 +8,7 @@ + #include "rk3566-powkiddy-rk2023.dtsi" + + / { +- model = "RGB30"; ++ model = "Powkiddy RGB30"; + compatible = "powkiddy,rgb30", "rockchip,rk3566"; + }; + +diff --git a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dts b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dts +index ba32d0793dca..691f6949a5e7 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dts +@@ -8,7 +8,7 @@ + #include "rk3566-powkiddy-rk2023.dtsi" + + / { +- model = "RK2023"; ++ model = "Powkiddy RK2023"; + compatible = "powkiddy,rk2023", "rockchip,rk3566"; + }; + diff --git a/projects/Rockchip/packages/u-boot/package.mk b/projects/Rockchip/packages/u-boot/package.mk index be7df461f3..925ac0f59a 100644 --- a/projects/Rockchip/packages/u-boot/package.mk +++ b/projects/Rockchip/packages/u-boot/package.mk @@ -7,7 +7,7 @@ PKG_NAME="u-boot" PKG_ARCH="arm aarch64" PKG_SITE="https://github.com/JustEnoughLinuxOS" PKG_LICENSE="GPL" -PKG_DEPENDS_TARGET="toolchain swig:host rkbin glibc pyelftools:host" +PKG_DEPENDS_TARGET="toolchain Python3 swig:host rkbin glibc pyelftools:host" PKG_LONGDESC="Rockchip U-Boot is a bootloader for embedded systems." PKG_PATCH_DIRS+="${DEVICE}" @@ -18,8 +18,9 @@ case ${DEVICE} in PKG_GIT_CLONE_BRANCH="v2017.09-rk3588" ;; RK356*) - PKG_URL="${PKG_SITE}/rk356x-uboot.git" - PKG_VERSION="97c658238f7ccd436fbdede451bfd7488514a5c8" + PKG_URL="https://github.com/u-boot/u-boot.git" + PKG_VERSION="27089f1e4d11fd7e0619097b59258d0428cde2ac" + PKG_GIT_CLONE_BRANCH="master" ;; RK3399) PKG_DEPENDS_TARGET+=" atf openssl:host" @@ -51,7 +52,8 @@ post_patch() { } make_target() { -setup_pkg_config_host + export PKG_RKBIN="$(get_build_dir rkbin)" + setup_pkg_config_host . ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/options if [ -z "${UBOOT_CONFIG}" ]; then echo "UBOOT_CONFIG must be set to build an image" @@ -69,13 +71,26 @@ setup_pkg_config_host then PKG_LOADER="$(get_build_dir rkbin)/${PKG_LOADER}" fi - if [[ "${PKG_SOC}" =~ "rk35" ]] + if [[ "${PKG_SOC}" =~ "rk3568" ]] then + # rk3566 device + echo "Building for GPT (${UBOOT_DTB})..." + echo "toolchain (${TOOLCHAIN})" + export BL31="${PKG_BL31}" + export ROCKCHIP_TPL="${PKG_DATAFILE}" DEBUG=${PKG_DEBUG} CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="" ARCH=arm64 make mrproper + echo "begin make" + DEBUG=${PKG_DEBUG} CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="--lssl -lcrypto" ARCH=arm64 make ${UBOOT_CONFIG} ${PKG_LOADER} u-boot.dtb u-boot.img tools HOSTCC="${HOST_CC}" HOSTLDFLAGS="-L${TOOLCHAIN}/lib" HOSTCFLAGS="-I${TOOLCHAIN}/include" + echo "end make" + DEBUG=${PKG_DEBUG} CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="" ARCH=arm64 _python_sysroot="${TOOLCHAIN}" _python_prefix=/ _python_exec_prefix=/ make HOSTCC="${HOST_CC}" HOSTLDFLAGS="-L${TOOLCHAIN}/lib" HOSTCFLAGS="-I${TOOLCHAIN}/include" HOSTSTRIP="true" CONFIG_MKIMAGE_DTC_PATH="scripts/dtc/dtc" + elif [[ "${PKG_SOC}" =~ "rk3588" ]] + then + DEBUG=${PKG_DEBUG} CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="" ARCH=arm64 make mrproper DEBUG=${PKG_DEBUG} CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="" ARCH=arm64 make ${UBOOT_CONFIG} BL31=${PKG_BL31} ${PKG_LOADER} u-boot.dtb u-boot.itb CONFIG_MKIMAGE_DTC_PATH="scripts/dtc/dtc" DEBUG=${PKG_DEBUG} CROSS_COMPILE="${TARGET_KERNEL_PREFIX}" LDFLAGS="" ARCH=arm64 _python_sysroot="${TOOLCHAIN}" _python_prefix=/ _python_exec_prefix=/ make HOSTCC="${HOST_CC}" HOSTLDFLAGS="-L${TOOLCHAIN}/lib" HOSTSTRIP="true" CONFIG_MKIMAGE_DTC_PATH="scripts/dtc/dtc" - else - echo "Building for MBR (${UBOOT_DTB})..." + else + # rk3326 and rk3399 devices + echo "Building for MBR (${UBOOT_DTB})..." if [[ "${ATF_PLATFORM}" =~ "rk3399" ]]; then export BL31="$(get_build_dir atf)/.install_pkg/usr/share/bootloader/bl31.elf" fi diff --git a/projects/Rockchip/packages/u-boot/patches/RK3566-X55/001-charge-led.patch b/projects/Rockchip/packages/u-boot/patches/RK3566-X55/001-charge-led.patch deleted file mode 100644 index a26c53b2bb..0000000000 --- a/projects/Rockchip/packages/u-boot/patches/RK3566-X55/001-charge-led.patch +++ /dev/null @@ -1,219 +0,0 @@ -diff --git a/arch/arm/dts/rk3568-evb.dts b/arch/arm/dts/rk3568-evb.dts -index 950bc3a..f893a9a 100644 ---- a/arch/arm/dts/rk3568-evb.dts -+++ b/arch/arm/dts/rk3568-evb.dts -@@ -28,30 +28,77 @@ - press-threshold-microvolt = <9>; - }; - }; -- leds: gpio-leds { -+ /*leds: gpio-leds { - compatible = "gpio-leds"; - pinctrl-names = "default"; - pinctrl-0 =<&leds_gpio>; - - led@1 { -- gpios = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>; -+ gpios = <&gpio4 RK_PC5 GPIO_ACTIVE_HIGH>; - label = "battery_full"; - default-state="on"; - retain-state-suspended; - }; - - led@2 { -- gpios = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>; -+ gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; - label = "battery_charging"; - retain-state-suspended; - }; - - led@3 { -- gpios = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; -+ gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>; - label = "low_power"; - default-state="off"; - retain-state-suspended; - }; -+ };*/ -+}; -+ -+&i2c0 { -+ rk817: pmic@20 { -+ battery { -+ compatible = "rk817,battery"; -+ ocv_table = <3400 3553 3621 3688 3735 3768 3801 -+ 3826 3843 3857 3878 3904 3934 3972 -+ 4006 4020 4030 4044 4059 4083 4138>; -+ design_capacity = <3527>; -+ design_qmax = <3880>; -+ bat_res = <91>; -+ sleep_enter_current = <150>; -+ sleep_exit_current = <180>; -+ sleep_filter_current = <100>; -+ power_off_thresd = <3350>; -+ zero_algorithm_vol = <3300>; -+ max_soc_offset = <60>; -+ monitor_sec = <5>; -+ sample_res = <10>; -+ virtual_power = <0>; -+ // dc_det_gpio = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>;//uboot使用 -+ charge_red_gpio = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;//充电指示灯 红 -+ charge_green_gpio = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>;//充电指示灯 绿 -+ charge_yellow_gpio = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;//充电指示灯 黄 -+ }; -+ -+ charger { -+ compatible = "rk817,charger"; -+ min_input_voltage = <4500>; -+ max_input_current = <2000>; -+ max_chrg_current = <2000>; -+ max_chrg_voltage = <4300>; -+ chrg_term_mode = <0>; -+ chrg_finish_cur = <300>; -+ virtual_power = <0>; -+ dc_det_adc = <0>; -+ // dc_det_gpio = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>; -+ charge_red_gpio = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;//充电指示灯 红 -+ charge_green_gpio = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>;//充电指示灯 绿 -+ charge_yellow_gpio = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;//充电指示灯 黄 -+ pinctrl-names = "default"; -+ pinctrl-0 = <&charge_led_gpio>; -+ extcon = <&usb2phy0>; -+ gate_function_disable = <1>; -+ }; - }; - }; - -@@ -131,12 +178,20 @@ - }; - - &pinctrl { -- gpio-leds { -+ /*gpio-leds { - leds_gpio: leds-gpio { - rockchip,pins = -- <0 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>, -- <0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>, -- <0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>; -+ <4 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>, -+ <4 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>, -+ <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>; - }; -- }; -+ };*/ -+ led { -+ charge_led_gpio:charge-led-gpio{ -+ rockchip,pins = <4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>, -+ <4 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>, -+ <4 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>; -+ }; -+ -+ }; - }; -diff --git a/drivers/power/fuel_gauge/fg_rk817.c b/drivers/power/fuel_gauge/fg_rk817.c -index b5abb72..f54188c 100644 ---- a/drivers/power/fuel_gauge/fg_rk817.c -+++ b/drivers/power/fuel_gauge/fg_rk817.c -@@ -256,6 +256,10 @@ struct rk817_battery_device { - u32 bat_res_up; - u32 bat_res_down; - u32 variant; -+ struct gpio_desc dc_det_gpio; -+ struct gpio_desc charge_red_gpio; -+ struct gpio_desc charge_green_gpio; -+ struct gpio_desc charge_yellow_gpio; - }; - - static u32 interpolate(int value, u32 *table, int size) -@@ -948,15 +952,27 @@ static int rk817_bat_update_get_current(struct udevice *dev) - return VIRTUAL_POWER_CUR; - } - -+static int get_dc_statue(struct rk817_battery_device *battery) -+{ -+ -+// printf("%s.... dc status = %d \n",__func__,dm_gpio_get_value(&battery->dc_det_gpio)); -+ if (dm_gpio_get_value(&battery->dc_det_gpio)) -+ return true; -+ else -+ return false; -+} - static int rk817_bat_dwc_otg_check_dpdm(struct rk817_battery_device *battery) - { - if (battery->variant == RK809_ID) { -+ // printf("%s.... rk809 \n",__func__); - if (rk817_bat_read(battery, PMIC_SYS_STS) & PLUG_IN_STS) - return AC_CHARGER; - else - return NO_CHARGER; - } else { -+ // printf("%s.... rk817 \n",__func__); - return rockchip_chg_get_type(); -+ // return get_dc_statue(battery); - } - } - -@@ -1186,6 +1202,23 @@ static void rk817_bat_smooth_charge(struct rk817_battery_device *battery) - else if (battery->dsoc < 0) - battery->dsoc = 0; - -+ //黄灯 -+ if (get_dc_statue(battery)){ -+ dm_gpio_set_value(&battery->charge_yellow_gpio,1); -+ if (battery->dsoc == 100) -+ dm_gpio_set_value(&battery->charge_yellow_gpio,0); -+ }else -+ dm_gpio_set_value(&battery->charge_yellow_gpio,0); -+ -+ //红绿 -+ if (battery->dsoc >= 15){ -+ dm_gpio_set_value(&battery->charge_green_gpio,1); //电量足 -+ dm_gpio_set_value(&battery->charge_red_gpio,0); -+ }else{ -+ dm_gpio_set_value(&battery->charge_green_gpio,0); //电量不足 -+ dm_gpio_set_value(&battery->charge_red_gpio,1); -+ } -+ - rk817_bat_save_dsoc(battery, battery->dsoc); - rk817_bat_save_cap(battery, battery->remain_cap / 1000); - out: -@@ -1319,6 +1352,39 @@ static int rk817_fg_ofdata_to_platdata(struct udevice *dev) - battery->res_div = (value == SAMPLE_RES_20mR) ? - SAMPLE_RES_DIV2 : SAMPLE_RES_DIV1; - -+ value = gpio_request_by_name_nodev(dev_ofnode(dev), "dc_det_gpio", -+ 0, &battery->dc_det_gpio,GPIOD_IS_IN); -+ if (!value) { -+ printf("DC is valid\n"); -+ } else { -+ printf("DC is invalid\n"); -+ } -+ -+ value = gpio_request_by_name_nodev(dev_ofnode(dev), "charge_red_gpio", -+ 0, &battery->charge_red_gpio,GPIOD_IS_OUT); -+ if (!value) { -+ printf("charge_red_gpio is valid\n"); -+ } else { -+ printf("charge_red_gpio is invalid\n"); -+ } -+ -+ value = gpio_request_by_name_nodev(dev_ofnode(dev), "charge_green_gpio", -+ 0, &battery->charge_green_gpio,GPIOD_IS_OUT); -+ if (!value) { -+ printf("charge_green_gpio is valid\n"); -+ } else { -+ printf("charge_green_gpio is invalid\n"); -+ } -+ -+ -+ value = gpio_request_by_name_nodev(dev_ofnode(dev), "charge_yellow_gpio", -+ 0, &battery->charge_yellow_gpio,GPIOD_IS_OUT); -+ if (!value) { -+ printf("charge_yellow_gpio is valid\n"); -+ } else { -+ printf("charge_yellow_gpio is invalid\n"); -+ } -+ - DBG("OCV Value:"); - for (i = 0; i < battery->ocv_size; i++) - DBG("%d ", battery->ocv_table[i]); diff --git a/projects/Rockchip/packages/u-boot/patches/RK3566-X55/001-v3-add_additional_boards_and_features_to_rgxx3.patch b/projects/Rockchip/packages/u-boot/patches/RK3566-X55/001-v3-add_additional_boards_and_features_to_rgxx3.patch new file mode 100644 index 0000000000..602bbcfa8e --- /dev/null +++ b/projects/Rockchip/packages/u-boot/patches/RK3566-X55/001-v3-add_additional_boards_and_features_to_rgxx3.patch @@ -0,0 +1,919 @@ +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 0/7] Add Additional Boards and Features to RGxx3 +Date: Mon, 11 Dec 2023 17:21:18 -0600 [thread overview] +Message-ID: <20231211232125.171438-1-macroalpha82@gmail.com> (raw) + +From: Chris Morgan + +The RGxx3 is a pseudo-device for U-Boot that works for every Anbernic +RGxx3 series device on the market. Add support for another series of +very similar devices from Powkiddy. + +Changes since V2: + - Modify the mach-rockchip level rockchip_dnl_key_pressed() so that + we can also call it in SPL mode and eliminate the board specific + function. This requires adding ADC support to SPL. Additionally, + I had to change the regulator for the saradc to a fixed regulator + and add GPIO and regulator support to SPL. + - Move the board specific board_rng_seed to the mach-rockchip level + board file so that other rockchip boards with a hardware RNG can + benefit. This should only be called if both the Rockchip + hardware RNG as well as the rng seed functions are enabled. + - Add two new boards (the RG-ARC-D and RG-ARC-S). I removed the + previous code review due to the extensive changes made. + +Changes since V1: + - Update verbiage around function button to say "recovery" mode + instead of calling it "maskrom" mode, which has a specific + meaning. Also note that recovery function was done in a board + specific manner to ensure it can run early. + - Update board level documentation for the RGxx3. + +Chris Morgan (7): + board: rockchip: Refactor panel auto-detect code + spl: Add Kconfig options for ADC + rockchip: boot_mode: Allow rockchip_dnl_key_pressed() in SPL + board: rockchip: Add Recovery Button for Anbernic RGxx3 + rockchip: board: Add board_rng_seed() for all Rockchip devices + board: rockchip: Add support for new boards to RGxx3 + doc: board: anbernic: Update rgxx3 to add new boards + + .../arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi | 11 + + arch/arm/mach-rockchip/Makefile | 4 +- + arch/arm/mach-rockchip/board.c | 32 +++ + arch/arm/mach-rockchip/boot_mode.c | 11 +- + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 194 +++++++++++------- + common/spl/Kconfig | 7 + + configs/anbernic-rgxx3-rk3566_defconfig | 16 +- + doc/board/anbernic/rgxx3.rst | 20 +- + drivers/Makefile | 1 + + drivers/adc/Makefile | 2 +- + include/configs/anbernic-rgxx3-rk3566.h | 2 + + 11 files changed, 210 insertions(+), 90 deletions(-) + +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 1/7] board: rockchip: Refactor panel auto-detect code +Date: Mon, 11 Dec 2023 17:21:19 -0600 [thread overview] +Message-ID: <20231211232125.171438-2-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Make the inability to detect a panel using the auto detection code not +fail the entire boot process. This means that if the panel ID cannot +be read we don't set an environment variable for the panel, and if an +environment variable for the panel is not set we don't attempt to +update the compatible string. Changes to the code also ensure that +when there are multiple compatible strings required for the panel +we use them both, which solves some issues that will pop up soon +for the Linux driver. + +Signed-off-by: Chris Morgan +--- + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 115 +++++++++++++-------- + 1 file changed, 74 insertions(+), 41 deletions(-) + +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 3f1a42d184..3d0c614623 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -40,6 +40,7 @@ struct rg3xx_model { + const char *board; + const char *board_name; + const char *fdtfile; ++ const bool detect_panel; + }; + + enum rgxx3_device_id { +@@ -54,52 +55,67 @@ enum rgxx3_device_id { + + static const struct rg3xx_model rg3xx_model_details[] = { + [RG353M] = { +- 517, /* Observed average from device */ +- "rk3566-anbernic-rg353m", +- "RG353M", +- DTB_DIR "rk3566-anbernic-rg353p.dtb", /* Identical devices */ ++ .adc_value = 517, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg353m", ++ .board_name = "RG353M", ++ /* Device is identical to RG353P. */ ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353p.dtb", ++ .detect_panel = 1, + }, + [RG353P] = { +- 860, /* Documented value of 860 */ +- "rk3566-anbernic-rg353p", +- "RG353P", +- DTB_DIR "rk3566-anbernic-rg353p.dtb", ++ .adc_value = 860, /* Documented value of 860 */ ++ .board = "rk3566-anbernic-rg353p", ++ .board_name = "RG353P", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353p.dtb", ++ .detect_panel = 1, + }, + [RG353V] = { +- 695, /* Observed average from device */ +- "rk3566-anbernic-rg353v", +- "RG353V", +- DTB_DIR "rk3566-anbernic-rg353v.dtb", ++ .adc_value = 695, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg353v", ++ .board_name = "RG353V", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353v.dtb", ++ .detect_panel = 1, + }, + [RG503] = { +- 1023, /* Observed average from device */ +- "rk3566-anbernic-rg503", +- "RG503", +- DTB_DIR "rk3566-anbernic-rg503.dtb", ++ .adc_value = 1023, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg503", ++ .board_name = "RG503", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg503.dtb", ++ .detect_panel = 0, + }, + /* Devices with duplicate ADC value */ + [RG353PS] = { +- 860, /* Observed average from device */ +- "rk3566-anbernic-rg353ps", +- "RG353PS", +- DTB_DIR "rk3566-anbernic-rg353ps.dtb", ++ .adc_value = 860, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg353ps", ++ .board_name = "RG353PS", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353ps.dtb", ++ .detect_panel = 1, + }, + [RG353VS] = { +- 695, /* Gathered from second hand information */ +- "rk3566-anbernic-rg353vs", +- "RG353VS", +- DTB_DIR "rk3566-anbernic-rg353vs.dtb", ++ .adc_value = 695, /* Gathered from second hand information */ ++ .board = "rk3566-anbernic-rg353vs", ++ .board_name = "RG353VS", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353vs.dtb", ++ .detect_panel = 1, + }, + }; + + struct rg353_panel { + const u16 id; +- const char *panel_compat; ++ const char *panel_compat[2]; + }; + + static const struct rg353_panel rg353_panel_details[] = { +- { .id = 0x3052, .panel_compat = "newvision,nv3051d"}, +- { .id = 0x3821, .panel_compat = "anbernic,rg353v-panel-v2"}, ++ { ++ .id = 0x3052, ++ .panel_compat[0] = "anbernic,rg353p-panel", ++ .panel_compat[1] = "newvision,nv3051d", ++ }, ++ { ++ .id = 0x3821, ++ .panel_compat[0] = "anbernic,rg353v-panel-v2", ++ .panel_compat[1] = NULL, ++ }, + }; + + /* +@@ -298,11 +314,10 @@ int rgxx3_detect_display(void) + if (!panel) { + printf("Unable to identify panel_id %x\n", + (panel_id[0] << 8) | panel_id[1]); +- env_set("panel", "unknown"); + return -EINVAL; + } + +- env_set("panel", panel->panel_compat); ++ env_set("panel", panel->panel_compat[0]); + + return 0; + } +@@ -367,13 +382,14 @@ int rgxx3_detect_device(void) + rg3xx_model_details[board_id].board_name); + env_set("fdtfile", rg3xx_model_details[board_id].fdtfile); + +- /* Detect the panel type for any device that isn't a 503. */ +- if (board_id == RG503) ++ /* Skip panel detection for when it is not needed. */ ++ if (!rg3xx_model_details[board_id].detect_panel) + return 0; + ++ /* Warn but don't fail for errors in auto-detection of the panel. */ + ret = rgxx3_detect_display(); + if (ret) +- return ret; ++ printf("Failed to detect panel type\n"); + + return 0; + } +@@ -400,7 +416,8 @@ int rk_board_late_init(void) + + int ft_board_setup(void *blob, struct bd_info *bd) + { +- int node, ret; ++ const struct rg353_panel *panel = NULL; ++ int node, ret, i; + char *env; + + /* No fixups necessary for the RG503 */ +@@ -414,6 +431,12 @@ int ft_board_setup(void *blob, struct bd_info *bd) + rg3xx_model_details[RG353M].board_name, + sizeof(rg3xx_model_details[RG353M].board_name)); + ++ env = env_get("panel"); ++ if (!env) { ++ printf("Can't get panel env\n"); ++ return 0; ++ } ++ + /* + * Check if the environment variable doesn't equal the panel. + * If it doesn't, update the devicetree to the correct panel. +@@ -424,12 +447,6 @@ int ft_board_setup(void *blob, struct bd_info *bd) + return -ENODEV; + } + +- env = env_get("panel"); +- if (!env) { +- printf("Can't get panel env\n"); +- return -ENODEV; +- } +- + ret = fdt_node_check_compatible(blob, node, env); + if (ret < 0) + return -ENODEV; +@@ -438,8 +455,24 @@ int ft_board_setup(void *blob, struct bd_info *bd) + if (!ret) + return 0; + +- do_fixup_by_path_string(blob, "/dsi@fe060000/panel@0", +- "compatible", env); ++ /* Panels don't match, search by first compatible value. */ ++ for (i = 0; i < ARRAY_SIZE(rg353_panel_details); i++) { ++ if (!strcmp(env, rg353_panel_details[i].panel_compat[0])) { ++ panel = &rg353_panel_details[i]; ++ break; ++ } ++ } ++ ++ if (!panel) { ++ printf("Unable to identify panel by compat string\n"); ++ return -ENODEV; ++ } ++ ++ /* Set the compatible with the auto-detected values */ ++ fdt_setprop_string(blob, node, "compatible", panel->panel_compat[0]); ++ if (panel->panel_compat[1]) ++ fdt_appendprop_string(blob, node, "compatible", ++ panel->panel_compat[1]); + + return 0; + } +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 2/7] spl: Add Kconfig options for ADC +Date: Mon, 11 Dec 2023 17:21:20 -0600 [thread overview] +Message-ID: <20231211232125.171438-3-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Add kconfig options to enable ADC in SPL + +Signed-off-by: Chris Morgan +--- + common/spl/Kconfig | 7 +++++++ + drivers/Makefile | 1 + + drivers/adc/Makefile | 2 +- + 3 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/common/spl/Kconfig b/common/spl/Kconfig +index c521b02f4a..ada9dcea5c 100644 +--- a/common/spl/Kconfig ++++ b/common/spl/Kconfig +@@ -579,6 +579,13 @@ config SPL_FIT_IMAGE_TINY + ensure this information is available to the next image + invoked). + ++config SPL_ADC ++ bool "Support ADC drivers" ++ help ++ Enable ADC drivers in SPL. These drivers can allow the reading of ++ analog values from one or more channels. Enable this option to ++ build the drivers in drivers/adc as part of an SPL build. ++ + config SPL_CACHE + bool "Support CACHE drivers" + help +diff --git a/drivers/Makefile b/drivers/Makefile +index bf73b7718c..81ba2c534e 100644 +--- a/drivers/Makefile ++++ b/drivers/Makefile +@@ -1,5 +1,6 @@ + # SPDX-License-Identifier: GPL-2.0+ + ++obj-$(CONFIG_$(SPL_)ADC) += adc/ + obj-$(CONFIG_$(SPL_TPL_)BIOSEMU) += bios_emulator/ + obj-$(CONFIG_$(SPL_TPL_)BLK) += block/ + obj-$(CONFIG_$(SPL_TPL_)BOOTCOUNT_LIMIT) += bootcount/ +diff --git a/drivers/adc/Makefile b/drivers/adc/Makefile +index 5336c82097..9eb07769b0 100644 +--- a/drivers/adc/Makefile ++++ b/drivers/adc/Makefile +@@ -4,7 +4,7 @@ + # Przemyslaw Marczak + # + +-obj-$(CONFIG_ADC) += adc-uclass.o ++obj-$(CONFIG_$(SPL_)ADC) += adc-uclass.o + obj-$(CONFIG_ADC_EXYNOS) += exynos-adc.o + obj-$(CONFIG_ADC_SANDBOX) += sandbox.o + obj-$(CONFIG_SARADC_ROCKCHIP) += rockchip-saradc.o +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 3/7] rockchip: boot_mode: Allow rockchip_dnl_key_pressed() in SPL +Date: Mon, 11 Dec 2023 17:21:21 -0600 [thread overview] +Message-ID: <20231211232125.171438-4-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Update the rockchip_dnl_key_pressed() so that it can run in +SPL. Also change the ADC channel to a define that can be +overridden by a board specific option. + +Signed-off-by: Chris Morgan +--- + arch/arm/mach-rockchip/Makefile | 4 ++-- + arch/arm/mach-rockchip/boot_mode.c | 11 ++++++++++- + 2 files changed, 12 insertions(+), 3 deletions(-) + +diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile +index 1dc92066bb..ff089ae949 100644 +--- a/arch/arm/mach-rockchip/Makefile ++++ b/arch/arm/mach-rockchip/Makefile +@@ -15,13 +15,13 @@ obj-tpl-$(CONFIG_ROCKCHIP_PX30) += px30-board-tpl.o + + obj-spl-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o + +-ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),) +- + # Always include boot_mode.o, as we bypass it (i.e. turn it off) + # inside of boot_mode.c when CONFIG_ROCKCHIP_BOOT_MODE_REG is 0. This way, + # we can have the preprocessor correctly recognise both 0x0 and 0 + # meaning "turn it off". + obj-y += boot_mode.o ++ ++ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),) + obj-$(CONFIG_ROCKCHIP_COMMON_BOARD) += board.o + obj-$(CONFIG_MISC_INIT_R) += misc.o + endif +diff --git a/arch/arm/mach-rockchip/boot_mode.c b/arch/arm/mach-rockchip/boot_mode.c +index eb8f65ae4e..d2308768be 100644 +--- a/arch/arm/mach-rockchip/boot_mode.c ++++ b/arch/arm/mach-rockchip/boot_mode.c +@@ -38,6 +38,10 @@ void set_back_to_bootrom_dnl_flag(void) + #define KEY_DOWN_MIN_VAL 0 + #define KEY_DOWN_MAX_VAL 30 + ++#ifndef RK_DNL_ADC_CHAN ++#define RK_DNL_ADC_CHAN 1 ++#endif ++ + __weak int rockchip_dnl_key_pressed(void) + { + unsigned int val; +@@ -52,7 +56,8 @@ __weak int rockchip_dnl_key_pressed(void) + ret = -ENODEV; + uclass_foreach_dev(dev, uc) { + if (!strncmp(dev->name, "saradc", 6)) { +- ret = adc_channel_single_shot(dev->name, 1, &val); ++ ret = adc_channel_single_shot(dev->name, ++ RK_DNL_ADC_CHAN, &val); + break; + } + } +@@ -73,11 +78,13 @@ __weak int rockchip_dnl_key_pressed(void) + + void rockchip_dnl_mode_check(void) + { ++#if CONFIG_IS_ENABLED(ADC) + if (rockchip_dnl_key_pressed()) { + printf("download key pressed, entering download mode..."); + set_back_to_bootrom_dnl_flag(); + do_reset(NULL, 0, 0, NULL); + } ++#endif + } + + int setup_boot_mode(void) +@@ -90,6 +97,7 @@ int setup_boot_mode(void) + boot_mode = readl(reg); + debug("%s: boot mode 0x%08x\n", __func__, boot_mode); + ++#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) + /* Clear boot mode */ + writel(BOOT_NORMAL, reg); + +@@ -103,6 +111,7 @@ int setup_boot_mode(void) + env_set("preboot", "setenv preboot; ums mmc 0"); + break; + } ++#endif + + return 0; + } +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 4/7] board: rockchip: Add Recovery Button for Anbernic RGxx3 +Date: Mon, 11 Dec 2023 17:21:22 -0600 [thread overview] +Message-ID: <20231211232125.171438-5-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Add support for users to enter recovery mode by holding the function +button when they power up the device. + +Since the device has soldered eMMC and sometimes does not expose a clk +pin on the mainboard there is a small chance that a user who flashes a +bad bootloader may not be able to recover if the headers themselves +are valid. As a result this check is done during spl_early_init() to +ensure that it runs as early as possible, and it does so by directly +manipulating the ADC hardware in lieu of loading the ADC driver. + +Signed-off-by: Chris Morgan +--- + arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi | 11 +++++++++++ + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 6 +++++- + configs/anbernic-rgxx3-rk3566_defconfig | 16 ++++++++++++---- + include/configs/anbernic-rgxx3-rk3566.h | 2 ++ + 4 files changed, 30 insertions(+), 5 deletions(-) + +diff --git a/arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi b/arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi +index f986e1941e..e3ab196d22 100644 +--- a/arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi ++++ b/arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi +@@ -76,6 +76,12 @@ + /delete-property/ clock-names; + }; + ++&saradc { ++ bootph-all; ++ vref-supply = <&vcc_sys>; ++ status = "okay"; ++}; ++ + &sdhci { + pinctrl-0 = <&emmc_bus8>, <&emmc_clk>, <&emmc_cmd>, + <&emmc_datastrobe>, <&emmc_rstnout>; +@@ -94,3 +100,8 @@ + bootph-all; + status = "okay"; + }; ++ ++&vcc_sys { ++ bootph-all; ++ status = "okay"; ++}; +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 3d0c614623..45854709f5 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -5,6 +5,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -119,11 +120,14 @@ static const struct rg353_panel rg353_panel_details[] = { + }; + + /* +- * Start LED very early so user knows device is on. Set color ++ * Check if rockchip_dnl button is pressed and reboot into rockusb if ++ * true. Start LED very early so user knows device is on. Set color + * to red. + */ + void spl_board_init(void) + { ++ setup_boot_mode(); ++ + /* Set GPIO0_C5, GPIO0_C6, and GPIO0_C7 to output. */ + writel(GPIO_WRITEMASK(GPIO_C7 | GPIO_C6 | GPIO_C5) | \ + (GPIO_C7 | GPIO_C6 | GPIO_C5), +diff --git a/configs/anbernic-rgxx3-rk3566_defconfig b/configs/anbernic-rgxx3-rk3566_defconfig +index ed6643d9d4..4e72f75815 100644 +--- a/configs/anbernic-rgxx3-rk3566_defconfig ++++ b/configs/anbernic-rgxx3-rk3566_defconfig +@@ -3,6 +3,7 @@ CONFIG_SKIP_LOWLEVEL_INIT=y + CONFIG_COUNTER_FREQUENCY=24000000 + CONFIG_ARCH_ROCKCHIP=y + CONFIG_TEXT_BASE=0x00a00000 ++CONFIG_SPL_GPIO=y + CONFIG_SPL_LIBCOMMON_SUPPORT=y + CONFIG_SPL_LIBGENERIC_SUPPORT=y + CONFIG_NR_DRAM_BANKS=2 +@@ -24,7 +25,9 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART=y + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y ++CONFIG_SPL_FIT_SIGNATURE=y + CONFIG_SPL_LOAD_FIT=y ++CONFIG_LEGACY_IMAGE_FORMAT=y + CONFIG_OF_BOARD_SETUP=y + CONFIG_OF_STDOUT_VIA_ALIAS=y + CONFIG_DEFAULT_FDT_FILE="rockchip/rk3566-anbernic-rgxx3.dtb" +@@ -32,7 +35,7 @@ CONFIG_DEFAULT_FDT_FILE="rockchip/rk3566-anbernic-rgxx3.dtb" + # CONFIG_DISPLAY_CPUINFO is not set + CONFIG_DISPLAY_BOARDINFO_LATE=y + CONFIG_BOARD_RNG_SEED=y +-CONFIG_SPL_MAX_SIZE=0x20000 ++CONFIG_SPL_MAX_SIZE=0x40000 + CONFIG_SPL_PAD_TO=0x7f8000 + CONFIG_SPL_HAS_BSS_LINKER_SECTION=y + CONFIG_SPL_BSS_START_ADDR=0x4000000 +@@ -41,6 +44,8 @@ CONFIG_SPL_BOARD_INIT=y + # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set + # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set + CONFIG_SPL_STACK_R=y ++CONFIG_SPL_ADC=y ++CONFIG_SPL_POWER=y + CONFIG_SPL_ATF=y + CONFIG_CMD_PWM=y + CONFIG_CMD_GPT=y +@@ -50,8 +55,10 @@ CONFIG_CMD_MMC=y + # CONFIG_SPL_DOS_PARTITION is not set + CONFIG_SPL_OF_CONTROL=y + CONFIG_OF_LIVE=y ++CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" + CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y + # CONFIG_NET is not set ++CONFIG_SPL_DM_SEQ_ALIAS=y + CONFIG_SPL_REGMAP=y + CONFIG_SPL_SYSCON=y + CONFIG_SPL_CLK=y +@@ -67,13 +74,13 @@ CONFIG_MMC_SDHCI=y + CONFIG_MMC_SDHCI_SDMA=y + CONFIG_MMC_SDHCI_ROCKCHIP=y + CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y ++CONFIG_SPL_PINCTRL=y + CONFIG_DM_PMIC=y + CONFIG_DM_PMIC_FAN53555=y + CONFIG_PMIC_RK8XX=y +-CONFIG_REGULATOR_PWM=y +-CONFIG_DM_REGULATOR_GPIO=y ++CONFIG_SPL_DM_REGULATOR=y ++CONFIG_SPL_DM_REGULATOR_FIXED=y + CONFIG_REGULATOR_RK8XX=y +-CONFIG_DM_REGULATOR_SCMI=y + CONFIG_PWM_ROCKCHIP=y + CONFIG_SPL_RAM=y + # CONFIG_RAM_ROCKCHIP_DEBUG is not set +@@ -89,5 +96,6 @@ CONFIG_VIDEO_ROCKCHIP=y + CONFIG_DISPLAY_ROCKCHIP_DW_MIPI=y + CONFIG_VIDEO_BRIDGE=y + CONFIG_REGEX=y ++# CONFIG_RSA is not set + CONFIG_ERRNO_STR=y + # CONFIG_EFI_LOADER is not set +diff --git a/include/configs/anbernic-rgxx3-rk3566.h b/include/configs/anbernic-rgxx3-rk3566.h +index 3c4ea4e7d8..2aaac55c06 100644 +--- a/include/configs/anbernic-rgxx3-rk3566.h ++++ b/include/configs/anbernic-rgxx3-rk3566.h +@@ -9,4 +9,6 @@ + "stdout=serial,vidconsole\0" \ + "stderr=serial,vidconsole\0" + ++#define RK_DNL_ADC_CHAN 0 ++ + #endif +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 5/7] rockchip: board: Add board_rng_seed() for all Rockchip devices +Date: Mon, 11 Dec 2023 17:21:23 -0600 [thread overview] +Message-ID: <20231211232125.171438-6-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Allow all rockchip devices to use the hardware RNG to seed Linux +RNG. + +Signed-off-by: Chris Morgan +--- + arch/arm/mach-rockchip/board.c | 32 ++++++++++++++++++++++ + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 29 -------------------- + 2 files changed, 32 insertions(+), 29 deletions(-) + +diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c +index 57f08e0be0..77145524ea 100644 +--- a/arch/arm/mach-rockchip/board.c ++++ b/arch/arm/mach-rockchip/board.c +@@ -348,3 +348,35 @@ __weak int misc_init_r(void) + return ret; + } + #endif ++ ++#if IS_ENABLED(CONFIG_BOARD_RNG_SEED) && IS_ENABLED(CONFIG_RNG_ROCKCHIP) ++#include ++ ++/* Use hardware rng to seed Linux random. */ ++__weak int board_rng_seed(struct abuf *buf) ++{ ++ struct udevice *dev; ++ size_t len = 0x8; ++ u64 *data; ++ ++ data = malloc(len); ++ if (!data) { ++ printf("Out of memory\n"); ++ return -ENOMEM; ++ } ++ ++ if (uclass_get_device(UCLASS_RNG, 0, &dev) || !dev) { ++ printf("No RNG device\n"); ++ return -ENODEV; ++ } ++ ++ if (dm_rng_read(dev, data, len)) { ++ printf("Reading RNG failed\n"); ++ return -EIO; ++ } ++ ++ abuf_init_set(buf, data, len); ++ ++ return 0; ++} ++#endif +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 45854709f5..7bef5a53f0 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -17,7 +17,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -137,34 +136,6 @@ void spl_board_init(void) + (GPIO0_BASE + GPIO_SWPORT_DR_H)); + } + +-/* Use hardware rng to seed Linux random. */ +-int board_rng_seed(struct abuf *buf) +-{ +- struct udevice *dev; +- size_t len = 0x8; +- u64 *data; +- +- data = malloc(len); +- if (!data) { +- printf("Out of memory\n"); +- return -ENOMEM; +- } +- +- if (uclass_get_device(UCLASS_RNG, 0, &dev) || !dev) { +- printf("No RNG device\n"); +- return -ENODEV; +- } +- +- if (dm_rng_read(dev, data, len)) { +- printf("Reading RNG failed\n"); +- return -EIO; +- } +- +- abuf_init_set(buf, data, len); +- +- return 0; +-} +- + /* + * Buzz the buzzer so the user knows something is going on. Make it + * optional in case PWM is disabled. +-- +2.34.1 +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 6/7] board: rockchip: Add support for new boards to RGxx3 +Date: Mon, 11 Dec 2023 17:21:24 -0600 [thread overview] +Message-ID: <20231211232125.171438-7-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Add support for the Anbernic RG-ARC-D, Anbernic RG-ARC-S, Powkiddy +RK2023, and Powkiddy RGB30 to the Anbernic RGxx3. While the Powkiddy +devices are manufactured by Powkiddy instead of Anbernic, +the hardware is so similar they can all use the same bootloader. + +Signed-off-by: Chris Morgan +--- + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 44 +++++++++++++++++++--- + 1 file changed, 39 insertions(+), 5 deletions(-) + +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 7bef5a53f0..2445663d43 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -48,9 +48,13 @@ enum rgxx3_device_id { + RG353P, + RG353V, + RG503, ++ RGB30, ++ RK2023, ++ RGARCD, + /* Devices with duplicate ADC value */ + RG353PS, + RG353VS, ++ RGARCS, + }; + + static const struct rg3xx_model rg3xx_model_details[] = { +@@ -83,6 +87,27 @@ static const struct rg3xx_model rg3xx_model_details[] = { + .fdtfile = DTB_DIR "rk3566-anbernic-rg503.dtb", + .detect_panel = 0, + }, ++ [RGB30] = { ++ .adc_value = 383, /* Gathered from second hand information */ ++ .board = "rk3566-powkiddy-rgb30", ++ .board_name = "RGB30", ++ .fdtfile = DTB_DIR "rk3566-powkiddy-rgb30.dtb", ++ .detect_panel = 0, ++ }, ++ [RK2023] = { ++ .adc_value = 635, /* Observed average from device */ ++ .board = "rk3566-powkiddy-rk2023", ++ .board_name = "RK2023", ++ .fdtfile = DTB_DIR "rk3566-powkiddy-rk2023.dtb", ++ .detect_panel = 0, ++ }, ++ [RGARCD] = { ++ .adc_value = 183, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg-arc-d", ++ .board_name = "Anbernic RG ARC-D", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg-arc-d.dtb", ++ .detect_panel = 0, ++ }, + /* Devices with duplicate ADC value */ + [RG353PS] = { + .adc_value = 860, /* Observed average from device */ +@@ -98,6 +123,13 @@ static const struct rg3xx_model rg3xx_model_details[] = { + .fdtfile = DTB_DIR "rk3566-anbernic-rg353vs.dtb", + .detect_panel = 1, + }, ++ [RGARCS] = { ++ .adc_value = 183, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg-arc-s", ++ .board_name = "Anbernic RG ARC-S", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg-arc-s.dtb", ++ .detect_panel = 0, ++ }, + }; + + struct rg353_panel { +@@ -332,19 +364,21 @@ int rgxx3_detect_device(void) + } + + /* +- * Try to access the eMMC on an RG353V or RG353P. If it's +- * missing, it's an RG353VS or RG353PS. Note we could also +- * check for a touchscreen at 0x1a on i2c2. ++ * Try to access the eMMC on an RG353V, RG353P, or RG Arc D. ++ * If it's missing, it's an RG353VS, RG353PS, or RG Arc S. ++ * Note we could also check for a touchscreen at 0x1a on i2c2. + */ +- if (board_id == RG353V || board_id == RG353P) { ++ if (board_id == RG353V || board_id == RG353P || board_id == RGARCD) { + mmc = find_mmc_device(0); + if (mmc) { + ret = mmc_init(mmc); + if (ret) { + if (board_id == RG353V) + board_id = RG353VS; +- else ++ if (board_id == RG353P) + board_id = RG353PS; ++ else ++ board_id = RGARCS; + } + } + } +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 7/7] doc: board: anbernic: Update rgxx3 to add new boards +Date: Mon, 11 Dec 2023 17:21:25 -0600 [thread overview] +Message-ID: <20231211232125.171438-8-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Update the RGxx3 documentation to note that it now supports the +RG-ARC-D, RG-ARC-S, Powkiddy RK2023, and Powkiddy RGB30. Also update +verbiage around panel detection to note that it is no longer hard coded +to the RG503. + +Signed-off-by: Chris Morgan +--- + doc/board/anbernic/rgxx3.rst | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +diff --git a/doc/board/anbernic/rgxx3.rst b/doc/board/anbernic/rgxx3.rst +index 7d1beb423c..d159ed2f76 100644 +--- a/doc/board/anbernic/rgxx3.rst ++++ b/doc/board/anbernic/rgxx3.rst +@@ -5,6 +5,8 @@ U-Boot for Anbernic RGxx3 Devices + + This allows U-Boot to boot the following Anbernic devices: + ++ - Anbernic RG-ARC-D ++ - Anbernic RG-ARC-S + - Anbernic RG353M + - Anbernic RG353P + - Anbernic RG353PS +@@ -12,18 +14,24 @@ This allows U-Boot to boot the following Anbernic devices: + - Anbernic RG353VS + - Anbernic RG503 + ++Additionally, the following very similar non-Anbernic devices are also ++supported: ++ ++ - Powkiddy RGB30 ++ - Powkiddy RK2023 ++ + The correct device is detected automatically by comparing ADC values + from ADC channel 1. In the event of an RG353V or RG353P, an attempt + is then made to probe for an eMMC and if it fails the device is assumed + to be an RG353VS or RG353PS. Based on the detected device, the + environment variables "board", "board_name", and "fdtfile" are set to + the correct values corresponding to the board which can be read by a +-boot script to boot with the correct device tree. If the board detected +-is not of type RG503 (which currently has only 1 panel revision) a +-panel detect is then performed by probing a "dummy" display on the DSI +-bus and then querying the display ID. The display ID is then compared +-to a table to get the known compatible string for use in Linux, and +-this string is saved as an environment variable of "panel". ++boot script to boot with the correct device tree. If a board is defined ++as requiring panel detection, a panel detect is then performed by ++probing a "dummy" display on the DSI bus and then querying the display ++ID. The display ID is then compared to a table to get the known ++compatible string for use in Linux, and this string is saved as an ++environment variable of "panel". + + FDT fixups are performed in the event of an RG353M to change the device + name, or in the event the panel detected does not match the devicetree. +-- +2.34.1 diff --git a/projects/Rockchip/packages/u-boot/patches/RK3566-X55/002-v2-add-powkiddy-x55.patch b/projects/Rockchip/packages/u-boot/patches/RK3566-X55/002-v2-add-powkiddy-x55.patch new file mode 100644 index 0000000000..91f6bfaa1e --- /dev/null +++ b/projects/Rockchip/packages/u-boot/patches/RK3566-X55/002-v2-add-powkiddy-x55.patch @@ -0,0 +1,1383 @@ +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: jbx6244@gmail.com, jonas@kwiboo.se, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V2] board: rockchip: add Powkiddy X55 +Date: Thu, 14 Dec 2023 12:24:33 -0600 [thread overview] +Message-ID: <20231214182433.37454-1-macroalpha82@gmail.com> (raw) + +From: Chris Morgan + +The Powkiddy X55 is a Rockchip RK3566 based handheld gaming device. +UART, ADC, eMMC, and SDMMC are tested to work in U-Boot and this +successfully boots mainline Linux. + +Changes since V1: + - Built on top of this patch series [1] which makes the ADC detect + function more generic and also moves the board_rng_seed to a more + generic location. + - Updated U-Boot specific devicetree to drop redundant values and + add nodes required for ADC detection in SPL. + - Updated defconfig to add additional options for SPL ADC detection + logic as well as drop some drivers that are not needed. Note that + CONFIG_DM_PMIC_FAN53555 is used by the tcs,tcs4525 regulator on + i2c0 at 0x1c. Additionally the code fails to compile without + selecting CONFIG_SPL_ROCKCHIP_BACK_TO_BROM. + +[1] https://lore.kernel.org/u-boot/20231211232125.171438-1-macroalpha82@gmail.com/ + +Signed-off-by: Chris Morgan +--- + arch/arm/dts/Makefile | 1 + + arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi | 67 ++ + arch/arm/dts/rk3566-powkiddy-x55.dts | 926 +++++++++++++++++++ + arch/arm/mach-rockchip/rk3568/Kconfig | 6 + + board/powkiddy/x55/Kconfig | 15 + + board/powkiddy/x55/MAINTAINERS | 9 + + board/powkiddy/x55/Makefile | 6 + + board/powkiddy/x55/x55.c | 42 + + configs/powkiddy-x55-rk3566_defconfig | 92 ++ + doc/board/index.rst | 1 + + doc/board/powkiddy/index.rst | 9 + + doc/board/powkiddy/x55.rst | 25 + + doc/board/rockchip/rockchip.rst | 1 + + include/configs/powkiddy-x55-rk3566.h | 14 + + 14 files changed, 1214 insertions(+) + create mode 100644 arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi + create mode 100644 arch/arm/dts/rk3566-powkiddy-x55.dts + create mode 100644 board/powkiddy/x55/Kconfig + create mode 100644 board/powkiddy/x55/MAINTAINERS + create mode 100644 board/powkiddy/x55/Makefile + create mode 100644 board/powkiddy/x55/x55.c + create mode 100644 configs/powkiddy-x55-rk3566_defconfig + create mode 100644 doc/board/powkiddy/index.rst + create mode 100644 doc/board/powkiddy/x55.rst + create mode 100644 include/configs/powkiddy-x55-rk3566.h + +diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile +index 5fc888680b..6e5cb7c3e9 100644 +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -172,6 +172,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3399) += \ + + dtb-$(CONFIG_ROCKCHIP_RK3568) += \ + rk3566-anbernic-rgxx3.dtb \ ++ rk3566-powkiddy-x55.dtb \ + rk3566-quartz64-a.dtb \ + rk3566-quartz64-b.dtb \ + rk3566-radxa-cm3-io.dtb \ +diff --git a/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi +new file mode 100644 +index 0000000000..1a3089b598 +--- /dev/null ++++ b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi +@@ -0,0 +1,67 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++ ++#include "rk356x-u-boot.dtsi" ++ ++/ { ++ chosen { ++ stdout-path = &uart2; ++ }; ++ ++ rng: rng@fe388000 { ++ compatible = "rockchip,cryptov2-rng"; ++ reg = <0x0 0xfe388000 0x0 0x2000>; ++ status = "okay"; ++ }; ++}; ++ ++&cru { ++ assigned-clocks = ++ <&pmucru CLK_RTC_32K>, <&pmucru PLL_PPLL>, ++ <&pmucru PCLK_PMU>, <&cru PLL_CPLL>, ++ <&cru PLL_GPLL>, <&cru PLL_VPLL>, ++ <&cru ACLK_BUS>, <&cru PCLK_BUS>, ++ <&cru ACLK_TOP_HIGH>, <&cru ACLK_TOP_LOW>, ++ <&cru HCLK_TOP>, <&cru PCLK_TOP>, ++ <&cru ACLK_PERIMID>, <&cru HCLK_PERIMID>, ++ <&cru CPLL_500M>, <&cru CPLL_333M>, ++ <&cru CPLL_250M>, <&cru CPLL_125M>, ++ <&cru CPLL_100M>, <&cru CPLL_62P5M>, ++ <&cru CPLL_50M>, <&cru CPLL_25M>; ++ assigned-clock-rates = ++ <32768>, <200000000>, ++ <100000000>, <1000000000>, ++ <1200000000>, <126400000>, ++ <150000000>, <100000000>, ++ <500000000>, <400000000>, ++ <150000000>, <100000000>, ++ <300000000>, <150000000>, ++ <500000000>, <333333333>, ++ <250000000>, <125000000>, ++ <100000000>, <62500000>, ++ <50000000>, <25000000>; ++ assigned-clock-parents = ++ <&pmucru CLK_RTC32K_FRAC>; ++}; ++ ++&pmucru { ++ assigned-clocks = <&pmucru SCLK_32K_IOE>; ++ assigned-clock-parents = <&pmucru CLK_RTC_32K>; ++}; ++ ++/* Move the saradc to a fixed regulator so that it works in SPL. */ ++&saradc { ++ bootph-all; ++ vref-supply = <&vcc_sys>; ++ status = "okay"; ++}; ++ ++&uart2 { ++ clock-frequency = <24000000>; ++ bootph-all; ++ status = "okay"; ++}; ++ ++&vcc_sys { ++ bootph-all; ++ status = "okay"; ++}; +diff --git a/arch/arm/dts/rk3566-powkiddy-x55.dts b/arch/arm/dts/rk3566-powkiddy-x55.dts +new file mode 100644 +index 0000000000..4786b19fd0 +--- /dev/null ++++ b/arch/arm/dts/rk3566-powkiddy-x55.dts +@@ -0,0 +1,926 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++ ++/dts-v1/; ++ ++#include ++#include ++#include ++#include ++#include ++#include "rk3566.dtsi" ++ ++/ { ++ model = "Powkiddy x55"; ++ compatible = "powkiddy,x55", "rockchip,rk3566"; ++ ++ aliases { ++ mmc0 = &sdhci; ++ mmc1 = &sdmmc0; ++ mmc2 = &sdmmc2; ++ mmc3 = &sdmmc1; ++ }; ++ ++ chosen: chosen { ++ stdout-path = "serial2:1500000n8"; ++ }; ++ ++ adc_joystick: adc-joystick { ++ compatible = "adc-joystick"; ++ io-channels = <&saradc 0>, <&saradc 1>, ++ <&saradc 2>, <&saradc 3>; ++ poll-interval = <60>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ axis@0 { ++ reg = <0>; ++ abs-flat = <30>; ++ abs-fuzz = <20>; ++ abs-range = <15 1023>; ++ linux,code = ; ++ }; ++ ++ axis@1 { ++ reg = <1>; ++ abs-flat = <30>; ++ abs-fuzz = <20>; ++ abs-range = <1023 15>; ++ linux,code = ; ++ }; ++ ++ axis@2 { ++ reg = <2>; ++ abs-flat = <30>; ++ abs-fuzz = <20>; ++ abs-range = <15 1023>; ++ linux,code = ; ++ }; ++ ++ axis@3 { ++ reg = <3>; ++ abs-flat = <30>; ++ abs-fuzz = <20>; ++ abs-range = <1023 15>; ++ linux,code = ; ++ }; ++ }; ++ ++ backlight: backlight { ++ compatible = "pwm-backlight"; ++ power-supply = <&vcc_sys>; ++ pwms = <&pwm4 0 25000 0>; ++ }; ++ ++ battery: battery { ++ compatible = "simple-battery"; ++ charge-full-design-microamp-hours = <4000000>; ++ charge-term-current-microamp = <300000>; ++ constant-charge-current-max-microamp = <2000000>; ++ constant-charge-voltage-max-microvolt = <4300000>; ++ factory-internal-resistance-micro-ohms = <91000>; ++ voltage-max-design-microvolt = <4138000>; ++ voltage-min-design-microvolt = <3400000>; ++ ++ ocv-capacity-celsius = <20>; ++ ocv-capacity-table-0 = <4138000 100>, <4083000 95>, <4059000 90>, <4044000 85>, ++ <4030000 80>, <4020000 75>, <4006000 70>, <3972000 65>, ++ <3934000 60>, <3904000 55>, <3878000 50>, <3857000 45>, ++ <3843000 40>, <3826000 35>, <3801000 30>, <3768000 25>, ++ <3735000 20>, <3688000 15>, <3621000 10>, <3553000 5>, ++ <3400000 0>; ++ }; ++ ++ gpio_keys_control: gpio-keys-control { ++ compatible = "gpio-keys"; ++ pinctrl-0 = <&btn_pins_ctrl>; ++ pinctrl-names = "default"; ++ ++ button-a { ++ gpios = <&gpio3 RK_PD3 GPIO_ACTIVE_LOW>; ++ label = "EAST"; ++ linux,code = ; ++ }; ++ ++ button-b { ++ gpios = <&gpio3 RK_PD2 GPIO_ACTIVE_LOW>; ++ label = "SOUTH"; ++ linux,code = ; ++ }; ++ ++ button-down { ++ gpios = <&gpio4 RK_PA1 GPIO_ACTIVE_LOW>; ++ label = "DPAD-DOWN"; ++ linux,code = ; ++ }; ++ ++ button-l1 { ++ gpios = <&gpio3 RK_PD0 GPIO_ACTIVE_LOW>; ++ label = "TL"; ++ linux,code = ; ++ }; ++ ++ button-l2 { ++ gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_LOW>; ++ label = "TL2"; ++ linux,code = ; ++ }; ++ ++ button-left { ++ gpios = <&gpio3 RK_PD6 GPIO_ACTIVE_LOW>; ++ label = "DPAD-LEFT"; ++ linux,code = ; ++ }; ++ ++ button-right { ++ gpios = <&gpio3 RK_PD7 GPIO_ACTIVE_LOW>; ++ label = "DPAD-RIGHT"; ++ linux,code = ; ++ }; ++ ++ button-select { ++ gpios = <&gpio4 RK_PA4 GPIO_ACTIVE_LOW>; ++ label = "SELECT"; ++ linux,code = ; ++ }; ++ ++ button-start { ++ gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_LOW>; ++ label = "START"; ++ linux,code = ; ++ }; ++ ++ button-thumbl { ++ gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_LOW>; ++ label = "THUMBL"; ++ linux,code = ; ++ }; ++ ++ button-thumbr { ++ gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_LOW>; ++ label = "THUMBR"; ++ linux,code = ; ++ }; ++ ++ button-r1 { ++ gpios = <&gpio3 RK_PC6 GPIO_ACTIVE_LOW>; ++ label = "TR"; ++ linux,code = ; ++ }; ++ ++ button-r2 { ++ gpios = <&gpio3 RK_PC7 GPIO_ACTIVE_LOW>; ++ label = "TR2"; ++ linux,code = ; ++ }; ++ ++ button-up { ++ gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>; ++ label = "DPAD-UP"; ++ linux,code = ; ++ }; ++ ++ button-x { ++ gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_LOW>; ++ label = "NORTH"; ++ linux,code = ; ++ }; ++ ++ button-y { ++ gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_LOW>; ++ label = "WEST"; ++ linux,code = ; ++ }; ++ }; ++ ++ gpio_keys_vol: gpio-keys-vol { ++ compatible = "gpio-keys"; ++ autorepeat; ++ pinctrl-0 = <&btn_pins_vol>; ++ pinctrl-names = "default"; ++ ++ button-voldown { ++ gpios = <&gpio4 RK_PA3 GPIO_ACTIVE_LOW>; ++ label = "VOLUMEDOWN"; ++ linux,code = ; ++ }; ++ ++ button-volup { ++ gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_LOW>; ++ label = "VOLUMEUP"; ++ linux,code = ; ++ }; ++ }; ++ ++ gpio_leds: gpio-leds { ++ compatible = "gpio-leds"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&led_pins>; ++ ++ red_led: led-0 { ++ color = ; ++ default-state = "off"; ++ gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>; ++ function = LED_FUNCTION_STATUS; ++ }; ++ ++ green_led: led-1 { ++ color = ; ++ default-state = "on"; ++ gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>; ++ function = LED_FUNCTION_POWER; ++ }; ++ ++ amber_led: led-2 { ++ color = ; ++ gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>; ++ function = LED_FUNCTION_CHARGING; ++ }; ++ ++ }; ++ ++ hdmi-con { ++ compatible = "hdmi-connector"; ++ ddc-i2c-bus = <&i2c5>; ++ type = "c"; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ ++ sdio_pwrseq: sdio-pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ clocks = <&rk817 1>; ++ clock-names = "ext_clock"; ++ pinctrl-0 = <&wifi_enable_h>; ++ pinctrl-names = "default"; ++ post-power-on-delay-ms = <200>; ++ reset-gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_LOW>; ++ }; ++ ++ /* Channels reversed for both headphones and speakers. */ ++ sound { ++ compatible = "simple-audio-card"; ++ pinctrl-0 = <&hp_det>; ++ pinctrl-names = "default"; ++ simple-audio-card,name = "rk817_ext"; ++ simple-audio-card,aux-devs = <&spk_amp>; ++ simple-audio-card,format = "i2s"; ++ simple-audio-card,hp-det-gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; ++ simple-audio-card,mclk-fs = <256>; ++ simple-audio-card,widgets = ++ "Microphone", "Mic Jack", ++ "Headphone", "Headphones", ++ "Speaker", "Internal Speakers"; ++ simple-audio-card,routing = ++ "MICL", "Mic Jack", ++ "Headphones", "HPOL", ++ "Headphones", "HPOR", ++ "Internal Speakers", "Speaker Amp OUTL", ++ "Internal Speakers", "Speaker Amp OUTR", ++ "Speaker Amp INL", "HPOL", ++ "Speaker Amp INR", "HPOR"; ++ simple-audio-card,pin-switches = "Internal Speakers"; ++ ++ simple-audio-card,codec { ++ sound-dai = <&rk817>; ++ }; ++ ++ simple-audio-card,cpu { ++ sound-dai = <&i2s1_8ch>; ++ }; ++ }; ++ ++ spk_amp: audio-amplifier { ++ compatible = "simple-audio-amplifier"; ++ enable-gpios = <&gpio4 RK_PC2 GPIO_ACTIVE_HIGH>; ++ pinctrl-0 = <&spk_amp_enable_h>; ++ pinctrl-names = "default"; ++ sound-name-prefix = "Speaker Amp"; ++ }; ++ ++ vcc5v0_host: regulator-vcc5v0-host { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>; ++ pinctrl-0 = <&vcc5v0_host_en>; ++ pinctrl-names = "default"; ++ regulator-name = "vcc5v0_host"; ++ vin-supply = <&dcdc_boost>; ++ }; ++ ++ vcc_lcd: regulator-vcc-lcd { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; ++ pinctrl-0 = <&vcc_lcd_en>; ++ pinctrl-names = "default"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc_lcd"; ++ }; ++ ++ vcc_sys: regulator-vcc-sys { ++ compatible = "regulator-fixed"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3800000>; ++ regulator-max-microvolt = <3800000>; ++ regulator-name = "vcc_sys"; ++ }; ++ ++ vcc_wifi: regulator-vcc-wifi { ++ compatible = "regulator-fixed"; ++ gpio = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>; ++ pinctrl-0 = <&vcc_wifi_h>; ++ pinctrl-names = "default"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc_wifi"; ++ }; ++}; ++ ++&combphy1 { ++ status = "okay"; ++}; ++ ++&cru { ++ assigned-clocks = <&pmucru CLK_RTC_32K>, <&cru PLL_GPLL>, ++ <&pmucru PLL_PPLL>, <&cru PLL_VPLL>; ++ assigned-clock-rates = <32768>, <1200000000>, ++ <200000000>, <126400000>; ++}; ++ ++&cpu0 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&cpu1 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&cpu2 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&cpu3 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&dsi_dphy0 { ++ status = "okay"; ++}; ++ ++&dsi0 { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ ports { ++ dsi0_in: port@0 { ++ reg = <0>; ++ dsi0_in_vp1: endpoint { ++ remote-endpoint = <&vp1_out_dsi0>; ++ }; ++ }; ++ ++ dsi0_out: port@1 { ++ reg = <1>; ++ mipi_out_panel: endpoint { ++ remote-endpoint = <&mipi_in_panel>; ++ }; ++ }; ++ }; ++ ++ panel: panel@0 { ++ compatible = "powkiddy,x55-panel", "himax,hx8394"; ++ reg = <0>; ++ backlight = <&backlight>; ++ iovcc-supply = <&vcc_lcd>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&lcd_rst>; ++ reset-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_LOW>; ++ rotation = <270>; ++ vcc-supply = <&vcc_lcd>; ++ ++ port { ++ mipi_in_panel: endpoint { ++ remote-endpoint = <&mipi_out_panel>; ++ }; ++ }; ++ }; ++}; ++ ++&gpu { ++ mali-supply = <&vdd_gpu>; ++ status = "okay"; ++}; ++ ++&hdmi { ++ ddc-i2c-bus = <&i2c5>; ++ pinctrl-0 = <&hdmitxm0_cec>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&hdmi_in { ++ hdmi_in_vp0: endpoint { ++ remote-endpoint = <&vp0_out_hdmi>; ++ }; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ ++&hdmi_sound { ++ status = "okay"; ++}; ++ ++&i2c0 { ++ status = "okay"; ++ ++ rk817: pmic@20 { ++ compatible = "rockchip,rk817"; ++ reg = <0x20>; ++ assigned-clocks = <&cru I2S1_MCLKOUT_TX>; ++ assigned-clock-parents = <&cru CLK_I2S1_8CH_TX>; ++ clock-names = "mclk"; ++ clock-output-names = "rk808-clkout1", "rk808-clkout2"; ++ clocks = <&cru I2S1_MCLKOUT_TX>; ++ interrupt-parent = <&gpio0>; ++ interrupts = ; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s1m0_mclk>, <&pmic_int_l>; ++ wakeup-source; ++ #clock-cells = <1>; ++ #sound-dai-cells = <0>; ++ ++ vcc1-supply = <&vcc_sys>; ++ vcc2-supply = <&vcc_sys>; ++ vcc3-supply = <&vcc_sys>; ++ vcc4-supply = <&vcc_sys>; ++ vcc5-supply = <&vcc_sys>; ++ vcc6-supply = <&vcc_sys>; ++ vcc7-supply = <&vcc_sys>; ++ vcc8-supply = <&vcc_sys>; ++ vcc9-supply = <&dcdc_boost>; ++ ++ regulators { ++ vdd_logic: DCDC_REG1 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <1350000>; ++ regulator-ramp-delay = <6001>; ++ regulator-initial-mode = <0x2>; ++ regulator-name = "vdd_logic"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ regulator-suspend-microvolt = <900000>; ++ }; ++ }; ++ ++ vdd_gpu: DCDC_REG2 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <1350000>; ++ regulator-ramp-delay = <6001>; ++ regulator-initial-mode = <0x2>; ++ regulator-name = "vdd_gpu"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc_ddr: DCDC_REG3 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-initial-mode = <0x2>; ++ regulator-name = "vcc_ddr"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ }; ++ }; ++ ++ vcc_3v3: DCDC_REG4 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-initial-mode = <0x2>; ++ regulator-name = "vcc_3v3"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <3300000>; ++ }; ++ }; ++ ++ vcca1v8_pmu: LDO_REG1 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcca1v8_pmu"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1800000>; ++ }; ++ }; ++ ++ vdda_0v9: LDO_REG2 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ regulator-name = "vdda_0v9"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vdda0v9_pmu: LDO_REG3 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ regulator-name = "vdda0v9_pmu"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <900000>; ++ }; ++ }; ++ ++ vccio_acodec: LDO_REG4 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vccio_acodec"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vccio_sd: LDO_REG5 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vccio_sd"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc3v3_pmu: LDO_REG6 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc3v3_pmu"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <3300000>; ++ }; ++ }; ++ ++ vcc_1v8: LDO_REG7 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc_1v8"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc1v8_dvp: LDO_REG8 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc1v8_dvp"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ }; ++ }; ++ ++ vcc2v8_dvp: LDO_REG9 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc2v8_dvp"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ dcdc_boost: BOOST { ++ regulator-min-microvolt = <4700000>; ++ regulator-max-microvolt = <5400000>; ++ regulator-name = "boost"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ otg_switch: OTG_SWITCH { ++ regulator-name = "otg_switch"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ }; ++ ++ rk817_charger: charger { ++ monitored-battery = <&battery>; ++ rockchip,resistor-sense-micro-ohms = <10000>; ++ rockchip,sleep-enter-current-microamp = <150000>; ++ rockchip,sleep-filter-current-microamp = <100000>; ++ }; ++ ++ }; ++ ++ vdd_cpu: regulator@1c { ++ compatible = "tcs,tcs4525"; ++ reg = <0x1c>; ++ fcs,suspend-voltage-selector = <1>; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <712500>; ++ regulator-max-microvolt = <1390000>; ++ regulator-name = "vdd_cpu"; ++ regulator-ramp-delay = <2300>; ++ vin-supply = <&vcc_sys>; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++}; ++ ++&i2c5 { ++ pinctrl-0 = <&i2c5m1_xfer>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&i2s0_8ch { ++ status = "okay"; ++}; ++ ++&i2s1_8ch { ++ pinctrl-0 = <&i2s1m0_sclktx>, <&i2s1m0_lrcktx>, <&i2s1m0_sdi0>, ++ <&i2s1m0_sdo0>; ++ pinctrl-names = "default"; ++ rockchip,trcm-sync-tx-only; ++ status = "okay"; ++}; ++ ++&pinctrl { ++ audio-amplifier { ++ spk_amp_enable_h: spk-amp-enable-h { ++ rockchip,pins = ++ <4 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ gpio-control { ++ btn_pins_ctrl: btn-pins-ctrl { ++ rockchip,pins = ++ <3 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PC7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD1 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA1 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA4 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ ++ btn_pins_vol: btn-pins-vol { ++ rockchip,pins = ++ <4 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ gpio-lcd { ++ lcd_rst: lcd-rst { ++ rockchip,pins = ++ <0 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ gpio-leds { ++ led_pins: led-pins { ++ rockchip,pins = ++ <4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>, ++ <4 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>, ++ <4 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ hp-detect { ++ hp_det: hp-det { ++ rockchip,pins = ++ <4 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ pmic { ++ pmic_int_l: pmic-int-l { ++ rockchip,pins = ++ <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ sdio-pwrseq { ++ wifi_enable_h: wifi-enable-h { ++ rockchip,pins = ++ <0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ usb { ++ vcc5v0_host_en: vcc5v0-host-en { ++ rockchip,pins = ++ <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ ++ vcc5v0_otg_en: vcc5v0-otg-en { ++ rockchip,pins = ++ <4 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ vcc-lcd { ++ vcc_lcd_en: vcc-lcd-en { ++ rockchip,pins = ++ <0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ vcc-wifi { ++ vcc_wifi_h: vcc-wifi-h { ++ rockchip,pins = ++ <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++}; ++ ++&pmu_io_domains { ++ status = "okay"; ++ pmuio1-supply = <&vcc3v3_pmu>; ++ pmuio2-supply = <&vcca1v8_pmu>; ++ vccio1-supply = <&vccio_acodec>; ++ vccio3-supply = <&vccio_sd>; ++ vccio4-supply = <&vcca1v8_pmu>; ++ vccio5-supply = <&vcc2v8_dvp>; ++ vccio6-supply = <&vcc1v8_dvp>; ++ vccio7-supply = <&vcc_3v3>; ++}; ++ ++&pwm4 { ++ status = "okay"; ++}; ++ ++&saradc { ++ vref-supply = <&vcc_1v8>; ++ status = "okay"; ++}; ++ ++&sdhci { ++ bus-width = <8>; ++ mmc-hs200-1_8v; ++ non-removable; ++ pinctrl-0 = <&emmc_bus8>, <&emmc_clk>, <&emmc_cmd>, ++ <&emmc_datastrobe>, <&emmc_rstnout>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&sdmmc0 { ++ bus-width = <4>; ++ cap-mmc-highspeed; ++ cap-sd-highspeed; ++ disable-wp; ++ pinctrl-0 = <&sdmmc0_bus4>, <&sdmmc0_clk>, <&sdmmc0_cmd>, ++ <&sdmmc0_det>; ++ pinctrl-names = "default"; ++ sd-uhs-sdr104; ++ vqmmc-supply = <&vccio_sd>; ++ status = "okay"; ++}; ++ ++&sdmmc1 { ++ bus-width = <4>; ++ cap-sd-highspeed; ++ cap-sdio-irq; ++ keep-power-in-suspend; ++ mmc-pwrseq = <&sdio_pwrseq>; ++ non-removable; ++ pinctrl-0 = <&sdmmc1_bus4>, <&sdmmc1_cmd>, <&sdmmc1_clk>; ++ pinctrl-names = "default"; ++ vmmc-supply = <&vcc_wifi>; ++ status = "okay"; ++}; ++ ++&sdmmc2 { ++ bus-width = <4>; ++ cap-mmc-highspeed; ++ cap-sd-highspeed; ++ disable-wp; ++ pinctrl-0 = <&sdmmc2m1_bus4>, <&sdmmc2m1_cmd>, <&sdmmc2m1_clk>, ++ <&sdmmc2m1_det>; ++ pinctrl-names = "default"; ++ sd-uhs-sdr104; ++ vqmmc-supply = <&vcc2v8_dvp>; ++ status = "okay"; ++}; ++ ++&tsadc { ++ rockchip,hw-tshut-mode = <1>; ++ rockchip,hw-tshut-polarity = <0>; ++ status = "okay"; ++}; ++ ++&uart1 { ++ pinctrl-0 = <&uart1m0_xfer>, <&uart1m0_ctsn>, <&uart1m0_rtsn>; ++ pinctrl-names = "default"; ++ uart-has-rtscts; ++ status = "okay"; ++ ++ bluetooth { ++ compatible = "realtek,rtl8821cs-bt", "realtek,rtl8723bs-bt"; ++ device-wake-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>; ++ enable-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; ++ host-wake-gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>; ++ }; ++}; ++ ++&uart2 { ++ status = "okay"; ++}; ++ ++&usb_host0_xhci { ++ phys = <&usb2phy0_otg>; ++ phy-names = "usb2-phy"; ++ status = "okay"; ++}; ++ ++&usb_host1_xhci { ++ status = "okay"; ++}; ++ ++&usb2phy0 { ++ status = "okay"; ++}; ++ ++&usb2phy0_otg { ++ status = "okay"; ++}; ++ ++&usb2phy0_host { ++ phy-supply = <&vcc5v0_host>; ++ status = "okay"; ++}; ++ ++&vop { ++ assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; ++ assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; ++ status = "okay"; ++}; ++ ++&vop_mmu { ++ status = "okay"; ++}; ++ ++&vp0 { ++ vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { ++ reg = ; ++ remote-endpoint = <&hdmi_in_vp0>; ++ }; ++}; ++ ++&vp1 { ++ vp1_out_dsi0: endpoint@ROCKCHIP_VOP2_EP_MIPI0 { ++ reg = ; ++ remote-endpoint = <&dsi0_in_vp1>; ++ }; ++}; +diff --git a/arch/arm/mach-rockchip/rk3568/Kconfig b/arch/arm/mach-rockchip/rk3568/Kconfig +index baa51349f4..a97da8ae55 100644 +--- a/arch/arm/mach-rockchip/rk3568/Kconfig ++++ b/arch/arm/mach-rockchip/rk3568/Kconfig +@@ -22,6 +22,11 @@ config TARGET_ODROID_M1_RK3568 + help + Hardkernel ODROID-M1 single board computer with a RK3568B2 SoC. + ++config TARGET_POWKIDDY_X55_RK3566 ++ bool "Powkiddy X55" ++ help ++ Powkiddy X55 handheld gaming console with an RK3566 SoC. ++ + config TARGET_QUARTZ64_RK3566 + bool "Pine64 Quartz64" + help +@@ -45,5 +50,6 @@ source "board/rockchip/evb_rk3568/Kconfig" + source "board/anbernic/rgxx3_rk3566/Kconfig" + source "board/hardkernel/odroid_m1/Kconfig" + source "board/pine64/quartz64_rk3566/Kconfig" ++source "board/powkiddy/x55/Kconfig" + + endif +diff --git a/board/powkiddy/x55/Kconfig b/board/powkiddy/x55/Kconfig +new file mode 100644 +index 0000000000..a7b3ed4d0d +--- /dev/null ++++ b/board/powkiddy/x55/Kconfig +@@ -0,0 +1,15 @@ ++if TARGET_POWKIDDY_X55_RK3566 ++ ++config SYS_BOARD ++ default "x55" ++ ++config SYS_VENDOR ++ default "powkiddy" ++ ++config SYS_CONFIG_NAME ++ default "powkiddy-x55-rk3566" ++ ++config BOARD_SPECIFIC_OPTIONS ++ def_bool y ++ ++endif +diff --git a/board/powkiddy/x55/MAINTAINERS b/board/powkiddy/x55/MAINTAINERS +new file mode 100644 +index 0000000000..9ed48f408e +--- /dev/null ++++ b/board/powkiddy/x55/MAINTAINERS +@@ -0,0 +1,9 @@ ++X55 ++M: Chris Morgan ++S: Maintained ++F: board/powkiddy/x55 ++F: include/configs/powkiddy-x55-rk3566.h ++F: configs/powkiddy-x55-rk3566_defconfig ++F: arch/arm/dts/rk3566-powkiddy-x55.dts ++F: arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi ++F: doc/board/powkiddy/x55.rst +diff --git a/board/powkiddy/x55/Makefile b/board/powkiddy/x55/Makefile +new file mode 100644 +index 0000000000..55c8c16aa1 +--- /dev/null ++++ b/board/powkiddy/x55/Makefile +@@ -0,0 +1,6 @@ ++# SPDX-License-Identifier: GPL-2.0+ ++# ++# Copyright (c) 2023 Chris Morgan ++# ++ ++obj-y += x55.o +diff --git a/board/powkiddy/x55/x55.c b/board/powkiddy/x55/x55.c +new file mode 100644 +index 0000000000..8d98baa24f +--- /dev/null ++++ b/board/powkiddy/x55/x55.c +@@ -0,0 +1,42 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Copyright (c) 2023 Chris Morgan ++ */ ++ ++#include ++#include ++ ++#define GPIO4_BASE 0xfe770000 ++#define GPIO_SWPORT_DR_L 0x0000 ++#define GPIO_SWPORT_DDR_L 0x0008 ++#define GPIO_B4 BIT(12) ++#define GPIO_B5 BIT(13) ++#define GPIO_B6 BIT(14) ++ ++#define GPIO_WRITEMASK(bits) ((bits) << 16) ++ ++/* ++ * Start LED very early so user knows device is on. Set color ++ * to red. ++ */ ++void spl_board_init(void) ++{ ++ setup_boot_mode(); ++ ++ /* Set GPIO4_B4, GPIO4_B5, and GPIO4_B6 to output. */ ++ writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | \ ++ (GPIO_B6 | GPIO_B5 | GPIO_B4), ++ (GPIO4_BASE + GPIO_SWPORT_DDR_L)); ++ /* Set GPIO4_B5 and GPIO4_B6 to 0 and GPIO4_B4 to 1. */ ++ writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B4, ++ (GPIO4_BASE + GPIO_SWPORT_DR_L)); ++} ++ ++int rk_board_late_init(void) ++{ ++ /* Turn off red LED and turn on orange LED. */ ++ writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B6, ++ (GPIO4_BASE + GPIO_SWPORT_DR_L)); ++ ++ return 0; ++} +diff --git a/configs/powkiddy-x55-rk3566_defconfig b/configs/powkiddy-x55-rk3566_defconfig +new file mode 100644 +index 0000000000..f9a513f97c +--- /dev/null ++++ b/configs/powkiddy-x55-rk3566_defconfig +@@ -0,0 +1,92 @@ ++CONFIG_ARM=y ++CONFIG_SKIP_LOWLEVEL_INIT=y ++CONFIG_COUNTER_FREQUENCY=24000000 ++CONFIG_ARCH_ROCKCHIP=y ++CONFIG_TEXT_BASE=0x00a00000 ++CONFIG_SPL_GPIO=y ++CONFIG_SPL_LIBCOMMON_SUPPORT=y ++CONFIG_SPL_LIBGENERIC_SUPPORT=y ++CONFIG_NR_DRAM_BANKS=2 ++CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y ++CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc00000 ++CONFIG_DEFAULT_DEVICE_TREE="rk3566-powkiddy-x55" ++CONFIG_ROCKCHIP_RK3568=y ++CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y ++CONFIG_SPL_ROCKCHIP_COMMON_BOARD=y ++CONFIG_ROCKCHIP_RK8XX_DISABLE_BOOT_ON_POWERON=y ++CONFIG_SPL_MMC=y ++CONFIG_SPL_SERIAL=y ++CONFIG_SPL_STACK_R_ADDR=0x600000 ++CONFIG_TARGET_POWKIDDY_X55_RK3566=y ++CONFIG_SPL_STACK=0x400000 ++CONFIG_DEBUG_UART_BASE=0xFE660000 ++CONFIG_DEBUG_UART_CLOCK=24000000 ++CONFIG_SYS_LOAD_ADDR=0xc00800 ++CONFIG_DEBUG_UART=y ++CONFIG_FIT=y ++CONFIG_FIT_VERBOSE=y ++CONFIG_SPL_FIT_SIGNATURE=y ++CONFIG_SPL_LOAD_FIT=y ++CONFIG_LEGACY_IMAGE_FORMAT=y ++CONFIG_OF_STDOUT_VIA_ALIAS=y ++CONFIG_DEFAULT_FDT_FILE="rk3566-powkiddy-x55.dtb" ++# CONFIG_DISPLAY_CPUINFO is not set ++CONFIG_DISPLAY_BOARDINFO_LATE=y ++CONFIG_SPL_MAX_SIZE=0x40000 ++CONFIG_SPL_PAD_TO=0x7f8000 ++CONFIG_SPL_HAS_BSS_LINKER_SECTION=y ++CONFIG_SPL_BSS_START_ADDR=0x4000000 ++CONFIG_SPL_BSS_MAX_SIZE=0x4000 ++CONFIG_SPL_BOARD_INIT=y ++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set ++# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set ++CONFIG_SPL_STACK_R=y ++CONFIG_SPL_ADC=y ++CONFIG_SPL_POWER=y ++CONFIG_SPL_ATF=y ++CONFIG_CMD_PWM=y ++CONFIG_CMD_GPT=y ++CONFIG_CMD_MMC=y ++# CONFIG_CMD_SETEXPR is not set ++# CONFIG_SPL_DOS_PARTITION is not set ++CONFIG_SPL_OF_CONTROL=y ++CONFIG_OF_LIVE=y ++CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" ++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y ++# CONFIG_NET is not set ++CONFIG_SPL_DM_SEQ_ALIAS=y ++CONFIG_SPL_REGMAP=y ++CONFIG_SPL_SYSCON=y ++CONFIG_SPL_CLK=y ++CONFIG_ARM_SMCCC_FEATURES=y ++CONFIG_SCMI_FIRMWARE=y ++CONFIG_ROCKCHIP_GPIO=y ++CONFIG_SYS_I2C_ROCKCHIP=y ++CONFIG_MISC=y ++CONFIG_SUPPORT_EMMC_RPMB=y ++CONFIG_MMC_DW=y ++CONFIG_MMC_DW_ROCKCHIP=y ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_SDMA=y ++CONFIG_MMC_SDHCI_ROCKCHIP=y ++CONFIG_SPL_PINCTRL=y ++CONFIG_DM_PMIC=y ++CONFIG_DM_PMIC_FAN53555=y ++CONFIG_PMIC_RK8XX=y ++CONFIG_SPL_DM_REGULATOR=y ++CONFIG_SPL_DM_REGULATOR_FIXED=y ++CONFIG_REGULATOR_RK8XX=y ++CONFIG_PWM_ROCKCHIP=y ++CONFIG_SPL_RAM=y ++# CONFIG_RAM_ROCKCHIP_DEBUG is not set ++CONFIG_DM_RNG=y ++CONFIG_RNG_ROCKCHIP=y ++# CONFIG_RNG_SMCCC_TRNG is not set ++CONFIG_BAUDRATE=1500000 ++CONFIG_DEBUG_UART_SHIFT=2 ++CONFIG_SYS_NS16550_MEM32=y ++CONFIG_SYSRESET=y ++CONFIG_REGEX=y ++# CONFIG_RSA is not set ++CONFIG_ERRNO_STR=y ++# CONFIG_EFI_LOADER is not set +diff --git a/doc/board/index.rst b/doc/board/index.rst +index 531e547e7e..dd4bce9981 100644 +--- a/doc/board/index.rst ++++ b/doc/board/index.rst +@@ -36,6 +36,7 @@ Board-specific doc + nxp/index + openpiton/index + phytec/index ++ powkiddy/index + purism/index + qualcomm/index + renesas/index +diff --git a/doc/board/powkiddy/index.rst b/doc/board/powkiddy/index.rst +new file mode 100644 +index 0000000000..b0115a73d4 +--- /dev/null ++++ b/doc/board/powkiddy/index.rst +@@ -0,0 +1,9 @@ ++.. SPDX-License-Identifier: GPL-2.0+ ++ ++Powkiddy ++======== ++ ++.. toctree:: ++ :maxdepth: 2 ++ ++ x55.rst +diff --git a/doc/board/powkiddy/x55.rst b/doc/board/powkiddy/x55.rst +new file mode 100644 +index 0000000000..cd7456883b +--- /dev/null ++++ b/doc/board/powkiddy/x55.rst +@@ -0,0 +1,25 @@ ++.. SPDX-License-Identifier: GPL-2.0+ ++ ++U-Boot for Powkiddy X55 Handheld Gaming Console ++=============================================== ++ ++This allows U-Boot to boot the Powkiddy X55 handheld gaming console. ++The X55 is very similar to the other existing Powkiddy RK3566 based ++devices, except that ADC channels 0-3 are used for the ADC joysticks. ++As a result the same auto detection functionality cannot be used on ++this device as the others. ++ ++The indicator LED will change color based on the boot stage. Red means ++the device is powered on but has yet to start U-Boot, amber means the ++device has started U-Boot and is waiting to boot Linux, and when Linux ++has taken over the LED should change to green (or however it has been ++configured by the user). ++ ++In the event the device needs to enter Rockchip download mode, a user ++can, starting with the power off, hold the left joystick all the way ++to the left and then power on the device. At this point the USB-C port ++marked DC/OTG should be set to peripheral mode and allow a user to ++manipulate the device with the rkdeveloptool tool. ++ ++See :doc:`../rockchip/devicetree/rockchip` for building and flashing ++instructions. +diff --git a/doc/board/rockchip/rockchip.rst b/doc/board/rockchip/rockchip.rst +index 18d0b6f089..4e290cecdc 100644 +--- a/doc/board/rockchip/rockchip.rst ++++ b/doc/board/rockchip/rockchip.rst +@@ -98,6 +98,7 @@ List of mainline supported Rockchip boards: + - Pine64 SOQuartz on Blade (soquartz-blade-rk3566) + - Pine64 SOQuartz on CM4-IO (soquartz-cm4-rk3566) + - Pine64 SOQuartz on Model A (soquartz-model-a-rk3566) ++ - Powkiddy X55 (powkiddy-x55-rk3566) + - Radxa CM3 IO Board (radxa-cm3-io-rk3566) + + * rk3568 +diff --git a/include/configs/powkiddy-x55-rk3566.h b/include/configs/powkiddy-x55-rk3566.h +new file mode 100644 +index 0000000000..a25b6de455 +--- /dev/null ++++ b/include/configs/powkiddy-x55-rk3566.h +@@ -0,0 +1,14 @@ ++/* SPDX-License-Identifier: GPL-2.0+ */ ++ ++#ifndef __POWKIDDY_X55_RK3566_H ++#define __POWKIDDY_X55_RK3566_H ++ ++#include ++ ++#define ROCKCHIP_DEVICE_SETTINGS \ ++ "stdout=serial,vidconsole\0" \ ++ "stderr=serial,vidconsole\0" ++ ++#define RK_DNL_ADC_CHAN 0 ++ ++#endif +-- +2.34.1 diff --git a/projects/Rockchip/packages/u-boot/patches/RK3566-X55/003-fix-dtb-and-vs.patch b/projects/Rockchip/packages/u-boot/patches/RK3566-X55/003-fix-dtb-and-vs.patch new file mode 100644 index 0000000000..08d3f2b040 --- /dev/null +++ b/projects/Rockchip/packages/u-boot/patches/RK3566-X55/003-fix-dtb-and-vs.patch @@ -0,0 +1,35 @@ +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 2445663d4..194605ff0 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -33,7 +33,7 @@ + + #define GPIO_WRITEMASK(bits) ((bits) << 16) + +-#define DTB_DIR "rockchip/" ++#define DTB_DIR "" + + struct rg3xx_model { + const u16 adc_value; +@@ -375,7 +375,7 @@ int rgxx3_detect_device(void) + if (ret) { + if (board_id == RG353V) + board_id = RG353VS; +- if (board_id == RG353P) ++ else if (board_id == RG353P) + board_id = RG353PS; + else + board_id = RGARCS; +diff --git a/configs/anbernic-rgxx3-rk3566_defconfig b/configs/anbernic-rgxx3-rk3566_defconfig +index 4e72f7581..27911cc9f 100644 +--- a/configs/anbernic-rgxx3-rk3566_defconfig ++++ b/configs/anbernic-rgxx3-rk3566_defconfig +@@ -30,7 +30,7 @@ CONFIG_SPL_LOAD_FIT=y + CONFIG_LEGACY_IMAGE_FORMAT=y + CONFIG_OF_BOARD_SETUP=y + CONFIG_OF_STDOUT_VIA_ALIAS=y +-CONFIG_DEFAULT_FDT_FILE="rockchip/rk3566-anbernic-rgxx3.dtb" ++CONFIG_DEFAULT_FDT_FILE="rk3566-anbernic-rgxx3.dtb" + # CONFIG_CONSOLE_MUX is not set + # CONFIG_DISPLAY_CPUINFO is not set + CONFIG_DISPLAY_BOARDINFO_LATE=y diff --git a/projects/Rockchip/packages/u-boot/patches/RK3566/001-v3-add_additional_boards_and_features_to_rgxx3.patch b/projects/Rockchip/packages/u-boot/patches/RK3566/001-v3-add_additional_boards_and_features_to_rgxx3.patch new file mode 100644 index 0000000000..602bbcfa8e --- /dev/null +++ b/projects/Rockchip/packages/u-boot/patches/RK3566/001-v3-add_additional_boards_and_features_to_rgxx3.patch @@ -0,0 +1,919 @@ +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 0/7] Add Additional Boards and Features to RGxx3 +Date: Mon, 11 Dec 2023 17:21:18 -0600 [thread overview] +Message-ID: <20231211232125.171438-1-macroalpha82@gmail.com> (raw) + +From: Chris Morgan + +The RGxx3 is a pseudo-device for U-Boot that works for every Anbernic +RGxx3 series device on the market. Add support for another series of +very similar devices from Powkiddy. + +Changes since V2: + - Modify the mach-rockchip level rockchip_dnl_key_pressed() so that + we can also call it in SPL mode and eliminate the board specific + function. This requires adding ADC support to SPL. Additionally, + I had to change the regulator for the saradc to a fixed regulator + and add GPIO and regulator support to SPL. + - Move the board specific board_rng_seed to the mach-rockchip level + board file so that other rockchip boards with a hardware RNG can + benefit. This should only be called if both the Rockchip + hardware RNG as well as the rng seed functions are enabled. + - Add two new boards (the RG-ARC-D and RG-ARC-S). I removed the + previous code review due to the extensive changes made. + +Changes since V1: + - Update verbiage around function button to say "recovery" mode + instead of calling it "maskrom" mode, which has a specific + meaning. Also note that recovery function was done in a board + specific manner to ensure it can run early. + - Update board level documentation for the RGxx3. + +Chris Morgan (7): + board: rockchip: Refactor panel auto-detect code + spl: Add Kconfig options for ADC + rockchip: boot_mode: Allow rockchip_dnl_key_pressed() in SPL + board: rockchip: Add Recovery Button for Anbernic RGxx3 + rockchip: board: Add board_rng_seed() for all Rockchip devices + board: rockchip: Add support for new boards to RGxx3 + doc: board: anbernic: Update rgxx3 to add new boards + + .../arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi | 11 + + arch/arm/mach-rockchip/Makefile | 4 +- + arch/arm/mach-rockchip/board.c | 32 +++ + arch/arm/mach-rockchip/boot_mode.c | 11 +- + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 194 +++++++++++------- + common/spl/Kconfig | 7 + + configs/anbernic-rgxx3-rk3566_defconfig | 16 +- + doc/board/anbernic/rgxx3.rst | 20 +- + drivers/Makefile | 1 + + drivers/adc/Makefile | 2 +- + include/configs/anbernic-rgxx3-rk3566.h | 2 + + 11 files changed, 210 insertions(+), 90 deletions(-) + +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 1/7] board: rockchip: Refactor panel auto-detect code +Date: Mon, 11 Dec 2023 17:21:19 -0600 [thread overview] +Message-ID: <20231211232125.171438-2-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Make the inability to detect a panel using the auto detection code not +fail the entire boot process. This means that if the panel ID cannot +be read we don't set an environment variable for the panel, and if an +environment variable for the panel is not set we don't attempt to +update the compatible string. Changes to the code also ensure that +when there are multiple compatible strings required for the panel +we use them both, which solves some issues that will pop up soon +for the Linux driver. + +Signed-off-by: Chris Morgan +--- + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 115 +++++++++++++-------- + 1 file changed, 74 insertions(+), 41 deletions(-) + +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 3f1a42d184..3d0c614623 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -40,6 +40,7 @@ struct rg3xx_model { + const char *board; + const char *board_name; + const char *fdtfile; ++ const bool detect_panel; + }; + + enum rgxx3_device_id { +@@ -54,52 +55,67 @@ enum rgxx3_device_id { + + static const struct rg3xx_model rg3xx_model_details[] = { + [RG353M] = { +- 517, /* Observed average from device */ +- "rk3566-anbernic-rg353m", +- "RG353M", +- DTB_DIR "rk3566-anbernic-rg353p.dtb", /* Identical devices */ ++ .adc_value = 517, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg353m", ++ .board_name = "RG353M", ++ /* Device is identical to RG353P. */ ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353p.dtb", ++ .detect_panel = 1, + }, + [RG353P] = { +- 860, /* Documented value of 860 */ +- "rk3566-anbernic-rg353p", +- "RG353P", +- DTB_DIR "rk3566-anbernic-rg353p.dtb", ++ .adc_value = 860, /* Documented value of 860 */ ++ .board = "rk3566-anbernic-rg353p", ++ .board_name = "RG353P", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353p.dtb", ++ .detect_panel = 1, + }, + [RG353V] = { +- 695, /* Observed average from device */ +- "rk3566-anbernic-rg353v", +- "RG353V", +- DTB_DIR "rk3566-anbernic-rg353v.dtb", ++ .adc_value = 695, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg353v", ++ .board_name = "RG353V", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353v.dtb", ++ .detect_panel = 1, + }, + [RG503] = { +- 1023, /* Observed average from device */ +- "rk3566-anbernic-rg503", +- "RG503", +- DTB_DIR "rk3566-anbernic-rg503.dtb", ++ .adc_value = 1023, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg503", ++ .board_name = "RG503", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg503.dtb", ++ .detect_panel = 0, + }, + /* Devices with duplicate ADC value */ + [RG353PS] = { +- 860, /* Observed average from device */ +- "rk3566-anbernic-rg353ps", +- "RG353PS", +- DTB_DIR "rk3566-anbernic-rg353ps.dtb", ++ .adc_value = 860, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg353ps", ++ .board_name = "RG353PS", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353ps.dtb", ++ .detect_panel = 1, + }, + [RG353VS] = { +- 695, /* Gathered from second hand information */ +- "rk3566-anbernic-rg353vs", +- "RG353VS", +- DTB_DIR "rk3566-anbernic-rg353vs.dtb", ++ .adc_value = 695, /* Gathered from second hand information */ ++ .board = "rk3566-anbernic-rg353vs", ++ .board_name = "RG353VS", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg353vs.dtb", ++ .detect_panel = 1, + }, + }; + + struct rg353_panel { + const u16 id; +- const char *panel_compat; ++ const char *panel_compat[2]; + }; + + static const struct rg353_panel rg353_panel_details[] = { +- { .id = 0x3052, .panel_compat = "newvision,nv3051d"}, +- { .id = 0x3821, .panel_compat = "anbernic,rg353v-panel-v2"}, ++ { ++ .id = 0x3052, ++ .panel_compat[0] = "anbernic,rg353p-panel", ++ .panel_compat[1] = "newvision,nv3051d", ++ }, ++ { ++ .id = 0x3821, ++ .panel_compat[0] = "anbernic,rg353v-panel-v2", ++ .panel_compat[1] = NULL, ++ }, + }; + + /* +@@ -298,11 +314,10 @@ int rgxx3_detect_display(void) + if (!panel) { + printf("Unable to identify panel_id %x\n", + (panel_id[0] << 8) | panel_id[1]); +- env_set("panel", "unknown"); + return -EINVAL; + } + +- env_set("panel", panel->panel_compat); ++ env_set("panel", panel->panel_compat[0]); + + return 0; + } +@@ -367,13 +382,14 @@ int rgxx3_detect_device(void) + rg3xx_model_details[board_id].board_name); + env_set("fdtfile", rg3xx_model_details[board_id].fdtfile); + +- /* Detect the panel type for any device that isn't a 503. */ +- if (board_id == RG503) ++ /* Skip panel detection for when it is not needed. */ ++ if (!rg3xx_model_details[board_id].detect_panel) + return 0; + ++ /* Warn but don't fail for errors in auto-detection of the panel. */ + ret = rgxx3_detect_display(); + if (ret) +- return ret; ++ printf("Failed to detect panel type\n"); + + return 0; + } +@@ -400,7 +416,8 @@ int rk_board_late_init(void) + + int ft_board_setup(void *blob, struct bd_info *bd) + { +- int node, ret; ++ const struct rg353_panel *panel = NULL; ++ int node, ret, i; + char *env; + + /* No fixups necessary for the RG503 */ +@@ -414,6 +431,12 @@ int ft_board_setup(void *blob, struct bd_info *bd) + rg3xx_model_details[RG353M].board_name, + sizeof(rg3xx_model_details[RG353M].board_name)); + ++ env = env_get("panel"); ++ if (!env) { ++ printf("Can't get panel env\n"); ++ return 0; ++ } ++ + /* + * Check if the environment variable doesn't equal the panel. + * If it doesn't, update the devicetree to the correct panel. +@@ -424,12 +447,6 @@ int ft_board_setup(void *blob, struct bd_info *bd) + return -ENODEV; + } + +- env = env_get("panel"); +- if (!env) { +- printf("Can't get panel env\n"); +- return -ENODEV; +- } +- + ret = fdt_node_check_compatible(blob, node, env); + if (ret < 0) + return -ENODEV; +@@ -438,8 +455,24 @@ int ft_board_setup(void *blob, struct bd_info *bd) + if (!ret) + return 0; + +- do_fixup_by_path_string(blob, "/dsi@fe060000/panel@0", +- "compatible", env); ++ /* Panels don't match, search by first compatible value. */ ++ for (i = 0; i < ARRAY_SIZE(rg353_panel_details); i++) { ++ if (!strcmp(env, rg353_panel_details[i].panel_compat[0])) { ++ panel = &rg353_panel_details[i]; ++ break; ++ } ++ } ++ ++ if (!panel) { ++ printf("Unable to identify panel by compat string\n"); ++ return -ENODEV; ++ } ++ ++ /* Set the compatible with the auto-detected values */ ++ fdt_setprop_string(blob, node, "compatible", panel->panel_compat[0]); ++ if (panel->panel_compat[1]) ++ fdt_appendprop_string(blob, node, "compatible", ++ panel->panel_compat[1]); + + return 0; + } +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 2/7] spl: Add Kconfig options for ADC +Date: Mon, 11 Dec 2023 17:21:20 -0600 [thread overview] +Message-ID: <20231211232125.171438-3-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Add kconfig options to enable ADC in SPL + +Signed-off-by: Chris Morgan +--- + common/spl/Kconfig | 7 +++++++ + drivers/Makefile | 1 + + drivers/adc/Makefile | 2 +- + 3 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/common/spl/Kconfig b/common/spl/Kconfig +index c521b02f4a..ada9dcea5c 100644 +--- a/common/spl/Kconfig ++++ b/common/spl/Kconfig +@@ -579,6 +579,13 @@ config SPL_FIT_IMAGE_TINY + ensure this information is available to the next image + invoked). + ++config SPL_ADC ++ bool "Support ADC drivers" ++ help ++ Enable ADC drivers in SPL. These drivers can allow the reading of ++ analog values from one or more channels. Enable this option to ++ build the drivers in drivers/adc as part of an SPL build. ++ + config SPL_CACHE + bool "Support CACHE drivers" + help +diff --git a/drivers/Makefile b/drivers/Makefile +index bf73b7718c..81ba2c534e 100644 +--- a/drivers/Makefile ++++ b/drivers/Makefile +@@ -1,5 +1,6 @@ + # SPDX-License-Identifier: GPL-2.0+ + ++obj-$(CONFIG_$(SPL_)ADC) += adc/ + obj-$(CONFIG_$(SPL_TPL_)BIOSEMU) += bios_emulator/ + obj-$(CONFIG_$(SPL_TPL_)BLK) += block/ + obj-$(CONFIG_$(SPL_TPL_)BOOTCOUNT_LIMIT) += bootcount/ +diff --git a/drivers/adc/Makefile b/drivers/adc/Makefile +index 5336c82097..9eb07769b0 100644 +--- a/drivers/adc/Makefile ++++ b/drivers/adc/Makefile +@@ -4,7 +4,7 @@ + # Przemyslaw Marczak + # + +-obj-$(CONFIG_ADC) += adc-uclass.o ++obj-$(CONFIG_$(SPL_)ADC) += adc-uclass.o + obj-$(CONFIG_ADC_EXYNOS) += exynos-adc.o + obj-$(CONFIG_ADC_SANDBOX) += sandbox.o + obj-$(CONFIG_SARADC_ROCKCHIP) += rockchip-saradc.o +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 3/7] rockchip: boot_mode: Allow rockchip_dnl_key_pressed() in SPL +Date: Mon, 11 Dec 2023 17:21:21 -0600 [thread overview] +Message-ID: <20231211232125.171438-4-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Update the rockchip_dnl_key_pressed() so that it can run in +SPL. Also change the ADC channel to a define that can be +overridden by a board specific option. + +Signed-off-by: Chris Morgan +--- + arch/arm/mach-rockchip/Makefile | 4 ++-- + arch/arm/mach-rockchip/boot_mode.c | 11 ++++++++++- + 2 files changed, 12 insertions(+), 3 deletions(-) + +diff --git a/arch/arm/mach-rockchip/Makefile b/arch/arm/mach-rockchip/Makefile +index 1dc92066bb..ff089ae949 100644 +--- a/arch/arm/mach-rockchip/Makefile ++++ b/arch/arm/mach-rockchip/Makefile +@@ -15,13 +15,13 @@ obj-tpl-$(CONFIG_ROCKCHIP_PX30) += px30-board-tpl.o + + obj-spl-$(CONFIG_ROCKCHIP_RK3036) += rk3036-board-spl.o + +-ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),) +- + # Always include boot_mode.o, as we bypass it (i.e. turn it off) + # inside of boot_mode.c when CONFIG_ROCKCHIP_BOOT_MODE_REG is 0. This way, + # we can have the preprocessor correctly recognise both 0x0 and 0 + # meaning "turn it off". + obj-y += boot_mode.o ++ ++ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TPL_BUILD),) + obj-$(CONFIG_ROCKCHIP_COMMON_BOARD) += board.o + obj-$(CONFIG_MISC_INIT_R) += misc.o + endif +diff --git a/arch/arm/mach-rockchip/boot_mode.c b/arch/arm/mach-rockchip/boot_mode.c +index eb8f65ae4e..d2308768be 100644 +--- a/arch/arm/mach-rockchip/boot_mode.c ++++ b/arch/arm/mach-rockchip/boot_mode.c +@@ -38,6 +38,10 @@ void set_back_to_bootrom_dnl_flag(void) + #define KEY_DOWN_MIN_VAL 0 + #define KEY_DOWN_MAX_VAL 30 + ++#ifndef RK_DNL_ADC_CHAN ++#define RK_DNL_ADC_CHAN 1 ++#endif ++ + __weak int rockchip_dnl_key_pressed(void) + { + unsigned int val; +@@ -52,7 +56,8 @@ __weak int rockchip_dnl_key_pressed(void) + ret = -ENODEV; + uclass_foreach_dev(dev, uc) { + if (!strncmp(dev->name, "saradc", 6)) { +- ret = adc_channel_single_shot(dev->name, 1, &val); ++ ret = adc_channel_single_shot(dev->name, ++ RK_DNL_ADC_CHAN, &val); + break; + } + } +@@ -73,11 +78,13 @@ __weak int rockchip_dnl_key_pressed(void) + + void rockchip_dnl_mode_check(void) + { ++#if CONFIG_IS_ENABLED(ADC) + if (rockchip_dnl_key_pressed()) { + printf("download key pressed, entering download mode..."); + set_back_to_bootrom_dnl_flag(); + do_reset(NULL, 0, 0, NULL); + } ++#endif + } + + int setup_boot_mode(void) +@@ -90,6 +97,7 @@ int setup_boot_mode(void) + boot_mode = readl(reg); + debug("%s: boot mode 0x%08x\n", __func__, boot_mode); + ++#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) + /* Clear boot mode */ + writel(BOOT_NORMAL, reg); + +@@ -103,6 +111,7 @@ int setup_boot_mode(void) + env_set("preboot", "setenv preboot; ums mmc 0"); + break; + } ++#endif + + return 0; + } +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 4/7] board: rockchip: Add Recovery Button for Anbernic RGxx3 +Date: Mon, 11 Dec 2023 17:21:22 -0600 [thread overview] +Message-ID: <20231211232125.171438-5-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Add support for users to enter recovery mode by holding the function +button when they power up the device. + +Since the device has soldered eMMC and sometimes does not expose a clk +pin on the mainboard there is a small chance that a user who flashes a +bad bootloader may not be able to recover if the headers themselves +are valid. As a result this check is done during spl_early_init() to +ensure that it runs as early as possible, and it does so by directly +manipulating the ADC hardware in lieu of loading the ADC driver. + +Signed-off-by: Chris Morgan +--- + arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi | 11 +++++++++++ + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 6 +++++- + configs/anbernic-rgxx3-rk3566_defconfig | 16 ++++++++++++---- + include/configs/anbernic-rgxx3-rk3566.h | 2 ++ + 4 files changed, 30 insertions(+), 5 deletions(-) + +diff --git a/arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi b/arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi +index f986e1941e..e3ab196d22 100644 +--- a/arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi ++++ b/arch/arm/dts/rk3566-anbernic-rgxx3-u-boot.dtsi +@@ -76,6 +76,12 @@ + /delete-property/ clock-names; + }; + ++&saradc { ++ bootph-all; ++ vref-supply = <&vcc_sys>; ++ status = "okay"; ++}; ++ + &sdhci { + pinctrl-0 = <&emmc_bus8>, <&emmc_clk>, <&emmc_cmd>, + <&emmc_datastrobe>, <&emmc_rstnout>; +@@ -94,3 +100,8 @@ + bootph-all; + status = "okay"; + }; ++ ++&vcc_sys { ++ bootph-all; ++ status = "okay"; ++}; +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 3d0c614623..45854709f5 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -5,6 +5,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -119,11 +120,14 @@ static const struct rg353_panel rg353_panel_details[] = { + }; + + /* +- * Start LED very early so user knows device is on. Set color ++ * Check if rockchip_dnl button is pressed and reboot into rockusb if ++ * true. Start LED very early so user knows device is on. Set color + * to red. + */ + void spl_board_init(void) + { ++ setup_boot_mode(); ++ + /* Set GPIO0_C5, GPIO0_C6, and GPIO0_C7 to output. */ + writel(GPIO_WRITEMASK(GPIO_C7 | GPIO_C6 | GPIO_C5) | \ + (GPIO_C7 | GPIO_C6 | GPIO_C5), +diff --git a/configs/anbernic-rgxx3-rk3566_defconfig b/configs/anbernic-rgxx3-rk3566_defconfig +index ed6643d9d4..4e72f75815 100644 +--- a/configs/anbernic-rgxx3-rk3566_defconfig ++++ b/configs/anbernic-rgxx3-rk3566_defconfig +@@ -3,6 +3,7 @@ CONFIG_SKIP_LOWLEVEL_INIT=y + CONFIG_COUNTER_FREQUENCY=24000000 + CONFIG_ARCH_ROCKCHIP=y + CONFIG_TEXT_BASE=0x00a00000 ++CONFIG_SPL_GPIO=y + CONFIG_SPL_LIBCOMMON_SUPPORT=y + CONFIG_SPL_LIBGENERIC_SUPPORT=y + CONFIG_NR_DRAM_BANKS=2 +@@ -24,7 +25,9 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART=y + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y ++CONFIG_SPL_FIT_SIGNATURE=y + CONFIG_SPL_LOAD_FIT=y ++CONFIG_LEGACY_IMAGE_FORMAT=y + CONFIG_OF_BOARD_SETUP=y + CONFIG_OF_STDOUT_VIA_ALIAS=y + CONFIG_DEFAULT_FDT_FILE="rockchip/rk3566-anbernic-rgxx3.dtb" +@@ -32,7 +35,7 @@ CONFIG_DEFAULT_FDT_FILE="rockchip/rk3566-anbernic-rgxx3.dtb" + # CONFIG_DISPLAY_CPUINFO is not set + CONFIG_DISPLAY_BOARDINFO_LATE=y + CONFIG_BOARD_RNG_SEED=y +-CONFIG_SPL_MAX_SIZE=0x20000 ++CONFIG_SPL_MAX_SIZE=0x40000 + CONFIG_SPL_PAD_TO=0x7f8000 + CONFIG_SPL_HAS_BSS_LINKER_SECTION=y + CONFIG_SPL_BSS_START_ADDR=0x4000000 +@@ -41,6 +44,8 @@ CONFIG_SPL_BOARD_INIT=y + # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set + # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set + CONFIG_SPL_STACK_R=y ++CONFIG_SPL_ADC=y ++CONFIG_SPL_POWER=y + CONFIG_SPL_ATF=y + CONFIG_CMD_PWM=y + CONFIG_CMD_GPT=y +@@ -50,8 +55,10 @@ CONFIG_CMD_MMC=y + # CONFIG_SPL_DOS_PARTITION is not set + CONFIG_SPL_OF_CONTROL=y + CONFIG_OF_LIVE=y ++CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" + CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y + # CONFIG_NET is not set ++CONFIG_SPL_DM_SEQ_ALIAS=y + CONFIG_SPL_REGMAP=y + CONFIG_SPL_SYSCON=y + CONFIG_SPL_CLK=y +@@ -67,13 +74,13 @@ CONFIG_MMC_SDHCI=y + CONFIG_MMC_SDHCI_SDMA=y + CONFIG_MMC_SDHCI_ROCKCHIP=y + CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y ++CONFIG_SPL_PINCTRL=y + CONFIG_DM_PMIC=y + CONFIG_DM_PMIC_FAN53555=y + CONFIG_PMIC_RK8XX=y +-CONFIG_REGULATOR_PWM=y +-CONFIG_DM_REGULATOR_GPIO=y ++CONFIG_SPL_DM_REGULATOR=y ++CONFIG_SPL_DM_REGULATOR_FIXED=y + CONFIG_REGULATOR_RK8XX=y +-CONFIG_DM_REGULATOR_SCMI=y + CONFIG_PWM_ROCKCHIP=y + CONFIG_SPL_RAM=y + # CONFIG_RAM_ROCKCHIP_DEBUG is not set +@@ -89,5 +96,6 @@ CONFIG_VIDEO_ROCKCHIP=y + CONFIG_DISPLAY_ROCKCHIP_DW_MIPI=y + CONFIG_VIDEO_BRIDGE=y + CONFIG_REGEX=y ++# CONFIG_RSA is not set + CONFIG_ERRNO_STR=y + # CONFIG_EFI_LOADER is not set +diff --git a/include/configs/anbernic-rgxx3-rk3566.h b/include/configs/anbernic-rgxx3-rk3566.h +index 3c4ea4e7d8..2aaac55c06 100644 +--- a/include/configs/anbernic-rgxx3-rk3566.h ++++ b/include/configs/anbernic-rgxx3-rk3566.h +@@ -9,4 +9,6 @@ + "stdout=serial,vidconsole\0" \ + "stderr=serial,vidconsole\0" + ++#define RK_DNL_ADC_CHAN 0 ++ + #endif +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 5/7] rockchip: board: Add board_rng_seed() for all Rockchip devices +Date: Mon, 11 Dec 2023 17:21:23 -0600 [thread overview] +Message-ID: <20231211232125.171438-6-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Allow all rockchip devices to use the hardware RNG to seed Linux +RNG. + +Signed-off-by: Chris Morgan +--- + arch/arm/mach-rockchip/board.c | 32 ++++++++++++++++++++++ + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 29 -------------------- + 2 files changed, 32 insertions(+), 29 deletions(-) + +diff --git a/arch/arm/mach-rockchip/board.c b/arch/arm/mach-rockchip/board.c +index 57f08e0be0..77145524ea 100644 +--- a/arch/arm/mach-rockchip/board.c ++++ b/arch/arm/mach-rockchip/board.c +@@ -348,3 +348,35 @@ __weak int misc_init_r(void) + return ret; + } + #endif ++ ++#if IS_ENABLED(CONFIG_BOARD_RNG_SEED) && IS_ENABLED(CONFIG_RNG_ROCKCHIP) ++#include ++ ++/* Use hardware rng to seed Linux random. */ ++__weak int board_rng_seed(struct abuf *buf) ++{ ++ struct udevice *dev; ++ size_t len = 0x8; ++ u64 *data; ++ ++ data = malloc(len); ++ if (!data) { ++ printf("Out of memory\n"); ++ return -ENOMEM; ++ } ++ ++ if (uclass_get_device(UCLASS_RNG, 0, &dev) || !dev) { ++ printf("No RNG device\n"); ++ return -ENODEV; ++ } ++ ++ if (dm_rng_read(dev, data, len)) { ++ printf("Reading RNG failed\n"); ++ return -EIO; ++ } ++ ++ abuf_init_set(buf, data, len); ++ ++ return 0; ++} ++#endif +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 45854709f5..7bef5a53f0 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -17,7 +17,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -137,34 +136,6 @@ void spl_board_init(void) + (GPIO0_BASE + GPIO_SWPORT_DR_H)); + } + +-/* Use hardware rng to seed Linux random. */ +-int board_rng_seed(struct abuf *buf) +-{ +- struct udevice *dev; +- size_t len = 0x8; +- u64 *data; +- +- data = malloc(len); +- if (!data) { +- printf("Out of memory\n"); +- return -ENOMEM; +- } +- +- if (uclass_get_device(UCLASS_RNG, 0, &dev) || !dev) { +- printf("No RNG device\n"); +- return -ENODEV; +- } +- +- if (dm_rng_read(dev, data, len)) { +- printf("Reading RNG failed\n"); +- return -EIO; +- } +- +- abuf_init_set(buf, data, len); +- +- return 0; +-} +- + /* + * Buzz the buzzer so the user knows something is going on. Make it + * optional in case PWM is disabled. +-- +2.34.1 +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 6/7] board: rockchip: Add support for new boards to RGxx3 +Date: Mon, 11 Dec 2023 17:21:24 -0600 [thread overview] +Message-ID: <20231211232125.171438-7-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Add support for the Anbernic RG-ARC-D, Anbernic RG-ARC-S, Powkiddy +RK2023, and Powkiddy RGB30 to the Anbernic RGxx3. While the Powkiddy +devices are manufactured by Powkiddy instead of Anbernic, +the hardware is so similar they can all use the same bootloader. + +Signed-off-by: Chris Morgan +--- + board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c | 44 +++++++++++++++++++--- + 1 file changed, 39 insertions(+), 5 deletions(-) + +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 7bef5a53f0..2445663d43 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -48,9 +48,13 @@ enum rgxx3_device_id { + RG353P, + RG353V, + RG503, ++ RGB30, ++ RK2023, ++ RGARCD, + /* Devices with duplicate ADC value */ + RG353PS, + RG353VS, ++ RGARCS, + }; + + static const struct rg3xx_model rg3xx_model_details[] = { +@@ -83,6 +87,27 @@ static const struct rg3xx_model rg3xx_model_details[] = { + .fdtfile = DTB_DIR "rk3566-anbernic-rg503.dtb", + .detect_panel = 0, + }, ++ [RGB30] = { ++ .adc_value = 383, /* Gathered from second hand information */ ++ .board = "rk3566-powkiddy-rgb30", ++ .board_name = "RGB30", ++ .fdtfile = DTB_DIR "rk3566-powkiddy-rgb30.dtb", ++ .detect_panel = 0, ++ }, ++ [RK2023] = { ++ .adc_value = 635, /* Observed average from device */ ++ .board = "rk3566-powkiddy-rk2023", ++ .board_name = "RK2023", ++ .fdtfile = DTB_DIR "rk3566-powkiddy-rk2023.dtb", ++ .detect_panel = 0, ++ }, ++ [RGARCD] = { ++ .adc_value = 183, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg-arc-d", ++ .board_name = "Anbernic RG ARC-D", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg-arc-d.dtb", ++ .detect_panel = 0, ++ }, + /* Devices with duplicate ADC value */ + [RG353PS] = { + .adc_value = 860, /* Observed average from device */ +@@ -98,6 +123,13 @@ static const struct rg3xx_model rg3xx_model_details[] = { + .fdtfile = DTB_DIR "rk3566-anbernic-rg353vs.dtb", + .detect_panel = 1, + }, ++ [RGARCS] = { ++ .adc_value = 183, /* Observed average from device */ ++ .board = "rk3566-anbernic-rg-arc-s", ++ .board_name = "Anbernic RG ARC-S", ++ .fdtfile = DTB_DIR "rk3566-anbernic-rg-arc-s.dtb", ++ .detect_panel = 0, ++ }, + }; + + struct rg353_panel { +@@ -332,19 +364,21 @@ int rgxx3_detect_device(void) + } + + /* +- * Try to access the eMMC on an RG353V or RG353P. If it's +- * missing, it's an RG353VS or RG353PS. Note we could also +- * check for a touchscreen at 0x1a on i2c2. ++ * Try to access the eMMC on an RG353V, RG353P, or RG Arc D. ++ * If it's missing, it's an RG353VS, RG353PS, or RG Arc S. ++ * Note we could also check for a touchscreen at 0x1a on i2c2. + */ +- if (board_id == RG353V || board_id == RG353P) { ++ if (board_id == RG353V || board_id == RG353P || board_id == RGARCD) { + mmc = find_mmc_device(0); + if (mmc) { + ret = mmc_init(mmc); + if (ret) { + if (board_id == RG353V) + board_id = RG353VS; +- else ++ if (board_id == RG353P) + board_id = RG353PS; ++ else ++ board_id = RGARCS; + } + } + } +-- +2.34.1 + +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: andre.przywara@arm.com, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V3 7/7] doc: board: anbernic: Update rgxx3 to add new boards +Date: Mon, 11 Dec 2023 17:21:25 -0600 [thread overview] +Message-ID: <20231211232125.171438-8-macroalpha82@gmail.com> (raw) +In-Reply-To: <20231211232125.171438-1-macroalpha82@gmail.com> + +From: Chris Morgan + +Update the RGxx3 documentation to note that it now supports the +RG-ARC-D, RG-ARC-S, Powkiddy RK2023, and Powkiddy RGB30. Also update +verbiage around panel detection to note that it is no longer hard coded +to the RG503. + +Signed-off-by: Chris Morgan +--- + doc/board/anbernic/rgxx3.rst | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +diff --git a/doc/board/anbernic/rgxx3.rst b/doc/board/anbernic/rgxx3.rst +index 7d1beb423c..d159ed2f76 100644 +--- a/doc/board/anbernic/rgxx3.rst ++++ b/doc/board/anbernic/rgxx3.rst +@@ -5,6 +5,8 @@ U-Boot for Anbernic RGxx3 Devices + + This allows U-Boot to boot the following Anbernic devices: + ++ - Anbernic RG-ARC-D ++ - Anbernic RG-ARC-S + - Anbernic RG353M + - Anbernic RG353P + - Anbernic RG353PS +@@ -12,18 +14,24 @@ This allows U-Boot to boot the following Anbernic devices: + - Anbernic RG353VS + - Anbernic RG503 + ++Additionally, the following very similar non-Anbernic devices are also ++supported: ++ ++ - Powkiddy RGB30 ++ - Powkiddy RK2023 ++ + The correct device is detected automatically by comparing ADC values + from ADC channel 1. In the event of an RG353V or RG353P, an attempt + is then made to probe for an eMMC and if it fails the device is assumed + to be an RG353VS or RG353PS. Based on the detected device, the + environment variables "board", "board_name", and "fdtfile" are set to + the correct values corresponding to the board which can be read by a +-boot script to boot with the correct device tree. If the board detected +-is not of type RG503 (which currently has only 1 panel revision) a +-panel detect is then performed by probing a "dummy" display on the DSI +-bus and then querying the display ID. The display ID is then compared +-to a table to get the known compatible string for use in Linux, and +-this string is saved as an environment variable of "panel". ++boot script to boot with the correct device tree. If a board is defined ++as requiring panel detection, a panel detect is then performed by ++probing a "dummy" display on the DSI bus and then querying the display ++ID. The display ID is then compared to a table to get the known ++compatible string for use in Linux, and this string is saved as an ++environment variable of "panel". + + FDT fixups are performed in the event of an RG353M to change the device + name, or in the event the panel detected does not match the devicetree. +-- +2.34.1 diff --git a/projects/Rockchip/packages/u-boot/patches/RK3566/002-v2-add-powkiddy-x55.patch b/projects/Rockchip/packages/u-boot/patches/RK3566/002-v2-add-powkiddy-x55.patch new file mode 100644 index 0000000000..91f6bfaa1e --- /dev/null +++ b/projects/Rockchip/packages/u-boot/patches/RK3566/002-v2-add-powkiddy-x55.patch @@ -0,0 +1,1383 @@ +From: Chris Morgan +To: u-boot@lists.denx.de +Cc: jbx6244@gmail.com, jonas@kwiboo.se, kever.yang@rock-chips.com, + philipp.tomsich@vrull.eu, sjg@chromium.org, + Chris Morgan +Subject: [PATCH V2] board: rockchip: add Powkiddy X55 +Date: Thu, 14 Dec 2023 12:24:33 -0600 [thread overview] +Message-ID: <20231214182433.37454-1-macroalpha82@gmail.com> (raw) + +From: Chris Morgan + +The Powkiddy X55 is a Rockchip RK3566 based handheld gaming device. +UART, ADC, eMMC, and SDMMC are tested to work in U-Boot and this +successfully boots mainline Linux. + +Changes since V1: + - Built on top of this patch series [1] which makes the ADC detect + function more generic and also moves the board_rng_seed to a more + generic location. + - Updated U-Boot specific devicetree to drop redundant values and + add nodes required for ADC detection in SPL. + - Updated defconfig to add additional options for SPL ADC detection + logic as well as drop some drivers that are not needed. Note that + CONFIG_DM_PMIC_FAN53555 is used by the tcs,tcs4525 regulator on + i2c0 at 0x1c. Additionally the code fails to compile without + selecting CONFIG_SPL_ROCKCHIP_BACK_TO_BROM. + +[1] https://lore.kernel.org/u-boot/20231211232125.171438-1-macroalpha82@gmail.com/ + +Signed-off-by: Chris Morgan +--- + arch/arm/dts/Makefile | 1 + + arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi | 67 ++ + arch/arm/dts/rk3566-powkiddy-x55.dts | 926 +++++++++++++++++++ + arch/arm/mach-rockchip/rk3568/Kconfig | 6 + + board/powkiddy/x55/Kconfig | 15 + + board/powkiddy/x55/MAINTAINERS | 9 + + board/powkiddy/x55/Makefile | 6 + + board/powkiddy/x55/x55.c | 42 + + configs/powkiddy-x55-rk3566_defconfig | 92 ++ + doc/board/index.rst | 1 + + doc/board/powkiddy/index.rst | 9 + + doc/board/powkiddy/x55.rst | 25 + + doc/board/rockchip/rockchip.rst | 1 + + include/configs/powkiddy-x55-rk3566.h | 14 + + 14 files changed, 1214 insertions(+) + create mode 100644 arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi + create mode 100644 arch/arm/dts/rk3566-powkiddy-x55.dts + create mode 100644 board/powkiddy/x55/Kconfig + create mode 100644 board/powkiddy/x55/MAINTAINERS + create mode 100644 board/powkiddy/x55/Makefile + create mode 100644 board/powkiddy/x55/x55.c + create mode 100644 configs/powkiddy-x55-rk3566_defconfig + create mode 100644 doc/board/powkiddy/index.rst + create mode 100644 doc/board/powkiddy/x55.rst + create mode 100644 include/configs/powkiddy-x55-rk3566.h + +diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile +index 5fc888680b..6e5cb7c3e9 100644 +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -172,6 +172,7 @@ dtb-$(CONFIG_ROCKCHIP_RK3399) += \ + + dtb-$(CONFIG_ROCKCHIP_RK3568) += \ + rk3566-anbernic-rgxx3.dtb \ ++ rk3566-powkiddy-x55.dtb \ + rk3566-quartz64-a.dtb \ + rk3566-quartz64-b.dtb \ + rk3566-radxa-cm3-io.dtb \ +diff --git a/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi +new file mode 100644 +index 0000000000..1a3089b598 +--- /dev/null ++++ b/arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi +@@ -0,0 +1,67 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++ ++#include "rk356x-u-boot.dtsi" ++ ++/ { ++ chosen { ++ stdout-path = &uart2; ++ }; ++ ++ rng: rng@fe388000 { ++ compatible = "rockchip,cryptov2-rng"; ++ reg = <0x0 0xfe388000 0x0 0x2000>; ++ status = "okay"; ++ }; ++}; ++ ++&cru { ++ assigned-clocks = ++ <&pmucru CLK_RTC_32K>, <&pmucru PLL_PPLL>, ++ <&pmucru PCLK_PMU>, <&cru PLL_CPLL>, ++ <&cru PLL_GPLL>, <&cru PLL_VPLL>, ++ <&cru ACLK_BUS>, <&cru PCLK_BUS>, ++ <&cru ACLK_TOP_HIGH>, <&cru ACLK_TOP_LOW>, ++ <&cru HCLK_TOP>, <&cru PCLK_TOP>, ++ <&cru ACLK_PERIMID>, <&cru HCLK_PERIMID>, ++ <&cru CPLL_500M>, <&cru CPLL_333M>, ++ <&cru CPLL_250M>, <&cru CPLL_125M>, ++ <&cru CPLL_100M>, <&cru CPLL_62P5M>, ++ <&cru CPLL_50M>, <&cru CPLL_25M>; ++ assigned-clock-rates = ++ <32768>, <200000000>, ++ <100000000>, <1000000000>, ++ <1200000000>, <126400000>, ++ <150000000>, <100000000>, ++ <500000000>, <400000000>, ++ <150000000>, <100000000>, ++ <300000000>, <150000000>, ++ <500000000>, <333333333>, ++ <250000000>, <125000000>, ++ <100000000>, <62500000>, ++ <50000000>, <25000000>; ++ assigned-clock-parents = ++ <&pmucru CLK_RTC32K_FRAC>; ++}; ++ ++&pmucru { ++ assigned-clocks = <&pmucru SCLK_32K_IOE>; ++ assigned-clock-parents = <&pmucru CLK_RTC_32K>; ++}; ++ ++/* Move the saradc to a fixed regulator so that it works in SPL. */ ++&saradc { ++ bootph-all; ++ vref-supply = <&vcc_sys>; ++ status = "okay"; ++}; ++ ++&uart2 { ++ clock-frequency = <24000000>; ++ bootph-all; ++ status = "okay"; ++}; ++ ++&vcc_sys { ++ bootph-all; ++ status = "okay"; ++}; +diff --git a/arch/arm/dts/rk3566-powkiddy-x55.dts b/arch/arm/dts/rk3566-powkiddy-x55.dts +new file mode 100644 +index 0000000000..4786b19fd0 +--- /dev/null ++++ b/arch/arm/dts/rk3566-powkiddy-x55.dts +@@ -0,0 +1,926 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++ ++/dts-v1/; ++ ++#include ++#include ++#include ++#include ++#include ++#include "rk3566.dtsi" ++ ++/ { ++ model = "Powkiddy x55"; ++ compatible = "powkiddy,x55", "rockchip,rk3566"; ++ ++ aliases { ++ mmc0 = &sdhci; ++ mmc1 = &sdmmc0; ++ mmc2 = &sdmmc2; ++ mmc3 = &sdmmc1; ++ }; ++ ++ chosen: chosen { ++ stdout-path = "serial2:1500000n8"; ++ }; ++ ++ adc_joystick: adc-joystick { ++ compatible = "adc-joystick"; ++ io-channels = <&saradc 0>, <&saradc 1>, ++ <&saradc 2>, <&saradc 3>; ++ poll-interval = <60>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ axis@0 { ++ reg = <0>; ++ abs-flat = <30>; ++ abs-fuzz = <20>; ++ abs-range = <15 1023>; ++ linux,code = ; ++ }; ++ ++ axis@1 { ++ reg = <1>; ++ abs-flat = <30>; ++ abs-fuzz = <20>; ++ abs-range = <1023 15>; ++ linux,code = ; ++ }; ++ ++ axis@2 { ++ reg = <2>; ++ abs-flat = <30>; ++ abs-fuzz = <20>; ++ abs-range = <15 1023>; ++ linux,code = ; ++ }; ++ ++ axis@3 { ++ reg = <3>; ++ abs-flat = <30>; ++ abs-fuzz = <20>; ++ abs-range = <1023 15>; ++ linux,code = ; ++ }; ++ }; ++ ++ backlight: backlight { ++ compatible = "pwm-backlight"; ++ power-supply = <&vcc_sys>; ++ pwms = <&pwm4 0 25000 0>; ++ }; ++ ++ battery: battery { ++ compatible = "simple-battery"; ++ charge-full-design-microamp-hours = <4000000>; ++ charge-term-current-microamp = <300000>; ++ constant-charge-current-max-microamp = <2000000>; ++ constant-charge-voltage-max-microvolt = <4300000>; ++ factory-internal-resistance-micro-ohms = <91000>; ++ voltage-max-design-microvolt = <4138000>; ++ voltage-min-design-microvolt = <3400000>; ++ ++ ocv-capacity-celsius = <20>; ++ ocv-capacity-table-0 = <4138000 100>, <4083000 95>, <4059000 90>, <4044000 85>, ++ <4030000 80>, <4020000 75>, <4006000 70>, <3972000 65>, ++ <3934000 60>, <3904000 55>, <3878000 50>, <3857000 45>, ++ <3843000 40>, <3826000 35>, <3801000 30>, <3768000 25>, ++ <3735000 20>, <3688000 15>, <3621000 10>, <3553000 5>, ++ <3400000 0>; ++ }; ++ ++ gpio_keys_control: gpio-keys-control { ++ compatible = "gpio-keys"; ++ pinctrl-0 = <&btn_pins_ctrl>; ++ pinctrl-names = "default"; ++ ++ button-a { ++ gpios = <&gpio3 RK_PD3 GPIO_ACTIVE_LOW>; ++ label = "EAST"; ++ linux,code = ; ++ }; ++ ++ button-b { ++ gpios = <&gpio3 RK_PD2 GPIO_ACTIVE_LOW>; ++ label = "SOUTH"; ++ linux,code = ; ++ }; ++ ++ button-down { ++ gpios = <&gpio4 RK_PA1 GPIO_ACTIVE_LOW>; ++ label = "DPAD-DOWN"; ++ linux,code = ; ++ }; ++ ++ button-l1 { ++ gpios = <&gpio3 RK_PD0 GPIO_ACTIVE_LOW>; ++ label = "TL"; ++ linux,code = ; ++ }; ++ ++ button-l2 { ++ gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_LOW>; ++ label = "TL2"; ++ linux,code = ; ++ }; ++ ++ button-left { ++ gpios = <&gpio3 RK_PD6 GPIO_ACTIVE_LOW>; ++ label = "DPAD-LEFT"; ++ linux,code = ; ++ }; ++ ++ button-right { ++ gpios = <&gpio3 RK_PD7 GPIO_ACTIVE_LOW>; ++ label = "DPAD-RIGHT"; ++ linux,code = ; ++ }; ++ ++ button-select { ++ gpios = <&gpio4 RK_PA4 GPIO_ACTIVE_LOW>; ++ label = "SELECT"; ++ linux,code = ; ++ }; ++ ++ button-start { ++ gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_LOW>; ++ label = "START"; ++ linux,code = ; ++ }; ++ ++ button-thumbl { ++ gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_LOW>; ++ label = "THUMBL"; ++ linux,code = ; ++ }; ++ ++ button-thumbr { ++ gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_LOW>; ++ label = "THUMBR"; ++ linux,code = ; ++ }; ++ ++ button-r1 { ++ gpios = <&gpio3 RK_PC6 GPIO_ACTIVE_LOW>; ++ label = "TR"; ++ linux,code = ; ++ }; ++ ++ button-r2 { ++ gpios = <&gpio3 RK_PC7 GPIO_ACTIVE_LOW>; ++ label = "TR2"; ++ linux,code = ; ++ }; ++ ++ button-up { ++ gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>; ++ label = "DPAD-UP"; ++ linux,code = ; ++ }; ++ ++ button-x { ++ gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_LOW>; ++ label = "NORTH"; ++ linux,code = ; ++ }; ++ ++ button-y { ++ gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_LOW>; ++ label = "WEST"; ++ linux,code = ; ++ }; ++ }; ++ ++ gpio_keys_vol: gpio-keys-vol { ++ compatible = "gpio-keys"; ++ autorepeat; ++ pinctrl-0 = <&btn_pins_vol>; ++ pinctrl-names = "default"; ++ ++ button-voldown { ++ gpios = <&gpio4 RK_PA3 GPIO_ACTIVE_LOW>; ++ label = "VOLUMEDOWN"; ++ linux,code = ; ++ }; ++ ++ button-volup { ++ gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_LOW>; ++ label = "VOLUMEUP"; ++ linux,code = ; ++ }; ++ }; ++ ++ gpio_leds: gpio-leds { ++ compatible = "gpio-leds"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&led_pins>; ++ ++ red_led: led-0 { ++ color = ; ++ default-state = "off"; ++ gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>; ++ function = LED_FUNCTION_STATUS; ++ }; ++ ++ green_led: led-1 { ++ color = ; ++ default-state = "on"; ++ gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>; ++ function = LED_FUNCTION_POWER; ++ }; ++ ++ amber_led: led-2 { ++ color = ; ++ gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>; ++ function = LED_FUNCTION_CHARGING; ++ }; ++ ++ }; ++ ++ hdmi-con { ++ compatible = "hdmi-connector"; ++ ddc-i2c-bus = <&i2c5>; ++ type = "c"; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ ++ sdio_pwrseq: sdio-pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ clocks = <&rk817 1>; ++ clock-names = "ext_clock"; ++ pinctrl-0 = <&wifi_enable_h>; ++ pinctrl-names = "default"; ++ post-power-on-delay-ms = <200>; ++ reset-gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_LOW>; ++ }; ++ ++ /* Channels reversed for both headphones and speakers. */ ++ sound { ++ compatible = "simple-audio-card"; ++ pinctrl-0 = <&hp_det>; ++ pinctrl-names = "default"; ++ simple-audio-card,name = "rk817_ext"; ++ simple-audio-card,aux-devs = <&spk_amp>; ++ simple-audio-card,format = "i2s"; ++ simple-audio-card,hp-det-gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; ++ simple-audio-card,mclk-fs = <256>; ++ simple-audio-card,widgets = ++ "Microphone", "Mic Jack", ++ "Headphone", "Headphones", ++ "Speaker", "Internal Speakers"; ++ simple-audio-card,routing = ++ "MICL", "Mic Jack", ++ "Headphones", "HPOL", ++ "Headphones", "HPOR", ++ "Internal Speakers", "Speaker Amp OUTL", ++ "Internal Speakers", "Speaker Amp OUTR", ++ "Speaker Amp INL", "HPOL", ++ "Speaker Amp INR", "HPOR"; ++ simple-audio-card,pin-switches = "Internal Speakers"; ++ ++ simple-audio-card,codec { ++ sound-dai = <&rk817>; ++ }; ++ ++ simple-audio-card,cpu { ++ sound-dai = <&i2s1_8ch>; ++ }; ++ }; ++ ++ spk_amp: audio-amplifier { ++ compatible = "simple-audio-amplifier"; ++ enable-gpios = <&gpio4 RK_PC2 GPIO_ACTIVE_HIGH>; ++ pinctrl-0 = <&spk_amp_enable_h>; ++ pinctrl-names = "default"; ++ sound-name-prefix = "Speaker Amp"; ++ }; ++ ++ vcc5v0_host: regulator-vcc5v0-host { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>; ++ pinctrl-0 = <&vcc5v0_host_en>; ++ pinctrl-names = "default"; ++ regulator-name = "vcc5v0_host"; ++ vin-supply = <&dcdc_boost>; ++ }; ++ ++ vcc_lcd: regulator-vcc-lcd { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_HIGH>; ++ pinctrl-0 = <&vcc_lcd_en>; ++ pinctrl-names = "default"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc_lcd"; ++ }; ++ ++ vcc_sys: regulator-vcc-sys { ++ compatible = "regulator-fixed"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3800000>; ++ regulator-max-microvolt = <3800000>; ++ regulator-name = "vcc_sys"; ++ }; ++ ++ vcc_wifi: regulator-vcc-wifi { ++ compatible = "regulator-fixed"; ++ gpio = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>; ++ pinctrl-0 = <&vcc_wifi_h>; ++ pinctrl-names = "default"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc_wifi"; ++ }; ++}; ++ ++&combphy1 { ++ status = "okay"; ++}; ++ ++&cru { ++ assigned-clocks = <&pmucru CLK_RTC_32K>, <&cru PLL_GPLL>, ++ <&pmucru PLL_PPLL>, <&cru PLL_VPLL>; ++ assigned-clock-rates = <32768>, <1200000000>, ++ <200000000>, <126400000>; ++}; ++ ++&cpu0 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&cpu1 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&cpu2 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&cpu3 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&dsi_dphy0 { ++ status = "okay"; ++}; ++ ++&dsi0 { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ ports { ++ dsi0_in: port@0 { ++ reg = <0>; ++ dsi0_in_vp1: endpoint { ++ remote-endpoint = <&vp1_out_dsi0>; ++ }; ++ }; ++ ++ dsi0_out: port@1 { ++ reg = <1>; ++ mipi_out_panel: endpoint { ++ remote-endpoint = <&mipi_in_panel>; ++ }; ++ }; ++ }; ++ ++ panel: panel@0 { ++ compatible = "powkiddy,x55-panel", "himax,hx8394"; ++ reg = <0>; ++ backlight = <&backlight>; ++ iovcc-supply = <&vcc_lcd>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&lcd_rst>; ++ reset-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_LOW>; ++ rotation = <270>; ++ vcc-supply = <&vcc_lcd>; ++ ++ port { ++ mipi_in_panel: endpoint { ++ remote-endpoint = <&mipi_out_panel>; ++ }; ++ }; ++ }; ++}; ++ ++&gpu { ++ mali-supply = <&vdd_gpu>; ++ status = "okay"; ++}; ++ ++&hdmi { ++ ddc-i2c-bus = <&i2c5>; ++ pinctrl-0 = <&hdmitxm0_cec>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&hdmi_in { ++ hdmi_in_vp0: endpoint { ++ remote-endpoint = <&vp0_out_hdmi>; ++ }; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ ++&hdmi_sound { ++ status = "okay"; ++}; ++ ++&i2c0 { ++ status = "okay"; ++ ++ rk817: pmic@20 { ++ compatible = "rockchip,rk817"; ++ reg = <0x20>; ++ assigned-clocks = <&cru I2S1_MCLKOUT_TX>; ++ assigned-clock-parents = <&cru CLK_I2S1_8CH_TX>; ++ clock-names = "mclk"; ++ clock-output-names = "rk808-clkout1", "rk808-clkout2"; ++ clocks = <&cru I2S1_MCLKOUT_TX>; ++ interrupt-parent = <&gpio0>; ++ interrupts = ; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s1m0_mclk>, <&pmic_int_l>; ++ wakeup-source; ++ #clock-cells = <1>; ++ #sound-dai-cells = <0>; ++ ++ vcc1-supply = <&vcc_sys>; ++ vcc2-supply = <&vcc_sys>; ++ vcc3-supply = <&vcc_sys>; ++ vcc4-supply = <&vcc_sys>; ++ vcc5-supply = <&vcc_sys>; ++ vcc6-supply = <&vcc_sys>; ++ vcc7-supply = <&vcc_sys>; ++ vcc8-supply = <&vcc_sys>; ++ vcc9-supply = <&dcdc_boost>; ++ ++ regulators { ++ vdd_logic: DCDC_REG1 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <1350000>; ++ regulator-ramp-delay = <6001>; ++ regulator-initial-mode = <0x2>; ++ regulator-name = "vdd_logic"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ regulator-suspend-microvolt = <900000>; ++ }; ++ }; ++ ++ vdd_gpu: DCDC_REG2 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <1350000>; ++ regulator-ramp-delay = <6001>; ++ regulator-initial-mode = <0x2>; ++ regulator-name = "vdd_gpu"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc_ddr: DCDC_REG3 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-initial-mode = <0x2>; ++ regulator-name = "vcc_ddr"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ }; ++ }; ++ ++ vcc_3v3: DCDC_REG4 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-initial-mode = <0x2>; ++ regulator-name = "vcc_3v3"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <3300000>; ++ }; ++ }; ++ ++ vcca1v8_pmu: LDO_REG1 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcca1v8_pmu"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1800000>; ++ }; ++ }; ++ ++ vdda_0v9: LDO_REG2 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ regulator-name = "vdda_0v9"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vdda0v9_pmu: LDO_REG3 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ regulator-name = "vdda0v9_pmu"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <900000>; ++ }; ++ }; ++ ++ vccio_acodec: LDO_REG4 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vccio_acodec"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vccio_sd: LDO_REG5 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vccio_sd"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc3v3_pmu: LDO_REG6 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc3v3_pmu"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <3300000>; ++ }; ++ }; ++ ++ vcc_1v8: LDO_REG7 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc_1v8"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc1v8_dvp: LDO_REG8 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc1v8_dvp"; ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ }; ++ }; ++ ++ vcc2v8_dvp: LDO_REG9 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc2v8_dvp"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ dcdc_boost: BOOST { ++ regulator-min-microvolt = <4700000>; ++ regulator-max-microvolt = <5400000>; ++ regulator-name = "boost"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ otg_switch: OTG_SWITCH { ++ regulator-name = "otg_switch"; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ }; ++ ++ rk817_charger: charger { ++ monitored-battery = <&battery>; ++ rockchip,resistor-sense-micro-ohms = <10000>; ++ rockchip,sleep-enter-current-microamp = <150000>; ++ rockchip,sleep-filter-current-microamp = <100000>; ++ }; ++ ++ }; ++ ++ vdd_cpu: regulator@1c { ++ compatible = "tcs,tcs4525"; ++ reg = <0x1c>; ++ fcs,suspend-voltage-selector = <1>; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <712500>; ++ regulator-max-microvolt = <1390000>; ++ regulator-name = "vdd_cpu"; ++ regulator-ramp-delay = <2300>; ++ vin-supply = <&vcc_sys>; ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++}; ++ ++&i2c5 { ++ pinctrl-0 = <&i2c5m1_xfer>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&i2s0_8ch { ++ status = "okay"; ++}; ++ ++&i2s1_8ch { ++ pinctrl-0 = <&i2s1m0_sclktx>, <&i2s1m0_lrcktx>, <&i2s1m0_sdi0>, ++ <&i2s1m0_sdo0>; ++ pinctrl-names = "default"; ++ rockchip,trcm-sync-tx-only; ++ status = "okay"; ++}; ++ ++&pinctrl { ++ audio-amplifier { ++ spk_amp_enable_h: spk-amp-enable-h { ++ rockchip,pins = ++ <4 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ gpio-control { ++ btn_pins_ctrl: btn-pins-ctrl { ++ rockchip,pins = ++ <3 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PC7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD1 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PD7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA1 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA4 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ ++ btn_pins_vol: btn-pins-vol { ++ rockchip,pins = ++ <4 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>, ++ <4 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ gpio-lcd { ++ lcd_rst: lcd-rst { ++ rockchip,pins = ++ <0 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ gpio-leds { ++ led_pins: led-pins { ++ rockchip,pins = ++ <4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>, ++ <4 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>, ++ <4 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ hp-detect { ++ hp_det: hp-det { ++ rockchip,pins = ++ <4 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ pmic { ++ pmic_int_l: pmic-int-l { ++ rockchip,pins = ++ <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ sdio-pwrseq { ++ wifi_enable_h: wifi-enable-h { ++ rockchip,pins = ++ <0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ usb { ++ vcc5v0_host_en: vcc5v0-host-en { ++ rockchip,pins = ++ <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ ++ vcc5v0_otg_en: vcc5v0-otg-en { ++ rockchip,pins = ++ <4 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ vcc-lcd { ++ vcc_lcd_en: vcc-lcd-en { ++ rockchip,pins = ++ <0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ vcc-wifi { ++ vcc_wifi_h: vcc-wifi-h { ++ rockchip,pins = ++ <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++}; ++ ++&pmu_io_domains { ++ status = "okay"; ++ pmuio1-supply = <&vcc3v3_pmu>; ++ pmuio2-supply = <&vcca1v8_pmu>; ++ vccio1-supply = <&vccio_acodec>; ++ vccio3-supply = <&vccio_sd>; ++ vccio4-supply = <&vcca1v8_pmu>; ++ vccio5-supply = <&vcc2v8_dvp>; ++ vccio6-supply = <&vcc1v8_dvp>; ++ vccio7-supply = <&vcc_3v3>; ++}; ++ ++&pwm4 { ++ status = "okay"; ++}; ++ ++&saradc { ++ vref-supply = <&vcc_1v8>; ++ status = "okay"; ++}; ++ ++&sdhci { ++ bus-width = <8>; ++ mmc-hs200-1_8v; ++ non-removable; ++ pinctrl-0 = <&emmc_bus8>, <&emmc_clk>, <&emmc_cmd>, ++ <&emmc_datastrobe>, <&emmc_rstnout>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&sdmmc0 { ++ bus-width = <4>; ++ cap-mmc-highspeed; ++ cap-sd-highspeed; ++ disable-wp; ++ pinctrl-0 = <&sdmmc0_bus4>, <&sdmmc0_clk>, <&sdmmc0_cmd>, ++ <&sdmmc0_det>; ++ pinctrl-names = "default"; ++ sd-uhs-sdr104; ++ vqmmc-supply = <&vccio_sd>; ++ status = "okay"; ++}; ++ ++&sdmmc1 { ++ bus-width = <4>; ++ cap-sd-highspeed; ++ cap-sdio-irq; ++ keep-power-in-suspend; ++ mmc-pwrseq = <&sdio_pwrseq>; ++ non-removable; ++ pinctrl-0 = <&sdmmc1_bus4>, <&sdmmc1_cmd>, <&sdmmc1_clk>; ++ pinctrl-names = "default"; ++ vmmc-supply = <&vcc_wifi>; ++ status = "okay"; ++}; ++ ++&sdmmc2 { ++ bus-width = <4>; ++ cap-mmc-highspeed; ++ cap-sd-highspeed; ++ disable-wp; ++ pinctrl-0 = <&sdmmc2m1_bus4>, <&sdmmc2m1_cmd>, <&sdmmc2m1_clk>, ++ <&sdmmc2m1_det>; ++ pinctrl-names = "default"; ++ sd-uhs-sdr104; ++ vqmmc-supply = <&vcc2v8_dvp>; ++ status = "okay"; ++}; ++ ++&tsadc { ++ rockchip,hw-tshut-mode = <1>; ++ rockchip,hw-tshut-polarity = <0>; ++ status = "okay"; ++}; ++ ++&uart1 { ++ pinctrl-0 = <&uart1m0_xfer>, <&uart1m0_ctsn>, <&uart1m0_rtsn>; ++ pinctrl-names = "default"; ++ uart-has-rtscts; ++ status = "okay"; ++ ++ bluetooth { ++ compatible = "realtek,rtl8821cs-bt", "realtek,rtl8723bs-bt"; ++ device-wake-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>; ++ enable-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>; ++ host-wake-gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>; ++ }; ++}; ++ ++&uart2 { ++ status = "okay"; ++}; ++ ++&usb_host0_xhci { ++ phys = <&usb2phy0_otg>; ++ phy-names = "usb2-phy"; ++ status = "okay"; ++}; ++ ++&usb_host1_xhci { ++ status = "okay"; ++}; ++ ++&usb2phy0 { ++ status = "okay"; ++}; ++ ++&usb2phy0_otg { ++ status = "okay"; ++}; ++ ++&usb2phy0_host { ++ phy-supply = <&vcc5v0_host>; ++ status = "okay"; ++}; ++ ++&vop { ++ assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; ++ assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; ++ status = "okay"; ++}; ++ ++&vop_mmu { ++ status = "okay"; ++}; ++ ++&vp0 { ++ vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { ++ reg = ; ++ remote-endpoint = <&hdmi_in_vp0>; ++ }; ++}; ++ ++&vp1 { ++ vp1_out_dsi0: endpoint@ROCKCHIP_VOP2_EP_MIPI0 { ++ reg = ; ++ remote-endpoint = <&dsi0_in_vp1>; ++ }; ++}; +diff --git a/arch/arm/mach-rockchip/rk3568/Kconfig b/arch/arm/mach-rockchip/rk3568/Kconfig +index baa51349f4..a97da8ae55 100644 +--- a/arch/arm/mach-rockchip/rk3568/Kconfig ++++ b/arch/arm/mach-rockchip/rk3568/Kconfig +@@ -22,6 +22,11 @@ config TARGET_ODROID_M1_RK3568 + help + Hardkernel ODROID-M1 single board computer with a RK3568B2 SoC. + ++config TARGET_POWKIDDY_X55_RK3566 ++ bool "Powkiddy X55" ++ help ++ Powkiddy X55 handheld gaming console with an RK3566 SoC. ++ + config TARGET_QUARTZ64_RK3566 + bool "Pine64 Quartz64" + help +@@ -45,5 +50,6 @@ source "board/rockchip/evb_rk3568/Kconfig" + source "board/anbernic/rgxx3_rk3566/Kconfig" + source "board/hardkernel/odroid_m1/Kconfig" + source "board/pine64/quartz64_rk3566/Kconfig" ++source "board/powkiddy/x55/Kconfig" + + endif +diff --git a/board/powkiddy/x55/Kconfig b/board/powkiddy/x55/Kconfig +new file mode 100644 +index 0000000000..a7b3ed4d0d +--- /dev/null ++++ b/board/powkiddy/x55/Kconfig +@@ -0,0 +1,15 @@ ++if TARGET_POWKIDDY_X55_RK3566 ++ ++config SYS_BOARD ++ default "x55" ++ ++config SYS_VENDOR ++ default "powkiddy" ++ ++config SYS_CONFIG_NAME ++ default "powkiddy-x55-rk3566" ++ ++config BOARD_SPECIFIC_OPTIONS ++ def_bool y ++ ++endif +diff --git a/board/powkiddy/x55/MAINTAINERS b/board/powkiddy/x55/MAINTAINERS +new file mode 100644 +index 0000000000..9ed48f408e +--- /dev/null ++++ b/board/powkiddy/x55/MAINTAINERS +@@ -0,0 +1,9 @@ ++X55 ++M: Chris Morgan ++S: Maintained ++F: board/powkiddy/x55 ++F: include/configs/powkiddy-x55-rk3566.h ++F: configs/powkiddy-x55-rk3566_defconfig ++F: arch/arm/dts/rk3566-powkiddy-x55.dts ++F: arch/arm/dts/rk3566-powkiddy-x55-u-boot.dtsi ++F: doc/board/powkiddy/x55.rst +diff --git a/board/powkiddy/x55/Makefile b/board/powkiddy/x55/Makefile +new file mode 100644 +index 0000000000..55c8c16aa1 +--- /dev/null ++++ b/board/powkiddy/x55/Makefile +@@ -0,0 +1,6 @@ ++# SPDX-License-Identifier: GPL-2.0+ ++# ++# Copyright (c) 2023 Chris Morgan ++# ++ ++obj-y += x55.o +diff --git a/board/powkiddy/x55/x55.c b/board/powkiddy/x55/x55.c +new file mode 100644 +index 0000000000..8d98baa24f +--- /dev/null ++++ b/board/powkiddy/x55/x55.c +@@ -0,0 +1,42 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Copyright (c) 2023 Chris Morgan ++ */ ++ ++#include ++#include ++ ++#define GPIO4_BASE 0xfe770000 ++#define GPIO_SWPORT_DR_L 0x0000 ++#define GPIO_SWPORT_DDR_L 0x0008 ++#define GPIO_B4 BIT(12) ++#define GPIO_B5 BIT(13) ++#define GPIO_B6 BIT(14) ++ ++#define GPIO_WRITEMASK(bits) ((bits) << 16) ++ ++/* ++ * Start LED very early so user knows device is on. Set color ++ * to red. ++ */ ++void spl_board_init(void) ++{ ++ setup_boot_mode(); ++ ++ /* Set GPIO4_B4, GPIO4_B5, and GPIO4_B6 to output. */ ++ writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | \ ++ (GPIO_B6 | GPIO_B5 | GPIO_B4), ++ (GPIO4_BASE + GPIO_SWPORT_DDR_L)); ++ /* Set GPIO4_B5 and GPIO4_B6 to 0 and GPIO4_B4 to 1. */ ++ writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B4, ++ (GPIO4_BASE + GPIO_SWPORT_DR_L)); ++} ++ ++int rk_board_late_init(void) ++{ ++ /* Turn off red LED and turn on orange LED. */ ++ writel(GPIO_WRITEMASK(GPIO_B6 | GPIO_B5 | GPIO_B4) | GPIO_B6, ++ (GPIO4_BASE + GPIO_SWPORT_DR_L)); ++ ++ return 0; ++} +diff --git a/configs/powkiddy-x55-rk3566_defconfig b/configs/powkiddy-x55-rk3566_defconfig +new file mode 100644 +index 0000000000..f9a513f97c +--- /dev/null ++++ b/configs/powkiddy-x55-rk3566_defconfig +@@ -0,0 +1,92 @@ ++CONFIG_ARM=y ++CONFIG_SKIP_LOWLEVEL_INIT=y ++CONFIG_COUNTER_FREQUENCY=24000000 ++CONFIG_ARCH_ROCKCHIP=y ++CONFIG_TEXT_BASE=0x00a00000 ++CONFIG_SPL_GPIO=y ++CONFIG_SPL_LIBCOMMON_SUPPORT=y ++CONFIG_SPL_LIBGENERIC_SUPPORT=y ++CONFIG_NR_DRAM_BANKS=2 ++CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y ++CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0xc00000 ++CONFIG_DEFAULT_DEVICE_TREE="rk3566-powkiddy-x55" ++CONFIG_ROCKCHIP_RK3568=y ++CONFIG_SPL_ROCKCHIP_BACK_TO_BROM=y ++CONFIG_SPL_ROCKCHIP_COMMON_BOARD=y ++CONFIG_ROCKCHIP_RK8XX_DISABLE_BOOT_ON_POWERON=y ++CONFIG_SPL_MMC=y ++CONFIG_SPL_SERIAL=y ++CONFIG_SPL_STACK_R_ADDR=0x600000 ++CONFIG_TARGET_POWKIDDY_X55_RK3566=y ++CONFIG_SPL_STACK=0x400000 ++CONFIG_DEBUG_UART_BASE=0xFE660000 ++CONFIG_DEBUG_UART_CLOCK=24000000 ++CONFIG_SYS_LOAD_ADDR=0xc00800 ++CONFIG_DEBUG_UART=y ++CONFIG_FIT=y ++CONFIG_FIT_VERBOSE=y ++CONFIG_SPL_FIT_SIGNATURE=y ++CONFIG_SPL_LOAD_FIT=y ++CONFIG_LEGACY_IMAGE_FORMAT=y ++CONFIG_OF_STDOUT_VIA_ALIAS=y ++CONFIG_DEFAULT_FDT_FILE="rk3566-powkiddy-x55.dtb" ++# CONFIG_DISPLAY_CPUINFO is not set ++CONFIG_DISPLAY_BOARDINFO_LATE=y ++CONFIG_SPL_MAX_SIZE=0x40000 ++CONFIG_SPL_PAD_TO=0x7f8000 ++CONFIG_SPL_HAS_BSS_LINKER_SECTION=y ++CONFIG_SPL_BSS_START_ADDR=0x4000000 ++CONFIG_SPL_BSS_MAX_SIZE=0x4000 ++CONFIG_SPL_BOARD_INIT=y ++# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set ++# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set ++CONFIG_SPL_STACK_R=y ++CONFIG_SPL_ADC=y ++CONFIG_SPL_POWER=y ++CONFIG_SPL_ATF=y ++CONFIG_CMD_PWM=y ++CONFIG_CMD_GPT=y ++CONFIG_CMD_MMC=y ++# CONFIG_CMD_SETEXPR is not set ++# CONFIG_SPL_DOS_PARTITION is not set ++CONFIG_SPL_OF_CONTROL=y ++CONFIG_OF_LIVE=y ++CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" ++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y ++# CONFIG_NET is not set ++CONFIG_SPL_DM_SEQ_ALIAS=y ++CONFIG_SPL_REGMAP=y ++CONFIG_SPL_SYSCON=y ++CONFIG_SPL_CLK=y ++CONFIG_ARM_SMCCC_FEATURES=y ++CONFIG_SCMI_FIRMWARE=y ++CONFIG_ROCKCHIP_GPIO=y ++CONFIG_SYS_I2C_ROCKCHIP=y ++CONFIG_MISC=y ++CONFIG_SUPPORT_EMMC_RPMB=y ++CONFIG_MMC_DW=y ++CONFIG_MMC_DW_ROCKCHIP=y ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_SDMA=y ++CONFIG_MMC_SDHCI_ROCKCHIP=y ++CONFIG_SPL_PINCTRL=y ++CONFIG_DM_PMIC=y ++CONFIG_DM_PMIC_FAN53555=y ++CONFIG_PMIC_RK8XX=y ++CONFIG_SPL_DM_REGULATOR=y ++CONFIG_SPL_DM_REGULATOR_FIXED=y ++CONFIG_REGULATOR_RK8XX=y ++CONFIG_PWM_ROCKCHIP=y ++CONFIG_SPL_RAM=y ++# CONFIG_RAM_ROCKCHIP_DEBUG is not set ++CONFIG_DM_RNG=y ++CONFIG_RNG_ROCKCHIP=y ++# CONFIG_RNG_SMCCC_TRNG is not set ++CONFIG_BAUDRATE=1500000 ++CONFIG_DEBUG_UART_SHIFT=2 ++CONFIG_SYS_NS16550_MEM32=y ++CONFIG_SYSRESET=y ++CONFIG_REGEX=y ++# CONFIG_RSA is not set ++CONFIG_ERRNO_STR=y ++# CONFIG_EFI_LOADER is not set +diff --git a/doc/board/index.rst b/doc/board/index.rst +index 531e547e7e..dd4bce9981 100644 +--- a/doc/board/index.rst ++++ b/doc/board/index.rst +@@ -36,6 +36,7 @@ Board-specific doc + nxp/index + openpiton/index + phytec/index ++ powkiddy/index + purism/index + qualcomm/index + renesas/index +diff --git a/doc/board/powkiddy/index.rst b/doc/board/powkiddy/index.rst +new file mode 100644 +index 0000000000..b0115a73d4 +--- /dev/null ++++ b/doc/board/powkiddy/index.rst +@@ -0,0 +1,9 @@ ++.. SPDX-License-Identifier: GPL-2.0+ ++ ++Powkiddy ++======== ++ ++.. toctree:: ++ :maxdepth: 2 ++ ++ x55.rst +diff --git a/doc/board/powkiddy/x55.rst b/doc/board/powkiddy/x55.rst +new file mode 100644 +index 0000000000..cd7456883b +--- /dev/null ++++ b/doc/board/powkiddy/x55.rst +@@ -0,0 +1,25 @@ ++.. SPDX-License-Identifier: GPL-2.0+ ++ ++U-Boot for Powkiddy X55 Handheld Gaming Console ++=============================================== ++ ++This allows U-Boot to boot the Powkiddy X55 handheld gaming console. ++The X55 is very similar to the other existing Powkiddy RK3566 based ++devices, except that ADC channels 0-3 are used for the ADC joysticks. ++As a result the same auto detection functionality cannot be used on ++this device as the others. ++ ++The indicator LED will change color based on the boot stage. Red means ++the device is powered on but has yet to start U-Boot, amber means the ++device has started U-Boot and is waiting to boot Linux, and when Linux ++has taken over the LED should change to green (or however it has been ++configured by the user). ++ ++In the event the device needs to enter Rockchip download mode, a user ++can, starting with the power off, hold the left joystick all the way ++to the left and then power on the device. At this point the USB-C port ++marked DC/OTG should be set to peripheral mode and allow a user to ++manipulate the device with the rkdeveloptool tool. ++ ++See :doc:`../rockchip/devicetree/rockchip` for building and flashing ++instructions. +diff --git a/doc/board/rockchip/rockchip.rst b/doc/board/rockchip/rockchip.rst +index 18d0b6f089..4e290cecdc 100644 +--- a/doc/board/rockchip/rockchip.rst ++++ b/doc/board/rockchip/rockchip.rst +@@ -98,6 +98,7 @@ List of mainline supported Rockchip boards: + - Pine64 SOQuartz on Blade (soquartz-blade-rk3566) + - Pine64 SOQuartz on CM4-IO (soquartz-cm4-rk3566) + - Pine64 SOQuartz on Model A (soquartz-model-a-rk3566) ++ - Powkiddy X55 (powkiddy-x55-rk3566) + - Radxa CM3 IO Board (radxa-cm3-io-rk3566) + + * rk3568 +diff --git a/include/configs/powkiddy-x55-rk3566.h b/include/configs/powkiddy-x55-rk3566.h +new file mode 100644 +index 0000000000..a25b6de455 +--- /dev/null ++++ b/include/configs/powkiddy-x55-rk3566.h +@@ -0,0 +1,14 @@ ++/* SPDX-License-Identifier: GPL-2.0+ */ ++ ++#ifndef __POWKIDDY_X55_RK3566_H ++#define __POWKIDDY_X55_RK3566_H ++ ++#include ++ ++#define ROCKCHIP_DEVICE_SETTINGS \ ++ "stdout=serial,vidconsole\0" \ ++ "stderr=serial,vidconsole\0" ++ ++#define RK_DNL_ADC_CHAN 0 ++ ++#endif +-- +2.34.1 diff --git a/projects/Rockchip/packages/u-boot/patches/RK3566/003-fix-dtb-and-vs.patch b/projects/Rockchip/packages/u-boot/patches/RK3566/003-fix-dtb-and-vs.patch new file mode 100644 index 0000000000..08d3f2b040 --- /dev/null +++ b/projects/Rockchip/packages/u-boot/patches/RK3566/003-fix-dtb-and-vs.patch @@ -0,0 +1,35 @@ +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 2445663d4..194605ff0 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -33,7 +33,7 @@ + + #define GPIO_WRITEMASK(bits) ((bits) << 16) + +-#define DTB_DIR "rockchip/" ++#define DTB_DIR "" + + struct rg3xx_model { + const u16 adc_value; +@@ -375,7 +375,7 @@ int rgxx3_detect_device(void) + if (ret) { + if (board_id == RG353V) + board_id = RG353VS; +- if (board_id == RG353P) ++ else if (board_id == RG353P) + board_id = RG353PS; + else + board_id = RGARCS; +diff --git a/configs/anbernic-rgxx3-rk3566_defconfig b/configs/anbernic-rgxx3-rk3566_defconfig +index 4e72f7581..27911cc9f 100644 +--- a/configs/anbernic-rgxx3-rk3566_defconfig ++++ b/configs/anbernic-rgxx3-rk3566_defconfig +@@ -30,7 +30,7 @@ CONFIG_SPL_LOAD_FIT=y + CONFIG_LEGACY_IMAGE_FORMAT=y + CONFIG_OF_BOARD_SETUP=y + CONFIG_OF_STDOUT_VIA_ALIAS=y +-CONFIG_DEFAULT_FDT_FILE="rockchip/rk3566-anbernic-rgxx3.dtb" ++CONFIG_DEFAULT_FDT_FILE="rk3566-anbernic-rgxx3.dtb" + # CONFIG_CONSOLE_MUX is not set + # CONFIG_DISPLAY_CPUINFO is not set + CONFIG_DISPLAY_BOARDINFO_LATE=y diff --git a/projects/Rockchip/packages/u-boot/patches/RK3566/004-rgb10max3.patch b/projects/Rockchip/packages/u-boot/patches/RK3566/004-rgb10max3.patch new file mode 100644 index 0000000000..da07cc5526 --- /dev/null +++ b/projects/Rockchip/packages/u-boot/patches/RK3566/004-rgb10max3.patch @@ -0,0 +1,26 @@ +diff --git a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +index 194605ff06..ee498631ba 100644 +--- a/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c ++++ b/board/anbernic/rgxx3_rk3566/rgxx3-rk3566.c +@@ -49,6 +49,7 @@ enum rgxx3_device_id { + RG353V, + RG503, + RGB30, ++ RGB10MAX3, + RK2023, + RGARCD, + /* Devices with duplicate ADC value */ +@@ -94,6 +95,13 @@ static const struct rg3xx_model rg3xx_model_details[] = { + .fdtfile = DTB_DIR "rk3566-powkiddy-rgb30.dtb", + .detect_panel = 0, + }, ++ [RGB10MAX3] = { ++ .adc_value = 765, /* Observed average from device */ ++ .board = "rk3566-powkiddy-rgb10max3", ++ .board_name = "RGB10MAX3", ++ .fdtfile = DTB_DIR "rk3566-powkiddy-rgb10max3.dtb", ++ .detect_panel = 0, ++ }, + [RK2023] = { + .adc_value = 635, /* Observed average from device */ + .board = "rk3566-powkiddy-rk2023", diff --git a/scripts/build b/scripts/build index ce6018842f..4eb8828b1b 100755 --- a/scripts/build +++ b/scripts/build @@ -237,18 +237,18 @@ fi # create wrapper scripts in build dir and use them for CC/CXX when # building for host and local-cc build flag is set if [ "${TARGET}" = "host" ] && flag_enabled "local-cc" "no"; then - cat > libreelec-local-cc << EOF + cat > jelos-local-cc << EOF #!/bin/sh exec ${CC} "\$@" EOF - chmod +x libreelec-local-cc - export CC=$(pwd)/libreelec-local-cc - cat > libreelec-local-cxx << EOF + chmod +x jelos-local-cc + export CC=$(pwd)/jelos-local-cc + cat > jelos-local-cxx << EOF #!/bin/sh exec ${CXX} "\$@" EOF - chmod +x libreelec-local-cxx - export CXX=$(pwd)/libreelec-local-cxx + chmod +x jelos-local-cxx + export CXX=$(pwd)/jelos-local-cxx fi # configure diff --git a/scripts/build_compat b/scripts/build_compat index 6be1240b63..c36088712d 100755 --- a/scripts/build_compat +++ b/scripts/build_compat @@ -47,7 +47,6 @@ function do_mkimage() { EXTRA_CMDLINE="${EXTRA_CMDLINE}" \ SYSTEM_SIZE="${SYSTEM_SIZE}" \ SYSTEM_PART_START="${SYSTEM_PART_START}" \ - OVA_SIZE="${OVA_SIZE}" \ SUBDEVICE="${SUBDEVICE}" \ ${SCRIPTS}/mkimage } @@ -58,18 +57,6 @@ else GIT_HASH=$(git rev-parse HEAD) fi -if [ "${OS_VERSION}" = "devel" ]; then - GIT_ABBREV=${GIT_HASH:0:7} - DEVEL_VERSION=${OS_VERSION} - case "${BUILD_PERIODIC}" in - nightly) OS_VERSION=nightly-$(date +%Y%m%d)-${GIT_ABBREV};; - daily) OS_VERSION=daily-$(date +%Y%j)-${GIT_ABBREV};; - weekly) OS_VERSION=weekly-$(date +%G%V)-${GIT_ABBREV};; - monthly) OS_VERSION=monthly-$(date +%Y%m)-${GIT_ABBREV};; - *) OS_VERSION=devel-$(date +%s);; - esac -fi - # Get origin url, fix git:// and git@github.com: urls if necessary ORIGIN_URL="$(git remote -v | awk '$1 == "origin" { print $2 }' | head -1 | sed 's#\.git$##;s#^git:#https:#;s#^git@github\.com:#https://github.com/#')" @@ -77,21 +64,13 @@ if [ -n "${CUSTOM_VERSION}" ]; then export OS_VERSION="${CUSTOM_VERSION}" fi -LIBREELEC_ARCH="${DEVICE:-${PROJECT}}.${TARGET_ARCH}" -TARGET_VERSION="${LIBREELEC_ARCH}-${OS_VERSION}" +OS_ARCH="${DEVICE:-${PROJECT}}.${TARGET_ARCH}" +TARGET_VERSION="${OS_ARCH}-${OS_VERSION}" if [ -n "${CUSTOM_IMAGE_NAME}" ]; then IMAGE_NAME="${CUSTOM_IMAGE_NAME}" else - if [ "${DEVEL_VERSION}" = "devel" ]; then - IMAGE_NAME="${DISTRONAME}-${LIBREELEC_ARCH}-${OS_VERSION}-${OS_VERSION}" - else - IMAGE_NAME="${DISTRONAME}-${TARGET_VERSION}" - fi - - if [ -n "${UBOOT_SYSTEM}" ] && [ "${UBOOT_SYSTEM}" != "${DEVICE:-${PROJECT}}" ]; then - IMAGE_NAME="${IMAGE_NAME}" - fi + IMAGE_NAME="${DISTRONAME}-${TARGET_VERSION}" fi if [ -n "${IMAGE_SUFFIX}" ]; then @@ -111,7 +90,7 @@ rm -rf ${INSTALL} rm -rf ${STAMPS_INSTALL} mkdir -p ${INSTALL} -# Create base layout of LibreELEC read-only file system +# Create base layout of JELOS read-only file system for directory in etc dev proc run sys tmp usr var flash storage; do mkdir -p ${INSTALL}/${directory} done diff --git a/scripts/checkdeps b/scripts/checkdeps index c76bf44d8d..eeafbd7bbd 100755 --- a/scripts/checkdeps +++ b/scripts/checkdeps @@ -97,11 +97,11 @@ perl_map=( # Native aarch64 on debian host needs to support rkbin (Rockchip) and aml_encrypt_* (Amlogic) if [ "$(uname -m)" = "aarch64" ] && [ "${PROJECT}" = "Rockchip" -o "${PROJECT}" = "Amlogic" ]; then dep_map[qemu-x86_64]=qemu-user-binfmt - if [ ! -f /lib64/ld-linux-x86-64.so.2 -o ! -f /lib/x86_64-linux-gnu/libc.so.6 ]; then - echo -e "Copy from a working x86_64 system:\n\t/lib64/ld-linux-x86-64.so.2\n\t/lib/x86_64-linux-gnu/libc.so.6" + if [ ! -f /lib64/ld-linux-x86-64.so.2 -o ! -f /lib/x86_64-jelos-linux-gnu/libc.so.6 ]; then + echo -e "Copy from a working x86_64 system:\n\t/lib64/ld-linux-x86-64.so.2\n\t/lib/x86_64-jelos-linux-gnu/libc.so.6" fi file_map[/lib64/ld-linux-x86-64.so.2]="libc6:amd64" - file_map[/lib/x86_64-linux-gnu/libc.so.6]="libc6:amd64" + file_map[/lib/x86_64-jelos-linux-gnu/libc.so.6]="libc6:amd64" fi # remap or add [depend]=package needs based on host distro diff --git a/scripts/clean b/scripts/clean index a73a4a8848..481fad783f 100755 --- a/scripts/clean +++ b/scripts/clean @@ -16,15 +16,15 @@ clean_package() { # Use a wilcard here to remove all versions of the package for i in "${BUILD}/${1}-"*; do - if [ -d "${i}" -a -f "${i}/.libreelec-unpack" ]; then - . "${i}/.libreelec-unpack" + if [ -d "${i}" -a -f "${i}/.jelos-unpack" ]; then + . "${i}/.jelos-unpack" if [ "${STAMP_PKG_NAME}" = "${1}" ]; then build_msg "CLR_WARNING" "*" "$(print_color "CLR_WARNING_DIM" "Removing ${i} ...")" rm -rf "${i}" fi - elif [ -d "${i}" -a -f "${i}/.libreelec-package" ]; then + elif [ -d "${i}" -a -f "${i}/.jelos-package" ]; then # force clean if no stamp found (previous unpack failed) - . "${i}/.libreelec-package" + . "${i}/.jelos-package" if [ "${INFO_PKG_NAME}" = "${1}" ]; then build_msg "" "" "* Removing ${i} ..." rm -rf "${i}" diff --git a/scripts/genbuildplan.py b/scripts/genbuildplan.py index 3922f886a7..e29a724744 100755 --- a/scripts/genbuildplan.py +++ b/scripts/genbuildplan.py @@ -9,7 +9,7 @@ ROOT_PKG = "__root__" -class LibreELEC_Package: +class JELOS_Package: def __init__(self, name, section): self.name = name self.section = section @@ -130,9 +130,9 @@ def loadPackages(): return map -# Create a fully formed LibreELEC_Package object +# Create a fully formed JELOS_Package object def initPackage(package): - pkg = LibreELEC_Package(package["name"], package["section"]) + pkg = JELOS_Package(package["name"], package["section"]) for target in ["bootstrap", "init", "host", "target"]: pkg.addDependencies(target, package[target]) diff --git a/scripts/image b/scripts/image index 392adc2e1b..8dd71b4a0f 100755 --- a/scripts/image +++ b/scripts/image @@ -49,7 +49,6 @@ function do_mkimage() { SYSTEM_SIZE="${SYSTEM_SIZE}" \ SYSTEM_PART_START="${SYSTEM_PART_START}" \ STORAGE_SIZE="${STORAGE_SIZE:-32}" \ - OVA_SIZE="${OVA_SIZE}" \ SUBDEVICE="${SUBDEVICE}" \ ${SCRIPTS}/mkimage } @@ -60,18 +59,6 @@ else GIT_HASH=$(git rev-parse HEAD) fi -if [ "${OS_VERSION}" = "devel" ]; then - GIT_ABBREV=${GIT_HASH:0:7} - DEVEL_VERSION=${OS_VERSION} - case "${BUILD_PERIODIC}" in - nightly) OS_VERSION=nightly-$(date +%Y%m%d)-${GIT_ABBREV};; - daily) OS_VERSION=daily-$(date +%Y%j)-${GIT_ABBREV};; - weekly) OS_VERSION=weekly-$(date +%G%V)-${GIT_ABBREV};; - monthly) OS_VERSION=monthly-$(date +%Y%m)-${GIT_ABBREV};; - *) OS_VERSION=devel-$(date +%s);; - esac -fi - # Get origin url, fix git:// and git@github.com: urls if necessary ORIGIN_URL="$(git remote -v | awk '$1 == "origin" { print $2 }' | head -1 | sed 's#\.git$##;s#^git:#https:#;s#^git@github\.com:#https://github.com/#')" @@ -79,17 +66,13 @@ if [ -n "${CUSTOM_VERSION}" ]; then export OS_VERSION="${CUSTOM_VERSION}" fi -LIBREELEC_ARCH="${DEVICE:-${PROJECT}}.${TARGET_ARCH}" -TARGET_VERSION="${LIBREELEC_ARCH}-${OS_VERSION}" +OS_ARCH="${DEVICE:-${PROJECT}}.${TARGET_ARCH}" +TARGET_VERSION="${OS_ARCH}-${OS_VERSION}" if [ -n "${CUSTOM_IMAGE_NAME}" ]; then IMAGE_NAME="${CUSTOM_IMAGE_NAME}" else - if [ "${DEVEL_VERSION}" = "devel" ]; then - IMAGE_NAME="${DISTRONAME}-${LIBREELEC_ARCH}-${OS_VERSION}-${OS_VERSION}" - else - IMAGE_NAME="${DISTRONAME}-${TARGET_VERSION}" - fi + IMAGE_NAME="${DISTRONAME}-${TARGET_VERSION}" fi if [ -n "${IMAGE_SUFFIX}" ]; then @@ -109,7 +92,7 @@ rm -rf ${INSTALL} rm -rf ${STAMPS_INSTALL} mkdir -p ${INSTALL} -# Create base layout of LibreELEC read-only file system +# Create base layout of JELOS read-only file system for directory in etc dev proc run sys tmp usr var flash storage; do mkdir -p ${INSTALL}/${directory} done @@ -206,7 +189,7 @@ if [ -n "${NO_IMAGE}" ]; then exit 0 fi -if [ "${1}" = "system" -o "${1}" = "mkimage" -o "${1}" = "noobs" ] +if [ "${1}" = "system" -o "${1}" = "mkimage" ] then echo "Creating image..." >&2 @@ -241,7 +224,7 @@ then chmod 0644 ${TARGET_IMG}/${IMAGE_NAME}.system fi -if [ "${1}" = "release" -o "${1}" = "mkimage" -o "${1}" = "noobs" ]; then +if [ "${1}" = "release" -o "${1}" = "mkimage" ]; then RELEASE_DIR="target/${IMAGE_NAME}" @@ -303,7 +286,7 @@ if [ "${1}" = "release" -o "${1}" = "mkimage" -o "${1}" = "noobs" ]; then ) # Create image files if requested - if [[ ( "${1}" = "noobs" || "${1}" = "mkimage" ) && -n "${BOOTLOADER}" ]]; then + if [[ ( "${1}" = "mkimage" ) && -n "${BOOTLOADER}" ]]; then UUID_SYSTEM="$(date '+%d%m')-$(date '+%M%S')" UUID_STORAGE="$(uuidgen)" @@ -333,121 +316,6 @@ if [ "${1}" = "release" -o "${1}" = "mkimage" -o "${1}" = "noobs" ]; then # Cleanup release dir rm -rf ${RELEASE_DIR} - if [ "${1}" = "noobs" ]; then - echo "Creating \"${1}\" release tarball..." - - RELEASE_DIR="${TARGET_IMG}/${IMAGE_NAME}-${1}" - - # eg. LibreELEC_RPi, LibreELEC_RPi2 etc. - NOOBS_DISTRO="${DISTRONAME}_${DEVICE:-${PROJECT}}" - - # Create release dir - mkdir -p ${RELEASE_DIR}/${NOOBS_DISTRO} - - if [ -f ${DISTRO_DIR}/${DISTRO}/${DISTRONAME}_40x40.png ]; then - cp -PR ${DISTRO_DIR}/${DISTRO}/${DISTRONAME}_40x40.png ${RELEASE_DIR}/${NOOBS_DISTRO}/${NOOBS_DISTRO}.png - else - cp -PR ${DISTRO_DIR}/${DISTRO}/${DISTRONAME}.png ${RELEASE_DIR}/${NOOBS_DISTRO}/${NOOBS_DISTRO}.png - fi - cp -PR ${ROOT}/config/noobs/os.json ${RELEASE_DIR}/${NOOBS_DISTRO} - cp -PR ${ROOT}/config/noobs/partition_setup.sh ${RELEASE_DIR}/${NOOBS_DISTRO} - cp -PR ${ROOT}/config/noobs/partitions.json ${RELEASE_DIR}/${NOOBS_DISTRO} - if [ -d ${DISTRO_DIR}/${DISTRO}/noobs/marketing ]; then - tar cf ${RELEASE_DIR}/${NOOBS_DISTRO}/marketing.tar -C ${DISTRO_DIR}/${DISTRO}/noobs/marketing . - else - tar cf ${RELEASE_DIR}/${NOOBS_DISTRO}/marketing.tar -C ${ROOT}/config/noobs/marketing . - fi - cp ${ROOT}/README* ${RELEASE_DIR}/${NOOBS_DISTRO} - - if [ -n "${NOOBS_HEX}" ]; then - sed -e "s%@NOOBS_HEX@%${NOOBS_HEX}%g" \ - -i ${RELEASE_DIR}/${NOOBS_DISTRO}/os.json - else - sed -e "/@NOOBS_HEX@/d" \ - -i ${RELEASE_DIR}/${NOOBS_DISTRO}/os.json - fi - - sed -e "s%@DISTRONAME@%${DISTRONAME}%g" \ - -e "s%@PROJECT@%${DEVICE:-${PROJECT}}%g" \ - -e "s%@OS_VERSION@%${OS_VERSION}%g" \ - -e "s%@RELEASE_DATE@%$(date +%F)%g" \ - -e "s%@KERNEL_VERSION@%$(kernel_version)%g" \ - -e "s%@DESCRIPTION@%${DESCRIPTION}%g" \ - -e "s%@ROOT_PASSWORD@%${ROOT_PASSWORD}%g" \ - -e "s%@NOOBS_SUPPORTED_MODELS@%${NOOBS_SUPPORTED_MODELS}%g" \ - -i ${RELEASE_DIR}/${NOOBS_DISTRO}/os.json - - sed -e "s%@DISTRONAME@%${DISTRONAME}%g" \ - -e "s%@PROJECT@%${DEVICE:-${PROJECT}}%g" \ - -e "s%@SYSTEM_SIZE@%${SYSTEM_SIZE}%g" \ - -i ${RELEASE_DIR}/${NOOBS_DISTRO}/partitions.json - - # Create System dir - mkdir -p ${RELEASE_DIR}/${NOOBS_DISTRO}/System - - # Copy Bootloader - cp -PR ${INSTALL}/usr/share/bootloader/config.txt ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ - cp -PR ${INSTALL}/usr/share/bootloader/distroconfig.txt ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ - cp -PR ${INSTALL}/usr/share/bootloader/LICENCE* ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ - cp -PR ${INSTALL}/usr/share/bootloader/bootcode.bin ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ - cp -PR ${INSTALL}/usr/share/bootloader/fixup.dat ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ - cp -PR ${INSTALL}/usr/share/bootloader/start.elf ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ - [ -f ${INSTALL}/usr/share/bootloader/dt-blob.bin ] && cp -PR ${INSTALL}/usr/share/bootloader/dt-blob.bin ${RELEASE_DIR}/${NOOBS_DISTRO}/System/dt-blob.bin - - # Copy system files - cp ${TARGET_IMG}/${IMAGE_NAME}.system ${RELEASE_DIR}/${NOOBS_DISTRO}/System/SYSTEM - cp ${TARGET_IMG}/${IMAGE_NAME}.kernel ${RELEASE_DIR}/${NOOBS_DISTRO}/System/kernel.img - - for dtb in ${INSTALL}/usr/share/bootloader/*.dtb; do - if [ -f ${dtb} ]; then - cp -PR ${dtb} ${RELEASE_DIR}/${NOOBS_DISTRO}/System - fi - done - - for overlay in ${INSTALL}/usr/share/bootloader/overlays/*; do - if [ -f ${overlay} ]; then - mkdir -p ${RELEASE_DIR}/${NOOBS_DISTRO}/System/overlays - cp -PR ${overlay} ${RELEASE_DIR}/${NOOBS_DISTRO}/System/overlays - fi - done - - # Create md5sum's - ( cd ${RELEASE_DIR}/${NOOBS_DISTRO}/System; - md5sum -t SYSTEM > SYSTEM.md5; - md5sum -t kernel.img > kernel.img.md5; - ) - - # Copy additional files - mkdir -p ${RELEASE_DIR}/${NOOBS_DISTRO}/System/licenses - cp ${ROOT}/licenses/* ${RELEASE_DIR}/${NOOBS_DISTRO}/System/licenses - - # Create Storage dir - mkdir -p ${RELEASE_DIR}/${NOOBS_DISTRO}/Storage - - # Remove any previously created release tarball - rm -rf ${RELEASE_DIR}/${NOOBS_DISTRO}/System.tar.xz - rm -rf ${RELEASE_DIR}/${NOOBS_DISTRO}/Storage.tar.xz - - # Create filesystem tarballs - ${TOOLCHAIN}/bin/fakeroot tar cJf ${RELEASE_DIR}/${NOOBS_DISTRO}/System.tar.xz -C ${RELEASE_DIR}/${NOOBS_DISTRO}/System/ . - ${TOOLCHAIN}/bin/fakeroot tar cJf ${RELEASE_DIR}/${NOOBS_DISTRO}/Storage.tar.xz -C ${RELEASE_DIR}/${NOOBS_DISTRO}/Storage/ . - - # Remove filesystem dirs - rm -rf ${RELEASE_DIR}/${NOOBS_DISTRO}/System - rm -rf ${RELEASE_DIR}/${NOOBS_DISTRO}/Storage - - # Remove any previously created release tarball - rm -rf ${TARGET_IMG}/${IMAGE_NAME}-${1}.tar - - # Create release tarball - tar cf ${TARGET_IMG}/${IMAGE_NAME}-${1}.tar -C ${TARGET_IMG} ${IMAGE_NAME}-${1} - - # Create sha256 checksum of tarball - ( cd ${TARGET_IMG} - sha256sum ${IMAGE_NAME}-${1}.tar > ${IMAGE_NAME}-${1}.tar.sha256 - ) - fi - if [ -d ${RELEASE_DIR} ]; then # Cleanup release dir rm -rf ${RELEASE_DIR} diff --git a/scripts/mkimage b/scripts/mkimage index d6a202cdf5..966dbb2061 100755 --- a/scripts/mkimage +++ b/scripts/mkimage @@ -127,13 +127,6 @@ e2fsck -n "${LE_TMP}/part2.ext4" >"${SAVE_ERROR}" 2>&1 || show_error echo "image: merging part2 into disk image..." dd if="${LE_TMP}/part2.ext4" of="${DISK}" bs=512 seek="${STORAGE_PART_START}" conv=fsync,notrunc >"${SAVE_ERROR}" 2>&1 || show_error -# create disk image for virtual appliance -if [ "${PROJECT}" = "Generic" ]; then - echo "image: creating open virtual appliance..." - # duplicate ${DISK} so anything we do to it directly doesn't effect original - dd if="${DISK}" of="${DISK_BASENAME}.tmp" bs=1M conv=fsync >"${SAVE_ERROR}" 2>&1 || show_error -fi - # create part1 to format and copy files echo "image: creating sparse file for part1..." SYSTEM_PART_COUNT=$(( ${SYSTEM_PART_END} - ${SYSTEM_PART_START} + 1 )) @@ -147,7 +140,7 @@ alias mmd='mmd -i "${LE_TMP}/part1.fat"' # create filesystem on part1 echo "image: creating filesystem on part1..." -if [ "${BOOTLOADER}" = "syslinux" -o "${BOOTLOADER}" = "bcm2835-bootloader" -o "${BOOTLOADER}" = "u-boot" ]; then +if [ "${BOOTLOADER}" = "syslinux" -o "${BOOTLOADER}" = "u-boot" ]; then mformat -i "${LE_TMP}/part1.fat" -v "${DISTRO_BOOTLABEL}" -N "${UUID_SYSTEM//-/}" :: >"${SAVE_ERROR}" 2>&1 || show_error fi sync @@ -194,42 +187,6 @@ EOF mcopy "${TOOLCHAIN}/share/grub/bootia32.efi" ::/EFI/BOOT mcopy "${LE_TMP}/grub.cfg" ::/EFI/BOOT -elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then - # create bootloader configuration - echo "image: creating bootloader configuration..." - cat << EOF > "${LE_TMP}/cmdline.txt" -boot=UUID=${UUID_SYSTEM} disk=UUID=${UUID_STORAGE} quiet ${EXTRA_CMDLINE} -EOF - - mcopy "${LE_TMP}/cmdline.txt" :: - - # copy files - echo "image: copying files to part1..." - mcopy "${TARGET_IMG}/${BUILD_NAME}.kernel" "::/${KERNEL_NAME}" - mcopy "${TARGET_IMG}/${BUILD_NAME}.system" ::/SYSTEM - mcopy "${RELEASE_DIR}/target/KERNEL.md5" "::/${KERNEL_NAME}.md5" - mcopy "${RELEASE_DIR}/target/SYSTEM.md5" ::/SYSTEM.md5 - - mcopy "${RELEASE_DIR}/3rdparty/bootloader/bootcode.bin" :: - mcopy "${RELEASE_DIR}/3rdparty/bootloader/fixup.dat" :: - mcopy "${RELEASE_DIR}/3rdparty/bootloader/start.elf" :: - mcopy "${RELEASE_DIR}/3rdparty/bootloader/config.txt" :: - mcopy "${RELEASE_DIR}/3rdparty/bootloader/distroconfig.txt" :: - - if [ -f "${RELEASE_DIR}/3rdparty/bootloader/dt-blob.bin" ]; then - mcopy "${RELEASE_DIR}/3rdparty/bootloader/dt-blob.bin" :: - fi - - for dtb in "${RELEASE_DIR}/3rdparty/bootloader/"*.dtb ; do - if [ -f "${dtb}" ]; then - mcopy "${dtb}" ::/$(basename "${dtb}") - fi - done - - if [ -d "${RELEASE_DIR}/3rdparty/bootloader/overlays" ]; then - mcopy -s "${RELEASE_DIR}/3rdparty/bootloader/overlays" :: - fi - elif [ "${BOOTLOADER}" = "u-boot" -a \( -n "${UBOOT_CONFIG}" -o -n "${SUBDEVICE}" \) ]; then # create bootloader configuration echo "image: creating bootloader configuration... (u-boot)" @@ -270,40 +227,6 @@ fsck.fat -n "${LE_TMP}/part1.fat" >"${SAVE_ERROR}" 2>&1 || show_error echo "image: merging part1 into disk image..." dd if="${LE_TMP}/part1.fat" of="${DISK}" bs=512 seek="${SYSTEM_PART_START}" conv=fsync,notrunc >"${SAVE_ERROR}" 2>&1 || show_error -# finalize virtual appliance -if [ "${PROJECT}" = "Generic" ]; then - # change syslinux default to 'run' - echo "image: modifying files on part1 for open virtual appliance..." - sed -e "/DEFAULT/ s/installer/run/" -i "${LE_TMP}/syslinux.cfg" - sed -e "/set default=/s/\"Installer\"/\"Run\"/" -i "${LE_TMP}/grub.cfg" - mcopy "${LE_TMP}/syslinux.cfg" :: >"${SAVE_ERROR}" 2>&1 || show_error - mcopy "${LE_TMP}/grub.cfg" ::/EFI/BOOT >"${SAVE_ERROR}" 2>&1 || show_error - sync - # run fsck - echo "image: checking filesystem on part1..." - fsck.fat -n "${LE_TMP}/part1.fat" >"${SAVE_ERROR}" 2>&1 || show_error - # merge modified part1 into tmp disk image - echo "image: merging part1 into open virtual appliance..." - dd if="${LE_TMP}/part1.fat" of="${DISK_BASENAME}.tmp" bs=512 seek="${SYSTEM_PART_START}" conv=fsync,notrunc >"${SAVE_ERROR}" 2>&1 || show_error - # create vmdk from tmp ${DISK} - echo "image: creating vmdk for open virtual appliance..." - qemu-img convert -O vmdk -o subformat=streamOptimized "${DISK_BASENAME}.tmp" "${DISK_BASENAME}.vmdk" - # generate ovf from template - sed -e "s,@DISTRO@,${DISTRO},g" -e "s,@DISK@,${IMAGE_NAME},g" \ - -e "s,@OVA_SIZE@,$((${OVA_SIZE}*1024*1024)),g" \ - "${PROJECT_DIR}/${PROJECT}/config/ovf.template" > "${DISK_BASENAME}.ovf" - # combine ovf and vmdk into official ova - tar -C "${TARGET_IMG}" -cf "${DISK_BASENAME}.ova" "${IMAGE_NAME}.ovf" "${IMAGE_NAME}.vmdk" - # create sha256 checksum of ova image - ( - cd "${TARGET_IMG}" - sha256sum "${IMAGE_NAME}.ova" > "${IMAGE_NAME}.ova.sha256" - ) - echo "image: cleaning up open virtual appliance..." - # remove tmp ${DISK}, vmdk and ovf - rm "${DISK_BASENAME}.tmp" "${DISK_BASENAME}.vmdk" "${DISK_BASENAME}.ovf" -fi - # gzip echo "image: compressing..." pigz --best --force "${DISK}" diff --git a/scripts/unpack b/scripts/unpack index a295f58778..d7a6712365 100755 --- a/scripts/unpack +++ b/scripts/unpack @@ -28,15 +28,15 @@ if [ -n "${PKG_DEPENDS_UNPACK}" ]; then done fi -STAMP="${PKG_BUILD}/.libreelec-unpack" +STAMP="${PKG_BUILD}/.jelos-unpack" mkdir -p ${BUILD} # Perform a wildcard match on the package to ensure old versions are cleaned too PKG_DEEPHASH= for i in ${BUILD}/${PKG_NAME}-*; do - if [ -d ${i} -a -f "${i}/.libreelec-unpack" ] ; then - . "${i}/.libreelec-unpack" + if [ -d ${i} -a -f "${i}/.jelos-unpack" ] ; then + . "${i}/.jelos-unpack" if [ "${STAMP_PKG_NAME}" = "${PKG_NAME}" ]; then [ -z "${PKG_DEEPHASH}" ] && PKG_DEEPHASH=$(calculate_stamp) if [ ! "${PKG_DEEPHASH}" = "${STAMP_PKG_DEEPHASH}" ] ; then @@ -70,7 +70,7 @@ if [ -d "${SOURCES}/${PKG_NAME}" -o -d "${PKG_DIR}/sources" ] || pkg_call_exists build_msg "CLR_UNPACK" "UNPACK" "${PKG_NAME}" "indent" # unpack into a unique location as unpacking into a single ${BUILD} directory is not thread-safe - PKG_UNPACK_DIR="${BUILD}/.unpack/${PKG_NAME}" + PKG_UNPACK_DIR="${BUILD}/.jelos-unpack/${PKG_NAME}" rm -rf "${PKG_UNPACK_DIR}" mkdir -p "${PKG_UNPACK_DIR}" @@ -111,7 +111,7 @@ if [ -d "${SOURCES}/${PKG_NAME}" -o -d "${PKG_DIR}/sources" ] || pkg_call_exists fi # Add a tag to the unpacked folder before transferring into the shared build folder - echo "INFO_PKG_NAME=\"${PKG_NAME}\"" > "${PKG_UNPACK_DIR}/.intermediate/.libreelec-package" + echo "INFO_PKG_NAME=\"${PKG_NAME}\"" > "${PKG_UNPACK_DIR}/.intermediate/.jelos-package" # Restore original PKG_BUILD, and transfer the unpacked folder PKG_BUILD="${PKG_BUILD_ORIG}" @@ -209,7 +209,7 @@ fi if [ "${PKG_SECTION}" != "virtual" ]; then mkdir -p "${PKG_BUILD}" - echo "INFO_PKG_NAME=\"${PKG_NAME}\"" > "${PKG_BUILD}/.libreelec-package" + echo "INFO_PKG_NAME=\"${PKG_NAME}\"" > "${PKG_BUILD}/.jelos-package" rm -f ${STAMPS}/${PKG_NAME}/build_*