From d955b41275eaf93b7600f8eb7d706f40302f26c2 Mon Sep 17 00:00:00 2001 From: Mikhail Zhilkin Date: Sat, 3 Jun 2023 08:37:54 +0000 Subject: [PATCH 01/23] ramips: enable LED button for TP-Link EC330-G5u v1 The device already has LED push button (KEY_LIGHTS_TOGGLE) and exported GPIO control "led-light". This commit adds button handler script for switching on/off all device LEDs. Signed-off-by: Mikhail Zhilkin Signed-off-by: Christian Lamparter --- .../base-files/etc/rc.button/lights_toggle | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100755 target/linux/ramips/mt7621/base-files/etc/rc.button/lights_toggle diff --git a/target/linux/ramips/mt7621/base-files/etc/rc.button/lights_toggle b/target/linux/ramips/mt7621/base-files/etc/rc.button/lights_toggle new file mode 100755 index 00000000000..c008b633a4e --- /dev/null +++ b/target/linux/ramips/mt7621/base-files/etc/rc.button/lights_toggle @@ -0,0 +1,16 @@ +#!/bin/sh + +[[ "${ACTION}" = "released" ]] || exit 0 + +. /lib/functions.sh + +case "$(board_name)" in +tplink,ec330-g5u-v1) + led_light="/sys/class/gpio/led-light/value" + echo "$((!$(cat $led_light)))" > "$led_light" +;; + *) +;; +esac + +return 0 From cc87f6629b8a120420075cd984a4e6ece6c669df Mon Sep 17 00:00:00 2001 From: Jitao Lu Date: Sun, 4 Jun 2023 13:54:01 +0800 Subject: [PATCH 02/23] oxnas: Enable CONFIG_CRYPTO_LZ4 Previously, CONFIG_LZ4_DECOMPRESS=y was selected by CONFIG_RD_LZ4 only. When building kernel for initramfs, CONFIG_RD_LZ4 will be unset by Kernel/SetInitramfs if the chosen compression method is not lz4, then CONFIG_LZ4_DECOMPRESS will become a *module* in the newly generated kernel config. However, the newly added module won't be built after 38c150612cc9be488527e342db92d5c74093213f, so packaging kmod-lib-lz4 fails due to missing lz4_decompress.ko. CONFIG_CRYPTO_LZ4=y makes CONFIG_LZ4_DECOMPRESS=y being selected w/o CONFIG_RD_LZ4, so that the modules of the default kernel and initramfs kernel are consistent. Fixes: #12766 Fixes: 38c150612cc ("build: revert 54070a1 (all kernels are >= 5.10)") Signed-off-by: Jitao Lu --- target/linux/oxnas/config-5.15 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/target/linux/oxnas/config-5.15 b/target/linux/oxnas/config-5.15 index cdb762a2a0d..9540a76774f 100644 --- a/target/linux/oxnas/config-5.15 +++ b/target/linux/oxnas/config-5.15 @@ -77,6 +77,7 @@ CONFIG_CRC16=y CONFIG_CRC32_SLICEBY8=y CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_LZ4=y CONFIG_CRYPTO_RNG2=y CONFIG_DEBUG_ALIGN_RODATA=y CONFIG_DEBUG_BUGVERBOSE=y @@ -165,6 +166,7 @@ CONFIG_LEDS_TRIGGER_ONESHOT=y CONFIG_LIBFDT=y CONFIG_LOCALVERSION_AUTO=y CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_LZ4_COMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_LZO_DECOMPRESS=y # CONFIG_MACH_OX810SE is not set @@ -242,6 +244,7 @@ CONFIG_SERIAL_OF_PLATFORM=y CONFIG_SERIO=y CONFIG_SERIO_LIBPS2=y CONFIG_SERIO_SERPORT=y +CONFIG_SGL_ALLOC=y CONFIG_SLUB_DEBUG=y CONFIG_SOCK_DIAG=y CONFIG_SPARSE_IRQ=y From d69becd3071d560cd1c9ea655cbba26adce91f61 Mon Sep 17 00:00:00 2001 From: Aleksander Jan Bajkowski Date: Thu, 25 May 2023 22:20:15 +0200 Subject: [PATCH 03/23] kernel: use struct group to wipe psb6970 volatile priv data Instead of reference vlan and do strange subtraction, use the handy struct_group() to create a virtual struct of the same size of the members. This permits to have a more secure memset and fix compilation warning in 6.1 where additional checks are done. Fix compilation warning: | inlined from 'psb6970_reset_switch' at drivers/net/phy/psb6970.c:275:2: | ./include/linux/fortify-string.h:314:25: error: call to '__write_overflow_field' | declared with attribute warning: detected write beyond size of field | (1st parameter); maybe use struct_group()? [-Werror=attribute-warning] | 314 | __write_overflow_field(p_size_field, size); | | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |cc1: all warnings being treated as errors Signed-off-by: Aleksander Jan Bajkowski --- .../generic/files/drivers/net/phy/psb6970.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/target/linux/generic/files/drivers/net/phy/psb6970.c b/target/linux/generic/files/drivers/net/phy/psb6970.c index af64704b164..2587b999138 100644 --- a/target/linux/generic/files/drivers/net/phy/psb6970.c +++ b/target/linux/generic/files/drivers/net/phy/psb6970.c @@ -60,11 +60,13 @@ struct psb6970_priv { struct mutex reg_mutex; /* all fields below are cleared on reset */ - bool vlan; - u16 vlan_id[PSB6970_MAX_VLANS]; - u8 vlan_table[PSB6970_MAX_VLANS]; - u8 vlan_tagged; - u16 pvid[PSB6970_NUM_PORTS]; + struct_group(psb6970_priv_volatile, + bool vlan; + u16 vlan_id[PSB6970_MAX_VLANS]; + u8 vlan_table[PSB6970_MAX_VLANS]; + u8 vlan_tagged; + u16 pvid[PSB6970_NUM_PORTS]; + ); }; #define to_psb6970(_dev) container_of(_dev, struct psb6970_priv, dev) @@ -272,8 +274,8 @@ static int psb6970_reset_switch(struct switch_dev *dev) mutex_lock(&priv->reg_mutex); - memset(&priv->vlan, 0, sizeof(struct psb6970_priv) - - offsetof(struct psb6970_priv, vlan)); + memset(&priv->psb6970_priv_volatile, 0, + sizeof(priv->psb6970_priv_volatile)); for (i = 0; i < PSB6970_MAX_VLANS; i++) priv->vlan_id[i] = i; From 62338f41625074640a4de9e26e5e67b010fe0ebe Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Thu, 8 Jun 2023 03:23:53 +0200 Subject: [PATCH 04/23] generic: drop useless binfmt patch fixing compilation warning The compilation warning was triggered by wrongly set FRAME_WARN to 1024 even for 64bit. This was recently fix by correctly setting the FRAME_WARN to 2048 for 64bit systems. The compilation warning would still be triggered on 32bit system but the actual code is never reached as ARCH_USE_GNU_PROPERTY is only set on arm64 arch. Drop the patch as kmalloc cause perf regression as suggested by upstream maintainers. Fixes: fa79baf4a6e2 ("generic: copy backport, hack, pending patch and config from 5.15 to 6.1") Fixes: 5913ea1ba2fa ("generic: 5.15: add pending patch fixing binfmt compilation warning") Signed-off-by: Christian Marangi --- ...ically-allocate-note.data-in-parse_e.patch | 94 ------------------- ...ically-allocate-note.data-in-parse_e.patch | 94 ------------------- 2 files changed, 188 deletions(-) delete mode 100644 target/linux/generic/pending-5.15/130-binfmt_elf-dynamically-allocate-note.data-in-parse_e.patch delete mode 100644 target/linux/generic/pending-6.1/130-binfmt_elf-dynamically-allocate-note.data-in-parse_e.patch diff --git a/target/linux/generic/pending-5.15/130-binfmt_elf-dynamically-allocate-note.data-in-parse_e.patch b/target/linux/generic/pending-5.15/130-binfmt_elf-dynamically-allocate-note.data-in-parse_e.patch deleted file mode 100644 index f04007e982d..00000000000 --- a/target/linux/generic/pending-5.15/130-binfmt_elf-dynamically-allocate-note.data-in-parse_e.patch +++ /dev/null @@ -1,94 +0,0 @@ -From ca71e00839fcdd26f122fb6d9e97903c9fe198f7 Mon Sep 17 00:00:00 2001 -From: Christian Marangi -Date: Sat, 6 May 2023 08:08:35 +0200 -Subject: [PATCH] binfmt_elf: dynamically allocate note.data in - parse_elf_properties - -Dynamically allocate note.data in parse_elf_properties to fix -compilation warning on some arch. - -On some arch note.data exceet the stack limit for a single function and -this cause the following compilation warning: -fs/binfmt_elf.c: In function 'parse_elf_properties.isra': -fs/binfmt_elf.c:821:1: error: the frame size of 1040 bytes is larger than 1024 bytes [-Werror=frame-larger-than=] - 821 | } - | ^ -cc1: all warnings being treated as errors - -Fix this by dynamically allocating the array. - -Fixes: 00e19ceec80b ("ELF: Add ELF program property parsing support") -Signed-off-by: Christian Marangi -Cc: stable@vger.kernel.org # v5.8+ ---- - fs/binfmt_elf.c | 32 +++++++++++++++++++++++--------- - 1 file changed, 23 insertions(+), 9 deletions(-) - ---- a/fs/binfmt_elf.c -+++ b/fs/binfmt_elf.c -@@ -768,7 +768,7 @@ static int parse_elf_properties(struct f - { - union { - struct elf_note nhdr; -- char data[NOTE_DATA_SZ]; -+ char *data; - } note; - loff_t pos; - ssize_t n; -@@ -788,26 +788,38 @@ static int parse_elf_properties(struct f - if (phdr->p_filesz > sizeof(note)) - return -ENOEXEC; - -+ note.data = kcalloc(NOTE_DATA_SZ, sizeof(*note.data), GFP_KERNEL); -+ if (!note.data) -+ return -ENOMEM; -+ - pos = phdr->p_offset; - n = kernel_read(f, ¬e, phdr->p_filesz, &pos); - - BUILD_BUG_ON(sizeof(note) < sizeof(note.nhdr) + NOTE_NAME_SZ); -- if (n < 0 || n < sizeof(note.nhdr) + NOTE_NAME_SZ) -- return -EIO; -+ if (n < 0 || n < sizeof(note.nhdr) + NOTE_NAME_SZ) { -+ ret = -EIO; -+ goto exit; -+ } - - if (note.nhdr.n_type != NT_GNU_PROPERTY_TYPE_0 || - note.nhdr.n_namesz != NOTE_NAME_SZ || - strncmp(note.data + sizeof(note.nhdr), -- GNU_PROPERTY_TYPE_0_NAME, n - sizeof(note.nhdr))) -- return -ENOEXEC; -+ GNU_PROPERTY_TYPE_0_NAME, n - sizeof(note.nhdr))) { -+ ret = -ENOEXEC; -+ goto exit; -+ } - - off = round_up(sizeof(note.nhdr) + NOTE_NAME_SZ, - ELF_GNU_PROPERTY_ALIGN); -- if (off > n) -- return -ENOEXEC; -- -- if (note.nhdr.n_descsz > n - off) -- return -ENOEXEC; -+ if (off > n) { -+ ret = -ENOEXEC; -+ goto exit; -+ } -+ -+ if (note.nhdr.n_descsz > n - off) { -+ ret = -ENOEXEC; -+ goto exit; -+ } - datasz = off + note.nhdr.n_descsz; - - have_prev_type = false; -@@ -817,6 +829,8 @@ static int parse_elf_properties(struct f - have_prev_type = true; - } while (!ret); - -+exit: -+ kfree(note.data); - return ret == -ENOENT ? 0 : ret; - } - diff --git a/target/linux/generic/pending-6.1/130-binfmt_elf-dynamically-allocate-note.data-in-parse_e.patch b/target/linux/generic/pending-6.1/130-binfmt_elf-dynamically-allocate-note.data-in-parse_e.patch deleted file mode 100644 index 8ec51a99779..00000000000 --- a/target/linux/generic/pending-6.1/130-binfmt_elf-dynamically-allocate-note.data-in-parse_e.patch +++ /dev/null @@ -1,94 +0,0 @@ -From ca71e00839fcdd26f122fb6d9e97903c9fe198f7 Mon Sep 17 00:00:00 2001 -From: Christian Marangi -Date: Sat, 6 May 2023 08:08:35 +0200 -Subject: [PATCH] binfmt_elf: dynamically allocate note.data in - parse_elf_properties - -Dynamically allocate note.data in parse_elf_properties to fix -compilation warning on some arch. - -On some arch note.data exceet the stack limit for a single function and -this cause the following compilation warning: -fs/binfmt_elf.c: In function 'parse_elf_properties.isra': -fs/binfmt_elf.c:821:1: error: the frame size of 1040 bytes is larger than 1024 bytes [-Werror=frame-larger-than=] - 821 | } - | ^ -cc1: all warnings being treated as errors - -Fix this by dynamically allocating the array. - -Fixes: 00e19ceec80b ("ELF: Add ELF program property parsing support") -Signed-off-by: Christian Marangi -Cc: stable@vger.kernel.org # v5.8+ ---- - fs/binfmt_elf.c | 32 +++++++++++++++++++++++--------- - 1 file changed, 23 insertions(+), 9 deletions(-) - ---- a/fs/binfmt_elf.c -+++ b/fs/binfmt_elf.c -@@ -769,7 +769,7 @@ static int parse_elf_properties(struct f - { - union { - struct elf_note nhdr; -- char data[NOTE_DATA_SZ]; -+ char *data; - } note; - loff_t pos; - ssize_t n; -@@ -789,26 +789,38 @@ static int parse_elf_properties(struct f - if (phdr->p_filesz > sizeof(note)) - return -ENOEXEC; - -+ note.data = kcalloc(NOTE_DATA_SZ, sizeof(*note.data), GFP_KERNEL); -+ if (!note.data) -+ return -ENOMEM; -+ - pos = phdr->p_offset; - n = kernel_read(f, ¬e, phdr->p_filesz, &pos); - - BUILD_BUG_ON(sizeof(note) < sizeof(note.nhdr) + NOTE_NAME_SZ); -- if (n < 0 || n < sizeof(note.nhdr) + NOTE_NAME_SZ) -- return -EIO; -+ if (n < 0 || n < sizeof(note.nhdr) + NOTE_NAME_SZ) { -+ ret = -EIO; -+ goto exit; -+ } - - if (note.nhdr.n_type != NT_GNU_PROPERTY_TYPE_0 || - note.nhdr.n_namesz != NOTE_NAME_SZ || - strncmp(note.data + sizeof(note.nhdr), -- GNU_PROPERTY_TYPE_0_NAME, n - sizeof(note.nhdr))) -- return -ENOEXEC; -+ GNU_PROPERTY_TYPE_0_NAME, n - sizeof(note.nhdr))) { -+ ret = -ENOEXEC; -+ goto exit; -+ } - - off = round_up(sizeof(note.nhdr) + NOTE_NAME_SZ, - ELF_GNU_PROPERTY_ALIGN); -- if (off > n) -- return -ENOEXEC; -- -- if (note.nhdr.n_descsz > n - off) -- return -ENOEXEC; -+ if (off > n) { -+ ret = -ENOEXEC; -+ goto exit; -+ } -+ -+ if (note.nhdr.n_descsz > n - off) { -+ ret = -ENOEXEC; -+ goto exit; -+ } - datasz = off + note.nhdr.n_descsz; - - have_prev_type = false; -@@ -818,6 +830,8 @@ static int parse_elf_properties(struct f - have_prev_type = true; - } while (!ret); - -+exit: -+ kfree(note.data); - return ret == -ENOENT ? 0 : ret; - } - From 12d6fe2f686635a3fbef02340a713ca1448ce1f1 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Wed, 7 Jun 2023 09:58:22 +0200 Subject: [PATCH 05/23] generic: 5.15: backport PPC VDSO executable stack fix Recent binutils will warn if there is no .note.GNU-stack section and will interpret that as that stack is executable. So, lets modify the upstream 6.1 fix as in 5.15 VDSO32 and VDSO64 are still separate but later they were merged to resolve: /external-toolchain/openwrt-toolchain-mpc85xx-p1020_gcc-12.3.0_musl.Linux-x86_64/toolchain-powerpc_8548_gcc-12.3.0_musl/bin/../lib/gcc/powerpc-openwrt-linux-musl/12.3.0/../../../../powerpc-openwrt-linux-musl/bin/ld: warning: arch/powerpc/kernel/vdso32/getcpu.o: missing .note.GNU-stack section implies executable stack /external-toolchain/openwrt-toolchain-mpc85xx-p1020_gcc-12.3.0_musl.Linux-x86_64/toolchain-powerpc_8548_gcc-12.3.0_musl/bin/../lib/gcc/powerpc-openwrt-linux-musl/12.3.0/../../../../powerpc-openwrt-linux-musl/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker Signed-off-by: Robert Marko --- ...powerpc-vdso-link-with-z-noexecstack.patch | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 target/linux/generic/backport-5.15/360-v6.1-powerpc-vdso-link-with-z-noexecstack.patch diff --git a/target/linux/generic/backport-5.15/360-v6.1-powerpc-vdso-link-with-z-noexecstack.patch b/target/linux/generic/backport-5.15/360-v6.1-powerpc-vdso-link-with-z-noexecstack.patch new file mode 100644 index 00000000000..82e712e20a5 --- /dev/null +++ b/target/linux/generic/backport-5.15/360-v6.1-powerpc-vdso-link-with-z-noexecstack.patch @@ -0,0 +1,49 @@ +From 78391fb5b1b5318900725c72f1db25b2ae92894f Mon Sep 17 00:00:00 2001 +From: Christophe Leroy +Date: Wed, 7 Jun 2023 09:50:52 +0200 +Subject: [PATCH] powerpc/vdso: link with -z noexecstack + +With recent binutils, the following warning appears: + + VDSO32L arch/powerpc/kernel/vdso/vdso32.so.dbg +/opt/gcc-12.2.0-nolibc/powerpc64-linux/bin/../lib/gcc/powerpc64-linux/12.2.0/../../../../powerpc64-linux/bin/ld: warning: arch/powerpc/kernel/vdso/getcpu-32.o: missing .note.GNU-stack section implies executable stack +/opt/gcc-12.2.0-nolibc/powerpc64-linux/bin/../lib/gcc/powerpc64-linux/12.2.0/../../../../powerpc64-linux/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker + +To avoid that, explicitly tell the linker we don't want executable +stack. + +For more explanations, see commit ffcf9c5700e4 ("x86: link vdso +and boot with -z noexecstack --no-warn-rwx-segments") + +Commit was adapted for 5.15 as VDSO32 and VDSO64 were merged later so it +does not directly apply. + +Signed-off-by: Christophe Leroy +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/b95f2e3216a574837dd61208444e9515c3423da4.1662132312.git.christophe.leroy@csgroup.eu +Signed-off-by: Robert Marko +[Adapt to 5.15 as it has VDSO split for 32 and 64bit] +--- + arch/powerpc/kernel/vdso32/Makefile | 2 +- + arch/powerpc/kernel/vdso64/Makefile | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +--- a/arch/powerpc/kernel/vdso32/Makefile ++++ b/arch/powerpc/kernel/vdso32/Makefile +@@ -66,7 +66,7 @@ include/generated/vdso32-offsets.h: $(ob + + # actual build commands + quiet_cmd_vdso32ld_and_check = VDSO32L $@ +- cmd_vdso32ld_and_check = $(VDSOCC) $(c_flags) $(CC32FLAGS) -o $@ -Wl,-T$(filter %.lds,$^) $(filter %.o,$^) ; $(cmd_vdso_check) ++ cmd_vdso32ld_and_check = $(VDSOCC) $(c_flags) $(CC32FLAGS) -o $@ -Wl,-T$(filter %.lds,$^) $(filter %.o,$^) -z noexecstack ; $(cmd_vdso_check) + quiet_cmd_vdso32as = VDSO32A $@ + cmd_vdso32as = $(VDSOCC) $(a_flags) $(CC32FLAGS) -c -o $@ $< + quiet_cmd_vdso32cc = VDSO32C $@ +--- a/arch/powerpc/kernel/vdso64/Makefile ++++ b/arch/powerpc/kernel/vdso64/Makefile +@@ -53,4 +53,4 @@ include/generated/vdso64-offsets.h: $(ob + + # actual build commands + quiet_cmd_vdso64ld_and_check = VDSO64L $@ +- cmd_vdso64ld_and_check = $(CC) $(c_flags) -o $@ -Wl,-T$(filter %.lds,$^) $(filter %.o,$^); $(cmd_vdso_check) ++ cmd_vdso64ld_and_check = $(CC) $(c_flags) -o $@ -Wl,-T$(filter %.lds,$^) $(filter %.o,$^) -z noexecstack ; $(cmd_vdso_check) From 5af25331a354c5c5811cfa9c14bacc44b30abaa4 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Thu, 8 Jun 2023 18:03:05 +0200 Subject: [PATCH 06/23] generic: 6.1: move Qualcomm SoC ID bindings to generic Move the Qualcomm SoC ID bindings that are used by the CPUFreq NVMEM driver that was recently backported to generic from ipq807x as that series depends on SoC ID bindings but they were forgotten. Due to that IPQ806x builds would fail as the backport was still in ipq807x. Fixes: d44279 ("generic: 6.1: backport Qualcomm CPUFreq NVMEM changes") Signed-off-by: Robert Marko --- ....2-dt-bindings-arm-qcom-document-qcom-msm-id-and-qcom-b.patch} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename target/linux/{ipq807x/patches-6.1/0018-v6.2-dt-bindings-arm-qcom-document-qcom-msm-id-and-qcom-b.patch => generic/backport-6.1/830-00-v6.2-dt-bindings-arm-qcom-document-qcom-msm-id-and-qcom-b.patch} (100%) diff --git a/target/linux/ipq807x/patches-6.1/0018-v6.2-dt-bindings-arm-qcom-document-qcom-msm-id-and-qcom-b.patch b/target/linux/generic/backport-6.1/830-00-v6.2-dt-bindings-arm-qcom-document-qcom-msm-id-and-qcom-b.patch similarity index 100% rename from target/linux/ipq807x/patches-6.1/0018-v6.2-dt-bindings-arm-qcom-document-qcom-msm-id-and-qcom-b.patch rename to target/linux/generic/backport-6.1/830-00-v6.2-dt-bindings-arm-qcom-document-qcom-msm-id-and-qcom-b.patch From c4752e0a132732a979c3eda34a3d4275487e8ddf Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Wed, 7 Jun 2023 20:49:47 +0200 Subject: [PATCH 07/23] ipq807x: add critical thermal trips to all thermal zones Kernel 6.1 has started actually enforcing the bindings requirment that thermal zones must have associated trips described as well, otherwise they will fail during probing with: [ 0.865494] thermal_sys: Failed to find 'trips' node [ 0.867254] thermal_sys: Failed to find trip points for thermal-sensor id=4 [ 0.872271] thermal_sys: Failed to find 'trips' node [ 0.878898] thermal_sys: Failed to find trip points for thermal-sensor id=5 [ 0.884222] thermal_sys: Failed to find 'trips' node [ 0.890775] thermal_sys: Failed to find trip points for thermal-sensor id=6 [ 0.896073] thermal_sys: Failed to find 'trips' node [ 0.902668] thermal_sys: Failed to find trip points for thermal-sensor id=7 [ 0.907964] thermal_sys: Failed to find 'trips' node [ 0.914569] thermal_sys: Failed to find trip points for thermal-sensor id=8 [ 0.921203] thermal_sys: Failed to find 'trips' node [ 0.926469] thermal_sys: Failed to find trip points for thermal-sensor id=14 [ 0.931759] thermal_sys: Failed to find 'trips' node [ 0.938703] thermal_sys: Failed to find trip points for thermal-sensor id=15 So, since CPUFreq support isnt yet upstream we can start by adding critical trips to all of the thermal zones to protect the devices against severely overheating. Qualcomm has set the overheat trip at 120 C but lets be conservative and set it at 110 C. This patch has been sent upstream as well. Signed-off-by: Robert Marko --- ...m-ipq8074-add-critical-thermal-trips.patch | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 target/linux/ipq807x/patches-6.1/0134-arm64-dts-qcom-ipq8074-add-critical-thermal-trips.patch diff --git a/target/linux/ipq807x/patches-6.1/0134-arm64-dts-qcom-ipq8074-add-critical-thermal-trips.patch b/target/linux/ipq807x/patches-6.1/0134-arm64-dts-qcom-ipq8074-add-critical-thermal-trips.patch new file mode 100644 index 00000000000..6231d8afb72 --- /dev/null +++ b/target/linux/ipq807x/patches-6.1/0134-arm64-dts-qcom-ipq8074-add-critical-thermal-trips.patch @@ -0,0 +1,197 @@ +From 145bbf2b88990ef3ff00ee541bb7662008683c16 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Wed, 7 Jun 2023 20:26:26 +0200 +Subject: [PATCH] arm64: dts: qcom: ipq8074: add critical thermal trips + +According to bindings, thermal zones must have associated trips as well. +Since we currently dont have CPUFreq support and thus no passive cooling +lets start by defining critical trips to protect the devices against +severe overheating. + +Signed-off-by: Robert Marko +--- + arch/arm64/boot/dts/qcom/ipq8074.dtsi | 96 +++++++++++++++++++++++++++ + 1 file changed, 96 insertions(+) + +--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +@@ -1293,6 +1293,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 4>; ++ ++ trips { ++ nss-top-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + nss0-thermal { +@@ -1300,6 +1308,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 5>; ++ ++ trips { ++ nss-0-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + nss1-thermal { +@@ -1307,6 +1323,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 6>; ++ ++ trips { ++ nss-1-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + wcss-phya0-thermal { +@@ -1314,6 +1338,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 7>; ++ ++ trips { ++ wcss-phya0-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + wcss-phya1-thermal { +@@ -1321,6 +1353,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 8>; ++ ++ trips { ++ wcss-phya1-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + cpu0_thermal: cpu0-thermal { +@@ -1328,6 +1368,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 9>; ++ ++ trips { ++ cpu0-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + cpu1_thermal: cpu1-thermal { +@@ -1335,6 +1383,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 10>; ++ ++ trips { ++ cpu1-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + cpu2_thermal: cpu2-thermal { +@@ -1342,6 +1398,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 11>; ++ ++ trips { ++ cpu2-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + cpu3_thermal: cpu3-thermal { +@@ -1349,6 +1413,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 12>; ++ ++ trips { ++ cpu3-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + cluster_thermal: cluster-thermal { +@@ -1356,6 +1428,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 13>; ++ ++ trips { ++ cluster-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + wcss-phyb0-thermal { +@@ -1363,6 +1443,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 14>; ++ ++ trips { ++ wcss-phyb0-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + + wcss-phyb1-thermal { +@@ -1370,6 +1458,14 @@ + polling-delay = <1000>; + + thermal-sensors = <&tsens 15>; ++ ++ trips { ++ wcss-phyb1-crit { ++ temperature = <110000>; ++ hysteresis = <1000>; ++ type = "critical"; ++ }; ++ }; + }; + }; + }; From 75bf5b41a156badd0918d2b284d043d1c939f9bf Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Wed, 7 Jun 2023 20:53:31 +0200 Subject: [PATCH 08/23] ipq807x: remove critical trips from AC/HK DTSI Now that critical trips are defined for all thermal zones in the SOC DTSI there is no need to duplicate them in AC and HK DTSI. Signed-off-by: Robert Marko --- .../arm64/boot/dts/qcom/ipq8074-ac-cpu.dtsi | 30 ------------------- .../arm64/boot/dts/qcom/ipq8074-hk-cpu.dtsi | 30 ------------------- 2 files changed, 60 deletions(-) diff --git a/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8074-ac-cpu.dtsi b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8074-ac-cpu.dtsi index dbc9baa2b94..057d5920311 100644 --- a/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8074-ac-cpu.dtsi +++ b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8074-ac-cpu.dtsi @@ -29,12 +29,6 @@ hysteresis = <2000>; type = "passive"; }; - - cpu0_crit: cpu_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { @@ -55,12 +49,6 @@ hysteresis = <2000>; type = "passive"; }; - - cpu1_crit: cpu_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { @@ -81,12 +69,6 @@ hysteresis = <2000>; type = "passive"; }; - - cpu2_crit: cpu_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { @@ -107,12 +89,6 @@ hysteresis = <2000>; type = "passive"; }; - - cpu3_crit: cpu_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { @@ -133,12 +109,6 @@ hysteresis = <2000>; type = "passive"; }; - - cluster_crit: cluster_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { diff --git a/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8074-hk-cpu.dtsi b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8074-hk-cpu.dtsi index 8485814969c..37af7bbc1f7 100644 --- a/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8074-hk-cpu.dtsi +++ b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8074-hk-cpu.dtsi @@ -35,12 +35,6 @@ hysteresis = <2000>; type = "passive"; }; - - cpu0_crit: cpu_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { @@ -74,12 +68,6 @@ hysteresis = <2000>; type = "passive"; }; - - cpu1_crit: cpu_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { @@ -113,12 +101,6 @@ hysteresis = <2000>; type = "passive"; }; - - cpu2_crit: cpu_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { @@ -152,12 +134,6 @@ hysteresis = <2000>; type = "passive"; }; - - cpu3_crit: cpu_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { @@ -191,12 +167,6 @@ hysteresis = <2000>; type = "passive"; }; - - cluster_crit: cluster_crit { - temperature = <110000>; - hysteresis = <1000>; - type = "critical"; - }; }; cooling-maps { From 6348850f10545aac70db94d3a9555a4f2eb84281 Mon Sep 17 00:00:00 2001 From: Ivan Pavlov Date: Sun, 4 Jun 2023 22:34:39 +0300 Subject: [PATCH 09/23] openssl: update to 3.0.9 CVE-2023-2650 fix Remove upstreamed patches Major changes between OpenSSL 3.0.8 and OpenSSL 3.0.9 [30 May 2023] * Mitigate for very slow OBJ_obj2txt() performance with gigantic OBJECT IDENTIFIER sub-identities. (CVE-2023-2650) * Fixed buffer overread in AES-XTS decryption on ARM 64 bit platforms (CVE-2023-1255) * Fixed documentation of X509_VERIFY_PARAM_add0_policy() (CVE-2023-0466) * Fixed handling of invalid certificate policies in leaf certificates (CVE-2023-0465) * Limited the number of nodes created in a policy tree (CVE-2023-0464) Signed-off-by: Ivan Pavlov --- package/libs/openssl/Makefile | 6 +- .../120-strip-cflags-from-binary.patch | 2 +- ...esource-use-verifying-policy-constra.patch | 207 ------------------ ...AG_INVALID_POLICY-is-checked-even-in.patch | 44 ---- ...oid-buffer-overrread-in-AES-XTS-decr.patch | 39 ---- 5 files changed, 4 insertions(+), 294 deletions(-) delete mode 100644 package/libs/openssl/patches/200-x509-excessive-resource-use-verifying-policy-constra.patch delete mode 100644 package/libs/openssl/patches/210-Ensure-that-EXFLAG_INVALID_POLICY-is-checked-even-in.patch delete mode 100644 package/libs/openssl/patches/220-aesv8-armx.pl-Avoid-buffer-overrread-in-AES-XTS-decr.patch diff --git a/package/libs/openssl/Makefile b/package/libs/openssl/Makefile index 66ababab3c7..a34a7849733 100644 --- a/package/libs/openssl/Makefile +++ b/package/libs/openssl/Makefile @@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=openssl -PKG_VERSION:=3.0.8 -PKG_RELEASE:=10 +PKG_VERSION:=3.0.9 +PKG_RELEASE:=1 PKG_BUILD_FLAGS:=no-mips16 gc-sections PKG_BUILD_PARALLEL:=1 @@ -24,7 +24,7 @@ PKG_SOURCE_URL:= \ ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/ \ ftp://ftp.pca.dfn.de/pub/tools/net/openssl/source/old/$(PKG_BASE)/ -PKG_HASH:=6c13d2bf38fdf31eac3ce2a347073673f5d63263398f1f69d0df4a41253e4b3e +PKG_HASH:=eb1ab04781474360f77c318ab89d8c5a03abc38e63d65a603cabbf1b00a1dc90 PKG_LICENSE:=Apache-2.0 PKG_LICENSE_FILES:=LICENSE diff --git a/package/libs/openssl/patches/120-strip-cflags-from-binary.patch b/package/libs/openssl/patches/120-strip-cflags-from-binary.patch index e9f4fc131aa..c4f2540395b 100644 --- a/package/libs/openssl/patches/120-strip-cflags-from-binary.patch +++ b/package/libs/openssl/patches/120-strip-cflags-from-binary.patch @@ -10,7 +10,7 @@ Signed-off-by: Eneas U de Queiroz --- a/crypto/build.info +++ b/crypto/build.info -@@ -113,7 +113,7 @@ DEFINE[../libcrypto]=$UPLINKDEF +@@ -111,7 +111,7 @@ DEFINE[../libcrypto]=$UPLINKDEF DEPEND[info.o]=buildinf.h DEPEND[cversion.o]=buildinf.h diff --git a/package/libs/openssl/patches/200-x509-excessive-resource-use-verifying-policy-constra.patch b/package/libs/openssl/patches/200-x509-excessive-resource-use-verifying-policy-constra.patch deleted file mode 100644 index 927634c0a74..00000000000 --- a/package/libs/openssl/patches/200-x509-excessive-resource-use-verifying-policy-constra.patch +++ /dev/null @@ -1,207 +0,0 @@ -From 959c59c7a0164117e7f8366466a32bb1f8d77ff1 Mon Sep 17 00:00:00 2001 -From: Pauli -Date: Wed, 8 Mar 2023 15:28:20 +1100 -Subject: [PATCH] x509: excessive resource use verifying policy constraints - -A security vulnerability has been identified in all supported versions -of OpenSSL related to the verification of X.509 certificate chains -that include policy constraints. Attackers may be able to exploit this -vulnerability by creating a malicious certificate chain that triggers -exponential use of computational resources, leading to a denial-of-service -(DoS) attack on affected systems. - -Fixes CVE-2023-0464 - -Reviewed-by: Tomas Mraz -Reviewed-by: Shane Lontis -(Merged from https://github.com/openssl/openssl/pull/20568) - ---- a/crypto/x509/pcy_local.h -+++ b/crypto/x509/pcy_local.h -@@ -111,6 +111,11 @@ struct X509_POLICY_LEVEL_st { - }; - - struct X509_POLICY_TREE_st { -+ /* The number of nodes in the tree */ -+ size_t node_count; -+ /* The maximum number of nodes in the tree */ -+ size_t node_maximum; -+ - /* This is the tree 'level' data */ - X509_POLICY_LEVEL *levels; - int nlevel; -@@ -157,7 +162,8 @@ X509_POLICY_NODE *ossl_policy_tree_find_ - X509_POLICY_NODE *ossl_policy_level_add_node(X509_POLICY_LEVEL *level, - X509_POLICY_DATA *data, - X509_POLICY_NODE *parent, -- X509_POLICY_TREE *tree); -+ X509_POLICY_TREE *tree, -+ int extra_data); - void ossl_policy_node_free(X509_POLICY_NODE *node); - int ossl_policy_node_match(const X509_POLICY_LEVEL *lvl, - const X509_POLICY_NODE *node, const ASN1_OBJECT *oid); ---- a/crypto/x509/pcy_node.c -+++ b/crypto/x509/pcy_node.c -@@ -59,10 +59,15 @@ X509_POLICY_NODE *ossl_policy_level_find - X509_POLICY_NODE *ossl_policy_level_add_node(X509_POLICY_LEVEL *level, - X509_POLICY_DATA *data, - X509_POLICY_NODE *parent, -- X509_POLICY_TREE *tree) -+ X509_POLICY_TREE *tree, -+ int extra_data) - { - X509_POLICY_NODE *node; - -+ /* Verify that the tree isn't too large. This mitigates CVE-2023-0464 */ -+ if (tree->node_maximum > 0 && tree->node_count >= tree->node_maximum) -+ return NULL; -+ - node = OPENSSL_zalloc(sizeof(*node)); - if (node == NULL) { - ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE); -@@ -70,7 +75,7 @@ X509_POLICY_NODE *ossl_policy_level_add_ - } - node->data = data; - node->parent = parent; -- if (level) { -+ if (level != NULL) { - if (OBJ_obj2nid(data->valid_policy) == NID_any_policy) { - if (level->anyPolicy) - goto node_error; -@@ -90,7 +95,7 @@ X509_POLICY_NODE *ossl_policy_level_add_ - } - } - -- if (tree) { -+ if (extra_data) { - if (tree->extra_data == NULL) - tree->extra_data = sk_X509_POLICY_DATA_new_null(); - if (tree->extra_data == NULL){ -@@ -103,6 +108,7 @@ X509_POLICY_NODE *ossl_policy_level_add_ - } - } - -+ tree->node_count++; - if (parent) - parent->nchild++; - ---- a/crypto/x509/pcy_tree.c -+++ b/crypto/x509/pcy_tree.c -@@ -14,6 +14,17 @@ - - #include "pcy_local.h" - -+/* -+ * If the maximum number of nodes in the policy tree isn't defined, set it to -+ * a generous default of 1000 nodes. -+ * -+ * Defining this to be zero means unlimited policy tree growth which opens the -+ * door on CVE-2023-0464. -+ */ -+#ifndef OPENSSL_POLICY_TREE_NODES_MAX -+# define OPENSSL_POLICY_TREE_NODES_MAX 1000 -+#endif -+ - static void expected_print(BIO *channel, - X509_POLICY_LEVEL *lev, X509_POLICY_NODE *node, - int indent) -@@ -163,6 +174,9 @@ static int tree_init(X509_POLICY_TREE ** - return X509_PCY_TREE_INTERNAL; - } - -+ /* Limit the growth of the tree to mitigate CVE-2023-0464 */ -+ tree->node_maximum = OPENSSL_POLICY_TREE_NODES_MAX; -+ - /* - * http://tools.ietf.org/html/rfc5280#section-6.1.2, figure 3. - * -@@ -180,7 +194,7 @@ static int tree_init(X509_POLICY_TREE ** - if ((data = ossl_policy_data_new(NULL, - OBJ_nid2obj(NID_any_policy), 0)) == NULL) - goto bad_tree; -- if (ossl_policy_level_add_node(level, data, NULL, tree) == NULL) { -+ if (ossl_policy_level_add_node(level, data, NULL, tree, 1) == NULL) { - ossl_policy_data_free(data); - goto bad_tree; - } -@@ -239,7 +253,8 @@ static int tree_init(X509_POLICY_TREE ** - * Return value: 1 on success, 0 otherwise - */ - static int tree_link_matching_nodes(X509_POLICY_LEVEL *curr, -- X509_POLICY_DATA *data) -+ X509_POLICY_DATA *data, -+ X509_POLICY_TREE *tree) - { - X509_POLICY_LEVEL *last = curr - 1; - int i, matched = 0; -@@ -249,13 +264,13 @@ static int tree_link_matching_nodes(X509 - X509_POLICY_NODE *node = sk_X509_POLICY_NODE_value(last->nodes, i); - - if (ossl_policy_node_match(last, node, data->valid_policy)) { -- if (ossl_policy_level_add_node(curr, data, node, NULL) == NULL) -+ if (ossl_policy_level_add_node(curr, data, node, tree, 0) == NULL) - return 0; - matched = 1; - } - } - if (!matched && last->anyPolicy) { -- if (ossl_policy_level_add_node(curr, data, last->anyPolicy, NULL) == NULL) -+ if (ossl_policy_level_add_node(curr, data, last->anyPolicy, tree, 0) == NULL) - return 0; - } - return 1; -@@ -268,7 +283,8 @@ static int tree_link_matching_nodes(X509 - * Return value: 1 on success, 0 otherwise. - */ - static int tree_link_nodes(X509_POLICY_LEVEL *curr, -- const X509_POLICY_CACHE *cache) -+ const X509_POLICY_CACHE *cache, -+ X509_POLICY_TREE *tree) - { - int i; - -@@ -276,7 +292,7 @@ static int tree_link_nodes(X509_POLICY_L - X509_POLICY_DATA *data = sk_X509_POLICY_DATA_value(cache->data, i); - - /* Look for matching nodes in previous level */ -- if (!tree_link_matching_nodes(curr, data)) -+ if (!tree_link_matching_nodes(curr, data, tree)) - return 0; - } - return 1; -@@ -307,7 +323,7 @@ static int tree_add_unmatched(X509_POLIC - /* Curr may not have anyPolicy */ - data->qualifier_set = cache->anyPolicy->qualifier_set; - data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS; -- if (ossl_policy_level_add_node(curr, data, node, tree) == NULL) { -+ if (ossl_policy_level_add_node(curr, data, node, tree, 1) == NULL) { - ossl_policy_data_free(data); - return 0; - } -@@ -370,7 +386,7 @@ static int tree_link_any(X509_POLICY_LEV - /* Finally add link to anyPolicy */ - if (last->anyPolicy && - ossl_policy_level_add_node(curr, cache->anyPolicy, -- last->anyPolicy, NULL) == NULL) -+ last->anyPolicy, tree, 0) == NULL) - return 0; - return 1; - } -@@ -553,7 +569,7 @@ static int tree_calculate_user_set(X509_ - extra->flags = POLICY_DATA_FLAG_SHARED_QUALIFIERS - | POLICY_DATA_FLAG_EXTRA_NODE; - node = ossl_policy_level_add_node(NULL, extra, anyPolicy->parent, -- tree); -+ tree, 1); - } - if (!tree->user_policies) { - tree->user_policies = sk_X509_POLICY_NODE_new_null(); -@@ -580,7 +596,7 @@ static int tree_evaluate(X509_POLICY_TRE - - for (i = 1; i < tree->nlevel; i++, curr++) { - cache = ossl_policy_cache_set(curr->cert); -- if (!tree_link_nodes(curr, cache)) -+ if (!tree_link_nodes(curr, cache, tree)) - return X509_PCY_TREE_INTERNAL; - - if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY) diff --git a/package/libs/openssl/patches/210-Ensure-that-EXFLAG_INVALID_POLICY-is-checked-even-in.patch b/package/libs/openssl/patches/210-Ensure-that-EXFLAG_INVALID_POLICY-is-checked-even-in.patch deleted file mode 100644 index 01819c15a8b..00000000000 --- a/package/libs/openssl/patches/210-Ensure-that-EXFLAG_INVALID_POLICY-is-checked-even-in.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 1dd43e0709fece299b15208f36cc7c76209ba0bb Mon Sep 17 00:00:00 2001 -From: Matt Caswell -Date: Tue, 7 Mar 2023 16:52:55 +0000 -Subject: [PATCH] Ensure that EXFLAG_INVALID_POLICY is checked even in leaf - certs - -Even though we check the leaf cert to confirm it is valid, we -later ignored the invalid flag and did not notice that the leaf -cert was bad. - -Fixes: CVE-2023-0465 - -Reviewed-by: Hugo Landau -Reviewed-by: Tomas Mraz -(Merged from https://github.com/openssl/openssl/pull/20587) - ---- a/crypto/x509/x509_vfy.c -+++ b/crypto/x509/x509_vfy.c -@@ -1654,15 +1654,23 @@ static int check_policy(X509_STORE_CTX * - goto memerr; - /* Invalid or inconsistent extensions */ - if (ret == X509_PCY_TREE_INVALID) { -- int i; -+ int i, cbcalled = 0; - - /* Locate certificates with bad extensions and notify callback. */ -- for (i = 1; i < sk_X509_num(ctx->chain); i++) { -+ for (i = 0; i < sk_X509_num(ctx->chain); i++) { - X509 *x = sk_X509_value(ctx->chain, i); - -+ if ((x->ex_flags & EXFLAG_INVALID_POLICY) != 0) -+ cbcalled = 1; - CB_FAIL_IF((x->ex_flags & EXFLAG_INVALID_POLICY) != 0, - ctx, x, i, X509_V_ERR_INVALID_POLICY_EXTENSION); - } -+ if (!cbcalled) { -+ /* Should not be able to get here */ -+ ERR_raise(ERR_LIB_X509, ERR_R_INTERNAL_ERROR); -+ return 0; -+ } -+ /* The callback ignored the error so we return success */ - return 1; - } - if (ret == X509_PCY_TREE_FAILURE) { diff --git a/package/libs/openssl/patches/220-aesv8-armx.pl-Avoid-buffer-overrread-in-AES-XTS-decr.patch b/package/libs/openssl/patches/220-aesv8-armx.pl-Avoid-buffer-overrread-in-AES-XTS-decr.patch deleted file mode 100644 index d6a45aec21e..00000000000 --- a/package/libs/openssl/patches/220-aesv8-armx.pl-Avoid-buffer-overrread-in-AES-XTS-decr.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 02ac9c9420275868472f33b01def01218742b8bb Mon Sep 17 00:00:00 2001 -From: Tomas Mraz -Date: Mon, 17 Apr 2023 16:51:20 +0200 -Subject: [PATCH] aesv8-armx.pl: Avoid buffer overrread in AES-XTS decryption - -Original author: Nevine Ebeid (Amazon) -Fixes: CVE-2023-1255 - -The buffer overread happens on decrypts of 4 mod 5 sizes. -Unless the memory just after the buffer is unmapped this is harmless. - -Reviewed-by: Paul Dale -Reviewed-by: Tom Cosgrove -(Merged from https://github.com/openssl/openssl/pull/20759) - -(cherry picked from commit 72dfe46550ee1f1bbfacd49f071419365bc23304) - -diff --git a/crypto/aes/asm/aesv8-armx.pl b/crypto/aes/asm/aesv8-armx.pl -index 6a7bf05d1b..bd583e2c89 100755 ---- a/crypto/aes/asm/aesv8-armx.pl -+++ b/crypto/aes/asm/aesv8-armx.pl -@@ -3353,7 +3353,7 @@ $code.=<<___ if ($flavour =~ /64/); - .align 4 - .Lxts_dec_tail4x: - add $inp,$inp,#16 -- vld1.32 {$dat0},[$inp],#16 -+ tst $tailcnt,#0xf - veor $tmp1,$dat1,$tmp0 - vst1.8 {$tmp1},[$out],#16 - veor $tmp2,$dat2,$tmp2 -@@ -3362,6 +3362,8 @@ $code.=<<___ if ($flavour =~ /64/); - veor $tmp4,$dat4,$tmp4 - vst1.8 {$tmp3-$tmp4},[$out],#32 - -+ b.eq .Lxts_dec_abort -+ vld1.32 {$dat0},[$inp],#16 - b .Lxts_done - .align 4 - .Lxts_outer_dec_tail: From a125ef7c1842ead51d51e09b590782363a7fc4d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 8 Jun 2023 19:46:37 +0200 Subject: [PATCH 10/23] kernel: 6.1: add missing Kconfig symbols MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add missing symbol found during refreshing bcm27xx Kconfigs. Signed-off-by: Álvaro Fernández Rojas --- target/linux/generic/config-6.1 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/target/linux/generic/config-6.1 b/target/linux/generic/config-6.1 index d36fe5e8936..b0a9277513b 100644 --- a/target/linux/generic/config-6.1 +++ b/target/linux/generic/config-6.1 @@ -214,6 +214,7 @@ CONFIG_ANON_INODES=y # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BCM2835 is not set # CONFIG_ARCH_BCM4908 is not set +# CONFIG_ARCH_BCMBCA is not set # CONFIG_ARCH_BCM_21664 is not set # CONFIG_ARCH_BCM_23550 is not set # CONFIG_ARCH_BCM_281XX is not set @@ -221,6 +222,7 @@ CONFIG_ANON_INODES=y # CONFIG_ARCH_BCM_53573 is not set # CONFIG_ARCH_BCM_63XX is not set # CONFIG_ARCH_BCM_CYGNUS is not set +# CONFIG_ARCH_BCM_HR2 is not set # CONFIG_ARCH_BCM_IPROC is not set # CONFIG_ARCH_BCM_NSP is not set # CONFIG_ARCH_BERLIN is not set @@ -759,6 +761,7 @@ CONFIG_BOOKE_WDT_DEFAULT_TIMEOUT=3 # CONFIG_BOOT_PRINTK_DELAY is not set CONFIG_BOOT_RAW=y # CONFIG_BOSCH_BNO055_I2C is not set +# CONFIG_BOSCH_BNO055_SERIAL is not set # CONFIG_BOUNCE is not set CONFIG_BPF=y # CONFIG_BPFILTER is not set @@ -1631,9 +1634,11 @@ CONFIG_DQL=y # 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_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_EBBG_FT8719 is not set # CONFIG_DRM_PANEL_EDP is not set # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set @@ -1645,6 +1650,7 @@ CONFIG_DQL=y # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA 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 @@ -1657,6 +1663,8 @@ CONFIG_DQL=y # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set # 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_NT36672A is not set # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set @@ -1683,12 +1691,14 @@ CONFIG_DQL=y # 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_SIMPLE is not set # CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set # CONFIG_DRM_PANEL_SONY_ACX424AKP is not set # CONFIG_DRM_PANEL_SONY_ACX565AKM is not set +# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 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 @@ -1696,6 +1706,7 @@ CONFIG_DQL=y # CONFIG_DRM_PANEL_TPO_Y17P is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set +# CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN is not set # CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # CONFIG_DRM_PANFROST is not set @@ -3235,6 +3246,7 @@ CONFIG_LEDS_CLASS_MULTICOLOR=y # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_PWM is not set +# CONFIG_LEDS_PWM_MULTICOLOR is not set # CONFIG_LEDS_REGULATOR is not set # CONFIG_LEDS_SPI_BYTE is not set # CONFIG_LEDS_SYSCON is not set @@ -5014,6 +5026,7 @@ CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 # CONFIG_PVPANIC is not set # CONFIG_PWM is not set # CONFIG_PWM_ATMEL_TCB is not set +# CONFIG_PWM_CLK is not set # CONFIG_PWM_DEBUG is not set # CONFIG_PWM_DWC is not set # CONFIG_PWM_FSL_FTM is not set @@ -5022,6 +5035,7 @@ CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 # CONFIG_PWM_MEDIATEK is not set # CONFIG_PWM_PCA9685 is not set # CONFIG_PWM_RASPBERRYPI_POE is not set +# CONFIG_PWM_XILINX is not set CONFIG_PWRSEQ_EMMC=y # CONFIG_PWRSEQ_SD8787 is not set CONFIG_PWRSEQ_SIMPLE=y From 8ded159ee4d93a03e39ef0cba5f0a738b0f805ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 8 Jun 2023 19:48:19 +0200 Subject: [PATCH 11/23] bcm27xx: 6.1: copy config from 5.15 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Copy config from 5.15 kernel version. Signed-off-by: Álvaro Fernández Rojas --- target/linux/bcm27xx/bcm2708/config-6.1 | 367 +++++++++++++++++++ target/linux/bcm27xx/bcm2709/config-6.1 | 464 ++++++++++++++++++++++++ target/linux/bcm27xx/bcm2710/config-6.1 | 450 +++++++++++++++++++++++ target/linux/bcm27xx/bcm2711/config-6.1 | 462 +++++++++++++++++++++++ 4 files changed, 1743 insertions(+) create mode 100644 target/linux/bcm27xx/bcm2708/config-6.1 create mode 100644 target/linux/bcm27xx/bcm2709/config-6.1 create mode 100644 target/linux/bcm27xx/bcm2710/config-6.1 create mode 100644 target/linux/bcm27xx/bcm2711/config-6.1 diff --git a/target/linux/bcm27xx/bcm2708/config-6.1 b/target/linux/bcm27xx/bcm2708/config-6.1 new file mode 100644 index 00000000000..e5dd414c6c3 --- /dev/null +++ b/target/linux/bcm27xx/bcm2708/config-6.1 @@ -0,0 +1,367 @@ +# CONFIG_AIO is not set +CONFIG_ALIGNMENT_TRAP=y +CONFIG_ARCH_32BIT_OFF_T=y +CONFIG_ARCH_BCM=y +CONFIG_ARCH_BCM2835=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +CONFIG_ARCH_MULTIPLATFORM=y +CONFIG_ARCH_MULTI_V6=y +CONFIG_ARCH_MULTI_V6_V7=y +CONFIG_ARCH_NR_GPIO=0 +CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARM=y +CONFIG_ARM_AMBA=y +CONFIG_ARM_CPU_SUSPEND=y +CONFIG_ARM_CRYPTO=y +CONFIG_ARM_ERRATA_411920=y +CONFIG_ARM_HAS_SG_CHAIN=y +CONFIG_ARM_L1_CACHE_SHIFT=5 +# CONFIG_ARM_MHU_V2 is not set +CONFIG_ARM_PATCH_PHYS_VIRT=y +CONFIG_ARM_RASPBERRYPI_CPUFREQ=y +CONFIG_ARM_THUMB=y +CONFIG_ARM_TIMER_SP804=y +CONFIG_ARM_UNWIND=y +CONFIG_AUTO_ZRELADDR=y +CONFIG_BCM2708_VCMEM=y +# CONFIG_BCM2711_THERMAL is not set +CONFIG_BCM2835_DEVGPIOMEM=y +CONFIG_BCM2835_FAST_MEMCPY=y +CONFIG_BCM2835_MBOX=y +CONFIG_BCM2835_POWER=y +# CONFIG_BCM2835_SMI is not set +CONFIG_BCM2835_THERMAL=y +CONFIG_BCM2835_TIMER=y +CONFIG_BCM2835_VCHIQ=y +# CONFIG_BCM2835_VCHIQ_MMAL is not set +CONFIG_BCM2835_WDT=y +CONFIG_BCM_VCIO=y +# CONFIG_BCM_VC_SM_CMA is not set +CONFIG_BCM_VIDEOCORE=y +CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_PM=y +CONFIG_BRCMSTB_L2_IRQ=y +CONFIG_BRCM_CHAR_DRIVERS=y +# CONFIG_CACHE_L2X0 is not set +CONFIG_CLKSRC_MMIO=y +CONFIG_CLK_BCM2711_DVP=y +CONFIG_CLK_BCM2835=y +CONFIG_CLK_RASPBERRYPI=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_CMA=y +CONFIG_CMA_ALIGNMENT=8 +CONFIG_CMA_AREAS=7 +# CONFIG_CMA_DEBUG is not set +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_SIZE_MBYTES=5 +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SYSFS is not set +CONFIG_COMMON_CLK=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_CONFIGFS_FS=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_CONTIG_ALLOC=y +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_CPU_32v6=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_ABRT_EV6=y +CONFIG_CPU_CACHE_V6=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_HAS_ASID=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_PABRT_V6=y +CONFIG_CPU_PM=y +CONFIG_CPU_THUMB_CAPABLE=y +CONFIG_CPU_TLB_V6=y +CONFIG_CPU_V6K=y +CONFIG_CRC16=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_RNG2=y +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_CMA=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +CONFIG_DMADEVICES=y +CONFIG_DMA_BCM2708=y +CONFIG_DMA_BCM2835=y +CONFIG_DMA_CMA=y +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +CONFIG_DMA_OPS=y +CONFIG_DMA_REMAP=y +CONFIG_DMA_SHARED_BUFFER=y +CONFIG_DMA_VIRTUAL_CHANNELS=y +CONFIG_DNOTIFY=y +CONFIG_DTC=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_EXTCON=y +CONFIG_F2FS_FS=y +CONFIG_FB=y +CONFIG_FB_BCM2708=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_CMDLINE=y +# CONFIG_FB_RPISENSE is not set +CONFIG_FB_SIMPLE=y +CONFIG_FIQ=y +CONFIG_FIXED_PHY=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_FONT_8x16=y +CONFIG_FONT_8x8=y +CONFIG_FONT_SUPPORT=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FREEZER=y +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FS_POSIX_ACL=y +CONFIG_FWNODE_MDIO=y +CONFIG_FW_CACHE=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_MULTI_HANDLER=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PINCONF=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GPIOLIB_IRQCHIP=y +# CONFIG_GPIO_BCM_VIRT is not set +CONFIG_GPIO_CDEV=y +# CONFIG_GPIO_FSM is not set +CONFIG_GPIO_RASPBERRYPI_EXP=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HW_CONSOLE=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_BCM2835=y +CONFIG_HZ_FIXED=0 +CONFIG_I2C=y +# CONFIG_I2C_BCM2708 is not set +CONFIG_I2C_BOARDINFO=y +CONFIG_INPUT=y +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_WORK=y +CONFIG_JBD2=y +CONFIG_KERNEL_GZIP=y +# CONFIG_KERNEL_XZ is not set +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +CONFIG_LEDS_TRIGGER_ACTPWR=y +CONFIG_LEDS_TRIGGER_INPUT=y +CONFIG_LIBFDT=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_CLUT224=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_MAC_PARTITION=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAILBOX=y +# CONFIG_MAILBOX_TEST is not set +CONFIG_MDIO_BUS=y +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_DEVRES=y +CONFIG_MEMFD_CREATE=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_MFD_CORE=y +# CONFIG_MFD_RASPBERRYPI_POE_HAT is not set +# CONFIG_MFD_RPISENSE_CORE is not set +CONFIG_MFD_SYSCON=y +CONFIG_MIGHT_HAVE_CACHE_L2X0=y +CONFIG_MIGRATION=y +CONFIG_MMC=y +# CONFIG_MMC_BCM2835 is not set +CONFIG_MMC_BCM2835_DMA=y +CONFIG_MMC_BCM2835_MMC=y +CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 +CONFIG_MMC_BCM2835_SDHOST=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MODULES_USE_ELF_REL=y +# CONFIG_MTD is not set +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_PER_CPU_KM=y +CONFIG_NET_SELFTESTS=y +CONFIG_NLS=y +CONFIG_NLS_ASCII=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_NO_HZ=y +CONFIG_NO_HZ_COMMON=y +CONFIG_NO_HZ_IDLE=y +CONFIG_NVMEM=y +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_CONFIGFS=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_OF_OVERLAY=y +CONFIG_OF_RESOLVE=y +CONFIG_OLD_SIGACTION=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_PERF_USE_VMALLOC=y +CONFIG_PGTABLE_LEVELS=2 +CONFIG_PHYLIB=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_BCM2835=y +CONFIG_PM=y +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_OPP=y +CONFIG_PM_SLEEP=y +CONFIG_POWER_SUPPLY=y +CONFIG_PRINTK_TIME=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_PWM=y +CONFIG_PWM_BCM2835=y +CONFIG_PWM_SYSFS=y +CONFIG_RASPBERRYPI_FIRMWARE=y +CONFIG_RASPBERRYPI_POWER=y +CONFIG_RATIONAL=y +# CONFIG_RAVE_SP_CORE is not set +CONFIG_REGMAP=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_RASPBERRYPI is not set +CONFIG_RESET_SIMPLE=y +# CONFIG_RPIVID_MEM is not set +# CONFIG_RPI_POE_POWER is not set +CONFIG_SCSI=y +CONFIG_SCSI_COMMON=y +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_PROC_FS is not set +CONFIG_SERIAL_8250_BCM2835AUX=y +# CONFIG_SERIAL_8250_DMA is not set +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_NR_UARTS=1 +CONFIG_SERIAL_8250_RUNTIME_UARTS=0 +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_DEV_BUS=y +# CONFIG_SERIAL_DEV_CTRL_TTYPORT is not set +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SG_POOL=y +CONFIG_SMSC_PHY=y +CONFIG_SPARSE_IRQ=y +CONFIG_SRCU=y +# CONFIG_STRIP_ASM_SYMS is not set +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_SWPHY=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +# CONFIG_TEXTSEARCH is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_OF=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_TINY_SRCU=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_UEVENT_HELPER_PATH="" +# CONFIG_UID16 is not set +CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" +CONFIG_UNWINDER_ARM=y +CONFIG_USB=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_COMMON=y +CONFIG_USB_DWCOTG=y +CONFIG_USB_NET_DRIVERS=y +CONFIG_USB_NET_SMSC95XX=y +CONFIG_USB_PHY=y +CONFIG_USB_STORAGE=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_UAS=y +CONFIG_USB_USBNET=y +CONFIG_USE_OF=y +CONFIG_VCHIQ_CDEV=y +CONFIG_VFP=y +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_WATCHDOG_CORE=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_ZBOOT_ROM_TEXT=0x0 diff --git a/target/linux/bcm27xx/bcm2709/config-6.1 b/target/linux/bcm27xx/bcm2709/config-6.1 new file mode 100644 index 00000000000..c4e332bb4d3 --- /dev/null +++ b/target/linux/bcm27xx/bcm2709/config-6.1 @@ -0,0 +1,464 @@ +# CONFIG_AIO is not set +CONFIG_ALIGNMENT_TRAP=y +CONFIG_ARCH_32BIT_OFF_T=y +CONFIG_ARCH_BCM=y +CONFIG_ARCH_BCM2835=y +# CONFIG_ARCH_BCM_HR2 is not set +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +CONFIG_ARCH_MULTIPLATFORM=y +CONFIG_ARCH_MULTI_V6_V7=y +CONFIG_ARCH_MULTI_V7=y +CONFIG_ARCH_NR_GPIO=0 +CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARM=y +CONFIG_ARM_AMBA=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +CONFIG_ARM_CPU_SUSPEND=y +CONFIG_ARM_CRYPTO=y +CONFIG_ARM_GIC=y +CONFIG_ARM_HAS_SG_CHAIN=y +CONFIG_ARM_L1_CACHE_SHIFT=6 +CONFIG_ARM_L1_CACHE_SHIFT_6=y +CONFIG_ARM_LPAE=y +# CONFIG_ARM_MHU_V2 is not set +CONFIG_ARM_PATCH_IDIV=y +CONFIG_ARM_PATCH_PHYS_VIRT=y +CONFIG_ARM_RASPBERRYPI_CPUFREQ=y +CONFIG_ARM_THUMB=y +CONFIG_ARM_TIMER_SP804=y +CONFIG_ARM_UNWIND=y +CONFIG_ARM_VIRT_EXT=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_AUTO_ZRELADDR=y +CONFIG_BCM2708_VCMEM=y +CONFIG_BCM2711_THERMAL=y +CONFIG_BCM2835_DEVGPIOMEM=y +CONFIG_BCM2835_MBOX=y +CONFIG_BCM2835_POWER=y +# CONFIG_BCM2835_SMI is not set +CONFIG_BCM2835_THERMAL=y +CONFIG_BCM2835_TIMER=y +CONFIG_BCM2835_VCHIQ=y +# CONFIG_BCM2835_VCHIQ_MMAL is not set +CONFIG_BCM2835_WDT=y +CONFIG_BCM7XXX_PHY=y +CONFIG_BCMGENET=y +CONFIG_BCM_NET_PHYLIB=y +CONFIG_BCM_VCIO=y +# CONFIG_BCM_VC_SM_CMA is not set +CONFIG_BCM_VIDEOCORE=y +CONFIG_BINFMT_FLAT_ARGVP_ENVP_ON_STACK=y +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_PM=y +CONFIG_BOUNCE=y +CONFIG_BRCMSTB_L2_IRQ=y +CONFIG_BRCM_CHAR_DRIVERS=y +CONFIG_BROADCOM_PHY=y +# CONFIG_CACHE_L2X0 is not set +CONFIG_CLKSRC_MMIO=y +CONFIG_CLK_BCM2711_DVP=y +CONFIG_CLK_BCM2835=y +CONFIG_CLK_RASPBERRYPI=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_CMA=y +CONFIG_CMA_ALIGNMENT=8 +CONFIG_CMA_AREAS=7 +# CONFIG_CMA_DEBUG is not set +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_SIZE_MBYTES=5 +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SYSFS is not set +CONFIG_COMMON_CLK=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_CONFIGFS_FS=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_CONTIG_ALLOC=y +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_ABRT_EV7=y +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_HAS_ASID=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_PM=y +CONFIG_CPU_RMAP=y +CONFIG_CPU_SPECTRE=y +CONFIG_CPU_THUMB_CAPABLE=y +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_V7=y +CONFIG_CRC16=y +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_DRBG_HMAC=y +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_JITTERENTROPY=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_XTS=y +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" +CONFIG_DIMLIB=y +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_CMA=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +CONFIG_DMADEVICES=y +CONFIG_DMA_BCM2708=y +CONFIG_DMA_BCM2835=y +CONFIG_DMA_CMA=y +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +CONFIG_DMA_OPS=y +CONFIG_DMA_REMAP=y +CONFIG_DMA_SHARED_BUFFER=y +CONFIG_DMA_VIRTUAL_CHANNELS=y +CONFIG_DNOTIFY=y +CONFIG_DTC=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_EXTCON=y +CONFIG_F2FS_FS=y +CONFIG_FB=y +CONFIG_FB_BCM2708=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_CMDLINE=y +# CONFIG_FB_RPISENSE is not set +CONFIG_FB_SIMPLE=y +CONFIG_FIQ=y +CONFIG_FIXED_PHY=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_FONT_8x16=y +CONFIG_FONT_8x8=y +CONFIG_FONT_SUPPORT=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FREEZER=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FS_ENCRYPTION_ALGS=y +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FS_POSIX_ACL=y +CONFIG_FWNODE_MDIO=y +CONFIG_FW_CACHE=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_ARCH_TOPOLOGY=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_MULTI_HANDLER=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PINCONF=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_VDSO_32=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_BCM_VIRT=y +CONFIG_GPIO_CDEV=y +# CONFIG_GPIO_FSM is not set +CONFIG_GPIO_RASPBERRYPI_EXP=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDEN_BRANCH_PREDICTOR=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAVE_SMP=y +CONFIG_HIGHMEM=y +CONFIG_HIGHPTE=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HW_CONSOLE=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_BCM2835=y +CONFIG_HW_RANDOM_IPROC_RNG200=y +CONFIG_HZ_FIXED=0 +CONFIG_I2C=y +# CONFIG_I2C_BCM2708 is not set +CONFIG_I2C_BOARDINFO=y +CONFIG_INPUT=y +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_WORK=y +CONFIG_JBD2=y +CONFIG_KEYS=y +CONFIG_KMAP_LOCAL=y +CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +CONFIG_LEDS_TRIGGER_ACTPWR=y +CONFIG_LEDS_TRIGGER_INPUT=y +CONFIG_LIBFDT=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_CLUT224=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_MAC_PARTITION=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAILBOX=y +# CONFIG_MAILBOX_TEST is not set +CONFIG_MDIO_BCM_UNIMAC=y +CONFIG_MDIO_BUS=y +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_DEVRES=y +CONFIG_MEMFD_CREATE=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_MFD_CORE=y +# CONFIG_MFD_RASPBERRYPI_POE_HAT is not set +# CONFIG_MFD_RPISENSE_CORE is not set +CONFIG_MFD_SYSCON=y +CONFIG_MICROCHIP_PHY=y +CONFIG_MIGHT_HAVE_CACHE_L2X0=y +CONFIG_MIGRATION=y +CONFIG_MMC=y +# CONFIG_MMC_BCM2835 is not set +CONFIG_MMC_BCM2835_DMA=y +CONFIG_MMC_BCM2835_MMC=y +CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 +CONFIG_MMC_BCM2835_SDHOST=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_IPROC=y +# CONFIG_MMC_SDHCI_PCI is not set +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MODULES_USE_ELF_REL=y +# CONFIG_MTD is not set +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEON=y +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_SELFTESTS=y +CONFIG_NLS=y +CONFIG_NLS_ASCII=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_NO_HZ=y +CONFIG_NO_HZ_COMMON=y +CONFIG_NO_HZ_IDLE=y +CONFIG_NR_CPUS=4 +CONFIG_NVMEM=y +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_CONFIGFS=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_OF_OVERLAY=y +CONFIG_OF_RESOLVE=y +CONFIG_OLD_SIGACTION=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_PADATA=y +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_PCI=y +CONFIG_PCIEAER=y +CONFIG_PCIEPORTBUS=y +CONFIG_PCIE_BRCMSTB=y +CONFIG_PCIE_PME=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PERF_USE_VMALLOC=y +CONFIG_PGTABLE_LEVELS=3 +CONFIG_PHYLIB=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_BCM2835=y +CONFIG_PM=y +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_OPP=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_POWER_SUPPLY=y +CONFIG_PRINTK_TIME=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_PWM=y +CONFIG_PWM_BCM2835=y +CONFIG_PWM_SYSFS=y +CONFIG_RAS=y +CONFIG_RASPBERRYPI_FIRMWARE=y +CONFIG_RASPBERRYPI_POWER=y +CONFIG_RATIONAL=y +# CONFIG_RAVE_SP_CORE is not set +CONFIG_REGMAP=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_GPIO=y +CONFIG_RESET_CONTROLLER=y +CONFIG_RESET_RASPBERRYPI=y +CONFIG_RESET_SIMPLE=y +CONFIG_RFS_ACCEL=y +# CONFIG_RPIVID_MEM is not set +# CONFIG_RPI_POE_POWER is not set +CONFIG_RPS=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_SCSI=y +CONFIG_SCSI_COMMON=y +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_PROC_FS is not set +CONFIG_SERIAL_8250_BCM2835AUX=y +# CONFIG_SERIAL_8250_DMA is not set +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_NR_UARTS=1 +CONFIG_SERIAL_8250_RUNTIME_UARTS=0 +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_DEV_BUS=y +# CONFIG_SERIAL_DEV_CTRL_TTYPORT is not set +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SG_POOL=y +CONFIG_SMP=y +CONFIG_SMP_ON_UP=y +CONFIG_SMSC_PHY=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_SPARSE_IRQ=y +CONFIG_SRCU=y +# CONFIG_STRIP_ASM_SYMS is not set +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_SWIOTLB=y +CONFIG_SWPHY=y +CONFIG_SWP_EMULATE=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +# CONFIG_TEXTSEARCH is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_OF=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TREE_RCU=y +CONFIG_TREE_SRCU=y +# CONFIG_UCLAMP_TASK is not set +CONFIG_UEVENT_HELPER_PATH="" +# CONFIG_UID16 is not set +CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" +CONFIG_UNWINDER_ARM=y +CONFIG_USB=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_COMMON=y +CONFIG_USB_DWCOTG=y +CONFIG_USB_GADGET=y +CONFIG_USB_LAN78XX=y +CONFIG_USB_NET_DRIVERS=y +CONFIG_USB_NET_SMSC95XX=y +CONFIG_USB_PCI=y +CONFIG_USB_PHY=y +CONFIG_USB_STORAGE=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_UAS=y +# CONFIG_USB_UHCI_HCD is not set +CONFIG_USB_USBNET=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_PCI=y +CONFIG_USB_XHCI_PLATFORM=y +CONFIG_USE_OF=y +CONFIG_VCHIQ_CDEV=y +CONFIG_VFP=y +CONFIG_VFPv3=y +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_WATCHDOG_CORE=y +CONFIG_XPS=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_ZBOOT_ROM_BSS=0 +CONFIG_ZBOOT_ROM_TEXT=0 diff --git a/target/linux/bcm27xx/bcm2710/config-6.1 b/target/linux/bcm27xx/bcm2710/config-6.1 new file mode 100644 index 00000000000..193bc7d5ee3 --- /dev/null +++ b/target/linux/bcm27xx/bcm2710/config-6.1 @@ -0,0 +1,450 @@ +CONFIG_64BIT=y +# CONFIG_AIO is not set +CONFIG_ARCH_BCM2835=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_ARCH_MMAP_RND_BITS_MAX=24 +CONFIG_ARCH_MMAP_RND_BITS_MIN=18 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_STACKWALK=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_ARM64=y +CONFIG_ARM64_4K_PAGES=y +CONFIG_ARM64_CNP=y +CONFIG_ARM64_CRYPTO=y +CONFIG_ARM64_EPAN=y +CONFIG_ARM64_ERRATUM_819472=y +CONFIG_ARM64_ERRATUM_824069=y +CONFIG_ARM64_ERRATUM_826319=y +CONFIG_ARM64_ERRATUM_827319=y +CONFIG_ARM64_ERRATUM_832075=y +CONFIG_ARM64_ERRATUM_843419=y +CONFIG_ARM64_HW_AFDBM=y +CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y +CONFIG_ARM64_PAGE_SHIFT=12 +CONFIG_ARM64_PAN=y +CONFIG_ARM64_PA_BITS=48 +CONFIG_ARM64_PA_BITS_48=y +CONFIG_ARM64_PTR_AUTH=y +CONFIG_ARM64_PTR_AUTH_KERNEL=y +CONFIG_ARM64_SVE=y +CONFIG_ARM64_TAGGED_ADDR_ABI=y +CONFIG_ARM64_VA_BITS=39 +CONFIG_ARM64_VA_BITS_39=y +CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y +CONFIG_ARM_AMBA=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_V2M=y +CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_V3_ITS=y +CONFIG_ARM_GIC_V3_ITS_PCI=y +# CONFIG_ARM_MHU_V2 is not set +CONFIG_ARM_PSCI_FW=y +CONFIG_ARM_RASPBERRYPI_CPUFREQ=y +CONFIG_ARM_TIMER_SP804=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +CONFIG_BCM2708_VCMEM=y +# CONFIG_BCM2711_THERMAL is not set +CONFIG_BCM2835_DEVGPIOMEM=y +CONFIG_BCM2835_MBOX=y +CONFIG_BCM2835_POWER=y +# CONFIG_BCM2835_SMI is not set +CONFIG_BCM2835_THERMAL=y +CONFIG_BCM2835_VCHIQ=y +# CONFIG_BCM2835_VCHIQ_MMAL is not set +CONFIG_BCM2835_WDT=y +CONFIG_BCM_VCIO=y +# CONFIG_BCM_VC_SM_CMA is not set +CONFIG_BCM_VIDEOCORE=y +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_PM=y +CONFIG_BRCMSTB_L2_IRQ=y +CONFIG_BRCM_CHAR_DRIVERS=y +CONFIG_CAVIUM_ERRATUM_22375=y +CONFIG_CAVIUM_ERRATUM_23154=y +CONFIG_CAVIUM_ERRATUM_27456=y +CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y +CONFIG_CLKSRC_MMIO=y +CONFIG_CLK_BCM2711_DVP=y +CONFIG_CLK_BCM2835=y +CONFIG_CLK_RASPBERRYPI=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_CMA=y +CONFIG_CMA_ALIGNMENT=8 +CONFIG_CMA_AREAS=7 +# CONFIG_CMA_DEBUG is not set +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_SIZE_MBYTES=5 +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SYSFS is not set +CONFIG_COMMON_CLK=y +CONFIG_COMMON_CLK_XGENE=y +# CONFIG_COMPAT_32BIT_TIME is not set +CONFIG_CONFIGFS_FS=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_CONTIG_ALLOC=y +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_CPU_PM=y +CONFIG_CPU_RMAP=y +CONFIG_CRC16=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_BS=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_DRBG_HMAC=y +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_JITTERENTROPY=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA256_ARM64=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_SHA512_ARM64=y +CONFIG_CRYPTO_SIMD=y +CONFIG_CRYPTO_XTS=y +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_CMA=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +CONFIG_DMADEVICES=y +CONFIG_DMA_BCM2708=y +CONFIG_DMA_BCM2835=y +CONFIG_DMA_CMA=y +CONFIG_DMA_DIRECT_REMAP=y +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +CONFIG_DMA_REMAP=y +CONFIG_DMA_SHARED_BUFFER=y +CONFIG_DMA_VIRTUAL_CHANNELS=y +CONFIG_DNOTIFY=y +CONFIG_DTC=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_EXTCON=y +CONFIG_F2FS_FS=y +CONFIG_FB=y +CONFIG_FB_BCM2708=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_CMDLINE=y +# CONFIG_FB_RPISENSE is not set +CONFIG_FB_SIMPLE=y +CONFIG_FIXED_PHY=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_FONT_8x16=y +CONFIG_FONT_8x8=y +CONFIG_FONT_SUPPORT=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FRAME_POINTER=y +CONFIG_FREEZER=y +CONFIG_FSL_ERRATUM_A008585=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FS_ENCRYPTION_ALGS=y +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FS_POSIX_ACL=y +CONFIG_FWNODE_MDIO=y +CONFIG_FW_CACHE=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_ARCH_TOPOLOGY=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_GENERIC_CSUM=y +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PINCONF=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_BCM_VIRT=y +CONFIG_GPIO_CDEV=y +# CONFIG_GPIO_FSM is not set +CONFIG_GPIO_RASPBERRYPI_EXP=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HW_CONSOLE=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_BCM2835=y +CONFIG_I2C=y +# CONFIG_I2C_BCM2708 is not set +CONFIG_I2C_BOARDINFO=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_INPUT=y +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_WORK=y +CONFIG_JBD2=y +CONFIG_KEYS=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +CONFIG_LEDS_TRIGGER_ACTPWR=y +CONFIG_LEDS_TRIGGER_INPUT=y +CONFIG_LIBFDT=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_CLUT224=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_MAC_PARTITION=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAILBOX=y +# CONFIG_MAILBOX_TEST is not set +CONFIG_MDIO_BUS=y +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_DEVRES=y +CONFIG_MEMFD_CREATE=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_MFD_CORE=y +# CONFIG_MFD_RASPBERRYPI_POE_HAT is not set +# CONFIG_MFD_RPISENSE_CORE is not set +CONFIG_MFD_SYSCON=y +CONFIG_MICROCHIP_PHY=y +CONFIG_MIGRATION=y +CONFIG_MMC=y +# CONFIG_MMC_BCM2835 is not set +CONFIG_MMC_BCM2835_DMA=y +CONFIG_MMC_BCM2835_MMC=y +CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 +CONFIG_MMC_BCM2835_SDHOST=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_IPROC=y +# CONFIG_MMC_SDHCI_PCI is not set +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MODULES_USE_ELF_RELA=y +# CONFIG_MTD is not set +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_SELFTESTS=y +CONFIG_NLS=y +CONFIG_NLS_ASCII=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_NO_HZ=y +CONFIG_NO_HZ_COMMON=y +CONFIG_NO_HZ_IDLE=y +CONFIG_NR_CPUS=4 +CONFIG_NVMEM=y +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_CONFIGFS=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_OF_OVERLAY=y +CONFIG_OF_RESOLVE=y +CONFIG_PADATA=y +CONFIG_PARTITION_PERCPU=y +CONFIG_PCI=y +# CONFIG_PCIE_BRCMSTB is not set +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PGTABLE_LEVELS=3 +CONFIG_PHYLIB=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_BCM2835=y +CONFIG_PM=y +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_OPP=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_POWER_RESET=y +CONFIG_POWER_SUPPLY=y +CONFIG_PRINTK_TIME=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_PWM=y +CONFIG_PWM_BCM2835=y +CONFIG_PWM_SYSFS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_RASPBERRYPI_FIRMWARE=y +CONFIG_RASPBERRYPI_POWER=y +CONFIG_RATIONAL=y +# CONFIG_RAVE_SP_CORE is not set +CONFIG_REGMAP=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_GPIO=y +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_RASPBERRYPI is not set +CONFIG_RESET_SIMPLE=y +CONFIG_RFS_ACCEL=y +CONFIG_RODATA_FULL_DEFAULT_ENABLED=y +# CONFIG_RPIVID_MEM is not set +# CONFIG_RPI_POE_POWER is not set +CONFIG_RPS=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_SCSI=y +CONFIG_SCSI_COMMON=y +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_PROC_FS is not set +CONFIG_SERIAL_8250_BCM2835AUX=y +# CONFIG_SERIAL_8250_DMA is not set +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_NR_UARTS=1 +CONFIG_SERIAL_8250_RUNTIME_UARTS=0 +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_DEV_BUS=y +# CONFIG_SERIAL_DEV_CTRL_TTYPORT is not set +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SG_POOL=y +CONFIG_SMP=y +CONFIG_SMSC_PHY=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSE_IRQ=y +CONFIG_SRCU=y +# CONFIG_STRIP_ASM_SYMS is not set +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_SWIOTLB=y +CONFIG_SWPHY=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +# CONFIG_TEXTSEARCH is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_OF=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +CONFIG_THREAD_INFO_IN_TASK=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_TREE_RCU=y +CONFIG_TREE_SRCU=y +# CONFIG_UCLAMP_TASK is not set +CONFIG_UEVENT_HELPER_PATH="" +CONFIG_UNMAP_KERNEL_AT_EL0=y +CONFIG_USB=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_COMMON=y +CONFIG_USB_DWCOTG=y +CONFIG_USB_LAN78XX=y +CONFIG_USB_NET_DRIVERS=y +CONFIG_USB_NET_SMSC95XX=y +CONFIG_USB_PHY=y +CONFIG_USB_STORAGE=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_UAS=y +CONFIG_USB_USBNET=y +CONFIG_VCHIQ_CDEV=y +CONFIG_VMAP_STACK=y +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_WATCHDOG_CORE=y +CONFIG_XPS=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_ZONE_DMA32=y diff --git a/target/linux/bcm27xx/bcm2711/config-6.1 b/target/linux/bcm27xx/bcm2711/config-6.1 new file mode 100644 index 00000000000..e18728e49d6 --- /dev/null +++ b/target/linux/bcm27xx/bcm2711/config-6.1 @@ -0,0 +1,462 @@ +CONFIG_64BIT=y +# CONFIG_AIO is not set +CONFIG_ARCH_BCM2835=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_ARCH_MMAP_RND_BITS_MAX=24 +CONFIG_ARCH_MMAP_RND_BITS_MIN=18 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_STACKWALK=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_ARM64=y +CONFIG_ARM64_4K_PAGES=y +CONFIG_ARM64_CNP=y +CONFIG_ARM64_CRYPTO=y +CONFIG_ARM64_EPAN=y +CONFIG_ARM64_ERRATUM_819472=y +CONFIG_ARM64_ERRATUM_824069=y +CONFIG_ARM64_ERRATUM_826319=y +CONFIG_ARM64_ERRATUM_827319=y +CONFIG_ARM64_ERRATUM_832075=y +CONFIG_ARM64_ERRATUM_843419=y +CONFIG_ARM64_HW_AFDBM=y +CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y +CONFIG_ARM64_PAGE_SHIFT=12 +CONFIG_ARM64_PAN=y +CONFIG_ARM64_PA_BITS=48 +CONFIG_ARM64_PA_BITS_48=y +CONFIG_ARM64_PTR_AUTH=y +CONFIG_ARM64_PTR_AUTH_KERNEL=y +CONFIG_ARM64_SVE=y +CONFIG_ARM64_TAGGED_ADDR_ABI=y +CONFIG_ARM64_VA_BITS=39 +CONFIG_ARM64_VA_BITS_39=y +CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y +CONFIG_ARM_AMBA=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_V2M=y +CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_V3_ITS=y +CONFIG_ARM_GIC_V3_ITS_PCI=y +# CONFIG_ARM_MHU_V2 is not set +CONFIG_ARM_PSCI_FW=y +CONFIG_ARM_RASPBERRYPI_CPUFREQ=y +CONFIG_ARM_TIMER_SP804=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +CONFIG_BCM2708_VCMEM=y +CONFIG_BCM2711_THERMAL=y +CONFIG_BCM2835_DEVGPIOMEM=y +CONFIG_BCM2835_MBOX=y +CONFIG_BCM2835_POWER=y +# CONFIG_BCM2835_SMI is not set +# CONFIG_BCM2835_THERMAL is not set +CONFIG_BCM2835_VCHIQ=y +# CONFIG_BCM2835_VCHIQ_MMAL is not set +CONFIG_BCM2835_WDT=y +CONFIG_BCM7XXX_PHY=y +CONFIG_BCMGENET=y +CONFIG_BCM_NET_PHYLIB=y +CONFIG_BCM_VCIO=y +# CONFIG_BCM_VC_SM_CMA is not set +CONFIG_BCM_VIDEOCORE=y +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_PM=y +CONFIG_BRCMSTB_L2_IRQ=y +CONFIG_BRCM_CHAR_DRIVERS=y +CONFIG_BROADCOM_PHY=y +CONFIG_CAVIUM_ERRATUM_22375=y +CONFIG_CAVIUM_ERRATUM_23154=y +CONFIG_CAVIUM_ERRATUM_27456=y +CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y +CONFIG_CLKSRC_MMIO=y +CONFIG_CLK_BCM2711_DVP=y +CONFIG_CLK_BCM2835=y +CONFIG_CLK_RASPBERRYPI=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_CMA=y +CONFIG_CMA_ALIGNMENT=8 +CONFIG_CMA_AREAS=7 +# CONFIG_CMA_DEBUG is not set +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_SIZE_MBYTES=5 +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SYSFS is not set +CONFIG_COMMON_CLK=y +CONFIG_COMMON_CLK_XGENE=y +# CONFIG_COMPAT_32BIT_TIME is not set +CONFIG_CONFIGFS_FS=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_CONTIG_ALLOC=y +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_CPU_PM=y +CONFIG_CPU_RMAP=y +CONFIG_CRC16=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_BS=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_DRBG_HMAC=y +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_JITTERENTROPY=y +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA256_ARM64=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_SHA512_ARM64=y +CONFIG_CRYPTO_SIMD=y +CONFIG_CRYPTO_XTS=y +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DIMLIB=y +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_CMA=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +CONFIG_DMADEVICES=y +CONFIG_DMA_BCM2708=y +CONFIG_DMA_BCM2835=y +CONFIG_DMA_CMA=y +CONFIG_DMA_DIRECT_REMAP=y +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +CONFIG_DMA_REMAP=y +CONFIG_DMA_SHARED_BUFFER=y +CONFIG_DMA_VIRTUAL_CHANNELS=y +CONFIG_DNOTIFY=y +CONFIG_DTC=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_EXTCON=y +CONFIG_F2FS_FS=y +CONFIG_FB=y +CONFIG_FB_BCM2708=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_CMDLINE=y +# CONFIG_FB_RPISENSE is not set +CONFIG_FB_SIMPLE=y +CONFIG_FIXED_PHY=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_FONT_8x16=y +CONFIG_FONT_8x8=y +CONFIG_FONT_SUPPORT=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FRAME_POINTER=y +CONFIG_FREEZER=y +CONFIG_FSL_ERRATUM_A008585=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FS_ENCRYPTION_ALGS=y +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FS_POSIX_ACL=y +CONFIG_FWNODE_MDIO=y +CONFIG_FW_CACHE=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_ARCH_TOPOLOGY=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_GENERIC_CSUM=y +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PINCONF=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GPIOLIB_IRQCHIP=y +CONFIG_GPIO_BCM_VIRT=y +CONFIG_GPIO_CDEV=y +# CONFIG_GPIO_FSM is not set +CONFIG_GPIO_RASPBERRYPI_EXP=y +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HW_CONSOLE=y +CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM_BCM2835 is not set +CONFIG_HW_RANDOM_IPROC_RNG200=y +CONFIG_I2C=y +# CONFIG_I2C_BCM2708 is not set +CONFIG_I2C_BOARDINFO=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_INPUT=y +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_WORK=y +CONFIG_JBD2=y +CONFIG_KEYS=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +CONFIG_LEDS_TRIGGER_ACTPWR=y +CONFIG_LEDS_TRIGGER_INPUT=y +CONFIG_LIBFDT=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_CLUT224=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_MAC_PARTITION=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAILBOX=y +# CONFIG_MAILBOX_TEST is not set +CONFIG_MDIO_BCM_UNIMAC=y +CONFIG_MDIO_BUS=y +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_DEVRES=y +CONFIG_MEMFD_CREATE=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_MFD_CORE=y +# CONFIG_MFD_RASPBERRYPI_POE_HAT is not set +# CONFIG_MFD_RPISENSE_CORE is not set +CONFIG_MFD_SYSCON=y +CONFIG_MIGRATION=y +CONFIG_MMC=y +# CONFIG_MMC_BCM2835 is not set +CONFIG_MMC_BCM2835_DMA=y +CONFIG_MMC_BCM2835_MMC=y +CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 +CONFIG_MMC_BCM2835_SDHOST=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_IPROC=y +# CONFIG_MMC_SDHCI_PCI is not set +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MODULES_USE_ELF_RELA=y +# CONFIG_MTD is not set +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_SELFTESTS=y +CONFIG_NLS=y +CONFIG_NLS_ASCII=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_NO_HZ=y +CONFIG_NO_HZ_COMMON=y +CONFIG_NO_HZ_IDLE=y +CONFIG_NR_CPUS=4 +CONFIG_NVMEM=y +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_CONFIGFS=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_OF_OVERLAY=y +CONFIG_OF_RESOLVE=y +CONFIG_PADATA=y +CONFIG_PARTITION_PERCPU=y +CONFIG_PCI=y +CONFIG_PCIEAER=y +CONFIG_PCIEPORTBUS=y +CONFIG_PCIE_BRCMSTB=y +CONFIG_PCIE_PME=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PGTABLE_LEVELS=3 +CONFIG_PHYLIB=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_BCM2835=y +CONFIG_PM=y +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_OPP=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_POWER_RESET=y +CONFIG_POWER_SUPPLY=y +CONFIG_PRINTK_TIME=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_PWM=y +CONFIG_PWM_BCM2835=y +CONFIG_PWM_SYSFS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_RAS=y +CONFIG_RASPBERRYPI_FIRMWARE=y +CONFIG_RASPBERRYPI_POWER=y +CONFIG_RATIONAL=y +# CONFIG_RAVE_SP_CORE is not set +CONFIG_REGMAP=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_GPIO=y +CONFIG_RESET_CONTROLLER=y +CONFIG_RESET_RASPBERRYPI=y +CONFIG_RESET_SIMPLE=y +CONFIG_RFS_ACCEL=y +CONFIG_RODATA_FULL_DEFAULT_ENABLED=y +# CONFIG_RPIVID_MEM is not set +# CONFIG_RPI_POE_POWER is not set +CONFIG_RPS=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_SCSI=y +CONFIG_SCSI_COMMON=y +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_PROC_FS is not set +CONFIG_SERIAL_8250_BCM2835AUX=y +# CONFIG_SERIAL_8250_DMA is not set +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_NR_UARTS=1 +CONFIG_SERIAL_8250_RUNTIME_UARTS=0 +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_DEV_BUS=y +# CONFIG_SERIAL_DEV_CTRL_TTYPORT is not set +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SG_POOL=y +CONFIG_SMP=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSE_IRQ=y +CONFIG_SRCU=y +# CONFIG_STRIP_ASM_SYMS is not set +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_SWIOTLB=y +CONFIG_SWPHY=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +# CONFIG_TEXTSEARCH is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_OF=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +CONFIG_THREAD_INFO_IN_TASK=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_TREE_RCU=y +CONFIG_TREE_SRCU=y +# CONFIG_UCLAMP_TASK is not set +CONFIG_UEVENT_HELPER_PATH="" +CONFIG_UNMAP_KERNEL_AT_EL0=y +CONFIG_USB=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_COMMON=y +CONFIG_USB_DWCOTG=y +CONFIG_USB_GADGET=y +CONFIG_USB_PCI=y +CONFIG_USB_PHY=y +CONFIG_USB_STORAGE=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_UAS=y +# CONFIG_USB_UHCI_HCD is not set +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_PCI=y +CONFIG_USB_XHCI_PLATFORM=y +CONFIG_VCHIQ_CDEV=y +CONFIG_VMAP_STACK=y +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_WATCHDOG_CORE=y +CONFIG_XPS=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_ZONE_DMA32=y From 793f8ab62cabd5de3cd9a1d4bf2102fdfa1dc724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 8 Jun 2023 19:49:36 +0200 Subject: [PATCH 12/23] bcm27xx: 6.1: add kernel patches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add kernel patches for version 6.1. Signed-off-by: Álvaro Fernández Rojas --- target/linux/bcm27xx/modules/sound.mk | 27 +- target/linux/bcm27xx/modules/video.mk | 7 + ...-interface-in-mode6-for-18-bit-color.patch | 32 + ...-as-an-acceptable-node-for-dma-range.patch | 27 + ...-the-2711-HVS-as-a-suitable-DMA-node.patch | 24 + ...he-default-DPI-format-to-being-18bpp.patch | 34 + ...-fixup-modes-that-haven-t-been-reset.patch | 24 + ...06-drm-vc4-Fix-timings-for-VEC-modes.patch | 127 + ...drm-vc4-Fix-definition-of-PAL-M-mode.patch | 77 + ...support-for-more-analog-TV-standards.patch | 148 + ...tting-the-TV-norm-via-module-paramet.patch | 143 + ...drm-vc4-Refactor-mode-checking-logic.patch | 82 + ...0-0011-drm-vc4-Add-firmware-kms-mode.patch | 2476 + ...vc4-Add-support-for-gamma-on-BCM2711.patch | 276 + ...gfs-node-that-dumps-the-vc5-gamma-PW.patch | 122 + ...vs-Force-modeset-on-gamma-lut-change.patch | 105 + ...C-modeline-requirements-and-add-prog.patch | 149 + ...-progressive-modes-readily-accessibl.patch | 165 + ...r-the-gamma-lut-has-changed-before-u.patch | 30 + ...nable-gamma-block-only-when-required.patch | 66 + ...m-vc4-Only-add-gamma-properties-once.patch | 26 + ...4-Validate-the-size-of-the-gamma_lut.patch | 32 + ...Gamma-control-on-HVS5-due-to-issues-.patch | 36 + ...-Broadcast-RGB-property-to-allow-ove.patch | 223 + ...d-DRM-210101010-RGB-formats-for-hvs5.patch | 51 + ...ort-DPI-interface-in-mode3-for-RGB56.patch | 31 + ...d-initialise-an-orientation-field-to.patch | 89 + ...-the-meaning-and-spec-references-for.patch | 76 + ...762-Ignore-EPROBE_DEFER-when-logging.patch | 25 + ...-drm-vc4-Rename-bridge-to-out_bridge.patch | 56 + ...I-initialisation-to-encoder_mode_set.patch | 64 + ...plitting-the-bridge-chain-from-the-d.patch | 118 + ...vc4_dsi-to-use-atomic-enable-disable.patch | 84 + ...vc4_dsi-to-using-a-bridge-instead-of.patch | 266 + ...ntry-to-ULPS-from-vc4_dsi-post_disab.patch | 32 + ...duce-pre_enable_upstream_first-to-al.patch | 308 + ...epare_upstream_first-flag-to-drm_pan.patch | 48 + ...ude-drm_connector.h-from-drm_panel.h.patch | 36 + ...-the-pre_enable_upstream_first-flag-.patch | 25 + ...8-drm-vc4-Support-zpos-on-all-planes.patch | 144 + ...-CSC-for-BT601-709-2020-limited-and-.patch | 301 + ...e-Keep-fractional-source-coords-insi.patch | 212 + ...ractional-coordinates-using-the-phas.patch | 105 + ...042-drm-Add-chroma-siting-properties.patch | 170 + ...-Make-use-of-chroma-siting-parameter.patch | 60 + ...igger-of-dlist-update-on-margins-cha.patch | 58 + ...rs-remove-legacy_cursor_update-hacks.patch | 121 + ...ce-a-modeset-when-Broadcast-RGB-sett.patch | 33 + ...argins-are-updated-update-all-planes.patch | 60 + ...gnore-atomic_flush-if-we-re-disabled.patch | 27 + ...alid-value-for-pixel_order_hvs5-so-f.patch | 118 + ...el_order-from-the-hvs_format-for-hvs.patch | 54 + ...-2-and-4-4-4-4-RGB-RGBX-RGBA-formats.patch | 104 + ...ents-for-which-HVS_PIXEL_ORDER_xxx-d.patch | 36 + ...ync-update-support-for-cursor-planes.patch | 87 + ...c4-Configure-the-HVS-COB-allocations.patch | 96 + ...-vc4-Set-AXI-panic-modes-for-the-HVS.patch | 39 + ...s-Skip-DebugFS-Registration-for-FKMS.patch | 25 + ...ome-RGB-bus-formats-for-VC4-DPI-outp.patch | 40 + ...ypi-firmware-Update-mailbox-commands.patch | 99 + ...eate-helper-to-retrieve-private-data.patch | 70 + ...0-0060-arm64-setup-Fix-build-warning.patch | 24 + ...BCM2708-Add-core-Device-Tree-support.patch | 37866 ++++++++++ ...spberrypi-Add-ISP-to-exported-clocks.patch | 22 + ...cks-early-during-the-boot-process-so.patch | 45 + ...Mark-used-PLLs-and-dividers-CRITICAL.patch | 28 + ...lk-bcm2835-Add-claim-clocks-property.patch | 118 + ...35-Read-max-core-clock-from-firmware.patch | 115 + ...-bcm2835-Use-zd-when-printing-size_t.patch | 24 + ...clk-bcm2835-Don-t-wait-for-pllh-lock.patch | 38 + ...support-for-setting-leaf-clock-rates.patch | 53 + ...w-reparenting-leaf-clocks-while-they.patch | 71 + ...bcm2835-Avoid-null-pointer-exception.patch | 29 + ...0-0072-clk-bcm2835-Disable-v3d-clock.patch | 58 + ...835-Pass-DT-node-to-rpi_firmware_get.patch | 24 + ...clk-bcm2835-Remove-VEC-clock-support.patch | 34 + ...vert-702b94bff3c50542a6e4ab9a4f4cef0.patch | 99 + ...76-cache-export-clean-and-invalidate.patch | 53 + ...v-Fix-CS-polarity-if-GPIO-descriptor.patch | 32 + ...-Always-request-for-user-confirmatio.patch | 45 + ...-Always-request-for-user-confirmatio.patch | 43 + ...net-Request-APD-DLL-disable-and-IDDQ.patch | 29 + ...smsx95xx-fix-crimes-against-truesize.patch | 47 + ...ental-Enable-turbo_mode-and-packetsi.patch | 43 + ...ow-mac-address-to-be-set-in-smsc95xx.patch | 99 + ...oup-Disable-cgroup-memory-by-default.patch | 85 + ...e_resource-against-resources-without.patch | 28 + ...cm2836-Avoid-Invalid-trigger-warning.patch | 24 + ...0087-irqchip-bcm2835-Add-FIQ-support.patch | 127 + ...hip-irq-bcm2835-Add-2836-FIQ-support.patch | 99 + ...ompletely-disable-the-spidev-warning.patch | 24 + ...5-Load-driver-early-and-support-lega.patch | 101 + ...rtc-Add-SPI-alias-for-pcf2123-driver.patch | 20 + ...835-Support-setting-reboot-partition.patch | 102 + ...-off-rather-than-busy-spinning-when-.patch | 23 + ...-Make-RASPBERRYPI_POWER-depend-on-PM.patch | 19 + ...void-initialising-if-already-enabled.patch | 25 + ...Demote-deferral-errors-to-INFO-level.patch | 35 + .../950-0097-Update-vfpmodule.c.patch | 137 + ...0-0098-i2c-bcm2835-Add-debug-support.patch | 189 + ...bcm2836-Remove-regmap-and-syscon-use.patch | 112 + ...8xx-Enable-LEDs-and-auto-negotiation.patch | 49 + ...-Insert-mb-for-correct-FIFO-handling.patch | 27 + ...Add-cts-event-workaround-DT-property.patch | 50 + ...011-Avoid-rare-write-when-full-error.patch | 42 + ...Set-base-to-0-give-expected-gpio-num.patch | 40 + ...0105-Main-bcm2708-bcm2709-linux-port.patch | 150 + .../950-0106-Add-dwc_otg-driver.patch | 61022 ++++++++++++++++ .../950-0107-bcm2708-framebuffer-driver.patch | 3548 + ...lti-frame-buffer-support-from-the-Pi.patch | 778 + ...50-0109-fbdev-add-FBIOCOPYAREA-ioctl.patch | 337 + ...10-dmaengine-Add-support-for-BCM2708.patch | 652 + ...111-MMC-added-alternative-MMC-driver.patch | 2018 + ...dhost-driver-and-an-overlay-to-enabl.patch | 2502 + ...m-driver-for-querying-firmware-memor.patch | 493 + ...device-for-rootless-user-GPIO-access.patch | 299 + .../patches-6.1/950-0115-Add-SMI-driver.patch | 1967 + ...950-0116-Add-Chris-Boot-s-i2c-driver.patch | 660 + ...0-0117-char-broadcom-Add-vcio-module.patch | 273 + ...irmware-bcm2835-Support-ARCH_BCM270x.patch | 74 + ...ds-Add-the-input-trigger-for-pwr_led.patch | 168 + ...dded-Device-IDs-for-August-DVB-T-205.patch | 22 + ...o_user-and-__copy_from_user-performa.patch | 1611 + ...off-Allow-it-to-work-on-Raspberry-Pi.patch | 35 + ...d-Raspberry-Pi-Sense-HAT-core-driver.patch | 850 + ...all-the-downstream-rpi-sound-card-dr.patch | 17626 +++++ ...lay-add-backlight-driver-and-overlay.patch | 172 + ...bcm2835-virtgpio-Virtual-GPIO-driver.patch | 268 + ...127-OF-DT-Overlay-configfs-interface.patch | 404 + ...i_h5-Don-t-send-conf_req-when-ACTIVE.patch | 23 + ...und-Robin-dispatch-IRQs-between-CPUs.patch | 72 + ...ware-emulation-of-deprecated-instruc.patch | 28 + ...-AXI-performance-monitor-driver-2222.patch | 691 + ...m2835-Set-Serial-number-and-Revision.patch | 63 + ...Q-Fix-bad-mode-in-data-abort-handler.patch | 116 + ...FIQs-to-avoid-__irq_startup-warnings.patch | 36 + ...so-set-bus-numbers-from-reg-property.patch | 35 + ...ear-option-to-pps-gpio-via-dtoverlay.patch | 22 + ...78xx-Read-initial-EEE-status-from-DT.patch | 40 + ...fault-mouse-polling-interval-to-60Hz.patch | 32 + ...to-export-gpio-used-by-gpio-poweroff.patch | 93 + ...pberrypi-Notify-firmware-of-a-reboot.patch | 84 + ...bcm2835-Calc.-FIQ_START-at-boot-time.patch | 66 + ...Disable-TCP-Segmentation-Offload-TSO.patch | 56 + ...e-enabling-of-EEE-into-PHY-init-code.patch | 64 + ...SPI_DRV-should-select-DVB_CXD2880-wi.patch | 20 + ...rypi-Add-backward-compatible-get_thr.patch | 79 + ...is7xx-Don-t-spin-if-no-data-received.patch | 23 + ...step_wise-add-support-for-hysteresis.patch | 88 + ...step_wise-avoid-throttling-at-hyster.patch | 22 + ...950-0149-Update-issue-templates-2736.patch | 47 + ...xx-Support-auto-downshift-to-100Mb-s.patch | 91 + ...rypi-Report-the-fw-variant-during-pr.patch | 89 + ...e-link-events-to-minimize-poll-storm.patch | 45 + ...xx-EEE-support-is-now-a-PHY-property.patch | 26 + ...ma-Add-support-for-per-channel-flags.patch | 48 + ...8-Add-backup-switchover-mode-support.patch | 82 + ...-tc358743-Increase-FIFO-level-to-374.patch | 31 + ...-Add-support-for-972Mbit-s-link-freq.patch | 79 + ...743-Check-I2C-succeeded-during-probe.patch | 98 + ...180-Default-to-the-first-valid-input.patch | 45 + ...v7180-Add-YPrPb-support-for-ADV7282M.patch | 24 + ...Add-helper-defines-for-printing-FOUR.patch | 28 + ...-Document-BCM283x-CSI2-CCP2-receiver.patch | 103 + ...-Add-entry-for-BCM2835-Unicam-driver.patch | 28 + ...eturn-an-appropriate-colorspace-from.patch | 98 + ...chiq-Avoid-use-of-bool-in-structures.patch | 24 + ...chiq-Add-support-for-event-callbacks.patch | 356 + ...vices-Support-sending-data-to-MMAL-p.patch | 42 + ...2-Allow-exporting-of-a-struct-dmabuf.patch | 83 + ...iq-Fix-client_component-for-64-bit-k.patch | 35 + ...iq-Add-in-the-Bayer-encoding-formats.patch | 51 + ...iq-Update-mmal_parameters.h-with-rec.patch | 56 + ...iq-Free-the-event-context-for-contro.patch | 28 + ...-vchiq-Fix-memory-leak-in-error-path.patch | 76 + ...ake-GPIO-an-output-for-strong-pullup.patch | 27 + ...75-arm-bcm2835-Fix-FIQ-early-ioremap.patch | 73 + ...arm-bcm2835-DMA-can-only-address-1GB.patch | 25 + ...rng-iproc-rng200-Add-BCM2838-support.patch | 153 + ...genet-constrain-max-DMA-burst-length.patch | 20 + ...Better-coalescing-parameter-defaults.patch | 43 + ...-link-energy-detect-powerdown-for-ex.patch | 31 + ...-for-updating-interrupt-endpoint-int.patch | 104 + ...hci_fixup_endpoint-for-interval-adju.patch | 135 + ...fixup_endpoint-after-mangling-interv.patch | 23 + ...cm2835-Add-bcm2838-compatible-string.patch | 20 + ...35-Set-clock-stretch-timeout-to-35ms.patch | 47 + ...m-v3d-Clock-V3D-down-when-not-in-use.patch | 158 + ...-chardev-for-mmap-ing-the-RPiVid-con.patch | 372 + ...ce-quirks-for-Freeway-Airmouse-T3-an.patch | 63 + ...t-Workaround-2-for-Pi4-Ethernet-fail.patch | 51 + ...ore-event-ring-segment-table-entries.patch | 60 + ...arch-arm-Add-model-string-to-cpuinfo.patch | 36 + ...Add-Revision-Serial-Model-to-cpuinfo.patch | 58 + ...8-Support-for-the-Sony-IMX258-sensor.patch | 1621 + ...0-Support-for-the-Sony-IMX290-sensor.patch | 1291 + ...7-Support-for-the-Sony-IMX477-sensor.patch | 2701 + ...9-Support-for-the-Sony-IMX519-sensor.patch | 2317 + ...vicetree-Add-documentation-for-imx37.patch | 142 + ...0-0198-v4l2-Add-a-Greyworld-AWB-mode.patch | 23 + ...cm2835-camera-Add-greyworld-AWB-mode.patch | 37 + ...-v4l2-Add-Greyworld-AWB-control-name.patch | 24 + ...camera-Fix-the-cherry-pick-of-AWB-Gr.patch | 28 + ...oard-clk-and-pinctrl-to-bcm2711-comp.patch | 26 + ...binding-for-the-Infineon-IRS1125-sen.patch | 66 + ...driver-for-the-Infineon-IRS1125-dept.patch | 1231 + ...Suppress-all-but-the-first-MMU-error.patch | 39 + ...950-0206-drm-v3d-Plug-dma_fence-leak.patch | 28 + ...m-Register-vcsm-cma-as-a-platform-dr.patch | 40 + ...m-Register-bcm2835-codec-as-a-platfo.patch | 40 + ...ow-ethernet-LED-mode-to-be-set-via-d.patch | 55 + ...Handle-missing-clock-more-gracefully.patch | 27 + ...-clock-so-firmware-knows-we-are-usin.patch | 27 + ...Allow-cpufreq-driver-to-also-adjust-.patch | 25 + ...m-Set-up-dma-ranges-on-child-devices.patch | 33 + ...e-the-old-dma-controller-for-OF-conf.patch | 51 + ...ckport-BCM2711-support-from-upstream.patch | 47 + ...lise-rpi-firmware-before-clk-bcm2835.patch | 47 + ...hiq_arm-Give-vchiq-children-DT-nodes.patch | 39 + ...trl-bcm2835-Remove-gpiochip-on-error.patch | 25 + ...-bcm2708_fb-Use-common-compat-header.patch | 23 + ...f-overlay-Correct-symbol-path-fixups.patch | 37 + ...-Add-DT-docs-for-Brcmstb-PCIe-device.patch | 77 + ...t-Disable-skip_umac_reset-by-default.patch | 23 + ...h-Add-a-format-for-column-YUV4-2-0-m.patch | 309 + ...s-media-Add-binding-for-the-Raspberr.patch | 106 + ...dia-Add-media_request_-pin-unpin-API.patch | 94 + ...ivid-Add-Raspberry-Pi-V4L2-H265-deco.patch | 5238 ++ ...CS_HIGH-if-GPIO-descriptors-are-used.patch | 57 + ...core-Add-sensor-ancillary-data-V4L2-.patch | 85 + ...EDIA_BUS_FMT_SENSOR_DATA-media-bus-f.patch | 63 + ...core-Add-ISP-statistics-output-V4L2-.patch | 94 + ...trls-Add-CID-base-for-the-bcm2835-is.patch | 169 + ...q-Load-bcm2835_isp-driver-from-vchiq.patch | 39 + ...35-dma-Add-proper-40-bit-DMA-support.patch | 801 + ...i2c-tc358743-Fix-fallthrough-warning.patch | 20 + ...8_fb-Disable-FB-if-no-displays-found.patch | 34 + ...vices-mmal-vchiq-Update-parameters-l.patch | 28 + ...vices-bcm2835-camera-Request-headers.patch | 30 + ...238-zswap-Defer-zswap-initialisation.patch | 129 + ...-t-prevent-IRQ-usage-of-output-GPIOs.patch | 50 + ...mstb-Add-DT-property-to-control-L1SS.patch | 75 + ...125-Using-i2c_transfer-for-ic2-reads.patch | 65 + ...s1125-Refactoring-and-debug-messages.patch | 123 + ...omic-access-to-imager-reconfiguratio.patch | 381 + ...5-Keep-HW-in-sync-after-imager-reset.patch | 181 + ...icam-Driver-for-CCP2-CSI2-camera-int.patch | 3158 + ...icam-Kconfig-Makefile-for-CCP2-CSI2-.patch | 45 + ...icam-Add-support-for-get_mbus_config.patch | 56 + ...icam-Avoid-gcc-warning-over-0-on-end.patch | 27 + ...50-bcm2835aux-defer-if-clock-is-zero.patch | 28 + ...l-format-for-MIPI-packed-12bit-luma-.patch | 95 + ...l-format-for-MIPI-packed-14bit-luma-.patch | 104 + ...icam-Add-support-for-12bit-mono-pack.patch | 25 + ...icam-Add-support-for-14bit-mono-sour.patch | 29 + ...icam-Add-support-for-unpacked-14bit-.patch | 42 + ...55-bcm2835-dma-Add-NO_WAIT_RESP-flag.patch | 54 + ...icam-Reinstate-V4L2_CAP_READWRITE-in.patch | 28 + ...icam-Ensure-type-is-VIDEO_CAPTURE-in.patch | 36 + ...icam-Set-VPU-min-clock-freq-to-250Mh.patch | 127 + ...835-unicam-Update-documentation-with.patch | 38 + ...950-0260-leds-Add-the-actpwr-trigger.patch | 235 + ...835-dma-Advertise-the-full-DMA-range.patch | 77 + ...icam-Drop-WARN-on-uing-direct-cache-.patch | 34 + ...43-Only-allow-supported-pixel-fmts-i.patch | 30 + ...835-unicam-Always-service-interrupts.patch | 51 + ...835-unicam-Fix-uninitialized-warning.patch | 21 + ...icam-Fixup-review-comments-from-Hans.patch | 215 + ...icam-Retain-packing-information-on-G.patch | 48 + ...icam-change-minimum-number-of-vb2_qu.patch | 28 + ...tft-Add-support-for-display-variants.patch | 293 + ...et-bcmgenet-Reset-RBUF-on-first-open.patch | 70 + ...com-char-drivers-back-to-build-files.patch | 30 + ...camera-Replace-deprecated-V4L2_PIX_F.patch | 30 + ...04_services-Add-new-vc-sm-cma-driver.patch | 2961 + ...hiq-mmal-Add-support-for-14bit-Bayer.patch | 27 + ...l-vchiq-Add-monochrome-image-formats.patch | 29 + ...iq-Use-vc-sm-cma-to-support-zero-cop.patch | 162 + ...services-Add-a-V4L2-M2M-codec-driver.patch | 4333 ++ ...-reserve-channel-0-if-legacy-dma-dri.patch | 32 + ...isp-Add-bcm2835-isp-uapi-header-file.patch | 338 + ...vices-ISP-Add-a-more-complex-ISP-pro.patch | 2408 + .../950-0281-gpio-Add-gpio-fsm-driver.patch | 1304 + ...pseudo_pallete-to-prevent-crash-on-f.patch | 30 + ...-0283-bcm2708_fb-Fix-a-build-warning.patch | 22 + ...-Ignore-params-after-the-partition-n.patch | 29 + ...rypi-Add-support-for-tryonce-reboot-.patch | 60 + ...it-out-the-BCM54213PE-from-the-BCM54.patch | 71 + ...roadcom-Add-bcm54213pe-configuration.patch | 34 + ...tb-Restore-initial-fundamental-reset.patch | 35 + ...-Poll-the-device-if-no-interrupt-is-.patch | 98 + ...rrypi-touchscreen-Use-independent-I2.patch | 58 + ...rrypi-ts-Insert-delay-before-polling.patch | 26 + ...ings-Add-compatible-for-BCM2711-DSI1.patch | 23 + ...icam-Correctly-handle-error-propagat.patch | 27 + ...icam-Return-early-from-stop_streamin.patch | 64 + ...icam-Clear-clock-state-when-stopping.patch | 25 + ...-PCI-brcmstb-Advertise-MSI-X-support.patch | 27 + ...-Ack-pending-PHY-ints-when-resetting.patch | 32 + ...-0298-vc-sm-cma-fixed-kbuild-problem.patch | 30 + ...vices-Add-additional-unpacked-raw-fo.patch | 51 + ...isp-Add-the-unpacked-16bpp-raw-forma.patch | 174 + ...isp-Log-the-number-of-excess-support.patch | 29 + ...void-losing-CS-flags-after-interrupt.patch | 21 + ...bcm2835-dma-Add-DMA_WIDE_SOURCE-and-.patch | 64 + ...isp-Add-colour-denoise-configuration.patch | 56 + ...vices-ISP-Add-colour-denoise-control.patch | 75 + ...around-fix-for-zero-length-transfers.patch | 50 + ...nce-unavoidable-dtc-overlay-warnings.patch | 31 + ...w-formats-with-different-colour-spac.patch | 712 + ...icam-Fix-bug-in-buffer-swapping-logi.patch | 75 + ...iases-to-different-AES-implementatio.patch | 107 + ...n-buffered-mode-run-jobs-if-either-p.patch | 33 + ...950-0312-media-i2c-add-ov9281-driver.patch | 1729 + ...-return-codes-from-ov5647_write-ov56.patch | 89 + ...ov5647-Parse-and-register-properties.patch | 49 + ...m2835-camera-Add-support-for-DMABUFs.patch | 37 + ...taging-fbtft-Add-minipitft13-variant.patch | 104 + ...070me05000-Use-gpiod_set_value_cansl.patch | 67 + ...camera-Add-support-for-H264-levels-4.patch | 58 + ...ing-bcm2835-isp-Fix-compiler-warning.patch | 25 + ...ff-Remember-the-old-poweroff-handler.patch | 53 + ...2c-ov5647-Correct-pixel-array-offset.patch | 25 + ...-ov5647-Correct-minimum-VBLANK-value.patch | 26 + ...-Fix-v4l2-compliance-failure-subscri.patch | 26 + ...vices-isp-Set-the-YUV420-YVU420-form.patch | 39 + ...icam-Forward-input-status-from-subde.patch | 53 + ...v7251-Add-fwnode-properties-controls.patch | 48 + ...und-for-bogus-SET_DEQ_PENDING-endpoi.patch | 41 + ...vchiq_arm-Add-36-bit-address-support.patch | 256 + ...chiq_arm-children-inherit-DMA-config.patch | 36 + ...q_arm-Usa-a-DMA-pool-for-small-bulks.patch | 118 + ...errypi-touchscreen-Handle-I2C-errors.patch | 34 + ...-Add-a-timing-for-the-Raspberry-Pi-7.patch | 59 + ...-Clean-up-timer-and-workqueue-on-rem.patch | 31 + ...al-Add-buffer-flags-for-interlaced-v.patch | 42 + ...al-Add-parameters-for-interlaced-vid.patch | 61 + ...al-Add-the-deinterlace-image-effects.patch | 26 + ...337-Add-Raspberry-Pi-PoE-HAT-support.patch | 268 + ...l-vchiq-Rationalise-included-headers.patch | 36 + ...iq-Add-module-parameter-to-enable-lo.patch | 314 + ...iq-Reset-buffers_with_vpu-on-port_en.patch | 31 + ...-a-driver-that-wraps-the-PWM-API-as-.patch | 192 + ...-Sensor-should-report-RAW-color-spac.patch | 51 + ...p-Report-input-node-as-wanting-full-.patch | 29 + ...5-unicam-Parse-pad-numbers-correctly.patch | 232 + ...icam-Add-support-for-configuration-v.patch | 1952 + ...camera-Add-support-for-H264_MIN_QP-H.patch | 54 + ...camera-Add-support-for-MPEG_VIDEO_FO.patch | 43 + ...a-i2c-ov5647-Support-HFLIP-and-VFLIP.patch | 189 + ...isp-Allow-multiple-users-for-the-ISP.patch | 175 + ...drivers-bcm2835_isp-Fix-div-by-0-bug.patch | 23 + ...dev-Restore-loading-from-Device-Tree.patch | 25 + ...06-Handle-unreliable-TOUCH_UP-events.patch | 63 + ...unicam-Add-logging-message-when-a-fr.patch | 26 + ...nel-attiny-Don-t-read-the-LCD-power-.patch | 46 + ...-Only-look-at-the-number-of-points-r.patch | 44 + ...523-Fix-oscillator-stop-bit-handling.patch | 57 + ...le-Populate-bpc-when-using-panel-dpi.patch | 24 + ...-Allow-the-bus-format-to-be-read-fro.patch | 28 + ...-quirks-add-link-TRB-quirk-for-VL805.patch | 60 + ...m_on_ring-for-cases-where-there-is-a.patch | 29 + ...t-TRBS_PER_SEGMENT-define-in-runtime.patch | 257 + ...usb-xhci-add-VLI_TRB_CACHE_BUG-quirk.patch | 73 + ...47-Add-support-for-regulator-control.patch | 111 + ...ov7251-Make-the-enable-GPIO-optional.patch | 26 + ...2835-isp-Fix-cleanup-after-init-fail.patch | 38 + ...ls-Reset-V4L2_CID_USER_BCM2835_ISP_B.patch | 33 + ...-Increase-diff-between-VTS-and-max-e.patch | 60 + ...e-GitHubs-issue-form-for-bug-reports.patch | 163 + ...-isp-Add-missing-lock-initialization.patch | 51 + ...2c-Add-configuration-for-RPi-POE-HAT.patch | 63 + ...poe-Add-option-of-being-created-by-M.patch | 170 + ...op-CURRENT_AVG-as-it-is-not-hardware.patch | 43 + ...d-option-of-being-created-by-MFD-or-.patch | 234 + ...unicam-Disable-trigger-mode-operatio.patch | 57 + ...881c-driver-support-for-nwe080-panel.patch | 296 + ...icam-Set-ret-on-error-path-in-unicam.patch | 43 + ...-Initialize-id_msb-to-zero-in-ov9281.patch | 48 + ...e-clock-stretch-timeout-configurable.patch | 44 + ...-for-SOF_TIMESTAMPING_TX_SOFTWARE-su.patch | 20 + ...ent-format-MEDIA_BUS_FMT_RGB565_1X24.patch | 60 + ...indings-vendor-prefixes-Add-Geekworm.patch | 23 + ...lay-simple-add-Geekworm-MZP280-Panel.patch | 34 + ...nel-simple-add-Geekworm-MZP280-Panel.patch | 58 + ...-Remove-custom-handling-of-orientati.patch | 51 + ...nel-driver-for-Ilitek-ILI9806E-panel.patch | 535 + ...nel-driver-for-TDO-Y17B-based-panels.patch | 329 + ...dings-Add-sck-idle-input-to-spi-gpio.patch | 23 + ...spi-gpio-Add-sck-idle-input-property.patch | 57 + ...icam-Handle-a-repeated-frame-start-w.patch | 63 + ...uirk-for-Superspeed-bulk-OUT-transfe.patch | 96 + ...-Reinstate-setting-ov7251_global_ini.patch | 32 + ...ework-XHCI_VLI_SS_BULK_OUT_BUG-quirk.patch | 51 + ...i2c-Add-driver-for-Omnivision-OV2311.patch | 1228 + ...vices-isp-Permit-all-sRGB-colour-spa.patch | 161 + ...bcm2835-isp-Do-not-cleanup-mmal-vcsm.patch | 43 + ...media-i2c-Add-binding-for-ad5398-VCM.patch | 39 + ...dd-driver-for-AD5398-VCM-lens-driver.patch | 387 + ...-Use-v4l2_async_register_subdev_sens.patch | 26 + ...edia-i2c-Rename-ad5398-to-ad5398_vcm.patch | 717 + ...bcm2835-isp-Clear-LS-table-handle-in.patch | 37 + ...a-introduce-a-customisable-threshold.patch | 67 + ...2835-Only-return-non-GPIOs-to-inputs.patch | 42 + ...-ili9881c-Clean-up-on-mipi_dsi_attac.patch | 31 + ...ilitek9881c-Add-prepare_upstream_fir.patch | 28 + ...subsys_initcall-for-the-clock-driver.patch | 28 + ...-Force-probe-routine-to-run-synchron.patch | 28 + ...chiq_arm-Add-log_level-module-params.patch | 27 + ...bindings-vendor-prefixes-Add-Arducam.patch | 23 + ...s-media-i2c-Add-Arducam-Pivariety-Se.patch | 148 + ...iver-of-Arducam-Pivariety-series-cam.patch | 1635 + ...-Use-dev_err_probe-to-suppress-defer.patch | 26 + ...n-add-microchip-emc2305.yaml-dt-bind.patch | 75 + ...ixup-microchip-emc2305.yaml-bindings.patch | 40 + ...edia-i2c-Update-ov2311-Kconfig-entry.patch | 22 + ...edia-i2c-Update-ov9281-Kconfig-entry.patch | 22 + ...dia-i2c-Update-irs1125-Kconfig-entry.patch | 25 + ...m-pivariety-Fixup-for-mainline-API-c.patch | 42 + ...do-single-sector-reads-during-recove.patch | 34 + ...hiq-mmal-Add-defines-for-mmal_es_for.patch | 34 + ...e-jump-labels-before-they-are-initia.patch | 86 + ...-v3d-Switch-clock-setting-to-new-api.patch | 87 + ...Enable-minimize-for-all-firmware-clo.patch | 40 + ...s-media-i2c-Add-Arducam-64MP-CMOS-se.patch | 151 + ...2c-Add-driver-of-Arducam-64MP-camera.patch | 2458 + ...m_64mp-Advertise-embedded-data-node-.patch | 256 + ...426-Add-HDMI1-facility-to-the-driver.patch | 296 + ...late-phy-driver-block-for-BCM54213PE.patch | 33 + ...-bcm-rpi-Add-the-BCM283x-pixel-clock.patch | 26 + ...9281-Correct-min-def-vts-for-640x400.patch | 27 + ...-Change-exposure-default-value-with-.patch | 29 + ...icam-Correctly-handle-FS-FE-ISR-cond.patch | 64 + ...panel-simple-hack-ignore-orientation.patch | 24 + ...-sm-cma-Handle-upstream-require-vchi.patch | 214 + ...Read-CSI2-config-from-FW-and-pass-to.patch | 149 + ...rducam-pivariety-Add-custom-controls.patch | 40 + ...icam-Fix-for-possible-dummy-buffer-o.patch | 56 + ...mitigations-for-VLI_SS_BULK_OUT_BUG-.patch | 89 + ...-for-num_trbs_free-when-invalidating.patch | 84 + .../950-0439-nvmem-Use-NVMEM_DEVID_AUTO.patch | 27 + ...name-GEM-CMA-helpers-GEM-DMA-helpers.patch | 35 + ...xups-for-driver-submitted-to-mailing.patch | 163 + ...-unicam-Fix-up-start-stop-api-change.patch | 39 + ...otg-fix-reference-passing-when-check.patch | 59 + ...m-vc4-Add-missing-32-bit-RGB-formats.patch | 50 + ...ays-Add-i2c-sensor-support-for-AHT10.patch | 58 + ...-Add-README-entry-for-i2c-rtc-rv3032.patch | 30 + ...stop-GCC-from-patching-FIQ-functions.patch | 43 + ...rlays-i2c-sensor-Add-mcp980x-support.patch | 63 + ...sound-Make-button-pins-owned-by-card.patch | 49 + ...rypi-Introduce-rpi_firmware_find_nod.patch | 76 + ...rypi-Move-the-clock-IDs-to-the-firmw.patch | 73 + ...rypi-Provide-a-helper-to-query-a-clo.patch | 96 + ...hdmi-Fix-hdmi_enable_4kp60-detection.patch | 47 + ...ork-hdmi_enable_4kp60-detection-code.patch | 170 + ...i-Add-more-checks-for-4k-resolutions.patch | 88 + ...e-we-don-t-end-up-with-a-core-clock-.patch | 55 + ...-phy-BCM54210PE-does-not-support-PTP.patch | 44 + ...mi-Allow-hotplug-detect-to-be-forced.patch | 58 + ...-sensor-Add-the-jc42-class-of-sensor.patch | 84 + ...tend-audremap-to-supports-other-pins.patch | 79 + ...-Nasty-hack-to-allow-input-selection.patch | 89 + ...m2835_codec-Allow-larger-images-thro.patch | 101 + ...lock-frequency-defaults-to-54MHz-but.patch | 45 + ...0p-Corrects-the-volume-level-display.patch | 27 + .../950-0465-overlays-Add-overlay-pwm1.patch | 132 + ...ys-audremap-Include-the-fsels-values.patch | 50 + ...sor-Make-smbus-timeout-disable-optio.patch | 48 + ...ntion-Digi2-Pro-audio-card-in-README.patch | 21 + ...9-usb-xhci-add-XHCI_VLI_HUB_TT_QUIRK.patch | 119 + ...-Add-module-param-to-select-ext-trig.patch | 88 + ...oid-log-spam-for-audio-start-failure.patch | 41 + ...-tests-Order-Kunit-tests-in-Makefile.patch | 40 + ...950-0473-drm-tests-Add-Kunit-Helpers.patch | 116 + ...474-drm-tests-Include-helpers-header.patch | 34 + ...5-drm-tests-helpers-Add-module-infos.patch | 31 + ...76-drm-tests-helpers-Add-SPDX-header.patch | 37 + ...Constify-the-old-new-state-accessors.patch | 199 + ...m-vc4-Constify-container_of-wrappers.patch | 91 + ...nstify-the-HVS-old-new-state-helpers.patch | 35 + ...-the-CRTCs-by-output-before-assignin.patch | 201 + ...txp-Reorder-the-variable-assignments.patch | 58 + ...50-0482-drm-vc4-Add-TXP-encoder-type.patch | 100 + ...ialise-the-CRTC-before-the-encoder-a.patch | 42 + ...s-the-device-and-data-in-vc4_crtc_in.patch | 103 + ...485-drm-vc4-crtc-Provide-a-CRTC-name.patch | 116 + ...drm-tests-helpers-Add-missing-export.patch | 25 + ...s-Move-the-helper-header-to-include-.patch | 63 + ...uce-a-config-option-for-the-KUnit-he.patch | 74 + ...lpers-Document-drm_kunit_device_init.patch | 44 + ...-helpers-Switch-to-EXPORT_SYMBOL_GPL.patch | 27 + ...elpers-Rename-the-device-init-helper.patch | 63 + ...ts-helpers-Remove-the-name-parameter.patch | 66 + ...s-Create-the-device-in-another-funct.patch | 127 + ...-helpers-Switch-to-a-platform_device.patch | 59 + ...elpers-Make-sure-the-device-is-bound.patch | 74 + ...s-Allow-for-a-custom-device-struct-t.patch | 135 + ...rs-Allow-to-pass-a-custom-drm_driver.patch | 120 + ...rm-vc4-Move-HVS-state-to-main-header.patch | 116 + ...roduce-a-lower-level-crtc-init-helpe.patch | 131 + ...tc-Make-encoder-lookup-helper-public.patch | 78 + ...ide-a-function-to-initialize-the-HVS.patch | 131 + ...s-Introduce-a-mocking-infrastructure.patch | 736 + ...il-the-current-test-if-we-access-a-r.patch | 201 + ...dd-unit-test-suite-for-the-PV-muxing.patch | 1159 + ...tion-gpu-vc4-Add-KUnit-Tests-Section.patch | 38 + ...github-Add-Github-Workflow-for-KUnit.patch | 74 + ...orkflows-Add-dtoverlaycheck-workflow.patch | 62 + ...s-Create-workflow-to-CI-kernel-build.patch | 285 + ...E.md-with-CI-kernel-build-status-tag.patch | 50 + ...nel-ilitek9881c-Use-cansleep-methods.patch | 37 + ...nel-ilitek9881c-Crystalfontz-support.patch | 276 + ...verlays-Add-crystalfontz-cfa050_pi_m.patch | 171 + ...et-bcmgenet-Add-eee-module-parameter.patch | 46 + ...950-0514-dts-bcm2711-Add-eee-dtparam.patch | 32 + ...verlay-cm-swap-i2c0-to-swap-buses-on.patch | 86 + ...t-cam_reg-GPIO-assignments-for-CM1-3.patch | 71 + ...950-0517-dt-Add-camX_reg_gpio-to-CM4.patch | 59 + ...-and-camX_reg_gpio-overrides-to-CM4S.patch | 64 + .../950-0519-overlays-Add-disable-emmc2.patch | 75 + ...HCI_VLI_HUB_TT_QUIRK-to-old-firmware.patch | 53 + ...mple-Add-Innolux-AT056tN53V1-5.6-VGA.patch | 177 + ...emap-Fix-setting-of-the-pin-function.patch | 33 + ...indings-Add-DW9817-to-DW9807-binding.patch | 46 + ...-Add-support-for-DW9817-bidirectiona.patch | 223 + ...bindings-Add-regulator-to-dw9807-vcm.patch | 40 + ...-Add-regulator-support-to-the-driver.patch | 187 + ...-Smooth-the-first-user-movement-of-t.patch | 49 + ...a-i2c-Add-IMX708-CMOS-sensor-binding.patch | 155 + ...driver-for-the-Sony-IMX708-image-sen.patch | 2045 + ...overlays-for-the-IMX708-image-sensor.patch | 434 + ...oadcom-Make-LEDs-3-4-shadow-LEDs-1-2.patch | 35 + ...-i2c-sensor-MS-temp-pressure-sensors.patch | 150 + ...dia-imx708-Enable-long-exposure-mode.patch | 102 + ...edia-i2c-imx708-Fix-crop-information.patch | 29 + ...dmi-Correct-CSC-setup-for-YCbCr4-4-4.patch | 36 + ...-property-to-allow-manual-config-of-.patch | 176 + ...c-Honor-return-value-of-mmc_of_parse.patch | 30 + ...ws-Set-warnings-as-errors-for-builds.patch | 63 + ...s-i2c-sensor-Add-mpu6050-and-mpu9250.patch | 168 + ...lows-Correct-kernel-builds-artifacts.patch | 147 + ...-i2c-sensor-Use-TABs-for-indentation.patch | 67 + ...ays-i2c-sensor-Add-BNO055-IMU-sensor.patch | 97 + ...-vc4-kms-dpi-generic-for-changed-med.patch | 34 + ...4-hvs-Defer-dlist-slots-deallocation.patch | 401 + ...lways-enable-GCP-with-AVMUTE-cleared.patch | 104 + ...l2-codec-Enable-selection-ioctl-for-.patch | 34 + ...b-workflows-Switch-to-a-matrix-build.patch | 333 + ...verlays-i2c-sensor-Add-SHT4X-support.patch | 74 + ...static-key-to-check-if-KUnit-is-acti.patch | 75 + ...atic-key-when-retrieving-the-current.patch | 174 + ...ialize-the-dlist-allocation-list-ent.patch | 30 + ...-the-dlist-allocation-destruction-to.patch | 46 + ...roy-dlist-allocations-immediately-wh.patch | 48 + ...dts-Set-the-LED-default-state-to-off.patch | 270 + ...md-Replace-6.0-build-status-with-6.2.patch | 27 + ...rkflows-Retain-artifacts-for-90-days.patch | 18 + ...l2-codec-Add-profile-level-ctrls-to-.patch | 121 + ...plane-Add-support-for-YUV444-formats.patch | 53 + ...ulate-bpc-based-on-max_requested_bpc.patch | 29 + ...bindings-ak7375-Convert-to-DT-schema.patch | 87 + ...edia-dt-bindings-ak7375-Add-supplies.patch | 47 + ...-i2c-ak7375-Add-regulator-management.patch | 108 + ...-dtoverlays-Add-VCM-option-to-imx519.patch | 151 + ...MX519-support-to-camera-mux-overlays.patch | 246 + ...m2835_codec-Ignore-READ_ONLY-ctrls-i.patch | 181 + ...x-Rpi-PROTO-and-audioinjector.net-Pi.patch | 36 + ...erlays-Add-VCM-option-to-Arducam64MP.patch | 151 + ...rducam64MP-support-to-camera-mux-ove.patch | 251 + ...sitronix-st7701-Support-SPI-config-a.patch | 555 + ...ys-Remove-lirc-rpi-from-media-center.patch | 101 + ...53x-Fix-a-typos-in-the-pcal-variants.patch | 64 + ...p3422-Add-correct-compatible-strings.patch | 28 + ...u1977-Add-correct-compatible-strings.patch | 32 + ...-vendor-qualified-compatible-strings.patch | 155 + ...a-i2c-Declare-of-MODULE_DEVICE_TABLE.patch | 23 + ...53x-Add-ti-tca9554-compatible-string.patch | 20 + ...hwmon-aht10-Add-DT-compatible-string.patch | 29 + ...mon-ds1621-Add-DT-compatible-strings.patch | 29 + ...-Add-DT-compatible-string-for-ds3234.patch | 29 + ...hwmon-sht3x-Add-DT-compatible-string.patch | 32 + ...ght-tsl4531-Add-DT-compatible-string.patch | 29 + ...ht-veml6070-Add-DT-compatible-string.patch | 29 + ...-love-checkpatch-so-add-it-to-the-CI.patch | 46 + ...tandardise-on-the-upstream-LED-names.patch | 262 + ...-bcm2711-rpi-400-Restore-the-ACT-LED.patch | 64 + ...711-rpi-400-Add-dummy-cam1-regulator.patch | 26 + ...-vc4-kms-fkms-v3d-Raise-CMA-to-512MB.patch | 37 + ...-Sensor-should-report-RAW-color-spac.patch | 33 + ...-Correct-the-minimum-vblanking-value.patch | 26 + ...-make-HBLANK-r-w-to-allow-longer-exp.patch | 105 + ...ertise-embedded-data-node-on-media-p.patch | 356 + ...ecessary-and-harmful-HDMI-RGB-format.patch | 37 + ...a-i2c-Add-IMX296-CMOS-sensor-binding.patch | 145 + ...edia-i2c-IMX296-camera-sensor-driver.patch | 1240 + ...a-i2c-imx296-Get-sensor-crop-working.patch | 35 + ...6-Disable-binning-for-colour-variant.patch | 32 + ...imx296-Add-helper-for-hblank-control.patch | 84 + ...-i2c-imx296-Set-a-1-frame-gain-delay.patch | 25 + ...-Add-horizontal-vertical-flip-suppor.patch | 150 + ...ia-i2c-imx296-Adjust-cropping-limits.patch | 28 + ...-off-rather-than-busy-spinning-when-.patch | 33 + ...edia-i2c-Add-PDAF-support-for-IMX519.patch | 427 + ...educe-the-link-frequencies-of-IMX519.patch | 23 + ...c-imx708-Fix-WIDE_DYNAMIC_RANGE-cont.patch | 94 + ...dd-explicit-fb_deferred_io_mmap-hook.patch | 26 + ...rng-bcm2835-sleep-more-intelligently.patch | 66 + ...m2835_codec-Set-MPEG2_LEVEL-control-.patch | 24 + ...codec-Add-V4L2_CID_MPEG_VIDEO_B_FRAM.patch | 49 + ...codec-Add-support-for-V4L2_CID_MPEG_.patch | 70 + ...nverted-override-property-to-ssd1306.patch | 38 + ...1-media-i2c-imx290-Reset-to-upstream.patch | 1002 + ...-Use-device-lock-for-the-control-han.patch | 30 + ...-Print-error-code-when-I2C-transfer-.patch | 40 + ...-Replace-macro-with-explicit-ARRAY_S.patch | 53 + ...mx290-Drop-imx290_write_buffered_reg.patch | 67 + ...6-media-i2c-imx290-Drop-regmap-cache.patch | 27 + ...mx290-Specify-HMAX-values-in-decimal.patch | 54 + ...290-Support-variable-sized-registers.patch | 431 + ...ia-i2c-imx290-Correct-register-sizes.patch | 98 + ...-Simplify-error-handling-when-writin.patch | 200 + ...c-imx290-Define-more-register-macros.patch | 294 + ...i2c-imx290-Add-exposure-time-control.patch | 70 + ...-media-i2c-imx290-Fix-max-gain-value.patch | 52 + ...-Split-control-initialization-to-sep.patch | 150 + ...-Implement-HBLANK-and-VBLANK-control.patch | 83 + ...-Create-controls-for-fwnode-properti.patch | 47 + ...-Move-registers-with-fixed-value-to-.patch | 69 + ...-Factor-out-format-retrieval-to-sepa.patch | 64 + ...0-Add-crop-selection-targets-support.patch | 136 + ...-Replace-GAIN-control-with-ANALOGUE_.patch | 38 + ...c-imx290-Group-functions-in-sections.patch | 714 + ...-Factor-out-subdev-init-and-cleanup-.patch | 235 + ...-Factor-out-control-update-code-to-a.patch | 78 + ...x290-Access-link_freq_index-directly.patch | 49 + ...-Pass-format-and-mode-to-imx290_calc.patch | 83 + ...-Compute-pixel-rate-and-blanking-in-.patch | 131 + ...-Factor-out-black-level-setting-to-a.patch | 131 + ...-Factor-out-DT-parsing-to-separate-f.patch | 202 + ...9-media-i2c-imx290-Use-dev_err_probe.patch | 56 + ...-Factor-out-clock-initialization-to-.patch | 113 + ...-imx290-Use-V4L2-subdev-active-state.patch | 398 + ...-Rename-extend-and-expand-usage-of-i.patch | 258 + ...2c-imx290-Use-runtime-PM-autosuspend.patch | 132 + ...-Initialize-runtime-PM-before-subdev.patch | 172 + ...0-Configure-data-lanes-at-start-time.patch | 41 + ...mx290-Simplify-imx290_set_data_lanes.patch | 59 + ...-Handle-error-from-imx290_set_data_l.patch | 34 + ...indings-Reset-imx290.txt-to-upstream.patch | 30 + ...-bindings-Convert-imx290.txt-to-YAML.patch | 230 + ...s-media-i2c-Add-mono-version-to-IMX2.patch | 69 + ...s-media-i2c-Add-imx327-version-to-IM.patch | 29 + ...-Make-use-of-get_unaligned_le24-put_.patch | 52 + ...-Use-device_property_read_u32-direct.patch | 31 + ...-Add-support-for-the-mono-sensor-var.patch | 216 + ...-Match-kernel-coding-style-on-whites.patch | 66 + ...-Set-the-colorspace-fields-in-the-fo.patch | 32 + ...-Add-V4L2_SUBDEV_FL_HAS_EVENTS-and-s.patch | 66 + ...90-Fix-the-pixel-rate-at-148.5Mpix-s.patch | 89 + ...90-Support-60fps-in-2-lane-operation.patch | 71 + ...290-Use-CSI-timings-as-per-datasheet.patch | 193 + ...-Convert-V4L2_CID_HBLANK-to-read-wri.patch | 134 + ...-Convert-V4L2_CID_VBLANK-to-read-wri.patch | 177 + ...ia-i2c-imx290-VMAX-is-mode-dependent.patch | 82 + ...-Remove-duplicated-write-to-IMX290_C.patch | 33 + ...-Add-support-for-74.25MHz-external-c.patch | 274 + ...i2c-imx290-Add-support-for-H-V-Flips.patch | 176 + ...-Add-the-error-code-to-logs-in-start.patch | 72 + ...mx290-Add-support-for-imx327-variant.patch | 122 + ...e-compatible-strings-for-imx290-327-.patch | 92 + ...ncel-deferred-work-if-pagelist-empty.patch | 36 + ...d-add-the-endpoint-context-in-xhci_f.patch | 30 + ...x708-Increase-usable-link-frequencie.patch | 224 + ...ink-frequency-parameter-for-the-Sony.patch | 36 + ...-imx708-Remove-unused-control-fields.patch | 49 + ...x708-Tidy-ups-to-address-upstream-re.patch | 191 + ...a-i2c-Replace-IMX708-sensor-binding-.patch | 282 + ...w-the-standard-devicetree-labels-for.patch | 34 + ...x708-Follow-the-standard-devicetree-.patch | 96 + ...708-Put-HFLIP-and-VFLIP-controls-in-.patch | 41 + ...icam-Start-and-stop-media_pipeline-w.patch | 43 + ...sm-Avoid-truncation-of-delay-jiffies.patch | 26 + ...codec-Add-missing-alignment-for-V4L2.patch | 26 + ...s-bcm27xx-Add-i2c_arm-vc-and-friends.patch | 166 + ...50-0684-overlays-Add-pcf857x-support.patch | 80 + ...85-overlays-Add-gpio-charger-support.patch | 93 + ...-Scale-the-pixel-clock-rate-for-the-.patch | 129 + ...d-calls-to-initialise-of-cooling-map.patch | 54 + ...nel-driver-for-Waveshare-DSI-touchsc.patch | 461 + ...-option-to-poll-instead-of-relying-o.patch | 139 + ...n-overlay-for-the-Waveshare-DSI-scre.patch | 190 + ...rlays-mipi-dbi-spi-fix-default-brigh.patch | 30 + ...verrides-for-alternate-i2c-buses-to-.patch | 116 + ...verrides-for-alternate-i2c-buses-to-.patch | 88 + ...0694-fixup-Export-optimised-__memcpy.patch | 27 + ...ange-OF-properties-pwm-min-pwm-max-t.patch | 69 + ...e-i2c-fan-pwm-max-min-overrides-to-u.patch | 26 + ...-drm-vc4-Limit-max_bpc-to-8-on-Pi0-3.patch | 37 + ...al-8250-Add-NOMSI-bug-for-bcm2835aux.patch | 103 + ...ci_sync-Add-fallback-bd-address-prop.patch | 41 + ...oth-hci_bcm-Add-more-invalid-BDADDRs.patch | 44 + ...-dts-bcm27xx-Enable-kernel-Bluetooth.patch | 196 + ...ate-miniuart-bt-now-krnbt-is-default.patch | 181 + ...dts-bcm2711-Add-extra-serial-aliases.patch | 164 + ...bcm2835-Workaround-for-edge-IRQ-loss.patch | 67 + ...gfs-end-points-to-query-GPU-usage-st.patch | 493 + ...bcm2711-rpi-ds-Group-the-common-pins.patch | 693 + ...-bcm2711-rpi-ds-Set-default-I-O-pins.patch | 84 + ...cm2711-Remove-I-O-pinctrl-references.patch | 207 + ...M-dts-bcm27xx-Correct-the-dma-ranges.patch | 89 + ...Derive-slave-DMA-addresses-correctly.patch | 73 + ...5-i2s-Use-phys-addresses-for-DAI-DMA.patch | 65 + ...-phys-addresses-for-slave-DMA-config.patch | 48 + ...-phys-addresses-for-slave-DMA-config.patch | 51 + ...-phys-addresses-for-slave-DMA-config.patch | 51 + ...2709-10-Retain-the-system-timer-node.patch | 59 + ...5-sdhost-Use-DT-to-configure-logging.patch | 45 + ...se-phys-addresses-for-slave-DMA-conf.patch | 54 + ...-phys-addresses-for-slave-DMA-config.patch | 60 + ...-phys-addresses-for-slave-DMA-config.patch | 86 + ...720-ARM-dts-bcm2711-rpi-Add-i2s_dma4.patch | 96 + ...cm2835-mmc-Really-use-phys-addresses.patch | 23 + ...5-Fix-position-reporting-for-40-bits.patch | 55 + ...5-Use-to_bcm2711_cbaddr-where-releva.patch | 25 + ...5-Fix-descriptors-usage-for-40-bits-.patch | 115 + ...-bcm2835-dma-Fix-WAIT_RESP-on-memcpy.patch | 25 + ...ma-Fix-dma_abort-for-40-bit-channels.patch | 78 + ...Fix-dma_abort-for-non-40bit-channels.patch | 68 + ...pport-dma-flags-for-multi-beat-burst.patch | 96 + ...-to-keep-PROT-bits-set-in-CS-on-40bi.patch | 77 + ...witch-to-dma40-channel-for-hdmi-audi.patch | 58 + ...dmi-Increase-MAI-fifo-dreq-threshold.patch | 50 + ...bcm2711-rpi-Set-a-1GB-ZONE_DMA-limit.patch | 41 + ...s-bcm27xx-Add-stdout-path-to-serial0.patch | 39 + ...-Only-read-data-for-number-of-points.patch | 58 + ...bcm2835-Flush-FIFOs-cleanly-on-error.patch | 45 + ...ot-abort-transfers-on-ERR-if-still-a.patch | 28 + ...c-bcm2835-Implement-I2C_M_IGNORE_NAK.patch | 61 + ...tibility-hack-should-be-X86-specific.patch | 48 + ...0739-bcm2835-dma-Fixes-for-dma_abort.patch | 154 + ...-definition-of-PROT-bits-to-expected.patch | 33 + ...media-imx296-Disable-2x2-binned-mode.patch | 68 + ...ix-st7701-Fix-panel-prepare-over-SPI.patch | 37 + .../960-hwrng-iproc-set-quality-to-1000.patch | 25 + 745 files changed, 241998 insertions(+), 1 deletion(-) create mode 100644 target/linux/bcm27xx/patches-6.1/950-0001-Support-RPi-DPI-interface-in-mode6-for-18-bit-color.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0002-drm-vc4-Add-FKMS-as-an-acceptable-node-for-dma-range.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0003-drm-vc4-Add-the-2711-HVS-as-a-suitable-DMA-node.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0004-drm-vc4-Change-the-default-DPI-format-to-being-18bpp.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0005-drm-atomic-Don-t-fixup-modes-that-haven-t-been-reset.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0006-drm-vc4-Fix-timings-for-VEC-modes.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0007-drm-vc4-Fix-definition-of-PAL-M-mode.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0008-drm-vc4-Add-support-for-more-analog-TV-standards.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0009-drm-vc4-Allow-setting-the-TV-norm-via-module-paramet.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0010-drm-vc4-Refactor-mode-checking-logic.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0011-drm-vc4-Add-firmware-kms-mode.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0012-drm-vc4-Add-support-for-gamma-on-BCM2711.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0013-drm-vc4-Add-debugfs-node-that-dumps-the-vc5-gamma-PW.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0014-drm-vc4-hvs-Force-modeset-on-gamma-lut-change.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0015-drm-vc4-Relax-VEC-modeline-requirements-and-add-prog.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0016-drm-vc4-Make-VEC-progressive-modes-readily-accessibl.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0017-drm-Check-whether-the-gamma-lut-has-changed-before-u.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0018-drm-vc4-Enable-gamma-block-only-when-required.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0019-drm-vc4-Only-add-gamma-properties-once.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0020-drm-vc4-Validate-the-size-of-the-gamma_lut.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0021-drm-vc4-Disable-Gamma-control-on-HVS5-due-to-issues-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0022-drm-vc4_hdmi-Add-Broadcast-RGB-property-to-allow-ove.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0023-drm-vc4-Add-DRM-210101010-RGB-formats-for-hvs5.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0024-drm-vc4-dpi-Support-DPI-interface-in-mode3-for-RGB56.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0025-drm-panel-Add-and-initialise-an-orientation-field-to.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0026-drm-dsi-Document-the-meaning-and-spec-references-for.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0027-drm-bridge-tc358762-Ignore-EPROBE_DEFER-when-logging.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0028-drm-vc4-Rename-bridge-to-out_bridge.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0029-drm-vc4-Move-DSI-initialisation-to-encoder_mode_set.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0030-drm-vc4-Remove-splitting-the-bridge-chain-from-the-d.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0031-drm-vc4-Convert-vc4_dsi-to-use-atomic-enable-disable.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0032-drm-vc4-Convert-vc4_dsi-to-using-a-bridge-instead-of.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0033-drm-vc4-Remove-entry-to-ULPS-from-vc4_dsi-post_disab.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0034-drm-bridge-Introduce-pre_enable_upstream_first-to-al.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0035-drm-panel-Add-prepare_upstream_first-flag-to-drm_pan.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0036-drm-Include-drm_connector.h-from-drm_panel.h.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0037-drm-tc358762-Set-the-pre_enable_upstream_first-flag-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0038-drm-vc4-Support-zpos-on-all-planes.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0039-drm-vc4-hdmi-Add-CSC-for-BT601-709-2020-limited-and-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0040-vc4-drm-vc4_plane-Keep-fractional-source-coords-insi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0041-vc4-drm-Handle-fractional-coordinates-using-the-phas.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0042-drm-Add-chroma-siting-properties.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0043-vc4-drm-plane-Make-use-of-chroma-siting-parameter.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0044-drm-vc4-Force-trigger-of-dlist-update-on-margins-cha.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0045-drm-atomic-helpers-remove-legacy_cursor_update-hacks.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0046-drm-vc4_hdmi-Force-a-modeset-when-Broadcast-RGB-sett.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0047-drm-atomic-If-margins-are-updated-update-all-planes.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0048-drm-vc4-hvs-Ignore-atomic_flush-if-we-re-disabled.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0049-drm-vc4-0-is-a-valid-value-for-pixel_order_hvs5-so-f.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0050-drm-vc4-Omit-pixel_order-from-the-hvs_format-for-hvs.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0051-drm-vc4-Add-3-3-2-and-4-4-4-4-RGB-RGBX-RGBA-formats.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0052-drm-vc4-Add-comments-for-which-HVS_PIXEL_ORDER_xxx-d.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0053-drm-vc4-Add-async-update-support-for-cursor-planes.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0054-drm-vc4-Configure-the-HVS-COB-allocations.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0055-drm-vc4-Set-AXI-panic-modes-for-the-HVS.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0056-drm-vc4-hvs-Skip-DebugFS-Registration-for-FKMS.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0057-media-uapi-Add-some-RGB-bus-formats-for-VC4-DPI-outp.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0058-raspberrypi-firmware-Update-mailbox-commands.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0059-clk-bcm-rpi-Create-helper-to-retrieve-private-data.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0060-arm64-setup-Fix-build-warning.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0061-BCM2708-Add-core-Device-Tree-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0062-clk-raspberrypi-Add-ISP-to-exported-clocks.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0063-Register-the-clocks-early-during-the-boot-process-so.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0064-clk-bcm2835-Mark-used-PLLs-and-dividers-CRITICAL.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0065-clk-bcm2835-Add-claim-clocks-property.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0066-clk-bcm2835-Read-max-core-clock-from-firmware.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0067-clk-clk-bcm2835-Use-zd-when-printing-size_t.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0068-clk-bcm2835-Don-t-wait-for-pllh-lock.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0069-clk-bcm2835-Add-support-for-setting-leaf-clock-rates.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0070-clk-bcm2835-Allow-reparenting-leaf-clocks-while-they.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0071-clk-bcm2835-Avoid-null-pointer-exception.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0072-clk-bcm2835-Disable-v3d-clock.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0073-clk-bcm2835-Pass-DT-node-to-rpi_firmware_get.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0074-clk-bcm2835-Remove-VEC-clock-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0075-arm-partially-revert-702b94bff3c50542a6e4ab9a4f4cef0.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0076-cache-export-clean-and-invalidate.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0077-Revert-spi-spidev-Fix-CS-polarity-if-GPIO-descriptor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0078-Revert-Bluetooth-Always-request-for-user-confirmatio.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0079-Revert-Bluetooth-Always-request-for-user-confirmatio.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0080-Revert-net-bcmgenet-Request-APD-DLL-disable-and-IDDQ.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0081-smsx95xx-fix-crimes-against-truesize.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0082-smsc95xx-Experimental-Enable-turbo_mode-and-packetsi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0083-Allow-mac-address-to-be-set-in-smsc95xx.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0084-cgroup-Disable-cgroup-memory-by-default.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0085-Protect-__release_resource-against-resources-without.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0086-irq-bcm2836-Avoid-Invalid-trigger-warning.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0087-irqchip-bcm2835-Add-FIQ-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0088-irqchip-irq-bcm2835-Add-2836-FIQ-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0089-spi-spidev-Completely-disable-the-spidev-warning.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0090-dmaengine-bcm2835-Load-driver-early-and-support-lega.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0091-rtc-Add-SPI-alias-for-pcf2123-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0092-watchdog-bcm2835-Support-setting-reboot-partition.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0093-reboot-Use-power-off-rather-than-busy-spinning-when-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0094-bcm-Make-RASPBERRYPI_POWER-depend-on-PM.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0095-bcm2835-rng-Avoid-initialising-if-already-enabled.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0096-sound-Demote-deferral-errors-to-INFO-level.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0097-Update-vfpmodule.c.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0098-i2c-bcm2835-Add-debug-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0099-irqchip-irq-bcm2836-Remove-regmap-and-syscon-use.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0100-lan78xx-Enable-LEDs-and-auto-negotiation.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0101-amba_pl011-Insert-mb-for-correct-FIFO-handling.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0102-amba_pl011-Add-cts-event-workaround-DT-property.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0103-tty-amba-pl011-Avoid-rare-write-when-full-error.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0104-pinctrl-bcm2835-Set-base-to-0-give-expected-gpio-num.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0105-Main-bcm2708-bcm2709-linux-port.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0106-Add-dwc_otg-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0107-bcm2708-framebuffer-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0108-Pulled-in-the-multi-frame-buffer-support-from-the-Pi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0109-fbdev-add-FBIOCOPYAREA-ioctl.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0110-dmaengine-Add-support-for-BCM2708.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0111-MMC-added-alternative-MMC-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0112-Adding-bcm2835-sdhost-driver-and-an-overlay-to-enabl.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0113-vc_mem-Add-vc_mem-driver-for-querying-firmware-memor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0114-Add-dev-gpiomem-device-for-rootless-user-GPIO-access.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0115-Add-SMI-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0116-Add-Chris-Boot-s-i2c-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0117-char-broadcom-Add-vcio-module.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0118-firmware-bcm2835-Support-ARCH_BCM270x.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0119-leds-Add-the-input-trigger-for-pwr_led.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0120-Added-Device-IDs-for-August-DVB-T-205.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0121-Improve-__copy_to_user-and-__copy_from_user-performa.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0122-gpio-poweroff-Allow-it-to-work-on-Raspberry-Pi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0123-mfd-Add-Raspberry-Pi-Sense-HAT-core-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0124-Add-support-for-all-the-downstream-rpi-sound-card-dr.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0125-rpi_display-add-backlight-driver-and-overlay.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0126-bcm2835-virtgpio-Virtual-GPIO-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0127-OF-DT-Overlay-configfs-interface.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0128-hci_h5-Don-t-send-conf_req-when-ACTIVE.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0129-ARM64-Round-Robin-dispatch-IRQs-between-CPUs.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0130-ARM64-Force-hardware-emulation-of-deprecated-instruc.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0131-AXI-performance-monitor-driver-2222.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0132-ARM-bcm2835-Set-Serial-number-and-Revision.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0133-dwc-otg-FIQ-Fix-bad-mode-in-data-abort-handler.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0134-ARM-Activate-FIQs-to-avoid-__irq_startup-warnings.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0135-i2c-gpio-Also-set-bus-numbers-from-reg-property.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0136-added-capture_clear-option-to-pps-gpio-via-dtoverlay.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0137-lan78xx-Read-initial-EEE-status-from-DT.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0138-hid-Reduce-default-mouse-polling-interval-to-60Hz.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0139-Add-ability-to-export-gpio-used-by-gpio-poweroff.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0140-firmware-raspberrypi-Notify-firmware-of-a-reboot.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0141-irqchip-irq-bcm2835-Calc.-FIQ_START-at-boot-time.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0142-net-lan78xx-Disable-TCP-Segmentation-Offload-TSO.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0143-lan78xx-Move-enabling-of-EEE-into-PHY-init-code.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0144-cxd2880-CXD2880_SPI_DRV-should-select-DVB_CXD2880-wi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0145-firmware-raspberrypi-Add-backward-compatible-get_thr.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0146-sc16is7xx-Don-t-spin-if-no-data-received.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0147-drivers-thermal-step_wise-add-support-for-hysteresis.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0148-drivers-thermal-step_wise-avoid-throttling-at-hyster.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0149-Update-issue-templates-2736.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0150-net-lan78xx-Support-auto-downshift-to-100Mb-s.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0151-firmware-raspberrypi-Report-the-fw-variant-during-pr.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0152-lan78xx-Debounce-link-events-to-minimize-poll-storm.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0153-lan78xx-EEE-support-is-now-a-PHY-property.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0154-bcm2835-dma-Add-support-for-per-channel-flags.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0155-rtc-rv3028-Add-backup-switchover-mode-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0156-media-tc358743-Increase-FIFO-level-to-374.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0157-media-tc358743-Add-support-for-972Mbit-s-link-freq.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0158-media-tc358743-Check-I2C-succeeded-during-probe.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0159-media-adv7180-Default-to-the-first-valid-input.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0160-media-adv7180-Add-YPrPb-support-for-ADV7282M.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0161-media-videodev2-Add-helper-defines-for-printing-FOUR.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0162-dt-bindings-Document-BCM283x-CSI2-CCP2-receiver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0163-MAINTAINERS-Add-entry-for-BCM2835-Unicam-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0164-media-tc358743-Return-an-appropriate-colorspace-from.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0165-staging-mmal-vchiq-Avoid-use-of-bool-in-structures.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0166-staging-mmal-vchiq-Add-support-for-event-callbacks.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0167-staging-vc04_services-Support-sending-data-to-MMAL-p.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0168-media-videobuf2-Allow-exporting-of-a-struct-dmabuf.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0169-staging-mmal-vchiq-Fix-client_component-for-64-bit-k.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0170-staging-mmal_vchiq-Add-in-the-Bayer-encoding-formats.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0171-staging-mmal-vchiq-Update-mmal_parameters.h-with-rec.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0172-staging-mmal-vchiq-Free-the-event-context-for-contro.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0173-staging-mmal-vchiq-Fix-memory-leak-in-error-path.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0174-w1-w1-gpio-Make-GPIO-an-output-for-strong-pullup.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0175-arm-bcm2835-Fix-FIQ-early-ioremap.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0176-arm-bcm2835-DMA-can-only-address-1GB.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0177-hwrng-iproc-rng200-Add-BCM2838-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0178-bcmgenet-constrain-max-DMA-burst-length.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0179-bcmgenet-Better-coalescing-parameter-defaults.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0180-net-genet-enable-link-energy-detect-powerdown-for-ex.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0181-usb-add-plumbing-for-updating-interrupt-endpoint-int.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0182-xhci-implement-xhci_fixup_endpoint-for-interval-adju.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0183-usbhid-call-usb_fixup_endpoint-after-mangling-interv.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0184-arm-bcm2835-Add-bcm2838-compatible-string.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0185-i2c-bcm2835-Set-clock-stretch-timeout-to-35ms.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0186-drm-v3d-Clock-V3D-down-when-not-in-use.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0187-drivers-char-add-chardev-for-mmap-ing-the-RPiVid-con.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0188-hid-usb-Add-device-quirks-for-Freeway-Airmouse-T3-an.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0189-net-bcmgenet-Workaround-2-for-Pi4-Ethernet-fail.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0190-xhci-Use-more-event-ring-segment-table-entries.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0191-arch-arm-Add-model-string-to-cpuinfo.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0192-arch-arm64-Add-Revision-Serial-Model-to-cpuinfo.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0193-media-i2c-imx258-Support-for-the-Sony-IMX258-sensor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0194-media-i2c-imx290-Support-for-the-Sony-IMX290-sensor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0195-media-i2c-imx477-Support-for-the-Sony-IMX477-sensor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0196-media-i2c-imx519-Support-for-the-Sony-IMX519-sensor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0197-Documentation-devicetree-Add-documentation-for-imx37.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0198-v4l2-Add-a-Greyworld-AWB-mode.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0199-staging-bcm2835-camera-Add-greyworld-AWB-mode.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0200-media-v4l2-Add-Greyworld-AWB-control-name.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0201-staging-bcm2835-camera-Fix-the-cherry-pick-of-AWB-Gr.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0202-ARM-bcm-Switch-board-clk-and-pinctrl-to-bcm2711-comp.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0203-dt-bindings-Add-binding-for-the-Infineon-IRS1125-sen.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0204-media-i2c-Add-a-driver-for-the-Infineon-IRS1125-dept.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0205-drm-v3d-Suppress-all-but-the-first-MMU-error.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0206-drm-v3d-Plug-dma_fence-leak.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0207-staging-vchiq_arm-Register-vcsm-cma-as-a-platform-dr.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0208-staging-vchiq_arm-Register-bcm2835-codec-as-a-platfo.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0209-net-phy-2711-Allow-ethernet-LED-mode-to-be-set-via-d.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0210-v3d_drv-Handle-missing-clock-more-gracefully.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0211-v3d_gem-Kick-the-clock-so-firmware-knows-we-are-usin.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0212-clk-raspberrypi-Allow-cpufreq-driver-to-also-adjust-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0213-staging-vchiq_arm-Set-up-dma-ranges-on-child-devices.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0214-staging-vchiq-Use-the-old-dma-controller-for-OF-conf.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0215-ARM-bcm-Backport-BCM2711-support-from-upstream.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0216-Initialise-rpi-firmware-before-clk-bcm2835.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0217-staging-vchiq_arm-Give-vchiq-children-DT-nodes.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0218-pinctrl-bcm2835-Remove-gpiochip-on-error.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0219-video-fbdev-bcm2708_fb-Use-common-compat-header.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0220-of-overlay-Correct-symbol-path-fixups.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0221-dt-bindings-pci-Add-DT-docs-for-Brcmstb-PCIe-device.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0222-bcmgenet-Disable-skip_umac_reset-by-default.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0223-media-videodev2.h-Add-a-format-for-column-YUV4-2-0-m.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0224-media-dt-bindings-media-Add-binding-for-the-Raspberr.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0225-RFC-media-Add-media_request_-pin-unpin-API.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0226-staging-media-rpivid-Add-Raspberry-Pi-V4L2-H265-deco.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0227-spi-Force-CS_HIGH-if-GPIO-descriptors-are-used.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0228-media-uapi-v4l2-core-Add-sensor-ancillary-data-V4L2-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0229-media-uapi-Add-MEDIA_BUS_FMT_SENSOR_DATA-media-bus-f.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0230-media-uapi-v4l2-core-Add-ISP-statistics-output-V4L2-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0231-media-uapi-v4l-ctrls-Add-CID-base-for-the-bcm2835-is.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0232-staging-vchiq-Load-bcm2835_isp-driver-from-vchiq.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0233-bcm2835-dma-Add-proper-40-bit-DMA-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0234-media-i2c-tc358743-Fix-fallthrough-warning.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0235-video-bcm2708_fb-Disable-FB-if-no-displays-found.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0236-staging-vc04_services-mmal-vchiq-Update-parameters-l.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0237-staging-vc04_services-bcm2835-camera-Request-headers.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0238-zswap-Defer-zswap-initialisation.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0239-gpiolib-Don-t-prevent-IRQ-usage-of-output-GPIOs.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0240-PCI-brcmstb-Add-DT-property-to-control-L1SS.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0241-media-irs1125-Using-i2c_transfer-for-ic2-reads.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0242-media-irs1125-Refactoring-and-debug-messages.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0243-media-irs1125-Atomic-access-to-imager-reconfiguratio.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0244-media-irs1125-Keep-HW-in-sync-after-imager-reset.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0245-media-bcm2835-unicam-Driver-for-CCP2-CSI2-camera-int.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0246-media-bcm2835-unicam-Kconfig-Makefile-for-CCP2-CSI2-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0247-media-bcm2835-unicam-Add-support-for-get_mbus_config.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0248-media-bcm2835-unicam-Avoid-gcc-warning-over-0-on-end.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0249-serial-8250-bcm2835aux-defer-if-clock-is-zero.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0250-media-Add-a-pixel-format-for-MIPI-packed-12bit-luma-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0251-media-Add-a-pixel-format-for-MIPI-packed-14bit-luma-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0252-media-bcm2835-unicam-Add-support-for-12bit-mono-pack.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0253-media-bcm2835-unicam-Add-support-for-14bit-mono-sour.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0254-media-bcm2835-unicam-Add-support-for-unpacked-14bit-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0255-bcm2835-dma-Add-NO_WAIT_RESP-flag.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0256-media-bcm2835-unicam-Reinstate-V4L2_CAP_READWRITE-in.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0257-media-bcm2835-unicam-Ensure-type-is-VIDEO_CAPTURE-in.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0258-media-bcm2835-unicam-Set-VPU-min-clock-freq-to-250Mh.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0259-dt-bindings-bcm2835-unicam-Update-documentation-with.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0260-leds-Add-the-actpwr-trigger.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0261-bcm2835-dma-Advertise-the-full-DMA-range.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0262-media-bcm2835-unicam-Drop-WARN-on-uing-direct-cache-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0263-media-i2c-tc358743-Only-allow-supported-pixel-fmts-i.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0264-media-bcm2835-unicam-Always-service-interrupts.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0265-media-bcm2835-unicam-Fix-uninitialized-warning.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0266-media-bcm2835-unicam-Fixup-review-comments-from-Hans.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0267-media-bcm2835-unicam-Retain-packing-information-on-G.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0268-media-bcm2835-unicam-change-minimum-number-of-vb2_qu.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0269-staging-fbtft-Add-support-for-display-variants.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0270-net-bcmgenet-Reset-RBUF-on-first-open.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0271-char-Add-broadcom-char-drivers-back-to-build-files.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0272-staging-bcm2835-camera-Replace-deprecated-V4L2_PIX_F.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0273-staging-vc04_services-Add-new-vc-sm-cma-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0274-staging-vchiq-mmal-Add-support-for-14bit-Bayer.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0275-staging-mmal-vchiq-Add-monochrome-image-formats.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0276-staging-mmal-vchiq-Use-vc-sm-cma-to-support-zero-cop.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0277-staging-vc04_services-Add-a-V4L2-M2M-codec-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0278-bcm2835-dma-only-reserve-channel-0-if-legacy-dma-dri.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0279-uapi-bcm2835-isp-Add-bcm2835-isp-uapi-header-file.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0280-staging-vc04_services-ISP-Add-a-more-complex-ISP-pro.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0281-gpio-Add-gpio-fsm-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0282-rpisense-fb-Set-pseudo_pallete-to-prevent-crash-on-f.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0283-bcm2708_fb-Fix-a-build-warning.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0284-watchdog-bcm2835-Ignore-params-after-the-partition-n.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0285-firmware-raspberrypi-Add-support-for-tryonce-reboot-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0286-phy-broadcom-split-out-the-BCM54213PE-from-the-BCM54.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0287-phy-broadcom-Add-bcm54213pe-configuration.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0288-PCI-brcmstb-Restore-initial-fundamental-reset.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0289-Input-edt-ft5x06-Poll-the-device-if-no-interrupt-is-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0290-drm-panel-raspberrypi-touchscreen-Use-independent-I2.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0291-drm-panel-raspberrypi-ts-Insert-delay-before-polling.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0292-dt-bindings-Add-compatible-for-BCM2711-DSI1.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0293-media-bcm2835-unicam-Correctly-handle-error-propagat.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0294-media-bcm2835-unicam-Return-early-from-stop_streamin.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0295-media-bcm2835-unicam-Clear-clock-state-when-stopping.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0296-PCI-brcmstb-Advertise-MSI-X-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0297-net-lan78xx-Ack-pending-PHY-ints-when-resetting.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0298-vc-sm-cma-fixed-kbuild-problem.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0299-staging-vc04_services-Add-additional-unpacked-raw-fo.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0300-staging-bcm2835-isp-Add-the-unpacked-16bpp-raw-forma.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0301-staging-bcm2835-isp-Log-the-number-of-excess-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0302-bcm2835-dma-Avoid-losing-CS-flags-after-interrupt.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0303-bcm2835-dma-Add-bcm2835-dma-Add-DMA_WIDE_SOURCE-and-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0304-uapi-bcm2835-isp-Add-colour-denoise-configuration.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0305-staging-vc04_services-ISP-Add-colour-denoise-control.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0306-spi-bcm2835-Workaround-fix-for-zero-length-transfers.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0307-kbuild-Silence-unavoidable-dtc-overlay-warnings.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0308-bcm2835-isp-Allow-formats-with-different-colour-spac.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0309-media-bcm2835-unicam-Fix-bug-in-buffer-swapping-logi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0310-Assign-crypto-aliases-to-different-AES-implementatio.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0311-media-v4l2_m2m-In-buffered-mode-run-jobs-if-either-p.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0312-media-i2c-add-ov9281-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0313-media-ov5647-Fix-return-codes-from-ov5647_write-ov56.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0314-media-i2c-ov5647-Parse-and-register-properties.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0315-staging-bcm2835-camera-Add-support-for-DMABUFs.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0316-staging-fbtft-Add-minipitft13-variant.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0317-drm-panel-jdi-lt070me05000-Use-gpiod_set_value_cansl.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0318-staging-bcm2835-camera-Add-support-for-H264-levels-4.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0319-staging-bcm2835-isp-Fix-compiler-warning.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0320-gpio-poweroff-Remember-the-old-poweroff-handler.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0321-media-i2c-ov5647-Correct-pixel-array-offset.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0322-media-i2c-ov5647-Correct-minimum-VBLANK-value.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0323-media-i2c-ov5647-Fix-v4l2-compliance-failure-subscri.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0324-staging-vc04_services-isp-Set-the-YUV420-YVU420-form.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0325-media-bcm2835-unicam-Forward-input-status-from-subde.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0326-media-i2c-ov7251-Add-fwnode-properties-controls.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0327-usb-xhci-workaround-for-bogus-SET_DEQ_PENDING-endpoi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0328-staging-vchiq_arm-Add-36-bit-address-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0329-staging-vchiq_arm-children-inherit-DMA-config.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0330-staging-vchiq_arm-Usa-a-DMA-pool-for-small-bulks.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0331-drm-panel-raspberrypi-touchscreen-Handle-I2C-errors.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0332-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0333-Input-edt-ft54x6-Clean-up-timer-and-workqueue-on-rem.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0334-staging-vchiq-mmal-Add-buffer-flags-for-interlaced-v.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0335-staging-vchiq-mmal-Add-parameters-for-interlaced-vid.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0336-staging-vchiq-mmal-Add-the-deinterlace-image-effects.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0337-Add-Raspberry-Pi-PoE-HAT-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0338-staging-mmal-vchiq-Rationalise-included-headers.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0339-staging-mmal-vchiq-Add-module-parameter-to-enable-lo.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0340-staging-mmal-vchiq-Reset-buffers_with_vpu-on-port_en.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0341-drivers-gpio-Add-a-driver-that-wraps-the-PWM-API-as-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0342-media-i2c-ov5647-Sensor-should-report-RAW-color-spac.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0343-vc04_services-isp-Report-input-node-as-wanting-full-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0344-media-bcm2835-unicam-Parse-pad-numbers-correctly.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0345-media-bcm2835-unicam-Add-support-for-configuration-v.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0346-staging-bcm2835-camera-Add-support-for-H264_MIN_QP-H.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0347-staging-bcm2835-camera-Add-support-for-MPEG_VIDEO_FO.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0348-media-i2c-ov5647-Support-HFLIP-and-VFLIP.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0349-drivers-bcm2835_isp-Allow-multiple-users-for-the-ISP.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0350-drivers-bcm2835_isp-Fix-div-by-0-bug.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0351-spi-spidev-Restore-loading-from-Device-Tree.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0352-input-edt-ft5x06-Handle-unreliable-TOUCH_UP-events.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0353-drivers-bcm2835_unicam-Add-logging-message-when-a-fr.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0354-regulator-rpi-panel-attiny-Don-t-read-the-LCD-power-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0355-input-edt-ft5x06-Only-look-at-the-number-of-points-r.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0356-rtc-pcf8523-Fix-oscillator-stop-bit-handling.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0357-drm-panel-simple-Populate-bpc-when-using-panel-dpi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0358-drm-panel-simple-Allow-the-bus-format-to-be-read-fro.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0359-xhci-quirks-add-link-TRB-quirk-for-VL805.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0360-xhci-correct-room_on_ring-for-cases-where-there-is-a.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0361-xhci-refactor-out-TRBS_PER_SEGMENT-define-in-runtime.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0362-usb-xhci-add-VLI_TRB_CACHE_BUG-quirk.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0363-media-i2c-ov5647-Add-support-for-regulator-control.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0364-media-i2c-ov7251-Make-the-enable-GPIO-optional.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0365-staging-bcm2835-isp-Fix-cleanup-after-init-fail.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0366-uapi-v4l2-controls-Reset-V4L2_CID_USER_BCM2835_ISP_B.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0367-media-i2c-ov9281-Increase-diff-between-VTS-and-max-e.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0368-Use-GitHubs-issue-form-for-bug-reports.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0369-bcm2835-v4l2-isp-Add-missing-lock-initialization.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0370-mfd-simple-mfd-i2c-Add-configuration-for-RPi-POE-HAT.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0371-pwm-raspberrypi-poe-Add-option-of-being-created-by-M.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0372-power-rpi-poe-Drop-CURRENT_AVG-as-it-is-not-hardware.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0373-power-rpi-poe-Add-option-of-being-created-by-MFD-or-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0374-drivers-bcm2835_unicam-Disable-trigger-mode-operatio.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0375-Extending-ili9881c-driver-support-for-nwe080-panel.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0376-media-bcm2835-unicam-Set-ret-on-error-path-in-unicam.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0377-media-i2c-ov9281-Initialize-id_msb-to-zero-in-ov9281.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0378-i2c-bcm2835-Make-clock-stretch-timeout-configurable.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0379-Patching-lan78xx-for-SOF_TIMESTAMPING_TX_SOFTWARE-su.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0380-media-uapi-Document-format-MEDIA_BUS_FMT_RGB565_1X24.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0381-dt-bindings-vendor-prefixes-Add-Geekworm.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0382-dt-bindings-display-simple-add-Geekworm-MZP280-Panel.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0383-drm-panel-simple-add-Geekworm-MZP280-Panel.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0384-drm-panel-simple-Remove-custom-handling-of-orientati.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0385-drm-panel-Add-panel-driver-for-Ilitek-ILI9806E-panel.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0386-drm-panel-Add-panel-driver-for-TDO-Y17B-based-panels.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0387-bindings-Add-sck-idle-input-to-spi-gpio.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0388-spi-gpio-Add-sck-idle-input-property.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0389-media-bcm2835-unicam-Handle-a-repeated-frame-start-w.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0390-usb-xhci-add-a-quirk-for-Superspeed-bulk-OUT-transfe.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0391-media-i2c-ov7251-Reinstate-setting-ov7251_global_ini.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0392-usb-xhci-rework-XHCI_VLI_SS_BULK_OUT_BUG-quirk.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0393-media-i2c-Add-driver-for-Omnivision-OV2311.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0394-staging-vc04_services-isp-Permit-all-sRGB-colour-spa.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0395-drivers-staging-bcm2835-isp-Do-not-cleanup-mmal-vcsm.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0396-dt-bindings-media-i2c-Add-binding-for-ad5398-VCM.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0397-media-i2c-Add-driver-for-AD5398-VCM-lens-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0398-media-i2c-ov5647-Use-v4l2_async_register_subdev_sens.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0399-media-i2c-Rename-ad5398-to-ad5398_vcm.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0400-drivers-staging-bcm2835-isp-Clear-LS-table-handle-in.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0401-mm-page_alloc-cma-introduce-a-customisable-threshold.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0402-pinctrl-bcm2835-Only-return-non-GPIOs-to-inputs.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0403-drm-panel-ilitek-ili9881c-Clean-up-on-mipi_dsi_attac.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0404-drm-panel-panel-ilitek9881c-Add-prepare_upstream_fir.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0405-clk-bcm2835-use-subsys_initcall-for-the-clock-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0406-tpm_tis_spi_main-Force-probe-routine-to-run-synchron.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0407-staging-vchiq_arm-Add-log_level-module-params.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0408-dt-bindings-vendor-prefixes-Add-Arducam.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0409-media-dt-bindings-media-i2c-Add-Arducam-Pivariety-Se.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0410-media-i2c-Add-driver-of-Arducam-Pivariety-series-cam.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0411-thermal-broadcom-Use-dev_err_probe-to-suppress-defer.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0412-dt-bindings-hwmon-add-microchip-emc2305.yaml-dt-bind.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0413-dtbindings-Fixup-microchip-emc2305.yaml-bindings.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0414-media-i2c-Update-ov2311-Kconfig-entry.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0415-media-i2c-Update-ov9281-Kconfig-entry.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0416-media-i2c-Update-irs1125-Kconfig-entry.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0417-media-i2c-arducam-pivariety-Fixup-for-mainline-API-c.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0418-mmc-block-Don-t-do-single-sector-reads-during-recove.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0419-vc04_services-vchiq-mmal-Add-defines-for-mmal_es_for.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0420-random-do-not-use-jump-labels-before-they-are-initia.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0421-drm-v3d-Switch-clock-setting-to-new-api.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0422-clk-raspberrypi-Enable-minimize-for-all-firmware-clo.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0423-media-dt-bindings-media-i2c-Add-Arducam-64MP-CMOS-se.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0424-media-i2c-Add-driver-of-Arducam-64MP-camera.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0425-media-i2c-arducam_64mp-Advertise-embedded-data-node-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0426-Add-HDMI1-facility-to-the-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0427-Populate-phy-driver-block-for-BCM54213PE.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0428-clk-bcm-rpi-Add-the-BCM283x-pixel-clock.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0429-media-i2c-ov9281-Correct-min-def-vts-for-640x400.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0430-media-i2c-ov9281-Change-exposure-default-value-with-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0431-media-bcm2835-unicam-Correctly-handle-FS-FE-ISR-cond.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0432-drm-panel-simple-hack-ignore-orientation.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0433-vc04_services-vc-sm-cma-Handle-upstream-require-vchi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0434-media-video-mux-Read-CSI2-config-from-FW-and-pass-to.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0435-media-i2c-arducam-pivariety-Add-custom-controls.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0436-media-bcm2835-unicam-Fix-for-possible-dummy-buffer-o.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0437-usb-xhci-expand-mitigations-for-VLI_SS_BULK_OUT_BUG-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0438-usb-xhci-account-for-num_trbs_free-when-invalidating.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0439-nvmem-Use-NVMEM_DEVID_AUTO.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0440-drm-panel-Rename-GEM-CMA-helpers-GEM-DMA-helpers.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0441-hwmon-emc2305-fixups-for-driver-submitted-to-mailing.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0442-media-bcm2835-unicam-Fix-up-start-stop-api-change.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0443-drivers-usb-dwc_otg-fix-reference-passing-when-check.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0444-drivers-gpu-drm-vc4-Add-missing-32-bit-RGB-formats.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0445-overlays-Add-i2c-sensor-support-for-AHT10.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0446-overlays-Add-README-entry-for-i2c-rtc-rv3032.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0447-drivers-dwc_otg-stop-GCC-from-patching-FIQ-functions.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0448-overlays-i2c-sensor-Add-mcp980x-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0449-overlays-pisound-Make-button-pins-owned-by-card.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0450-firmware-raspberrypi-Introduce-rpi_firmware_find_nod.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0451-firmware-raspberrypi-Move-the-clock-IDs-to-the-firmw.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0452-firmware-raspberrypi-Provide-a-helper-to-query-a-clo.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0453-drm-vc4-hdmi-Fix-hdmi_enable_4kp60-detection.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0454-drm-vc4-hdmi-Rework-hdmi_enable_4kp60-detection-code.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0455-drm-vc4-hdmi-Add-more-checks-for-4k-resolutions.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0456-drm-vc4-Make-sure-we-don-t-end-up-with-a-core-clock-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0457-net-phy-BCM54210PE-does-not-support-PTP.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0458-drm-vc4_hdmi-Allow-hotplug-detect-to-be-forced.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0459-overlays-i2c-sensor-Add-the-jc42-class-of-sensor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0460-overlays-Extend-audremap-to-supports-other-pins.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0461-media-adv7180-Nasty-hack-to-allow-input-selection.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0462-vc04_services-bcm2835_codec-Allow-larger-images-thro.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0463-imx296-overlay-clock-frequency-defaults-to-54MHz-but.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0464-ASoC-ma120x0p-Corrects-the-volume-level-display.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0465-overlays-Add-overlay-pwm1.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0466-overlays-audremap-Include-the-fsels-values.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0467-overlays-i2c-sensor-Make-smbus-timeout-disable-optio.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0468-overlays-Mention-Digi2-Pro-audio-card-in-README.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0469-usb-xhci-add-XHCI_VLI_HUB_TT_QUIRK.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0470-media-i2c-ov7251-Add-module-param-to-select-ext-trig.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0471-vc4_hdmi-Avoid-log-spam-for-audio-start-failure.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0472-drm-tests-Order-Kunit-tests-in-Makefile.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0473-drm-tests-Add-Kunit-Helpers.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0474-drm-tests-Include-helpers-header.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0475-drm-tests-helpers-Add-module-infos.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0476-drm-tests-helpers-Add-SPDX-header.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0477-drm-atomic-Constify-the-old-new-state-accessors.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0478-drm-vc4-Constify-container_of-wrappers.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0479-drm-vc4-kms-Constify-the-HVS-old-new-state-helpers.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0480-drm-vc4-kms-Sort-the-CRTCs-by-output-before-assignin.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0481-drm-vc4-txp-Reorder-the-variable-assignments.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0482-drm-vc4-Add-TXP-encoder-type.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0483-drm-vc4-txp-Initialise-the-CRTC-before-the-encoder-a.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0484-drm-vc4-crtc-Pass-the-device-and-data-in-vc4_crtc_in.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0485-drm-vc4-crtc-Provide-a-CRTC-name.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0486-drm-tests-helpers-Add-missing-export.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0487-drm-tests-helpers-Move-the-helper-header-to-include-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0488-drm-tests-Introduce-a-config-option-for-the-KUnit-he.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0489-drm-tests-helpers-Document-drm_kunit_device_init.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0490-drm-tests-helpers-Switch-to-EXPORT_SYMBOL_GPL.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0491-drm-tests-helpers-Rename-the-device-init-helper.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0492-drm-tests-helpers-Remove-the-name-parameter.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0493-drm-tests-helpers-Create-the-device-in-another-funct.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0494-drm-tests-helpers-Switch-to-a-platform_device.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0495-drm-tests-helpers-Make-sure-the-device-is-bound.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0496-drm-tests-helpers-Allow-for-a-custom-device-struct-t.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0497-drm-tests-helpers-Allow-to-pass-a-custom-drm_driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0498-drm-vc4-Move-HVS-state-to-main-header.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0499-drm-vc4-crtc-Introduce-a-lower-level-crtc-init-helpe.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0500-drm-vc4-crtc-Make-encoder-lookup-helper-public.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0501-drm-vc4-hvs-Provide-a-function-to-initialize-the-HVS.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0502-drm-vc4-tests-Introduce-a-mocking-infrastructure.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0503-drm-vc4-tests-Fail-the-current-test-if-we-access-a-r.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0504-drm-vc4-tests-Add-unit-test-suite-for-the-PV-muxing.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0505-Documentation-gpu-vc4-Add-KUnit-Tests-Section.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0506-.github-Add-Github-Workflow-for-KUnit.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0507-.github-workflows-Add-dtoverlaycheck-workflow.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0508-.github-workflows-Create-workflow-to-CI-kernel-build.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0509-README-Add-README.md-with-CI-kernel-build-status-tag.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0510-drm-panel-panel-ilitek9881c-Use-cansleep-methods.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0511-drm-panel-panel-ilitek9881c-Crystalfontz-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0512-overlays-Add-crystalfontz-cfa050_pi_m.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0513-net-bcmgenet-Add-eee-module-parameter.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0514-dts-bcm2711-Add-eee-dtparam.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0515-dtoverlays-Add-overlay-cm-swap-i2c0-to-swap-buses-on.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0516-dt-Correct-cam_reg-GPIO-assignments-for-CM1-3.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0517-dt-Add-camX_reg_gpio-to-CM4.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0518-dt-Add-camX_reg-and-camX_reg_gpio-overrides-to-CM4S.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0519-overlays-Add-disable-emmc2.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0520-xhci-constrain-XHCI_VLI_HUB_TT_QUIRK-to-old-firmware.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0521-drm-panel-simple-Add-Innolux-AT056tN53V1-5.6-VGA.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0522-overlays-audremap-Fix-setting-of-the-pin-function.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0523-media-dt-bindings-Add-DW9817-to-DW9807-binding.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0524-media-dw9807-vcm-Add-support-for-DW9817-bidirectiona.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0525-media-dt-bindings-Add-regulator-to-dw9807-vcm.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0526-media-dw9807-vcm-Add-regulator-support-to-the-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0527-media-dw9807-vcm-Smooth-the-first-user-movement-of-t.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0528-dtbindings-media-i2c-Add-IMX708-CMOS-sensor-binding.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0529-media-i2c-Add-a-driver-for-the-Sony-IMX708-image-sen.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0530-dtoverlays-Add-overlays-for-the-IMX708-image-sensor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0531-net-phy-broadcom-Make-LEDs-3-4-shadow-LEDs-1-2.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0532-overlays-i2c-sensor-MS-temp-pressure-sensors.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0533-drivers-media-imx708-Enable-long-exposure-mode.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0534-drivers-media-i2c-imx708-Fix-crop-information.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0535-drm-vc4-hdmi-Correct-CSC-setup-for-YCbCr4-4-4.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0536-drm-vc4-hdmi-Add-property-to-allow-manual-config-of-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0537-bcm2835-mmc-Honor-return-value-of-mmc_of_parse.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0538-.github-workflows-Set-warnings-as-errors-for-builds.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0539-overlays-i2c-sensor-Add-mpu6050-and-mpu9250.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0540-.github-workflows-Correct-kernel-builds-artifacts.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0541-overlays-i2c-sensor-Use-TABs-for-indentation.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0542-overlays-i2c-sensor-Add-BNO055-IMU-sensor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0543-dtoverlay-Update-vc4-kms-dpi-generic-for-changed-med.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0544-drm-vc4-hvs-Defer-dlist-slots-deallocation.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0545-vc4-hdmi-Always-enable-GCP-with-AVMUTE-cleared.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0546-media-bcm2835-v4l2-codec-Enable-selection-ioctl-for-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0547-.github-workflows-Switch-to-a-matrix-build.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0548-overlays-i2c-sensor-Add-SHT4X-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0549-kunit-Provide-a-static-key-to-check-if-KUnit-is-acti.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0550-kunit-Use-the-static-key-when-retrieving-the-current.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0551-drm-vc4-hvs-Initialize-the-dlist-allocation-list-ent.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0552-drm-vc4-hvs-Move-the-dlist-allocation-destruction-to.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0553-drm-vc4-hvs-Destroy-dlist-allocations-immediately-wh.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0554-ARM-dts-Set-the-LED-default-state-to-off.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0555-README.md-Replace-6.0-build-status-with-6.2.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0556-.github-workflows-Retain-artifacts-for-90-days.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0557-media-bcm2835-v4l2-codec-Add-profile-level-ctrls-to-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0558-drm-vc4_plane-Add-support-for-YUV444-formats.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0559-drm-vc4-Calculate-bpc-based-on-max_requested_bpc.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0560-media-dt-bindings-ak7375-Convert-to-DT-schema.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0561-media-dt-bindings-ak7375-Add-supplies.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0562-media-i2c-ak7375-Add-regulator-management.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0563-dtoverlays-Add-VCM-option-to-imx519.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0564-dtoverlays-Add-IMX519-support-to-camera-mux-overlays.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0565-vc04_services-bcm2835_codec-Ignore-READ_ONLY-ctrls-i.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0566-ASoC-bcm-Fix-Rpi-PROTO-and-audioinjector.net-Pi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0567-dtoverlays-Add-VCM-option-to-Arducam64MP.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0568-dtoverlays-Add-Arducam64MP-support-to-camera-mux-ove.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0569-drm-panel-panel-sitronix-st7701-Support-SPI-config-a.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0570-overlays-Remove-lirc-rpi-from-media-center.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0571-overlays-pca953x-Fix-a-typos-in-the-pcal-variants.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0572-iio-adc-mcp3422-Add-correct-compatible-strings.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0573-ASoC-adau1977-Add-correct-compatible-strings.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0574-overlays-Use-vendor-qualified-compatible-strings.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0575-mfd-arizona-i2c-Declare-of-MODULE_DEVICE_TABLE.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0576-gpio-pca953x-Add-ti-tca9554-compatible-string.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0577-hwmon-aht10-Add-DT-compatible-string.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0578-hwmon-ds1621-Add-DT-compatible-strings.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0579-rtc-ds3232-Add-DT-compatible-string-for-ds3234.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0580-hwmon-sht3x-Add-DT-compatible-string.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0581-iio-light-tsl4531-Add-DT-compatible-string.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0582-iio-light-veml6070-Add-DT-compatible-string.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0583-workflows-We-all-love-checkpatch-so-add-it-to-the-CI.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0584-ARM-dts-Standardise-on-the-upstream-LED-names.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0585-ARM-dts-bcm2711-rpi-400-Restore-the-ACT-LED.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0586-ARM-dts-bcm2711-rpi-400-Add-dummy-cam1-regulator.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0587-overlays-vc4-kms-fkms-v3d-Raise-CMA-to-512MB.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0588-media-i2c-imx219-Sensor-should-report-RAW-color-spac.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0589-media-i2c-imx219-Correct-the-minimum-vblanking-value.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0590-media-i2c-imx219-make-HBLANK-r-w-to-allow-longer-exp.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0591-media-imx219-Advertise-embedded-data-node-on-media-p.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0592-drm-vc4-drop-unnecessary-and-harmful-HDMI-RGB-format.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0593-dt-bindings-media-i2c-Add-IMX296-CMOS-sensor-binding.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0594-media-i2c-IMX296-camera-sensor-driver.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0595-media-i2c-imx296-Get-sensor-crop-working.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0596-media-i2c-imx296-Disable-binning-for-colour-variant.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0597-media-i2c-imx296-Add-helper-for-hblank-control.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0598-media-i2c-imx296-Set-a-1-frame-gain-delay.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0599-media-i2c-imx296-Add-horizontal-vertical-flip-suppor.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0600-media-i2c-imx296-Adjust-cropping-limits.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0601-reboot-Use-power-off-rather-than-busy-spinning-when-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0602-media-i2c-Add-PDAF-support-for-IMX519.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0603-dtoverlays-Reduce-the-link-frequencies-of-IMX519.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0604-drivers-media-i2c-imx708-Fix-WIDE_DYNAMIC_RANGE-cont.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0605-rpisense-fb-Add-explicit-fb_deferred_io_mmap-hook.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0606-hwrng-bcm2835-sleep-more-intelligently.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0607-vc04_services-bcm2835_codec-Set-MPEG2_LEVEL-control-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0608-staging-bcm2835-codec-Add-V4L2_CID_MPEG_VIDEO_B_FRAM.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0609-staging-bcm2835-codec-Add-support-for-V4L2_CID_MPEG_.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0610-dtoverlays-Add-inverted-override-property-to-ssd1306.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0611-media-i2c-imx290-Reset-to-upstream.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0612-media-i2c-imx290-Use-device-lock-for-the-control-han.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0613-media-i2c-imx290-Print-error-code-when-I2C-transfer-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0614-media-i2c-imx290-Replace-macro-with-explicit-ARRAY_S.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0615-media-i2c-imx290-Drop-imx290_write_buffered_reg.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0616-media-i2c-imx290-Drop-regmap-cache.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0617-media-i2c-imx290-Specify-HMAX-values-in-decimal.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0618-media-i2c-imx290-Support-variable-sized-registers.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0619-media-i2c-imx290-Correct-register-sizes.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0620-media-i2c-imx290-Simplify-error-handling-when-writin.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0621-media-i2c-imx290-Define-more-register-macros.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0622-media-i2c-imx290-Add-exposure-time-control.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0623-media-i2c-imx290-Fix-max-gain-value.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0624-media-i2c-imx290-Split-control-initialization-to-sep.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0625-media-i2c-imx290-Implement-HBLANK-and-VBLANK-control.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0626-media-i2c-imx290-Create-controls-for-fwnode-properti.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0627-media-i2c-imx290-Move-registers-with-fixed-value-to-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0628-media-i2c-imx290-Factor-out-format-retrieval-to-sepa.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0629-media-i2c-imx290-Add-crop-selection-targets-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0630-media-i2c-imx290-Replace-GAIN-control-with-ANALOGUE_.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0631-media-i2c-imx290-Group-functions-in-sections.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0632-media-i2c-imx290-Factor-out-subdev-init-and-cleanup-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0633-media-i2c-imx290-Factor-out-control-update-code-to-a.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0634-media-i2c-imx290-Access-link_freq_index-directly.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0635-media-i2c-imx290-Pass-format-and-mode-to-imx290_calc.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0636-media-i2c-imx290-Compute-pixel-rate-and-blanking-in-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0637-media-i2c-imx290-Factor-out-black-level-setting-to-a.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0638-media-i2c-imx290-Factor-out-DT-parsing-to-separate-f.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0639-media-i2c-imx290-Use-dev_err_probe.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0640-media-i2c-imx290-Factor-out-clock-initialization-to-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0641-media-i2c-imx290-Use-V4L2-subdev-active-state.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0642-media-i2c-imx290-Rename-extend-and-expand-usage-of-i.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0643-media-i2c-imx290-Use-runtime-PM-autosuspend.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0644-media-i2c-imx290-Initialize-runtime-PM-before-subdev.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0645-media-i2c-imx290-Configure-data-lanes-at-start-time.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0646-media-i2c-imx290-Simplify-imx290_set_data_lanes.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0647-media-i2c-imx290-Handle-error-from-imx290_set_data_l.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0648-dtbindings-Reset-imx290.txt-to-upstream.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0649-media-dt-bindings-Convert-imx290.txt-to-YAML.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0650-media-dt-bindings-media-i2c-Add-mono-version-to-IMX2.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0651-media-dt-bindings-media-i2c-Add-imx327-version-to-IM.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0652-media-i2c-imx290-Make-use-of-get_unaligned_le24-put_.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0653-media-i2c-imx290-Use-device_property_read_u32-direct.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0654-media-i2c-imx290-Add-support-for-the-mono-sensor-var.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0655-media-i2c-imx290-Match-kernel-coding-style-on-whites.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0656-media-i2c-imx290-Set-the-colorspace-fields-in-the-fo.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0657-media-i2c-imx290-Add-V4L2_SUBDEV_FL_HAS_EVENTS-and-s.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0658-media-i2c-imx290-Fix-the-pixel-rate-at-148.5Mpix-s.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0659-media-i2c-imx290-Support-60fps-in-2-lane-operation.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0660-media-i2c-imx290-Use-CSI-timings-as-per-datasheet.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0661-media-i2c-imx290-Convert-V4L2_CID_HBLANK-to-read-wri.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0662-media-i2c-imx290-Convert-V4L2_CID_VBLANK-to-read-wri.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0663-media-i2c-imx290-VMAX-is-mode-dependent.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0664-media-i2c-imx290-Remove-duplicated-write-to-IMX290_C.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0665-media-i2c-imx290-Add-support-for-74.25MHz-external-c.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0666-media-i2c-imx290-Add-support-for-H-V-Flips.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0667-media-i2c-imx290-Add-the-error-code-to-logs-in-start.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0668-media-i2c-imx290-Add-support-for-imx327-variant.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0669-dtoverlays-Update-compatible-strings-for-imx290-327-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0670-fbdev-Don-t-cancel-deferred-work-if-pagelist-empty.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0671-usb-xhci-drop-and-add-the-endpoint-context-in-xhci_f.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0672-drivers-media-imx708-Increase-usable-link-frequencie.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0673-dtoverlays-Add-link-frequency-parameter-for-the-Sony.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0674-drivers-media-imx708-Remove-unused-control-fields.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0675-drivers-media-imx708-Tidy-ups-to-address-upstream-re.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0676-dt-bindings-media-i2c-Replace-IMX708-sensor-binding-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0677-dtoverlays-Follow-the-standard-devicetree-labels-for.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0678-drivers-media-imx708-Follow-the-standard-devicetree-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0679-drives-media-imx708-Put-HFLIP-and-VFLIP-controls-in-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0680-media-bcm2835-unicam-Start-and-stop-media_pipeline-w.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0681-fixup-gpio-fsm-Avoid-truncation-of-delay-jiffies.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0682-staging-bcm2835-codec-Add-missing-alignment-for-V4L2.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0683-ARM-dts-bcm27xx-Add-i2c_arm-vc-and-friends.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0684-overlays-Add-pcf857x-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0685-overlays-Add-gpio-charger-support.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0686-media-i2c-imx219-Scale-the-pixel-clock-rate-for-the-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0687-hwmon-emc2305-Add-calls-to-initialise-of-cooling-map.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0688-drm-panel-Add-panel-driver-for-Waveshare-DSI-touchsc.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0689-input-goodix-Add-option-to-poll-instead-of-relying-o.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0690-dtoverlays-Add-an-overlay-for-the-Waveshare-DSI-scre.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0691-arm-boot-dts-overlays-mipi-dbi-spi-fix-default-brigh.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0692-dtoverlays-Add-overrides-for-alternate-i2c-buses-to-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0693-dtoverlays-Add-overrides-for-alternate-i2c-buses-to-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0694-fixup-Export-optimised-__memcpy.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0695-hwmon-emc2305-Change-OF-properties-pwm-min-pwm-max-t.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0696-dtoverlays-Change-i2c-fan-pwm-max-min-overrides-to-u.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0697-drm-vc4-Limit-max_bpc-to-8-on-Pi0-3.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0698-serial-8250-Add-NOMSI-bug-for-bcm2835aux.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0699-Bluetooth-hci_sync-Add-fallback-bd-address-prop.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0700-Bluetooth-hci_bcm-Add-more-invalid-BDADDRs.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0701-ARM-dts-bcm27xx-Enable-kernel-Bluetooth.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0702-overlays-Update-miniuart-bt-now-krnbt-is-default.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0703-ARM-dts-bcm2711-Add-extra-serial-aliases.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0704-pinctrl-bcm2835-Workaround-for-edge-IRQ-loss.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0705-drm-v3d-New-debugfs-end-points-to-query-GPU-usage-st.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0706-ARM-dts-bcm2711-rpi-ds-Group-the-common-pins.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0707-ARM-dts-bcm2711-rpi-ds-Set-default-I-O-pins.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0708-overlays-bcm2711-Remove-I-O-pinctrl-references.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0709-ARM-dts-bcm27xx-Correct-the-dma-ranges.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0710-bcm2835-dma-Derive-slave-DMA-addresses-correctly.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0711-ASoC-bcm2835-i2s-Use-phys-addresses-for-DAI-DMA.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0712-drm-vc4-Use-phys-addresses-for-slave-DMA-config.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0713-bcm2835-smi-Use-phys-addresses-for-slave-DMA-config.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0714-bcm2835-mmc-Use-phys-addresses-for-slave-DMA-config.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0715-ARM-dts-bcm2709-10-Retain-the-system-timer-node.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0716-bcm2835-sdhost-Use-DT-to-configure-logging.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0717-bcm2835-sdhost-Use-phys-addresses-for-slave-DMA-conf.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0718-mmc-bcm2835-Use-phys-addresses-for-slave-DMA-config.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0719-spi-bcm2835-Use-phys-addresses-for-slave-DMA-config.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0720-ARM-dts-bcm2711-rpi-Add-i2s_dma4.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0721-fixup-bcm2835-mmc-Really-use-phys-addresses.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0722-dmaengine-bcm2835-Fix-position-reporting-for-40-bits.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0723-dmaengine-bcm2835-Use-to_bcm2711_cbaddr-where-releva.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0724-dmaengine-bcm2835-Fix-descriptors-usage-for-40-bits-.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0725-bcm2835-dma-Fix-WAIT_RESP-on-memcpy.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0726-bcm2835-dma-Fix-dma_abort-for-40-bit-channels.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0727-bcm2835-dma-Fix-dma_abort-for-non-40bit-channels.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0728-bcm2835-dma-Support-dma-flags-for-multi-beat-burst.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0729-bcm2835-dma-Need-to-keep-PROT-bits-set-in-CS-on-40bi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0730-bcm2711-rpi-ds-Switch-to-dma40-channel-for-hdmi-audi.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0731-drm-vc4-hdmi-Increase-MAI-fifo-dreq-threshold.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0732-ARM-dts-bcm2711-rpi-Set-a-1GB-ZONE_DMA-limit.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0733-ARM-dts-bcm27xx-Add-stdout-path-to-serial0.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0734-input-edt-ft5x06-Only-read-data-for-number-of-points.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0735-i2c-bcm2835-Flush-FIFOs-cleanly-on-error.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0736-i2c-bcm2835-Do-not-abort-transfers-on-ERR-if-still-a.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0737-i2c-bcm2835-Implement-I2C_M_IGNORE_NAK.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0738-pps-Compatibility-hack-should-be-X86-specific.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0739-bcm2835-dma-Fixes-for-dma_abort.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0740-bcm2835-dma-Move-definition-of-PROT-bits-to-expected.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0741-drivers-media-imx296-Disable-2x2-binned-mode.patch create mode 100644 target/linux/bcm27xx/patches-6.1/950-0742-panel-sitronix-st7701-Fix-panel-prepare-over-SPI.patch create mode 100644 target/linux/bcm27xx/patches-6.1/960-hwrng-iproc-set-quality-to-1000.patch diff --git a/target/linux/bcm27xx/modules/sound.mk b/target/linux/bcm27xx/modules/sound.mk index 47c0a938792..c720bd502d9 100644 --- a/target/linux/bcm27xx/modules/sound.mk +++ b/target/linux/bcm27xx/modules/sound.mk @@ -382,6 +382,30 @@ endef $(eval $(call KernelPackage,sound-soc-chipdip-dac)) +define KernelPackage/sound-soc-dacberry-soundcard + TITLE:=Support for DACBERRY400 Soundcard + KCONFIG:= \ + CONFIG_SND_DACBERRY400 \ + CONFIG_SND_SOC_TLV320AIC3X_I2C + FILES:= \ + $(LINUX_DIR)/sound/soc/bcm/snd-soc-dacberry400.ko \ + $(LINUX_DIR)/sound/soc/codecs/snd-soc-tlv320aic3x.ko + AUTOLOAD:=$(call AutoLoad,68,snd-soc-tlv320aic3x-i2c snd-soc-dacberry400) + DEPENDS:= \ + @LINUX_6_1 \ + kmod-sound-soc-bcm2835-i2s \ + +kmod-i2c-bcm2835 \ + +kmod-regmap-i2c + $(call AddDepends/sound) +endef + +define KernelPackage/sound-soc-dacberry-soundcard/description + This package contains support for DACBERRY400 Soundcard +endef + +$(eval $(call KernelPackage,sound-soc-dacberry-soundcard)) + + define KernelPackage/sound-soc-digidac1-soundcard TITLE:=Support for RRA DigiDAC1 KCONFIG:= \ @@ -947,6 +971,7 @@ define KernelPackage/sound-soc-rpi-cirrus CONFIG_SND_SOC_WM8804 \ CONFIG_SND_SOC_WM_ADSP FILES:= \ + $(LINUX_DIR)/drivers/firmware/cirrus/cs_dsp.ko@ge6.1 \ $(LINUX_DIR)/drivers/mfd/arizona.ko \ $(LINUX_DIR)/drivers/mfd/arizona-i2c.ko \ $(LINUX_DIR)/sound/soc/bcm/snd-soc-rpi-cirrus.ko \ @@ -954,7 +979,7 @@ define KernelPackage/sound-soc-rpi-cirrus $(LINUX_DIR)/sound/soc/codecs/snd-soc-wm-adsp.ko \ $(LINUX_DIR)/sound/soc/codecs/snd-soc-wm5102.ko \ $(LINUX_DIR)/sound/soc/codecs/snd-soc-wm8804.ko - AUTOLOAD:=$(call AutoLoad,68,snd-soc-pcm1794a snd-soc-rpi-cirrus) + AUTOLOAD:=$(call AutoLoad,68,snd-soc-rpi-cirrus) DEPENDS:= \ kmod-sound-soc-bcm2835-i2s \ +kmod-i2c-bcm2835 \ diff --git a/target/linux/bcm27xx/modules/video.mk b/target/linux/bcm27xx/modules/video.mk index 07e6594890b..d724a2d3078 100644 --- a/target/linux/bcm27xx/modules/video.mk +++ b/target/linux/bcm27xx/modules/video.mk @@ -7,7 +7,12 @@ define KernelPackage/camera-bcm2835 KCONFIG:= \ CONFIG_VIDEO_BCM2835 \ CONFIG_VIDEO_BCM2835_MMAL \ + CONFIG_VIDEO_ARDUCAM_64MP=n@ge6.1 \ + CONFIG_VIDEO_ARDUCAM_PIVARIETY=n@ge6.1 \ CONFIG_VIDEO_BCM2835_UNICAM=n \ + CONFIG_VIDEO_IMX296=n@ge6.1 \ + CONFIG_VIDEO_IMX519=n@ge6.1 \ + CONFIG_VIDEO_IMX708=n@ge6.1 \ CONFIG_VIDEO_ISP_BCM2835=n FILES:= \ $(LINUX_DIR)/drivers/staging/vc04_services/bcm2835-camera/bcm2835-v4l2.ko @@ -37,6 +42,8 @@ define KernelPackage/drm-vc4 CONFIG_DRM_V3D=n \ CONFIG_DRM_TVE200=n FILES:= \ + $(LINUX_DIR)/drivers/gpu/drm/display/drm_display_helper.ko@ge6.1 \ + $(LINUX_DIR)/drivers/gpu/drm/drm_dma_helper.ko@ge6.1 \ $(LINUX_DIR)/drivers/gpu/drm/vc4/vc4.ko \ $(LINUX_DIR)/drivers/gpu/drm/drm_kms_helper.ko \ $(LINUX_DIR)/drivers/media/cec/core/cec.ko diff --git a/target/linux/bcm27xx/patches-6.1/950-0001-Support-RPi-DPI-interface-in-mode6-for-18-bit-color.patch b/target/linux/bcm27xx/patches-6.1/950-0001-Support-RPi-DPI-interface-in-mode6-for-18-bit-color.patch new file mode 100644 index 00000000000..1dd352d1896 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0001-Support-RPi-DPI-interface-in-mode6-for-18-bit-color.patch @@ -0,0 +1,32 @@ +From 6da5134dcde68af6d86003931375ca1a6e6d0169 Mon Sep 17 00:00:00 2001 +From: Joerg Quinten +Date: Fri, 18 Jun 2021 13:02:29 +0200 +Subject: [PATCH] Support RPi DPI interface in mode6 for 18-bit color + +A matching media bus format was added and an overlay for using it, +both with FB and VC4 was added as well. + +Signed-off-by: Joerg Quinten +--- + drivers/gpu/drm/vc4/vc4_dpi.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_dpi.c ++++ b/drivers/gpu/drm/vc4/vc4_dpi.c +@@ -170,10 +170,16 @@ static void vc4_dpi_encoder_enable(struc + dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, + DPI_ORDER); + break; ++ case MEDIA_BUS_FMT_BGR666_1X24_CPADHI: ++ dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER); ++ fallthrough; + case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: + dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2, + DPI_FORMAT); + break; ++ case MEDIA_BUS_FMT_BGR666_1X18: ++ dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER); ++ fallthrough; + case MEDIA_BUS_FMT_RGB666_1X18: + dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1, + DPI_FORMAT); diff --git a/target/linux/bcm27xx/patches-6.1/950-0002-drm-vc4-Add-FKMS-as-an-acceptable-node-for-dma-range.patch b/target/linux/bcm27xx/patches-6.1/950-0002-drm-vc4-Add-FKMS-as-an-acceptable-node-for-dma-range.patch new file mode 100644 index 00000000000..a64d7821db4 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0002-drm-vc4-Add-FKMS-as-an-acceptable-node-for-dma-range.patch @@ -0,0 +1,27 @@ +From 588c5e6269307ccd908986b7514676d6729e0e0d Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Tue, 19 May 2020 16:20:30 +0100 +Subject: [PATCH] drm/vc4: Add FKMS as an acceptable node for dma + ranges. + +Under FKMS, the firmware (via FKMS) also requires the VideoCore cache +aliases for image planes, as defined by the dma-ranges under /soc. + +Add rpi-firmware-kms to the list of acceptable nodes to look for +to copy dma config from. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_drv.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/gpu/drm/vc4/vc4_drv.c ++++ b/drivers/gpu/drm/vc4/vc4_drv.c +@@ -276,6 +276,7 @@ static void vc4_component_unbind_all(voi + static const struct of_device_id vc4_dma_range_matches[] = { + { .compatible = "brcm,bcm2711-hvs" }, + { .compatible = "brcm,bcm2835-hvs" }, ++ { .compatible = "raspberrypi,rpi-firmware-kms" }, + { .compatible = "brcm,bcm2835-v3d" }, + { .compatible = "brcm,cygnus-v3d" }, + { .compatible = "brcm,vc4-v3d" }, diff --git a/target/linux/bcm27xx/patches-6.1/950-0003-drm-vc4-Add-the-2711-HVS-as-a-suitable-DMA-node.patch b/target/linux/bcm27xx/patches-6.1/950-0003-drm-vc4-Add-the-2711-HVS-as-a-suitable-DMA-node.patch new file mode 100644 index 00000000000..a319e1cb3ff --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0003-drm-vc4-Add-the-2711-HVS-as-a-suitable-DMA-node.patch @@ -0,0 +1,24 @@ +From 535402af94be945587cc7c7f3346b31e3fa46bc9 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Mon, 26 Oct 2020 12:38:27 +0000 +Subject: [PATCH] drm/vc4: Add the 2711 HVS as a suitable DMA node + +With vc4-drv node not being under /soc on Pi4, we need to +adopt the correct DMA parameters from a suitable sub-component. +Add "brcm,bcm2711-hvs" to that list of components. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_drv.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/gpu/drm/vc4/vc4_drv.c ++++ b/drivers/gpu/drm/vc4/vc4_drv.c +@@ -276,6 +276,7 @@ static void vc4_component_unbind_all(voi + static const struct of_device_id vc4_dma_range_matches[] = { + { .compatible = "brcm,bcm2711-hvs" }, + { .compatible = "brcm,bcm2835-hvs" }, ++ { .compatible = "brcm,bcm2711-hvs" }, + { .compatible = "raspberrypi,rpi-firmware-kms" }, + { .compatible = "brcm,bcm2835-v3d" }, + { .compatible = "brcm,cygnus-v3d" }, diff --git a/target/linux/bcm27xx/patches-6.1/950-0004-drm-vc4-Change-the-default-DPI-format-to-being-18bpp.patch b/target/linux/bcm27xx/patches-6.1/950-0004-drm-vc4-Change-the-default-DPI-format-to-being-18bpp.patch new file mode 100644 index 00000000000..317f9fbea1d --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0004-drm-vc4-Change-the-default-DPI-format-to-being-18bpp.patch @@ -0,0 +1,34 @@ +From 6f0bbf91998cb04030731bc8b254209345cbe9f1 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Fri, 12 Feb 2021 17:31:37 +0000 +Subject: [PATCH] drm/vc4: Change the default DPI format to being + 18bpp, not 24. + +DPI hasn't really been used up until now, so the default has +been meaningless. +In theory we should be able to pass the desired format for the +adjacent bridge chip through, but framework seems to be missing +for that. + +As the main device to use DPI is the VGA666 or Adafruit Kippah, +both of which use RGB666, change the default to being RGB666 instead +of RGB888. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_dpi.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_dpi.c ++++ b/drivers/gpu/drm/vc4/vc4_dpi.c +@@ -150,8 +150,8 @@ static void vc4_dpi_encoder_enable(struc + } + drm_connector_list_iter_end(&conn_iter); + +- /* Default to 24bit if no connector or format found. */ +- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB, DPI_FORMAT); ++ /* Default to 18bit if no connector or format found. */ ++ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1, DPI_FORMAT); + + if (connector) { + if (connector->display_info.num_bus_formats) { diff --git a/target/linux/bcm27xx/patches-6.1/950-0005-drm-atomic-Don-t-fixup-modes-that-haven-t-been-reset.patch b/target/linux/bcm27xx/patches-6.1/950-0005-drm-atomic-Don-t-fixup-modes-that-haven-t-been-reset.patch new file mode 100644 index 00000000000..0de0b474f32 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0005-drm-atomic-Don-t-fixup-modes-that-haven-t-been-reset.patch @@ -0,0 +1,24 @@ +From 5e5243cf497ccec7265b79cf84beb0f60550e113 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 7 Jan 2021 16:30:55 +0000 +Subject: [PATCH] drm/atomic: Don't fixup modes that haven't been reset + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/drm_atomic_helper.c | 5 +++++ + 1 file changed, 5 insertions(+) + +--- a/drivers/gpu/drm/drm_atomic_helper.c ++++ b/drivers/gpu/drm/drm_atomic_helper.c +@@ -438,6 +438,11 @@ mode_fixup(struct drm_atomic_state *stat + new_crtc_state = + drm_atomic_get_new_crtc_state(state, new_conn_state->crtc); + ++ if (!new_crtc_state->mode_changed && ++ !new_crtc_state->connectors_changed) { ++ continue; ++ } ++ + /* + * Each encoder has at most one connector (since we always steal + * it away), so we won't call ->mode_fixup twice. diff --git a/target/linux/bcm27xx/patches-6.1/950-0006-drm-vc4-Fix-timings-for-VEC-modes.patch b/target/linux/bcm27xx/patches-6.1/950-0006-drm-vc4-Fix-timings-for-VEC-modes.patch new file mode 100644 index 00000000000..bc5643ee774 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0006-drm-vc4-Fix-timings-for-VEC-modes.patch @@ -0,0 +1,127 @@ +From 607f72974246d1495059932286b3d5307c1645a5 Mon Sep 17 00:00:00 2001 +From: Mateusz Kwiatkowski +Date: Thu, 15 Jul 2021 01:07:30 +0200 +Subject: [PATCH] drm/vc4: Fix timings for VEC modes + +This commit fixes vertical timings of the VEC (composite output) modes +to accurately represent the 525-line ("NTSC") and 625-line ("PAL") ITU-R +standards. + +Previous timings were actually defined as 502 and 601 lines, resulting +in non-standard 62.69 Hz and 52 Hz signals being generated, +respectively. + +Changes to vc4_crtc.c have also been made, to make the PixelValve +vertical timings accurately correspond to the DRM modeline in interlaced +modes. The resulting VERTA/VERTB register values have been verified +against the reference values set by the Raspberry Pi firmware. + +Signed-off-by: Mateusz Kwiatkowski +--- + drivers/gpu/drm/vc4/vc4_crtc.c | 70 +++++++++++++++++++++------------- + 1 file changed, 43 insertions(+), 27 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -326,8 +326,14 @@ static void vc4_crtc_config_pv(struct dr + bool is_dsi = (vc4_encoder->type == VC4_ENCODER_TYPE_DSI0 || + vc4_encoder->type == VC4_ENCODER_TYPE_DSI1); + bool is_dsi1 = vc4_encoder->type == VC4_ENCODER_TYPE_DSI1; ++ bool is_vec = vc4_encoder->type == VC4_ENCODER_TYPE_VEC; + u32 format = is_dsi1 ? PV_CONTROL_FORMAT_DSIV_24 : PV_CONTROL_FORMAT_24; + u8 ppc = pv_data->pixels_per_clock; ++ ++ u16 vert_bp = mode->crtc_vtotal - mode->crtc_vsync_end; ++ u16 vert_sync = mode->crtc_vsync_end - mode->crtc_vsync_start; ++ u16 vert_fp = mode->crtc_vsync_start - mode->crtc_vdisplay; ++ + bool debug_dump_regs = false; + int idx; + +@@ -355,49 +361,59 @@ static void vc4_crtc_config_pv(struct dr + VC4_SET_FIELD(mode->hdisplay * pixel_rep / ppc, + PV_HORZB_HACTIVE)); + +- CRTC_WRITE(PV_VERTA, +- VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end + +- interlace, +- PV_VERTA_VBP) | +- VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start, +- PV_VERTA_VSYNC)); +- CRTC_WRITE(PV_VERTB, +- VC4_SET_FIELD(mode->crtc_vsync_start - mode->crtc_vdisplay, +- PV_VERTB_VFP) | +- VC4_SET_FIELD(mode->crtc_vdisplay, PV_VERTB_VACTIVE)); +- + if (interlace) { ++ bool odd_field_first = false; ++ u32 field_delay = mode->htotal * pixel_rep / (2 * ppc); ++ u16 vert_bp_even = vert_bp; ++ u16 vert_fp_even = vert_fp; ++ ++ if (is_vec) { ++ /* VEC (composite output) */ ++ ++field_delay; ++ if (mode->htotal == 858) { ++ /* 525-line mode (NTSC or PAL-M) */ ++ odd_field_first = true; ++ } ++ } ++ ++ if (odd_field_first) ++ ++vert_fp_even; ++ else ++ ++vert_bp; ++ + CRTC_WRITE(PV_VERTA_EVEN, +- VC4_SET_FIELD(mode->crtc_vtotal - +- mode->crtc_vsync_end, +- PV_VERTA_VBP) | +- VC4_SET_FIELD(mode->crtc_vsync_end - +- mode->crtc_vsync_start, +- PV_VERTA_VSYNC)); ++ VC4_SET_FIELD(vert_bp_even, PV_VERTA_VBP) | ++ VC4_SET_FIELD(vert_sync, PV_VERTA_VSYNC)); + CRTC_WRITE(PV_VERTB_EVEN, +- VC4_SET_FIELD(mode->crtc_vsync_start - +- mode->crtc_vdisplay, +- PV_VERTB_VFP) | ++ VC4_SET_FIELD(vert_fp_even, PV_VERTB_VFP) | + VC4_SET_FIELD(mode->crtc_vdisplay, PV_VERTB_VACTIVE)); + +- /* We set up first field even mode for HDMI. VEC's +- * NTSC mode would want first field odd instead, once +- * we support it (to do so, set ODD_FIRST and put the +- * delay in VSYNCD_EVEN instead). ++ /* We set up first field even mode for HDMI and VEC's PAL. ++ * For NTSC, we need first field odd. + */ + CRTC_WRITE(PV_V_CONTROL, + PV_VCONTROL_CONTINUOUS | + (is_dsi ? PV_VCONTROL_DSI : 0) | + PV_VCONTROL_INTERLACE | +- VC4_SET_FIELD(mode->htotal * pixel_rep / (2 * ppc), +- PV_VCONTROL_ODD_DELAY)); +- CRTC_WRITE(PV_VSYNCD_EVEN, 0); ++ (odd_field_first ++ ? PV_VCONTROL_ODD_FIRST ++ : VC4_SET_FIELD(field_delay, ++ PV_VCONTROL_ODD_DELAY))); ++ CRTC_WRITE(PV_VSYNCD_EVEN, ++ (odd_field_first ? field_delay : 0)); + } else { + CRTC_WRITE(PV_V_CONTROL, + PV_VCONTROL_CONTINUOUS | + (is_dsi ? PV_VCONTROL_DSI : 0)); + } + ++ CRTC_WRITE(PV_VERTA, ++ VC4_SET_FIELD(vert_bp, PV_VERTA_VBP) | ++ VC4_SET_FIELD(vert_sync, PV_VERTA_VSYNC)); ++ CRTC_WRITE(PV_VERTB, ++ VC4_SET_FIELD(vert_fp, PV_VERTB_VFP) | ++ VC4_SET_FIELD(mode->crtc_vdisplay, PV_VERTB_VACTIVE)); ++ + if (is_dsi) + CRTC_WRITE(PV_HACT_ACT, mode->hdisplay * pixel_rep); + diff --git a/target/linux/bcm27xx/patches-6.1/950-0007-drm-vc4-Fix-definition-of-PAL-M-mode.patch b/target/linux/bcm27xx/patches-6.1/950-0007-drm-vc4-Fix-definition-of-PAL-M-mode.patch new file mode 100644 index 00000000000..b6345ee50bb --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0007-drm-vc4-Fix-definition-of-PAL-M-mode.patch @@ -0,0 +1,77 @@ +From 5bcc290bd33f2b2fb7c6d7b30555b40b1074fd93 Mon Sep 17 00:00:00 2001 +From: Mateusz Kwiatkowski +Date: Thu, 15 Jul 2021 01:07:53 +0200 +Subject: [PATCH] drm/vc4: Fix definition of PAL-M mode + +PAL-M is a Brazilian analog TV standard that uses a PAL-style chroma +subcarrier at 3.575611[888111] MHz on top of 525-line (480i60) timings. +This commit makes the driver actually use the proper VEC preset for this +mode instead of just changing PAL subcarrier frequency. + +DRM mode constant names have also been changed, as they no longer +correspond to the "NTSC" or "PAL" terms. + +Signed-off-by: Mateusz Kwiatkowski +--- + drivers/gpu/drm/vc4/vc4_vec.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_vec.c ++++ b/drivers/gpu/drm/vc4/vc4_vec.c +@@ -69,6 +69,7 @@ + #define VEC_CONFIG0_STD_MASK GENMASK(1, 0) + #define VEC_CONFIG0_NTSC_STD 0 + #define VEC_CONFIG0_PAL_BDGHI_STD 1 ++#define VEC_CONFIG0_PAL_M_STD 2 + #define VEC_CONFIG0_PAL_N_STD 3 + + #define VEC_SCHPH 0x108 +@@ -224,14 +225,14 @@ static const struct debugfs_reg32 vec_re + VC4_REG32(VEC_DAC_MISC), + }; + +-static const struct drm_display_mode ntsc_mode = { ++static const struct drm_display_mode drm_mode_480i = { + DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 13500, + 720, 720 + 14, 720 + 14 + 64, 720 + 14 + 64 + 60, 0, + 480, 480 + 7, 480 + 7 + 6, 525, 0, + DRM_MODE_FLAG_INTERLACE) + }; + +-static const struct drm_display_mode pal_mode = { ++static const struct drm_display_mode drm_mode_576i = { + DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 13500, + 720, 720 + 20, 720 + 20 + 64, 720 + 20 + 64 + 60, 0, + 576, 576 + 4, 576 + 4 + 6, 625, 0, +@@ -240,25 +241,24 @@ static const struct drm_display_mode pal + + static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = { + [VC4_VEC_TV_MODE_NTSC] = { +- .mode = &ntsc_mode, ++ .mode = &drm_mode_480i, + .config0 = VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, + [VC4_VEC_TV_MODE_NTSC_J] = { +- .mode = &ntsc_mode, ++ .mode = &drm_mode_480i, + .config0 = VEC_CONFIG0_NTSC_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, + [VC4_VEC_TV_MODE_PAL] = { +- .mode = &pal_mode, ++ .mode = &drm_mode_576i, + .config0 = VEC_CONFIG0_PAL_BDGHI_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, + [VC4_VEC_TV_MODE_PAL_M] = { +- .mode = &pal_mode, +- .config0 = VEC_CONFIG0_PAL_BDGHI_STD, +- .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, +- .custom_freq = 0x223b61d1, ++ .mode = &drm_mode_480i, ++ .config0 = VEC_CONFIG0_PAL_M_STD, ++ .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, + }; + diff --git a/target/linux/bcm27xx/patches-6.1/950-0008-drm-vc4-Add-support-for-more-analog-TV-standards.patch b/target/linux/bcm27xx/patches-6.1/950-0008-drm-vc4-Add-support-for-more-analog-TV-standards.patch new file mode 100644 index 00000000000..e1c9170a55c --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0008-drm-vc4-Add-support-for-more-analog-TV-standards.patch @@ -0,0 +1,148 @@ +From 5040ce6a1488fb6bf43d10172e0209c13de99a80 Mon Sep 17 00:00:00 2001 +From: Mateusz Kwiatkowski +Date: Thu, 15 Jul 2021 01:07:58 +0200 +Subject: [PATCH] drm/vc4: Add support for more analog TV standards + +Add support for the following composite output modes (all of them are +somewhat more obscure than the previously defined ones): + +- NTSC_443 - NTSC-style signal with the chroma subcarrier shifted to + 4.43361875 MHz (the PAL subcarrier frequency). Never used for + broadcasting, but sometimes used as a hack to play NTSC content in PAL + regions (e.g. on VCRs). +- PAL_N - PAL with alternative chroma subcarrier frequency, + 3.58205625 MHz. Used as a broadcast standard in Argentina, Paraguay + and Uruguay to fit 576i50 with colour in 6 MHz channel raster. +- PAL60 - 480i60 signal with PAL-style color at normal European PAL + frequency. Another non-standard, non-broadcast mode, used in similar + contexts as NTSC_443. Some displays support one but not the other. +- SECAM - French frequency-modulated analog color standard; also have + been broadcast in Eastern Europe and various parts of Africa and Asia. + Uses the same 576i50 timings as PAL. + +Also added some comments explaining color subcarrier frequency +registers. + +Signed-off-by: Mateusz Kwiatkowski +--- + drivers/gpu/drm/vc4/vc4_vec.c | 63 +++++++++++++++++++++++++++++++++++ + 1 file changed, 63 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_vec.c ++++ b/drivers/gpu/drm/vc4/vc4_vec.c +@@ -46,6 +46,7 @@ + #define VEC_CONFIG0_YDEL(x) ((x) << 26) + #define VEC_CONFIG0_CDEL_MASK GENMASK(25, 24) + #define VEC_CONFIG0_CDEL(x) ((x) << 24) ++#define VEC_CONFIG0_SECAM_STD BIT(21) + #define VEC_CONFIG0_PBPR_FIL BIT(18) + #define VEC_CONFIG0_CHROMA_GAIN_MASK GENMASK(17, 16) + #define VEC_CONFIG0_CHROMA_GAIN_UNITY (0 << 16) +@@ -76,6 +77,27 @@ + #define VEC_SOFT_RESET 0x10c + #define VEC_CLMP0_START 0x144 + #define VEC_CLMP0_END 0x148 ++ ++/* ++ * These set the color subcarrier frequency ++ * if VEC_CONFIG1_CUSTOM_FREQ is enabled. ++ * ++ * VEC_FREQ1_0 contains the most significant 16-bit half-word, ++ * VEC_FREQ3_2 contains the least significant 16-bit half-word. ++ * 0x80000000 seems to be equivalent to the pixel clock ++ * (which itself is the VEC clock divided by 8). ++ * ++ * Reference values (with the default pixel clock of 13.5 MHz): ++ * ++ * NTSC (3579545.[45] Hz) - 0x21F07C1F ++ * PAL (4433618.75 Hz) - 0x2A098ACB ++ * PAL-M (3575611.[888111] Hz) - 0x21E6EFE3 ++ * PAL-N (3582056.25 Hz) - 0x21F69446 ++ * ++ * NOTE: For SECAM, it is used as the Dr center frequency, ++ * regardless of whether VEC_CONFIG1_CUSTOM_FREQ is enabled or not; ++ * that is specified as 4406250 Hz, which corresponds to 0x29C71C72. ++ */ + #define VEC_FREQ3_2 0x180 + #define VEC_FREQ1_0 0x184 + +@@ -118,6 +140,14 @@ + + #define VEC_INTERRUPT_CONTROL 0x190 + #define VEC_INTERRUPT_STATUS 0x194 ++ ++/* ++ * Db center frequency for SECAM; the clock for this is the same as for ++ * VEC_FREQ3_2/VEC_FREQ1_0, which is used for Dr center frequency. ++ * ++ * This is specified as 4250000 Hz, which corresponds to 0x284BDA13. ++ * That is also the default value, so no need to set it explicitly. ++ */ + #define VEC_FCW_SECAM_B 0x198 + #define VEC_SECAM_GAIN_VAL 0x19c + +@@ -187,8 +217,12 @@ encoder_to_vc4_vec(struct drm_encoder *e + enum vc4_vec_tv_mode_id { + VC4_VEC_TV_MODE_NTSC, + VC4_VEC_TV_MODE_NTSC_J, ++ VC4_VEC_TV_MODE_NTSC_443, + VC4_VEC_TV_MODE_PAL, + VC4_VEC_TV_MODE_PAL_M, ++ VC4_VEC_TV_MODE_PAL_N, ++ VC4_VEC_TV_MODE_PAL60, ++ VC4_VEC_TV_MODE_SECAM, + }; + + struct vc4_vec_tv_mode { +@@ -250,6 +284,13 @@ static const struct vc4_vec_tv_mode vc4_ + .config0 = VEC_CONFIG0_NTSC_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, ++ [VC4_VEC_TV_MODE_NTSC_443] = { ++ /* NTSC with PAL chroma frequency */ ++ .mode = &drm_mode_480i, ++ .config0 = VEC_CONFIG0_NTSC_STD, ++ .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, ++ .custom_freq = 0x2a098acb, ++ }, + [VC4_VEC_TV_MODE_PAL] = { + .mode = &drm_mode_576i, + .config0 = VEC_CONFIG0_PAL_BDGHI_STD, +@@ -260,6 +301,24 @@ static const struct vc4_vec_tv_mode vc4_ + .config0 = VEC_CONFIG0_PAL_M_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, ++ [VC4_VEC_TV_MODE_PAL_N] = { ++ .mode = &drm_mode_576i, ++ .config0 = VEC_CONFIG0_PAL_N_STD, ++ .config1 = VEC_CONFIG1_C_CVBS_CVBS, ++ }, ++ [VC4_VEC_TV_MODE_PAL60] = { ++ /* PAL-M with chroma frequency of regular PAL */ ++ .mode = &drm_mode_480i, ++ .config0 = VEC_CONFIG0_PAL_M_STD, ++ .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, ++ .custom_freq = 0x2a098acb, ++ }, ++ [VC4_VEC_TV_MODE_SECAM] = { ++ .mode = &drm_mode_576i, ++ .config0 = VEC_CONFIG0_SECAM_STD, ++ .config1 = VEC_CONFIG1_C_CVBS_CVBS, ++ .custom_freq = 0x29c71c72, ++ }, + }; + + static enum drm_connector_status +@@ -503,8 +562,12 @@ static const struct of_device_id vc4_vec + static const char * const tv_mode_names[] = { + [VC4_VEC_TV_MODE_NTSC] = "NTSC", + [VC4_VEC_TV_MODE_NTSC_J] = "NTSC-J", ++ [VC4_VEC_TV_MODE_NTSC_443] = "NTSC-443", + [VC4_VEC_TV_MODE_PAL] = "PAL", + [VC4_VEC_TV_MODE_PAL_M] = "PAL-M", ++ [VC4_VEC_TV_MODE_PAL_N] = "PAL-N", ++ [VC4_VEC_TV_MODE_PAL60] = "PAL60", ++ [VC4_VEC_TV_MODE_SECAM] = "SECAM", + }; + + static int vc4_vec_bind(struct device *dev, struct device *master, void *data) diff --git a/target/linux/bcm27xx/patches-6.1/950-0009-drm-vc4-Allow-setting-the-TV-norm-via-module-paramet.patch b/target/linux/bcm27xx/patches-6.1/950-0009-drm-vc4-Allow-setting-the-TV-norm-via-module-paramet.patch new file mode 100644 index 00000000000..cfdcf12d469 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0009-drm-vc4-Allow-setting-the-TV-norm-via-module-paramet.patch @@ -0,0 +1,143 @@ +From b5b92244feaa5b39a66fe0dace0d25d576079f0d Mon Sep 17 00:00:00 2001 +From: Mateusz Kwiatkowski +Date: Thu, 15 Jul 2021 01:08:01 +0200 +Subject: [PATCH] drm/vc4: Allow setting the TV norm via module + parameter + +Similar to the ch7006 and nouveau drivers, introduce a "tv_mode" module +parameter that allow setting the TV norm by specifying vc4.tv_norm= on +the kernel command line. + +If that is not specified, try inferring one of the most popular norms +(PAL or NTSC) from the video mode specified on the command line. On +Raspberry Pis, this causes the most common cases of the sdtv_mode +setting in config.txt to be respected. + +Signed-off-by: Mateusz Kwiatkowski +--- + drivers/gpu/drm/vc4/vc4_vec.c | 72 ++++++++++++++++++++++++++++------- + 1 file changed, 58 insertions(+), 14 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_vec.c ++++ b/drivers/gpu/drm/vc4/vc4_vec.c +@@ -67,7 +67,7 @@ + #define VEC_CONFIG0_YCDELAY BIT(4) + #define VEC_CONFIG0_RAMPEN BIT(2) + #define VEC_CONFIG0_YCDIS BIT(2) +-#define VEC_CONFIG0_STD_MASK GENMASK(1, 0) ++#define VEC_CONFIG0_STD_MASK (VEC_CONFIG0_SECAM_STD | GENMASK(1, 0)) + #define VEC_CONFIG0_NTSC_STD 0 + #define VEC_CONFIG0_PAL_BDGHI_STD 1 + #define VEC_CONFIG0_PAL_M_STD 2 +@@ -186,6 +186,8 @@ + #define VEC_DAC_MISC_DAC_RST_N BIT(0) + + ++static char *vc4_vec_tv_norm; ++ + struct vc4_vec_variant { + u32 dac_config; + }; +@@ -321,6 +323,44 @@ static const struct vc4_vec_tv_mode vc4_ + }, + }; + ++static const char * const tv_mode_names[] = { ++ [VC4_VEC_TV_MODE_NTSC] = "NTSC", ++ [VC4_VEC_TV_MODE_NTSC_J] = "NTSC-J", ++ [VC4_VEC_TV_MODE_NTSC_443] = "NTSC-443", ++ [VC4_VEC_TV_MODE_PAL] = "PAL", ++ [VC4_VEC_TV_MODE_PAL_M] = "PAL-M", ++ [VC4_VEC_TV_MODE_PAL_N] = "PAL-N", ++ [VC4_VEC_TV_MODE_PAL60] = "PAL60", ++ [VC4_VEC_TV_MODE_SECAM] = "SECAM", ++}; ++ ++enum vc4_vec_tv_mode_id ++vc4_vec_get_default_mode(struct drm_connector *connector) ++{ ++ int i; ++ ++ if (vc4_vec_tv_norm) { ++ for (i = 0; i < ARRAY_SIZE(tv_mode_names); i++) ++ if (strcmp(vc4_vec_tv_norm, tv_mode_names[i]) == 0) ++ return (enum vc4_vec_tv_mode_id) i; ++ } else if (connector->cmdline_mode.specified && ++ ((connector->cmdline_mode.refresh_specified && ++ (connector->cmdline_mode.refresh == 25 || ++ connector->cmdline_mode.refresh == 50)) || ++ (!connector->cmdline_mode.refresh_specified && ++ (connector->cmdline_mode.yres == 288 || ++ connector->cmdline_mode.yres == 576)))) { ++ /* ++ * no explicitly specified TV norm; use PAL if a mode that ++ * looks like PAL has been specified on the command line ++ */ ++ return VC4_VEC_TV_MODE_PAL; ++ } ++ ++ /* in all other cases, default to NTSC */ ++ return VC4_VEC_TV_MODE_NTSC; ++} ++ + static enum drm_connector_status + vc4_vec_connector_detect(struct drm_connector *connector, bool force) + { +@@ -344,10 +384,18 @@ static int vc4_vec_connector_get_modes(s + return 1; + } + ++static void vc4_vec_connector_reset(struct drm_connector *connector) ++{ ++ drm_atomic_helper_connector_reset(connector); ++ /* preserve TV standard */ ++ if (connector->state) ++ connector->state->tv.mode = vc4_vec_get_default_mode(connector); ++} ++ + static const struct drm_connector_funcs vc4_vec_connector_funcs = { + .detect = vc4_vec_connector_detect, + .fill_modes = drm_helper_probe_single_connector_modes, +- .reset = drm_atomic_helper_connector_reset, ++ .reset = vc4_vec_connector_reset, + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, + }; +@@ -372,7 +420,7 @@ static int vc4_vec_connector_init(struct + + drm_object_attach_property(&connector->base, + dev->mode_config.tv_mode_property, +- VC4_VEC_TV_MODE_NTSC); ++ vc4_vec_get_default_mode(connector)); + + drm_connector_attach_encoder(connector, &vec->encoder.base); + +@@ -559,17 +607,6 @@ static const struct of_device_id vc4_vec + { /* sentinel */ }, + }; + +-static const char * const tv_mode_names[] = { +- [VC4_VEC_TV_MODE_NTSC] = "NTSC", +- [VC4_VEC_TV_MODE_NTSC_J] = "NTSC-J", +- [VC4_VEC_TV_MODE_NTSC_443] = "NTSC-443", +- [VC4_VEC_TV_MODE_PAL] = "PAL", +- [VC4_VEC_TV_MODE_PAL_M] = "PAL-M", +- [VC4_VEC_TV_MODE_PAL_N] = "PAL-N", +- [VC4_VEC_TV_MODE_PAL60] = "PAL60", +- [VC4_VEC_TV_MODE_SECAM] = "SECAM", +-}; +- + static int vc4_vec_bind(struct device *dev, struct device *master, void *data) + { + struct platform_device *pdev = to_platform_device(dev); +@@ -650,3 +687,10 @@ struct platform_driver vc4_vec_driver = + .of_match_table = vc4_vec_dt_match, + }, + }; ++ ++module_param_named(tv_norm, vc4_vec_tv_norm, charp, 0600); ++MODULE_PARM_DESC(tv_norm, "Default TV norm.\n" ++ "\t\tSupported: NTSC, NTSC-J, NTSC-443, PAL, PAL-M, PAL-N,\n" ++ "\t\t\tPAL60, SECAM.\n" ++ "\t\tDefault: PAL if a 50 Hz mode has been set via video=,\n" ++ "\t\t\tNTSC otherwise"); diff --git a/target/linux/bcm27xx/patches-6.1/950-0010-drm-vc4-Refactor-mode-checking-logic.patch b/target/linux/bcm27xx/patches-6.1/950-0010-drm-vc4-Refactor-mode-checking-logic.patch new file mode 100644 index 00000000000..ca67a9c4cde --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0010-drm-vc4-Refactor-mode-checking-logic.patch @@ -0,0 +1,82 @@ +From 3246c9abe5f4358cc5c60b8621485faa9883d06b Mon Sep 17 00:00:00 2001 +From: Mateusz Kwiatkowski +Date: Thu, 15 Jul 2021 01:08:05 +0200 +Subject: [PATCH] drm/vc4: Refactor mode checking logic + +Replace drm_encoder_helper_funcs::atomic_check with +drm_connector_helper_funcs::atomic_check - the former is not called +during drm_mode_obj_set_property_ioctl(). Set crtc_state->mode_changed +if TV norm changes even without explicit mode change. This makes things +like "xrandr --output Composite-1 --set mode PAL-M" work properly. + +Signed-off-by: Mateusz Kwiatkowski +--- + drivers/gpu/drm/vc4/vc4_vec.c | 42 ++++++++++++++++++++++------------- + 1 file changed, 26 insertions(+), 16 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_vec.c ++++ b/drivers/gpu/drm/vc4/vc4_vec.c +@@ -392,6 +392,31 @@ static void vc4_vec_connector_reset(stru + connector->state->tv.mode = vc4_vec_get_default_mode(connector); + } + ++static int vc4_vec_connector_atomic_check(struct drm_connector *conn, ++ struct drm_atomic_state *state) ++{ ++ struct drm_connector_state *old_state = ++ drm_atomic_get_old_connector_state(state, conn); ++ struct drm_connector_state *new_state = ++ drm_atomic_get_new_connector_state(state, conn); ++ ++ const struct vc4_vec_tv_mode *vec_mode = ++ &vc4_vec_tv_modes[new_state->tv.mode]; ++ ++ if (new_state->crtc) { ++ struct drm_crtc_state *crtc_state = ++ drm_atomic_get_new_crtc_state(state, new_state->crtc); ++ ++ if (!drm_mode_equal(vec_mode->mode, &crtc_state->mode)) ++ return -EINVAL; ++ ++ if (old_state->tv.mode != new_state->tv.mode) ++ crtc_state->mode_changed = true; ++ } ++ ++ return 0; ++} ++ + static const struct drm_connector_funcs vc4_vec_connector_funcs = { + .detect = vc4_vec_connector_detect, + .fill_modes = drm_helper_probe_single_connector_modes, +@@ -402,6 +427,7 @@ static const struct drm_connector_funcs + + static const struct drm_connector_helper_funcs vc4_vec_connector_helper_funcs = { + .get_modes = vc4_vec_connector_get_modes, ++ .atomic_check = vc4_vec_connector_atomic_check, + }; + + static int vc4_vec_connector_init(struct drm_device *dev, struct vc4_vec *vec) +@@ -550,23 +576,7 @@ err_dev_exit: + drm_dev_exit(idx); + } + +-static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder, +- struct drm_crtc_state *crtc_state, +- struct drm_connector_state *conn_state) +-{ +- const struct vc4_vec_tv_mode *vec_mode; +- +- vec_mode = &vc4_vec_tv_modes[conn_state->tv.mode]; +- +- if (conn_state->crtc && +- !drm_mode_equal(vec_mode->mode, &crtc_state->adjusted_mode)) +- return -EINVAL; +- +- return 0; +-} +- + static const struct drm_encoder_helper_funcs vc4_vec_encoder_helper_funcs = { +- .atomic_check = vc4_vec_encoder_atomic_check, + .atomic_disable = vc4_vec_encoder_disable, + .atomic_enable = vc4_vec_encoder_enable, + }; diff --git a/target/linux/bcm27xx/patches-6.1/950-0011-drm-vc4-Add-firmware-kms-mode.patch b/target/linux/bcm27xx/patches-6.1/950-0011-drm-vc4-Add-firmware-kms-mode.patch new file mode 100644 index 00000000000..b01a78c0150 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0011-drm-vc4-Add-firmware-kms-mode.patch @@ -0,0 +1,2476 @@ +From 2f74e0d6dd9f545a3b1dcc8d3cdf0ccf55a6f7d0 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Mon, 7 Sep 2020 17:32:27 +0100 +Subject: [PATCH] drm/vc4: Add firmware-kms mode + +This is a squash of all firmware-kms related patches from previous +branches, up to and including +"drm/vc4: Set the possible crtcs mask correctly for planes with FKMS" +plus a couple of minor fixups for the 5.9 branch. +Please refer to earlier branches for full history. + +This patch includes work by Eric Anholt, James Hughes, Phil Elwell, +Dave Stevenson, Dom Cobley, and Jonathon Bell. + +Signed-off-by: Dave Stevenson + +drm/vc4: Fixup firmware-kms after "drm/atomic: Pass the full state to CRTC atomic enable/disable" + +Prototype for those calls changed, so amend fkms (which isn't +upstream) to match. + +Signed-off-by: Dave Stevenson + +drm/vc4: Fixup fkms for API change + +Atomic flush and check changed API, so fix up the downstream-only +FKMS driver. + +Signed-off-by: Dave Stevenson + +drm/vc4: Make normalize_zpos conditional on using fkms + +Eric's view was that there was no point in having zpos +support on vc4 as all the planes had the same functionality. + +Can be later squashed into (and fixes): +drm/vc4: Add firmware-kms mode + +Signed-off-by: Dom Cobley + +drm/vc4: FKMS: Change of Broadcast RGB mode needs a mode change + +The Broadcast RGB (aka HDMI limited/full range) property is only +notified to the firmware on mode change, so this needs to be +signalled when set. + +https://github.com/raspberrypi/firmware/issues/1580 + +Signed-off-by: Dave Stevenson + +vc4/drv: Only notify firmware of display done with kms + +fkms driver still wants firmware display to be active + +Signed-off-by: Dom Cobley + +ydrm/vc4: fkms: Fix margin calculations for the right/bottom edges + +The calculations clipped the right/bottom edge of the clipped +range based on the left/top margins. + +https://github.com/raspberrypi/linux/issues/4447 + +Signed-off-by: Dave Stevenson + +drm/vc4: fkms: Use new devm_rpi_firmware_get api + +drm/kms: Add allow_fb_modifiers + +Signed-off-by: Dom Cobley +--- + drivers/gpu/drm/vc4/Makefile | 1 + + drivers/gpu/drm/vc4/vc4_debugfs.c | 3 +- + drivers/gpu/drm/vc4/vc4_drv.c | 29 +- + drivers/gpu/drm/vc4/vc4_drv.h | 7 + + drivers/gpu/drm/vc4/vc4_firmware_kms.c | 1997 ++++++++++++++++++++++++ + drivers/gpu/drm/vc4/vc4_kms.c | 35 +- + drivers/gpu/drm/vc4/vc_image_types.h | 175 +++ + 7 files changed, 2233 insertions(+), 14 deletions(-) + create mode 100644 drivers/gpu/drm/vc4/vc4_firmware_kms.c + create mode 100644 drivers/gpu/drm/vc4/vc_image_types.h + +--- a/drivers/gpu/drm/vc4/Makefile ++++ b/drivers/gpu/drm/vc4/Makefile +@@ -9,6 +9,7 @@ vc4-y := \ + vc4_dpi.o \ + vc4_dsi.o \ + vc4_fence.o \ ++ vc4_firmware_kms.o \ + vc4_kms.o \ + vc4_gem.o \ + vc4_hdmi.o \ +--- a/drivers/gpu/drm/vc4/vc4_debugfs.c ++++ b/drivers/gpu/drm/vc4/vc4_debugfs.c +@@ -24,7 +24,8 @@ vc4_debugfs_init(struct drm_minor *minor + struct vc4_dev *vc4 = to_vc4_dev(minor->dev); + struct drm_device *drm = &vc4->base; + +- drm_WARN_ON(drm, vc4_hvs_debugfs_init(minor)); ++ if (vc4->hvs) ++ drm_WARN_ON(drm, vc4_hvs_debugfs_init(minor)); + + if (vc4->v3d) { + drm_WARN_ON(drm, vc4_bo_debugfs_init(minor)); +--- a/drivers/gpu/drm/vc4/vc4_drv.c ++++ b/drivers/gpu/drm/vc4/vc4_drv.c +@@ -284,6 +284,18 @@ static const struct of_device_id vc4_dma + {} + }; + ++/* ++ * we need this helper function for determining presence of fkms ++ * before it's been bound ++ */ ++static bool firmware_kms(void) ++{ ++ return of_device_is_available(of_find_compatible_node(NULL, NULL, ++ "raspberrypi,rpi-firmware-kms")) || ++ of_device_is_available(of_find_compatible_node(NULL, NULL, ++ "raspberrypi,rpi-firmware-kms-2711")); ++} ++ + static int vc4_drm_bind(struct device *dev) + { + struct platform_device *pdev = to_platform_device(dev); +@@ -357,7 +369,7 @@ static int vc4_drm_bind(struct device *d + if (ret) + return ret; + +- if (firmware) { ++ if (firmware && !firmware_kms()) { + ret = rpi_firmware_property(firmware, + RPI_FIRMWARE_NOTIFY_DISPLAY_DONE, + NULL, 0); +@@ -375,16 +387,20 @@ static int vc4_drm_bind(struct device *d + if (ret) + return ret; + +- ret = vc4_plane_create_additional_planes(drm); +- if (ret) +- goto unbind_all; ++ if (!vc4->firmware_kms) { ++ ret = vc4_plane_create_additional_planes(drm); ++ if (ret) ++ return ret; ++ } + + ret = vc4_kms_load(drm); + if (ret < 0) + goto unbind_all; + +- drm_for_each_crtc(crtc, drm) +- vc4_crtc_disable_at_boot(crtc); ++ if (!vc4->firmware_kms) { ++ drm_for_each_crtc(crtc, drm) ++ vc4_crtc_disable_at_boot(crtc); ++ } + + ret = drm_dev_register(drm, 0); + if (ret < 0) +@@ -428,6 +444,7 @@ static struct platform_driver *const com + &vc4_dsi_driver, + &vc4_txp_driver, + &vc4_crtc_driver, ++ &vc4_firmware_kms_driver, + &vc4_v3d_driver, + }; + +--- a/drivers/gpu/drm/vc4/vc4_drv.h ++++ b/drivers/gpu/drm/vc4/vc4_drv.h +@@ -82,8 +82,12 @@ struct vc4_dev { + + unsigned int irq; + ++ bool firmware_kms; ++ struct rpi_firmware *firmware; ++ + struct vc4_hvs *hvs; + struct vc4_v3d *v3d; ++ struct vc4_fkms *fkms; + + struct vc4_hang_state *hang_state; + +@@ -905,6 +909,9 @@ extern struct platform_driver vc4_dsi_dr + /* vc4_fence.c */ + extern const struct dma_fence_ops vc4_fence_ops; + ++/* vc4_firmware_kms.c */ ++extern struct platform_driver vc4_firmware_kms_driver; ++ + /* vc4_gem.c */ + int vc4_gem_init(struct drm_device *dev); + int vc4_submit_cl_ioctl(struct drm_device *dev, void *data, +--- /dev/null ++++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c +@@ -0,0 +1,1997 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * Copyright (C) 2016 Broadcom ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++/** ++ * DOC: VC4 firmware KMS module. ++ * ++ * As a hack to get us from the current closed source driver world ++ * toward a totally open stack, implement KMS on top of the Raspberry ++ * Pi's firmware display stack. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include "vc4_drv.h" ++#include "vc4_regs.h" ++#include "vc_image_types.h" ++ ++int fkms_max_refresh_rate = 85; ++module_param(fkms_max_refresh_rate, int, 0644); ++MODULE_PARM_DESC(fkms_max_refresh_rate, "Max supported refresh rate"); ++ ++struct get_display_cfg { ++ u32 max_pixel_clock[2]; //Max pixel clock for each display ++}; ++ ++struct vc4_fkms { ++ struct get_display_cfg cfg; ++ bool bcm2711; ++}; ++ ++#define PLANES_PER_CRTC 8 ++ ++struct set_plane { ++ u8 display; ++ u8 plane_id; ++ u8 vc_image_type; ++ s8 layer; ++ ++ u16 width; ++ u16 height; ++ ++ u16 pitch; ++ u16 vpitch; ++ ++ u32 src_x; /* 16p16 */ ++ u32 src_y; /* 16p16 */ ++ ++ u32 src_w; /* 16p16 */ ++ u32 src_h; /* 16p16 */ ++ ++ s16 dst_x; ++ s16 dst_y; ++ ++ u16 dst_w; ++ u16 dst_h; ++ ++ u8 alpha; ++ u8 num_planes; ++ u8 is_vu; ++ u8 color_encoding; ++ ++ u32 planes[4]; /* DMA address of each plane */ ++ ++ u32 transform; ++}; ++ ++/* Values for the transform field */ ++#define TRANSFORM_NO_ROTATE 0 ++#define TRANSFORM_ROTATE_180 BIT(1) ++#define TRANSFORM_FLIP_HRIZ BIT(16) ++#define TRANSFORM_FLIP_VERT BIT(17) ++ ++struct mailbox_set_plane { ++ struct rpi_firmware_property_tag_header tag; ++ struct set_plane plane; ++}; ++ ++struct mailbox_blank_display { ++ struct rpi_firmware_property_tag_header tag1; ++ u32 display; ++ struct rpi_firmware_property_tag_header tag2; ++ u32 blank; ++}; ++ ++struct mailbox_display_pwr { ++ struct rpi_firmware_property_tag_header tag1; ++ u32 display; ++ u32 state; ++}; ++ ++struct mailbox_get_edid { ++ struct rpi_firmware_property_tag_header tag1; ++ u32 block; ++ u32 display_number; ++ u8 edid[128]; ++}; ++ ++struct set_timings { ++ u8 display; ++ u8 padding; ++ u16 video_id_code; ++ ++ u32 clock; /* in kHz */ ++ ++ u16 hdisplay; ++ u16 hsync_start; ++ ++ u16 hsync_end; ++ u16 htotal; ++ ++ u16 hskew; ++ u16 vdisplay; ++ ++ u16 vsync_start; ++ u16 vsync_end; ++ ++ u16 vtotal; ++ u16 vscan; ++ ++ u16 vrefresh; ++ u16 padding2; ++ ++ u32 flags; ++#define TIMINGS_FLAGS_H_SYNC_POS BIT(0) ++#define TIMINGS_FLAGS_H_SYNC_NEG 0 ++#define TIMINGS_FLAGS_V_SYNC_POS BIT(1) ++#define TIMINGS_FLAGS_V_SYNC_NEG 0 ++#define TIMINGS_FLAGS_INTERLACE BIT(2) ++ ++#define TIMINGS_FLAGS_ASPECT_MASK GENMASK(7, 4) ++#define TIMINGS_FLAGS_ASPECT_NONE (0 << 4) ++#define TIMINGS_FLAGS_ASPECT_4_3 (1 << 4) ++#define TIMINGS_FLAGS_ASPECT_16_9 (2 << 4) ++#define TIMINGS_FLAGS_ASPECT_64_27 (3 << 4) ++#define TIMINGS_FLAGS_ASPECT_256_135 (4 << 4) ++ ++/* Limited range RGB flag. Not set corresponds to full range. */ ++#define TIMINGS_FLAGS_RGB_LIMITED BIT(8) ++/* DVI monitor, therefore disable infoframes. Not set corresponds to HDMI. */ ++#define TIMINGS_FLAGS_DVI BIT(9) ++/* Double clock */ ++#define TIMINGS_FLAGS_DBL_CLK BIT(10) ++}; ++ ++struct mailbox_set_mode { ++ struct rpi_firmware_property_tag_header tag1; ++ struct set_timings timings; ++}; ++ ++static const struct vc_image_format { ++ u32 drm; /* DRM_FORMAT_* */ ++ u32 vc_image; /* VC_IMAGE_* */ ++ u32 is_vu; ++} vc_image_formats[] = { ++ { ++ .drm = DRM_FORMAT_XRGB8888, ++ .vc_image = VC_IMAGE_XRGB8888, ++ }, ++ { ++ .drm = DRM_FORMAT_ARGB8888, ++ .vc_image = VC_IMAGE_ARGB8888, ++ }, ++/* ++ * FIXME: Need to resolve which DRM format goes to which vc_image format ++ * for the remaining RGBA and RGBX formats. ++ * { ++ * .drm = DRM_FORMAT_ABGR8888, ++ * .vc_image = VC_IMAGE_RGBA8888, ++ * }, ++ * { ++ * .drm = DRM_FORMAT_XBGR8888, ++ * .vc_image = VC_IMAGE_RGBA8888, ++ * }, ++ */ ++ { ++ .drm = DRM_FORMAT_RGB565, ++ .vc_image = VC_IMAGE_RGB565, ++ }, ++ { ++ .drm = DRM_FORMAT_RGB888, ++ .vc_image = VC_IMAGE_BGR888, ++ }, ++ { ++ .drm = DRM_FORMAT_BGR888, ++ .vc_image = VC_IMAGE_RGB888, ++ }, ++ { ++ .drm = DRM_FORMAT_YUV422, ++ .vc_image = VC_IMAGE_YUV422PLANAR, ++ }, ++ { ++ .drm = DRM_FORMAT_YUV420, ++ .vc_image = VC_IMAGE_YUV420, ++ }, ++ { ++ .drm = DRM_FORMAT_YVU420, ++ .vc_image = VC_IMAGE_YUV420, ++ .is_vu = 1, ++ }, ++ { ++ .drm = DRM_FORMAT_NV12, ++ .vc_image = VC_IMAGE_YUV420SP, ++ }, ++ { ++ .drm = DRM_FORMAT_NV21, ++ .vc_image = VC_IMAGE_YUV420SP, ++ .is_vu = 1, ++ }, ++ { ++ .drm = DRM_FORMAT_P030, ++ .vc_image = VC_IMAGE_YUV10COL, ++ }, ++}; ++ ++static const struct vc_image_format *vc4_get_vc_image_fmt(u32 drm_format) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < ARRAY_SIZE(vc_image_formats); i++) { ++ if (vc_image_formats[i].drm == drm_format) ++ return &vc_image_formats[i]; ++ } ++ ++ return NULL; ++} ++ ++/* The firmware delivers a vblank interrupt to us through the SMI ++ * hardware, which has only this one register. ++ */ ++#define SMICS 0x0 ++#define SMIDSW0 0x14 ++#define SMIDSW1 0x1C ++#define SMICS_INTERRUPTS (BIT(9) | BIT(10) | BIT(11)) ++ ++/* Flag to denote that the firmware is giving multiple display callbacks */ ++#define SMI_NEW 0xabcd0000 ++ ++#define vc4_crtc vc4_kms_crtc ++#define to_vc4_crtc to_vc4_kms_crtc ++struct vc4_crtc { ++ struct drm_crtc base; ++ struct drm_encoder *encoder; ++ struct drm_connector *connector; ++ void __iomem *regs; ++ ++ struct drm_pending_vblank_event *event; ++ bool vblank_enabled; ++ u32 display_number; ++ u32 display_type; ++}; ++ ++static inline struct vc4_crtc *to_vc4_crtc(struct drm_crtc *crtc) ++{ ++ return container_of(crtc, struct vc4_crtc, base); ++} ++ ++struct vc4_fkms_encoder { ++ struct drm_encoder base; ++ bool hdmi_monitor; ++ bool rgb_range_selectable; ++ int display_num; ++}; ++ ++static inline struct vc4_fkms_encoder * ++to_vc4_fkms_encoder(struct drm_encoder *encoder) ++{ ++ return container_of(encoder, struct vc4_fkms_encoder, base); ++} ++ ++/* "Broadcast RGB" property. ++ * Allows overriding of HDMI full or limited range RGB ++ */ ++#define VC4_BROADCAST_RGB_AUTO 0 ++#define VC4_BROADCAST_RGB_FULL 1 ++#define VC4_BROADCAST_RGB_LIMITED 2 ++ ++/* VC4 FKMS connector KMS struct */ ++struct vc4_fkms_connector { ++ struct drm_connector base; ++ ++ /* Since the connector is attached to just the one encoder, ++ * this is the reference to it so we can do the best_encoder() ++ * hook. ++ */ ++ struct drm_encoder *encoder; ++ struct vc4_dev *vc4_dev; ++ u32 display_number; ++ u32 display_type; ++ ++ struct drm_property *broadcast_rgb_property; ++}; ++ ++static inline struct vc4_fkms_connector * ++to_vc4_fkms_connector(struct drm_connector *connector) ++{ ++ return container_of(connector, struct vc4_fkms_connector, base); ++} ++ ++/* VC4 FKMS connector state */ ++struct vc4_fkms_connector_state { ++ struct drm_connector_state base; ++ ++ int broadcast_rgb; ++}; ++ ++#define to_vc4_fkms_connector_state(x) \ ++ container_of(x, struct vc4_fkms_connector_state, base) ++ ++static u32 vc4_get_display_type(u32 display_number) ++{ ++ const u32 display_types[] = { ++ /* The firmware display (DispmanX) IDs map to specific types in ++ * a fixed manner. ++ */ ++ DRM_MODE_ENCODER_DSI, /* MAIN_LCD - DSI or DPI */ ++ DRM_MODE_ENCODER_DSI, /* AUX_LCD */ ++ DRM_MODE_ENCODER_TMDS, /* HDMI0 */ ++ DRM_MODE_ENCODER_TVDAC, /* VEC */ ++ DRM_MODE_ENCODER_NONE, /* FORCE_LCD */ ++ DRM_MODE_ENCODER_NONE, /* FORCE_TV */ ++ DRM_MODE_ENCODER_NONE, /* FORCE_OTHER */ ++ DRM_MODE_ENCODER_TMDS, /* HDMI1 */ ++ DRM_MODE_ENCODER_NONE, /* FORCE_TV2 */ ++ }; ++ return display_number > ARRAY_SIZE(display_types) - 1 ? ++ DRM_MODE_ENCODER_NONE : display_types[display_number]; ++} ++ ++/* Firmware's structure for making an FB mbox call. */ ++struct fbinfo_s { ++ u32 xres, yres, xres_virtual, yres_virtual; ++ u32 pitch, bpp; ++ u32 xoffset, yoffset; ++ u32 base; ++ u32 screen_size; ++ u16 cmap[256]; ++}; ++ ++struct vc4_fkms_plane { ++ struct drm_plane base; ++ struct fbinfo_s *fbinfo; ++ dma_addr_t fbinfo_bus_addr; ++ u32 pitch; ++ struct mailbox_set_plane mb; ++}; ++ ++static inline struct vc4_fkms_plane *to_vc4_fkms_plane(struct drm_plane *plane) ++{ ++ return (struct vc4_fkms_plane *)plane; ++} ++ ++static int vc4_plane_set_blank(struct drm_plane *plane, bool blank) ++{ ++ struct vc4_dev *vc4 = to_vc4_dev(plane->dev); ++ struct vc4_fkms_plane *vc4_plane = to_vc4_fkms_plane(plane); ++ struct mailbox_set_plane blank_mb = { ++ .tag = { RPI_FIRMWARE_SET_PLANE, sizeof(struct set_plane), 0 }, ++ .plane = { ++ .display = vc4_plane->mb.plane.display, ++ .plane_id = vc4_plane->mb.plane.plane_id, ++ } ++ }; ++ static const char * const plane_types[] = { ++ "overlay", ++ "primary", ++ "cursor" ++ }; ++ int ret; ++ ++ DRM_DEBUG_ATOMIC("[PLANE:%d:%s] %s plane %s", ++ plane->base.id, plane->name, plane_types[plane->type], ++ blank ? "blank" : "unblank"); ++ ++ if (blank) ++ ret = rpi_firmware_property_list(vc4->firmware, &blank_mb, ++ sizeof(blank_mb)); ++ else ++ ret = rpi_firmware_property_list(vc4->firmware, &vc4_plane->mb, ++ sizeof(vc4_plane->mb)); ++ ++ WARN_ONCE(ret, "%s: firmware call failed. Please update your firmware", ++ __func__); ++ return ret; ++} ++ ++static void vc4_fkms_crtc_get_margins(struct drm_crtc_state *state, ++ unsigned int *left, unsigned int *right, ++ unsigned int *top, unsigned int *bottom) ++{ ++ struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(state); ++ struct drm_connector_state *conn_state; ++ struct drm_connector *conn; ++ int i; ++ ++ *left = vc4_state->margins.left; ++ *right = vc4_state->margins.right; ++ *top = vc4_state->margins.top; ++ *bottom = vc4_state->margins.bottom; ++ ++ /* We have to interate over all new connector states because ++ * vc4_fkms_crtc_get_margins() might be called before ++ * vc4_fkms_crtc_atomic_check() which means margins info in ++ * vc4_crtc_state might be outdated. ++ */ ++ for_each_new_connector_in_state(state->state, conn, conn_state, i) { ++ if (conn_state->crtc != state->crtc) ++ continue; ++ ++ *left = conn_state->tv.margins.left; ++ *right = conn_state->tv.margins.right; ++ *top = conn_state->tv.margins.top; ++ *bottom = conn_state->tv.margins.bottom; ++ break; ++ } ++} ++ ++static int vc4_fkms_margins_adj(struct drm_plane_state *pstate, ++ struct set_plane *plane) ++{ ++ unsigned int left, right, top, bottom; ++ int adjhdisplay, adjvdisplay; ++ struct drm_crtc_state *crtc_state; ++ ++ crtc_state = drm_atomic_get_new_crtc_state(pstate->state, ++ pstate->crtc); ++ ++ vc4_fkms_crtc_get_margins(crtc_state, &left, &right, &top, &bottom); ++ ++ if (!left && !right && !top && !bottom) ++ return 0; ++ ++ if (left + right >= crtc_state->mode.hdisplay || ++ top + bottom >= crtc_state->mode.vdisplay) ++ return -EINVAL; ++ ++ adjhdisplay = crtc_state->mode.hdisplay - (left + right); ++ plane->dst_x = DIV_ROUND_CLOSEST(plane->dst_x * adjhdisplay, ++ (int)crtc_state->mode.hdisplay); ++ plane->dst_x += left; ++ if (plane->dst_x > (int)(crtc_state->mode.hdisplay - right)) ++ plane->dst_x = crtc_state->mode.hdisplay - right; ++ ++ adjvdisplay = crtc_state->mode.vdisplay - (top + bottom); ++ plane->dst_y = DIV_ROUND_CLOSEST(plane->dst_y * adjvdisplay, ++ (int)crtc_state->mode.vdisplay); ++ plane->dst_y += top; ++ if (plane->dst_y > (int)(crtc_state->mode.vdisplay - bottom)) ++ plane->dst_y = crtc_state->mode.vdisplay - bottom; ++ ++ plane->dst_w = DIV_ROUND_CLOSEST(plane->dst_w * adjhdisplay, ++ crtc_state->mode.hdisplay); ++ plane->dst_h = DIV_ROUND_CLOSEST(plane->dst_h * adjvdisplay, ++ crtc_state->mode.vdisplay); ++ ++ if (!plane->dst_w || !plane->dst_h) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static void vc4_plane_atomic_update(struct drm_plane *plane, ++ struct drm_atomic_state *old_state) ++{ ++ struct drm_plane_state *state = plane->state; ++ ++ /* ++ * Do NOT set now, as we haven't checked if the crtc is active or not. ++ * Set from vc4_plane_set_blank instead. ++ * ++ * If the CRTC is on (or going to be on) and we're enabled, ++ * then unblank. Otherwise, stay blank until CRTC enable. ++ */ ++ if (state->crtc->state->active) ++ vc4_plane_set_blank(plane, false); ++} ++ ++static void vc4_plane_atomic_disable(struct drm_plane *plane, ++ struct drm_atomic_state *old_state) ++{ ++ struct drm_plane_state *state = plane->state; ++ struct vc4_fkms_plane *vc4_plane = to_vc4_fkms_plane(plane); ++ ++ DRM_DEBUG_ATOMIC("[PLANE:%d:%s] plane disable %dx%d@%d +%d,%d\n", ++ plane->base.id, plane->name, ++ state->crtc_w, ++ state->crtc_h, ++ vc4_plane->mb.plane.vc_image_type, ++ state->crtc_x, ++ state->crtc_y); ++ vc4_plane_set_blank(plane, true); ++} ++ ++static bool plane_enabled(struct drm_plane_state *state) ++{ ++ return state->fb && state->crtc; ++} ++ ++static int vc4_plane_to_mb(struct drm_plane *plane, ++ struct mailbox_set_plane *mb, ++ struct drm_plane_state *state) ++{ ++ struct drm_framebuffer *fb = state->fb; ++ struct drm_gem_dma_object *bo = drm_fb_dma_get_gem_obj(fb, 0); ++ const struct drm_format_info *drm_fmt = fb->format; ++ const struct vc_image_format *vc_fmt = ++ vc4_get_vc_image_fmt(drm_fmt->format); ++ int num_planes = fb->format->num_planes; ++ unsigned int rotation; ++ ++ mb->plane.vc_image_type = vc_fmt->vc_image; ++ mb->plane.width = fb->width; ++ mb->plane.height = fb->height; ++ mb->plane.pitch = fb->pitches[0]; ++ mb->plane.src_w = state->src_w; ++ mb->plane.src_h = state->src_h; ++ mb->plane.src_x = state->src_x; ++ mb->plane.src_y = state->src_y; ++ mb->plane.dst_w = state->crtc_w; ++ mb->plane.dst_h = state->crtc_h; ++ mb->plane.dst_x = state->crtc_x; ++ mb->plane.dst_y = state->crtc_y; ++ mb->plane.alpha = state->alpha >> 8; ++ mb->plane.layer = state->normalized_zpos ? ++ state->normalized_zpos : -127; ++ mb->plane.num_planes = num_planes; ++ mb->plane.is_vu = vc_fmt->is_vu; ++ mb->plane.planes[0] = bo->dma_addr + fb->offsets[0]; ++ ++ rotation = drm_rotation_simplify(state->rotation, ++ DRM_MODE_ROTATE_0 | ++ DRM_MODE_REFLECT_X | ++ DRM_MODE_REFLECT_Y); ++ ++ mb->plane.transform = TRANSFORM_NO_ROTATE; ++ if (rotation & DRM_MODE_REFLECT_X) ++ mb->plane.transform |= TRANSFORM_FLIP_HRIZ; ++ if (rotation & DRM_MODE_REFLECT_Y) ++ mb->plane.transform |= TRANSFORM_FLIP_VERT; ++ ++ vc4_fkms_margins_adj(state, &mb->plane); ++ ++ if (num_planes > 1) { ++ /* Assume this must be YUV */ ++ /* Makes assumptions on the stride for the chroma planes as we ++ * can't easily plumb in non-standard pitches. ++ */ ++ mb->plane.planes[1] = bo->dma_addr + fb->offsets[1]; ++ if (num_planes > 2) ++ mb->plane.planes[2] = bo->dma_addr + fb->offsets[2]; ++ else ++ mb->plane.planes[2] = 0; ++ ++ /* Special case the YUV420 with U and V as line interleaved ++ * planes as we have special handling for that case. ++ */ ++ if (num_planes == 3 && ++ (fb->offsets[2] - fb->offsets[1]) == fb->pitches[1]) ++ mb->plane.vc_image_type = VC_IMAGE_YUV420_S; ++ ++ switch (state->color_encoding) { ++ default: ++ case DRM_COLOR_YCBCR_BT601: ++ if (state->color_range == DRM_COLOR_YCBCR_LIMITED_RANGE) ++ mb->plane.color_encoding = ++ VC_IMAGE_YUVINFO_CSC_ITUR_BT601; ++ else ++ mb->plane.color_encoding = ++ VC_IMAGE_YUVINFO_CSC_JPEG_JFIF; ++ break; ++ case DRM_COLOR_YCBCR_BT709: ++ /* Currently no support for a full range BT709 */ ++ mb->plane.color_encoding = ++ VC_IMAGE_YUVINFO_CSC_ITUR_BT709; ++ break; ++ case DRM_COLOR_YCBCR_BT2020: ++ /* Currently no support for a full range BT2020 */ ++ mb->plane.color_encoding = ++ VC_IMAGE_YUVINFO_CSC_REC_2020; ++ break; ++ } ++ } else { ++ mb->plane.planes[1] = 0; ++ mb->plane.planes[2] = 0; ++ } ++ mb->plane.planes[3] = 0; ++ ++ switch (fourcc_mod_broadcom_mod(fb->modifier)) { ++ case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED: ++ switch (mb->plane.vc_image_type) { ++ case VC_IMAGE_XRGB8888: ++ mb->plane.vc_image_type = VC_IMAGE_TF_RGBX32; ++ break; ++ case VC_IMAGE_ARGB8888: ++ mb->plane.vc_image_type = VC_IMAGE_TF_RGBA32; ++ break; ++ case VC_IMAGE_RGB565: ++ mb->plane.vc_image_type = VC_IMAGE_TF_RGB565; ++ break; ++ } ++ break; ++ case DRM_FORMAT_MOD_BROADCOM_SAND128: ++ switch (mb->plane.vc_image_type) { ++ case VC_IMAGE_YUV420SP: ++ mb->plane.vc_image_type = VC_IMAGE_YUV_UV; ++ break; ++ /* VC_IMAGE_YUV10COL could be included in here, but it is only ++ * valid as a SAND128 format, so the table at the top will have ++ * already set the correct format. ++ */ ++ } ++ /* Note that the column pitch is passed across in lines, not ++ * bytes. ++ */ ++ mb->plane.pitch = fourcc_mod_broadcom_param(fb->modifier); ++ break; ++ } ++ ++ DRM_DEBUG_ATOMIC("[PLANE:%d:%s] plane update %dx%d@%d +dst(%d,%d, %d,%d) +src(%d,%d, %d,%d) 0x%08x/%08x/%08x/%d, alpha %u zpos %u\n", ++ plane->base.id, plane->name, ++ mb->plane.width, ++ mb->plane.height, ++ mb->plane.vc_image_type, ++ state->crtc_x, ++ state->crtc_y, ++ state->crtc_w, ++ state->crtc_h, ++ mb->plane.src_x, ++ mb->plane.src_y, ++ mb->plane.src_w, ++ mb->plane.src_h, ++ mb->plane.planes[0], ++ mb->plane.planes[1], ++ mb->plane.planes[2], ++ fb->pitches[0], ++ state->alpha, ++ state->normalized_zpos); ++ ++ return 0; ++} ++ ++static int vc4_plane_atomic_check(struct drm_plane *plane, ++ struct drm_atomic_state *state) ++{ ++ struct drm_plane_state *new_plane_state = drm_atomic_get_new_plane_state(state, ++ plane); ++ struct vc4_fkms_plane *vc4_plane = to_vc4_fkms_plane(plane); ++ ++ if (!plane_enabled(new_plane_state)) ++ return 0; ++ ++ return vc4_plane_to_mb(plane, &vc4_plane->mb, new_plane_state); ++} ++ ++/* Called during init to allocate the plane's atomic state. */ ++static void vc4_plane_reset(struct drm_plane *plane) ++{ ++ struct vc4_plane_state *vc4_state; ++ ++ WARN_ON(plane->state); ++ ++ vc4_state = kzalloc(sizeof(*vc4_state), GFP_KERNEL); ++ if (!vc4_state) ++ return; ++ ++ __drm_atomic_helper_plane_reset(plane, &vc4_state->base); ++} ++ ++static void vc4_plane_destroy(struct drm_plane *plane) ++{ ++ drm_plane_cleanup(plane); ++} ++ ++static bool vc4_fkms_format_mod_supported(struct drm_plane *plane, ++ uint32_t format, ++ uint64_t modifier) ++{ ++ /* Support T_TILING for RGB formats only. */ ++ switch (format) { ++ case DRM_FORMAT_XRGB8888: ++ case DRM_FORMAT_ARGB8888: ++ case DRM_FORMAT_RGB565: ++ switch (modifier) { ++ case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED: ++ case DRM_FORMAT_MOD_LINEAR: ++ return true; ++ default: ++ return false; ++ } ++ case DRM_FORMAT_NV12: ++ switch (fourcc_mod_broadcom_mod(modifier)) { ++ case DRM_FORMAT_MOD_LINEAR: ++ case DRM_FORMAT_MOD_BROADCOM_SAND128: ++ return true; ++ default: ++ return false; ++ } ++ case DRM_FORMAT_P030: ++ switch (fourcc_mod_broadcom_mod(modifier)) { ++ case DRM_FORMAT_MOD_BROADCOM_SAND128: ++ return true; ++ default: ++ return false; ++ } ++ case DRM_FORMAT_NV21: ++ case DRM_FORMAT_RGB888: ++ case DRM_FORMAT_BGR888: ++ case DRM_FORMAT_YUV422: ++ case DRM_FORMAT_YUV420: ++ case DRM_FORMAT_YVU420: ++ default: ++ return (modifier == DRM_FORMAT_MOD_LINEAR); ++ } ++} ++ ++static struct drm_plane_state *vc4_plane_duplicate_state(struct drm_plane *plane) ++{ ++ struct vc4_plane_state *vc4_state; ++ ++ if (WARN_ON(!plane->state)) ++ return NULL; ++ ++ vc4_state = kzalloc(sizeof(*vc4_state), GFP_KERNEL); ++ if (!vc4_state) ++ return NULL; ++ ++ __drm_atomic_helper_plane_duplicate_state(plane, &vc4_state->base); ++ ++ return &vc4_state->base; ++} ++ ++static const struct drm_plane_funcs vc4_plane_funcs = { ++ .update_plane = drm_atomic_helper_update_plane, ++ .disable_plane = drm_atomic_helper_disable_plane, ++ .destroy = vc4_plane_destroy, ++ .set_property = NULL, ++ .reset = vc4_plane_reset, ++ .atomic_duplicate_state = vc4_plane_duplicate_state, ++ .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, ++ .format_mod_supported = vc4_fkms_format_mod_supported, ++}; ++ ++static const struct drm_plane_helper_funcs vc4_plane_helper_funcs = { ++ .prepare_fb = drm_gem_plane_helper_prepare_fb, ++ .cleanup_fb = NULL, ++ .atomic_check = vc4_plane_atomic_check, ++ .atomic_update = vc4_plane_atomic_update, ++ .atomic_disable = vc4_plane_atomic_disable, ++}; ++ ++static struct drm_plane *vc4_fkms_plane_init(struct drm_device *dev, ++ enum drm_plane_type type, ++ u8 display_num, ++ u8 plane_id) ++{ ++ struct drm_plane *plane = NULL; ++ struct vc4_fkms_plane *vc4_plane; ++ u32 formats[ARRAY_SIZE(vc_image_formats)]; ++ unsigned int default_zpos = 0; ++ u32 num_formats = 0; ++ int ret = 0; ++ static const uint64_t modifiers[] = { ++ DRM_FORMAT_MOD_LINEAR, ++ /* VC4_T_TILED should come after linear, because we ++ * would prefer to scan out linear (less bus traffic). ++ */ ++ DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED, ++ DRM_FORMAT_MOD_BROADCOM_SAND128, ++ DRM_FORMAT_MOD_INVALID, ++ }; ++ int i; ++ ++ vc4_plane = devm_kzalloc(dev->dev, sizeof(*vc4_plane), ++ GFP_KERNEL); ++ if (!vc4_plane) { ++ ret = -ENOMEM; ++ goto fail; ++ } ++ ++ for (i = 0; i < ARRAY_SIZE(vc_image_formats); i++) ++ formats[num_formats++] = vc_image_formats[i].drm; ++ ++ plane = &vc4_plane->base; ++ ret = drm_universal_plane_init(dev, plane, 0, ++ &vc4_plane_funcs, ++ formats, num_formats, modifiers, ++ type, NULL); ++ ++ /* FIXME: Do we need to be checking return values from all these calls? ++ */ ++ drm_plane_helper_add(plane, &vc4_plane_helper_funcs); ++ ++ drm_plane_create_alpha_property(plane); ++ drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0, ++ DRM_MODE_ROTATE_0 | ++ DRM_MODE_ROTATE_180 | ++ DRM_MODE_REFLECT_X | ++ DRM_MODE_REFLECT_Y); ++ drm_plane_create_color_properties(plane, ++ BIT(DRM_COLOR_YCBCR_BT601) | ++ BIT(DRM_COLOR_YCBCR_BT709) | ++ BIT(DRM_COLOR_YCBCR_BT2020), ++ BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | ++ BIT(DRM_COLOR_YCBCR_FULL_RANGE), ++ DRM_COLOR_YCBCR_BT709, ++ DRM_COLOR_YCBCR_LIMITED_RANGE); ++ ++ /* ++ * Default frame buffer setup is with FB on -127, and raspistill etc ++ * tend to drop overlays on layer 2. Cursor plane was on layer +127. ++ * ++ * For F-KMS the mailbox call allows for a s8. ++ * Remap zpos 0 to -127 for the background layer, but leave all the ++ * other layers as requested by KMS. ++ */ ++ switch (type) { ++ default: ++ case DRM_PLANE_TYPE_PRIMARY: ++ default_zpos = 0; ++ break; ++ case DRM_PLANE_TYPE_OVERLAY: ++ default_zpos = 1; ++ break; ++ case DRM_PLANE_TYPE_CURSOR: ++ default_zpos = 2; ++ break; ++ } ++ drm_plane_create_zpos_property(plane, default_zpos, 0, 127); ++ ++ /* Prepare the static elements of the mailbox structure */ ++ vc4_plane->mb.tag.tag = RPI_FIRMWARE_SET_PLANE; ++ vc4_plane->mb.tag.buf_size = sizeof(struct set_plane); ++ vc4_plane->mb.tag.req_resp_size = 0; ++ vc4_plane->mb.plane.display = display_num; ++ vc4_plane->mb.plane.plane_id = plane_id; ++ vc4_plane->mb.plane.layer = default_zpos ? default_zpos : -127; ++ ++ return plane; ++fail: ++ if (plane) ++ vc4_plane_destroy(plane); ++ ++ return ERR_PTR(ret); ++} ++ ++static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc) ++{ ++ struct drm_device *dev = crtc->dev; ++ struct vc4_dev *vc4 = to_vc4_dev(dev); ++ struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); ++ struct drm_display_mode *mode = &crtc->state->adjusted_mode; ++ struct vc4_fkms_encoder *vc4_encoder = ++ to_vc4_fkms_encoder(vc4_crtc->encoder); ++ struct mailbox_set_mode mb = { ++ .tag1 = { RPI_FIRMWARE_SET_TIMING, ++ sizeof(struct set_timings), 0}, ++ }; ++ union hdmi_infoframe frame; ++ int ret; ++ ++ ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, vc4_crtc->connector, mode); ++ if (ret < 0) { ++ DRM_ERROR("couldn't fill AVI infoframe\n"); ++ return; ++ } ++ ++ DRM_DEBUG_KMS("Setting mode for display num %u mode name %s, clk %d, h(disp %d, start %d, end %d, total %d, skew %d) v(disp %d, start %d, end %d, total %d, scan %d), vrefresh %d, par %u, flags 0x%04x\n", ++ vc4_crtc->display_number, mode->name, mode->clock, ++ mode->hdisplay, mode->hsync_start, mode->hsync_end, ++ mode->htotal, mode->hskew, mode->vdisplay, ++ mode->vsync_start, mode->vsync_end, mode->vtotal, ++ mode->vscan, drm_mode_vrefresh(mode), ++ mode->picture_aspect_ratio, mode->flags); ++ mb.timings.display = vc4_crtc->display_number; ++ ++ mb.timings.clock = mode->clock; ++ mb.timings.hdisplay = mode->hdisplay; ++ mb.timings.hsync_start = mode->hsync_start; ++ mb.timings.hsync_end = mode->hsync_end; ++ mb.timings.htotal = mode->htotal; ++ mb.timings.hskew = mode->hskew; ++ mb.timings.vdisplay = mode->vdisplay; ++ mb.timings.vsync_start = mode->vsync_start; ++ mb.timings.vsync_end = mode->vsync_end; ++ mb.timings.vtotal = mode->vtotal; ++ mb.timings.vscan = mode->vscan; ++ mb.timings.vrefresh = drm_mode_vrefresh(mode); ++ mb.timings.flags = 0; ++ if (mode->flags & DRM_MODE_FLAG_PHSYNC) ++ mb.timings.flags |= TIMINGS_FLAGS_H_SYNC_POS; ++ if (mode->flags & DRM_MODE_FLAG_PVSYNC) ++ mb.timings.flags |= TIMINGS_FLAGS_V_SYNC_POS; ++ ++ switch (frame.avi.picture_aspect) { ++ default: ++ case HDMI_PICTURE_ASPECT_NONE: ++ mb.timings.flags |= TIMINGS_FLAGS_ASPECT_NONE; ++ break; ++ case HDMI_PICTURE_ASPECT_4_3: ++ mb.timings.flags |= TIMINGS_FLAGS_ASPECT_4_3; ++ break; ++ case HDMI_PICTURE_ASPECT_16_9: ++ mb.timings.flags |= TIMINGS_FLAGS_ASPECT_16_9; ++ break; ++ case HDMI_PICTURE_ASPECT_64_27: ++ mb.timings.flags |= TIMINGS_FLAGS_ASPECT_64_27; ++ break; ++ case HDMI_PICTURE_ASPECT_256_135: ++ mb.timings.flags |= TIMINGS_FLAGS_ASPECT_256_135; ++ break; ++ } ++ ++ if (mode->flags & DRM_MODE_FLAG_INTERLACE) ++ mb.timings.flags |= TIMINGS_FLAGS_INTERLACE; ++ if (mode->flags & DRM_MODE_FLAG_DBLCLK) ++ mb.timings.flags |= TIMINGS_FLAGS_DBL_CLK; ++ ++ mb.timings.video_id_code = frame.avi.video_code; ++ ++ if (!vc4_encoder->hdmi_monitor) { ++ mb.timings.flags |= TIMINGS_FLAGS_DVI; ++ } else { ++ struct vc4_fkms_connector_state *conn_state = ++ to_vc4_fkms_connector_state(vc4_crtc->connector->state); ++ ++ if (conn_state->broadcast_rgb == VC4_BROADCAST_RGB_AUTO) { ++ /* See CEA-861-E - 5.1 Default Encoding Parameters */ ++ if (drm_default_rgb_quant_range(mode) == ++ HDMI_QUANTIZATION_RANGE_LIMITED) ++ mb.timings.flags |= TIMINGS_FLAGS_RGB_LIMITED; ++ } else { ++ if (conn_state->broadcast_rgb == ++ VC4_BROADCAST_RGB_LIMITED) ++ mb.timings.flags |= TIMINGS_FLAGS_RGB_LIMITED; ++ ++ /* If not using the default range, then do not provide ++ * a VIC as the HDMI spec requires that we do not ++ * signal the opposite of the defined range in the AVI ++ * infoframe. ++ */ ++ if (!!(mb.timings.flags & TIMINGS_FLAGS_RGB_LIMITED) != ++ (drm_default_rgb_quant_range(mode) == ++ HDMI_QUANTIZATION_RANGE_LIMITED)) ++ mb.timings.video_id_code = 0; ++ } ++ } ++ ++ /* ++ * FIXME: To implement ++ * switch(mode->flag & DRM_MODE_FLAG_3D_MASK) { ++ * case DRM_MODE_FLAG_3D_NONE: ++ * case DRM_MODE_FLAG_3D_FRAME_PACKING: ++ * case DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE: ++ * case DRM_MODE_FLAG_3D_LINE_ALTERNATIVE: ++ * case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL: ++ * case DRM_MODE_FLAG_3D_L_DEPTH: ++ * case DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH: ++ * case DRM_MODE_FLAG_3D_TOP_AND_BOTTOM: ++ * case DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF: ++ * } ++ */ ++ ++ ret = rpi_firmware_property_list(vc4->firmware, &mb, sizeof(mb)); ++} ++ ++static void vc4_crtc_disable(struct drm_crtc *crtc, ++ struct drm_atomic_state *state) ++{ ++ struct drm_device *dev = crtc->dev; ++ struct drm_plane *plane; ++ ++ DRM_DEBUG_KMS("[CRTC:%d] vblanks off.\n", ++ crtc->base.id); ++ drm_crtc_vblank_off(crtc); ++ ++ /* Always turn the planes off on CRTC disable. In DRM, planes ++ * are enabled/disabled through the update/disable hooks ++ * above, and the CRTC enable/disable independently controls ++ * whether anything scans out at all, but the firmware doesn't ++ * give us a CRTC-level control for that. ++ */ ++ ++ drm_atomic_crtc_for_each_plane(plane, crtc) ++ vc4_plane_atomic_disable(plane, state); ++ ++ /* ++ * Make sure we issue a vblank event after disabling the CRTC if ++ * someone was waiting it. ++ */ ++ if (crtc->state->event) { ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dev->event_lock, flags); ++ drm_crtc_send_vblank_event(crtc, crtc->state->event); ++ crtc->state->event = NULL; ++ spin_unlock_irqrestore(&dev->event_lock, flags); ++ } ++} ++ ++static void vc4_crtc_consume_event(struct drm_crtc *crtc) ++{ ++ struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); ++ struct drm_device *dev = crtc->dev; ++ unsigned long flags; ++ ++ if (!crtc->state->event) ++ return; ++ ++ crtc->state->event->pipe = drm_crtc_index(crtc); ++ ++ WARN_ON(drm_crtc_vblank_get(crtc) != 0); ++ ++ spin_lock_irqsave(&dev->event_lock, flags); ++ vc4_crtc->event = crtc->state->event; ++ crtc->state->event = NULL; ++ spin_unlock_irqrestore(&dev->event_lock, flags); ++} ++ ++static void vc4_crtc_enable(struct drm_crtc *crtc, ++ struct drm_atomic_state *state) ++{ ++ struct drm_plane *plane; ++ ++ DRM_DEBUG_KMS("[CRTC:%d] vblanks on.\n", ++ crtc->base.id); ++ drm_crtc_vblank_on(crtc); ++ vc4_crtc_consume_event(crtc); ++ ++ /* Unblank the planes (if they're supposed to be displayed). */ ++ drm_atomic_crtc_for_each_plane(plane, crtc) ++ if (plane->state->fb) ++ vc4_plane_set_blank(plane, plane->state->visible); ++} ++ ++static enum drm_mode_status ++vc4_crtc_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode *mode) ++{ ++ struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); ++ struct drm_device *dev = crtc->dev; ++ struct vc4_dev *vc4 = to_vc4_dev(dev); ++ struct vc4_fkms *fkms = vc4->fkms; ++ ++ /* Do not allow doublescan modes from user space */ ++ if (mode->flags & DRM_MODE_FLAG_DBLSCAN) { ++ DRM_DEBUG_KMS("[CRTC:%d] Doublescan mode rejected.\n", ++ crtc->base.id); ++ return MODE_NO_DBLESCAN; ++ } ++ ++ /* Disable refresh rates > defined threshold (default 85Hz) as limited ++ * gain from them ++ */ ++ if (drm_mode_vrefresh(mode) > fkms_max_refresh_rate) ++ return MODE_BAD_VVALUE; ++ ++ /* Limit the pixel clock based on the HDMI clock limits from the ++ * firmware ++ */ ++ switch (vc4_crtc->display_number) { ++ case 2: /* HDMI0 */ ++ if (fkms->cfg.max_pixel_clock[0] && ++ mode->clock > fkms->cfg.max_pixel_clock[0]) ++ return MODE_CLOCK_HIGH; ++ break; ++ case 7: /* HDMI1 */ ++ if (fkms->cfg.max_pixel_clock[1] && ++ mode->clock > fkms->cfg.max_pixel_clock[1]) ++ return MODE_CLOCK_HIGH; ++ break; ++ } ++ ++ /* Pi4 can't generate odd horizontal timings on HDMI, so reject modes ++ * that would set them. ++ */ ++ if (fkms->bcm2711 && ++ (vc4_crtc->display_number == 2 || vc4_crtc->display_number == 7) && ++ !(mode->flags & DRM_MODE_FLAG_DBLCLK) && ++ ((mode->hdisplay | /* active */ ++ (mode->hsync_start - mode->hdisplay) | /* front porch */ ++ (mode->hsync_end - mode->hsync_start) | /* sync pulse */ ++ (mode->htotal - mode->hsync_end)) & 1)) /* back porch */ { ++ DRM_DEBUG_KMS("[CRTC:%d] Odd timing rejected %u %u %u %u.\n", ++ crtc->base.id, mode->hdisplay, mode->hsync_start, ++ mode->hsync_end, mode->htotal); ++ return MODE_H_ILLEGAL; ++ } ++ ++ return MODE_OK; ++} ++ ++static int vc4_crtc_atomic_check(struct drm_crtc *crtc, ++ struct drm_atomic_state *state) ++{ ++ struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, ++ crtc); ++ struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc_state); ++ struct drm_connector *conn; ++ struct drm_connector_state *conn_state; ++ int i; ++ ++ DRM_DEBUG_KMS("[CRTC:%d] crtc_atomic_check.\n", crtc->base.id); ++ ++ for_each_new_connector_in_state(crtc_state->state, conn, conn_state, i) { ++ if (conn_state->crtc != crtc) ++ continue; ++ ++ vc4_state->margins.left = conn_state->tv.margins.left; ++ vc4_state->margins.right = conn_state->tv.margins.right; ++ vc4_state->margins.top = conn_state->tv.margins.top; ++ vc4_state->margins.bottom = conn_state->tv.margins.bottom; ++ break; ++ } ++ return 0; ++} ++ ++static void vc4_crtc_atomic_flush(struct drm_crtc *crtc, ++ struct drm_atomic_state *state) ++{ ++ struct drm_crtc_state *old_state = drm_atomic_get_old_crtc_state(state, ++ crtc); ++ ++ DRM_DEBUG_KMS("[CRTC:%d] crtc_atomic_flush.\n", ++ crtc->base.id); ++ if (crtc->state->active && old_state->active && crtc->state->event) ++ vc4_crtc_consume_event(crtc); ++} ++ ++static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc) ++{ ++ struct drm_crtc *crtc = &vc4_crtc->base; ++ struct drm_device *dev = crtc->dev; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dev->event_lock, flags); ++ if (vc4_crtc->event) { ++ drm_crtc_send_vblank_event(crtc, vc4_crtc->event); ++ vc4_crtc->event = NULL; ++ drm_crtc_vblank_put(crtc); ++ } ++ spin_unlock_irqrestore(&dev->event_lock, flags); ++} ++ ++static irqreturn_t vc4_crtc_irq_handler(int irq, void *data) ++{ ++ struct vc4_crtc **crtc_list = data; ++ int i; ++ u32 stat = readl(crtc_list[0]->regs + SMICS); ++ irqreturn_t ret = IRQ_NONE; ++ u32 chan; ++ ++ if (stat & SMICS_INTERRUPTS) { ++ writel(0, crtc_list[0]->regs + SMICS); ++ ++ chan = readl(crtc_list[0]->regs + SMIDSW0); ++ ++ if ((chan & 0xFFFF0000) != SMI_NEW) { ++ /* Older firmware. Treat the one interrupt as vblank/ ++ * complete for all crtcs. ++ */ ++ for (i = 0; crtc_list[i]; i++) { ++ if (crtc_list[i]->vblank_enabled) ++ drm_crtc_handle_vblank(&crtc_list[i]->base); ++ vc4_crtc_handle_page_flip(crtc_list[i]); ++ } ++ } else { ++ if (chan & 1) { ++ writel(SMI_NEW, crtc_list[0]->regs + SMIDSW0); ++ if (crtc_list[0]->vblank_enabled) ++ drm_crtc_handle_vblank(&crtc_list[0]->base); ++ vc4_crtc_handle_page_flip(crtc_list[0]); ++ } ++ ++ if (crtc_list[1]) { ++ /* Check for the secondary display too */ ++ chan = readl(crtc_list[0]->regs + SMIDSW1); ++ ++ if (chan & 1) { ++ writel(SMI_NEW, crtc_list[0]->regs + SMIDSW1); ++ ++ if (crtc_list[1]->vblank_enabled) ++ drm_crtc_handle_vblank(&crtc_list[1]->base); ++ vc4_crtc_handle_page_flip(crtc_list[1]); ++ } ++ } ++ } ++ ++ ret = IRQ_HANDLED; ++ } ++ ++ return ret; ++} ++ ++static int vc4_fkms_page_flip(struct drm_crtc *crtc, ++ struct drm_framebuffer *fb, ++ struct drm_pending_vblank_event *event, ++ uint32_t flags, ++ struct drm_modeset_acquire_ctx *ctx) ++{ ++ if (flags & DRM_MODE_PAGE_FLIP_ASYNC) { ++ DRM_ERROR("Async flips aren't allowed\n"); ++ return -EINVAL; ++ } ++ ++ return drm_atomic_helper_page_flip(crtc, fb, event, flags, ctx); ++} ++ ++static struct drm_crtc_state * ++vc4_fkms_crtc_duplicate_state(struct drm_crtc *crtc) ++{ ++ struct vc4_crtc_state *vc4_state, *old_vc4_state; ++ ++ vc4_state = kzalloc(sizeof(*vc4_state), GFP_KERNEL); ++ if (!vc4_state) ++ return NULL; ++ ++ old_vc4_state = to_vc4_crtc_state(crtc->state); ++ vc4_state->margins = old_vc4_state->margins; ++ ++ __drm_atomic_helper_crtc_duplicate_state(crtc, &vc4_state->base); ++ return &vc4_state->base; ++} ++ ++static void ++vc4_fkms_crtc_reset(struct drm_crtc *crtc) ++{ ++ if (crtc->state) ++ __drm_atomic_helper_crtc_destroy_state(crtc->state); ++ ++ crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL); ++ if (crtc->state) ++ crtc->state->crtc = crtc; ++} ++ ++static int vc4_fkms_enable_vblank(struct drm_crtc *crtc) ++{ ++ struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); ++ ++ DRM_DEBUG_KMS("[CRTC:%d] enable_vblank.\n", ++ crtc->base.id); ++ vc4_crtc->vblank_enabled = true; ++ ++ return 0; ++} ++ ++static void vc4_fkms_disable_vblank(struct drm_crtc *crtc) ++{ ++ struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); ++ ++ DRM_DEBUG_KMS("[CRTC:%d] disable_vblank.\n", ++ crtc->base.id); ++ vc4_crtc->vblank_enabled = false; ++} ++ ++static const struct drm_crtc_funcs vc4_crtc_funcs = { ++ .set_config = drm_atomic_helper_set_config, ++ .destroy = drm_crtc_cleanup, ++ .page_flip = vc4_fkms_page_flip, ++ .set_property = NULL, ++ .cursor_set = NULL, /* handled by drm_mode_cursor_universal */ ++ .cursor_move = NULL, /* handled by drm_mode_cursor_universal */ ++ .reset = vc4_fkms_crtc_reset, ++ .atomic_duplicate_state = vc4_fkms_crtc_duplicate_state, ++ .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, ++ .enable_vblank = vc4_fkms_enable_vblank, ++ .disable_vblank = vc4_fkms_disable_vblank, ++}; ++ ++static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = { ++ .mode_set_nofb = vc4_crtc_mode_set_nofb, ++ .mode_valid = vc4_crtc_mode_valid, ++ .atomic_check = vc4_crtc_atomic_check, ++ .atomic_flush = vc4_crtc_atomic_flush, ++ .atomic_enable = vc4_crtc_enable, ++ .atomic_disable = vc4_crtc_disable, ++}; ++ ++static const struct of_device_id vc4_firmware_kms_dt_match[] = { ++ { .compatible = "raspberrypi,rpi-firmware-kms" }, ++ { .compatible = "raspberrypi,rpi-firmware-kms-2711", ++ .data = (void *)1 }, ++ {} ++}; ++ ++static enum drm_connector_status ++vc4_fkms_connector_detect(struct drm_connector *connector, bool force) ++{ ++ DRM_DEBUG_KMS("connector detect.\n"); ++ return connector_status_connected; ++} ++ ++/* Queries the firmware to populate a drm_mode structure for this display */ ++static int vc4_fkms_get_fw_mode(struct vc4_fkms_connector *fkms_connector, ++ struct drm_display_mode *mode) ++{ ++ struct vc4_dev *vc4 = fkms_connector->vc4_dev; ++ struct set_timings timings = { 0 }; ++ int ret; ++ ++ timings.display = fkms_connector->display_number; ++ ++ ret = rpi_firmware_property(vc4->firmware, ++ RPI_FIRMWARE_GET_DISPLAY_TIMING, &timings, ++ sizeof(timings)); ++ if (ret || !timings.clock) ++ /* No mode returned - abort */ ++ return -1; ++ ++ /* Equivalent to DRM_MODE macro. */ ++ memset(mode, 0, sizeof(*mode)); ++ strncpy(mode->name, "FIXED_MODE", sizeof(mode->name)); ++ mode->status = 0; ++ mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; ++ mode->clock = timings.clock; ++ mode->hdisplay = timings.hdisplay; ++ mode->hsync_start = timings.hsync_start; ++ mode->hsync_end = timings.hsync_end; ++ mode->htotal = timings.htotal; ++ mode->hskew = 0; ++ mode->vdisplay = timings.vdisplay; ++ mode->vsync_start = timings.vsync_start; ++ mode->vsync_end = timings.vsync_end; ++ mode->vtotal = timings.vtotal; ++ mode->vscan = timings.vscan; ++ ++ if (timings.flags & TIMINGS_FLAGS_H_SYNC_POS) ++ mode->flags |= DRM_MODE_FLAG_PHSYNC; ++ else ++ mode->flags |= DRM_MODE_FLAG_NHSYNC; ++ ++ if (timings.flags & TIMINGS_FLAGS_V_SYNC_POS) ++ mode->flags |= DRM_MODE_FLAG_PVSYNC; ++ else ++ mode->flags |= DRM_MODE_FLAG_NVSYNC; ++ ++ if (timings.flags & TIMINGS_FLAGS_INTERLACE) ++ mode->flags |= DRM_MODE_FLAG_INTERLACE; ++ ++ return 0; ++} ++ ++static int vc4_fkms_get_edid_block(void *data, u8 *buf, unsigned int block, ++ size_t len) ++{ ++ struct vc4_fkms_connector *fkms_connector = ++ (struct vc4_fkms_connector *)data; ++ struct vc4_dev *vc4 = fkms_connector->vc4_dev; ++ struct mailbox_get_edid mb = { ++ .tag1 = { RPI_FIRMWARE_GET_EDID_BLOCK_DISPLAY, ++ 128 + 8, 0 }, ++ .block = block, ++ .display_number = fkms_connector->display_number, ++ }; ++ int ret = 0; ++ ++ ret = rpi_firmware_property_list(vc4->firmware, &mb, sizeof(mb)); ++ ++ if (!ret) ++ memcpy(buf, mb.edid, len); ++ ++ return ret; ++} ++ ++static int vc4_fkms_connector_get_modes(struct drm_connector *connector) ++{ ++ struct vc4_fkms_connector *fkms_connector = ++ to_vc4_fkms_connector(connector); ++ struct drm_encoder *encoder = fkms_connector->encoder; ++ struct vc4_fkms_encoder *vc4_encoder = to_vc4_fkms_encoder(encoder); ++ struct drm_display_mode fw_mode; ++ struct drm_display_mode *mode; ++ struct edid *edid; ++ int num_modes; ++ ++ if (!vc4_fkms_get_fw_mode(fkms_connector, &fw_mode)) { ++ drm_mode_debug_printmodeline(&fw_mode); ++ mode = drm_mode_duplicate(connector->dev, ++ &fw_mode); ++ drm_mode_probed_add(connector, mode); ++ num_modes = 1; /* 1 mode */ ++ } else { ++ edid = drm_do_get_edid(connector, vc4_fkms_get_edid_block, ++ fkms_connector); ++ ++ /* FIXME: Can we do CEC? ++ * cec_s_phys_addr_from_edid(vc4->hdmi->cec_adap, edid); ++ * if (!edid) ++ * return -ENODEV; ++ */ ++ ++ vc4_encoder->hdmi_monitor = drm_detect_hdmi_monitor(edid); ++ ++ drm_connector_update_edid_property(connector, edid); ++ num_modes = drm_add_edid_modes(connector, edid); ++ kfree(edid); ++ } ++ ++ return num_modes; ++} ++ ++/* This is the DSI panel resolution. Use this as a default should the firmware ++ * not respond to our request for the timings. ++ */ ++static const struct drm_display_mode lcd_mode = { ++ DRM_MODE("800x480", DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED, ++ 25979400 / 1000, ++ 800, 800 + 1, 800 + 1 + 2, 800 + 1 + 2 + 46, 0, ++ 480, 480 + 7, 480 + 7 + 2, 480 + 7 + 2 + 21, 0, ++ 0) ++}; ++ ++static int vc4_fkms_lcd_connector_get_modes(struct drm_connector *connector) ++{ ++ struct vc4_fkms_connector *fkms_connector = ++ to_vc4_fkms_connector(connector); ++ struct drm_display_mode *mode; ++ struct drm_display_mode fw_mode; ++ ++ if (!vc4_fkms_get_fw_mode(fkms_connector, &fw_mode) && fw_mode.clock) ++ mode = drm_mode_duplicate(connector->dev, ++ &fw_mode); ++ else ++ mode = drm_mode_duplicate(connector->dev, ++ &lcd_mode); ++ ++ if (!mode) { ++ DRM_ERROR("Failed to create a new display mode\n"); ++ return -ENOMEM; ++ } ++ ++ drm_mode_probed_add(connector, mode); ++ ++ /* We have one mode */ ++ return 1; ++} ++ ++static struct drm_encoder * ++vc4_fkms_connector_best_encoder(struct drm_connector *connector) ++{ ++ struct vc4_fkms_connector *fkms_connector = ++ to_vc4_fkms_connector(connector); ++ DRM_DEBUG_KMS("best_connector.\n"); ++ return fkms_connector->encoder; ++} ++ ++static void vc4_fkms_connector_destroy(struct drm_connector *connector) ++{ ++ DRM_DEBUG_KMS("[CONNECTOR:%d] destroy.\n", ++ connector->base.id); ++ drm_connector_unregister(connector); ++ drm_connector_cleanup(connector); ++} ++ ++/** ++ * vc4_connector_duplicate_state - duplicate connector state ++ * @connector: digital connector ++ * ++ * Allocates and returns a copy of the connector state (both common and ++ * digital connector specific) for the specified connector. ++ * ++ * Returns: The newly allocated connector state, or NULL on failure. ++ */ ++struct drm_connector_state * ++vc4_connector_duplicate_state(struct drm_connector *connector) ++{ ++ struct vc4_fkms_connector_state *state; ++ ++ state = kmemdup(connector->state, sizeof(*state), GFP_KERNEL); ++ if (!state) ++ return NULL; ++ ++ __drm_atomic_helper_connector_duplicate_state(connector, &state->base); ++ return &state->base; ++} ++ ++/** ++ * vc4_connector_atomic_get_property - hook for connector->atomic_get_property. ++ * @connector: Connector to get the property for. ++ * @state: Connector state to retrieve the property from. ++ * @property: Property to retrieve. ++ * @val: Return value for the property. ++ * ++ * Returns the atomic property value for a digital connector. ++ */ ++int vc4_connector_atomic_get_property(struct drm_connector *connector, ++ const struct drm_connector_state *state, ++ struct drm_property *property, ++ uint64_t *val) ++{ ++ struct vc4_fkms_connector *fkms_connector = ++ to_vc4_fkms_connector(connector); ++ struct vc4_fkms_connector_state *vc4_conn_state = ++ to_vc4_fkms_connector_state(state); ++ ++ if (property == fkms_connector->broadcast_rgb_property) { ++ *val = vc4_conn_state->broadcast_rgb; ++ } else { ++ DRM_DEBUG_ATOMIC("Unknown property [PROP:%d:%s]\n", ++ property->base.id, property->name); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++/** ++ * vc4_connector_atomic_set_property - hook for connector->atomic_set_property. ++ * @connector: Connector to set the property for. ++ * @state: Connector state to set the property on. ++ * @property: Property to set. ++ * @val: New value for the property. ++ * ++ * Sets the atomic property value for a digital connector. ++ */ ++int vc4_connector_atomic_set_property(struct drm_connector *connector, ++ struct drm_connector_state *state, ++ struct drm_property *property, ++ uint64_t val) ++{ ++ struct vc4_fkms_connector *fkms_connector = ++ to_vc4_fkms_connector(connector); ++ struct vc4_fkms_connector_state *vc4_conn_state = ++ to_vc4_fkms_connector_state(state); ++ ++ if (property == fkms_connector->broadcast_rgb_property) { ++ vc4_conn_state->broadcast_rgb = val; ++ return 0; ++ } ++ ++ DRM_DEBUG_ATOMIC("Unknown property [PROP:%d:%s]\n", ++ property->base.id, property->name); ++ return -EINVAL; ++} ++ ++int vc4_connector_atomic_check(struct drm_connector *connector, ++ struct drm_atomic_state *state) ++{ ++ struct drm_connector_state *old_state = ++ drm_atomic_get_old_connector_state(state, connector); ++ struct vc4_fkms_connector_state *vc4_old_state = ++ to_vc4_fkms_connector_state(old_state); ++ struct drm_connector_state *new_state = ++ drm_atomic_get_new_connector_state(state, connector); ++ struct vc4_fkms_connector_state *vc4_new_state = ++ to_vc4_fkms_connector_state(new_state); ++ struct drm_crtc *crtc = new_state->crtc; ++ ++ if (!crtc) ++ return 0; ++ ++ if (vc4_old_state->broadcast_rgb != vc4_new_state->broadcast_rgb) { ++ struct drm_crtc_state *crtc_state; ++ ++ crtc_state = drm_atomic_get_crtc_state(state, crtc); ++ if (IS_ERR(crtc_state)) ++ return PTR_ERR(crtc_state); ++ ++ crtc_state->mode_changed = true; ++ } ++ return 0; ++} ++ ++static void vc4_hdmi_connector_reset(struct drm_connector *connector) ++{ ++ drm_atomic_helper_connector_reset(connector); ++ drm_atomic_helper_connector_tv_reset(connector); ++} ++ ++static const struct drm_connector_funcs vc4_fkms_connector_funcs = { ++ .detect = vc4_fkms_connector_detect, ++ .fill_modes = drm_helper_probe_single_connector_modes, ++ .destroy = vc4_fkms_connector_destroy, ++ .reset = vc4_hdmi_connector_reset, ++ .atomic_duplicate_state = vc4_connector_duplicate_state, ++ .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, ++ .atomic_get_property = vc4_connector_atomic_get_property, ++ .atomic_set_property = vc4_connector_atomic_set_property, ++}; ++ ++static const struct drm_connector_helper_funcs vc4_fkms_connector_helper_funcs = { ++ .get_modes = vc4_fkms_connector_get_modes, ++ .best_encoder = vc4_fkms_connector_best_encoder, ++ .atomic_check = vc4_connector_atomic_check, ++}; ++ ++static const struct drm_connector_helper_funcs vc4_fkms_lcd_conn_helper_funcs = { ++ .get_modes = vc4_fkms_lcd_connector_get_modes, ++ .best_encoder = vc4_fkms_connector_best_encoder, ++}; ++ ++static const struct drm_prop_enum_list broadcast_rgb_names[] = { ++ { VC4_BROADCAST_RGB_AUTO, "Automatic" }, ++ { VC4_BROADCAST_RGB_FULL, "Full" }, ++ { VC4_BROADCAST_RGB_LIMITED, "Limited 16:235" }, ++}; ++ ++static void ++vc4_attach_broadcast_rgb_property(struct vc4_fkms_connector *fkms_connector) ++{ ++ struct drm_device *dev = fkms_connector->base.dev; ++ struct drm_property *prop; ++ ++ prop = fkms_connector->broadcast_rgb_property; ++ if (!prop) { ++ prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, ++ "Broadcast RGB", ++ broadcast_rgb_names, ++ ARRAY_SIZE(broadcast_rgb_names)); ++ if (!prop) ++ return; ++ ++ fkms_connector->broadcast_rgb_property = prop; ++ } ++ ++ drm_object_attach_property(&fkms_connector->base.base, prop, 0); ++} ++ ++static struct drm_connector * ++vc4_fkms_connector_init(struct drm_device *dev, struct drm_encoder *encoder, ++ u32 display_num) ++{ ++ struct drm_connector *connector = NULL; ++ struct vc4_fkms_connector *fkms_connector; ++ struct vc4_fkms_connector_state *conn_state = NULL; ++ struct vc4_dev *vc4_dev = to_vc4_dev(dev); ++ int ret = 0; ++ ++ DRM_DEBUG_KMS("connector_init, display_num %u\n", display_num); ++ ++ fkms_connector = devm_kzalloc(dev->dev, sizeof(*fkms_connector), ++ GFP_KERNEL); ++ if (!fkms_connector) ++ return ERR_PTR(-ENOMEM); ++ ++ /* ++ * Allocate enough memory to hold vc4_fkms_connector_state, ++ */ ++ conn_state = kzalloc(sizeof(*conn_state), GFP_KERNEL); ++ if (!conn_state) { ++ kfree(fkms_connector); ++ return ERR_PTR(-ENOMEM); ++ } ++ ++ connector = &fkms_connector->base; ++ ++ fkms_connector->encoder = encoder; ++ fkms_connector->display_number = display_num; ++ fkms_connector->display_type = vc4_get_display_type(display_num); ++ fkms_connector->vc4_dev = vc4_dev; ++ ++ __drm_atomic_helper_connector_reset(connector, ++ &conn_state->base); ++ ++ if (fkms_connector->display_type == DRM_MODE_ENCODER_DSI) { ++ drm_connector_init(dev, connector, &vc4_fkms_connector_funcs, ++ DRM_MODE_CONNECTOR_DSI); ++ drm_connector_helper_add(connector, ++ &vc4_fkms_lcd_conn_helper_funcs); ++ connector->interlace_allowed = 0; ++ } else if (fkms_connector->display_type == DRM_MODE_ENCODER_TVDAC) { ++ drm_connector_init(dev, connector, &vc4_fkms_connector_funcs, ++ DRM_MODE_CONNECTOR_Composite); ++ drm_connector_helper_add(connector, ++ &vc4_fkms_lcd_conn_helper_funcs); ++ connector->interlace_allowed = 1; ++ } else { ++ drm_connector_init(dev, connector, &vc4_fkms_connector_funcs, ++ DRM_MODE_CONNECTOR_HDMIA); ++ drm_connector_helper_add(connector, ++ &vc4_fkms_connector_helper_funcs); ++ connector->interlace_allowed = 1; ++ } ++ ++ ret = drm_mode_create_tv_margin_properties(dev); ++ if (ret) ++ goto fail; ++ ++ drm_connector_attach_tv_margin_properties(connector); ++ ++ connector->polled = (DRM_CONNECTOR_POLL_CONNECT | ++ DRM_CONNECTOR_POLL_DISCONNECT); ++ ++ connector->doublescan_allowed = 0; ++ ++ vc4_attach_broadcast_rgb_property(fkms_connector); ++ ++ drm_connector_attach_encoder(connector, encoder); ++ ++ return connector; ++ ++ fail: ++ if (connector) ++ vc4_fkms_connector_destroy(connector); ++ ++ return ERR_PTR(ret); ++} ++ ++static void vc4_fkms_encoder_destroy(struct drm_encoder *encoder) ++{ ++ DRM_DEBUG_KMS("Encoder_destroy\n"); ++ drm_encoder_cleanup(encoder); ++} ++ ++static const struct drm_encoder_funcs vc4_fkms_encoder_funcs = { ++ .destroy = vc4_fkms_encoder_destroy, ++}; ++ ++static void vc4_fkms_display_power(struct drm_encoder *encoder, bool power) ++{ ++ struct vc4_fkms_encoder *vc4_encoder = to_vc4_fkms_encoder(encoder); ++ struct vc4_dev *vc4 = to_vc4_dev(encoder->dev); ++ ++ struct mailbox_display_pwr pwr = { ++ .tag1 = {RPI_FIRMWARE_SET_DISPLAY_POWER, 8, 0, }, ++ .display = vc4_encoder->display_num, ++ .state = power ? 1 : 0, ++ }; ++ ++ rpi_firmware_property_list(vc4->firmware, &pwr, sizeof(pwr)); ++} ++ ++static void vc4_fkms_encoder_enable(struct drm_encoder *encoder) ++{ ++ vc4_fkms_display_power(encoder, true); ++ DRM_DEBUG_KMS("Encoder_enable\n"); ++} ++ ++static void vc4_fkms_encoder_disable(struct drm_encoder *encoder) ++{ ++ vc4_fkms_display_power(encoder, false); ++ DRM_DEBUG_KMS("Encoder_disable\n"); ++} ++ ++static const struct drm_encoder_helper_funcs vc4_fkms_encoder_helper_funcs = { ++ .enable = vc4_fkms_encoder_enable, ++ .disable = vc4_fkms_encoder_disable, ++}; ++ ++static int vc4_fkms_create_screen(struct device *dev, struct drm_device *drm, ++ int display_idx, int display_ref, ++ struct vc4_crtc **ret_crtc) ++{ ++ struct vc4_dev *vc4 = to_vc4_dev(drm); ++ struct vc4_crtc *vc4_crtc; ++ struct vc4_fkms_encoder *vc4_encoder; ++ struct drm_crtc *crtc; ++ struct drm_plane *destroy_plane, *temp; ++ struct mailbox_blank_display blank = { ++ .tag1 = {RPI_FIRMWARE_FRAMEBUFFER_SET_DISPLAY_NUM, 4, 0, }, ++ .display = display_idx, ++ .tag2 = { RPI_FIRMWARE_FRAMEBUFFER_BLANK, 4, 0, }, ++ .blank = 1, ++ }; ++ struct drm_plane *planes[PLANES_PER_CRTC]; ++ int ret, i; ++ ++ vc4_crtc = devm_kzalloc(dev, sizeof(*vc4_crtc), GFP_KERNEL); ++ if (!vc4_crtc) ++ return -ENOMEM; ++ crtc = &vc4_crtc->base; ++ ++ vc4_crtc->display_number = display_ref; ++ vc4_crtc->display_type = vc4_get_display_type(display_ref); ++ ++ /* Blank the firmware provided framebuffer */ ++ rpi_firmware_property_list(vc4->firmware, &blank, sizeof(blank)); ++ ++ for (i = 0; i < PLANES_PER_CRTC; i++) { ++ planes[i] = vc4_fkms_plane_init(drm, ++ (i == 0) ? ++ DRM_PLANE_TYPE_PRIMARY : ++ (i == PLANES_PER_CRTC - 1) ? ++ DRM_PLANE_TYPE_CURSOR : ++ DRM_PLANE_TYPE_OVERLAY, ++ display_ref, ++ i + (display_idx * PLANES_PER_CRTC) ++ ); ++ if (IS_ERR(planes[i])) { ++ dev_err(dev, "failed to construct plane %u\n", i); ++ ret = PTR_ERR(planes[i]); ++ goto err; ++ } ++ } ++ ++ drm_crtc_init_with_planes(drm, crtc, planes[0], ++ planes[PLANES_PER_CRTC - 1], &vc4_crtc_funcs, ++ NULL); ++ drm_crtc_helper_add(crtc, &vc4_crtc_helper_funcs); ++ ++ /* Update the possible_crtcs mask for the overlay plane(s) */ ++ for (i = 1; i < (PLANES_PER_CRTC - 1); i++) ++ planes[i]->possible_crtcs = drm_crtc_mask(crtc); ++ ++ vc4_encoder = devm_kzalloc(dev, sizeof(*vc4_encoder), GFP_KERNEL); ++ if (!vc4_encoder) ++ return -ENOMEM; ++ vc4_crtc->encoder = &vc4_encoder->base; ++ ++ vc4_encoder->display_num = display_ref; ++ vc4_encoder->base.possible_crtcs |= drm_crtc_mask(crtc); ++ ++ drm_encoder_init(drm, &vc4_encoder->base, &vc4_fkms_encoder_funcs, ++ vc4_crtc->display_type, NULL); ++ drm_encoder_helper_add(&vc4_encoder->base, ++ &vc4_fkms_encoder_helper_funcs); ++ ++ vc4_crtc->connector = vc4_fkms_connector_init(drm, &vc4_encoder->base, ++ display_ref); ++ if (IS_ERR(vc4_crtc->connector)) { ++ ret = PTR_ERR(vc4_crtc->connector); ++ goto err_destroy_encoder; ++ } ++ ++ *ret_crtc = vc4_crtc; ++ ++ return 0; ++ ++err_destroy_encoder: ++ vc4_fkms_encoder_destroy(vc4_crtc->encoder); ++ list_for_each_entry_safe(destroy_plane, temp, ++ &drm->mode_config.plane_list, head) { ++ if (destroy_plane->possible_crtcs == 1 << drm_crtc_index(crtc)) ++ destroy_plane->funcs->destroy(destroy_plane); ++ } ++err: ++ return ret; ++} ++ ++static int vc4_fkms_bind(struct device *dev, struct device *master, void *data) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct drm_device *drm = dev_get_drvdata(master); ++ struct vc4_dev *vc4 = to_vc4_dev(drm); ++ struct device_node *firmware_node; ++ const struct of_device_id *match; ++ struct vc4_crtc **crtc_list; ++ u32 num_displays, display_num; ++ struct vc4_fkms *fkms; ++ int ret; ++ u32 display_id; ++ ++ vc4->firmware_kms = true; ++ ++ fkms = devm_kzalloc(dev, sizeof(*fkms), GFP_KERNEL); ++ if (!fkms) ++ return -ENOMEM; ++ ++ match = of_match_device(vc4_firmware_kms_dt_match, dev); ++ if (!match) ++ return -ENODEV; ++ if (match->data) ++ fkms->bcm2711 = true; ++ ++ firmware_node = of_parse_phandle(dev->of_node, "brcm,firmware", 0); ++ vc4->firmware = devm_rpi_firmware_get(&pdev->dev, firmware_node); ++ if (!vc4->firmware) { ++ DRM_DEBUG("Failed to get Raspberry Pi firmware reference.\n"); ++ return -EPROBE_DEFER; ++ } ++ of_node_put(firmware_node); ++ ++ ret = rpi_firmware_property(vc4->firmware, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_NUM_DISPLAYS, ++ &num_displays, sizeof(u32)); ++ ++ /* If we fail to get the number of displays, then ++ * assume old firmware that doesn't have the mailbox call, so just ++ * set one display ++ */ ++ if (ret) { ++ num_displays = 1; ++ DRM_WARN("Unable to determine number of displays - assuming 1\n"); ++ ret = 0; ++ } ++ ++ ret = rpi_firmware_property(vc4->firmware, ++ RPI_FIRMWARE_GET_DISPLAY_CFG, ++ &fkms->cfg, sizeof(fkms->cfg)); ++ ++ if (ret) ++ return -EINVAL; ++ /* The firmware works in Hz. This will be compared against kHz, so div ++ * 1000 now rather than multiple times later. ++ */ ++ fkms->cfg.max_pixel_clock[0] /= 1000; ++ fkms->cfg.max_pixel_clock[1] /= 1000; ++ ++ /* Allocate a list, with space for a NULL on the end */ ++ crtc_list = devm_kzalloc(dev, sizeof(crtc_list) * (num_displays + 1), ++ GFP_KERNEL); ++ if (!crtc_list) ++ return -ENOMEM; ++ ++ for (display_num = 0; display_num < num_displays; display_num++) { ++ display_id = display_num; ++ ret = rpi_firmware_property(vc4->firmware, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_DISPLAY_ID, ++ &display_id, sizeof(display_id)); ++ /* FIXME: Determine the correct error handling here. ++ * Should we fail to create the one "screen" but keep the ++ * others, or fail the whole thing? ++ */ ++ if (ret) ++ DRM_ERROR("Failed to get display id %u\n", display_num); ++ ++ ret = vc4_fkms_create_screen(dev, drm, display_num, display_id, ++ &crtc_list[display_num]); ++ if (ret) ++ DRM_ERROR("Oh dear, failed to create display %u\n", ++ display_num); ++ } ++ ++ if (num_displays > 0) { ++ /* Map the SMI interrupt reg */ ++ crtc_list[0]->regs = vc4_ioremap_regs(pdev, 0); ++ if (IS_ERR(crtc_list[0]->regs)) ++ DRM_ERROR("Oh dear, failed to map registers\n"); ++ ++ writel(0, crtc_list[0]->regs + SMICS); ++ ret = devm_request_irq(dev, platform_get_irq(pdev, 0), ++ vc4_crtc_irq_handler, 0, ++ "vc4 firmware kms", crtc_list); ++ if (ret) ++ DRM_ERROR("Oh dear, failed to register IRQ\n"); ++ } else { ++ DRM_WARN("No displays found. Consider forcing hotplug if HDMI is attached\n"); ++ } ++ ++ vc4->fkms = fkms; ++ ++ platform_set_drvdata(pdev, crtc_list); ++ ++ return 0; ++} ++ ++static void vc4_fkms_unbind(struct device *dev, struct device *master, ++ void *data) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct vc4_crtc **crtc_list = dev_get_drvdata(dev); ++ int i; ++ ++ for (i = 0; crtc_list[i]; i++) { ++ vc4_fkms_connector_destroy(crtc_list[i]->connector); ++ vc4_fkms_encoder_destroy(crtc_list[i]->encoder); ++ drm_crtc_cleanup(&crtc_list[i]->base); ++ } ++ ++ platform_set_drvdata(pdev, NULL); ++} ++ ++static const struct component_ops vc4_fkms_ops = { ++ .bind = vc4_fkms_bind, ++ .unbind = vc4_fkms_unbind, ++}; ++ ++static int vc4_fkms_probe(struct platform_device *pdev) ++{ ++ return component_add(&pdev->dev, &vc4_fkms_ops); ++} ++ ++static int vc4_fkms_remove(struct platform_device *pdev) ++{ ++ component_del(&pdev->dev, &vc4_fkms_ops); ++ return 0; ++} ++ ++struct platform_driver vc4_firmware_kms_driver = { ++ .probe = vc4_fkms_probe, ++ .remove = vc4_fkms_remove, ++ .driver = { ++ .name = "vc4_firmware_kms", ++ .of_match_table = vc4_firmware_kms_dt_match, ++ }, ++}; +--- a/drivers/gpu/drm/vc4/vc4_kms.c ++++ b/drivers/gpu/drm/vc4/vc4_kms.c +@@ -162,6 +162,9 @@ vc4_ctm_commit(struct vc4_dev *vc4, stru + struct vc4_ctm_state *ctm_state = to_vc4_ctm_state(vc4->ctm_manager.state); + struct drm_color_ctm *ctm = ctm_state->ctm; + ++ if (vc4->firmware_kms) ++ return; ++ + if (ctm_state->fifo) { + HVS_WRITE(SCALER_OLEDCOEF2, + VC4_SET_FIELD(vc4_ctm_s31_32_to_s0_9(ctm->matrix[0]), +@@ -367,7 +370,7 @@ static void vc4_atomic_commit_tail(struc + for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) { + struct vc4_crtc_state *vc4_crtc_state; + +- if (!new_crtc_state->commit) ++ if (!new_crtc_state->commit || vc4->firmware_kms) + continue; + + vc4_crtc_state = to_vc4_crtc_state(new_crtc_state); +@@ -393,7 +396,7 @@ static void vc4_atomic_commit_tail(struc + old_hvs_state->fifo_state[channel].pending_commit = NULL; + } + +- if (vc4->is_vc5) { ++ if (vc4->is_vc5 && !vc4->firmware_kms) { + unsigned long state_rate = max(old_hvs_state->core_clock_rate, + new_hvs_state->core_clock_rate); + unsigned long core_rate = max_t(unsigned long, +@@ -412,10 +415,12 @@ static void vc4_atomic_commit_tail(struc + + vc4_ctm_commit(vc4, state); + +- if (vc4->is_vc5) +- vc5_hvs_pv_muxing_commit(vc4, state); +- else +- vc4_hvs_pv_muxing_commit(vc4, state); ++ if (!vc4->firmware_kms) { ++ if (vc4->is_vc5) ++ vc5_hvs_pv_muxing_commit(vc4, state); ++ else ++ vc4_hvs_pv_muxing_commit(vc4, state); ++ } + + drm_atomic_helper_commit_planes(dev, state, + DRM_PLANE_COMMIT_ACTIVE_ONLY); +@@ -430,7 +435,7 @@ static void vc4_atomic_commit_tail(struc + + drm_atomic_helper_cleanup_planes(dev, state); + +- if (vc4->is_vc5) { ++ if (vc4->is_vc5 && !vc4->firmware_kms) { + drm_dbg(dev, "Running the core clock at %lu Hz\n", + new_hvs_state->core_clock_rate); + +@@ -447,11 +452,21 @@ static void vc4_atomic_commit_tail(struc + + static int vc4_atomic_commit_setup(struct drm_atomic_state *state) + { ++ struct drm_device *dev = state->dev; ++ struct vc4_dev *vc4 = to_vc4_dev(dev); + struct drm_crtc_state *crtc_state; + struct vc4_hvs_state *hvs_state; + struct drm_crtc *crtc; + unsigned int i; + ++ /* We know for sure we don't want an async update here. Set ++ * state->legacy_cursor_update to false to prevent ++ * drm_atomic_helper_setup_commit() from auto-completing ++ * commit->flip_done. ++ */ ++ if (!vc4->firmware_kms) ++ state->legacy_cursor_update = false; ++ + hvs_state = vc4_hvs_get_new_global_state(state); + if (WARN_ON(IS_ERR(hvs_state))) + return PTR_ERR(hvs_state); +@@ -806,6 +821,7 @@ static int vc4_hvs_channels_obj_init(str + static int vc4_pv_muxing_atomic_check(struct drm_device *dev, + struct drm_atomic_state *state) + { ++ struct vc4_dev *vc4 = to_vc4_dev(state->dev); + struct vc4_hvs_state *hvs_new_state; + struct drm_crtc_state *old_crtc_state, *new_crtc_state; + struct drm_crtc *crtc; +@@ -829,6 +845,9 @@ static int vc4_pv_muxing_atomic_check(st + unsigned int matching_channels; + unsigned int channel; + ++ if (vc4->firmware_kms) ++ continue; ++ + drm_dbg(dev, "%s: Trying to find a channel.\n", crtc->name); + + /* Nothing to do here, let's skip it */ +@@ -1047,6 +1066,8 @@ int vc4_kms_load(struct drm_device *dev) + dev->mode_config.helper_private = &vc4_mode_config_helpers; + dev->mode_config.preferred_depth = 24; + dev->mode_config.async_page_flip = true; ++ if (vc4->firmware_kms) ++ dev->mode_config.normalize_zpos = true; + + ret = vc4_ctm_obj_init(vc4); + if (ret) +--- /dev/null ++++ b/drivers/gpu/drm/vc4/vc_image_types.h +@@ -0,0 +1,175 @@ ++ ++/* ++ * Copyright (c) 2012, Broadcom Europe Ltd ++ * ++ * Values taken from vc_image_types.h released by Broadcom at ++ * https://github.com/raspberrypi/userland/blob/master/interface/vctypes/vc_image_types.h ++ * and vc_image_structs.h at ++ * https://github.com/raspberrypi/userland/blob/master/interface/vctypes/vc_image_structs.h ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++enum { ++ VC_IMAGE_MIN = 0, //bounds for error checking ++ ++ VC_IMAGE_RGB565 = 1, ++ VC_IMAGE_1BPP, ++ VC_IMAGE_YUV420, ++ VC_IMAGE_48BPP, ++ VC_IMAGE_RGB888, ++ VC_IMAGE_8BPP, ++ /* 4bpp palettised image */ ++ VC_IMAGE_4BPP, ++ /* A separated format of 16 colour/light shorts followed by 16 z ++ * values ++ */ ++ VC_IMAGE_3D32, ++ /* 16 colours followed by 16 z values */ ++ VC_IMAGE_3D32B, ++ /* A separated format of 16 material/colour/light shorts followed by ++ * 16 z values ++ */ ++ VC_IMAGE_3D32MAT, ++ /* 32 bit format containing 18 bits of 6.6.6 RGB, 9 bits per short */ ++ VC_IMAGE_RGB2X9, ++ /* 32-bit format holding 18 bits of 6.6.6 RGB */ ++ VC_IMAGE_RGB666, ++ /* 4bpp palettised image with embedded palette */ ++ VC_IMAGE_PAL4_OBSOLETE, ++ /* 8bpp palettised image with embedded palette */ ++ VC_IMAGE_PAL8_OBSOLETE, ++ /* RGB888 with an alpha byte after each pixel */ ++ VC_IMAGE_RGBA32, ++ /* a line of Y (32-byte padded), a line of U (16-byte padded), and a ++ * line of V (16-byte padded) ++ */ ++ VC_IMAGE_YUV422, ++ /* RGB565 with a transparent patch */ ++ VC_IMAGE_RGBA565, ++ /* Compressed (4444) version of RGBA32 */ ++ VC_IMAGE_RGBA16, ++ /* VCIII codec format */ ++ VC_IMAGE_YUV_UV, ++ /* VCIII T-format RGBA8888 */ ++ VC_IMAGE_TF_RGBA32, ++ /* VCIII T-format RGBx8888 */ ++ VC_IMAGE_TF_RGBX32, ++ /* VCIII T-format float */ ++ VC_IMAGE_TF_FLOAT, ++ /* VCIII T-format RGBA4444 */ ++ VC_IMAGE_TF_RGBA16, ++ /* VCIII T-format RGB5551 */ ++ VC_IMAGE_TF_RGBA5551, ++ /* VCIII T-format RGB565 */ ++ VC_IMAGE_TF_RGB565, ++ /* VCIII T-format 8-bit luma and 8-bit alpha */ ++ VC_IMAGE_TF_YA88, ++ /* VCIII T-format 8 bit generic sample */ ++ VC_IMAGE_TF_BYTE, ++ /* VCIII T-format 8-bit palette */ ++ VC_IMAGE_TF_PAL8, ++ /* VCIII T-format 4-bit palette */ ++ VC_IMAGE_TF_PAL4, ++ /* VCIII T-format Ericsson Texture Compressed */ ++ VC_IMAGE_TF_ETC1, ++ /* RGB888 with R & B swapped */ ++ VC_IMAGE_BGR888, ++ /* RGB888 with R & B swapped, but with no pitch, i.e. no padding after ++ * each row of pixels ++ */ ++ VC_IMAGE_BGR888_NP, ++ /* Bayer image, extra defines which variant is being used */ ++ VC_IMAGE_BAYER, ++ /* General wrapper for codec images e.g. JPEG from camera */ ++ VC_IMAGE_CODEC, ++ /* VCIII codec format */ ++ VC_IMAGE_YUV_UV32, ++ /* VCIII T-format 8-bit luma */ ++ VC_IMAGE_TF_Y8, ++ /* VCIII T-format 8-bit alpha */ ++ VC_IMAGE_TF_A8, ++ /* VCIII T-format 16-bit generic sample */ ++ VC_IMAGE_TF_SHORT, ++ /* VCIII T-format 1bpp black/white */ ++ VC_IMAGE_TF_1BPP, ++ VC_IMAGE_OPENGL, ++ /* VCIII-B0 HVS YUV 4:4:4 interleaved samples */ ++ VC_IMAGE_YUV444I, ++ /* Y, U, & V planes separately (VC_IMAGE_YUV422 has them interleaved on ++ * a per line basis) ++ */ ++ VC_IMAGE_YUV422PLANAR, ++ /* 32bpp with 8bit alpha at MS byte, with R, G, B (LS byte) */ ++ VC_IMAGE_ARGB8888, ++ /* 32bpp with 8bit unused at MS byte, with R, G, B (LS byte) */ ++ VC_IMAGE_XRGB8888, ++ ++ /* interleaved 8 bit samples of Y, U, Y, V (4 flavours) */ ++ VC_IMAGE_YUV422YUYV, ++ VC_IMAGE_YUV422YVYU, ++ VC_IMAGE_YUV422UYVY, ++ VC_IMAGE_YUV422VYUY, ++ ++ /* 32bpp like RGBA32 but with unused alpha */ ++ VC_IMAGE_RGBX32, ++ /* 32bpp, corresponding to RGBA with unused alpha */ ++ VC_IMAGE_RGBX8888, ++ /* 32bpp, corresponding to BGRA with unused alpha */ ++ VC_IMAGE_BGRX8888, ++ ++ /* Y as a plane, then UV byte interleaved in plane with same pitch, ++ * half height ++ */ ++ VC_IMAGE_YUV420SP, ++ ++ /* Y, U, & V planes separately 4:4:4 */ ++ VC_IMAGE_YUV444PLANAR, ++ ++ /* T-format 8-bit U - same as TF_Y8 buf from U plane */ ++ VC_IMAGE_TF_U8, ++ /* T-format 8-bit U - same as TF_Y8 buf from V plane */ ++ VC_IMAGE_TF_V8, ++ ++ /* YUV4:2:0 planar, 16bit values */ ++ VC_IMAGE_YUV420_16, ++ /* YUV4:2:0 codec format, 16bit values */ ++ VC_IMAGE_YUV_UV_16, ++ /* YUV4:2:0 with U,V in side-by-side format */ ++ VC_IMAGE_YUV420_S, ++ /* 10-bit YUV 420 column image format */ ++ VC_IMAGE_YUV10COL, ++ /* 32-bpp, 10-bit R/G/B, 2-bit Alpha */ ++ VC_IMAGE_RGBA1010102, ++ ++ VC_IMAGE_MAX, /* bounds for error checking */ ++ VC_IMAGE_FORCE_ENUM_16BIT = 0xffff, ++}; ++ ++enum { ++ /* Unknown or unset - defaults to BT601 interstitial */ ++ VC_IMAGE_YUVINFO_UNSPECIFIED = 0, ++ ++ /* colour-space conversions data [4 bits] */ ++ ++ /* ITU-R BT.601-5 [SDTV] (compatible with VideoCore-II) */ ++ VC_IMAGE_YUVINFO_CSC_ITUR_BT601 = 1, ++ /* ITU-R BT.709-3 [HDTV] */ ++ VC_IMAGE_YUVINFO_CSC_ITUR_BT709 = 2, ++ /* JPEG JFIF */ ++ VC_IMAGE_YUVINFO_CSC_JPEG_JFIF = 3, ++ /* Title 47 Code of Federal Regulations (2003) 73.682 (a) (20) */ ++ VC_IMAGE_YUVINFO_CSC_FCC = 4, ++ /* Society of Motion Picture and Television Engineers 240M (1999) */ ++ VC_IMAGE_YUVINFO_CSC_SMPTE_240M = 5, ++ /* ITU-R BT.470-2 System M */ ++ VC_IMAGE_YUVINFO_CSC_ITUR_BT470_2_M = 6, ++ /* ITU-R BT.470-2 System B,G */ ++ VC_IMAGE_YUVINFO_CSC_ITUR_BT470_2_BG = 7, ++ /* JPEG JFIF, but with 16..255 luma */ ++ VC_IMAGE_YUVINFO_CSC_JPEG_JFIF_Y16_255 = 8, ++ /* Rec 2020 */ ++ VC_IMAGE_YUVINFO_CSC_REC_2020 = 9, ++}; diff --git a/target/linux/bcm27xx/patches-6.1/950-0012-drm-vc4-Add-support-for-gamma-on-BCM2711.patch b/target/linux/bcm27xx/patches-6.1/950-0012-drm-vc4-Add-support-for-gamma-on-BCM2711.patch new file mode 100644 index 00000000000..1ec4c4252e1 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0012-drm-vc4-Add-support-for-gamma-on-BCM2711.patch @@ -0,0 +1,276 @@ +From 387b65c16c0d763ee4610675ce61e1072fa6cd72 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Tue, 27 Apr 2021 14:24:21 +0200 +Subject: [PATCH] drm/vc4: Add support for gamma on BCM2711 + +BCM2711 changes from a 256 entry lookup table to a 16 point +piecewise linear function as the pipeline bitdepth has increased +to make a LUT unwieldy. + +Implement a simple conversion from a 256 entry LUT that userspace +is likely to expect to 16 evenly spread points in the PWL. This +could be improved with curve fitting at a later date. + +Co-developed-by: Juerg Haefliger +Signed-off-by: Juerg Haefliger +Signed-off-by: Dave Stevenson +Signed-off-by: Maxime Ripard +--- + drivers/gpu/drm/vc4/vc4_crtc.c | 35 ++++++++++--- + drivers/gpu/drm/vc4/vc4_drv.h | 28 +++++++++-- + drivers/gpu/drm/vc4/vc4_hvs.c | 89 ++++++++++++++++++++++++++++++++-- + drivers/gpu/drm/vc4/vc4_regs.h | 22 +++++++++ + 4 files changed, 162 insertions(+), 12 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -1326,19 +1326,42 @@ int vc4_crtc_init(struct drm_device *drm + + if (!vc4->is_vc5) { + drm_mode_crtc_set_gamma_size(crtc, ARRAY_SIZE(vc4_crtc->lut_r)); ++ } else { ++ /* This is a lie for hvs5 which uses a 16 point PWL, but it ++ * allows for something smarter than just 16 linearly spaced ++ * segments. Conversion is done in vc5_hvs_update_gamma_lut. ++ */ ++ drm_mode_crtc_set_gamma_size(crtc, 256); ++ } + +- drm_crtc_enable_color_mgmt(crtc, 0, false, crtc->gamma_size); ++ drm_crtc_enable_color_mgmt(crtc, 0, false, crtc->gamma_size); + ++ if (!vc4->is_vc5) { + /* We support CTM, but only for one CRTC at a time. It's therefore + * implemented as private driver state in vc4_kms, not here. + */ + drm_crtc_enable_color_mgmt(crtc, 0, true, crtc->gamma_size); +- } + +- for (i = 0; i < crtc->gamma_size; i++) { +- vc4_crtc->lut_r[i] = i; +- vc4_crtc->lut_g[i] = i; +- vc4_crtc->lut_b[i] = i; ++ /* Initialize the VC4 gamma LUTs */ ++ for (i = 0; i < crtc->gamma_size; i++) { ++ vc4_crtc->lut_r[i] = i; ++ vc4_crtc->lut_g[i] = i; ++ vc4_crtc->lut_b[i] = i; ++ } ++ } else { ++ /* Initialize the VC5 gamma PWL entries. Assume 12-bit pipeline, ++ * evenly spread over full range. ++ */ ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++) { ++ vc4_crtc->pwl_r[i] = ++ VC5_HVS_SET_GAMMA_ENTRY(i << 8, i << 12, 1 << 8); ++ vc4_crtc->pwl_g[i] = ++ VC5_HVS_SET_GAMMA_ENTRY(i << 8, i << 12, 1 << 8); ++ vc4_crtc->pwl_b[i] = ++ VC5_HVS_SET_GAMMA_ENTRY(i << 8, i << 12, 1 << 8); ++ vc4_crtc->pwl_a[i] = ++ VC5_HVS_SET_GAMMA_ENTRY(i << 8, i << 12, 1 << 8); ++ } + } + + return 0; +--- a/drivers/gpu/drm/vc4/vc4_drv.h ++++ b/drivers/gpu/drm/vc4/vc4_drv.h +@@ -20,6 +20,7 @@ + #include + + #include "uapi/drm/vc4_drm.h" ++#include "vc4_regs.h" + + struct drm_device; + struct drm_gem_object; +@@ -481,6 +482,17 @@ struct vc4_pv_data { + enum vc4_encoder_type encoder_types[4]; + }; + ++struct vc5_gamma_entry { ++ u32 x_c_terms; ++ u32 grad_term; ++}; ++ ++#define VC5_HVS_SET_GAMMA_ENTRY(x, c, g) (struct vc5_gamma_entry){ \ ++ .x_c_terms = VC4_SET_FIELD((x), SCALER5_DSPGAMMA_OFF_X) | \ ++ VC4_SET_FIELD((c), SCALER5_DSPGAMMA_OFF_C), \ ++ .grad_term = (g) \ ++} ++ + struct vc4_crtc { + struct drm_crtc base; + struct platform_device *pdev; +@@ -490,9 +502,19 @@ struct vc4_crtc { + /* Timestamp at start of vblank irq - unaffected by lock delays. */ + ktime_t t_vblank; + +- u8 lut_r[256]; +- u8 lut_g[256]; +- u8 lut_b[256]; ++ union { ++ struct { /* VC4 gamma LUT */ ++ u8 lut_r[256]; ++ u8 lut_g[256]; ++ u8 lut_b[256]; ++ }; ++ struct { /* VC5 gamma PWL entries */ ++ struct vc5_gamma_entry pwl_r[SCALER5_DSPGAMMA_NUM_POINTS]; ++ struct vc5_gamma_entry pwl_g[SCALER5_DSPGAMMA_NUM_POINTS]; ++ struct vc5_gamma_entry pwl_b[SCALER5_DSPGAMMA_NUM_POINTS]; ++ struct vc5_gamma_entry pwl_a[SCALER5_DSPGAMMA_NUM_POINTS]; ++ }; ++ }; + + struct drm_pending_vblank_event *event; + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -241,7 +241,8 @@ static void vc4_hvs_lut_load(struct vc4_ + static void vc4_hvs_update_gamma_lut(struct vc4_hvs *hvs, + struct vc4_crtc *vc4_crtc) + { +- struct drm_crtc_state *crtc_state = vc4_crtc->base.state; ++ struct drm_crtc *crtc = &vc4_crtc->base; ++ struct drm_crtc_state *crtc_state = crtc->state; + struct drm_color_lut *lut = crtc_state->gamma_lut->data; + u32 length = drm_color_lut_size(crtc_state->gamma_lut); + u32 i; +@@ -255,6 +256,81 @@ static void vc4_hvs_update_gamma_lut(str + vc4_hvs_lut_load(hvs, vc4_crtc); + } + ++static void vc5_hvs_write_gamma_entry(struct vc4_hvs *hvs, ++ u32 offset, ++ struct vc5_gamma_entry *gamma) ++{ ++ HVS_WRITE(offset, gamma->x_c_terms); ++ HVS_WRITE(offset + 4, gamma->grad_term); ++} ++ ++static void vc5_hvs_lut_load(struct vc4_hvs *hvs, ++ struct vc4_crtc *vc4_crtc) ++{ ++ struct drm_crtc *crtc = &vc4_crtc->base; ++ struct drm_crtc_state *crtc_state = crtc->state; ++ struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc_state); ++ u32 i; ++ u32 offset = SCALER5_DSPGAMMA_START + ++ vc4_state->assigned_channel * SCALER5_DSPGAMMA_CHAN_OFFSET; ++ ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++, offset += 8) ++ vc5_hvs_write_gamma_entry(hvs, offset, &vc4_crtc->pwl_r[i]); ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++, offset += 8) ++ vc5_hvs_write_gamma_entry(hvs, offset, &vc4_crtc->pwl_g[i]); ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++, offset += 8) ++ vc5_hvs_write_gamma_entry(hvs, offset, &vc4_crtc->pwl_b[i]); ++ ++ if (vc4_state->assigned_channel == 2) { ++ /* Alpha only valid on channel 2 */ ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++, offset += 8) ++ vc5_hvs_write_gamma_entry(hvs, offset, &vc4_crtc->pwl_a[i]); ++ } ++} ++ ++static void vc5_hvs_update_gamma_lut(struct vc4_hvs *hvs, ++ struct vc4_crtc *vc4_crtc) ++{ ++ struct drm_crtc *crtc = &vc4_crtc->base; ++ struct drm_color_lut *lut = crtc->state->gamma_lut->data; ++ unsigned int step, i; ++ u32 start, end; ++ ++#define VC5_HVS_UPDATE_GAMMA_ENTRY_FROM_LUT(pwl, chan) \ ++ start = drm_color_lut_extract(lut[i * step].chan, 12); \ ++ end = drm_color_lut_extract(lut[(i + 1) * step - 1].chan, 12); \ ++ \ ++ /* Negative gradients not permitted by the hardware, so \ ++ * flatten such points out. \ ++ */ \ ++ if (end < start) \ ++ end = start; \ ++ \ ++ /* Assume 12bit pipeline. \ ++ * X evenly spread over full range (12 bit). \ ++ * C as U12.4 format. \ ++ * Gradient as U4.8 format. \ ++ */ \ ++ vc4_crtc->pwl[i] = \ ++ VC5_HVS_SET_GAMMA_ENTRY(i << 8, start << 4, \ ++ ((end - start) << 4) / (step - 1)) ++ ++ /* HVS5 has a 16 point piecewise linear function for each colour ++ * channel (including alpha on channel 2) on each display channel. ++ * ++ * Currently take a crude subsample of the gamma LUT, but this could ++ * be improved to implement curve fitting. ++ */ ++ step = crtc->gamma_size / SCALER5_DSPGAMMA_NUM_POINTS; ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++) { ++ VC5_HVS_UPDATE_GAMMA_ENTRY_FROM_LUT(pwl_r, red); ++ VC5_HVS_UPDATE_GAMMA_ENTRY_FROM_LUT(pwl_g, green); ++ VC5_HVS_UPDATE_GAMMA_ENTRY_FROM_LUT(pwl_b, blue); ++ } ++ ++ vc5_hvs_lut_load(hvs, vc4_crtc); ++} ++ + u8 vc4_hvs_get_fifo_frame_count(struct vc4_hvs *hvs, unsigned int fifo) + { + struct drm_device *drm = &hvs->vc4->base; +@@ -398,7 +474,10 @@ static int vc4_hvs_init_channel(struct v + /* Reload the LUT, since the SRAMs would have been disabled if + * all CRTCs had SCALER_DISPBKGND_GAMMA unset at once. + */ +- vc4_hvs_lut_load(hvs, vc4_crtc); ++ if (!vc4->is_vc5) ++ vc4_hvs_lut_load(hvs, vc4_crtc); ++ else ++ vc5_hvs_lut_load(hvs, vc4_crtc); + + drm_dev_exit(idx); + +@@ -628,7 +707,11 @@ void vc4_hvs_atomic_flush(struct drm_crt + u32 dispbkgndx = HVS_READ(SCALER_DISPBKGNDX(channel)); + + if (crtc->state->gamma_lut) { +- vc4_hvs_update_gamma_lut(hvs, vc4_crtc); ++ if (!vc4->is_vc5) ++ vc4_hvs_update_gamma_lut(hvs, vc4_crtc); ++ else ++ vc5_hvs_update_gamma_lut(hvs, vc4_crtc); ++ + dispbkgndx |= SCALER_DISPBKGND_GAMMA; + } else { + /* Unsetting DISPBKGND_GAMMA skips the gamma lut step +--- a/drivers/gpu/drm/vc4/vc4_regs.h ++++ b/drivers/gpu/drm/vc4/vc4_regs.h +@@ -512,6 +512,28 @@ + #define SCALER_DLIST_START 0x00002000 + #define SCALER_DLIST_SIZE 0x00004000 + ++/* Gamma PWL for each channel. 16 points for each of 4 colour channels (alpha ++ * only on channel 2). 8 bytes per entry, offsets first, then gradient: ++ * Y = GRAD * X + C ++ * ++ * Values for X and C are left justified, and vary depending on the width of ++ * the HVS channel: ++ * 8-bit pipeline: X uses [31:24], C is U8.8 format, and GRAD is U4.8. ++ * 12-bit pipeline: X uses [31:20], C is U12.4 format, and GRAD is U4.8. ++ * ++ * The 3 HVS channels start at 0x400 offsets (ie chan 1 starts at 0x2400, and ++ * chan 2 at 0x2800). ++ */ ++#define SCALER5_DSPGAMMA_NUM_POINTS 16 ++#define SCALER5_DSPGAMMA_START 0x00002000 ++#define SCALER5_DSPGAMMA_CHAN_OFFSET 0x400 ++# define SCALER5_DSPGAMMA_OFF_X_MASK VC4_MASK(31, 20) ++# define SCALER5_DSPGAMMA_OFF_X_SHIFT 20 ++# define SCALER5_DSPGAMMA_OFF_C_MASK VC4_MASK(15, 0) ++# define SCALER5_DSPGAMMA_OFF_C_SHIFT 0 ++# define SCALER5_DSPGAMMA_GRAD_MASK VC4_MASK(11, 0) ++# define SCALER5_DSPGAMMA_GRAD_SHIFT 0 ++ + #define SCALER5_DLIST_START 0x00004000 + + # define VC4_HDMI_SW_RESET_FORMAT_DETECT BIT(1) diff --git a/target/linux/bcm27xx/patches-6.1/950-0013-drm-vc4-Add-debugfs-node-that-dumps-the-vc5-gamma-PW.patch b/target/linux/bcm27xx/patches-6.1/950-0013-drm-vc4-Add-debugfs-node-that-dumps-the-vc5-gamma-PW.patch new file mode 100644 index 00000000000..4b4dcb64df9 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0013-drm-vc4-Add-debugfs-node-that-dumps-the-vc5-gamma-PW.patch @@ -0,0 +1,122 @@ +From 3905be68859b15731ec41b3d22cd1a9069375f7f Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Wed, 28 Apr 2021 12:32:10 +0200 +Subject: [PATCH] drm/vc4: Add debugfs node that dumps the vc5 gamma + PWL entries + +This helps with debugging the conversion from a 256 point gamma LUT to +16 point PWL entries as used by the BCM2711. + +Co-developed-by: Juerg Haefliger +Signed-off-by: Juerg Haefliger +Signed-off-by: Dave Stevenson +Signed-off-by: Maxime Ripard +--- + drivers/gpu/drm/vc4/vc4_hvs.c | 85 ++++++++++++++++++++++++++++++++++- + 1 file changed, 84 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -141,6 +141,85 @@ static int vc4_hvs_debugfs_dlist(struct + return 0; + } + ++static int vc5_hvs_debugfs_gamma(struct seq_file *m, void *data) ++{ ++ struct drm_info_node *node = m->private; ++ struct drm_device *dev = node->minor->dev; ++ struct vc4_dev *vc4 = to_vc4_dev(dev); ++ struct vc4_hvs *hvs = vc4->hvs; ++ struct drm_printer p = drm_seq_file_printer(m); ++ unsigned int i, chan; ++ u32 dispstat, dispbkgndx; ++ ++ for (chan = 0; chan < SCALER_CHANNELS_COUNT; chan++) { ++ u32 x_c, grad; ++ u32 offset = SCALER5_DSPGAMMA_START + ++ chan * SCALER5_DSPGAMMA_CHAN_OFFSET; ++ ++ dispstat = VC4_GET_FIELD(HVS_READ(SCALER_DISPSTATX(chan)), ++ SCALER_DISPSTATX_MODE); ++ if (dispstat == SCALER_DISPSTATX_MODE_DISABLED || ++ dispstat == SCALER_DISPSTATX_MODE_EOF) { ++ drm_printf(&p, "HVS channel %u: Channel disabled\n", chan); ++ continue; ++ } ++ ++ dispbkgndx = HVS_READ(SCALER_DISPBKGNDX(chan)); ++ if (!(dispbkgndx & SCALER_DISPBKGND_GAMMA)) { ++ drm_printf(&p, "HVS channel %u: Gamma disabled\n", chan); ++ continue; ++ } ++ ++ drm_printf(&p, "HVS channel %u:\n", chan); ++ drm_printf(&p, " red:\n"); ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++, offset += 8) { ++ x_c = HVS_READ(offset); ++ grad = HVS_READ(offset + 4); ++ drm_printf(&p, " %08x %08x - x %u, c %u, grad %u\n", ++ x_c, grad, ++ VC4_GET_FIELD(x_c, SCALER5_DSPGAMMA_OFF_X), ++ VC4_GET_FIELD(x_c, SCALER5_DSPGAMMA_OFF_C), ++ grad); ++ } ++ drm_printf(&p, " green:\n"); ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++, offset += 8) { ++ x_c = HVS_READ(offset); ++ grad = HVS_READ(offset + 4); ++ drm_printf(&p, " %08x %08x - x %u, c %u, grad %u\n", ++ x_c, grad, ++ VC4_GET_FIELD(x_c, SCALER5_DSPGAMMA_OFF_X), ++ VC4_GET_FIELD(x_c, SCALER5_DSPGAMMA_OFF_C), ++ grad); ++ } ++ drm_printf(&p, " blue:\n"); ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++, offset += 8) { ++ x_c = HVS_READ(offset); ++ grad = HVS_READ(offset + 4); ++ drm_printf(&p, " %08x %08x - x %u, c %u, grad %u\n", ++ x_c, grad, ++ VC4_GET_FIELD(x_c, SCALER5_DSPGAMMA_OFF_X), ++ VC4_GET_FIELD(x_c, SCALER5_DSPGAMMA_OFF_C), ++ grad); ++ } ++ ++ /* Alpha only valid on channel 2 */ ++ if (chan != 2) ++ continue; ++ ++ drm_printf(&p, " alpha:\n"); ++ for (i = 0; i < SCALER5_DSPGAMMA_NUM_POINTS; i++, offset += 8) { ++ x_c = HVS_READ(offset); ++ grad = HVS_READ(offset + 4); ++ drm_printf(&p, " %08x %08x - x %u, c %u, grad %u\n", ++ x_c, grad, ++ VC4_GET_FIELD(x_c, SCALER5_DSPGAMMA_OFF_X), ++ VC4_GET_FIELD(x_c, SCALER5_DSPGAMMA_OFF_C), ++ grad); ++ } ++ } ++ return 0; ++} ++ + /* The filter kernel is composed of dwords each containing 3 9-bit + * signed integers packed next to each other. + */ +@@ -833,11 +912,15 @@ int vc4_hvs_debugfs_init(struct drm_mino + if (!vc4->hvs) + return -ENODEV; + +- if (!vc4->is_vc5) ++ if (!vc4->is_vc5) { + debugfs_create_bool("hvs_load_tracker", S_IRUGO | S_IWUSR, + minor->debugfs_root, + &vc4->load_tracker_enabled); + ++ vc4_debugfs_add_file(minor, "hvs_gamma", vc5_hvs_debugfs_gamma, ++ NULL); ++ } ++ + ret = vc4_debugfs_add_file(minor, "hvs_dlists", + vc4_hvs_debugfs_dlist, NULL); + if (ret) diff --git a/target/linux/bcm27xx/patches-6.1/950-0014-drm-vc4-hvs-Force-modeset-on-gamma-lut-change.patch b/target/linux/bcm27xx/patches-6.1/950-0014-drm-vc4-hvs-Force-modeset-on-gamma-lut-change.patch new file mode 100644 index 00000000000..cb6f834861c --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0014-drm-vc4-hvs-Force-modeset-on-gamma-lut-change.patch @@ -0,0 +1,105 @@ +From 132865ef0ce76d66a27152eee131ba4335639df4 Mon Sep 17 00:00:00 2001 +From: Maxime Ripard +Date: Mon, 14 Jun 2021 15:28:30 +0200 +Subject: [PATCH] drm/vc4: hvs: Force modeset on gamma lut change + +The HVS Gamma block can only be updated when idle, so we need to disable +the HVS channel when the gamma property is set in an atomic commit. + +Since the pixelvalve cannot have its assigned channel halted without +stalling unless it's disabled as well, in our case that means forcing a +full disable / enable cycle on the pipeline. + +Signed-off-by: Maxime Ripard +--- + drivers/gpu/drm/vc4/vc4_crtc.c | 17 +++++++++++++++++ + drivers/gpu/drm/vc4/vc4_drv.h | 3 +++ + drivers/gpu/drm/vc4/vc4_hvs.c | 32 +++++++++++++++++++++++++++++++- + 3 files changed, 51 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -293,6 +293,23 @@ struct drm_encoder *vc4_get_crtc_encoder + return NULL; + } + ++#define drm_for_each_connector_mask(connector, dev, connector_mask) \ ++ list_for_each_entry((connector), &(dev)->mode_config.connector_list, head) \ ++ for_each_if ((connector_mask) & drm_connector_mask(connector)) ++ ++struct drm_connector *vc4_get_crtc_connector(struct drm_crtc *crtc, ++ struct drm_crtc_state *state) ++{ ++ struct drm_connector *connector; ++ ++ WARN_ON(hweight32(state->connector_mask) > 1); ++ ++ drm_for_each_connector_mask(connector, crtc->dev, state->connector_mask) ++ return connector; ++ ++ return NULL; ++} ++ + static void vc4_crtc_pixelvalve_reset(struct drm_crtc *crtc) + { + struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc); +--- a/drivers/gpu/drm/vc4/vc4_drv.h ++++ b/drivers/gpu/drm/vc4/vc4_drv.h +@@ -568,6 +568,9 @@ vc4_crtc_to_vc4_pv_data(const struct vc4 + return container_of(data, struct vc4_pv_data, base); + } + ++struct drm_connector *vc4_get_crtc_connector(struct drm_crtc *crtc, ++ struct drm_crtc_state *state); ++ + struct drm_encoder *vc4_get_crtc_encoder(struct drm_crtc *crtc, + struct drm_crtc_state *state); + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -594,6 +594,36 @@ out: + drm_dev_exit(idx); + } + ++static int vc4_hvs_gamma_check(struct drm_crtc *crtc, ++ struct drm_atomic_state *state) ++{ ++ struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); ++ struct drm_connector_state *conn_state; ++ struct drm_connector *connector; ++ struct drm_device *dev = crtc->dev; ++ struct vc4_dev *vc4 = to_vc4_dev(dev); ++ ++ if (!vc4->is_vc5) ++ return 0; ++ ++ if (!crtc_state->color_mgmt_changed) ++ return 0; ++ ++ connector = vc4_get_crtc_connector(crtc, crtc_state); ++ if (!connector) ++ return -EINVAL; ++ ++ if (!(connector->connector_type == DRM_MODE_CONNECTOR_HDMIA)) ++ return 0; ++ ++ conn_state = drm_atomic_get_connector_state(state, connector); ++ if (!conn_state) ++ return -EINVAL; ++ ++ crtc_state->mode_changed = true; ++ return 0; ++} ++ + int vc4_hvs_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *state) + { + struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); +@@ -624,7 +654,7 @@ int vc4_hvs_atomic_check(struct drm_crtc + if (ret) + return ret; + +- return 0; ++ return vc4_hvs_gamma_check(crtc, state); + } + + static void vc4_hvs_install_dlist(struct drm_crtc *crtc) diff --git a/target/linux/bcm27xx/patches-6.1/950-0015-drm-vc4-Relax-VEC-modeline-requirements-and-add-prog.patch b/target/linux/bcm27xx/patches-6.1/950-0015-drm-vc4-Relax-VEC-modeline-requirements-and-add-prog.patch new file mode 100644 index 00000000000..9b7bc332ef8 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0015-drm-vc4-Relax-VEC-modeline-requirements-and-add-prog.patch @@ -0,0 +1,149 @@ +From a4614b6f6c4e3a9ef80c88f272c1503b91f7ef8c Mon Sep 17 00:00:00 2001 +From: Mateusz Kwiatkowski +Date: Thu, 15 Jul 2021 01:08:08 +0200 +Subject: [PATCH] drm/vc4: Relax VEC modeline requirements and add + progressive mode support + +Make vc4_vec_encoder_atomic_check() accept arbitrary modelines, as long +as they result in somewhat sane output from the VEC. The bounds have +been determined empirically. Additionally, add support for the +progressive 262-line and 312-line modes. + +Signed-off-by: Mateusz Kwiatkowski +--- + drivers/gpu/drm/vc4/vc4_crtc.c | 1 + + drivers/gpu/drm/vc4/vc4_vec.c | 94 ++++++++++++++++++++++++++++++---- + 2 files changed, 85 insertions(+), 10 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -422,6 +422,7 @@ static void vc4_crtc_config_pv(struct dr + CRTC_WRITE(PV_V_CONTROL, + PV_VCONTROL_CONTINUOUS | + (is_dsi ? PV_VCONTROL_DSI : 0)); ++ CRTC_WRITE(PV_VSYNCD_EVEN, 0); + } + + CRTC_WRITE(PV_VERTA, +--- a/drivers/gpu/drm/vc4/vc4_vec.c ++++ b/drivers/gpu/drm/vc4/vc4_vec.c +@@ -400,18 +400,11 @@ static int vc4_vec_connector_atomic_chec + struct drm_connector_state *new_state = + drm_atomic_get_new_connector_state(state, conn); + +- const struct vc4_vec_tv_mode *vec_mode = +- &vc4_vec_tv_modes[new_state->tv.mode]; +- +- if (new_state->crtc) { ++ if (new_state->crtc && old_state->tv.mode != new_state->tv.mode) { + struct drm_crtc_state *crtc_state = + drm_atomic_get_new_crtc_state(state, new_state->crtc); + +- if (!drm_mode_equal(vec_mode->mode, &crtc_state->mode)) +- return -EINVAL; +- +- if (old_state->tv.mode != new_state->tv.mode) +- crtc_state->mode_changed = true; ++ crtc_state->mode_changed = true; + } + + return 0; +@@ -546,7 +539,10 @@ static void vc4_vec_encoder_enable(struc + VEC_WRITE(VEC_CLMP0_START, 0xac); + VEC_WRITE(VEC_CLMP0_END, 0xec); + VEC_WRITE(VEC_CONFIG2, +- VEC_CONFIG2_UV_DIG_DIS | VEC_CONFIG2_RGB_DIG_DIS); ++ VEC_CONFIG2_UV_DIG_DIS | ++ VEC_CONFIG2_RGB_DIG_DIS | ++ ((encoder->crtc->state->adjusted_mode.flags & ++ DRM_MODE_FLAG_INTERLACE) ? 0 : VEC_CONFIG2_PROG_SCAN)); + VEC_WRITE(VEC_CONFIG3, VEC_CONFIG3_HORIZ_LEN_STD); + VEC_WRITE(VEC_DAC_CONFIG, vec->variant->dac_config); + +@@ -575,8 +571,86 @@ err_put_runtime_pm: + err_dev_exit: + drm_dev_exit(idx); + } ++static int vc4_vec_encoder_atomic_check(struct drm_encoder *encoder, ++ struct drm_crtc_state *crtc_state, ++ struct drm_connector_state *conn_state) ++{ ++ const struct drm_display_mode *reference_mode = ++ vc4_vec_tv_modes[conn_state->tv.mode].mode; ++ ++ if (crtc_state->adjusted_mode.crtc_clock != reference_mode->clock || ++ crtc_state->adjusted_mode.crtc_htotal != reference_mode->htotal || ++ crtc_state->adjusted_mode.crtc_hdisplay % 4 != 0 || ++ crtc_state->adjusted_mode.crtc_hsync_end - ++ crtc_state->adjusted_mode.crtc_hsync_start < 1) ++ return -EINVAL; ++ ++ switch (reference_mode->vtotal) { ++ case 525: ++ if (crtc_state->adjusted_mode.crtc_vdisplay < 1 || ++ crtc_state->adjusted_mode.crtc_vdisplay > 253 || ++ crtc_state->adjusted_mode.crtc_vsync_start - ++ crtc_state->adjusted_mode.crtc_vdisplay < 1 || ++ crtc_state->adjusted_mode.crtc_vsync_end - ++ crtc_state->adjusted_mode.crtc_vsync_start != 3 || ++ crtc_state->adjusted_mode.crtc_vtotal - ++ crtc_state->adjusted_mode.crtc_vsync_end < 4 || ++ crtc_state->adjusted_mode.crtc_vtotal > 262) ++ return -EINVAL; ++ ++ if ((crtc_state->adjusted_mode.flags & ++ DRM_MODE_FLAG_INTERLACE) && ++ (crtc_state->adjusted_mode.vdisplay % 2 != 0 || ++ crtc_state->adjusted_mode.vsync_start % 2 != 1 || ++ crtc_state->adjusted_mode.vsync_end % 2 != 1 || ++ crtc_state->adjusted_mode.vtotal % 2 != 1)) ++ return -EINVAL; ++ ++ /* progressive mode is hard-wired to 262 total lines */ ++ if (!(crtc_state->adjusted_mode.flags & ++ DRM_MODE_FLAG_INTERLACE) && ++ crtc_state->adjusted_mode.crtc_vtotal != 262) ++ return -EINVAL; ++ ++ break; ++ ++ case 625: ++ if (crtc_state->adjusted_mode.crtc_vdisplay < 1 || ++ crtc_state->adjusted_mode.crtc_vdisplay > 305 || ++ crtc_state->adjusted_mode.crtc_vsync_start - ++ crtc_state->adjusted_mode.crtc_vdisplay < 1 || ++ crtc_state->adjusted_mode.crtc_vsync_end - ++ crtc_state->adjusted_mode.crtc_vsync_start != 3 || ++ crtc_state->adjusted_mode.crtc_vtotal - ++ crtc_state->adjusted_mode.crtc_vsync_end < 2 || ++ crtc_state->adjusted_mode.crtc_vtotal > 312) ++ return -EINVAL; ++ ++ if ((crtc_state->adjusted_mode.flags & ++ DRM_MODE_FLAG_INTERLACE) && ++ (crtc_state->adjusted_mode.vdisplay % 2 != 0 || ++ crtc_state->adjusted_mode.vsync_start % 2 != 0 || ++ crtc_state->adjusted_mode.vsync_end % 2 != 0 || ++ crtc_state->adjusted_mode.vtotal % 2 != 1)) ++ return -EINVAL; ++ ++ /* progressive mode is hard-wired to 312 total lines */ ++ if (!(crtc_state->adjusted_mode.flags & ++ DRM_MODE_FLAG_INTERLACE) && ++ crtc_state->adjusted_mode.crtc_vtotal != 312) ++ return -EINVAL; ++ ++ break; ++ ++ default: ++ return -EINVAL; ++ } ++ ++ return 0; ++} + + static const struct drm_encoder_helper_funcs vc4_vec_encoder_helper_funcs = { ++ .atomic_check = vc4_vec_encoder_atomic_check, + .atomic_disable = vc4_vec_encoder_disable, + .atomic_enable = vc4_vec_encoder_enable, + }; diff --git a/target/linux/bcm27xx/patches-6.1/950-0016-drm-vc4-Make-VEC-progressive-modes-readily-accessibl.patch b/target/linux/bcm27xx/patches-6.1/950-0016-drm-vc4-Make-VEC-progressive-modes-readily-accessibl.patch new file mode 100644 index 00000000000..43eab7edda6 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0016-drm-vc4-Make-VEC-progressive-modes-readily-accessibl.patch @@ -0,0 +1,165 @@ +From bfd6f67af0450e29378d390386210ac91c5dcfce Mon Sep 17 00:00:00 2001 +From: Mateusz Kwiatkowski +Date: Thu, 15 Jul 2021 01:08:11 +0200 +Subject: [PATCH] drm/vc4: Make VEC progressive modes readily + accessible + +Add predefined modelines for the 240p (NTSC) and 288p (PAL) progressive +modes, and report them through vc4_vec_connector_get_modes(). + +Signed-off-by: Mateusz Kwiatkowski +--- + drivers/gpu/drm/vc4/vc4_vec.c | 73 ++++++++++++++++++++++++++--------- + 1 file changed, 55 insertions(+), 18 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_vec.c ++++ b/drivers/gpu/drm/vc4/vc4_vec.c +@@ -228,7 +228,8 @@ enum vc4_vec_tv_mode_id { + }; + + struct vc4_vec_tv_mode { +- const struct drm_display_mode *mode; ++ const struct drm_display_mode *interlaced_mode; ++ const struct drm_display_mode *progressive_mode; + u32 config0; + u32 config1; + u32 custom_freq; +@@ -262,61 +263,81 @@ static const struct debugfs_reg32 vec_re + }; + + static const struct drm_display_mode drm_mode_480i = { +- DRM_MODE("720x480", DRM_MODE_TYPE_DRIVER, 13500, ++ DRM_MODE("720x480i", DRM_MODE_TYPE_DRIVER, 13500, + 720, 720 + 14, 720 + 14 + 64, 720 + 14 + 64 + 60, 0, + 480, 480 + 7, 480 + 7 + 6, 525, 0, + DRM_MODE_FLAG_INTERLACE) + }; + ++static const struct drm_display_mode drm_mode_240p = { ++ DRM_MODE("720x240", DRM_MODE_TYPE_DRIVER, 13500, ++ 720, 720 + 14, 720 + 14 + 64, 720 + 14 + 64 + 60, 0, ++ 240, 240 + 3, 240 + 3 + 3, 262, 0, 0) ++}; ++ + static const struct drm_display_mode drm_mode_576i = { +- DRM_MODE("720x576", DRM_MODE_TYPE_DRIVER, 13500, ++ DRM_MODE("720x576i", DRM_MODE_TYPE_DRIVER, 13500, + 720, 720 + 20, 720 + 20 + 64, 720 + 20 + 64 + 60, 0, + 576, 576 + 4, 576 + 4 + 6, 625, 0, + DRM_MODE_FLAG_INTERLACE) + }; + ++static const struct drm_display_mode drm_mode_288p = { ++ DRM_MODE("720x288", DRM_MODE_TYPE_DRIVER, 13500, ++ 720, 720 + 20, 720 + 20 + 64, 720 + 20 + 64 + 60, 0, ++ 288, 288 + 2, 288 + 2 + 3, 312, 0, 0) ++}; ++ + static const struct vc4_vec_tv_mode vc4_vec_tv_modes[] = { + [VC4_VEC_TV_MODE_NTSC] = { +- .mode = &drm_mode_480i, ++ .interlaced_mode = &drm_mode_480i, ++ .progressive_mode = &drm_mode_240p, + .config0 = VEC_CONFIG0_NTSC_STD | VEC_CONFIG0_PDEN, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, + [VC4_VEC_TV_MODE_NTSC_J] = { +- .mode = &drm_mode_480i, ++ .interlaced_mode = &drm_mode_480i, ++ .progressive_mode = &drm_mode_240p, + .config0 = VEC_CONFIG0_NTSC_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, + [VC4_VEC_TV_MODE_NTSC_443] = { + /* NTSC with PAL chroma frequency */ +- .mode = &drm_mode_480i, ++ .interlaced_mode = &drm_mode_480i, ++ .progressive_mode = &drm_mode_240p, + .config0 = VEC_CONFIG0_NTSC_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, + .custom_freq = 0x2a098acb, + }, + [VC4_VEC_TV_MODE_PAL] = { +- .mode = &drm_mode_576i, ++ .interlaced_mode = &drm_mode_576i, ++ .progressive_mode = &drm_mode_288p, + .config0 = VEC_CONFIG0_PAL_BDGHI_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, + [VC4_VEC_TV_MODE_PAL_M] = { +- .mode = &drm_mode_480i, ++ .interlaced_mode = &drm_mode_480i, ++ .progressive_mode = &drm_mode_240p, + .config0 = VEC_CONFIG0_PAL_M_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, + [VC4_VEC_TV_MODE_PAL_N] = { +- .mode = &drm_mode_576i, ++ .interlaced_mode = &drm_mode_576i, ++ .progressive_mode = &drm_mode_288p, + .config0 = VEC_CONFIG0_PAL_N_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + }, + [VC4_VEC_TV_MODE_PAL60] = { + /* PAL-M with chroma frequency of regular PAL */ +- .mode = &drm_mode_480i, ++ .interlaced_mode = &drm_mode_480i, ++ .progressive_mode = &drm_mode_240p, + .config0 = VEC_CONFIG0_PAL_M_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS | VEC_CONFIG1_CUSTOM_FREQ, + .custom_freq = 0x2a098acb, + }, + [VC4_VEC_TV_MODE_SECAM] = { +- .mode = &drm_mode_576i, ++ .interlaced_mode = &drm_mode_576i, ++ .progressive_mode = &drm_mode_288p, + .config0 = VEC_CONFIG0_SECAM_STD, + .config1 = VEC_CONFIG1_C_CVBS_CVBS, + .custom_freq = 0x29c71c72, +@@ -370,16 +391,32 @@ vc4_vec_connector_detect(struct drm_conn + static int vc4_vec_connector_get_modes(struct drm_connector *connector) + { + struct drm_connector_state *state = connector->state; +- struct drm_display_mode *mode; ++ struct drm_display_mode *interlaced_mode, *progressive_mode; + +- mode = drm_mode_duplicate(connector->dev, +- vc4_vec_tv_modes[state->tv.mode].mode); +- if (!mode) { ++ interlaced_mode = ++ drm_mode_duplicate(connector->dev, ++ vc4_vec_tv_modes[state->tv.mode].interlaced_mode); ++ progressive_mode = ++ drm_mode_duplicate(connector->dev, ++ vc4_vec_tv_modes[state->tv.mode].progressive_mode); ++ if (!interlaced_mode || !progressive_mode) { + DRM_ERROR("Failed to create a new display mode\n"); ++ drm_mode_destroy(connector->dev, interlaced_mode); ++ drm_mode_destroy(connector->dev, progressive_mode); + return -ENOMEM; + } + +- drm_mode_probed_add(connector, mode); ++ if (connector->cmdline_mode.specified && ++ connector->cmdline_mode.refresh_specified && ++ !connector->cmdline_mode.interlace) ++ /* progressive mode set at boot, let's make it preferred */ ++ progressive_mode->type |= DRM_MODE_TYPE_PREFERRED; ++ else ++ /* otherwise, interlaced mode is preferred */ ++ interlaced_mode->type |= DRM_MODE_TYPE_PREFERRED; ++ ++ drm_mode_probed_add(connector, interlaced_mode); ++ drm_mode_probed_add(connector, progressive_mode); + + return 1; + } +@@ -576,7 +613,7 @@ static int vc4_vec_encoder_atomic_check( + struct drm_connector_state *conn_state) + { + const struct drm_display_mode *reference_mode = +- vc4_vec_tv_modes[conn_state->tv.mode].mode; ++ vc4_vec_tv_modes[conn_state->tv.mode].interlaced_mode; + + if (crtc_state->adjusted_mode.crtc_clock != reference_mode->clock || + crtc_state->adjusted_mode.crtc_htotal != reference_mode->htotal || diff --git a/target/linux/bcm27xx/patches-6.1/950-0017-drm-Check-whether-the-gamma-lut-has-changed-before-u.patch b/target/linux/bcm27xx/patches-6.1/950-0017-drm-Check-whether-the-gamma-lut-has-changed-before-u.patch new file mode 100644 index 00000000000..c5b06b44428 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0017-drm-Check-whether-the-gamma-lut-has-changed-before-u.patch @@ -0,0 +1,30 @@ +From 39a1d2daa0440779a0790ca32543f30220b451da Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Tue, 2 Nov 2021 16:01:36 +0000 +Subject: [PATCH] drm: Check whether the gamma lut has changed before + updating + +drm_crtc_legacy_gamma_set updates the gamma_lut blob unconditionally, +which leads to unnecessary reprogramming of hardware. + +Check whether the blob contents has actually changed before +signalling that it has been updated. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/drm_color_mgmt.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/drm_color_mgmt.c ++++ b/drivers/gpu/drm/drm_color_mgmt.c +@@ -330,7 +330,9 @@ static int drm_crtc_legacy_gamma_set(str + replaced = drm_property_replace_blob(&crtc_state->degamma_lut, + use_gamma_lut ? NULL : blob); + replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL); +- replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, ++ if (!crtc_state->gamma_lut || !crtc_state->gamma_lut->data || ++ memcmp(crtc_state->gamma_lut->data, blob_data, blob->length)) ++ replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, + use_gamma_lut ? blob : NULL); + crtc_state->color_mgmt_changed |= replaced; + diff --git a/target/linux/bcm27xx/patches-6.1/950-0018-drm-vc4-Enable-gamma-block-only-when-required.patch b/target/linux/bcm27xx/patches-6.1/950-0018-drm-vc4-Enable-gamma-block-only-when-required.patch new file mode 100644 index 00000000000..0a49472ddbd --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0018-drm-vc4-Enable-gamma-block-only-when-required.patch @@ -0,0 +1,66 @@ +From 23c8491ac23b95c0557fc398f338ecc62393cf53 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Mon, 8 Nov 2021 17:32:45 +0000 +Subject: [PATCH] drm/vc4: Enable gamma block only when required. + +With HVS5 the gamma block is now only reprogrammed with +a disable/enable. Loading the table from vc4_hvs_init_channel +(called from vc4_hvs_atomic_enable) appears to be at an +invalid point in time and so isn't applied. + +Switch to enabling and disabling the gamma table instead. This +isn't safe if the pipeline is running, but it isn't now. +For HVS4 it is safe to enable and disable dynamically, so +adopt that approach there too. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_hvs.c | 22 ++++++++++++++++------ + 1 file changed, 16 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -546,8 +546,11 @@ static int vc4_hvs_init_channel(struct v + dispbkgndx &= ~SCALER_DISPBKGND_GAMMA; + dispbkgndx &= ~SCALER_DISPBKGND_INTERLACE; + ++ if (crtc->state->gamma_lut) ++ /* Enable gamma on if required */ ++ dispbkgndx |= SCALER_DISPBKGND_GAMMA; ++ + HVS_WRITE(SCALER_DISPBKGNDX(chan), dispbkgndx | +- ((!vc4->is_vc5) ? SCALER_DISPBKGND_GAMMA : 0) | + (interlace ? SCALER_DISPBKGND_INTERLACE : 0)); + + /* Reload the LUT, since the SRAMs would have been disabled if +@@ -816,18 +819,25 @@ void vc4_hvs_atomic_flush(struct drm_crt + u32 dispbkgndx = HVS_READ(SCALER_DISPBKGNDX(channel)); + + if (crtc->state->gamma_lut) { +- if (!vc4->is_vc5) ++ if (!vc4->is_vc5) { + vc4_hvs_update_gamma_lut(hvs, vc4_crtc); +- else ++ dispbkgndx |= SCALER_DISPBKGND_GAMMA; ++ } else { + vc5_hvs_update_gamma_lut(hvs, vc4_crtc); +- +- dispbkgndx |= SCALER_DISPBKGND_GAMMA; ++ } + } else { + /* Unsetting DISPBKGND_GAMMA skips the gamma lut step + * in hardware, which is the same as a linear lut that + * DRM expects us to use in absence of a user lut. ++ * ++ * Do NOT change state dynamically for hvs5 as it ++ * inserts a delay in the pipeline that will cause ++ * stalls if enabled/disabled whilst running. The other ++ * should already be disabling/enabling the pipeline ++ * when gamma changes. + */ +- dispbkgndx &= ~SCALER_DISPBKGND_GAMMA; ++ if (!vc4->is_vc5) ++ dispbkgndx &= ~SCALER_DISPBKGND_GAMMA; + } + HVS_WRITE(SCALER_DISPBKGNDX(channel), dispbkgndx); + } diff --git a/target/linux/bcm27xx/patches-6.1/950-0019-drm-vc4-Only-add-gamma-properties-once.patch b/target/linux/bcm27xx/patches-6.1/950-0019-drm-vc4-Only-add-gamma-properties-once.patch new file mode 100644 index 00000000000..c817b628770 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0019-drm-vc4-Only-add-gamma-properties-once.patch @@ -0,0 +1,26 @@ +From 7b997c4910042491c90202df414f0e574a320258 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Mon, 8 Nov 2021 18:25:49 +0000 +Subject: [PATCH] drm/vc4: Only add gamma properties once. + +Two calls were made to drm_crtc_enable_color_mgmt to add gamma +and CTM, however they were both set to add the gamma properties, +so they ended up added twice. + +Fixes: 766cc6b1f7fc "drm/vc4: Add CTM support" +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_crtc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -1358,7 +1358,7 @@ int vc4_crtc_init(struct drm_device *drm + /* We support CTM, but only for one CRTC at a time. It's therefore + * implemented as private driver state in vc4_kms, not here. + */ +- drm_crtc_enable_color_mgmt(crtc, 0, true, crtc->gamma_size); ++ drm_crtc_enable_color_mgmt(crtc, 0, true, 0); + + /* Initialize the VC4 gamma LUTs */ + for (i = 0; i < crtc->gamma_size; i++) { diff --git a/target/linux/bcm27xx/patches-6.1/950-0020-drm-vc4-Validate-the-size-of-the-gamma_lut.patch b/target/linux/bcm27xx/patches-6.1/950-0020-drm-vc4-Validate-the-size-of-the-gamma_lut.patch new file mode 100644 index 00000000000..1d4ba76e705 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0020-drm-vc4-Validate-the-size-of-the-gamma_lut.patch @@ -0,0 +1,32 @@ +From fc4d71fb629da4be7fee128bced80b9625acf3bb Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Wed, 10 Nov 2021 16:36:12 +0000 +Subject: [PATCH] drm/vc4: Validate the size of the gamma_lut + +Add a check to vc4_hvs_gamma_check to ensure a new non-empty +gamma LUT is of the correct length before accepting it. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_hvs.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -612,6 +612,16 @@ static int vc4_hvs_gamma_check(struct dr + if (!crtc_state->color_mgmt_changed) + return 0; + ++ if (crtc_state->gamma_lut) { ++ unsigned int len = drm_color_lut_size(crtc_state->gamma_lut); ++ ++ if (len != crtc->gamma_size) { ++ DRM_DEBUG_KMS("Invalid LUT size; got %u, expected %u\n", ++ len, crtc->gamma_size); ++ return -EINVAL; ++ } ++ } ++ + connector = vc4_get_crtc_connector(crtc, crtc_state); + if (!connector) + return -EINVAL; diff --git a/target/linux/bcm27xx/patches-6.1/950-0021-drm-vc4-Disable-Gamma-control-on-HVS5-due-to-issues-.patch b/target/linux/bcm27xx/patches-6.1/950-0021-drm-vc4-Disable-Gamma-control-on-HVS5-due-to-issues-.patch new file mode 100644 index 00000000000..8b443b9d56c --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0021-drm-vc4-Disable-Gamma-control-on-HVS5-due-to-issues-.patch @@ -0,0 +1,36 @@ +From bb3a24c168067c1813b9b607b6c44c43a4a889e8 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 13 Jan 2022 11:30:42 +0000 +Subject: [PATCH] drm/vc4: Disable Gamma control on HVS5 due to issues + writing the table + +Still under investigation, but the conditions under which the HVS +will accept values written to the gamma PWL are not straightforward. + +Disable gamma on HVS5 again until it can be resolved to avoid +gamma being enabled with an incorrect table. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_crtc.c | 8 +------- + 1 file changed, 1 insertion(+), 7 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -1344,15 +1344,9 @@ int vc4_crtc_init(struct drm_device *drm + + if (!vc4->is_vc5) { + drm_mode_crtc_set_gamma_size(crtc, ARRAY_SIZE(vc4_crtc->lut_r)); +- } else { +- /* This is a lie for hvs5 which uses a 16 point PWL, but it +- * allows for something smarter than just 16 linearly spaced +- * segments. Conversion is done in vc5_hvs_update_gamma_lut. +- */ +- drm_mode_crtc_set_gamma_size(crtc, 256); ++ drm_crtc_enable_color_mgmt(crtc, 0, false, crtc->gamma_size); + } + +- drm_crtc_enable_color_mgmt(crtc, 0, false, crtc->gamma_size); + + if (!vc4->is_vc5) { + /* We support CTM, but only for one CRTC at a time. It's therefore diff --git a/target/linux/bcm27xx/patches-6.1/950-0022-drm-vc4_hdmi-Add-Broadcast-RGB-property-to-allow-ove.patch b/target/linux/bcm27xx/patches-6.1/950-0022-drm-vc4_hdmi-Add-Broadcast-RGB-property-to-allow-ove.patch new file mode 100644 index 00000000000..60a96ca8e44 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0022-drm-vc4_hdmi-Add-Broadcast-RGB-property-to-allow-ove.patch @@ -0,0 +1,223 @@ +From b975642ea1ebaf66f6ed0ac403dfa82fa9d0e206 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Wed, 8 Apr 2020 16:12:02 +0100 +Subject: [PATCH] drm/vc4_hdmi: Add Broadcast RGB property to allow + override of RGB range + +Copy Intel's "Broadcast RGB" property semantics to add manual override +of the HDMI pixel range for monitors that don't abide by the content +of the AVI Infoframe. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 104 +++++++++++++++++++++++++++++++++ + drivers/gpu/drm/vc4/vc4_hdmi.h | 15 +++++ + 2 files changed, 119 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -57,6 +57,14 @@ + #include "vc4_hdmi_regs.h" + #include "vc4_regs.h" + ++/* ++ * "Broadcast RGB" property. ++ * Allows overriding of HDMI full or limited range RGB ++ */ ++#define VC4_BROADCAST_RGB_AUTO 0 ++#define VC4_BROADCAST_RGB_FULL 1 ++#define VC4_BROADCAST_RGB_LIMITED 2 ++ + #define VC5_HDMI_HORZA_HFP_SHIFT 16 + #define VC5_HDMI_HORZA_HFP_MASK VC4_MASK(28, 16) + #define VC5_HDMI_HORZA_VPOS BIT(15) +@@ -155,6 +163,11 @@ static bool vc4_hdmi_is_full_range_rgb(s + { + struct drm_display_info *display = &vc4_hdmi->connector.display_info; + ++ if (vc4_hdmi->broadcast_rgb == VC4_BROADCAST_RGB_LIMITED) ++ return false; ++ else if (vc4_hdmi->broadcast_rgb == VC4_BROADCAST_RGB_FULL) ++ return true; ++ + return !display->is_hdmi || + drm_default_rgb_quant_range(mode) == HDMI_QUANTIZATION_RANGE_FULL; + } +@@ -544,6 +557,65 @@ static int vc4_hdmi_connector_atomic_che + return 0; + } + ++/** ++ * vc4_hdmi_connector_atomic_get_property - hook for ++ * connector->atomic_get_property. ++ * @connector: Connector to get the property for. ++ * @state: Connector state to retrieve the property from. ++ * @property: Property to retrieve. ++ * @val: Return value for the property. ++ * ++ * Returns the atomic property value for a digital connector. ++ */ ++int vc4_hdmi_connector_get_property(struct drm_connector *connector, ++ const struct drm_connector_state *state, ++ struct drm_property *property, ++ uint64_t *val) ++{ ++ struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); ++ const struct vc4_hdmi_connector_state *vc4_conn_state = ++ const_conn_state_to_vc4_hdmi_conn_state(state); ++ ++ if (property == vc4_hdmi->broadcast_rgb_property) { ++ *val = vc4_conn_state->broadcast_rgb; ++ } else { ++ DRM_DEBUG_ATOMIC("Unknown property [PROP:%d:%s]\n", ++ property->base.id, property->name); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++/** ++ * vc4_hdmi_connector_atomic_set_property - hook for ++ * connector->atomic_set_property. ++ * @connector: Connector to set the property for. ++ * @state: Connector state to set the property on. ++ * @property: Property to set. ++ * @val: New value for the property. ++ * ++ * Sets the atomic property value for a digital connector. ++ */ ++int vc4_hdmi_connector_set_property(struct drm_connector *connector, ++ struct drm_connector_state *state, ++ struct drm_property *property, ++ uint64_t val) ++{ ++ struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); ++ struct vc4_hdmi_connector_state *vc4_conn_state = ++ conn_state_to_vc4_hdmi_conn_state(state); ++ ++ if (property == vc4_hdmi->broadcast_rgb_property) { ++ vc4_conn_state->broadcast_rgb = val; ++ return 0; ++ } ++ ++ DRM_DEBUG_ATOMIC("Unknown property [PROP:%d:%s]\n", ++ property->base.id, property->name); ++ return -EINVAL; ++} ++ + static void vc4_hdmi_connector_reset(struct drm_connector *connector) + { + struct vc4_hdmi_connector_state *old_state = +@@ -580,6 +652,7 @@ vc4_hdmi_connector_duplicate_state(struc + new_state->tmds_char_rate = vc4_state->tmds_char_rate; + new_state->output_bpc = vc4_state->output_bpc; + new_state->output_format = vc4_state->output_format; ++ new_state->broadcast_rgb = vc4_state->broadcast_rgb; + __drm_atomic_helper_connector_duplicate_state(connector, &new_state->base); + + return &new_state->base; +@@ -590,6 +663,8 @@ static const struct drm_connector_funcs + .reset = vc4_hdmi_connector_reset, + .atomic_duplicate_state = vc4_hdmi_connector_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, ++ .atomic_get_property = vc4_hdmi_connector_get_property, ++ .atomic_set_property = vc4_hdmi_connector_set_property, + }; + + static const struct drm_connector_helper_funcs vc4_hdmi_connector_helper_funcs = { +@@ -598,6 +673,32 @@ static const struct drm_connector_helper + .atomic_check = vc4_hdmi_connector_atomic_check, + }; + ++static const struct drm_prop_enum_list broadcast_rgb_names[] = { ++ { VC4_BROADCAST_RGB_AUTO, "Automatic" }, ++ { VC4_BROADCAST_RGB_FULL, "Full" }, ++ { VC4_BROADCAST_RGB_LIMITED, "Limited 16:235" }, ++}; ++ ++static void ++vc4_hdmi_attach_broadcast_rgb_property(struct drm_device *dev, ++ struct vc4_hdmi *vc4_hdmi) ++{ ++ struct drm_property *prop = vc4_hdmi->broadcast_rgb_property; ++ ++ if (!prop) { ++ prop = drm_property_create_enum(dev, DRM_MODE_PROP_ENUM, ++ "Broadcast RGB", ++ broadcast_rgb_names, ++ ARRAY_SIZE(broadcast_rgb_names)); ++ if (!prop) ++ return; ++ ++ vc4_hdmi->broadcast_rgb_property = prop; ++ } ++ ++ drm_object_attach_property(&vc4_hdmi->connector.base, prop, 0); ++} ++ + static int vc4_hdmi_connector_init(struct drm_device *dev, + struct vc4_hdmi *vc4_hdmi) + { +@@ -644,6 +745,8 @@ static int vc4_hdmi_connector_init(struc + if (vc4_hdmi->variant->supports_hdr) + drm_connector_attach_hdr_output_metadata_property(connector); + ++ vc4_hdmi_attach_broadcast_rgb_property(dev, vc4_hdmi); ++ + drm_connector_attach_encoder(connector, encoder); + + return 0; +@@ -1683,6 +1786,7 @@ static void vc4_hdmi_encoder_atomic_mode + mutex_lock(&vc4_hdmi->mutex); + drm_mode_copy(&vc4_hdmi->saved_adjusted_mode, + &crtc_state->adjusted_mode); ++ vc4_hdmi->broadcast_rgb = vc4_state->broadcast_rgb; + vc4_hdmi->output_bpc = vc4_state->output_bpc; + vc4_hdmi->output_format = vc4_state->output_format; + mutex_unlock(&vc4_hdmi->mutex); +--- a/drivers/gpu/drm/vc4/vc4_hdmi.h ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.h +@@ -129,6 +129,8 @@ struct vc4_hdmi { + + struct delayed_work scrambling_work; + ++ struct drm_property *broadcast_rgb_property; ++ + struct i2c_adapter *ddc; + void __iomem *hdmicore_regs; + void __iomem *hd_regs; +@@ -229,6 +231,12 @@ struct vc4_hdmi { + * for use outside of KMS hooks. Protected by @mutex. + */ + enum vc4_hdmi_output_format output_format; ++ ++ /** ++ * @broadcast_rgb: Copy of @vc4_connector_state.broadcast_rgb ++ * for use outside of KMS hooks. Protected by @mutex. ++ */ ++ int broadcast_rgb; + }; + + static inline struct vc4_hdmi * +@@ -249,6 +257,7 @@ struct vc4_hdmi_connector_state { + unsigned long long tmds_char_rate; + unsigned int output_bpc; + enum vc4_hdmi_output_format output_format; ++ int broadcast_rgb; + }; + + static inline struct vc4_hdmi_connector_state * +@@ -256,6 +265,12 @@ conn_state_to_vc4_hdmi_conn_state(struct + { + return container_of(conn_state, struct vc4_hdmi_connector_state, base); + } ++ ++static inline const struct vc4_hdmi_connector_state * ++const_conn_state_to_vc4_hdmi_conn_state(const struct drm_connector_state *conn_state) ++{ ++ return container_of(conn_state, struct vc4_hdmi_connector_state, base); ++} + + void vc4_hdmi_phy_init(struct vc4_hdmi *vc4_hdmi, + struct vc4_hdmi_connector_state *vc4_conn_state); diff --git a/target/linux/bcm27xx/patches-6.1/950-0023-drm-vc4-Add-DRM-210101010-RGB-formats-for-hvs5.patch b/target/linux/bcm27xx/patches-6.1/950-0023-drm-vc4-Add-DRM-210101010-RGB-formats-for-hvs5.patch new file mode 100644 index 00000000000..3d66af6e886 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0023-drm-vc4-Add-DRM-210101010-RGB-formats-for-hvs5.patch @@ -0,0 +1,51 @@ +From 496704e90c065015a808fc31356c7aecc5bfeccd Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Mon, 31 Jan 2022 16:28:43 +0000 +Subject: [PATCH] drm/vc4: Add DRM 210101010 RGB formats for hvs5. + +HVS5 supports the 210101010 RGB[A|X] formats, but they were +missing from the DRM to HVS mapping list, so weren't available. +Add them in. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_plane.c | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -139,6 +139,34 @@ static const struct hvs_format { + .pixel_order = HVS_PIXEL_ORDER_XYCBCR, + .hvs5_only = true, + }, ++ { ++ .drm = DRM_FORMAT_XRGB2101010, ++ .hvs = HVS_PIXEL_FORMAT_RGBA1010102, ++ .pixel_order = HVS_PIXEL_ORDER_ABGR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ARGB, ++ .hvs5_only = true, ++ }, ++ { ++ .drm = DRM_FORMAT_ARGB2101010, ++ .hvs = HVS_PIXEL_FORMAT_RGBA1010102, ++ .pixel_order = HVS_PIXEL_ORDER_ABGR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ARGB, ++ .hvs5_only = true, ++ }, ++ { ++ .drm = DRM_FORMAT_ABGR2101010, ++ .hvs = HVS_PIXEL_FORMAT_RGBA1010102, ++ .pixel_order = HVS_PIXEL_ORDER_ARGB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ABGR, ++ .hvs5_only = true, ++ }, ++ { ++ .drm = DRM_FORMAT_XBGR2101010, ++ .hvs = HVS_PIXEL_FORMAT_RGBA1010102, ++ .pixel_order = HVS_PIXEL_ORDER_ARGB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ABGR, ++ .hvs5_only = true, ++ }, + }; + + static const struct hvs_format *vc4_get_hvs_format(u32 drm_format) diff --git a/target/linux/bcm27xx/patches-6.1/950-0024-drm-vc4-dpi-Support-DPI-interface-in-mode3-for-RGB56.patch b/target/linux/bcm27xx/patches-6.1/950-0024-drm-vc4-dpi-Support-DPI-interface-in-mode3-for-RGB56.patch new file mode 100644 index 00000000000..2142cf58ce9 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0024-drm-vc4-dpi-Support-DPI-interface-in-mode3-for-RGB56.patch @@ -0,0 +1,31 @@ +From 1c22021723d142524d744f6e2a6d81fc39b1b366 Mon Sep 17 00:00:00 2001 +From: Chris Morgan +Date: Fri, 28 Jan 2022 17:39:54 -0600 +Subject: [PATCH] drm/vc4: dpi: Support DPI interface in mode3 for + RGB565 + +Add support for the VC4 DPI driver to utilize DPI mode 3. This is +defined here as xxxRRRRRxxGGGGGGxxxBBBBB: +https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#parallel-display-interface-dpi + +This mode is required to use the Geekworm MZP280 DPI display. + +Signed-off-by: Chris Morgan +Reviewed-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_dpi.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_dpi.c ++++ b/drivers/gpu/drm/vc4/vc4_dpi.c +@@ -188,6 +188,10 @@ static void vc4_dpi_encoder_enable(struc + dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_1, + DPI_FORMAT); + break; ++ case MEDIA_BUS_FMT_RGB565_1X24_CPADHI: ++ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_2, ++ DPI_FORMAT); ++ break; + default: + DRM_ERROR("Unknown media bus format %d\n", + bus_format); diff --git a/target/linux/bcm27xx/patches-6.1/950-0025-drm-panel-Add-and-initialise-an-orientation-field-to.patch b/target/linux/bcm27xx/patches-6.1/950-0025-drm-panel-Add-and-initialise-an-orientation-field-to.patch new file mode 100644 index 00000000000..9cdbe6d7c80 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0025-drm-panel-Add-and-initialise-an-orientation-field-to.patch @@ -0,0 +1,89 @@ +From 49d74639d19ec3ae9810a1d6ae6c0ff725c75881 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Tue, 1 Feb 2022 12:20:20 +0000 +Subject: [PATCH] drm/panel: Add and initialise an orientation field to + drm_panel + +Current usage of drm_connector_set_panel_orientation is from a panel's +get_modes call. However if the panel orientation property doesn't +exist on the connector at this point, then drm_mode_object triggers +WARNs as the connector is already registered. + +Add an orientation variable to struct drm_panel and initialise it from +drm_panel_init. +panel_bridge_attach can then create the property before the connector +is registered. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/bridge/panel.c | 4 ++++ + drivers/gpu/drm/drm_panel.c | 15 ++++++++++----- + include/drm/drm_panel.h | 8 ++++++++ + 3 files changed, 22 insertions(+), 5 deletions(-) + +--- a/drivers/gpu/drm/bridge/panel.c ++++ b/drivers/gpu/drm/bridge/panel.c +@@ -81,6 +81,10 @@ static int panel_bridge_attach(struct dr + return ret; + } + ++ /* set up connector's "panel orientation" property */ ++ drm_connector_set_panel_orientation(&panel_bridge->connector, ++ panel_bridge->panel->orientation); ++ + drm_connector_attach_encoder(&panel_bridge->connector, + bridge->encoder); + +--- a/drivers/gpu/drm/drm_panel.c ++++ b/drivers/gpu/drm/drm_panel.c +@@ -61,6 +61,9 @@ void drm_panel_init(struct drm_panel *pa + panel->dev = dev; + panel->funcs = funcs; + panel->connector_type = connector_type; ++ ++ panel->orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN; ++ of_drm_get_panel_orientation(dev->of_node, &panel->orientation); + } + EXPORT_SYMBOL(drm_panel_init); + +@@ -289,16 +292,18 @@ int of_drm_get_panel_orientation(const s + if (ret < 0) + return ret; + +- if (rotation == 0) ++ if (rotation == 0) { + *orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL; +- else if (rotation == 90) ++ } else if (rotation == 90) { + *orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP; +- else if (rotation == 180) ++ } else if (rotation == 180) { + *orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP; +- else if (rotation == 270) ++ } else if (rotation == 270) { + *orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP; +- else ++ } else { ++ DRM_ERROR("%pOF: invalid orientation %d\n", np, ret); + return -EINVAL; ++ } + + return 0; + } +--- a/include/drm/drm_panel.h ++++ b/include/drm/drm_panel.h +@@ -183,6 +183,14 @@ struct drm_panel { + int connector_type; + + /** ++ * @orientation: ++ * ++ * Panel orientation at initialisation. This is used to initialise the ++ * drm_connector property for panel orientation. ++ */ ++ enum drm_panel_orientation orientation; ++ ++ /** + * @list: + * + * Panel entry in registry. diff --git a/target/linux/bcm27xx/patches-6.1/950-0026-drm-dsi-Document-the-meaning-and-spec-references-for.patch b/target/linux/bcm27xx/patches-6.1/950-0026-drm-dsi-Document-the-meaning-and-spec-references-for.patch new file mode 100644 index 00000000000..a26f56e03ed --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0026-drm-dsi-Document-the-meaning-and-spec-references-for.patch @@ -0,0 +1,76 @@ +From b99fa92c1ff228cf2d6c6ee02cdc2650fe7bfef1 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Fri, 17 Dec 2021 13:36:52 +0000 +Subject: [PATCH] drm/dsi: Document the meaning and spec references for + MIPI_DSI_MODE_* + +The MIPI_DSI_MODE_* flags have fairly terse descriptions and no reference +to the DSI specification as to their exact meaning. Usage has therefore +been rather fluid. + +Extend the descriptions and provide references to the part of the +MIPI DSI specification regarding what they mean. + +Signed-off-by: Dave Stevenson +--- + include/drm/drm_mipi_dsi.h | 38 ++++++++++++++++++++++++++------------ + 1 file changed, 26 insertions(+), 12 deletions(-) + +--- a/include/drm/drm_mipi_dsi.h ++++ b/include/drm/drm_mipi_dsi.h +@@ -113,29 +113,43 @@ struct mipi_dsi_host *of_find_mipi_dsi_h + + /* DSI mode flags */ + +-/* video mode */ ++/* Video mode display. ++ * Not set denotes a command mode display. ++ */ + #define MIPI_DSI_MODE_VIDEO BIT(0) +-/* video burst mode */ ++/* Video burst mode. ++ * Link frequency to be configured via platform configuration. ++ * This should always be set in conjunction with MIPI_DSI_MODE_VIDEO. ++ * (DSI spec V1.1 8.11.4) ++ */ + #define MIPI_DSI_MODE_VIDEO_BURST BIT(1) +-/* video pulse mode */ ++/* Video pulse mode. ++ * Not set denotes sync event mode. (DSI spec V1.1 8.11.2) ++ */ + #define MIPI_DSI_MODE_VIDEO_SYNC_PULSE BIT(2) +-/* enable auto vertical count mode */ ++/* Enable auto vertical count mode */ + #define MIPI_DSI_MODE_VIDEO_AUTO_VERT BIT(3) +-/* enable hsync-end packets in vsync-pulse and v-porch area */ ++/* Enable hsync-end packets in vsync-pulse and v-porch area */ + #define MIPI_DSI_MODE_VIDEO_HSE BIT(4) +-/* disable hfront-porch area */ ++/* Transmit NULL packets or LP mode during hfront-porch area. ++ * Not set denotes sending a blanking packet instead. (DSI spec V1.1 8.11.1) ++ */ + #define MIPI_DSI_MODE_VIDEO_NO_HFP BIT(5) +-/* disable hback-porch area */ ++/* Transmit NULL packets or LP mode during hback-porch area. ++ * Not set denotes sending a blanking packet instead. (DSI spec V1.1 8.11.1) ++ */ + #define MIPI_DSI_MODE_VIDEO_NO_HBP BIT(6) +-/* disable hsync-active area */ ++/* Transmit NULL packets or LP mode during hsync-active area. ++ * Not set denotes sending a blanking packet instead. (DSI spec V1.1 8.11.1) ++ */ + #define MIPI_DSI_MODE_VIDEO_NO_HSA BIT(7) +-/* flush display FIFO on vsync pulse */ ++/* Flush display FIFO on vsync pulse */ + #define MIPI_DSI_MODE_VSYNC_FLUSH BIT(8) +-/* disable EoT packets in HS mode */ ++/* Disable EoT packets in HS mode. (DSI spec V1.1 8.1) */ + #define MIPI_DSI_MODE_NO_EOT_PACKET BIT(9) +-/* device supports non-continuous clock behavior (DSI spec 5.6.1) */ ++/* Device supports non-continuous clock behavior (DSI spec V1.1 5.6.1) */ + #define MIPI_DSI_CLOCK_NON_CONTINUOUS BIT(10) +-/* transmit data in low power */ ++/* Transmit data in low power */ + #define MIPI_DSI_MODE_LPM BIT(11) + /* transmit data ending at the same time for all lanes within one hsync */ + #define MIPI_DSI_HS_PKT_END_ALIGNED BIT(12) diff --git a/target/linux/bcm27xx/patches-6.1/950-0027-drm-bridge-tc358762-Ignore-EPROBE_DEFER-when-logging.patch b/target/linux/bcm27xx/patches-6.1/950-0027-drm-bridge-tc358762-Ignore-EPROBE_DEFER-when-logging.patch new file mode 100644 index 00000000000..ce9bab645a2 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0027-drm-bridge-tc358762-Ignore-EPROBE_DEFER-when-logging.patch @@ -0,0 +1,25 @@ +From 135340b06a02d3a5ad0b214b3c0d59f6adb79dba Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 20 Jan 2022 17:29:36 +0000 +Subject: [PATCH] drm/bridge: tc358762: Ignore EPROBE_DEFER when + logging errors + +mipi_dsi_attach can fail due to resources not being available +yet, therefore do not log error messages should they occur. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/bridge/tc358762.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/bridge/tc358762.c ++++ b/drivers/gpu/drm/bridge/tc358762.c +@@ -235,7 +235,7 @@ static int tc358762_probe(struct mipi_ds + ret = mipi_dsi_attach(dsi); + if (ret < 0) { + drm_bridge_remove(&ctx->bridge); +- dev_err(dev, "failed to attach dsi\n"); ++ dev_err_probe(dev, ret, "failed to attach dsi\n"); + } + + return ret; diff --git a/target/linux/bcm27xx/patches-6.1/950-0028-drm-vc4-Rename-bridge-to-out_bridge.patch b/target/linux/bcm27xx/patches-6.1/950-0028-drm-vc4-Rename-bridge-to-out_bridge.patch new file mode 100644 index 00000000000..1ebf4efd51b --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0028-drm-vc4-Rename-bridge-to-out_bridge.patch @@ -0,0 +1,56 @@ +From ed34c4192a6189ef27ea4a1958ea843906afbe4d Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 30 Sep 2021 17:51:16 +0100 +Subject: [PATCH] drm/vc4: Rename bridge to out_bridge + +In preparation for converting the encoder to being a bridge, +rename the variable holding the next bridge in the chain to +out_bridge, so that our bridge can be called bridge. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -556,7 +556,7 @@ struct vc4_dsi { + + struct platform_device *pdev; + +- struct drm_bridge *bridge; ++ struct drm_bridge *out_bridge; + struct list_head bridge_chain; + + void __iomem *regs; +@@ -800,7 +800,7 @@ static void vc4_dsi_encoder_disable(stru + if (iter->funcs->disable) + iter->funcs->disable(iter); + +- if (iter == dsi->bridge) ++ if (iter == dsi->out_bridge) + break; + } + +@@ -1723,9 +1723,9 @@ static int vc4_dsi_bind(struct device *d + return ret; + } + +- dsi->bridge = drmm_of_get_bridge(drm, dev->of_node, 0, 0); +- if (IS_ERR(dsi->bridge)) +- return PTR_ERR(dsi->bridge); ++ dsi->out_bridge = drmm_of_get_bridge(drm, dev->of_node, 0, 0); ++ if (IS_ERR(dsi->out_bridge)) ++ return PTR_ERR(dsi->out_bridge); + + /* The esc clock rate is supposed to always be 100Mhz. */ + ret = clk_set_rate(dsi->escape_clock, 100 * 1000000); +@@ -1751,7 +1751,7 @@ static int vc4_dsi_bind(struct device *d + if (ret) + return ret; + +- ret = drm_bridge_attach(encoder, dsi->bridge, NULL, 0); ++ ret = drm_bridge_attach(encoder, dsi->out_bridge, NULL, 0); + if (ret) + return ret; + /* Disable the atomic helper calls into the bridge. We diff --git a/target/linux/bcm27xx/patches-6.1/950-0029-drm-vc4-Move-DSI-initialisation-to-encoder_mode_set.patch b/target/linux/bcm27xx/patches-6.1/950-0029-drm-vc4-Move-DSI-initialisation-to-encoder_mode_set.patch new file mode 100644 index 00000000000..9803df95d11 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0029-drm-vc4-Move-DSI-initialisation-to-encoder_mode_set.patch @@ -0,0 +1,64 @@ +From 5590c79c417064363236f24ffe40d87d6cfd128e Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Mon, 7 Feb 2022 17:14:51 +0000 +Subject: [PATCH] drm/vc4: Move DSI initialisation to encoder_mode_set. + +Breaking the bridge chain does not work for atomic bridges/panels +and generally causes issues. +We need to initialise the DSI host before the bridge pre_enables +are called, so move that to encoder_mode_set in the same way that +dw-mipi-dsi does. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 17 +++++++++++++---- + 1 file changed, 13 insertions(+), 4 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -867,18 +867,18 @@ static bool vc4_dsi_encoder_mode_fixup(s + return true; + } + +-static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) ++static void vc4_dsi_encoder_mode_set(struct drm_encoder *encoder, ++ struct drm_display_mode *mode, ++ struct drm_display_mode *adjusted_mode) + { +- struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; + struct vc4_dsi *dsi = to_vc4_dsi(encoder); + struct device *dev = &dsi->pdev->dev; + bool debug_dump_regs = false; +- struct drm_bridge *iter; + unsigned long hs_clock; + u32 ui_ns; + /* Minimum LP state duration in escape clock cycles. */ + u32 lpx = dsi_esc_timing(60); +- unsigned long pixel_clock_hz = mode->clock * 1000; ++ unsigned long pixel_clock_hz = adjusted_mode->clock * 1000; + unsigned long dsip_clock; + unsigned long phy_clock; + int ret; +@@ -1105,6 +1105,14 @@ static void vc4_dsi_encoder_enable(struc + ~DSI_PORT_BIT(PHY_AFEC0_RESET)); + + vc4_dsi_ulps(dsi, false); ++} ++ ++static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) ++{ ++ struct vc4_dsi_encoder *vc4_encoder = to_vc4_dsi_encoder(encoder); ++ struct vc4_dsi *dsi = vc4_encoder->dsi; ++ bool debug_dump_regs = false; ++ struct drm_bridge *iter; + + list_for_each_entry_reverse(iter, &dsi->bridge_chain, chain_node) { + if (iter->funcs->pre_enable) +@@ -1370,6 +1378,7 @@ static const struct drm_encoder_helper_f + .disable = vc4_dsi_encoder_disable, + .enable = vc4_dsi_encoder_enable, + .mode_fixup = vc4_dsi_encoder_mode_fixup, ++ .mode_set = vc4_dsi_encoder_mode_set, + }; + + static int vc4_dsi_late_register(struct drm_encoder *encoder) diff --git a/target/linux/bcm27xx/patches-6.1/950-0030-drm-vc4-Remove-splitting-the-bridge-chain-from-the-d.patch b/target/linux/bcm27xx/patches-6.1/950-0030-drm-vc4-Remove-splitting-the-bridge-chain-from-the-d.patch new file mode 100644 index 00000000000..7718e3be810 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0030-drm-vc4-Remove-splitting-the-bridge-chain-from-the-d.patch @@ -0,0 +1,118 @@ +From bd58cbe5c5155279ccd85c29ddef53094cf6dc81 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Wed, 15 Dec 2021 17:44:49 +0000 +Subject: [PATCH] drm/vc4: Remove splitting the bridge chain from the + driver. + +Splitting the bridge chain fails for atomic bridges as the +framework can't add the relevant state in +drm_atomic_add_encoder_bridges. +The chain was split because we needed to power up before +calling pre_enable, but that is now done in mode_set, and will +move into the framework. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 47 ----------------------------------- + 1 file changed, 47 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -557,7 +557,6 @@ struct vc4_dsi { + struct platform_device *pdev; + + struct drm_bridge *out_bridge; +- struct list_head bridge_chain; + + void __iomem *regs; + +@@ -794,23 +793,9 @@ static void vc4_dsi_encoder_disable(stru + { + struct vc4_dsi *dsi = to_vc4_dsi(encoder); + struct device *dev = &dsi->pdev->dev; +- struct drm_bridge *iter; +- +- list_for_each_entry_reverse(iter, &dsi->bridge_chain, chain_node) { +- if (iter->funcs->disable) +- iter->funcs->disable(iter); +- +- if (iter == dsi->out_bridge) +- break; +- } + + vc4_dsi_ulps(dsi, true); + +- list_for_each_entry_from(iter, &dsi->bridge_chain, chain_node) { +- if (iter->funcs->post_disable) +- iter->funcs->post_disable(iter); +- } +- + clk_disable_unprepare(dsi->pll_phy_clock); + clk_disable_unprepare(dsi->escape_clock); + clk_disable_unprepare(dsi->pixel_clock); +@@ -1112,12 +1097,6 @@ static void vc4_dsi_encoder_enable(struc + struct vc4_dsi_encoder *vc4_encoder = to_vc4_dsi_encoder(encoder); + struct vc4_dsi *dsi = vc4_encoder->dsi; + bool debug_dump_regs = false; +- struct drm_bridge *iter; +- +- list_for_each_entry_reverse(iter, &dsi->bridge_chain, chain_node) { +- if (iter->funcs->pre_enable) +- iter->funcs->pre_enable(iter); +- } + + if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { + DSI_PORT_WRITE(DISP0_CTRL, +@@ -1134,11 +1113,6 @@ static void vc4_dsi_encoder_enable(struc + DSI_DISP0_ENABLE); + } + +- list_for_each_entry(iter, &dsi->bridge_chain, chain_node) { +- if (iter->funcs->enable) +- iter->funcs->enable(iter); +- } +- + if (debug_dump_regs) { + struct drm_printer p = drm_info_printer(&dsi->pdev->dev); + dev_info(&dsi->pdev->dev, "DSI regs after:\n"); +@@ -1626,7 +1600,6 @@ static int vc4_dsi_bind(struct device *d + + dsi->variant = of_device_get_match_data(dev); + +- INIT_LIST_HEAD(&dsi->bridge_chain); + dsi->encoder.type = dsi->variant->port ? + VC4_ENCODER_TYPE_DSI1 : VC4_ENCODER_TYPE_DSI0; + +@@ -1763,32 +1736,12 @@ static int vc4_dsi_bind(struct device *d + ret = drm_bridge_attach(encoder, dsi->out_bridge, NULL, 0); + if (ret) + return ret; +- /* Disable the atomic helper calls into the bridge. We +- * manually call the bridge pre_enable / enable / etc. calls +- * from our driver, since we need to sequence them within the +- * encoder's enable/disable paths. +- */ +- list_splice_init(&encoder->bridge_chain, &dsi->bridge_chain); + + return 0; + } + +-static void vc4_dsi_unbind(struct device *dev, struct device *master, +- void *data) +-{ +- struct vc4_dsi *dsi = dev_get_drvdata(dev); +- struct drm_encoder *encoder = &dsi->encoder.base; +- +- /* +- * Restore the bridge_chain so the bridge detach procedure can happen +- * normally. +- */ +- list_splice_init(&dsi->bridge_chain, &encoder->bridge_chain); +-} +- + static const struct component_ops vc4_dsi_ops = { + .bind = vc4_dsi_bind, +- .unbind = vc4_dsi_unbind, + }; + + static int vc4_dsi_dev_probe(struct platform_device *pdev) diff --git a/target/linux/bcm27xx/patches-6.1/950-0031-drm-vc4-Convert-vc4_dsi-to-use-atomic-enable-disable.patch b/target/linux/bcm27xx/patches-6.1/950-0031-drm-vc4-Convert-vc4_dsi-to-use-atomic-enable-disable.patch new file mode 100644 index 00000000000..25549447487 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0031-drm-vc4-Convert-vc4_dsi-to-use-atomic-enable-disable.patch @@ -0,0 +1,84 @@ +From ab6f22f1747903266a88b73f628eb4f89474c84c Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Wed, 15 Dec 2021 17:47:14 +0000 +Subject: [PATCH] drm/vc4: Convert vc4_dsi to use atomic + enable/disable/mode_set. + +The atomic calls are preferred as the non-atomic ones +are deprecated. In preparation for conversion to a bridge, +switch to the atomic calls. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 23 +++++++++++++++-------- + 1 file changed, 15 insertions(+), 8 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -789,7 +789,8 @@ dsi_esc_timing(u32 ns) + return DIV_ROUND_UP(ns, ESC_TIME_NS); + } + +-static void vc4_dsi_encoder_disable(struct drm_encoder *encoder) ++static void vc4_dsi_encoder_disable(struct drm_encoder *encoder, ++ struct drm_atomic_state *state) + { + struct vc4_dsi *dsi = to_vc4_dsi(encoder); + struct device *dev = &dsi->pdev->dev; +@@ -853,17 +854,18 @@ static bool vc4_dsi_encoder_mode_fixup(s + } + + static void vc4_dsi_encoder_mode_set(struct drm_encoder *encoder, +- struct drm_display_mode *mode, +- struct drm_display_mode *adjusted_mode) ++ struct drm_crtc_state *crtc_state, ++ struct drm_connector_state *conn_state) + { + struct vc4_dsi *dsi = to_vc4_dsi(encoder); + struct device *dev = &dsi->pdev->dev; ++ const struct drm_display_mode *mode; + bool debug_dump_regs = false; + unsigned long hs_clock; + u32 ui_ns; + /* Minimum LP state duration in escape clock cycles. */ + u32 lpx = dsi_esc_timing(60); +- unsigned long pixel_clock_hz = adjusted_mode->clock * 1000; ++ unsigned long pixel_clock_hz; + unsigned long dsip_clock; + unsigned long phy_clock; + int ret; +@@ -880,6 +882,10 @@ static void vc4_dsi_encoder_mode_set(str + drm_print_regset32(&p, &dsi->regset); + } + ++ mode = &crtc_state->adjusted_mode; ++ ++ pixel_clock_hz = mode->clock * 1000; ++ + /* Round up the clk_set_rate() request slightly, since + * PLLD_DSI1 is an integer divider and its rate selection will + * never round up. +@@ -1092,7 +1098,8 @@ static void vc4_dsi_encoder_mode_set(str + vc4_dsi_ulps(dsi, false); + } + +-static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) ++static void vc4_dsi_encoder_enable(struct drm_encoder *encoder, ++ struct drm_atomic_state *state) + { + struct vc4_dsi_encoder *vc4_encoder = to_vc4_dsi_encoder(encoder); + struct vc4_dsi *dsi = vc4_encoder->dsi; +@@ -1349,10 +1356,10 @@ static const struct mipi_dsi_host_ops vc + }; + + static const struct drm_encoder_helper_funcs vc4_dsi_encoder_helper_funcs = { +- .disable = vc4_dsi_encoder_disable, +- .enable = vc4_dsi_encoder_enable, ++ .atomic_disable = vc4_dsi_encoder_disable, ++ .atomic_enable = vc4_dsi_encoder_enable, + .mode_fixup = vc4_dsi_encoder_mode_fixup, +- .mode_set = vc4_dsi_encoder_mode_set, ++ .atomic_mode_set = vc4_dsi_encoder_mode_set, + }; + + static int vc4_dsi_late_register(struct drm_encoder *encoder) diff --git a/target/linux/bcm27xx/patches-6.1/950-0032-drm-vc4-Convert-vc4_dsi-to-using-a-bridge-instead-of.patch b/target/linux/bcm27xx/patches-6.1/950-0032-drm-vc4-Convert-vc4_dsi-to-using-a-bridge-instead-of.patch new file mode 100644 index 00000000000..480a600e632 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0032-drm-vc4-Convert-vc4_dsi-to-using-a-bridge-instead-of.patch @@ -0,0 +1,266 @@ +From c0611a36761fb6abf5a806bbfe417db1f4464a56 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Wed, 15 Dec 2021 17:57:45 +0000 +Subject: [PATCH] drm/vc4: Convert vc4_dsi to using a bridge instead of + encoder. + +Remove the encoder functions, and create a bridge attached to +this dumb encoder which implements the same functionality. + +As a bridge has state which an encoder doesn't, we need to +add the state management functions as well. + +As there is no bridge atomic_mode_set, move the initialisation +code that was in mode_set into _pre_enable. +The code to actually enable and disable sending video are split +from the general control into _enable and _disable. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 122 +++++++++++++++++++++++++--------- + 1 file changed, 90 insertions(+), 32 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -557,6 +557,7 @@ struct vc4_dsi { + struct platform_device *pdev; + + struct drm_bridge *out_bridge; ++ struct drm_bridge bridge; + + void __iomem *regs; + +@@ -608,6 +609,12 @@ to_vc4_dsi(struct drm_encoder *encoder) + return container_of(encoder, struct vc4_dsi, encoder.base); + } + ++static inline struct vc4_dsi * ++bridge_to_vc4_dsi(struct drm_bridge *bridge) ++{ ++ return container_of(bridge, struct vc4_dsi, bridge); ++} ++ + static inline void + dsi_dma_workaround_write(struct vc4_dsi *dsi, u32 offset, u32 val) + { +@@ -789,10 +796,21 @@ dsi_esc_timing(u32 ns) + return DIV_ROUND_UP(ns, ESC_TIME_NS); + } + +-static void vc4_dsi_encoder_disable(struct drm_encoder *encoder, +- struct drm_atomic_state *state) ++static void vc4_dsi_bridge_disable(struct drm_bridge *bridge, ++ struct drm_bridge_state *state) + { +- struct vc4_dsi *dsi = to_vc4_dsi(encoder); ++ struct vc4_dsi *dsi = bridge_to_vc4_dsi(bridge); ++ u32 disp0_ctrl; ++ ++ disp0_ctrl = DSI_PORT_READ(DISP0_CTRL); ++ disp0_ctrl &= ~DSI_DISP0_ENABLE; ++ DSI_PORT_WRITE(DISP0_CTRL, disp0_ctrl); ++} ++ ++static void vc4_dsi_bridge_post_disable(struct drm_bridge *bridge, ++ struct drm_bridge_state *state) ++{ ++ struct vc4_dsi *dsi = bridge_to_vc4_dsi(bridge); + struct device *dev = &dsi->pdev->dev; + + vc4_dsi_ulps(dsi, true); +@@ -817,11 +835,11 @@ static void vc4_dsi_encoder_disable(stru + * higher-than-expected clock rate to the panel, but that's what the + * firmware does too. + */ +-static bool vc4_dsi_encoder_mode_fixup(struct drm_encoder *encoder, +- const struct drm_display_mode *mode, +- struct drm_display_mode *adjusted_mode) ++static bool vc4_dsi_bridge_mode_fixup(struct drm_bridge *bridge, ++ const struct drm_display_mode *mode, ++ struct drm_display_mode *adjusted_mode) + { +- struct vc4_dsi *dsi = to_vc4_dsi(encoder); ++ struct vc4_dsi *dsi = bridge_to_vc4_dsi(bridge); + struct clk *phy_parent = clk_get_parent(dsi->pll_phy_clock); + unsigned long parent_rate = clk_get_rate(phy_parent); + unsigned long pixel_clock_hz = mode->clock * 1000; +@@ -853,15 +871,18 @@ static bool vc4_dsi_encoder_mode_fixup(s + return true; + } + +-static void vc4_dsi_encoder_mode_set(struct drm_encoder *encoder, +- struct drm_crtc_state *crtc_state, +- struct drm_connector_state *conn_state) ++static void vc4_dsi_bridge_pre_enable(struct drm_bridge *bridge, ++ struct drm_bridge_state *old_state) + { +- struct vc4_dsi *dsi = to_vc4_dsi(encoder); ++ struct drm_atomic_state *state = old_state->base.state; ++ struct vc4_dsi *dsi = bridge_to_vc4_dsi(bridge); ++ const struct drm_crtc_state *crtc_state; + struct device *dev = &dsi->pdev->dev; + const struct drm_display_mode *mode; ++ struct drm_connector *connector; + bool debug_dump_regs = false; + unsigned long hs_clock; ++ struct drm_crtc *crtc; + u32 ui_ns; + /* Minimum LP state duration in escape clock cycles. */ + u32 lpx = dsi_esc_timing(60); +@@ -882,6 +903,14 @@ static void vc4_dsi_encoder_mode_set(str + drm_print_regset32(&p, &dsi->regset); + } + ++ /* ++ * Retrieve the CRTC adjusted mode. This requires a little dance to go ++ * from the bridge to the encoder, to the connector and to the CRTC. ++ */ ++ connector = drm_atomic_get_new_connector_for_encoder(state, ++ bridge->encoder); ++ crtc = drm_atomic_get_new_connector_state(state, connector)->crtc; ++ crtc_state = drm_atomic_get_new_crtc_state(state, crtc); + mode = &crtc_state->adjusted_mode; + + pixel_clock_hz = mode->clock * 1000; +@@ -1096,14 +1125,6 @@ static void vc4_dsi_encoder_mode_set(str + ~DSI_PORT_BIT(PHY_AFEC0_RESET)); + + vc4_dsi_ulps(dsi, false); +-} +- +-static void vc4_dsi_encoder_enable(struct drm_encoder *encoder, +- struct drm_atomic_state *state) +-{ +- struct vc4_dsi_encoder *vc4_encoder = to_vc4_dsi_encoder(encoder); +- struct vc4_dsi *dsi = vc4_encoder->dsi; +- bool debug_dump_regs = false; + + if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { + DSI_PORT_WRITE(DISP0_CTRL, +@@ -1112,13 +1133,23 @@ static void vc4_dsi_encoder_enable(struc + VC4_SET_FIELD(dsi->format, DSI_DISP0_PFORMAT) | + VC4_SET_FIELD(DSI_DISP0_LP_STOP_PERFRAME, + DSI_DISP0_LP_STOP_CTRL) | +- DSI_DISP0_ST_END | +- DSI_DISP0_ENABLE); ++ DSI_DISP0_ST_END); + } else { + DSI_PORT_WRITE(DISP0_CTRL, +- DSI_DISP0_COMMAND_MODE | +- DSI_DISP0_ENABLE); ++ DSI_DISP0_COMMAND_MODE); + } ++} ++ ++static void vc4_dsi_bridge_enable(struct drm_bridge *bridge, ++ struct drm_bridge_state *old_state) ++{ ++ struct vc4_dsi *dsi = bridge_to_vc4_dsi(bridge); ++ bool debug_dump_regs = false; ++ u32 disp0_ctrl; ++ ++ disp0_ctrl = DSI_PORT_READ(DISP0_CTRL); ++ disp0_ctrl |= DSI_DISP0_ENABLE; ++ DSI_PORT_WRITE(DISP0_CTRL, disp0_ctrl); + + if (debug_dump_regs) { + struct drm_printer p = drm_info_printer(&dsi->pdev->dev); +@@ -1127,6 +1158,16 @@ static void vc4_dsi_encoder_enable(struc + } + } + ++static int vc4_dsi_bridge_attach(struct drm_bridge *bridge, ++ enum drm_bridge_attach_flags flags) ++{ ++ struct vc4_dsi *dsi = bridge_to_vc4_dsi(bridge); ++ ++ /* Attach the panel or bridge to the dsi bridge */ ++ return drm_bridge_attach(bridge->encoder, dsi->out_bridge, ++ &dsi->bridge, flags); ++} ++ + static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, + const struct mipi_dsi_msg *msg) + { +@@ -1303,6 +1344,7 @@ static int vc4_dsi_host_attach(struct mi + struct mipi_dsi_device *device) + { + struct vc4_dsi *dsi = host_to_dsi(host); ++ int ret; + + dsi->lanes = device->lanes; + dsi->channel = device->channel; +@@ -1337,7 +1379,15 @@ static int vc4_dsi_host_attach(struct mi + return 0; + } + +- return component_add(&dsi->pdev->dev, &vc4_dsi_ops); ++ drm_bridge_add(&dsi->bridge); ++ ++ ret = component_add(&dsi->pdev->dev, &vc4_dsi_ops); ++ if (ret) { ++ drm_bridge_remove(&dsi->bridge); ++ return ret; ++ } ++ ++ return 0; + } + + static int vc4_dsi_host_detach(struct mipi_dsi_host *host, +@@ -1346,6 +1396,7 @@ static int vc4_dsi_host_detach(struct mi + struct vc4_dsi *dsi = host_to_dsi(host); + + component_del(&dsi->pdev->dev, &vc4_dsi_ops); ++ drm_bridge_remove(&dsi->bridge); + return 0; + } + +@@ -1355,11 +1406,16 @@ static const struct mipi_dsi_host_ops vc + .transfer = vc4_dsi_host_transfer, + }; + +-static const struct drm_encoder_helper_funcs vc4_dsi_encoder_helper_funcs = { +- .atomic_disable = vc4_dsi_encoder_disable, +- .atomic_enable = vc4_dsi_encoder_enable, +- .mode_fixup = vc4_dsi_encoder_mode_fixup, +- .atomic_mode_set = vc4_dsi_encoder_mode_set, ++static const struct drm_bridge_funcs vc4_dsi_bridge_funcs = { ++ .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, ++ .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, ++ .atomic_reset = drm_atomic_helper_bridge_reset, ++ .atomic_pre_enable = vc4_dsi_bridge_pre_enable, ++ .atomic_enable = vc4_dsi_bridge_enable, ++ .atomic_disable = vc4_dsi_bridge_disable, ++ .atomic_post_disable = vc4_dsi_bridge_post_disable, ++ .attach = vc4_dsi_bridge_attach, ++ .mode_fixup = vc4_dsi_bridge_mode_fixup, + }; + + static int vc4_dsi_late_register(struct drm_encoder *encoder) +@@ -1734,13 +1790,11 @@ static int vc4_dsi_bind(struct device *d + if (ret) + return ret; + +- drm_encoder_helper_add(encoder, &vc4_dsi_encoder_helper_funcs); +- + ret = devm_pm_runtime_enable(dev); + if (ret) + return ret; + +- ret = drm_bridge_attach(encoder, dsi->out_bridge, NULL, 0); ++ ret = drm_bridge_attach(encoder, &dsi->bridge, NULL, 0); + if (ret) + return ret; + +@@ -1762,7 +1816,11 @@ static int vc4_dsi_dev_probe(struct plat + dev_set_drvdata(dev, dsi); + + kref_init(&dsi->kref); ++ + dsi->pdev = pdev; ++ dsi->bridge.funcs = &vc4_dsi_bridge_funcs; ++ dsi->bridge.of_node = dev->of_node; ++ dsi->bridge.type = DRM_MODE_CONNECTOR_DSI; + dsi->dsi_host.ops = &vc4_dsi_host_ops; + dsi->dsi_host.dev = dev; + mipi_dsi_host_register(&dsi->dsi_host); diff --git a/target/linux/bcm27xx/patches-6.1/950-0033-drm-vc4-Remove-entry-to-ULPS-from-vc4_dsi-post_disab.patch b/target/linux/bcm27xx/patches-6.1/950-0033-drm-vc4-Remove-entry-to-ULPS-from-vc4_dsi-post_disab.patch new file mode 100644 index 00000000000..e9aefd181bd --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0033-drm-vc4-Remove-entry-to-ULPS-from-vc4_dsi-post_disab.patch @@ -0,0 +1,32 @@ +From b0b5ae1ea6701cf9395f3132d559a5379a4fb73e Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Fri, 11 Feb 2022 14:15:26 +0000 +Subject: [PATCH] drm/vc4: Remove entry to ULPS from vc4_dsi + post_disable + +Post_disable was sending the D-PHY sequence to put any device +into ULPS suspend mode, and then cutting power to the DSI block. +The power-on reset state of the DSI block is for DSI to be in +an operational state, not ULPS, so it then never sent the sequence +for exiting ULPS. Any attached device that didn't have an external +reset therefore remained in ULPS / standby, and didn't function. + +Use of ULPS isn't well specified in DRM, therefore remove entering +it to avoid the above situation. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 2 -- + 1 file changed, 2 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -813,8 +813,6 @@ static void vc4_dsi_bridge_post_disable( + struct vc4_dsi *dsi = bridge_to_vc4_dsi(bridge); + struct device *dev = &dsi->pdev->dev; + +- vc4_dsi_ulps(dsi, true); +- + clk_disable_unprepare(dsi->pll_phy_clock); + clk_disable_unprepare(dsi->escape_clock); + clk_disable_unprepare(dsi->pixel_clock); diff --git a/target/linux/bcm27xx/patches-6.1/950-0034-drm-bridge-Introduce-pre_enable_upstream_first-to-al.patch b/target/linux/bcm27xx/patches-6.1/950-0034-drm-bridge-Introduce-pre_enable_upstream_first-to-al.patch new file mode 100644 index 00000000000..bab4ed9b907 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0034-drm-bridge-Introduce-pre_enable_upstream_first-to-al.patch @@ -0,0 +1,308 @@ +From 5365030a003a6cb0c336202256341e4bc9d65d52 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 16 Dec 2021 15:25:35 +0000 +Subject: [PATCH] drm/bridge: Introduce pre_enable_upstream_first to + alter bridge init order + +DSI sink devices typically want the DSI host powered up and configured +before they are powered up. pre_enable is the place this would normally +happen, but they are called in reverse order from panel/connector towards +the encoder, which is the "wrong" order. + +Add a new flag pre_enable_upstream_first that any bridge can set +to swap the order of pre_enable (and post_disable) for that and the +immediately upstream bridge. +Should the immediately upstream bridge also set the +pre_enable_upstream_first flag, the bridge upstream of that will be called +before either of those which requested pre_enable_upstream_first. + +eg: +- Panel +- Bridge 1 +- Bridge 2 pre_enable_upstream_first +- Bridge 3 +- Bridge 4 pre_enable_upstream_first +- Bridge 5 pre_enable_upstream_first +- Bridge 6 +- Encoder +Would result in pre_enable's being called as Panel, Bridge 1, Bridge 3, +Bridge 2, Bridge 6, Bridge 5, Bridge 4, Encoder. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/drm_bridge.c | 177 +++++++++++++++++++++++++---------- + include/drm/drm_bridge.h | 8 ++ + 2 files changed, 137 insertions(+), 48 deletions(-) + +--- a/drivers/gpu/drm/drm_bridge.c ++++ b/drivers/gpu/drm/drm_bridge.c +@@ -547,20 +547,15 @@ EXPORT_SYMBOL(drm_bridge_chain_disable); + * encoder chain, starting from the first bridge to the last. These are called + * after completing the encoder's prepare op. + * ++ * If a bridge sets @pre_enable_upstream_first, then the @post_disable for that ++ * bridge will be called before the previous one to reverse the @pre_enable ++ * calling direction. ++ * + * Note: the bridge passed should be the one closest to the encoder + */ + void drm_bridge_chain_post_disable(struct drm_bridge *bridge) + { +- struct drm_encoder *encoder; +- +- if (!bridge) +- return; +- +- encoder = bridge->encoder; +- list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { +- if (bridge->funcs->post_disable) +- bridge->funcs->post_disable(bridge); +- } ++ drm_atomic_bridge_chain_post_disable(bridge, NULL); + } + EXPORT_SYMBOL(drm_bridge_chain_post_disable); + +@@ -602,24 +597,14 @@ EXPORT_SYMBOL(drm_bridge_chain_mode_set) + * chain, starting from the last bridge to the first. These are called + * before calling the encoder's commit op. + * ++ * If a bridge sets @pre_enable_upstream_first, then the @pre_enable for the ++ * previous bridge will be called before @pre_enable of this bridge. ++ * + * Note: the bridge passed should be the one closest to the encoder + */ + void drm_bridge_chain_pre_enable(struct drm_bridge *bridge) + { +- struct drm_encoder *encoder; +- struct drm_bridge *iter; +- +- if (!bridge) +- return; +- +- encoder = bridge->encoder; +- list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { +- if (iter->funcs->pre_enable) +- iter->funcs->pre_enable(iter); +- +- if (iter == bridge) +- break; +- } ++ drm_atomic_bridge_chain_pre_enable(bridge, NULL); + } + EXPORT_SYMBOL(drm_bridge_chain_pre_enable); + +@@ -691,6 +676,25 @@ void drm_atomic_bridge_chain_disable(str + } + EXPORT_SYMBOL(drm_atomic_bridge_chain_disable); + ++static void drm_atomic_bridge_call_post_disable(struct drm_bridge *bridge, ++ struct drm_atomic_state *old_state) ++{ ++ if (old_state && bridge->funcs->atomic_post_disable) { ++ struct drm_bridge_state *old_bridge_state; ++ ++ old_bridge_state = ++ drm_atomic_get_old_bridge_state(old_state, ++ bridge); ++ if (WARN_ON(!old_bridge_state)) ++ return; ++ ++ bridge->funcs->atomic_post_disable(bridge, ++ old_bridge_state); ++ } else if (bridge->funcs->post_disable) { ++ bridge->funcs->post_disable(bridge); ++ } ++} ++ + /** + * drm_atomic_bridge_chain_post_disable - cleans up after disabling all bridges + * in the encoder chain +@@ -701,6 +705,9 @@ EXPORT_SYMBOL(drm_atomic_bridge_chain_di + * &drm_bridge_funcs.post_disable) op for all the bridges in the encoder chain, + * starting from the first bridge to the last. These are called after completing + * &drm_encoder_helper_funcs.atomic_disable ++ * If a bridge sets @pre_enable_upstream_first, then the @post_disable for that ++ * bridge will be called before the previous one to reverse the @pre_enable ++ * calling direction. + * + * Note: the bridge passed should be the one closest to the encoder + */ +@@ -708,30 +715,75 @@ void drm_atomic_bridge_chain_post_disabl + struct drm_atomic_state *old_state) + { + struct drm_encoder *encoder; ++ struct drm_bridge *next, *limit; + + if (!bridge) + return; + + encoder = bridge->encoder; ++ + list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { +- if (bridge->funcs->atomic_post_disable) { +- struct drm_bridge_state *old_bridge_state; ++ limit = NULL; + +- old_bridge_state = +- drm_atomic_get_old_bridge_state(old_state, +- bridge); +- if (WARN_ON(!old_bridge_state)) +- return; ++ if (!list_is_last(&bridge->chain_node, &encoder->bridge_chain)) { ++ next = list_next_entry(bridge, chain_node); + +- bridge->funcs->atomic_post_disable(bridge, +- old_bridge_state); +- } else if (bridge->funcs->post_disable) { +- bridge->funcs->post_disable(bridge); ++ if (next->pre_enable_upstream_first) { ++ /* Downstream bridge had requested that upstream ++ * was enabled first, so disabled last ++ */ ++ limit = next; ++ ++ /* Find the next bridge that has NOT requested ++ * upstream to be enabled first / disabled last ++ */ ++ list_for_each_entry_from(next, &encoder->bridge_chain, ++ chain_node) { ++ if (next->pre_enable_upstream_first) { ++ next = list_prev_entry(next, chain_node); ++ limit = next; ++ break; ++ } ++ } ++ ++ /* Call these bridges in reverse order */ ++ list_for_each_entry_from_reverse(next, &encoder->bridge_chain, ++ chain_node) { ++ if (next == bridge) ++ break; ++ ++ drm_atomic_bridge_call_post_disable(next, ++ old_state); ++ } ++ } + } ++ ++ drm_atomic_bridge_call_post_disable(bridge, old_state); ++ ++ if (limit) ++ bridge = limit; + } + } + EXPORT_SYMBOL(drm_atomic_bridge_chain_post_disable); + ++static void drm_atomic_bridge_call_pre_enable(struct drm_bridge *bridge, ++ struct drm_atomic_state *old_state) ++{ ++ if (old_state && bridge->funcs->atomic_pre_enable) { ++ struct drm_bridge_state *old_bridge_state; ++ ++ old_bridge_state = ++ drm_atomic_get_old_bridge_state(old_state, ++ bridge); ++ if (WARN_ON(!old_bridge_state)) ++ return; ++ ++ bridge->funcs->atomic_pre_enable(bridge, old_bridge_state); ++ } else if (bridge->funcs->pre_enable) { ++ bridge->funcs->pre_enable(bridge); ++ } ++} ++ + /** + * drm_atomic_bridge_chain_pre_enable - prepares for enabling all bridges in + * the encoder chain +@@ -743,33 +795,62 @@ EXPORT_SYMBOL(drm_atomic_bridge_chain_po + * starting from the last bridge to the first. These are called before calling + * &drm_encoder_helper_funcs.atomic_enable + * ++ * If a bridge sets @pre_enable_upstream_first, then the pre_enable for the ++ * upstream bridge will be called before pre_enable of this bridge. ++ * + * Note: the bridge passed should be the one closest to the encoder + */ + void drm_atomic_bridge_chain_pre_enable(struct drm_bridge *bridge, + struct drm_atomic_state *old_state) + { + struct drm_encoder *encoder; +- struct drm_bridge *iter; ++ struct drm_bridge *iter, *next, *limit; + + if (!bridge) + return; + + encoder = bridge->encoder; +- list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { +- if (iter->funcs->atomic_pre_enable) { +- struct drm_bridge_state *old_bridge_state; + +- old_bridge_state = +- drm_atomic_get_old_bridge_state(old_state, +- iter); +- if (WARN_ON(!old_bridge_state)) +- return; ++ list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { ++ if (iter->pre_enable_upstream_first) { ++ next = iter; ++ limit = bridge; ++ list_for_each_entry_from_reverse(next, ++ &encoder->bridge_chain, ++ chain_node) { ++ if (next == bridge) ++ break; ++ ++ if (!next->pre_enable_upstream_first) { ++ /* Found first bridge that does NOT ++ * request upstream to be enabled first ++ */ ++ limit = list_prev_entry(next, chain_node); ++ break; ++ } ++ } ++ ++ list_for_each_entry_from(next, &encoder->bridge_chain, chain_node) { ++ /* Call requested upstream bridge pre_enable ++ * in order. ++ */ ++ if (next == iter) ++ /* At the first bridgge to request upstream ++ * bridges called first. ++ */ ++ break; + +- iter->funcs->atomic_pre_enable(iter, old_bridge_state); +- } else if (iter->funcs->pre_enable) { +- iter->funcs->pre_enable(iter); ++ drm_atomic_bridge_call_pre_enable(next, old_state); ++ } + } + ++ drm_atomic_bridge_call_pre_enable(iter, old_state); ++ ++ if (iter->pre_enable_upstream_first) ++ /* Jump all bridges that we have already pre_enabled ++ */ ++ iter = limit; ++ + if (iter == bridge) + break; + } +--- a/include/drm/drm_bridge.h ++++ b/include/drm/drm_bridge.h +@@ -769,6 +769,14 @@ struct drm_bridge { + */ + bool interlace_allowed; + /** ++ * @pre_enable_upstream_first: The bridge requires that the upstream ++ * bridge @pre_enable function is called before its @pre_enable, ++ * and conversely for post_disable. This is most frequently a ++ * requirement for DSI devices which need the host to be initialised ++ * before the peripheral. ++ */ ++ bool pre_enable_upstream_first; ++ /** + * @ddc: Associated I2C adapter for DDC access, if any. + */ + struct i2c_adapter *ddc; diff --git a/target/linux/bcm27xx/patches-6.1/950-0035-drm-panel-Add-prepare_upstream_first-flag-to-drm_pan.patch b/target/linux/bcm27xx/patches-6.1/950-0035-drm-panel-Add-prepare_upstream_first-flag-to-drm_pan.patch new file mode 100644 index 00000000000..6ca65ab3f3c --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0035-drm-panel-Add-prepare_upstream_first-flag-to-drm_pan.patch @@ -0,0 +1,48 @@ +From 9ac3eedd8cda7d5f2429edc0bdba137c35e07157 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Wed, 23 Feb 2022 15:36:56 +0000 +Subject: [PATCH] drm/panel: Add prepare_upstream_first flag to + drm_panel + +Mapping to the drm_bridge flag pre_enable_upstream_first, +add a new flag prepare_upstream_first to drm_panel to allow +the panel driver to request that the upstream bridge should +be pre_enabled before the panel prepare. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/bridge/panel.c | 3 +++ + include/drm/drm_panel.h | 10 ++++++++++ + 2 files changed, 13 insertions(+) + +--- a/drivers/gpu/drm/bridge/panel.c ++++ b/drivers/gpu/drm/bridge/panel.c +@@ -258,6 +258,9 @@ struct drm_bridge *drm_panel_bridge_add_ + panel_bridge->bridge.ops = DRM_BRIDGE_OP_MODES; + panel_bridge->bridge.type = connector_type; + ++ panel_bridge->bridge.pre_enable_upstream_first = ++ panel->prepare_upstream_first; ++ + drm_bridge_add(&panel_bridge->bridge); + + return &panel_bridge->bridge; +--- a/include/drm/drm_panel.h ++++ b/include/drm/drm_panel.h +@@ -196,6 +196,16 @@ struct drm_panel { + * Panel entry in registry. + */ + struct list_head list; ++ ++ /** ++ * @prepare_upstream_first: ++ * ++ * The upstream controller should be prepared first, before the prepare ++ * for the panel is called. This is largely required for DSI panels ++ * where the DSI host controller should be initialised to LP-11 before ++ * the panel is powered up. ++ */ ++ bool prepare_upstream_first; + }; + + void drm_panel_init(struct drm_panel *panel, struct device *dev, diff --git a/target/linux/bcm27xx/patches-6.1/950-0036-drm-Include-drm_connector.h-from-drm_panel.h.patch b/target/linux/bcm27xx/patches-6.1/950-0036-drm-Include-drm_connector.h-from-drm_panel.h.patch new file mode 100644 index 00000000000..75a4a30cafb --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0036-drm-Include-drm_connector.h-from-drm_panel.h.patch @@ -0,0 +1,36 @@ +From 16e9466e562335961f89ec25bd60bff4cf82f7ad Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Fri, 11 Mar 2022 17:24:37 +0000 +Subject: [PATCH] drm: Include drm_connector.h from drm_panel.h + +drm_panel.h wants to reference enum drm_panel_orientation which is defined +in drm_connector.h (despite the name). +Include drm_connector.h in drm_panel.h to avoid the rare situation where +drm_panel.h is used with drm_connector.h + +https://github.com/raspberrypi/linux/issues/4919 + +Signed-off-by: Dave Stevenson +--- + include/drm/drm_panel.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/include/drm/drm_panel.h ++++ b/include/drm/drm_panel.h +@@ -24,6 +24,7 @@ + #ifndef __DRM_PANEL_H__ + #define __DRM_PANEL_H__ + ++#include + #include + #include + #include +@@ -36,8 +37,6 @@ struct drm_device; + struct drm_panel; + struct display_timing; + +-enum drm_panel_orientation; +- + /** + * struct drm_panel_funcs - perform operations on a given panel + * diff --git a/target/linux/bcm27xx/patches-6.1/950-0037-drm-tc358762-Set-the-pre_enable_upstream_first-flag-.patch b/target/linux/bcm27xx/patches-6.1/950-0037-drm-tc358762-Set-the-pre_enable_upstream_first-flag-.patch new file mode 100644 index 00000000000..2cf35236bda --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0037-drm-tc358762-Set-the-pre_enable_upstream_first-flag-.patch @@ -0,0 +1,25 @@ +From 2551dd11f3c6f1633f7aa9ec2c68b1c9831b3559 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 16 Dec 2021 15:33:43 +0000 +Subject: [PATCH] drm/tc358762: Set the pre_enable_upstream_first flag + to configure DSI host + +TC358762 wants the DSI host to be prepared before it is powered up, so +set the flag to request that the upstream bridges have their +pre_enable called first. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/bridge/tc358762.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/gpu/drm/bridge/tc358762.c ++++ b/drivers/gpu/drm/bridge/tc358762.c +@@ -229,6 +229,7 @@ static int tc358762_probe(struct mipi_ds + ctx->bridge.funcs = &tc358762_bridge_funcs; + ctx->bridge.type = DRM_MODE_CONNECTOR_DPI; + ctx->bridge.of_node = dev->of_node; ++ ctx->bridge.pre_enable_upstream_first = true; + + drm_bridge_add(&ctx->bridge); + diff --git a/target/linux/bcm27xx/patches-6.1/950-0038-drm-vc4-Support-zpos-on-all-planes.patch b/target/linux/bcm27xx/patches-6.1/950-0038-drm-vc4-Support-zpos-on-all-planes.patch new file mode 100644 index 00000000000..068862766f6 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0038-drm-vc4-Support-zpos-on-all-planes.patch @@ -0,0 +1,144 @@ +From 7354aa4ed8b97b3bd7706e6440a087491a47fb39 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Tue, 25 Jan 2022 17:28:18 +0000 +Subject: [PATCH] drm/vc4: Support zpos on all planes + +Adds the zpos property to all planes, and creates the dlist +by placing the fragments in the correct order based on zpos. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_hvs.c | 43 +++++++++++++++++++++------------ + drivers/gpu/drm/vc4/vc4_kms.c | 3 +-- + drivers/gpu/drm/vc4/vc4_plane.c | 22 ++++++++++++++--- + 3 files changed, 48 insertions(+), 20 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -769,6 +769,8 @@ void vc4_hvs_atomic_flush(struct drm_crt + bool enable_bg_fill = false; + u32 __iomem *dlist_start = vc4->hvs->dlist + vc4_state->mm.start; + u32 __iomem *dlist_next = dlist_start; ++ unsigned int zpos = 0; ++ bool found = false; + int idx; + + if (!drm_dev_enter(dev, &idx)) { +@@ -782,23 +784,34 @@ void vc4_hvs_atomic_flush(struct drm_crt + } + + /* Copy all the active planes' dlist contents to the hardware dlist. */ +- drm_atomic_crtc_for_each_plane(plane, crtc) { +- /* Is this the first active plane? */ +- if (dlist_next == dlist_start) { +- /* We need to enable background fill when a plane +- * could be alpha blending from the background, i.e. +- * where no other plane is underneath. It suffices to +- * consider the first active plane here since we set +- * needs_bg_fill such that either the first plane +- * already needs it or all planes on top blend from +- * the first or a lower plane. +- */ +- vc4_plane_state = to_vc4_plane_state(plane->state); +- enable_bg_fill = vc4_plane_state->needs_bg_fill; ++ do { ++ found = false; ++ ++ drm_atomic_crtc_for_each_plane(plane, crtc) { ++ if (plane->state->normalized_zpos != zpos) ++ continue; ++ ++ /* Is this the first active plane? */ ++ if (dlist_next == dlist_start) { ++ /* We need to enable background fill when a plane ++ * could be alpha blending from the background, i.e. ++ * where no other plane is underneath. It suffices to ++ * consider the first active plane here since we set ++ * needs_bg_fill such that either the first plane ++ * already needs it or all planes on top blend from ++ * the first or a lower plane. ++ */ ++ vc4_plane_state = to_vc4_plane_state(plane->state); ++ enable_bg_fill = vc4_plane_state->needs_bg_fill; ++ } ++ ++ dlist_next += vc4_plane_write_dlist(plane, dlist_next); ++ ++ found = true; + } + +- dlist_next += vc4_plane_write_dlist(plane, dlist_next); +- } ++ zpos++; ++ } while (found); + + writel(SCALER_CTL0_END, dlist_next); + dlist_next++; +--- a/drivers/gpu/drm/vc4/vc4_kms.c ++++ b/drivers/gpu/drm/vc4/vc4_kms.c +@@ -1066,8 +1066,7 @@ int vc4_kms_load(struct drm_device *dev) + dev->mode_config.helper_private = &vc4_mode_config_helpers; + dev->mode_config.preferred_depth = 24; + dev->mode_config.async_page_flip = true; +- if (vc4->firmware_kms) +- dev->mode_config.normalize_zpos = true; ++ dev->mode_config.normalize_zpos = true; + + ret = vc4_ctm_obj_init(vc4); + if (ret) +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -1600,9 +1600,14 @@ struct drm_plane *vc4_plane_init(struct + DRM_COLOR_YCBCR_BT709, + DRM_COLOR_YCBCR_LIMITED_RANGE); + ++ if (type == DRM_PLANE_TYPE_PRIMARY) ++ drm_plane_create_zpos_immutable_property(plane, 0); ++ + return plane; + } + ++#define VC4_NUM_OVERLAY_PLANES 16 ++ + int vc4_plane_create_additional_planes(struct drm_device *drm) + { + struct drm_plane *cursor_plane; +@@ -1618,24 +1623,35 @@ int vc4_plane_create_additional_planes(s + * modest number of planes to expose, that should hopefully + * still cover any sane usecase. + */ +- for (i = 0; i < 16; i++) { ++ for (i = 0; i < VC4_NUM_OVERLAY_PLANES; i++) { + struct drm_plane *plane = + vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY, + GENMASK(drm->mode_config.num_crtc - 1, 0)); + + if (IS_ERR(plane)) + continue; ++ ++ /* Create zpos property. Max of all the overlays + 1 primary + ++ * 1 cursor plane on a crtc. ++ */ ++ drm_plane_create_zpos_property(plane, i + 1, 1, ++ VC4_NUM_OVERLAY_PLANES + 1); + } + + drm_for_each_crtc(crtc, drm) { + /* Set up the legacy cursor after overlay initialization, +- * since we overlay planes on the CRTC in the order they were +- * initialized. ++ * since the zpos fallback is that planes are rendered by plane ++ * ID order, and that then puts the cursor on top. + */ + cursor_plane = vc4_plane_init(drm, DRM_PLANE_TYPE_CURSOR, + drm_crtc_mask(crtc)); + if (!IS_ERR(cursor_plane)) { + crtc->cursor = cursor_plane; ++ ++ drm_plane_create_zpos_property(cursor_plane, ++ VC4_NUM_OVERLAY_PLANES + 1, ++ 1, ++ VC4_NUM_OVERLAY_PLANES + 1); + } + } + diff --git a/target/linux/bcm27xx/patches-6.1/950-0039-drm-vc4-hdmi-Add-CSC-for-BT601-709-2020-limited-and-.patch b/target/linux/bcm27xx/patches-6.1/950-0039-drm-vc4-hdmi-Add-CSC-for-BT601-709-2020-limited-and-.patch new file mode 100644 index 00000000000..b1fa4825e58 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0039-drm-vc4-hdmi-Add-CSC-for-BT601-709-2020-limited-and-.patch @@ -0,0 +1,301 @@ +From 6729f3d6ace95770cfda201fd04fafcc2e46fd36 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Mon, 7 Mar 2022 15:19:38 +0000 +Subject: [PATCH] drm/vc4: hdmi: Add CSC for BT601/709/2020 limited and + full range output + +The HVS always composes in the RGB domain, but there is a colourspace +conversion block on the output to allow for sending YCbCr over the +HDMI interface. +The colourspace on that link is configurable via the "Colorspace" +property on the connector, and that updates the infoframes. There +is also selection of limited or full range based on the mode selected +or an override. + +Add code to update the CSC as well so that the metadata matches the +image data. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 196 ++++++++++++++++++++++++--------- + 1 file changed, 145 insertions(+), 51 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -158,8 +158,8 @@ static bool vc4_hdmi_mode_needs_scrambli + return clock > HDMI_14_MAX_TMDS_CLK; + } + +-static bool vc4_hdmi_is_full_range_rgb(struct vc4_hdmi *vc4_hdmi, +- const struct drm_display_mode *mode) ++static bool vc4_hdmi_is_full_range(struct vc4_hdmi *vc4_hdmi, ++ const struct drm_display_mode *mode) + { + struct drm_display_info *display = &vc4_hdmi->connector.display_info; + +@@ -901,7 +901,7 @@ static void vc4_hdmi_set_avi_infoframe(s + + drm_hdmi_avi_infoframe_quant_range(&frame.avi, + connector, mode, +- vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode) ? ++ vc4_hdmi_is_full_range(vc4_hdmi, mode) ? + HDMI_QUANTIZATION_RANGE_FULL : + HDMI_QUANTIZATION_RANGE_LIMITED); + drm_hdmi_avi_infoframe_colorimetry(&frame.avi, cstate); +@@ -1154,7 +1154,7 @@ static void vc4_hdmi_csc_setup(struct vc + csc_ctl = VC4_SET_FIELD(VC4_HD_CSC_CTL_ORDER_BGR, + VC4_HD_CSC_CTL_ORDER); + +- if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) { ++ if (!vc4_hdmi_is_full_range(vc4_hdmi, mode)) { + /* CEA VICs other than #1 requre limited range RGB + * output unless overridden by an AVI infoframe. + * Apply a colorspace conversion to squash 0-255 down +@@ -1193,15 +1193,6 @@ static void vc4_hdmi_csc_setup(struct vc + * [ 0 1 0 0] + * [ 0 0 1 0] + * +- * Matrix is signed 2p13 fixed point, with signed 9p6 offsets +- */ +-static const u16 vc5_hdmi_csc_full_rgb_unity[3][4] = { +- { 0x2000, 0x0000, 0x0000, 0x0000 }, +- { 0x0000, 0x2000, 0x0000, 0x0000 }, +- { 0x0000, 0x0000, 0x2000, 0x0000 }, +-}; +- +-/* + * CEA VICs other than #1 require limited range RGB output unless + * overridden by an AVI infoframe. Apply a colorspace conversion to + * squash 0-255 down to 16-235. The matrix here is: +@@ -1212,43 +1203,105 @@ static const u16 vc5_hdmi_csc_full_rgb_u + * + * Matrix is signed 2p13 fixed point, with signed 9p6 offsets + */ +-static const u16 vc5_hdmi_csc_full_rgb_to_limited_rgb[3][4] = { +- { 0x1b80, 0x0000, 0x0000, 0x0400 }, +- { 0x0000, 0x1b80, 0x0000, 0x0400 }, +- { 0x0000, 0x0000, 0x1b80, 0x0400 }, ++static const u16 vc5_hdmi_csc_full_rgb_to_rgb[2][3][4] = { ++ { ++ /* Full range - unity */ ++ { 0x2000, 0x0000, 0x0000, 0x0000 }, ++ { 0x0000, 0x2000, 0x0000, 0x0000 }, ++ { 0x0000, 0x0000, 0x2000, 0x0000 }, ++ }, { ++ /* Limited range */ ++ { 0x1b80, 0x0000, 0x0000, 0x0400 }, ++ { 0x0000, 0x1b80, 0x0000, 0x0400 }, ++ { 0x0000, 0x0000, 0x1b80, 0x0400 }, ++ } ++}; ++ ++/* ++ * Conversion between Full Range RGB and YUV using the BT.601 Colorspace ++ * ++ * Full range ++ * [ 0.299000 0.587000 0.114000 0.000000 ] ++ * [ -0.168736 -0.331264 0.500000 128.000000 ] ++ * [ 0.500000 -0.418688 -0.081312 128.000000 ] ++ * ++ * Limited range ++ * [ 0.255785 0.502160 0.097523 16.000000 ] ++ * [ -0.147644 -0.289856 0.437500 128.000000 ] ++ * [ 0.437500 -0.366352 -0.071148 128.000000 ] ++ * ++ * Matrix is signed 2p13 fixed point, with signed 9p6 offsets ++ */ ++static const u16 vc5_hdmi_csc_full_rgb_to_yuv_bt601[2][3][4] = { ++ { ++ /* Full range */ ++ { 0x0991, 0x12c9, 0x03a6, 0x0000 }, ++ { 0xfa9b, 0xf567, 0x1000, 0x2000 }, ++ { 0x1000, 0xf29b, 0xfd67, 0x2000 }, ++ }, { ++ /* Limited range */ ++ { 0x082f, 0x1012, 0x031f, 0x0400 }, ++ { 0xfb48, 0xf6ba, 0x0e00, 0x2000 }, ++ { 0x0e00, 0xf448, 0xfdba, 0x2000 }, ++ } + }; + + /* +- * Conversion between Full Range RGB and Full Range YUV422 using the +- * BT.709 Colorspace ++ * Conversion between Full Range RGB and YUV using the BT.709 Colorspace + * ++ * Full range ++ * [ 0.212600 0.715200 0.072200 0.000000 ] ++ * [ -0.114572 -0.385428 0.500000 128.000000 ] ++ * [ 0.500000 -0.454153 -0.045847 128.000000 ] + * +- * [ 0.181906 0.611804 0.061758 16 ] +- * [ -0.100268 -0.337232 0.437500 128 ] +- * [ 0.437500 -0.397386 -0.040114 128 ] ++ * Limited range ++ * [ 0.181873 0.611831 0.061765 16.000000 ] ++ * [ -0.100251 -0.337249 0.437500 128.000000 ] ++ * [ 0.437500 -0.397384 -0.040116 128.000000 ] + * + * Matrix is signed 2p13 fixed point, with signed 9p6 offsets + */ +-static const u16 vc5_hdmi_csc_full_rgb_to_limited_yuv422_bt709[3][4] = { +- { 0x05d2, 0x1394, 0x01fa, 0x0400 }, +- { 0xfccc, 0xf536, 0x0e00, 0x2000 }, +- { 0x0e00, 0xf34a, 0xfeb8, 0x2000 }, ++static const u16 vc5_hdmi_csc_full_rgb_to_yuv_bt709[2][3][4] = { ++ { ++ /* Full range */ ++ { 0x06ce, 0x16e3, 0x024f, 0x0000 }, ++ { 0xfc56, 0xf3ac, 0x1000, 0x2000 }, ++ { 0x1000, 0xf179, 0xfe89, 0x2000 }, ++ }, { ++ /* Limited range */ ++ { 0x05d2, 0x1394, 0x01fa, 0x0400 }, ++ { 0xfccc, 0xf536, 0x0e00, 0x2000 }, ++ { 0x0e00, 0xf34a, 0xfeb8, 0x2000 }, ++ } + }; + + /* +- * Conversion between Full Range RGB and Full Range YUV444 using the +- * BT.709 Colorspace ++ * Conversion between Full Range RGB and YUV using the BT.2020 Colorspace + * +- * [ -0.100268 -0.337232 0.437500 128 ] +- * [ 0.437500 -0.397386 -0.040114 128 ] +- * [ 0.181906 0.611804 0.061758 16 ] ++ * Full range ++ * [ 0.262700 0.678000 0.059300 0.000000 ] ++ * [ -0.139630 -0.360370 0.500000 128.000000 ] ++ * [ 0.500000 -0.459786 -0.040214 128.000000 ] ++ * ++ * Limited range ++ * [ 0.224732 0.580008 0.050729 16.000000 ] ++ * [ -0.122176 -0.315324 0.437500 128.000000 ] ++ * [ 0.437500 -0.402312 -0.035188 128.000000 ] + * + * Matrix is signed 2p13 fixed point, with signed 9p6 offsets + */ +-static const u16 vc5_hdmi_csc_full_rgb_to_limited_yuv444_bt709[3][4] = { +- { 0xfccc, 0xf536, 0x0e00, 0x2000 }, +- { 0x0e00, 0xf34a, 0xfeb8, 0x2000 }, +- { 0x05d2, 0x1394, 0x01fa, 0x0400 }, ++static const u16 vc5_hdmi_csc_full_rgb_to_yuv_bt2020[2][3][4] = { ++ { ++ /* Full range */ ++ { 0x0868, 0x15b2, 0x01e6, 0x0000 }, ++ { 0xfb89, 0xf479, 0x1000, 0x2000 }, ++ { 0x1000, 0xf14a, 0xfeb8, 0x2000 }, ++ }, { ++ /* Limited range */ ++ { 0x0731, 0x128f, 0x01a0, 0x0400 }, ++ { 0xfc18, 0xf5ea, 0x0e00, 0x2000 }, ++ { 0x0e00, 0xf321, 0xfee1, 0x2000 }, ++ } + }; + + static void vc5_hdmi_set_csc_coeffs(struct vc4_hdmi *vc4_hdmi, +@@ -1264,6 +1317,20 @@ static void vc5_hdmi_set_csc_coeffs(stru + HDMI_WRITE(HDMI_CSC_34_33, (coeffs[2][3] << 16) | coeffs[2][2]); + } + ++static void vc5_hdmi_set_csc_coeffs_swap(struct vc4_hdmi *vc4_hdmi, ++ const u16 coeffs[3][4]) ++{ ++ lockdep_assert_held(&vc4_hdmi->hw_lock); ++ ++ /* YUV444 needs the CSC matrices using the channels in a different order */ ++ HDMI_WRITE(HDMI_CSC_12_11, (coeffs[2][1] << 16) | coeffs[2][0]); ++ HDMI_WRITE(HDMI_CSC_14_13, (coeffs[2][3] << 16) | coeffs[2][2]); ++ HDMI_WRITE(HDMI_CSC_22_21, (coeffs[0][1] << 16) | coeffs[0][0]); ++ HDMI_WRITE(HDMI_CSC_24_23, (coeffs[0][3] << 16) | coeffs[0][2]); ++ HDMI_WRITE(HDMI_CSC_32_31, (coeffs[1][1] << 16) | coeffs[1][0]); ++ HDMI_WRITE(HDMI_CSC_34_33, (coeffs[1][3] << 16) | coeffs[1][2]); ++} ++ + static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, + struct drm_connector_state *state, + const struct drm_display_mode *mode) +@@ -1271,6 +1338,8 @@ static void vc5_hdmi_csc_setup(struct vc + struct drm_device *drm = vc4_hdmi->connector.dev; + struct vc4_hdmi_connector_state *vc4_state = + conn_state_to_vc4_hdmi_conn_state(state); ++ unsigned int lim_range = vc4_hdmi_is_full_range(vc4_hdmi, mode) ? 0 : 1; ++ const u16 (*csc)[4]; + unsigned long flags; + u32 if_cfg = 0; + u32 if_xbar = 0x543210; +@@ -1286,31 +1355,56 @@ static void vc5_hdmi_csc_setup(struct vc + + switch (vc4_state->output_format) { + case VC4_HDMI_OUTPUT_YUV444: +- vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv444_bt709); +- break; +- + case VC4_HDMI_OUTPUT_YUV422: +- csc_ctl |= VC4_SET_FIELD(VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422_STANDARD, +- VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422) | +- VC5_MT_CP_CSC_CTL_USE_444_TO_422 | +- VC5_MT_CP_CSC_CTL_USE_RNG_SUPPRESSION; +- +- csc_chan_ctl |= VC4_SET_FIELD(VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP_LEGACY_STYLE, +- VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP); ++ switch (state->colorspace) { ++ default: ++ case DRM_MODE_COLORIMETRY_NO_DATA: ++ case DRM_MODE_COLORIMETRY_BT709_YCC: ++ case DRM_MODE_COLORIMETRY_XVYCC_709: ++ case DRM_MODE_COLORIMETRY_RGB_WIDE_FIXED: ++ case DRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT: ++ csc = vc5_hdmi_csc_full_rgb_to_yuv_bt709[lim_range]; ++ break; ++ case DRM_MODE_COLORIMETRY_SMPTE_170M_YCC: ++ case DRM_MODE_COLORIMETRY_XVYCC_601: ++ case DRM_MODE_COLORIMETRY_SYCC_601: ++ case DRM_MODE_COLORIMETRY_OPYCC_601: ++ case DRM_MODE_COLORIMETRY_BT601_YCC: ++ csc = vc5_hdmi_csc_full_rgb_to_yuv_bt601[lim_range]; ++ break; ++ case DRM_MODE_COLORIMETRY_BT2020_CYCC: ++ case DRM_MODE_COLORIMETRY_BT2020_YCC: ++ case DRM_MODE_COLORIMETRY_BT2020_RGB: ++ case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65: ++ case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER: ++ csc = vc5_hdmi_csc_full_rgb_to_yuv_bt2020[lim_range]; ++ break; ++ } + +- if_cfg |= VC4_SET_FIELD(VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422_FORMAT_422_LEGACY, +- VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422); ++ if (vc4_state->output_format == VC4_HDMI_OUTPUT_YUV422) { ++ csc_ctl |= VC4_SET_FIELD(VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422_STANDARD, ++ VC5_MT_CP_CSC_CTL_FILTER_MODE_444_TO_422) | ++ VC5_MT_CP_CSC_CTL_USE_444_TO_422 | ++ VC5_MT_CP_CSC_CTL_USE_RNG_SUPPRESSION; ++ ++ csc_chan_ctl |= VC4_SET_FIELD(VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP_LEGACY_STYLE, ++ VC5_MT_CP_CHANNEL_CTL_OUTPUT_REMAP); ++ ++ if_cfg |= VC4_SET_FIELD(VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422_FORMAT_422_LEGACY, ++ VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422); ++ ++ vc5_hdmi_set_csc_coeffs(vc4_hdmi, csc); ++ } else { ++ vc5_hdmi_set_csc_coeffs_swap(vc4_hdmi, csc); ++ } + +- vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv422_bt709); + break; + + case VC4_HDMI_OUTPUT_RGB: + if_xbar = 0x354021; + +- if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) +- vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_rgb); +- else +- vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_unity); ++ vc5_hdmi_set_csc_coeffs(vc4_hdmi, ++ vc5_hdmi_csc_full_rgb_to_rgb[lim_range]); + break; + + default: diff --git a/target/linux/bcm27xx/patches-6.1/950-0040-vc4-drm-vc4_plane-Keep-fractional-source-coords-insi.patch b/target/linux/bcm27xx/patches-6.1/950-0040-vc4-drm-vc4_plane-Keep-fractional-source-coords-insi.patch new file mode 100644 index 00000000000..0b4b2bc6cdf --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0040-vc4-drm-vc4_plane-Keep-fractional-source-coords-insi.patch @@ -0,0 +1,212 @@ +From dabc8fbdb2e159d27b5f02ac428fa5788c2c4c2a Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Mon, 14 Mar 2022 17:56:10 +0000 +Subject: [PATCH] vc4/drm: vc4_plane: Keep fractional source coords + inside state + +Signed-off-by: Dom Cobley +--- + drivers/gpu/drm/vc4/vc4_drv.h | 2 +- + drivers/gpu/drm/vc4/vc4_plane.c | 68 ++++++++++++++++----------------- + 2 files changed, 34 insertions(+), 36 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_drv.h ++++ b/drivers/gpu/drm/vc4/vc4_drv.h +@@ -384,7 +384,7 @@ struct vc4_plane_state { + + /* Clipped coordinates of the plane on the display. */ + int crtc_x, crtc_y, crtc_w, crtc_h; +- /* Clipped area being scanned from in the FB. */ ++ /* Clipped area being scanned from in the FB in u16.16 format */ + u32 src_x, src_y; + + u32 src_w[2], src_h[2]; +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -183,9 +183,9 @@ static const struct hvs_format *vc4_get_ + + static enum vc4_scaling_mode vc4_get_scaling_mode(u32 src, u32 dst) + { +- if (dst == src) ++ if (dst == src >> 16) + return VC4_SCALING_NONE; +- if (3 * dst >= 2 * src) ++ if (3 * dst >= 2 * (src >> 16)) + return VC4_SCALING_PPF; + else + return VC4_SCALING_TPZ; +@@ -394,15 +394,10 @@ static int vc4_plane_setup_clipping_and_ + vc4_state->offsets[i] = bo->dma_addr + fb->offsets[i]; + } + +- /* +- * We don't support subpixel source positioning for scaling, +- * but fractional coordinates can be generated by clipping +- * so just round for now +- */ +- vc4_state->src_x = DIV_ROUND_CLOSEST(state->src.x1, 1 << 16); +- vc4_state->src_y = DIV_ROUND_CLOSEST(state->src.y1, 1 << 16); +- vc4_state->src_w[0] = DIV_ROUND_CLOSEST(state->src.x2, 1 << 16) - vc4_state->src_x; +- vc4_state->src_h[0] = DIV_ROUND_CLOSEST(state->src.y2, 1 << 16) - vc4_state->src_y; ++ vc4_state->src_x = state->src.x1; ++ vc4_state->src_y = state->src.y1; ++ vc4_state->src_w[0] = state->src.x2 - vc4_state->src_x; ++ vc4_state->src_h[0] = state->src.y2 - vc4_state->src_y; + + vc4_state->crtc_x = state->dst.x1; + vc4_state->crtc_y = state->dst.y1; +@@ -455,7 +450,7 @@ static void vc4_write_tpz(struct vc4_pla + { + u32 scale, recip; + +- scale = (1 << 16) * src / dst; ++ scale = src / dst; + + /* The specs note that while the reciprocal would be defined + * as (1<<32)/scale, ~0 is close enough. +@@ -501,7 +496,7 @@ static u32 vc4_lbm_size(struct drm_plane + if (vc4_state->x_scaling[0] == VC4_SCALING_TPZ) + pix_per_line = vc4_state->crtc_w; + else +- pix_per_line = vc4_state->src_w[0]; ++ pix_per_line = vc4_state->src_w[0] >> 16; + + if (!vc4_state->is_yuv) { + if (vc4_state->y_scaling[0] == VC4_SCALING_TPZ) +@@ -592,7 +587,8 @@ static void vc4_plane_calc_load(struct d + for (i = 0; i < fb->format->num_planes; i++) { + /* Even if the bandwidth/plane required for a single frame is + * +- * vc4_state->src_w[i] * vc4_state->src_h[i] * cpp * vrefresh ++ * (vc4_state->src_w[i] >> 16) * (vc4_state->src_h[i] >> 16) * ++ * cpp * vrefresh + * + * when downscaling, we have to read more pixels per line in + * the time frame reserved for a single line, so the bandwidth +@@ -601,11 +597,11 @@ static void vc4_plane_calc_load(struct d + * load by this number. We're likely over-estimating the read + * demand, but that's better than under-estimating it. + */ +- vscale_factor = DIV_ROUND_UP(vc4_state->src_h[i], ++ vscale_factor = DIV_ROUND_UP(vc4_state->src_h[i] >> 16, + vc4_state->crtc_h); +- vc4_state->membus_load += vc4_state->src_w[i] * +- vc4_state->src_h[i] * vscale_factor * +- fb->format->cpp[i]; ++ vc4_state->membus_load += (vc4_state->src_w[i] >> 16) * ++ (vc4_state->src_h[i] >> 16) * ++ vscale_factor * fb->format->cpp[i]; + vc4_state->hvs_load += vc4_state->crtc_h * vc4_state->crtc_w; + } + +@@ -758,7 +754,8 @@ static int vc4_plane_mode_set(struct drm + bool mix_plane_alpha; + bool covers_screen; + u32 scl0, scl1, pitch0; +- u32 tiling, src_y; ++ u32 tiling, src_x, src_y; ++ u32 width, height; + u32 hvs_format = format->hvs; + unsigned int rotation; + int ret, i; +@@ -770,6 +767,9 @@ static int vc4_plane_mode_set(struct drm + if (ret) + return ret; + ++ width = vc4_state->src_w[0] >> 16; ++ height = vc4_state->src_h[0] >> 16; ++ + /* SCL1 is used for Cb/Cr scaling of planar formats. For RGB + * and 4:4:4, scl1 should be set to scl0 so both channels of + * the scaler do the same thing. For YUV, the Y plane needs +@@ -790,9 +790,11 @@ static int vc4_plane_mode_set(struct drm + DRM_MODE_REFLECT_Y); + + /* We must point to the last line when Y reflection is enabled. */ +- src_y = vc4_state->src_y; ++ src_y = vc4_state->src_y >> 16; + if (rotation & DRM_MODE_REFLECT_Y) +- src_y += vc4_state->src_h[0] - 1; ++ src_y += height - 1; ++ ++ src_x = vc4_state->src_x >> 16; + + switch (base_format_mod) { + case DRM_FORMAT_MOD_LINEAR: +@@ -807,7 +809,7 @@ static int vc4_plane_mode_set(struct drm + (i ? v_subsample : 1) * + fb->pitches[i]; + +- vc4_state->offsets[i] += vc4_state->src_x / ++ vc4_state->offsets[i] += src_x / + (i ? h_subsample : 1) * + fb->format->cpp[i]; + } +@@ -830,7 +832,7 @@ static int vc4_plane_mode_set(struct drm + * pitch * tile_h == tile_size * tiles_per_row + */ + u32 tiles_w = fb->pitches[0] >> (tile_size_shift - tile_h_shift); +- u32 tiles_l = vc4_state->src_x >> tile_w_shift; ++ u32 tiles_l = src_x >> tile_w_shift; + u32 tiles_r = tiles_w - tiles_l; + u32 tiles_t = src_y >> tile_h_shift; + /* Intra-tile offsets, which modify the base address (the +@@ -840,7 +842,7 @@ static int vc4_plane_mode_set(struct drm + u32 tile_y = (src_y >> 4) & 1; + u32 subtile_y = (src_y >> 2) & 3; + u32 utile_y = src_y & 3; +- u32 x_off = vc4_state->src_x & tile_w_mask; ++ u32 x_off = src_x & tile_w_mask; + u32 y_off = src_y & tile_h_mask; + + /* When Y reflection is requested we must set the +@@ -936,7 +938,7 @@ static int vc4_plane_mode_set(struct drm + * of the 12-pixels in that 128-bit word is the + * first pixel to be used + */ +- u32 remaining_pixels = vc4_state->src_x % 96; ++ u32 remaining_pixels = src_x % 96; + u32 aligned = remaining_pixels / 12; + u32 last_bits = remaining_pixels % 12; + +@@ -958,12 +960,12 @@ static int vc4_plane_mode_set(struct drm + return -EINVAL; + } + pix_per_tile = tile_w / fb->format->cpp[0]; +- x_off = (vc4_state->src_x % pix_per_tile) / ++ x_off = (src_x % pix_per_tile) / + (i ? h_subsample : 1) * + fb->format->cpp[i]; + } + +- tile = vc4_state->src_x / pix_per_tile; ++ tile = src_x / pix_per_tile; + + vc4_state->offsets[i] += param * tile_w * tile; + vc4_state->offsets[i] += src_y / +@@ -1024,10 +1026,8 @@ static int vc4_plane_mode_set(struct drm + vc4_dlist_write(vc4_state, + (mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) | + vc4_hvs4_get_alpha_blend_mode(state) | +- VC4_SET_FIELD(vc4_state->src_w[0], +- SCALER_POS2_WIDTH) | +- VC4_SET_FIELD(vc4_state->src_h[0], +- SCALER_POS2_HEIGHT)); ++ VC4_SET_FIELD(width, SCALER_POS2_WIDTH) | ++ VC4_SET_FIELD(height, SCALER_POS2_HEIGHT)); + + /* Position Word 3: Context. Written by the HVS. */ + vc4_dlist_write(vc4_state, 0xc0c0c0c0); +@@ -1085,10 +1085,8 @@ static int vc4_plane_mode_set(struct drm + /* Position Word 2: Source Image Size */ + vc4_state->pos2_offset = vc4_state->dlist_count; + vc4_dlist_write(vc4_state, +- VC4_SET_FIELD(vc4_state->src_w[0], +- SCALER5_POS2_WIDTH) | +- VC4_SET_FIELD(vc4_state->src_h[0], +- SCALER5_POS2_HEIGHT)); ++ VC4_SET_FIELD(width, SCALER5_POS2_WIDTH) | ++ VC4_SET_FIELD(height, SCALER5_POS2_HEIGHT)); + + /* Position Word 3: Context. Written by the HVS. */ + vc4_dlist_write(vc4_state, 0xc0c0c0c0); diff --git a/target/linux/bcm27xx/patches-6.1/950-0041-vc4-drm-Handle-fractional-coordinates-using-the-phas.patch b/target/linux/bcm27xx/patches-6.1/950-0041-vc4-drm-Handle-fractional-coordinates-using-the-phas.patch new file mode 100644 index 00000000000..087ec8ee2b9 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0041-vc4-drm-Handle-fractional-coordinates-using-the-phas.patch @@ -0,0 +1,105 @@ +From 1f344e8eb017093573ddccd939b2dc5d930569dc Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Fri, 9 Apr 2021 15:00:40 +0100 +Subject: [PATCH] vc4/drm: Handle fractional coordinates using the + phase field + +Signed-off-by: Dom Cobley +--- + drivers/gpu/drm/vc4/vc4_plane.c | 61 ++++++++++++++++++++++++++++++--- + 1 file changed, 56 insertions(+), 5 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -464,14 +464,47 @@ static void vc4_write_tpz(struct vc4_pla + VC4_SET_FIELD(recip, SCALER_TPZ1_RECIP)); + } + +-static void vc4_write_ppf(struct vc4_plane_state *vc4_state, u32 src, u32 dst) ++/* phase magnitude bits */ ++#define PHASE_BITS 6 ++ ++static void vc4_write_ppf(struct vc4_plane_state *vc4_state, u32 src, u32 dst, u32 xy, int channel) + { +- u32 scale = (1 << 16) * src / dst; ++ u32 scale = src / dst; ++ s32 offset, offset2; ++ s32 phase; ++ ++ /* Start the phase at 1/2 pixel from the 1st pixel at src_x. ++ 1/4 pixel for YUV. */ ++ if (channel) { ++ /* the phase is relative to scale_src->x, so shift it for display list's x value */ ++ offset = (xy & 0x1ffff) >> (16 - PHASE_BITS) >> 1; ++ offset += -(1 << PHASE_BITS >> 2); ++ } else { ++ /* the phase is relative to scale_src->x, so shift it for display list's x value */ ++ offset = (xy & 0xffff) >> (16 - PHASE_BITS); ++ offset += -(1 << PHASE_BITS >> 1); ++ ++ /* This is a kludge to make sure the scaling factors are consitent with YUV's luma scaling. ++ we lose 1bit precision because of this. */ ++ scale &= ~1; ++ } ++ ++ /* There may be a also small error introduced by precision of scale. ++ Add half of that as a compromise */ ++ offset2 = src - dst * scale; ++ offset2 >>= 16 - PHASE_BITS; ++ phase = offset + (offset2 >> 1); ++ ++ /* Ensure +ve values don't touch the sign bit, then truncate negative values */ ++ if (phase >= 1 << PHASE_BITS) ++ phase = (1 << PHASE_BITS) - 1; ++ ++ phase &= SCALER_PPF_IPHASE_MASK; + + vc4_dlist_write(vc4_state, + SCALER_PPF_AGC | + VC4_SET_FIELD(scale, SCALER_PPF_SCALE) | +- VC4_SET_FIELD(0, SCALER_PPF_IPHASE)); ++ VC4_SET_FIELD(phase, SCALER_PPF_IPHASE)); + } + + static u32 vc4_lbm_size(struct drm_plane_state *state) +@@ -530,13 +563,13 @@ static void vc4_write_scaling_parameters + /* Ch0 H-PPF Word 0: Scaling Parameters */ + if (vc4_state->x_scaling[channel] == VC4_SCALING_PPF) { + vc4_write_ppf(vc4_state, +- vc4_state->src_w[channel], vc4_state->crtc_w); ++ vc4_state->src_w[channel], vc4_state->crtc_w, vc4_state->src_x, channel); + } + + /* Ch0 V-PPF Words 0-1: Scaling Parameters, Context */ + if (vc4_state->y_scaling[channel] == VC4_SCALING_PPF) { + vc4_write_ppf(vc4_state, +- vc4_state->src_h[channel], vc4_state->crtc_h); ++ vc4_state->src_h[channel], vc4_state->crtc_h, vc4_state->src_y, channel); + vc4_dlist_write(vc4_state, 0xc0c0c0c0); + } + +@@ -984,6 +1017,24 @@ static int vc4_plane_mode_set(struct drm + return -EINVAL; + } + ++ /* fetch an extra pixel if we don't actually line up with the left edge. */ ++ if ((vc4_state->src_x & 0xffff) && vc4_state->src_x < (state->fb->width << 16)) ++ width++; ++ ++ /* same for the right side */ ++ if (((vc4_state->src_x + vc4_state->src_w[0]) & 0xffff) && ++ vc4_state->src_x + vc4_state->src_w[0] < (state->fb->width << 16)) ++ width++; ++ ++ /* now for the top */ ++ if ((vc4_state->src_y & 0xffff) && vc4_state->src_y < (state->fb->height << 16)) ++ height++; ++ ++ /* and the bottom */ ++ if (((vc4_state->src_y + vc4_state->src_h[0]) & 0xffff) && ++ vc4_state->src_y + vc4_state->src_h[0] < (state->fb->height << 16)) ++ height++; ++ + /* Don't waste cycles mixing with plane alpha if the set alpha + * is opaque or there is no per-pixel alpha information. + * In any case we use the alpha property value as the fixed alpha. diff --git a/target/linux/bcm27xx/patches-6.1/950-0042-drm-Add-chroma-siting-properties.patch b/target/linux/bcm27xx/patches-6.1/950-0042-drm-Add-chroma-siting-properties.patch new file mode 100644 index 00000000000..7ae221e8a90 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0042-drm-Add-chroma-siting-properties.patch @@ -0,0 +1,170 @@ +From ca82414470eea1d81f8fe4169ee19b89245989dc Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Wed, 26 Jan 2022 15:58:13 +0000 +Subject: [PATCH] drm: Add chroma siting properties + +Signed-off-by: Dom Cobley +--- + drivers/gpu/drm/drm_atomic_state_helper.c | 14 +++++++++ + drivers/gpu/drm/drm_atomic_uapi.c | 8 +++++ + drivers/gpu/drm/drm_color_mgmt.c | 36 +++++++++++++++++++++++ + include/drm/drm_color_mgmt.h | 3 ++ + include/drm/drm_plane.h | 36 +++++++++++++++++++++++ + 5 files changed, 97 insertions(+) + +--- a/drivers/gpu/drm/drm_atomic_state_helper.c ++++ b/drivers/gpu/drm/drm_atomic_state_helper.c +@@ -267,6 +267,20 @@ void __drm_atomic_helper_plane_state_res + plane_state->color_range = val; + } + ++ if (plane->chroma_siting_h_property) { ++ if (!drm_object_property_get_default_value(&plane->base, ++ plane->chroma_siting_h_property, ++ &val)) ++ plane_state->chroma_siting_h = val; ++ } ++ ++ if (plane->chroma_siting_v_property) { ++ if (!drm_object_property_get_default_value(&plane->base, ++ plane->chroma_siting_v_property, ++ &val)) ++ plane_state->chroma_siting_v = val; ++ } ++ + if (plane->zpos_property) { + if (!drm_object_property_get_default_value(&plane->base, + plane->zpos_property, +--- a/drivers/gpu/drm/drm_atomic_uapi.c ++++ b/drivers/gpu/drm/drm_atomic_uapi.c +@@ -562,6 +562,10 @@ static int drm_atomic_plane_set_property + state->color_encoding = val; + } else if (property == plane->color_range_property) { + state->color_range = val; ++ } else if (property == plane->chroma_siting_h_property) { ++ state->chroma_siting_h = val; ++ } else if (property == plane->chroma_siting_v_property) { ++ state->chroma_siting_v = val; + } else if (property == config->prop_fb_damage_clips) { + ret = drm_atomic_replace_property_blob_from_id(dev, + &state->fb_damage_clips, +@@ -628,6 +632,10 @@ drm_atomic_plane_get_property(struct drm + *val = state->color_encoding; + } else if (property == plane->color_range_property) { + *val = state->color_range; ++ } else if (property == plane->chroma_siting_h_property) { ++ *val = state->chroma_siting_h; ++ } else if (property == plane->chroma_siting_v_property) { ++ *val = state->chroma_siting_v; + } else if (property == config->prop_fb_damage_clips) { + *val = (state->fb_damage_clips) ? + state->fb_damage_clips->base.id : 0; +--- a/drivers/gpu/drm/drm_color_mgmt.c ++++ b/drivers/gpu/drm/drm_color_mgmt.c +@@ -591,6 +591,42 @@ int drm_plane_create_color_properties(st + EXPORT_SYMBOL(drm_plane_create_color_properties); + + /** ++ * drm_plane_create_chroma_siting_properties - chroma siting related plane properties ++ * @plane: plane object ++ * ++ * Create and attach plane specific CHROMA_SITING ++ * properties to @plane. ++ */ ++int drm_plane_create_chroma_siting_properties(struct drm_plane *plane, ++ int32_t default_chroma_siting_h, ++ int32_t default_chroma_siting_v) ++{ ++ struct drm_device *dev = plane->dev; ++ struct drm_property *prop; ++ ++ prop = drm_property_create_range(dev, 0, "CHROMA_SITING_H", ++ 0, 1<<16); ++ if (!prop) ++ return -ENOMEM; ++ plane->chroma_siting_h_property = prop; ++ drm_object_attach_property(&plane->base, prop, default_chroma_siting_h); ++ ++ prop = drm_property_create_range(dev, 0, "CHROMA_SITING_V", ++ 0, 1<<16); ++ if (!prop) ++ return -ENOMEM; ++ plane->chroma_siting_v_property = prop; ++ drm_object_attach_property(&plane->base, prop, default_chroma_siting_v); ++ ++ if (plane->state) { ++ plane->state->chroma_siting_h = default_chroma_siting_h; ++ plane->state->chroma_siting_v = default_chroma_siting_v; ++ } ++ return 0; ++} ++EXPORT_SYMBOL(drm_plane_create_chroma_siting_properties); ++ ++/** + * drm_color_lut_check - check validity of lookup table + * @lut: property blob containing LUT to check + * @tests: bitmask of tests to run +--- a/include/drm/drm_color_mgmt.h ++++ b/include/drm/drm_color_mgmt.h +@@ -93,6 +93,9 @@ int drm_plane_create_color_properties(st + enum drm_color_encoding default_encoding, + enum drm_color_range default_range); + ++int drm_plane_create_chroma_siting_properties(struct drm_plane *plane, ++ int32_t default_chroma_siting_h, int32_t default_chroma_siting_v); ++ + /** + * enum drm_color_lut_tests - hw-specific LUT tests to perform + * +--- a/include/drm/drm_plane.h ++++ b/include/drm/drm_plane.h +@@ -178,6 +178,24 @@ struct drm_plane_state { + enum drm_color_range color_range; + + /** ++ * @chroma_siting_h: ++ * ++ * Location of chroma samples horizontally compared to luma ++ * 0 means chroma is sited with left luma ++ * 0x8000 is interstitial. 0x10000 is sited with right luma ++ */ ++ int32_t chroma_siting_h; ++ ++ /** ++ * @chroma_siting_v: ++ * ++ * Location of chroma samples vertically compared to luma ++ * 0 means chroma is sited with top luma ++ * 0x8000 is interstitial. 0x10000 is sited with bottom luma ++ */ ++ int32_t chroma_siting_v; ++ ++ /** + * @fb_damage_clips: + * + * Blob representing damage (area in plane framebuffer that changed +@@ -748,6 +766,24 @@ struct drm_plane { + * scaling. + */ + struct drm_property *scaling_filter_property; ++ ++ /** ++ * @chroma_siting_h_property: ++ * ++ * Optional "CHROMA_SITING_H" property for specifying ++ * chroma siting for YUV formats. ++ * See drm_plane_create_chroma_siting_properties(). ++ */ ++ struct drm_property *chroma_siting_h_property; ++ ++ /** ++ * @chroma_siting_v_property: ++ * ++ * Optional "CHROMA_SITING_V" property for specifying ++ * chroma siting for YUV formats. ++ * See drm_plane_create_chroma_siting_properties(). ++ */ ++ struct drm_property *chroma_siting_v_property; + }; + + #define obj_to_plane(x) container_of(x, struct drm_plane, base) diff --git a/target/linux/bcm27xx/patches-6.1/950-0043-vc4-drm-plane-Make-use-of-chroma-siting-parameter.patch b/target/linux/bcm27xx/patches-6.1/950-0043-vc4-drm-plane-Make-use-of-chroma-siting-parameter.patch new file mode 100644 index 00000000000..b5ebb28bbfb --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0043-vc4-drm-plane-Make-use-of-chroma-siting-parameter.patch @@ -0,0 +1,60 @@ +From 2b8db0ad29be4c12f2a1c5a209e15e5e14efc047 Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Thu, 27 Jan 2022 15:32:04 +0000 +Subject: [PATCH] vc4/drm:plane: Make use of chroma siting parameter + +Signed-off-by: Dom Cobley +--- + drivers/gpu/drm/vc4/vc4_plane.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -467,17 +467,18 @@ static void vc4_write_tpz(struct vc4_pla + /* phase magnitude bits */ + #define PHASE_BITS 6 + +-static void vc4_write_ppf(struct vc4_plane_state *vc4_state, u32 src, u32 dst, u32 xy, int channel) ++static void vc4_write_ppf(struct vc4_plane_state *vc4_state, u32 src, u32 dst, u32 xy, int channel, int chroma_offset) + { + u32 scale = src / dst; + s32 offset, offset2; + s32 phase; + + /* Start the phase at 1/2 pixel from the 1st pixel at src_x. +- 1/4 pixel for YUV. */ ++ 1/4 pixel for YUV, plus the offset for chroma siting */ + if (channel) { + /* the phase is relative to scale_src->x, so shift it for display list's x value */ + offset = (xy & 0x1ffff) >> (16 - PHASE_BITS) >> 1; ++ offset -= chroma_offset >> (17 - PHASE_BITS); + offset += -(1 << PHASE_BITS >> 2); + } else { + /* the phase is relative to scale_src->x, so shift it for display list's x value */ +@@ -563,13 +564,15 @@ static void vc4_write_scaling_parameters + /* Ch0 H-PPF Word 0: Scaling Parameters */ + if (vc4_state->x_scaling[channel] == VC4_SCALING_PPF) { + vc4_write_ppf(vc4_state, +- vc4_state->src_w[channel], vc4_state->crtc_w, vc4_state->src_x, channel); ++ vc4_state->src_w[channel], vc4_state->crtc_w, vc4_state->src_x, channel, ++ state->chroma_siting_h); + } + + /* Ch0 V-PPF Words 0-1: Scaling Parameters, Context */ + if (vc4_state->y_scaling[channel] == VC4_SCALING_PPF) { + vc4_write_ppf(vc4_state, +- vc4_state->src_h[channel], vc4_state->crtc_h, vc4_state->src_y, channel); ++ vc4_state->src_h[channel], vc4_state->crtc_h, vc4_state->src_y, channel, ++ state->chroma_siting_v); + vc4_dlist_write(vc4_state, 0xc0c0c0c0); + } + +@@ -1649,6 +1652,8 @@ struct drm_plane *vc4_plane_init(struct + DRM_COLOR_YCBCR_BT709, + DRM_COLOR_YCBCR_LIMITED_RANGE); + ++ drm_plane_create_chroma_siting_properties(plane, 0, 0); ++ + if (type == DRM_PLANE_TYPE_PRIMARY) + drm_plane_create_zpos_immutable_property(plane, 0); + diff --git a/target/linux/bcm27xx/patches-6.1/950-0044-drm-vc4-Force-trigger-of-dlist-update-on-margins-cha.patch b/target/linux/bcm27xx/patches-6.1/950-0044-drm-vc4-Force-trigger-of-dlist-update-on-margins-cha.patch new file mode 100644 index 00000000000..0820d27ba76 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0044-drm-vc4-Force-trigger-of-dlist-update-on-margins-cha.patch @@ -0,0 +1,58 @@ +From b583024119e8ea35f7a6d2d8b143c0eb390afa70 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Fri, 1 Apr 2022 11:31:38 +0100 +Subject: [PATCH] drm/vc4: Force trigger of dlist update on margins + change + +When the margins are changed, the dlist needs to be regenerated +with the changed updated dest regions for each of the planes. + +Setting the zpos_changed flag is sufficient to trigger that +without doing a full modeset, therefore set it should the +margins be changed. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_crtc.c | 14 ++++++++++---- + drivers/gpu/drm/vc4/vc4_drv.h | 7 +------ + 2 files changed, 11 insertions(+), 10 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_crtc.c ++++ b/drivers/gpu/drm/vc4/vc4_crtc.c +@@ -757,10 +757,16 @@ static int vc4_crtc_atomic_check(struct + if (conn_state->crtc != crtc) + continue; + +- vc4_state->margins.left = conn_state->tv.margins.left; +- vc4_state->margins.right = conn_state->tv.margins.right; +- vc4_state->margins.top = conn_state->tv.margins.top; +- vc4_state->margins.bottom = conn_state->tv.margins.bottom; ++ if (memcmp(&vc4_state->margins, &conn_state->tv.margins, ++ sizeof(vc4_state->margins))) { ++ memcpy(&vc4_state->margins, &conn_state->tv.margins, ++ sizeof(vc4_state->margins)); ++ ++ /* Need to force the dlist entries for all planes to be ++ * updated so that the dest rectangles are changed. ++ */ ++ crtc_state->zpos_changed = true; ++ } + break; + } + +--- a/drivers/gpu/drm/vc4/vc4_drv.h ++++ b/drivers/gpu/drm/vc4/vc4_drv.h +@@ -581,12 +581,7 @@ struct vc4_crtc_state { + bool txp_armed; + unsigned int assigned_channel; + +- struct { +- unsigned int left; +- unsigned int right; +- unsigned int top; +- unsigned int bottom; +- } margins; ++ struct drm_connector_tv_margins margins; + + unsigned long hvs_load; + diff --git a/target/linux/bcm27xx/patches-6.1/950-0045-drm-atomic-helpers-remove-legacy_cursor_update-hacks.patch b/target/linux/bcm27xx/patches-6.1/950-0045-drm-atomic-helpers-remove-legacy_cursor_update-hacks.patch new file mode 100644 index 00000000000..520d6fa7ebc --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0045-drm-atomic-helpers-remove-legacy_cursor_update-hacks.patch @@ -0,0 +1,121 @@ +From 34b4470575bd300507847093497516f1adbc5020 Mon Sep 17 00:00:00 2001 +From: Daniel Vetter +Date: Fri, 23 Oct 2020 14:39:23 +0200 +Subject: [PATCH] drm/atomic-helpers: remove legacy_cursor_update hacks +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The stuff never really worked, and leads to lots of fun because it +out-of-order frees atomic states. Which upsets KASAN, among other +things. + +For async updates we now have a more solid solution with the +->atomic_async_check and ->atomic_async_commit hooks. Support for that +for msm and vc4 landed. nouveau and i915 have their own commit +routines, doing something similar. + +For everyone else it's probably better to remove the use-after-free +bug, and encourage folks to use the async support instead. The +affected drivers which register a legacy cursor plane and don't either +use the new async stuff or their own commit routine are: amdgpu, +atmel, mediatek, qxl, rockchip, sti, sun4i, tegra, virtio, and vmwgfx. + +Inspired by an amdgpu bug report. + +v2: Drop RFC, I think with amdgpu converted over to use +atomic_async_check/commit done in + +commit 674e78acae0dfb4beb56132e41cbae5b60f7d662 +Author: Nicholas Kazlauskas +Date: Wed Dec 5 14:59:07 2018 -0500 + + drm/amd/display: Add fast path for cursor plane updates + +we don't have any driver anymore where we have userspace expecting +solid legacy cursor support _and_ they are using the atomic helpers in +their fully glory. So we can retire this. + +v3: Paper over msm and i915 regression. The complete_all is the only +thing missing afaict. + +v4: Rebased on recent kernel, added extra link for vc4 bug. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=199425 +Link: https://lore.kernel.org/all/20220221134155.125447-9-maxime@cerno.tech/ +Cc: mikita.lipski@amd.com +Cc: Michel Dänzer +Cc: harry.wentland@amd.com +Cc: Rob Clark +Cc: "Kazlauskas, Nicholas" +Tested-by: Maxime Ripard +Signed-off-by: Daniel Vetter +Signed-off-by: Maxime Ripard +--- + drivers/gpu/drm/drm_atomic_helper.c | 13 ------------- + drivers/gpu/drm/i915/display/intel_display.c | 13 +++++++++++++ + drivers/gpu/drm/msm/msm_atomic.c | 2 ++ + 3 files changed, 15 insertions(+), 13 deletions(-) + +--- a/drivers/gpu/drm/drm_atomic_helper.c ++++ b/drivers/gpu/drm/drm_atomic_helper.c +@@ -1608,13 +1608,6 @@ drm_atomic_helper_wait_for_vblanks(struc + int i, ret; + unsigned int crtc_mask = 0; + +- /* +- * Legacy cursor ioctls are completely unsynced, and userspace +- * relies on that (by doing tons of cursor updates). +- */ +- if (old_state->legacy_cursor_update) +- return; +- + for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) { + if (!new_crtc_state->active) + continue; +@@ -2264,12 +2257,6 @@ int drm_atomic_helper_setup_commit(struc + complete_all(&commit->flip_done); + continue; + } +- +- /* Legacy cursor updates are fully unsynced. */ +- if (state->legacy_cursor_update) { +- complete_all(&commit->flip_done); +- continue; +- } + + if (!new_crtc_state->event) { + commit->event = kzalloc(sizeof(*commit->event), +--- a/drivers/gpu/drm/i915/display/intel_display.c ++++ b/drivers/gpu/drm/i915/display/intel_display.c +@@ -7766,6 +7766,19 @@ static int intel_atomic_commit(struct dr + state->base.legacy_cursor_update = false; + } + ++ /* ++ * FIXME: Cut over to (async) commit helpers instead of hand-rolling ++ * everything. ++ */ ++ if (state->base.legacy_cursor_update) { ++ struct intel_crtc_state *new_crtc_state; ++ struct intel_crtc *crtc; ++ int i; ++ ++ for_each_new_intel_crtc_in_state(state, crtc, new_crtc_state, i) ++ complete_all(&new_crtc_state->uapi.commit->flip_done); ++ } ++ + ret = intel_atomic_prepare_commit(state); + if (ret) { + drm_dbg_atomic(&dev_priv->drm, +--- a/drivers/gpu/drm/msm/msm_atomic.c ++++ b/drivers/gpu/drm/msm/msm_atomic.c +@@ -222,6 +222,8 @@ void msm_atomic_commit_tail(struct drm_a + /* async updates are limited to single-crtc updates: */ + WARN_ON(crtc_mask != drm_crtc_mask(async_crtc)); + ++ complete_all(&async_crtc->state->commit->flip_done); ++ + /* + * Start timer if we don't already have an update pending + * on this crtc: diff --git a/target/linux/bcm27xx/patches-6.1/950-0046-drm-vc4_hdmi-Force-a-modeset-when-Broadcast-RGB-sett.patch b/target/linux/bcm27xx/patches-6.1/950-0046-drm-vc4_hdmi-Force-a-modeset-when-Broadcast-RGB-sett.patch new file mode 100644 index 00000000000..42301da88f7 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0046-drm-vc4_hdmi-Force-a-modeset-when-Broadcast-RGB-sett.patch @@ -0,0 +1,33 @@ +From bf53b44573db760e243ef2fdf542bc3e991c97a6 Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Thu, 5 May 2022 18:50:04 +0100 +Subject: [PATCH] drm/vc4_hdmi: Force a modeset when Broadcast RGB + setting changes + +Without this the change is not visible until the next modeset + +Signed-off-by: Dom Cobley +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -536,14 +536,17 @@ static int vc4_hdmi_connector_atomic_che + { + struct drm_connector_state *old_state = + drm_atomic_get_old_connector_state(state, connector); ++ struct vc4_hdmi_connector_state *old_vc4_state = conn_state_to_vc4_hdmi_conn_state(old_state); + struct drm_connector_state *new_state = + drm_atomic_get_new_connector_state(state, connector); ++ struct vc4_hdmi_connector_state *new_vc4_state = conn_state_to_vc4_hdmi_conn_state(new_state); + struct drm_crtc *crtc = new_state->crtc; + + if (!crtc) + return 0; + + if (old_state->colorspace != new_state->colorspace || ++ old_vc4_state->broadcast_rgb != new_vc4_state->broadcast_rgb || + !drm_connector_atomic_hdr_metadata_equal(old_state, new_state)) { + struct drm_crtc_state *crtc_state; + diff --git a/target/linux/bcm27xx/patches-6.1/950-0047-drm-atomic-If-margins-are-updated-update-all-planes.patch b/target/linux/bcm27xx/patches-6.1/950-0047-drm-atomic-If-margins-are-updated-update-all-planes.patch new file mode 100644 index 00000000000..671f651538a --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0047-drm-atomic-If-margins-are-updated-update-all-planes.patch @@ -0,0 +1,60 @@ +From 62813ba7cbf8c2df7af04036a297175fc0457626 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Fri, 1 Apr 2022 17:10:37 +0100 +Subject: [PATCH] drm/atomic: If margins are updated, update all + planes. + +Margins may be implemented by scaling the planes, but as there +is no way of intercepting the set_property for a standard property, +and all planes are checked in drm_atomic_check_only before the +connectors, there's now way to add the planes into the state +from the driver. + +If the margin properties change, add all corresponding planes to +the state. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/drm_atomic_uapi.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +--- a/drivers/gpu/drm/drm_atomic_uapi.c ++++ b/drivers/gpu/drm/drm_atomic_uapi.c +@@ -679,6 +679,7 @@ static int drm_atomic_connector_set_prop + { + struct drm_device *dev = connector->dev; + struct drm_mode_config *config = &dev->mode_config; ++ bool margins_updated = false; + bool replaced = false; + int ret; + +@@ -698,12 +699,16 @@ static int drm_atomic_connector_set_prop + state->tv.subconnector = val; + } else if (property == config->tv_left_margin_property) { + state->tv.margins.left = val; ++ margins_updated = true; + } else if (property == config->tv_right_margin_property) { + state->tv.margins.right = val; ++ margins_updated = true; + } else if (property == config->tv_top_margin_property) { + state->tv.margins.top = val; ++ margins_updated = true; + } else if (property == config->tv_bottom_margin_property) { + state->tv.margins.bottom = val; ++ margins_updated = true; + } else if (property == config->tv_mode_property) { + state->tv.mode = val; + } else if (property == config->tv_brightness_property) { +@@ -784,6 +789,12 @@ static int drm_atomic_connector_set_prop + return -EINVAL; + } + ++ if (margins_updated && state->crtc) { ++ ret = drm_atomic_add_affected_planes(state->state, state->crtc); ++ ++ return ret; ++ } ++ + return 0; + } + diff --git a/target/linux/bcm27xx/patches-6.1/950-0048-drm-vc4-hvs-Ignore-atomic_flush-if-we-re-disabled.patch b/target/linux/bcm27xx/patches-6.1/950-0048-drm-vc4-hvs-Ignore-atomic_flush-if-we-re-disabled.patch new file mode 100644 index 00000000000..4ddda92e169 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0048-drm-vc4-hvs-Ignore-atomic_flush-if-we-re-disabled.patch @@ -0,0 +1,27 @@ +From 2f38c1f89175b33aaa091d055a804f4f31c47ec2 Mon Sep 17 00:00:00 2001 +From: Maxime Ripard +Date: Mon, 6 Dec 2021 16:32:10 +0100 +Subject: [PATCH] drm/vc4: hvs: Ignore atomic_flush if we're disabled + +atomic_flush will be called for each CRTC even if they aren't enabled. + +The whole code we have there will thus run without a properly affected +channel, which can then result in all sorts of weird behaviour. + +Signed-off-by: Maxime Ripard +--- + drivers/gpu/drm/vc4/vc4_hvs.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -778,6 +778,9 @@ void vc4_hvs_atomic_flush(struct drm_crt + return; + } + ++ if (vc4_state->assigned_channel == VC4_HVS_CHANNEL_DISABLED) ++ return; ++ + if (debug_dump_regs) { + DRM_INFO("CRTC %d HVS before:\n", drm_crtc_index(crtc)); + vc4_hvs_dump_state(hvs); diff --git a/target/linux/bcm27xx/patches-6.1/950-0049-drm-vc4-0-is-a-valid-value-for-pixel_order_hvs5-so-f.patch b/target/linux/bcm27xx/patches-6.1/950-0049-drm-vc4-0-is-a-valid-value-for-pixel_order_hvs5-so-f.patch new file mode 100644 index 00000000000..ebc9ce44ec7 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0049-drm-vc4-0-is-a-valid-value-for-pixel_order_hvs5-so-f.patch @@ -0,0 +1,118 @@ +From b16dcc5f735739444da66149b473bb88fb44d4d9 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Fri, 3 Jun 2022 16:49:09 +0100 +Subject: [PATCH] drm: vc4: 0 is a valid value for pixel_order_hvs5, so + fix conditionals + +vc4_plane_mode_set for HVS5 was using pixel_order unless pixel_order_hvs5 +was non-zero, except 0 is a valid value for the pixel_order. + +Specify pixel_order_hvs5 for all formats and remove the conditional. + +Reported-by: vrazzer +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_plane.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -65,11 +65,13 @@ static const struct hvs_format { + .drm = DRM_FORMAT_RGB565, + .hvs = HVS_PIXEL_FORMAT_RGB565, + .pixel_order = HVS_PIXEL_ORDER_XRGB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XRGB, + }, + { + .drm = DRM_FORMAT_BGR565, + .hvs = HVS_PIXEL_FORMAT_RGB565, + .pixel_order = HVS_PIXEL_ORDER_XBGR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XBGR, + }, + { + .drm = DRM_FORMAT_ARGB1555, +@@ -87,56 +89,67 @@ static const struct hvs_format { + .drm = DRM_FORMAT_RGB888, + .hvs = HVS_PIXEL_FORMAT_RGB888, + .pixel_order = HVS_PIXEL_ORDER_XRGB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XRGB, + }, + { + .drm = DRM_FORMAT_BGR888, + .hvs = HVS_PIXEL_FORMAT_RGB888, + .pixel_order = HVS_PIXEL_ORDER_XBGR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XBGR, + }, + { + .drm = DRM_FORMAT_YUV422, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_3PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCBCR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCBCR, + }, + { + .drm = DRM_FORMAT_YVU422, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_3PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCRCB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCRCB, + }, + { + .drm = DRM_FORMAT_YUV420, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV420_3PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCBCR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCBCR, + }, + { + .drm = DRM_FORMAT_YVU420, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV420_3PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCRCB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCRCB, + }, + { + .drm = DRM_FORMAT_NV12, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV420_2PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCBCR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCBCR, + }, + { + .drm = DRM_FORMAT_NV21, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV420_2PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCRCB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCRCB, + }, + { + .drm = DRM_FORMAT_NV16, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_2PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCBCR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCBCR, + }, + { + .drm = DRM_FORMAT_NV61, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_2PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCRCB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCRCB, + }, + { + .drm = DRM_FORMAT_P030, + .hvs = HVS_PIXEL_FORMAT_YCBCR_10BIT, + .pixel_order = HVS_PIXEL_ORDER_XYCBCR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCBCR, + .hvs5_only = true, + }, + { +@@ -1087,15 +1100,10 @@ static int vc4_plane_mode_set(struct drm + vc4_dlist_write(vc4_state, 0xc0c0c0c0); + + } else { +- u32 hvs_pixel_order = format->pixel_order; +- +- if (format->pixel_order_hvs5) +- hvs_pixel_order = format->pixel_order_hvs5; +- + /* Control word */ + vc4_dlist_write(vc4_state, + SCALER_CTL0_VALID | +- (hvs_pixel_order << SCALER_CTL0_ORDER_SHIFT) | ++ (format->pixel_order_hvs5 << SCALER_CTL0_ORDER_SHIFT) | + (hvs_format << SCALER_CTL0_PIXEL_FORMAT_SHIFT) | + VC4_SET_FIELD(tiling, SCALER_CTL0_TILING) | + (vc4_state->is_unity ? diff --git a/target/linux/bcm27xx/patches-6.1/950-0050-drm-vc4-Omit-pixel_order-from-the-hvs_format-for-hvs.patch b/target/linux/bcm27xx/patches-6.1/950-0050-drm-vc4-Omit-pixel_order-from-the-hvs_format-for-hvs.patch new file mode 100644 index 00000000000..e59ab2cf836 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0050-drm-vc4-Omit-pixel_order-from-the-hvs_format-for-hvs.patch @@ -0,0 +1,54 @@ +From e229805297bd5ff53b5fc63d08c5f37c2404c2d6 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Mon, 6 Jun 2022 12:23:28 +0100 +Subject: [PATCH] drm: vc4: Omit pixel_order from the hvs_format for + hvs5 only formats + +pixel_order is used for the earlier versions of the HVS, so is +redundant on the 10:10:10:2 and 10bit YUV formats that are only +supported on HVS5. +Remove the assignment from the table to avoid confusion. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_plane.c | 5 ----- + 1 file changed, 5 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -148,35 +148,30 @@ static const struct hvs_format { + { + .drm = DRM_FORMAT_P030, + .hvs = HVS_PIXEL_FORMAT_YCBCR_10BIT, +- .pixel_order = HVS_PIXEL_ORDER_XYCBCR, + .pixel_order_hvs5 = HVS_PIXEL_ORDER_XYCBCR, + .hvs5_only = true, + }, + { + .drm = DRM_FORMAT_XRGB2101010, + .hvs = HVS_PIXEL_FORMAT_RGBA1010102, +- .pixel_order = HVS_PIXEL_ORDER_ABGR, + .pixel_order_hvs5 = HVS_PIXEL_ORDER_ARGB, + .hvs5_only = true, + }, + { + .drm = DRM_FORMAT_ARGB2101010, + .hvs = HVS_PIXEL_FORMAT_RGBA1010102, +- .pixel_order = HVS_PIXEL_ORDER_ABGR, + .pixel_order_hvs5 = HVS_PIXEL_ORDER_ARGB, + .hvs5_only = true, + }, + { + .drm = DRM_FORMAT_ABGR2101010, + .hvs = HVS_PIXEL_FORMAT_RGBA1010102, +- .pixel_order = HVS_PIXEL_ORDER_ARGB, + .pixel_order_hvs5 = HVS_PIXEL_ORDER_ABGR, + .hvs5_only = true, + }, + { + .drm = DRM_FORMAT_XBGR2101010, + .hvs = HVS_PIXEL_FORMAT_RGBA1010102, +- .pixel_order = HVS_PIXEL_ORDER_ARGB, + .pixel_order_hvs5 = HVS_PIXEL_ORDER_ABGR, + .hvs5_only = true, + }, diff --git a/target/linux/bcm27xx/patches-6.1/950-0051-drm-vc4-Add-3-3-2-and-4-4-4-4-RGB-RGBX-RGBA-formats.patch b/target/linux/bcm27xx/patches-6.1/950-0051-drm-vc4-Add-3-3-2-and-4-4-4-4-RGB-RGBX-RGBA-formats.patch new file mode 100644 index 00000000000..c4e0050589a --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0051-drm-vc4-Add-3-3-2-and-4-4-4-4-RGB-RGBX-RGBA-formats.patch @@ -0,0 +1,104 @@ +From db4cb2248e9d98cc513300964c3ecdc80b8bc364 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Fri, 3 Jun 2022 16:57:04 +0100 +Subject: [PATCH] drm: vc4: Add 3:3:2 and 4:4:4:4 RGB/RGBX/RGBA formats + +The hardware supports the 332 8bpp and 4:4:4:4 16bpp formats, +but the table of supported formats didn't include them. +Add them in. + +In theory they are supported for T-format as well as linear, +but without a way to test them just add them as linear for now. + +Suggested-by: vrazzer +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_plane.c | 70 +++++++++++++++++++++++++++++++++ + 1 file changed, 70 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -175,6 +175,66 @@ static const struct hvs_format { + .pixel_order_hvs5 = HVS_PIXEL_ORDER_ABGR, + .hvs5_only = true, + }, ++ { ++ .drm = DRM_FORMAT_RGB332, ++ .hvs = HVS_PIXEL_FORMAT_RGB332, ++ .pixel_order = HVS_PIXEL_ORDER_ARGB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ARGB, ++ }, ++ { ++ .drm = DRM_FORMAT_BGR233, ++ .hvs = HVS_PIXEL_FORMAT_RGB332, ++ .pixel_order = HVS_PIXEL_ORDER_ABGR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ABGR, ++ }, ++ { ++ .drm = DRM_FORMAT_XRGB4444, ++ .hvs = HVS_PIXEL_FORMAT_RGBA4444, ++ .pixel_order = HVS_PIXEL_ORDER_ABGR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ARGB, ++ }, ++ { ++ .drm = DRM_FORMAT_ARGB4444, ++ .hvs = HVS_PIXEL_FORMAT_RGBA4444, ++ .pixel_order = HVS_PIXEL_ORDER_ABGR, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ARGB, ++ }, ++ { ++ .drm = DRM_FORMAT_XBGR4444, ++ .hvs = HVS_PIXEL_FORMAT_RGBA4444, ++ .pixel_order = HVS_PIXEL_ORDER_ARGB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ABGR, ++ }, ++ { ++ .drm = DRM_FORMAT_ABGR4444, ++ .hvs = HVS_PIXEL_FORMAT_RGBA4444, ++ .pixel_order = HVS_PIXEL_ORDER_ARGB, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_ABGR, ++ }, ++ { ++ .drm = DRM_FORMAT_BGRX4444, ++ .hvs = HVS_PIXEL_FORMAT_RGBA4444, ++ .pixel_order = HVS_PIXEL_ORDER_RGBA, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_BGRA, ++ }, ++ { ++ .drm = DRM_FORMAT_BGRA4444, ++ .hvs = HVS_PIXEL_FORMAT_RGBA4444, ++ .pixel_order = HVS_PIXEL_ORDER_RGBA, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_BGRA, ++ }, ++ { ++ .drm = DRM_FORMAT_RGBX4444, ++ .hvs = HVS_PIXEL_FORMAT_RGBA4444, ++ .pixel_order = HVS_PIXEL_ORDER_BGRA, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_RGBA, ++ }, ++ { ++ .drm = DRM_FORMAT_RGBA4444, ++ .hvs = HVS_PIXEL_FORMAT_RGBA4444, ++ .pixel_order = HVS_PIXEL_ORDER_BGRA, ++ .pixel_order_hvs5 = HVS_PIXEL_ORDER_RGBA, ++ }, + }; + + static const struct hvs_format *vc4_get_hvs_format(u32 drm_format) +@@ -1575,6 +1635,16 @@ static bool vc4_format_mod_supported(str + case DRM_FORMAT_BGRX1010102: + case DRM_FORMAT_RGBA1010102: + case DRM_FORMAT_BGRA1010102: ++ case DRM_FORMAT_XRGB4444: ++ case DRM_FORMAT_ARGB4444: ++ case DRM_FORMAT_XBGR4444: ++ case DRM_FORMAT_ABGR4444: ++ case DRM_FORMAT_RGBX4444: ++ case DRM_FORMAT_RGBA4444: ++ case DRM_FORMAT_BGRX4444: ++ case DRM_FORMAT_BGRA4444: ++ case DRM_FORMAT_RGB332: ++ case DRM_FORMAT_BGR233: + case DRM_FORMAT_YUV422: + case DRM_FORMAT_YVU422: + case DRM_FORMAT_YUV420: diff --git a/target/linux/bcm27xx/patches-6.1/950-0052-drm-vc4-Add-comments-for-which-HVS_PIXEL_ORDER_xxx-d.patch b/target/linux/bcm27xx/patches-6.1/950-0052-drm-vc4-Add-comments-for-which-HVS_PIXEL_ORDER_xxx-d.patch new file mode 100644 index 00000000000..83f1fdca90f --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0052-drm-vc4-Add-comments-for-which-HVS_PIXEL_ORDER_xxx-d.patch @@ -0,0 +1,36 @@ +From 30f0c2f0da952655da949c2af36bf53138092ba5 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Mon, 6 Jun 2022 14:53:56 +0100 +Subject: [PATCH] drm: vc4: Add comments for which HVS_PIXEL_ORDER_xxx + defines apply + +The HVS_PIXEL_ORDER_xxx defines apply to specific HVS_PIXEL_FORMAT_xxx +modes, so add comments to make this obvious. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_regs.h | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_regs.h ++++ b/drivers/gpu/drm/vc4/vc4_regs.h +@@ -870,16 +870,19 @@ enum hvs_pixel_format { + /* Note: the LSB is the rightmost character shown. Only valid for + * HVS_PIXEL_FORMAT_RGB8888, not RGB888. + */ ++/* For modes 332, 4444, 555, 5551, 6666, 8888, 10:10:10:2 */ + #define HVS_PIXEL_ORDER_RGBA 0 + #define HVS_PIXEL_ORDER_BGRA 1 + #define HVS_PIXEL_ORDER_ARGB 2 + #define HVS_PIXEL_ORDER_ABGR 3 + ++/* For modes 666 and 888 (4 & 5) */ + #define HVS_PIXEL_ORDER_XBRG 0 + #define HVS_PIXEL_ORDER_XRBG 1 + #define HVS_PIXEL_ORDER_XRGB 2 + #define HVS_PIXEL_ORDER_XBGR 3 + ++/* For YCbCr modes (8-12, and 17) */ + #define HVS_PIXEL_ORDER_XYCBCR 0 + #define HVS_PIXEL_ORDER_XYCRCB 1 + #define HVS_PIXEL_ORDER_YXCBCR 2 diff --git a/target/linux/bcm27xx/patches-6.1/950-0053-drm-vc4-Add-async-update-support-for-cursor-planes.patch b/target/linux/bcm27xx/patches-6.1/950-0053-drm-vc4-Add-async-update-support-for-cursor-planes.patch new file mode 100644 index 00000000000..24e46f87e78 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0053-drm-vc4-Add-async-update-support-for-cursor-planes.patch @@ -0,0 +1,87 @@ +From e6f7f8f83e736bb94b146781b149810853b2bff3 Mon Sep 17 00:00:00 2001 +From: Phil Elwell <8911409+pelwell@users.noreply.github.com> +Date: Wed, 24 Aug 2022 11:14:40 +0100 +Subject: [PATCH] drm/vc4: Add async update support for cursor planes + +Now that cursors are implemented as regular planes, all cursor +movements result in atomic updates. As the firmware-kms driver +doesn't support asynchronous updates, these are synchronous, which +limits the update rate to the screen refresh rate. Xorg seems unaware +of this (or at least of the effect of this), because if the mouse is +configured with a higher update rate than the screen then continuous +mouse movement results in an increasing backlog of mouse events - +cue extreme lag. + +Add minimal support for asynchronous updates - limited to cursor +planes - to eliminate the lag. + +See: https://github.com/raspberrypi/linux/pull/4971 + https://github.com/raspberrypi/linux/issues/4988 + +Signed-off-by: Phil Elwell +--- + drivers/gpu/drm/vc4/vc4_firmware_kms.c | 46 ++++++++++++++++++++++++++ + 1 file changed, 46 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c ++++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c +@@ -675,6 +675,50 @@ static int vc4_plane_atomic_check(struct + return vc4_plane_to_mb(plane, &vc4_plane->mb, new_plane_state); + } + ++static void vc4_plane_atomic_async_update(struct drm_plane *plane, ++ struct drm_atomic_state *state) ++{ ++ struct drm_plane_state *new_plane_state = ++ drm_atomic_get_new_plane_state(state, plane); ++ ++ swap(plane->state->fb, new_plane_state->fb); ++ plane->state->crtc_x = new_plane_state->crtc_x; ++ plane->state->crtc_y = new_plane_state->crtc_y; ++ plane->state->crtc_w = new_plane_state->crtc_w; ++ plane->state->crtc_h = new_plane_state->crtc_h; ++ plane->state->src_x = new_plane_state->src_x; ++ plane->state->src_y = new_plane_state->src_y; ++ plane->state->src_w = new_plane_state->src_w; ++ plane->state->src_h = new_plane_state->src_h; ++ plane->state->alpha = new_plane_state->alpha; ++ plane->state->pixel_blend_mode = new_plane_state->pixel_blend_mode; ++ plane->state->rotation = new_plane_state->rotation; ++ plane->state->zpos = new_plane_state->zpos; ++ plane->state->normalized_zpos = new_plane_state->normalized_zpos; ++ plane->state->color_encoding = new_plane_state->color_encoding; ++ plane->state->color_range = new_plane_state->color_range; ++ plane->state->src = new_plane_state->src; ++ plane->state->dst = new_plane_state->dst; ++ plane->state->visible = new_plane_state->visible; ++ ++ vc4_plane_set_blank(plane, false); ++} ++ ++static int vc4_plane_atomic_async_check(struct drm_plane *plane, ++ struct drm_atomic_state *state) ++{ ++ struct drm_plane_state *new_plane_state = ++ drm_atomic_get_new_plane_state(state, plane); ++ int ret = -EINVAL; ++ ++ if (plane->type == 2 && ++ plane->state->fb && ++ new_plane_state->crtc->state->active) ++ ret = 0; ++ ++ return ret; ++} ++ + /* Called during init to allocate the plane's atomic state. */ + static void vc4_plane_reset(struct drm_plane *plane) + { +@@ -769,6 +813,8 @@ static const struct drm_plane_helper_fun + .atomic_check = vc4_plane_atomic_check, + .atomic_update = vc4_plane_atomic_update, + .atomic_disable = vc4_plane_atomic_disable, ++ .atomic_async_check = vc4_plane_atomic_async_check, ++ .atomic_async_update = vc4_plane_atomic_async_update, + }; + + static struct drm_plane *vc4_fkms_plane_init(struct drm_device *dev, diff --git a/target/linux/bcm27xx/patches-6.1/950-0054-drm-vc4-Configure-the-HVS-COB-allocations.patch b/target/linux/bcm27xx/patches-6.1/950-0054-drm-vc4-Configure-the-HVS-COB-allocations.patch new file mode 100644 index 00000000000..41d2d00dc50 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0054-drm-vc4-Configure-the-HVS-COB-allocations.patch @@ -0,0 +1,96 @@ +From 4477b8c71c8b3b5aa8bd15f9993f48d02d178fc5 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 11 Aug 2022 13:49:16 +0100 +Subject: [PATCH] drm/vc4: Configure the HVS COB allocations + +The HVS Composite Output Buffer (COB) is the memory used to +generate the output pixel data. +Until now the vc4 driver has been relying on the firmware to +have set these to sensible values. + +In testing triple screen support it has been noted that only +1 line was being assigned to HVS channel 2. Whilst that is fine +for the transposer (TXP), and indeed needed as only some pixels +have an alpha channel, it is insufficient to run a live display. + +Split the COB more evenly between the 3 HVS channels. + +Signed-off-by: Dave Stevenson + +Revert vc4_regs change +--- + drivers/gpu/drm/vc4/vc4_hvs.c | 56 ++++++++++++++++++++++++++++++++++- + 1 file changed, 55 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -1013,7 +1013,7 @@ static int vc4_hvs_bind(struct device *d + struct vc4_hvs *hvs = NULL; + int ret; + u32 dispctrl; +- u32 reg; ++ u32 reg, top; + + hvs = drmm_kzalloc(drm, sizeof(*hvs), GFP_KERNEL); + if (!hvs) +@@ -1151,6 +1151,60 @@ static int vc4_hvs_bind(struct device *d + + HVS_WRITE(SCALER_DISPCTRL, dispctrl); + ++ /* Recompute Composite Output Buffer (COB) allocations for the displays ++ */ ++ if (!vc4->is_vc5) { ++ /* The COB is 20736 pixels, or just over 10 lines at 2048 wide. ++ * The bottom 2048 pixels are full 32bpp RGBA (intended for the ++ * TXP composing RGBA to memory), whilst the remainder are only ++ * 24bpp RGB. ++ * ++ * Assign 3 lines to channels 1 & 2, and just over 4 lines to ++ * channel 0. ++ */ ++ #define VC4_COB_SIZE 20736 ++ #define VC4_COB_LINE_WIDTH 2048 ++ #define VC4_COB_NUM_LINES 3 ++ reg = 0; ++ top = VC4_COB_LINE_WIDTH * VC4_COB_NUM_LINES; ++ reg |= (top - 1) << 16; ++ HVS_WRITE(SCALER_DISPBASE2, reg); ++ reg = top; ++ top += VC4_COB_LINE_WIDTH * VC4_COB_NUM_LINES; ++ reg |= (top - 1) << 16; ++ HVS_WRITE(SCALER_DISPBASE1, reg); ++ reg = top; ++ top = VC4_COB_SIZE; ++ reg |= (top - 1) << 16; ++ HVS_WRITE(SCALER_DISPBASE0, reg); ++ } else { ++ /* The COB is 44416 pixels, or 10.8 lines at 4096 wide. ++ * The bottom 4096 pixels are full RGBA (intended for the TXP ++ * composing RGBA to memory), whilst the remainder are only ++ * RGB. Addressing is always pixel wide. ++ * ++ * Assign 3 lines of 4096 to channels 1 & 2, and just over 4 ++ * lines. to channel 0. ++ */ ++ #define VC5_COB_SIZE 44416 ++ #define VC5_COB_LINE_WIDTH 4096 ++ #define VC5_COB_NUM_LINES 3 ++ reg = 0; ++ top = VC5_COB_LINE_WIDTH * VC5_COB_NUM_LINES; ++ reg |= top << 16; ++ HVS_WRITE(SCALER_DISPBASE2, reg); ++ top += 16; ++ reg = top; ++ top += VC5_COB_LINE_WIDTH * VC5_COB_NUM_LINES; ++ reg |= top << 16; ++ HVS_WRITE(SCALER_DISPBASE1, reg); ++ top += 16; ++ reg = top; ++ top = VC5_COB_SIZE; ++ reg |= top << 16; ++ HVS_WRITE(SCALER_DISPBASE0, reg); ++ } ++ + ret = devm_request_irq(dev, platform_get_irq(pdev, 0), + vc4_hvs_irq_handler, 0, "vc4 hvs", drm); + if (ret) diff --git a/target/linux/bcm27xx/patches-6.1/950-0055-drm-vc4-Set-AXI-panic-modes-for-the-HVS.patch b/target/linux/bcm27xx/patches-6.1/950-0055-drm-vc4-Set-AXI-panic-modes-for-the-HVS.patch new file mode 100644 index 00000000000..40465b0373d --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0055-drm-vc4-Set-AXI-panic-modes-for-the-HVS.patch @@ -0,0 +1,39 @@ +From b6b9915ad0b9c70c3b7edc45dfca2fdcfd4ba5cb Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 11 Aug 2022 13:59:34 +0100 +Subject: [PATCH] drm/vc4: Set AXI panic modes for the HVS + +The HVS can change AXI request mode based on how full the COB +FIFOs are. +Until now the vc4 driver has been relying on the firmware to +have set these to sensible values. + +With HVS channel 2 now being used for live video, change the +panic mode for all channels to be explicitly set by the driver, +and the same for all channels. + +Signed-off-by: Dave Stevenson +--- + drivers/gpu/drm/vc4/vc4_hvs.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -1149,6 +1149,17 @@ static int vc4_hvs_bind(struct device *d + dispctrl |= VC4_SET_FIELD(2, SCALER_DISPCTRL_PANIC1); + dispctrl |= VC4_SET_FIELD(2, SCALER_DISPCTRL_PANIC2); + ++ /* Set AXI panic mode. ++ * VC4 panics when < 2 lines in FIFO. ++ * VC5 panics when less than 1 line in the FIFO. ++ */ ++ dispctrl &= ~(SCALER_DISPCTRL_PANIC0_MASK | ++ SCALER_DISPCTRL_PANIC1_MASK | ++ SCALER_DISPCTRL_PANIC2_MASK); ++ dispctrl |= VC4_SET_FIELD(2, SCALER_DISPCTRL_PANIC0); ++ dispctrl |= VC4_SET_FIELD(2, SCALER_DISPCTRL_PANIC1); ++ dispctrl |= VC4_SET_FIELD(2, SCALER_DISPCTRL_PANIC2); ++ + HVS_WRITE(SCALER_DISPCTRL, dispctrl); + + /* Recompute Composite Output Buffer (COB) allocations for the displays diff --git a/target/linux/bcm27xx/patches-6.1/950-0056-drm-vc4-hvs-Skip-DebugFS-Registration-for-FKMS.patch b/target/linux/bcm27xx/patches-6.1/950-0056-drm-vc4-hvs-Skip-DebugFS-Registration-for-FKMS.patch new file mode 100644 index 00000000000..d40d5a7b252 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0056-drm-vc4-hvs-Skip-DebugFS-Registration-for-FKMS.patch @@ -0,0 +1,25 @@ +From 6674a753e11c7c623926a8fed128a9ed86530e5c Mon Sep 17 00:00:00 2001 +From: Maxime Ripard +Date: Mon, 11 Jul 2022 10:38:25 +0200 +Subject: [PATCH] drm/vc4: hvs: Skip DebugFS Registration for FKMS + +FKMS doesn't have an HVS and it's expected. Return from the debugfs init +function immediately if we're running with fkms. + +Signed-off-by: Maxime Ripard +--- + drivers/gpu/drm/vc4/vc4_hvs.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/gpu/drm/vc4/vc4_hvs.c ++++ b/drivers/gpu/drm/vc4/vc4_hvs.c +@@ -975,6 +975,9 @@ int vc4_hvs_debugfs_init(struct drm_mino + struct vc4_hvs *hvs = vc4->hvs; + int ret; + ++ if (vc4->firmware_kms) ++ return 0; ++ + if (!vc4->hvs) + return -ENODEV; + diff --git a/target/linux/bcm27xx/patches-6.1/950-0057-media-uapi-Add-some-RGB-bus-formats-for-VC4-DPI-outp.patch b/target/linux/bcm27xx/patches-6.1/950-0057-media-uapi-Add-some-RGB-bus-formats-for-VC4-DPI-outp.patch new file mode 100644 index 00000000000..2979aede23d --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0057-media-uapi-Add-some-RGB-bus-formats-for-VC4-DPI-outp.patch @@ -0,0 +1,40 @@ +From 8400889a0f241a12353673c35087bf6c38ea09e9 Mon Sep 17 00:00:00 2001 +From: Maxime Ripard +Date: Mon, 15 Aug 2022 13:34:02 +0200 +Subject: [PATCH] media: uapi: Add some RGB bus formats for VC4 DPI + output + +The VC4 DPI controller can output more RGB formats that aren't described +through a media bus format yet, so let's add them. + +Signed-off-by: Maxime Ripard +--- + include/uapi/linux/media-bus-format.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +--- a/include/uapi/linux/media-bus-format.h ++++ b/include/uapi/linux/media-bus-format.h +@@ -34,19 +34,22 @@ + + #define MEDIA_BUS_FMT_FIXED 0x0001 + +-/* RGB - next is 0x1022 */ ++/* RGB - next is 0x1025 */ + #define MEDIA_BUS_FMT_RGB444_1X12 0x1016 + #define MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE 0x1001 + #define MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE 0x1002 + #define MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE 0x1003 + #define MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE 0x1004 + #define MEDIA_BUS_FMT_RGB565_1X16 0x1017 ++#define MEDIA_BUS_FMT_RGB565_1X24_CPADHI 0x1022 + #define MEDIA_BUS_FMT_BGR565_2X8_BE 0x1005 + #define MEDIA_BUS_FMT_BGR565_2X8_LE 0x1006 + #define MEDIA_BUS_FMT_RGB565_2X8_BE 0x1007 + #define MEDIA_BUS_FMT_RGB565_2X8_LE 0x1008 ++#define MEDIA_BUS_FMT_BGR666_1X18 0x1023 + #define MEDIA_BUS_FMT_RGB666_1X18 0x1009 + #define MEDIA_BUS_FMT_RBG888_1X24 0x100e ++#define MEDIA_BUS_FMT_BGR666_1X24_CPADHI 0x1024 + #define MEDIA_BUS_FMT_RGB666_1X24_CPADHI 0x1015 + #define MEDIA_BUS_FMT_RGB666_1X7X3_SPWG 0x1010 + #define MEDIA_BUS_FMT_BGR888_1X24 0x1013 diff --git a/target/linux/bcm27xx/patches-6.1/950-0058-raspberrypi-firmware-Update-mailbox-commands.patch b/target/linux/bcm27xx/patches-6.1/950-0058-raspberrypi-firmware-Update-mailbox-commands.patch new file mode 100644 index 00000000000..4db60cca803 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0058-raspberrypi-firmware-Update-mailbox-commands.patch @@ -0,0 +1,99 @@ +From 9c48213eaa5603790ef3213637fd49bdb07e234a Mon Sep 17 00:00:00 2001 +From: Dom Cobley +Date: Thu, 7 Apr 2022 18:23:07 +0100 +Subject: [PATCH] raspberrypi-firmware: Update mailbox commands + +Signed-off-by: Dom Cobley +--- + include/soc/bcm2835/raspberrypi-firmware.h | 28 +++++++++++++++++++++- + 1 file changed, 27 insertions(+), 1 deletion(-) + +--- a/include/soc/bcm2835/raspberrypi-firmware.h ++++ b/include/soc/bcm2835/raspberrypi-firmware.h +@@ -36,6 +36,8 @@ struct rpi_firmware_property_tag_header + enum rpi_firmware_property_tag { + RPI_FIRMWARE_PROPERTY_END = 0, + RPI_FIRMWARE_GET_FIRMWARE_REVISION = 0x00000001, ++ RPI_FIRMWARE_GET_FIRMWARE_VARIANT = 0x00000002, ++ RPI_FIRMWARE_GET_FIRMWARE_HASH = 0x00000003, + + RPI_FIRMWARE_SET_CURSOR_INFO = 0x00008010, + RPI_FIRMWARE_SET_CURSOR_STATE = 0x00008011, +@@ -71,6 +73,7 @@ enum rpi_firmware_property_tag { + RPI_FIRMWARE_GET_DISPMANX_RESOURCE_MEM_HANDLE = 0x00030014, + RPI_FIRMWARE_GET_EDID_BLOCK = 0x00030020, + RPI_FIRMWARE_GET_CUSTOMER_OTP = 0x00030021, ++ RPI_FIRMWARE_GET_EDID_BLOCK_DISPLAY = 0x00030023, + RPI_FIRMWARE_GET_DOMAIN_STATE = 0x00030030, + RPI_FIRMWARE_GET_THROTTLED = 0x00030046, + RPI_FIRMWARE_GET_CLOCK_MEASURED = 0x00030047, +@@ -89,8 +92,11 @@ enum rpi_firmware_property_tag { + RPI_FIRMWARE_GET_PERIPH_REG = 0x00030045, + RPI_FIRMWARE_SET_PERIPH_REG = 0x00038045, + RPI_FIRMWARE_GET_POE_HAT_VAL = 0x00030049, +- RPI_FIRMWARE_SET_POE_HAT_VAL = 0x00030050, ++ RPI_FIRMWARE_SET_POE_HAT_VAL = 0x00038049, ++ RPI_FIRMWARE_SET_POE_HAT_VAL_OLD = 0x00030050, + RPI_FIRMWARE_NOTIFY_XHCI_RESET = 0x00030058, ++ RPI_FIRMWARE_GET_REBOOT_FLAGS = 0x00030064, ++ RPI_FIRMWARE_SET_REBOOT_FLAGS = 0x00038064, + RPI_FIRMWARE_NOTIFY_DISPLAY_DONE = 0x00030066, + + /* Dispmanx TAGS */ +@@ -105,9 +111,16 @@ enum rpi_firmware_property_tag { + RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_OFFSET = 0x00040009, + RPI_FIRMWARE_FRAMEBUFFER_GET_OVERSCAN = 0x0004000a, + RPI_FIRMWARE_FRAMEBUFFER_GET_PALETTE = 0x0004000b, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_LAYER = 0x0004000c, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_TRANSFORM = 0x0004000d, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_VSYNC = 0x0004000e, + RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF = 0x0004000f, + RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF = 0x00040010, + RPI_FIRMWARE_FRAMEBUFFER_RELEASE = 0x00048001, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_DISPLAY_ID = 0x00040016, ++ RPI_FIRMWARE_FRAMEBUFFER_SET_DISPLAY_NUM = 0x00048013, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_NUM_DISPLAYS = 0x00040013, ++ RPI_FIRMWARE_FRAMEBUFFER_GET_DISPLAY_SETTINGS = 0x00040014, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PHYSICAL_WIDTH_HEIGHT = 0x00044003, + RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_WIDTH_HEIGHT = 0x00044004, + RPI_FIRMWARE_FRAMEBUFFER_TEST_DEPTH = 0x00044005, +@@ -116,26 +129,39 @@ enum rpi_firmware_property_tag { + RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_OFFSET = 0x00044009, + RPI_FIRMWARE_FRAMEBUFFER_TEST_OVERSCAN = 0x0004400a, + RPI_FIRMWARE_FRAMEBUFFER_TEST_PALETTE = 0x0004400b, ++ RPI_FIRMWARE_FRAMEBUFFER_TEST_LAYER = 0x0004400c, ++ RPI_FIRMWARE_FRAMEBUFFER_TEST_TRANSFORM = 0x0004400d, + RPI_FIRMWARE_FRAMEBUFFER_TEST_VSYNC = 0x0004400e, + RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT = 0x00048003, + RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT = 0x00048004, + RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH = 0x00048005, + RPI_FIRMWARE_FRAMEBUFFER_SET_PIXEL_ORDER = 0x00048006, + RPI_FIRMWARE_FRAMEBUFFER_SET_ALPHA_MODE = 0x00048007, ++ RPI_FIRMWARE_FRAMEBUFFER_SET_PITCH = 0x00048008, + RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET = 0x00048009, + RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN = 0x0004800a, + RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE = 0x0004800b, ++ + RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF = 0x0004801f, + RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF = 0x00048020, + RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC = 0x0004800e, ++ RPI_FIRMWARE_FRAMEBUFFER_SET_LAYER = 0x0004800c, ++ RPI_FIRMWARE_FRAMEBUFFER_SET_TRANSFORM = 0x0004800d, + RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT = 0x0004800f, + + RPI_FIRMWARE_VCHIQ_INIT = 0x00048010, + ++ RPI_FIRMWARE_SET_PLANE = 0x00048015, ++ RPI_FIRMWARE_GET_DISPLAY_TIMING = 0x00040017, ++ RPI_FIRMWARE_SET_TIMING = 0x00048017, ++ RPI_FIRMWARE_GET_DISPLAY_CFG = 0x00040018, ++ RPI_FIRMWARE_SET_DISPLAY_POWER = 0x00048019, + RPI_FIRMWARE_GET_COMMAND_LINE = 0x00050001, + RPI_FIRMWARE_GET_DMA_CHANNELS = 0x00060001, + }; + ++#define GET_DISPLAY_SETTINGS_PAYLOAD_SIZE 64 ++ + #if IS_ENABLED(CONFIG_RASPBERRYPI_FIRMWARE) + int rpi_firmware_property(struct rpi_firmware *fw, + u32 tag, void *data, size_t len); diff --git a/target/linux/bcm27xx/patches-6.1/950-0059-clk-bcm-rpi-Create-helper-to-retrieve-private-data.patch b/target/linux/bcm27xx/patches-6.1/950-0059-clk-bcm-rpi-Create-helper-to-retrieve-private-data.patch new file mode 100644 index 00000000000..1fd0792ddc6 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0059-clk-bcm-rpi-Create-helper-to-retrieve-private-data.patch @@ -0,0 +1,70 @@ +From cdb7a9e14810f5cd40abf9cd3959294ee9283069 Mon Sep 17 00:00:00 2001 +From: Maxime Ripard +Date: Mon, 11 Jul 2022 15:58:36 +0200 +Subject: [PATCH] clk: bcm: rpi: Create helper to retrieve private data + +The RaspberryPi firmware clocks driver uses in several instances a +container_of to retrieve the struct raspberrypi_clk_data from a pointer +to struct clk_hw. Let's create a small function to avoid duplicating it +all over the place. + +Signed-off-by: Maxime Ripard +--- + drivers/clk/bcm/clk-raspberrypi.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +--- a/drivers/clk/bcm/clk-raspberrypi.c ++++ b/drivers/clk/bcm/clk-raspberrypi.c +@@ -75,6 +75,12 @@ struct raspberrypi_clk_data { + struct raspberrypi_clk *rpi; + }; + ++static inline ++const struct raspberrypi_clk_data *clk_hw_to_data(const struct clk_hw *hw) ++{ ++ return container_of(hw, struct raspberrypi_clk_data, hw); ++} ++ + struct raspberrypi_clk_variant { + bool export; + char *clkdev; +@@ -187,8 +193,7 @@ static int raspberrypi_clock_property(st + + static int raspberrypi_fw_is_prepared(struct clk_hw *hw) + { +- struct raspberrypi_clk_data *data = +- container_of(hw, struct raspberrypi_clk_data, hw); ++ const struct raspberrypi_clk_data *data = clk_hw_to_data(hw); + struct raspberrypi_clk *rpi = data->rpi; + u32 val = 0; + int ret; +@@ -205,8 +210,7 @@ static int raspberrypi_fw_is_prepared(st + static unsigned long raspberrypi_fw_get_rate(struct clk_hw *hw, + unsigned long parent_rate) + { +- struct raspberrypi_clk_data *data = +- container_of(hw, struct raspberrypi_clk_data, hw); ++ const struct raspberrypi_clk_data *data = clk_hw_to_data(hw); + struct raspberrypi_clk *rpi = data->rpi; + u32 val = 0; + int ret; +@@ -222,8 +226,7 @@ static unsigned long raspberrypi_fw_get_ + static int raspberrypi_fw_set_rate(struct clk_hw *hw, unsigned long rate, + unsigned long parent_rate) + { +- struct raspberrypi_clk_data *data = +- container_of(hw, struct raspberrypi_clk_data, hw); ++ const struct raspberrypi_clk_data *data = clk_hw_to_data(hw); + struct raspberrypi_clk *rpi = data->rpi; + u32 _rate = rate; + int ret; +@@ -240,8 +243,7 @@ static int raspberrypi_fw_set_rate(struc + static int raspberrypi_fw_dumb_determine_rate(struct clk_hw *hw, + struct clk_rate_request *req) + { +- struct raspberrypi_clk_data *data = +- container_of(hw, struct raspberrypi_clk_data, hw); ++ const struct raspberrypi_clk_data *data = clk_hw_to_data(hw); + struct raspberrypi_clk_variant *variant = data->variant; + + /* diff --git a/target/linux/bcm27xx/patches-6.1/950-0060-arm64-setup-Fix-build-warning.patch b/target/linux/bcm27xx/patches-6.1/950-0060-arm64-setup-Fix-build-warning.patch new file mode 100644 index 00000000000..bc6065bce84 --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0060-arm64-setup-Fix-build-warning.patch @@ -0,0 +1,24 @@ +From eedea0d30a542f255626876be44929af8efc337a Mon Sep 17 00:00:00 2001 +From: Maxime Ripard +Date: Mon, 6 Jun 2022 11:02:16 +0200 +Subject: [PATCH] arm64: setup: Fix build warning + +Signed-off-by: Maxime Ripard +--- + arch/arm64/kernel/setup.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/arch/arm64/kernel/setup.c ++++ b/arch/arm64/kernel/setup.c +@@ -222,9 +222,9 @@ static void __init request_standard_reso + size_t res_size; + + kernel_code.start = __pa_symbol(_stext); +- kernel_code.end = __pa_symbol(__init_begin - 1); ++ kernel_code.end = __pa_symbol(__init_begin) - 1; + kernel_data.start = __pa_symbol(_sdata); +- kernel_data.end = __pa_symbol(_end - 1); ++ kernel_data.end = __pa_symbol(_end) - 1; + insert_resource(&iomem_resource, &kernel_code); + insert_resource(&iomem_resource, &kernel_data); + diff --git a/target/linux/bcm27xx/patches-6.1/950-0061-BCM2708-Add-core-Device-Tree-support.patch b/target/linux/bcm27xx/patches-6.1/950-0061-BCM2708-Add-core-Device-Tree-support.patch new file mode 100644 index 00000000000..442abb456fd --- /dev/null +++ b/target/linux/bcm27xx/patches-6.1/950-0061-BCM2708-Add-core-Device-Tree-support.patch @@ -0,0 +1,37866 @@ +From c34870e7abd75a66d473b1e3c12d47e8b9c349e6 Mon Sep 17 00:00:00 2001 +From: notro +Date: Wed, 9 Jul 2014 14:46:08 +0200 +Subject: [PATCH] BCM2708: Add core Device Tree support +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add the bare minimum needed to boot BCM2708 from a Device Tree. + +Signed-off-by: Noralf Tronnes + +BCM2708: DT: change 'axi' nodename to 'soc' + +Change DT node named 'axi' to 'soc' so it matches ARCH_BCM2835. +The VC4 bootloader fills in certain properties in the 'axi' subtree, +but since this is part of an upstreaming effort, the name is changed. + +Signed-off-by: Noralf Tronnes notro@tronnes.org + +BCM2708_DT: Correct length of the peripheral space + +Use dts-dirs feature for overlays. + +The kernel makefiles have a dts-dirs target that is for vendor subdirectories. + +Using this fixes the install_dtbs target, which previously did not install the overlays. + +BCM270X_DT: configure I2S DMA channels + +Signed-off-by: Matthias Reichl + +BCM270X_DT: switch to bcm2835-i2s + +I2S soundcard drivers with proper devicetree support (i.e. not linking +to the cpu_dai/platform via name but to cpu/platform via of_node) +will work out of the box without any modifications. + +When the kernel is compiled without devicetree support the platform +code will instantiate the bcm2708-i2s driver and I2S soundcard drivers +will link to it via name, as before. + +Signed-off-by: Matthias Reichl + +SDIO-overlay: add poll_once-boolean parameter + +Add paramter to toggle sdio-device-polling +done every second or once at boot-time. + +Signed-off-by: Patrick Boettcher + +BCM270X_DT: Make mmc overlay compatible with current firmware + +The original DT overlay logic followed a merge-then-patch procedure, +i.e. parameters are applied to the loaded overlay before the overlay +is merged into the base DTB. This sequence has been changed to +patch-then-merge, in order to support parameterised node names, and +to protect against bad overlays. As a result, overrides (parameters) +must only target labels in the overlay, but the overlay can obviously target nodes in the base DTB. + +mmc-overlay.dts (that switches back to the original mmc sdcard +driver) is the only overlay violating that rule, and this patch +fixes it. + +bcm270x_dt: Use the sdhost MMC controller by default + +The "mmc" overlay reverts to using the other controller. + +squash: Add cprman to dt + +BCM270X_DT: Use clk_core for I2C interfaces + +BCM270X_DT: Use bcm283x.dtsi, bcm2835.dtsi and bcm2836.dtsi + +The mainline Device Tree files are quite close to downstream now. +Let's use bcm283x.dtsi, bcm2835.dtsi and bcm2836.dtsi as base files +for our dts files. + +Mainline dts files are based on these files: + + bcm2835-rpi.dtsi + bcm2835.dtsi bcm2836.dtsi + bcm283x.dtsi + +Current downstream are based on these: + + bcm2708.dtsi bcm2709.dtsi bcm2710.dtsi + bcm2708_common.dtsi + +This patch introduces this dependency: + + bcm2708.dtsi bcm2709.dtsi + bcm2708-rpi.dtsi + bcm270x.dtsi + bcm2835.dtsi bcm2836.dtsi + bcm283x.dtsi + +And: + bcm2710.dtsi + bcm2708-rpi.dtsi + bcm270x.dtsi + bcm283x.dtsi + +bcm270x.dtsi contains the downstream bcm283x.dtsi diff. +bcm2708-rpi.dtsi is the downstream version of bcm2835-rpi.dtsi. + +Other changes: +- The led node has moved from /soc/leds to /leds. This is not a problem + since the label is used to reference it. +- The clk_osc reg property changes from 6 to 3. +- The gpu nodes has their interrupt property set in the base file. +- the clocks label does not point to the /clocks node anymore, but + points to the cprman node. This is not a problem since the overlays + that use the clock node refer to it directly: target-path = "/clocks"; +- some nodes now have 2 labels since mainline and downstream differs in + this respect: cprman/clocks, spi0/spi, gpu/vc4. +- some nodes doesn't have an explicit status = "okay" since they're not + disabled in the base file: watchdog and random. +- gpiomem doesn't need an explicit status = "okay". +- bcm2708-rpi-cm.dts got the hpd-gpios property from bcm2708_common.dtsi, + it's now set directly in that file. +- bcm2709-rpi-2-b.dts has the timer node moved from /soc/timer to /timer. +- Removed clock-frequency property on the bcm{2709,2710}.dtsi timer nodes. + +Signed-off-by: Noralf Trønnes + +BCM270X_DT: Use raspberrypi-power to turn on USB power + +Use the raspberrypi-power driver to turn on USB power. + +Signed-off-by: Noralf Trønnes + +BCM270X_DT: Add a .dtbo target, use for overlays + +Change the filenames and extensions to keep the pre-DDT style of +overlay (-overlay.dtb) distinct from new ones that use a +different style of local fixups (.dtbo), and to match other +platforms. + +The RPi firmware uses the DDTK trailer atom to choose which type of +overlay to use for each kernel. + +Signed-off-by: Phil Elwell + +BCM270X_DT: Don't generate "linux,phandle" props + +The EPAPR standard says to use "phandle" properties to store phandles, +rather than the deprecated "linux,phandle" version. By default, dtc +generates both, but adding "-H epapr" causes it to only generate +"phandle"s, saving some space and clutter. + +Signed-off-by: Phil Elwell + +BCM270X_DT: Add overlay for enc28j60 on SPI2 + +Works on SPI2 for compute module + +BCM270X_DT: Add midi-uart0 overlay + +MIDI requires 31.25kbaud, a baudrate unsupported by Linux. The +midi-uart0 overlay configures uart0 (ttyAMA0) to use a fake clock +so that requesting 38.4kbaud actually gets 31.25kbaud. + +Signed-off-by: Phil Elwell + +BCM270X_DT: Add i2c-sensor overlay + +The i2c-sensor overlay is a container for various pressure and +temperature sensors, currently bmp085 and bmp280. The standalone +bmp085_i2c-sensor overlay is now deprecated. + +Signed-off-by: Phil Elwell + +BCM270X_DT: overlays/*-overlay.dtb -> overlays/*.dtbo (#1752) + +We now create overlays as .dtbo files. + +build: support for .dtbo files for dtb overlays + +Kernel 4.4.6+ on RaspberryPi support .dtbo files for overlays, instead of .dtb. +Patch the kernel, which has faulty rules to generate .dtbo the way yocto does + +Signed-off-by: Herve Jourdain +Signed-off-by: Khem Raj + +BCM270X: Drop position requirement for CMA in VC4 overlay. + +No longer necessary since 2aefcd576195a739a7a256099571c9c4a401005f, +and will probably let peeople that want to choose a larger CMA +allocation (particularly on pi0/1). + +Signed-off-by: Eric Anholt + +BCM270X_DT: RPi Device Tree tidy + +Use the upstream sdhost node, add thermal-zones, and factor out some +common elements. + +Signed-off-by: Phil Elwell + +kbuild: Silence unhelpful DTC warnings + +Signed-off-by: Phil Elwell + +BCM270X_DT: DT build rules no longer arch-specific + +Signed-off-by: Phil Elwell +--- + arch/arm/boot/dts/Makefile | 31 + + arch/arm/boot/dts/bcm2708-rpi-b-plus.dts | 200 + + arch/arm/boot/dts/bcm2708-rpi-b-rev1.dts | 208 + + arch/arm/boot/dts/bcm2708-rpi-b.dts | 190 + + arch/arm/boot/dts/bcm2708-rpi-bt.dtsi | 26 + + arch/arm/boot/dts/bcm2708-rpi-cm.dts | 171 + + arch/arm/boot/dts/bcm2708-rpi-cm.dtsi | 22 + + arch/arm/boot/dts/bcm2708-rpi-zero-w.dts | 246 + + arch/arm/boot/dts/bcm2708-rpi-zero.dts | 187 + + arch/arm/boot/dts/bcm2708-rpi.dtsi | 40 + + arch/arm/boot/dts/bcm2708.dtsi | 18 + + arch/arm/boot/dts/bcm2709-rpi-2-b.dts | 200 + + arch/arm/boot/dts/bcm2709-rpi-cm2.dts | 221 + + arch/arm/boot/dts/bcm2709-rpi.dtsi | 5 + + arch/arm/boot/dts/bcm2709.dtsi | 24 + + arch/arm/boot/dts/bcm270x-rpi.dtsi | 177 + + arch/arm/boot/dts/bcm270x.dtsi | 294 ++ + arch/arm/boot/dts/bcm2710-rpi-2-b.dts | 200 + + arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts | 289 ++ + arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 291 ++ + arch/arm/boot/dts/bcm2710-rpi-cm3.dts | 220 + + arch/arm/boot/dts/bcm2710-rpi-zero-2-w.dts | 267 + + arch/arm/boot/dts/bcm2710-rpi-zero-2.dts | 1 + + arch/arm/boot/dts/bcm2710.dtsi | 27 + + arch/arm/boot/dts/bcm2711-rpi-4-b.dts | 320 +- + arch/arm/boot/dts/bcm2711-rpi-400.dts | 532 +- + arch/arm/boot/dts/bcm2711-rpi-cm4.dts | 578 +++ + arch/arm/boot/dts/bcm2711-rpi-cm4s.dts | 427 ++ + arch/arm/boot/dts/bcm2711-rpi-ds.dtsi | 292 ++ + arch/arm/boot/dts/bcm2711-rpi.dtsi | 13 + + arch/arm/boot/dts/bcm271x-rpi-bt.dtsi | 26 + + arch/arm/boot/dts/bcm283x-rpi-csi0-2lane.dtsi | 4 + + arch/arm/boot/dts/bcm283x-rpi-csi1-2lane.dtsi | 4 + + arch/arm/boot/dts/bcm283x-rpi-csi1-4lane.dtsi | 4 + + .../boot/dts/bcm283x-rpi-i2c0mux_0_28.dtsi | 4 + + .../boot/dts/bcm283x-rpi-i2c0mux_0_44.dtsi | 4 + + arch/arm/boot/dts/overlays/Makefile | 287 ++ + arch/arm/boot/dts/overlays/README | 4513 +++++++++++++++++ + .../arm/boot/dts/overlays/act-led-overlay.dts | 27 + + .../dts/overlays/adafruit-st7735r-overlay.dts | 83 + + .../boot/dts/overlays/adafruit18-overlay.dts | 55 + + .../dts/overlays/adau1977-adc-overlay.dts | 40 + + .../dts/overlays/adau7002-simple-overlay.dts | 52 + + .../arm/boot/dts/overlays/ads1015-overlay.dts | 98 + + .../arm/boot/dts/overlays/ads1115-overlay.dts | 103 + + .../arm/boot/dts/overlays/ads7846-overlay.dts | 89 + + .../boot/dts/overlays/adv7282m-overlay.dts | 73 + + .../boot/dts/overlays/adv728x-m-overlay.dts | 37 + + .../overlays/akkordion-iqdacplus-overlay.dts | 49 + + .../allo-boss-dac-pcm512x-audio-overlay.dts | 59 + + .../overlays/allo-boss2-dac-audio-overlay.dts | 57 + + .../dts/overlays/allo-digione-overlay.dts | 44 + + .../allo-katana-dac-audio-overlay.dts | 57 + + .../allo-piano-dac-pcm512x-audio-overlay.dts | 54 + + ...o-piano-dac-plus-pcm512x-audio-overlay.dts | 57 + + arch/arm/boot/dts/overlays/anyspi-overlay.dts | 205 + + .../boot/dts/overlays/apds9960-overlay.dts | 55 + + .../boot/dts/overlays/applepi-dac-overlay.dts | 57 + + .../dts/overlays/arducam-64mp-overlay.dts | 94 + + .../overlays/arducam-pivariety-overlay.dts | 94 + + .../boot/dts/overlays/at86rf233-overlay.dts | 57 + + .../overlays/audioinjector-addons-overlay.dts | 60 + + .../audioinjector-bare-i2s-overlay.dts | 50 + + ...dioinjector-isolated-soundcard-overlay.dts | 55 + + .../overlays/audioinjector-ultra-overlay.dts | 71 + + .../audioinjector-wm8731-audio-overlay.dts | 39 + + .../dts/overlays/audiosense-pi-overlay.dts | 82 + + .../boot/dts/overlays/audremap-overlay.dts | 44 + + .../boot/dts/overlays/balena-fin-overlay.dts | 125 + + .../dts/overlays/camera-mux-2port-overlay.dts | 409 ++ + .../dts/overlays/camera-mux-4port-overlay.dts | 684 +++ + .../arm/boot/dts/overlays/cap1106-overlay.dts | 52 + + .../boot/dts/overlays/chipdip-dac-overlay.dts | 46 + + .../dts/overlays/cirrus-wm5102-overlay.dts | 172 + + arch/arm/boot/dts/overlays/cma-overlay.dts | 36 + + .../dts/overlays/cutiepi-panel-overlay.dts | 117 + + .../boot/dts/overlays/dacberry400-overlay.dts | 71 + + arch/arm/boot/dts/overlays/dht11-overlay.dts | 48 + + .../dts/overlays/dionaudio-kiwi-overlay.dts | 39 + + .../dts/overlays/dionaudio-loco-overlay.dts | 39 + + .../overlays/dionaudio-loco-v2-overlay.dts | 49 + + .../boot/dts/overlays/disable-bt-overlay.dts | 64 + + .../dts/overlays/disable-wifi-overlay.dts | 20 + + arch/arm/boot/dts/overlays/dpi18-overlay.dts | 39 + + .../boot/dts/overlays/dpi18cpadhi-overlay.dts | 26 + + arch/arm/boot/dts/overlays/dpi24-overlay.dts | 39 + + arch/arm/boot/dts/overlays/draws-overlay.dts | 208 + + .../arm/boot/dts/overlays/dwc-otg-overlay.dts | 14 + + arch/arm/boot/dts/overlays/dwc2-overlay.dts | 26 + + .../boot/dts/overlays/edt-ft5406-overlay.dts | 26 + + arch/arm/boot/dts/overlays/edt-ft5406.dtsi | 47 + + .../boot/dts/overlays/enc28j60-overlay.dts | 53 + + .../dts/overlays/enc28j60-spi2-overlay.dts | 47 + + .../arm/boot/dts/overlays/exc3000-overlay.dts | 48 + + arch/arm/boot/dts/overlays/fbtft-overlay.dts | 611 +++ + .../boot/dts/overlays/fe-pi-audio-overlay.dts | 70 + + .../boot/dts/overlays/fsm-demo-overlay.dts | 104 + + arch/arm/boot/dts/overlays/gc9a01-overlay.dts | 151 + + .../boot/dts/overlays/ghost-amp-overlay.dts | 145 + + arch/arm/boot/dts/overlays/goodix-overlay.dts | 46 + + .../googlevoicehat-soundcard-overlay.dts | 49 + + .../boot/dts/overlays/gpio-fan-overlay.dts | 89 + + .../boot/dts/overlays/gpio-hog-overlay.dts | 27 + + .../arm/boot/dts/overlays/gpio-ir-overlay.dts | 49 + + .../boot/dts/overlays/gpio-ir-tx-overlay.dts | 36 + + .../boot/dts/overlays/gpio-key-overlay.dts | 48 + + .../boot/dts/overlays/gpio-led-overlay.dts | 97 + + .../overlays/gpio-no-bank0-irq-overlay.dts | 14 + + .../boot/dts/overlays/gpio-no-irq-overlay.dts | 14 + + .../dts/overlays/gpio-poweroff-overlay.dts | 39 + + .../dts/overlays/gpio-shutdown-overlay.dts | 86 + + .../boot/dts/overlays/hd44780-lcd-overlay.dts | 46 + + .../hdmi-backlight-hwhack-gpio-overlay.dts | 47 + + .../dts/overlays/hifiberry-amp-overlay.dts | 39 + + .../dts/overlays/hifiberry-amp100-overlay.dts | 64 + + .../dts/overlays/hifiberry-amp3-overlay.dts | 57 + + .../dts/overlays/hifiberry-dac-overlay.dts | 34 + + .../overlays/hifiberry-dacplus-overlay.dts | 65 + + .../overlays/hifiberry-dacplusadc-overlay.dts | 72 + + .../hifiberry-dacplusadcpro-overlay.dts | 70 + + .../overlays/hifiberry-dacplusdsp-overlay.dts | 34 + + .../overlays/hifiberry-dacplushd-overlay.dts | 94 + + .../dts/overlays/hifiberry-digi-overlay.dts | 41 + + .../overlays/hifiberry-digi-pro-overlay.dts | 43 + + .../boot/dts/overlays/highperi-overlay.dts | 63 + + arch/arm/boot/dts/overlays/hy28a-overlay.dts | 93 + + .../boot/dts/overlays/hy28b-2017-overlay.dts | 152 + + arch/arm/boot/dts/overlays/hy28b-overlay.dts | 148 + + .../boot/dts/overlays/i-sabre-q2m-overlay.dts | 39 + + .../boot/dts/overlays/i2c-bcm2708-overlay.dts | 13 + + .../arm/boot/dts/overlays/i2c-fan-overlay.dts | 108 + + .../boot/dts/overlays/i2c-gpio-overlay.dts | 47 + + .../arm/boot/dts/overlays/i2c-mux-overlay.dts | 139 + + .../dts/overlays/i2c-pwm-pca9685a-overlay.dts | 26 + + .../arm/boot/dts/overlays/i2c-rtc-common.dtsi | 351 ++ + .../dts/overlays/i2c-rtc-gpio-overlay.dts | 31 + + .../arm/boot/dts/overlays/i2c-rtc-overlay.dts | 42 + + .../boot/dts/overlays/i2c-sensor-common.dtsi | 341 ++ + .../boot/dts/overlays/i2c-sensor-overlay.dts | 42 + + arch/arm/boot/dts/overlays/i2c0-overlay.dts | 83 + + arch/arm/boot/dts/overlays/i2c1-overlay.dts | 44 + + arch/arm/boot/dts/overlays/i2c3-overlay.dts | 36 + + arch/arm/boot/dts/overlays/i2c4-overlay.dts | 36 + + arch/arm/boot/dts/overlays/i2c5-overlay.dts | 36 + + arch/arm/boot/dts/overlays/i2c6-overlay.dts | 36 + + .../arm/boot/dts/overlays/i2s-dac-overlay.dts | 34 + + .../dts/overlays/i2s-gpio28-31-overlay.dts | 18 + + .../boot/dts/overlays/ilitek251x-overlay.dts | 45 + + arch/arm/boot/dts/overlays/imx219-overlay.dts | 89 + + arch/arm/boot/dts/overlays/imx219.dtsi | 27 + + arch/arm/boot/dts/overlays/imx258-overlay.dts | 131 + + arch/arm/boot/dts/overlays/imx258.dtsi | 27 + + arch/arm/boot/dts/overlays/imx290-overlay.dts | 32 + + .../boot/dts/overlays/imx290_327-overlay.dtsi | 112 + + arch/arm/boot/dts/overlays/imx290_327.dtsi | 24 + + arch/arm/boot/dts/overlays/imx296-overlay.dts | 103 + + arch/arm/boot/dts/overlays/imx327-overlay.dts | 32 + + arch/arm/boot/dts/overlays/imx378-overlay.dts | 10 + + arch/arm/boot/dts/overlays/imx462-overlay.dts | 32 + + arch/arm/boot/dts/overlays/imx477-overlay.dts | 10 + + .../boot/dts/overlays/imx477_378-overlay.dtsi | 83 + + arch/arm/boot/dts/overlays/imx477_378.dtsi | 24 + + arch/arm/boot/dts/overlays/imx519-overlay.dts | 96 + + .../dts/overlays/iqaudio-codec-overlay.dts | 42 + + .../boot/dts/overlays/iqaudio-dac-overlay.dts | 46 + + .../dts/overlays/iqaudio-dacplus-overlay.dts | 49 + + .../iqaudio-digi-wm8804-audio-overlay.dts | 47 + + arch/arm/boot/dts/overlays/iqs550-overlay.dts | 59 + + .../arm/boot/dts/overlays/irs1125-overlay.dts | 90 + + .../dts/overlays/jedec-spi-nor-overlay.dts | 309 ++ + .../dts/overlays/justboom-both-overlay.dts | 65 + + .../dts/overlays/justboom-dac-overlay.dts | 46 + + .../dts/overlays/justboom-digi-overlay.dts | 41 + + .../arm/boot/dts/overlays/ltc294x-overlay.dts | 86 + + .../boot/dts/overlays/max98357a-overlay.dts | 84 + + .../boot/dts/overlays/maxtherm-overlay.dts | 186 + + .../boot/dts/overlays/mbed-dac-overlay.dts | 64 + + .../boot/dts/overlays/mcp23017-overlay.dts | 69 + + .../boot/dts/overlays/mcp23s17-overlay.dts | 732 +++ + .../dts/overlays/mcp2515-can0-overlay.dts | 73 + + .../dts/overlays/mcp2515-can1-overlay.dts | 73 + + .../arm/boot/dts/overlays/mcp2515-overlay.dts | 156 + + .../boot/dts/overlays/mcp251xfd-overlay.dts | 226 + + .../arm/boot/dts/overlays/mcp3008-overlay.dts | 205 + + .../arm/boot/dts/overlays/mcp3202-overlay.dts | 205 + + .../arm/boot/dts/overlays/mcp342x-overlay.dts | 164 + + .../dts/overlays/media-center-overlay.dts | 134 + + .../boot/dts/overlays/merus-amp-overlay.dts | 59 + + .../boot/dts/overlays/midi-uart0-overlay.dts | 36 + + .../boot/dts/overlays/midi-uart1-overlay.dts | 43 + + .../boot/dts/overlays/midi-uart2-overlay.dts | 37 + + .../boot/dts/overlays/midi-uart3-overlay.dts | 38 + + .../boot/dts/overlays/midi-uart4-overlay.dts | 38 + + .../boot/dts/overlays/midi-uart5-overlay.dts | 38 + + .../boot/dts/overlays/minipitft13-overlay.dts | 70 + + .../boot/dts/overlays/miniuart-bt-overlay.dts | 93 + + .../dts/overlays/mipi-dbi-spi-overlay.dts | 175 + + .../boot/dts/overlays/mlx90640-overlay.dts | 22 + + arch/arm/boot/dts/overlays/mmc-overlay.dts | 46 + + .../arm/boot/dts/overlays/mpu6050-overlay.dts | 29 + + .../arm/boot/dts/overlays/mz61581-overlay.dts | 117 + + arch/arm/boot/dts/overlays/ov2311-overlay.dts | 77 + + arch/arm/boot/dts/overlays/ov2311.dtsi | 26 + + arch/arm/boot/dts/overlays/ov5647-overlay.dts | 92 + + arch/arm/boot/dts/overlays/ov5647.dtsi | 25 + + arch/arm/boot/dts/overlays/ov7251-overlay.dts | 77 + + arch/arm/boot/dts/overlays/ov7251.dtsi | 28 + + arch/arm/boot/dts/overlays/ov9281-overlay.dts | 78 + + arch/arm/boot/dts/overlays/ov9281.dtsi | 27 + + arch/arm/boot/dts/overlays/overlay_map.dts | 211 + + .../arm/boot/dts/overlays/papirus-overlay.dts | 84 + + .../arm/boot/dts/overlays/pca953x-overlay.dts | 240 + + .../dts/overlays/pcie-32bit-dma-overlay.dts | 38 + + arch/arm/boot/dts/overlays/pibell-overlay.dts | 81 + + .../dts/overlays/pifacedigital-overlay.dts | 144 + + .../arm/boot/dts/overlays/pifi-40-overlay.dts | 50 + + .../boot/dts/overlays/pifi-dac-hd-overlay.dts | 49 + + .../dts/overlays/pifi-dac-zero-overlay.dts | 49 + + .../dts/overlays/pifi-mini-210-overlay.dts | 42 + + arch/arm/boot/dts/overlays/piglow-overlay.dts | 97 + + .../boot/dts/overlays/piscreen-overlay.dts | 102 + + .../boot/dts/overlays/piscreen2r-overlay.dts | 106 + + .../arm/boot/dts/overlays/pisound-overlay.dts | 120 + + .../arm/boot/dts/overlays/pitft22-overlay.dts | 69 + + .../overlays/pitft28-capacitive-overlay.dts | 91 + + .../overlays/pitft28-resistive-overlay.dts | 121 + + .../overlays/pitft35-resistive-overlay.dts | 122 + + .../boot/dts/overlays/pps-gpio-overlay.dts | 39 + + .../boot/dts/overlays/proto-codec-overlay.dts | 39 + + .../boot/dts/overlays/pwm-2chan-overlay.dts | 49 + + .../boot/dts/overlays/pwm-ir-tx-overlay.dts | 40 + + arch/arm/boot/dts/overlays/pwm-overlay.dts | 45 + + .../arm/boot/dts/overlays/qca7000-overlay.dts | 55 + + .../dts/overlays/qca7000-uart0-overlay.dts | 46 + + .../arm/boot/dts/overlays/ramoops-overlay.dts | 25 + + .../boot/dts/overlays/ramoops-pi4-overlay.dts | 25 + + .../dts/overlays/rotary-encoder-overlay.dts | 59 + + .../dts/overlays/rpi-backlight-overlay.dts | 21 + + .../dts/overlays/rpi-codeczero-overlay.dts | 9 + + .../boot/dts/overlays/rpi-dacplus-overlay.dts | 17 + + .../boot/dts/overlays/rpi-dacpro-overlay.dts | 17 + + .../dts/overlays/rpi-digiampplus-overlay.dts | 17 + + .../boot/dts/overlays/rpi-ft5406-overlay.dts | 25 + + .../arm/boot/dts/overlays/rpi-poe-overlay.dts | 154 + + .../dts/overlays/rpi-poe-plus-overlay.dts | 49 + + .../boot/dts/overlays/rpi-sense-overlay.dts | 47 + + .../dts/overlays/rpi-sense-v2-overlay.dts | 47 + + arch/arm/boot/dts/overlays/rpi-tv-overlay.dts | 34 + + .../rra-digidac1-wm8741-audio-overlay.dts | 49 + + .../boot/dts/overlays/sainsmart18-overlay.dts | 52 + + .../dts/overlays/sc16is750-i2c-overlay.dts | 43 + + .../dts/overlays/sc16is752-i2c-overlay.dts | 43 + + .../dts/overlays/sc16is752-spi0-overlay.dts | 49 + + .../dts/overlays/sc16is752-spi1-overlay.dts | 67 + + arch/arm/boot/dts/overlays/sdhost-overlay.dts | 38 + + arch/arm/boot/dts/overlays/sdio-overlay.dts | 77 + + .../overlays/seeed-can-fd-hat-v1-overlay.dts | 138 + + .../overlays/seeed-can-fd-hat-v2-overlay.dts | 117 + + .../boot/dts/overlays/sh1106-spi-overlay.dts | 84 + + .../boot/dts/overlays/si446x-spi0-overlay.dts | 53 + + .../arm/boot/dts/overlays/smi-dev-overlay.dts | 20 + + .../boot/dts/overlays/smi-nand-overlay.dts | 66 + + arch/arm/boot/dts/overlays/smi-overlay.dts | 37 + + .../dts/overlays/spi-gpio35-39-overlay.dts | 31 + + .../dts/overlays/spi-gpio40-45-overlay.dts | 36 + + .../arm/boot/dts/overlays/spi-rtc-overlay.dts | 75 + + .../boot/dts/overlays/spi0-0cs-overlay.dts | 39 + + .../boot/dts/overlays/spi0-1cs-overlay.dts | 42 + + .../boot/dts/overlays/spi0-2cs-overlay.dts | 37 + + .../boot/dts/overlays/spi1-1cs-overlay.dts | 57 + + .../boot/dts/overlays/spi1-2cs-overlay.dts | 69 + + .../boot/dts/overlays/spi1-3cs-overlay.dts | 81 + + .../boot/dts/overlays/spi2-1cs-overlay.dts | 57 + + .../boot/dts/overlays/spi2-2cs-overlay.dts | 69 + + .../boot/dts/overlays/spi2-3cs-overlay.dts | 81 + + .../boot/dts/overlays/spi3-1cs-overlay.dts | 44 + + .../boot/dts/overlays/spi3-2cs-overlay.dts | 56 + + .../boot/dts/overlays/spi4-1cs-overlay.dts | 44 + + .../boot/dts/overlays/spi4-2cs-overlay.dts | 56 + + .../boot/dts/overlays/spi5-1cs-overlay.dts | 44 + + .../boot/dts/overlays/spi5-2cs-overlay.dts | 56 + + .../boot/dts/overlays/spi6-1cs-overlay.dts | 44 + + .../boot/dts/overlays/spi6-2cs-overlay.dts | 56 + + .../arm/boot/dts/overlays/ssd1306-overlay.dts | 36 + + .../boot/dts/overlays/ssd1306-spi-overlay.dts | 84 + + .../boot/dts/overlays/ssd1331-spi-overlay.dts | 83 + + .../boot/dts/overlays/ssd1351-spi-overlay.dts | 83 + + .../dts/overlays/superaudioboard-overlay.dts | 73 + + arch/arm/boot/dts/overlays/sx150x-overlay.dts | 1706 +++++++ + .../dts/overlays/tc358743-audio-overlay.dts | 52 + + .../boot/dts/overlays/tc358743-overlay.dts | 109 + + .../boot/dts/overlays/tinylcd35-overlay.dts | 222 + + .../boot/dts/overlays/tpm-slb9670-overlay.dts | 44 + + .../boot/dts/overlays/tpm-slb9673-overlay.dts | 50 + + arch/arm/boot/dts/overlays/uart0-overlay.dts | 32 + + arch/arm/boot/dts/overlays/uart1-overlay.dts | 38 + + arch/arm/boot/dts/overlays/uart2-overlay.dts | 27 + + arch/arm/boot/dts/overlays/uart3-overlay.dts | 27 + + arch/arm/boot/dts/overlays/uart4-overlay.dts | 27 + + arch/arm/boot/dts/overlays/uart5-overlay.dts | 27 + + arch/arm/boot/dts/overlays/udrc-overlay.dts | 128 + + .../dts/overlays/ugreen-dabboard-overlay.dts | 49 + + .../boot/dts/overlays/upstream-overlay.dts | 101 + + .../dts/overlays/upstream-pi4-overlay.dts | 137 + + .../dts/overlays/vc4-fkms-v3d-overlay.dts | 40 + + .../dts/overlays/vc4-fkms-v3d-pi4-overlay.dts | 44 + + .../overlays/vc4-kms-dpi-generic-overlay.dts | 81 + + .../dts/overlays/vc4-kms-dpi-hyperpixel.dtsi | 94 + + .../vc4-kms-dpi-hyperpixel2r-overlay.dts | 114 + + .../vc4-kms-dpi-hyperpixel4-overlay.dts | 57 + + .../vc4-kms-dpi-hyperpixel4sq-overlay.dts | 36 + + .../overlays/vc4-kms-dpi-panel-overlay.dts | 69 + + arch/arm/boot/dts/overlays/vc4-kms-dpi.dtsi | 111 + + .../overlays/vc4-kms-dsi-7inch-overlay.dts | 118 + + .../vc4-kms-dsi-lt070me05000-overlay.dts | 69 + + .../vc4-kms-dsi-lt070me05000-v2-overlay.dts | 64 + + .../overlays/vc4-kms-kippah-7inch-overlay.dts | 26 + + .../boot/dts/overlays/vc4-kms-v3d-overlay.dts | 124 + + .../dts/overlays/vc4-kms-v3d-pi4-overlay.dts | 200 + + .../dts/overlays/vc4-kms-vga666-overlay.dts | 100 + + arch/arm/boot/dts/overlays/vga666-overlay.dts | 30 + + arch/arm/boot/dts/overlays/vl805-overlay.dts | 18 + + .../arm/boot/dts/overlays/w1-gpio-overlay.dts | 40 + + .../dts/overlays/w1-gpio-pullup-overlay.dts | 42 + + arch/arm/boot/dts/overlays/w5500-overlay.dts | 63 + + .../overlays/watterott-display-overlay.dts | 150 + + .../waveshare-can-fd-hat-mode-a-overlay.dts | 140 + + .../waveshare-can-fd-hat-mode-b-overlay.dts | 103 + + .../arm/boot/dts/overlays/wittypi-overlay.dts | 44 + + .../dts/overlays/wm8960-soundcard-overlay.dts | 82 + + arch/arm64/boot/dts/Makefile | 2 + + arch/arm64/boot/dts/broadcom/Makefile | 14 + + .../boot/dts/broadcom/bcm2710-rpi-2-b.dts | 1 + + .../dts/broadcom/bcm2710-rpi-3-b-plus.dts | 1 + + .../boot/dts/broadcom/bcm2710-rpi-3-b.dts | 1 + + .../boot/dts/broadcom/bcm2710-rpi-cm3.dts | 1 + + .../dts/broadcom/bcm2710-rpi-zero-2-w.dts | 1 + + .../boot/dts/broadcom/bcm2710-rpi-zero-2.dts | 1 + + .../boot/dts/broadcom/bcm2711-rpi-4-b.dts | 3 +- + .../boot/dts/broadcom/bcm2711-rpi-400.dts | 3 +- + .../boot/dts/broadcom/bcm2711-rpi-cm4.dts | 1 + + .../boot/dts/broadcom/bcm2711-rpi-cm4s.dts | 1 + + .../dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi | 1 + + .../dts/broadcom/bcm283x-rpi-lan7515.dtsi | 1 + + arch/arm64/boot/dts/overlays | 1 + + include/dt-bindings/gpio/gpio-fsm.h | 21 + + scripts/Makefile.dtbinst | 3 +- + scripts/Makefile.lib | 13 + + 348 files changed, 34772 insertions(+), 16 deletions(-) + create mode 100644 arch/arm/boot/dts/bcm2708-rpi-b-plus.dts + create mode 100644 arch/arm/boot/dts/bcm2708-rpi-b-rev1.dts + create mode 100644 arch/arm/boot/dts/bcm2708-rpi-b.dts + create mode 100644 arch/arm/boot/dts/bcm2708-rpi-bt.dtsi + create mode 100644 arch/arm/boot/dts/bcm2708-rpi-cm.dts + create mode 100644 arch/arm/boot/dts/bcm2708-rpi-cm.dtsi + create mode 100644 arch/arm/boot/dts/bcm2708-rpi-zero-w.dts + create mode 100644 arch/arm/boot/dts/bcm2708-rpi-zero.dts + create mode 100644 arch/arm/boot/dts/bcm2708-rpi.dtsi + create mode 100644 arch/arm/boot/dts/bcm2708.dtsi + create mode 100644 arch/arm/boot/dts/bcm2709-rpi-2-b.dts + create mode 100644 arch/arm/boot/dts/bcm2709-rpi-cm2.dts + create mode 100644 arch/arm/boot/dts/bcm2709-rpi.dtsi + create mode 100644 arch/arm/boot/dts/bcm2709.dtsi + create mode 100644 arch/arm/boot/dts/bcm270x-rpi.dtsi + create mode 100644 arch/arm/boot/dts/bcm270x.dtsi + create mode 100644 arch/arm/boot/dts/bcm2710-rpi-2-b.dts + create mode 100644 arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts + create mode 100644 arch/arm/boot/dts/bcm2710-rpi-3-b.dts + create mode 100644 arch/arm/boot/dts/bcm2710-rpi-cm3.dts + create mode 100644 arch/arm/boot/dts/bcm2710-rpi-zero-2-w.dts + create mode 100644 arch/arm/boot/dts/bcm2710-rpi-zero-2.dts + create mode 100644 arch/arm/boot/dts/bcm2710.dtsi + create mode 100644 arch/arm/boot/dts/bcm2711-rpi-cm4.dts + create mode 100644 arch/arm/boot/dts/bcm2711-rpi-cm4s.dts + create mode 100644 arch/arm/boot/dts/bcm2711-rpi-ds.dtsi + create mode 100644 arch/arm/boot/dts/bcm271x-rpi-bt.dtsi + create mode 100644 arch/arm/boot/dts/bcm283x-rpi-csi0-2lane.dtsi + create mode 100644 arch/arm/boot/dts/bcm283x-rpi-csi1-2lane.dtsi + create mode 100644 arch/arm/boot/dts/bcm283x-rpi-csi1-4lane.dtsi + create mode 100644 arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_28.dtsi + create mode 100644 arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_44.dtsi + create mode 100644 arch/arm/boot/dts/overlays/Makefile + create mode 100644 arch/arm/boot/dts/overlays/README + create mode 100644 arch/arm/boot/dts/overlays/act-led-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/adafruit-st7735r-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/adafruit18-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/adau7002-simple-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ads1015-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ads1115-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ads7846-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/adv7282m-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/adv728x-m-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/akkordion-iqdacplus-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/allo-boss-dac-pcm512x-audio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/allo-boss2-dac-audio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/allo-digione-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/allo-katana-dac-audio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/allo-piano-dac-pcm512x-audio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/allo-piano-dac-plus-pcm512x-audio-overlay.dts + create mode 100755 arch/arm/boot/dts/overlays/anyspi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/apds9960-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/applepi-dac-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/arducam-64mp-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/arducam-pivariety-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/at86rf233-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/audioinjector-addons-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/audioinjector-bare-i2s-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/audioinjector-isolated-soundcard-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/audioinjector-ultra-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/audioinjector-wm8731-audio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/audiosense-pi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/audremap-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/balena-fin-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/camera-mux-2port-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/camera-mux-4port-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/cap1106-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/chipdip-dac-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/cirrus-wm5102-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/cma-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/cutiepi-panel-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dacberry400-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dht11-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dionaudio-kiwi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dionaudio-loco-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dionaudio-loco-v2-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/disable-bt-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/disable-wifi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dpi18-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dpi18cpadhi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dpi24-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/draws-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dwc-otg-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/dwc2-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/edt-ft5406-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/edt-ft5406.dtsi + create mode 100644 arch/arm/boot/dts/overlays/enc28j60-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/enc28j60-spi2-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/exc3000-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/fbtft-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/fe-pi-audio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/fsm-demo-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/gc9a01-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ghost-amp-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/goodix-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/googlevoicehat-soundcard-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/gpio-fan-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/gpio-hog-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/gpio-ir-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/gpio-ir-tx-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/gpio-key-overlay.dts + create mode 100755 arch/arm/boot/dts/overlays/gpio-led-overlay.dts + create mode 100755 arch/arm/boot/dts/overlays/gpio-no-bank0-irq-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/gpio-no-irq-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/gpio-poweroff-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/gpio-shutdown-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hd44780-lcd-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hdmi-backlight-hwhack-gpio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-amp-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-amp100-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-amp3-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-dac-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-dacplusadc-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-dacplusadcpro-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-dacplusdsp-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-dacplushd-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-digi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hifiberry-digi-pro-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/highperi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hy28a-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hy28b-2017-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/hy28b-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i-sabre-q2m-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c-bcm2708-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c-fan-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c-mux-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c-pwm-pca9685a-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c-rtc-common.dtsi + create mode 100644 arch/arm/boot/dts/overlays/i2c-rtc-gpio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts + create mode 100755 arch/arm/boot/dts/overlays/i2c-sensor-common.dtsi + create mode 100755 arch/arm/boot/dts/overlays/i2c-sensor-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c0-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c1-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c3-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c4-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c5-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2c6-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2s-dac-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/i2s-gpio28-31-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ilitek251x-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/imx219-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/imx219.dtsi + create mode 100644 arch/arm/boot/dts/overlays/imx258-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/imx258.dtsi + create mode 100644 arch/arm/boot/dts/overlays/imx290-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/imx290_327-overlay.dtsi + create mode 100644 arch/arm/boot/dts/overlays/imx290_327.dtsi + create mode 100644 arch/arm/boot/dts/overlays/imx296-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/imx327-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/imx378-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/imx462-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/imx477-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/imx477_378-overlay.dtsi + create mode 100644 arch/arm/boot/dts/overlays/imx477_378.dtsi + create mode 100644 arch/arm/boot/dts/overlays/imx519-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/iqaudio-codec-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/iqaudio-digi-wm8804-audio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/iqs550-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/irs1125-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/jedec-spi-nor-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/justboom-both-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/justboom-dac-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/justboom-digi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ltc294x-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/max98357a-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/maxtherm-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mbed-dac-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mcp23017-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mcp23s17-overlay.dts + create mode 100755 arch/arm/boot/dts/overlays/mcp2515-can0-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mcp2515-can1-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mcp2515-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mcp251xfd-overlay.dts + create mode 100755 arch/arm/boot/dts/overlays/mcp3008-overlay.dts + create mode 100755 arch/arm/boot/dts/overlays/mcp3202-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mcp342x-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/media-center-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/merus-amp-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart0-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart1-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart2-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart3-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart4-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart5-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/minipitft13-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/miniuart-bt-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mipi-dbi-spi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mlx90640-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mmc-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mpu6050-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mz61581-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ov2311-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ov2311.dtsi + create mode 100644 arch/arm/boot/dts/overlays/ov5647-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ov5647.dtsi + create mode 100644 arch/arm/boot/dts/overlays/ov7251-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ov7251.dtsi + create mode 100644 arch/arm/boot/dts/overlays/ov9281-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ov9281.dtsi + create mode 100644 arch/arm/boot/dts/overlays/overlay_map.dts + create mode 100644 arch/arm/boot/dts/overlays/papirus-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pca953x-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pcie-32bit-dma-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pibell-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pifacedigital-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pifi-40-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pifi-dac-hd-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pifi-dac-zero-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pifi-mini-210-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/piglow-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/piscreen-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/piscreen2r-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pisound-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pitft22-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pitft28-capacitive-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pitft28-resistive-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pitft35-resistive-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pps-gpio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/proto-codec-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pwm-2chan-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pwm-ir-tx-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/pwm-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/qca7000-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/qca7000-uart0-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ramoops-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ramoops-pi4-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rotary-encoder-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-backlight-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-codeczero-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-dacplus-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-dacpro-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-digiampplus-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-ft5406-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-poe-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-poe-plus-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-sense-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-sense-v2-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rpi-tv-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/rra-digidac1-wm8741-audio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/sainsmart18-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/sc16is750-i2c-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/sc16is752-i2c-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/sc16is752-spi0-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/sc16is752-spi1-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/sdhost-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/sdio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/seeed-can-fd-hat-v1-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/seeed-can-fd-hat-v2-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/sh1106-spi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/si446x-spi0-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/smi-dev-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/smi-nand-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/smi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi-gpio35-39-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi-gpio40-45-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi-rtc-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi0-0cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi0-1cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi0-2cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi1-1cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi1-2cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi1-3cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi2-1cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi2-2cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi2-3cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi3-1cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi3-2cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi4-1cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi4-2cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi5-1cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi5-2cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi6-1cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/spi6-2cs-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ssd1306-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ssd1306-spi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ssd1331-spi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ssd1351-spi-overlay.dts + create mode 100755 arch/arm/boot/dts/overlays/superaudioboard-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/sx150x-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/tc358743-audio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/tc358743-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/tinylcd35-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/tpm-slb9670-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/tpm-slb9673-overlay.dts + create mode 100755 arch/arm/boot/dts/overlays/uart0-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/uart1-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/uart2-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/uart3-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/uart4-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/uart5-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/udrc-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/ugreen-dabboard-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/upstream-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/upstream-pi4-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-fkms-v3d-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-fkms-v3d-pi4-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dpi-generic-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dpi-hyperpixel.dtsi + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dpi-hyperpixel2r-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dpi-hyperpixel4-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dpi-hyperpixel4sq-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dpi-panel-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dpi.dtsi + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dsi-7inch-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dsi-lt070me05000-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-dsi-lt070me05000-v2-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-kippah-7inch-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vc4-kms-vga666-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vga666-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/vl805-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/w1-gpio-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/w1-gpio-pullup-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/w5500-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/watterott-display-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/waveshare-can-fd-hat-mode-a-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/waveshare-can-fd-hat-mode-b-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/wittypi-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/wm8960-soundcard-overlay.dts + create mode 100644 arch/arm64/boot/dts/broadcom/bcm2710-rpi-2-b.dts + create mode 100644 arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts + create mode 100644 arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dts + create mode 100644 arch/arm64/boot/dts/broadcom/bcm2710-rpi-cm3.dts + create mode 100644 arch/arm64/boot/dts/broadcom/bcm2710-rpi-zero-2-w.dts + create mode 100644 arch/arm64/boot/dts/broadcom/bcm2710-rpi-zero-2.dts + create mode 100644 arch/arm64/boot/dts/broadcom/bcm2711-rpi-cm4.dts + create mode 100644 arch/arm64/boot/dts/broadcom/bcm2711-rpi-cm4s.dts + create mode 120000 arch/arm64/boot/dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi + create mode 120000 arch/arm64/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi + create mode 120000 arch/arm64/boot/dts/overlays + create mode 100644 include/dt-bindings/gpio/gpio-fsm.h + +diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile +index 6aa7dc4db2fc..f7d8d09c0a16 100644 +--- a/arch/arm/boot/dts/Makefile ++++ b/arch/arm/boot/dts/Makefile +@@ -1,4 +1,25 @@ + # SPDX-License-Identifier: GPL-2.0 ++ ++dtb-$(CONFIG_ARCH_BCM2835) += \ ++ bcm2708-rpi-b.dtb \ ++ bcm2708-rpi-b-rev1.dtb \ ++ bcm2708-rpi-b-plus.dtb \ ++ bcm2708-rpi-cm.dtb \ ++ bcm2708-rpi-zero.dtb \ ++ bcm2708-rpi-zero-w.dtb \ ++ bcm2710-rpi-zero-2.dtb \ ++ bcm2710-rpi-zero-2-w.dtb \ ++ bcm2709-rpi-2-b.dtb \ ++ bcm2710-rpi-2-b.dtb \ ++ bcm2710-rpi-3-b.dtb \ ++ bcm2710-rpi-3-b-plus.dtb \ ++ bcm2711-rpi-4-b.dtb \ ++ bcm2711-rpi-400.dtb \ ++ bcm2709-rpi-cm2.dtb \ ++ bcm2710-rpi-cm3.dtb \ ++ bcm2711-rpi-cm4.dtb \ ++ bcm2711-rpi-cm4s.dtb ++ + dtb-$(CONFIG_ARCH_ALPINE) += \ + alpine-db.dtb + dtb-$(CONFIG_MACH_ARTPEC6) += \ +@@ -1633,3 +1654,13 @@ dtb-$(CONFIG_ARCH_ASPEED) += \ + aspeed-bmc-vegman-n110.dtb \ + aspeed-bmc-vegman-rx20.dtb \ + aspeed-bmc-vegman-sx20.dtb ++ ++targets += dtbs dtbs_install ++targets += $(dtb-y) ++ ++subdir-y := overlays ++ ++# Enable fixups to support overlays on BCM2835 platforms ++ifeq ($(CONFIG_ARCH_BCM2835),y) ++ DTC_FLAGS += -@ ++endif +diff --git a/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts +new file mode 100644 +index 000000000000..b3b18a7b5fe9 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts +@@ -0,0 +1,200 @@ ++/dts-v1/; ++ ++#include "bcm2708.dtsi" ++#include "bcm2708-rpi.dtsi" ++#include "bcm283x-rpi-smsc9514.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++ ++/ { ++ compatible = "raspberrypi,model-b-plus", "brcm,bcm2835"; ++ model = "Raspberry Pi Model B+"; ++}; ++ ++&gpio { ++ /* ++ * Taken from Raspberry-Pi-B-Plus-V1.2-Schematics.pdf ++ * RPI-BPLUS sheet 1 ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD0", ++ "RXD0", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "SDA0", ++ "SCL0", ++ "NC", /* GPIO30 */ ++ "LAN_RUN", /* GPIO31 */ ++ "CAM_GPIO1", /* GPIO32 */ ++ "NC", /* GPIO33 */ ++ "NC", /* GPIO34 */ ++ "PWR_LOW_N", /* GPIO35 */ ++ "NC", /* GPIO36 */ ++ "NC", /* GPIO37 */ ++ "USB_LIMIT", /* GPIO38 */ ++ "NC", /* GPIO39 */ ++ "PWM0_OUT", /* GPIO40 */ ++ "CAM_GPIO0", /* GPIO41 */ ++ "NC", /* GPIO42 */ ++ "NC", /* GPIO43 */ ++ "ETH_CLK", /* GPIO44 */ ++ "PWM1_OUT", /* GPIO45 */ ++ "HDMI_HPD_N", ++ "STATUS_LED", ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <40 45>; ++ brcm,function = <4>; ++ brcm,pull = <0>; ++ }; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&gpio 47 0>; ++ }; ++ ++ pwr_led: led-pwr { ++ label = "led1"; ++ linux,default-trigger = "input"; ++ gpios = <&gpio 35 0>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 41 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_headphones=0 snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ ++ pwr_led_gpio = <&pwr_led>,"gpios:4"; ++ pwr_led_activelow = <&pwr_led>,"gpios:8"; ++ pwr_led_trigger = <&pwr_led>,"linux,default-trigger"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2708-rpi-b-rev1.dts b/arch/arm/boot/dts/bcm2708-rpi-b-rev1.dts +new file mode 100644 +index 000000000000..50ac75e8d3d9 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708-rpi-b-rev1.dts +@@ -0,0 +1,208 @@ ++/dts-v1/; ++ ++#include "bcm2708.dtsi" ++#include "bcm2708-rpi.dtsi" ++#include "bcm283x-rpi-smsc9512.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++ ++/ { ++ compatible = "raspberrypi,model-b", "brcm,bcm2835"; ++ model = "Raspberry Pi Model B"; ++}; ++ ++&gpio { ++ /* ++ * Taken from Raspberry-Pi-Rev-1.0-Model-AB-Schematics.pdf ++ * RPI00021 sheet 02 ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "SDA0", ++ "SCL0", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "CAM_GPIO1", ++ "LAN_RUN", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "NC", /* GPIO12 */ ++ "NC", /* GPIO13 */ ++ /* Serial port */ ++ "TXD0", ++ "RXD0", ++ "STATUS_LED_N", ++ "GPIO17", ++ "GPIO18", ++ "NC", /* GPIO19 */ ++ "NC", /* GPIO20 */ ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "NC", /* GPIO26 */ ++ "CAM_GPIO0", ++ /* Binary number representing build/revision */ ++ "CONFIG0", ++ "CONFIG1", ++ "CONFIG2", ++ "CONFIG3", ++ "NC", /* GPIO32 */ ++ "NC", /* GPIO33 */ ++ "NC", /* GPIO34 */ ++ "NC", /* GPIO35 */ ++ "NC", /* GPIO36 */ ++ "NC", /* GPIO37 */ ++ "NC", /* GPIO38 */ ++ "NC", /* GPIO39 */ ++ "PWM0_OUT", ++ "NC", /* GPIO41 */ ++ "NC", /* GPIO42 */ ++ "NC", /* GPIO43 */ ++ "NC", /* GPIO44 */ ++ "PWM1_OUT", ++ "HDMI_HPD_P", ++ "SD_CARD_DET", ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <28 29 30 31>; ++ brcm,function = <6>; /* alt2 */ ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <40 45>; ++ brcm,function = <4>; ++ brcm,pull = <0>; ++ }; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++/delete-node/ &i2c0mux; ++ ++i2c0: &i2c0if { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c0_pins>; ++ clock-frequency = <100000>; ++}; ++ ++i2c_csi_dsi: &i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++/ { ++ aliases { ++ i2c0 = &i2c0; ++ }; ++ ++ /* Provide an i2c0mux label to avoid undefined symbols in overlays */ ++ i2c0mux: i2c0mux { ++ }; ++ ++ __overrides__ { ++ i2c0 = <&i2c0>, "status"; ++ }; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&gpio 16 1>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 27 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_headphones=0 snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2708-rpi-b.dts b/arch/arm/boot/dts/bcm2708-rpi-b.dts +new file mode 100644 +index 000000000000..4d7444a31bb6 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts +@@ -0,0 +1,190 @@ ++/dts-v1/; ++ ++#include "bcm2708.dtsi" ++#include "bcm2708-rpi.dtsi" ++#include "bcm283x-rpi-smsc9512.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++ ++/ { ++ compatible = "raspberrypi,model-b", "brcm,bcm2835"; ++ model = "Raspberry Pi Model B"; ++}; ++ ++&gpio { ++ /* ++ * Taken from Raspberry-Pi-Rev-2.0-Model-AB-Schematics.pdf ++ * RPI00022 sheet 02 ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "SDA0", ++ "SCL0", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "CAM_GPIO1", ++ "LAN_RUN", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "NC", /* GPIO12 */ ++ "NC", /* GPIO13 */ ++ /* Serial port */ ++ "TXD0", ++ "RXD0", ++ "STATUS_LED_N", ++ "GPIO17", ++ "GPIO18", ++ "NC", /* GPIO19 */ ++ "NC", /* GPIO20 */ ++ "CAM_GPIO0", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "NC", /* GPIO26 */ ++ "GPIO27", ++ "GPIO28", ++ "GPIO29", ++ "GPIO30", ++ "GPIO31", ++ "NC", /* GPIO32 */ ++ "NC", /* GPIO33 */ ++ "NC", /* GPIO34 */ ++ "NC", /* GPIO35 */ ++ "NC", /* GPIO36 */ ++ "NC", /* GPIO37 */ ++ "NC", /* GPIO38 */ ++ "NC", /* GPIO39 */ ++ "PWM0_OUT", ++ "NC", /* GPIO41 */ ++ "NC", /* GPIO42 */ ++ "NC", /* GPIO43 */ ++ "NC", /* GPIO44 */ ++ "PWM1_OUT", ++ "HDMI_HPD_P", ++ "SD_CARD_DET", ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <28 29 30 31>; ++ brcm,function = <6>; /* alt2 */ ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <40 45>; ++ brcm,function = <4>; ++ brcm,pull = <0>; ++ }; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&gpio 16 1>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 21 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_headphones=0 snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2708-rpi-bt.dtsi b/arch/arm/boot/dts/bcm2708-rpi-bt.dtsi +new file mode 100644 +index 000000000000..a18f80af97d3 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708-rpi-bt.dtsi +@@ -0,0 +1,26 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++&uart0 { ++ bt: bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <3000000>; ++ shutdown-gpios = <&gpio 45 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++ }; ++}; ++ ++&uart1 { ++ minibt: bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <460800>; ++ shutdown-gpios = <&gpio 45 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++ }; ++}; ++ ++/ { ++ __overrides__ { ++ krnbt = <&bt>,"status"; ++ krnbt_baudrate = <&bt>,"max-speed:0"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2708-rpi-cm.dts b/arch/arm/boot/dts/bcm2708-rpi-cm.dts +new file mode 100644 +index 000000000000..6a97189afe58 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708-rpi-cm.dts +@@ -0,0 +1,171 @@ ++/dts-v1/; ++ ++#include "bcm2708-rpi-cm.dtsi" ++#include "bcm283x-rpi-csi0-2lane.dtsi" ++#include "bcm283x-rpi-csi1-4lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++ ++/ { ++ compatible = "raspberrypi,compute-module", "brcm,bcm2835"; ++ model = "Raspberry Pi Compute Module"; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 2 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++}; ++ ++cam0_reg: &cam0_regulator { ++ gpio = <&gpio 30 GPIO_ACTIVE_HIGH>; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&gpio { ++ /* ++ * This is based on the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "GPIO0", ++ "GPIO1", ++ "GPIO2", ++ "GPIO3", ++ "GPIO4", ++ "GPIO5", ++ "GPIO6", ++ "GPIO7", ++ "GPIO8", ++ "GPIO9", ++ "GPIO10", ++ "GPIO11", ++ "GPIO12", ++ "GPIO13", ++ "GPIO14", ++ "GPIO15", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "GPIO28", ++ "GPIO29", ++ "GPIO30", ++ "GPIO31", ++ "GPIO32", ++ "GPIO33", ++ "GPIO34", ++ "GPIO35", ++ "GPIO36", ++ "GPIO37", ++ "GPIO38", ++ "GPIO39", ++ "GPIO40", ++ "GPIO41", ++ "GPIO42", ++ "GPIO43", ++ "GPIO44", ++ "GPIO45", ++ "HDMI_HPD_N", ++ /* Also used as ACT LED */ ++ "EMMC_EN_N", ++ /* Used by eMMC */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins; ++ brcm,function; ++ }; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>; ++}; +diff --git a/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi b/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi +new file mode 100644 +index 000000000000..c7845d2ba7ff +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi +@@ -0,0 +1,22 @@ ++#include "bcm2708.dtsi" ++#include "bcm2708-rpi.dtsi" ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&gpio 47 0>; ++ }; ++}; ++ ++/ { ++ __overrides__ { ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ cam0_reg = <&cam0_reg>,"status"; ++ cam0_reg_gpio = <&cam0_reg>,"gpio:4"; ++ cam1_reg = <&cam1_reg>,"status"; ++ cam1_reg_gpio = <&cam1_reg>,"gpio:4"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts b/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts +new file mode 100644 +index 000000000000..323fa2ebf730 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts +@@ -0,0 +1,246 @@ ++/dts-v1/; ++ ++#include "bcm2708.dtsi" ++#include "bcm2708-rpi.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++#include "bcm2708-rpi-bt.dtsi" ++ ++/ { ++ compatible = "raspberrypi,model-zero-w", "brcm,bcm2835"; ++ model = "Raspberry Pi Zero W"; ++ ++ chosen { ++ bootargs = "coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_headphones=0"; ++ }; ++ ++ aliases { ++ serial0 = &uart1; ++ serial1 = &uart0; ++ mmc1 = &mmcnr; ++ }; ++}; ++ ++&gpio { ++ /* ++ * This is based on the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD1", ++ "RXD1", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "SDA0", ++ "SCL0", ++ /* Used by BT module */ ++ "CTS0", ++ "RTS0", ++ "TXD0", ++ "RXD0", ++ /* Used by Wifi */ ++ "SD1_CLK", ++ "SD1_CMD", ++ "SD1_DATA0", ++ "SD1_DATA1", ++ "SD1_DATA2", ++ "SD1_DATA3", ++ "CAM_GPIO1", /* GPIO40 */ ++ "WL_ON", /* GPIO41 */ ++ "NC", /* GPIO42 */ ++ "WIFI_CLK", /* GPIO43 */ ++ "CAM_GPIO0", /* GPIO44 */ ++ "BT_ON", /* GPIO45 */ ++ "HDMI_HPD_N", ++ "STATUS_LED_N", ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = <7>; /* ALT3 = SD1 */ ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ bt_pins: bt_pins { ++ brcm,pins = <43>; ++ brcm,function = <4>; /* alt0:GPCLK2 */ ++ brcm,pull = <0>; /* none */ ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins = <30 31 32 33>; ++ brcm,function = <7>; /* alt3=UART0 */ ++ brcm,pull = <2 0 0 2>; /* up none none up */ ++ }; ++ ++ uart1_pins: uart1_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <>; ++ brcm,function = <>; ++ }; ++}; ++ ++&mmcnr { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdio_pins>; ++ bus-width = <4>; ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ brcmf: wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ }; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_pins &bt_pins>; ++ status = "okay"; ++}; ++ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart1_pins>; ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "actpwr"; ++ gpios = <&gpio 47 GPIO_ACTIVE_LOW>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 44 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2708-rpi-zero.dts b/arch/arm/boot/dts/bcm2708-rpi-zero.dts +new file mode 100644 +index 000000000000..406f945d4093 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708-rpi-zero.dts +@@ -0,0 +1,187 @@ ++/dts-v1/; ++ ++#include "bcm2708.dtsi" ++#include "bcm2708-rpi.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++ ++/ { ++ compatible = "raspberrypi,model-zero", "brcm,bcm2835"; ++ model = "Raspberry Pi Zero"; ++}; ++ ++&gpio { ++ /* ++ * This is based on the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD0", ++ "RXD0", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "SDA0", ++ "SCL0", ++ "NC", /* GPIO30 */ ++ "NC", /* GPIO31 */ ++ "CAM_GPIO1", /* GPIO32 */ ++ "NC", /* GPIO33 */ ++ "NC", /* GPIO34 */ ++ "NC", /* GPIO35 */ ++ "NC", /* GPIO36 */ ++ "NC", /* GPIO37 */ ++ "NC", /* GPIO38 */ ++ "NC", /* GPIO39 */ ++ "NC", /* GPIO40 */ ++ "CAM_GPIO0", /* GPIO41 */ ++ "NC", /* GPIO42 */ ++ "NC", /* GPIO43 */ ++ "NC", /* GPIO44 */ ++ "NC", /* GPIO45 */ ++ "HDMI_HPD_N", ++ "STATUS_LED_N", ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <>; ++ brcm,function = <>; ++ }; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "actpwr"; ++ gpios = <&gpio 47 GPIO_ACTIVE_LOW>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 41 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2708-rpi.dtsi b/arch/arm/boot/dts/bcm2708-rpi.dtsi +new file mode 100644 +index 000000000000..f774eda1ae55 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708-rpi.dtsi +@@ -0,0 +1,40 @@ ++/* Downstream modifications common to bcm2835, bcm2836, bcm2837 */ ++ ++#define i2c0 i2c0mux ++#include "bcm2835-rpi.dtsi" ++#undef i2c0 ++#include "bcm270x-rpi.dtsi" ++ ++/ { ++ memory@0 { ++ device_type = "memory"; ++ reg = <0x0 0x0>; ++ }; ++ ++ aliases { ++ i2c2 = &i2c2; ++ }; ++ ++ __overrides__ { ++ hdmi = <&hdmi>,"status"; ++ i2c2_iknowwhatimdoing = <&i2c2>,"status"; ++ i2c2_baudrate = <&i2c2>,"clock-frequency:0"; ++ sd = <&sdhost>,"status"; ++ sd_poll_once = <&sdhost>,"non-removable?"; ++ }; ++}; ++ ++&sdhost { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdhost_gpio48>; ++ status = "okay"; ++}; ++ ++&hdmi { ++ power-domains = <&power RPI_POWER_DOMAIN_HDMI>; ++ status = "disabled"; ++}; ++ ++&i2c2 { ++ status = "disabled"; ++}; +diff --git a/arch/arm/boot/dts/bcm2708.dtsi b/arch/arm/boot/dts/bcm2708.dtsi +new file mode 100644 +index 000000000000..b3cf34cdcc0e +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2708.dtsi +@@ -0,0 +1,18 @@ ++#define i2c0 i2c0if ++#include "bcm2835.dtsi" ++#undef i2c0 ++#include "bcm270x.dtsi" ++ ++/ { ++ __overrides__ { ++ arm_freq; ++ }; ++}; ++ ++&soc { ++ dma-ranges = <0x80000000 0x00000000 0x20000000>; ++}; ++ ++&vc4 { ++ status = "disabled"; ++}; +diff --git a/arch/arm/boot/dts/bcm2709-rpi-2-b.dts b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts +new file mode 100644 +index 000000000000..c6220e6d5fbc +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts +@@ -0,0 +1,200 @@ ++/dts-v1/; ++ ++#include "bcm2709.dtsi" ++#include "bcm2709-rpi.dtsi" ++#include "bcm283x-rpi-smsc9514.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++ ++/ { ++ compatible = "raspberrypi,2-model-b", "brcm,bcm2836"; ++ model = "Raspberry Pi 2 Model B"; ++}; ++ ++&gpio { ++ /* ++ * Taken from rpi_SCH_2b_1p2_reduced.pdf and ++ * the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD0", ++ "RXD0", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "SDA0", ++ "SCL0", ++ "NC", /* GPIO30 */ ++ "LAN_RUN", ++ "CAM_GPIO1", ++ "NC", /* GPIO33 */ ++ "NC", /* GPIO34 */ ++ "PWR_LOW_N", ++ "NC", /* GPIO36 */ ++ "NC", /* GPIO37 */ ++ "USB_LIMIT", ++ "NC", /* GPIO39 */ ++ "PWM0_OUT", ++ "CAM_GPIO0", ++ "SMPS_SCL", ++ "SMPS_SDA", ++ "ETH_CLK", ++ "PWM1_OUT", ++ "HDMI_HPD_N", ++ "STATUS_LED", ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <40 45>; ++ brcm,function = <4>; ++ brcm,pull = <0>; ++ }; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&gpio 47 0>; ++ }; ++ ++ pwr_led: led-pwr { ++ label = "led1"; ++ linux,default-trigger = "input"; ++ gpios = <&gpio 35 0>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 41 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_headphones=0 snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ ++ pwr_led_gpio = <&pwr_led>,"gpios:4"; ++ pwr_led_activelow = <&pwr_led>,"gpios:8"; ++ pwr_led_trigger = <&pwr_led>,"linux,default-trigger"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2709-rpi-cm2.dts b/arch/arm/boot/dts/bcm2709-rpi-cm2.dts +new file mode 100644 +index 000000000000..c9e47c46f4f7 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2709-rpi-cm2.dts +@@ -0,0 +1,221 @@ ++/dts-v1/; ++ ++#include "bcm2709.dtsi" ++#include "bcm2709-rpi.dtsi" ++#include "bcm283x-rpi-csi0-2lane.dtsi" ++#include "bcm283x-rpi-csi1-4lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++ ++/ { ++ compatible = "raspberrypi,2-compute-module", "brcm,bcm2836"; ++ model = "Raspberry Pi Compute Module 2"; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 2 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++}; ++ ++cam0_reg: &cam0_regulator { ++ gpio = <&gpio 30 GPIO_ACTIVE_HIGH>; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&gpio { ++ /* ++ * This is based on the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "GPIO0", ++ "GPIO1", ++ "GPIO2", ++ "GPIO3", ++ "GPIO4", ++ "GPIO5", ++ "GPIO6", ++ "GPIO7", ++ "GPIO8", ++ "GPIO9", ++ "GPIO10", ++ "GPIO11", ++ "GPIO12", ++ "GPIO13", ++ "GPIO14", ++ "GPIO15", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "GPIO28", ++ "GPIO29", ++ "GPIO30", ++ "GPIO31", ++ "GPIO32", ++ "GPIO33", ++ "GPIO34", ++ "GPIO35", ++ "GPIO36", ++ "GPIO37", ++ "GPIO38", ++ "GPIO39", ++ "GPIO40", ++ "GPIO41", ++ "GPIO42", ++ "GPIO43", ++ "GPIO44", ++ "GPIO45", ++ "SMPS_SCL", ++ "SMPS_SDA", ++ /* Used by eMMC */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins; ++ brcm,function; ++ }; ++}; ++ ++&soc { ++ virtgpio: virtgpio { ++ compatible = "brcm,bcm2835-virtgpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++ ++}; ++ ++&firmware { ++ expgpio: expgpio { ++ compatible = "raspberrypi,firmware-gpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ gpio-line-names = "HDMI_HPD_N", ++ "EMMC_EN_N", ++ "NC", ++ "NC", ++ "NC", ++ "NC", ++ "NC", ++ "NC"; ++ status = "okay"; ++ }; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&virtgpio 0 0>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&expgpio 0 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ cam0_reg = <&cam0_reg>,"status"; ++ cam0_reg_gpio = <&cam0_reg>,"gpio:4"; ++ cam1_reg = <&cam1_reg>,"status"; ++ cam1_reg_gpio = <&cam1_reg>,"gpio:4"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2709-rpi.dtsi b/arch/arm/boot/dts/bcm2709-rpi.dtsi +new file mode 100644 +index 000000000000..babfa41cd9f7 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2709-rpi.dtsi +@@ -0,0 +1,5 @@ ++#include "bcm2708-rpi.dtsi" ++ ++&vchiq { ++ compatible = "brcm,bcm2836-vchiq", "brcm,bcm2835-vchiq"; ++}; +diff --git a/arch/arm/boot/dts/bcm2709.dtsi b/arch/arm/boot/dts/bcm2709.dtsi +new file mode 100644 +index 000000000000..e195f7247813 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2709.dtsi +@@ -0,0 +1,24 @@ ++#define i2c0 i2c0if ++#include "bcm2836.dtsi" ++#undef i2c0 ++#include "bcm270x.dtsi" ++ ++/ { ++ soc { ++ ranges = <0x7e000000 0x3f000000 0x01000000>, ++ <0x40000000 0x40000000 0x00040000>; ++ ++ /delete-node/ timer@7e003000; ++ }; ++ ++ __overrides__ { ++ arm_freq = <&v7_cpu0>, "clock-frequency:0", ++ <&v7_cpu1>, "clock-frequency:0", ++ <&v7_cpu2>, "clock-frequency:0", ++ <&v7_cpu3>, "clock-frequency:0"; ++ }; ++}; ++ ++&vc4 { ++ status = "disabled"; ++}; +diff --git a/arch/arm/boot/dts/bcm270x-rpi.dtsi b/arch/arm/boot/dts/bcm270x-rpi.dtsi +new file mode 100644 +index 000000000000..1401d7b261f8 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm270x-rpi.dtsi +@@ -0,0 +1,177 @@ ++/* Downstream modifications to bcm2835-rpi.dtsi */ ++ ++/ { ++ aliases { ++ aux = &aux; ++ sound = &sound; ++ soc = &soc; ++ dma = &dma; ++ intc = &intc; ++ watchdog = &watchdog; ++ random = &random; ++ mailbox = &mailbox; ++ gpio = &gpio; ++ uart0 = &uart0; ++ uart1 = &uart1; ++ sdhost = &sdhost; ++ mmc = &mmc; ++ mmc1 = &mmc; ++ mmc0 = &sdhost; ++ i2s = &i2s; ++ i2c0 = &i2c0; ++ i2c1 = &i2c1; ++ i2c10 = &i2c_csi_dsi; ++ spi0 = &spi0; ++ spi1 = &spi1; ++ spi2 = &spi2; ++ usb = &usb; ++ leds = &leds; ++ fb = &fb; ++ thermal = &thermal; ++ axiperf = &axiperf; ++ }; ++ ++ /* Define these notional regulators for use by overlays */ ++ vdd_3v3_reg: fixedregulator_3v3 { ++ compatible = "regulator-fixed"; ++ regulator-always-on; ++ regulator-max-microvolt = <3300000>; ++ regulator-min-microvolt = <3300000>; ++ regulator-name = "3v3"; ++ }; ++ ++ vdd_5v0_reg: fixedregulator_5v0 { ++ compatible = "regulator-fixed"; ++ regulator-always-on; ++ regulator-max-microvolt = <5000000>; ++ regulator-min-microvolt = <5000000>; ++ regulator-name = "5v0"; ++ }; ++ ++ leds: leds { ++ compatible = "gpio-leds"; ++ }; ++ ++ soc { ++ gpiomem { ++ compatible = "brcm,bcm2835-gpiomem"; ++ reg = <0x7e200000 0x1000>; ++ }; ++ ++ fb: fb { ++ compatible = "brcm,bcm2708-fb"; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++ ++ /* External sound card */ ++ sound: sound { ++ status = "disabled"; ++ }; ++ }; ++ ++ __overrides__ { ++ cache_line_size; ++ ++ uart0 = <&uart0>,"status"; ++ uart1 = <&uart1>,"status"; ++ i2s = <&i2s>,"status"; ++ spi = <&spi0>,"status"; ++ i2c0 = <&i2c0if>,"status",<&i2c0mux>,"status"; ++ i2c1 = <&i2c1>,"status"; ++ i2c0_baudrate = <&i2c0if>,"clock-frequency:0"; ++ i2c1_baudrate = <&i2c1>,"clock-frequency:0"; ++ ++ watchdog = <&watchdog>,"status"; ++ random = <&random>,"status"; ++ sd_overclock = <&sdhost>,"brcm,overclock-50:0"; ++ sd_force_pio = <&sdhost>,"brcm,force-pio?"; ++ sd_pio_limit = <&sdhost>,"brcm,pio-limit:0"; ++ sd_debug = <&sdhost>,"brcm,debug"; ++ sdio_overclock = <&mmc>,"brcm,overclock-50:0", ++ <&mmcnr>,"brcm,overclock-50:0"; ++ axiperf = <&axiperf>,"status"; ++ }; ++}; ++ ++&uart0 { ++ skip-init; ++}; ++ ++&uart1 { ++ skip-init; ++}; ++ ++&txp { ++ status = "disabled"; ++}; ++ ++&i2c0if { ++ status = "disabled"; ++}; ++ ++&i2c0mux { ++ pinctrl-names = "i2c0", "i2c_csi_dsi"; ++ /delete-property/ clock-frequency; ++ status = "disabled"; ++}; ++ ++&i2c1 { ++ status = "disabled"; ++}; ++ ++&clocks { ++ firmware = <&firmware>; ++}; ++ ++&sdhci { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&emmc_gpio48>; ++ bus-width = <4>; ++}; ++ ++&cpu_thermal { ++ // Add some labels ++ thermal_trips: trips { ++ cpu-crit { ++ // Raise upstream limit of 90C ++ temperature = <110000>; ++ }; ++ }; ++ cooling_maps: cooling-maps { ++ }; ++}; ++ ++&vec { ++ clocks = <&firmware_clocks 15>; ++ status = "disabled"; ++}; ++ ++&firmware { ++#ifndef BCM2711 ++ firmware_clocks: clocks { ++ compatible = "raspberrypi,firmware-clocks"; ++ #clock-cells = <1>; ++ }; ++#endif ++ ++ vcio: vcio { ++ compatible = "raspberrypi,vcio"; ++ }; ++}; ++ ++&vc4 { ++ raspberrypi,firmware = <&firmware>; ++}; ++ ++#ifndef BCM2711 ++ ++&hdmi { ++ reg-names = "hdmi", ++ "hd"; ++ clocks = <&firmware_clocks 9>, ++ <&firmware_clocks 13>; ++ dmas = <&dma (17|(1<<27)|(1<<24))>; ++}; ++ ++#endif +diff --git a/arch/arm/boot/dts/bcm270x.dtsi b/arch/arm/boot/dts/bcm270x.dtsi +new file mode 100644 +index 000000000000..bb8e7a9d1b22 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm270x.dtsi +@@ -0,0 +1,294 @@ ++/* Downstream bcm283x.dtsi diff */ ++#include ++ ++/ { ++ chosen: chosen { ++ // Disable audio by default ++ bootargs = "coherent_pool=1M snd_bcm2835.enable_headphones=0"; ++ /delete-property/ stdout-path; ++ }; ++ ++ soc: soc { ++ watchdog: watchdog@7e100000 { ++ /* Add label */ ++ }; ++ ++ random: rng@7e104000 { ++ /* Add label */ ++ }; ++ ++ spi0: spi@7e204000 { ++ /* Add label */ ++ }; ++ ++#ifndef BCM2711 ++ pixelvalve0: pixelvalve@7e206000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++ ++ pixelvalve1: pixelvalve@7e207000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++#endif ++ ++ /delete-node/ mmc@7e300000; ++ ++ sdhci: mmc: mmc@7e300000 { ++ compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci"; ++ reg = <0x7e300000 0x100>; ++ interrupts = <2 30>; ++ clocks = <&clocks BCM2835_CLOCK_EMMC>; ++ dmas = <&dma 11>; ++ dma-names = "rx-tx"; ++ brcm,overclock-50 = <0>; ++ status = "disabled"; ++ }; ++ ++ /* A clone of mmc but with non-removable set */ ++ mmcnr: mmcnr@7e300000 { ++ compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci"; ++ reg = <0x7e300000 0x100>; ++ interrupts = <2 30>; ++ clocks = <&clocks BCM2835_CLOCK_EMMC>; ++ dmas = <&dma 11>; ++ dma-names = "rx-tx"; ++ brcm,overclock-50 = <0>; ++ non-removable; ++ status = "disabled"; ++ }; ++ ++ hvs: hvs@7e400000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++ ++ firmwarekms: firmwarekms@7e600000 { ++ compatible = "raspberrypi,rpi-firmware-kms"; ++ /* SMI interrupt reg */ ++ reg = <0x7e600000 0x100>; ++ interrupts = <2 16>; ++ brcm,firmware = <&firmware>; ++ status = "disabled"; ++ }; ++ ++ smi: smi@7e600000 { ++ compatible = "brcm,bcm2835-smi"; ++ reg = <0x7e600000 0x100>; ++ interrupts = <2 16>; ++ clocks = <&clocks BCM2835_CLOCK_SMI>; ++ assigned-clocks = <&clocks BCM2835_CLOCK_SMI>; ++ assigned-clock-rates = <125000000>; ++ dmas = <&dma 4>; ++ dma-names = "rx-tx"; ++ status = "disabled"; ++ }; ++ ++ csi0: csi@7e800000 { ++ compatible = "brcm,bcm2835-unicam"; ++ reg = <0x7e800000 0x800>, ++ <0x7e802000 0x4>; ++ interrupts = <2 6>; ++ clocks = <&clocks BCM2835_CLOCK_CAM0>, ++ <&firmware_clocks 4>; ++ clock-names = "lp", "vpu"; ++ power-domains = <&power RPI_POWER_DOMAIN_UNICAM0>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ status = "disabled"; ++ }; ++ ++ csi1: csi@7e801000 { ++ compatible = "brcm,bcm2835-unicam"; ++ reg = <0x7e801000 0x800>, ++ <0x7e802004 0x4>; ++ interrupts = <2 7>; ++ clocks = <&clocks BCM2835_CLOCK_CAM1>, ++ <&firmware_clocks 4>; ++ clock-names = "lp", "vpu"; ++ power-domains = <&power RPI_POWER_DOMAIN_UNICAM1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ status = "disabled"; ++ }; ++ ++#ifndef BCM2711 ++ pixelvalve2: pixelvalve@7e807000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++#endif ++ ++ hdmi@7e902000 { /* hdmi */ ++ status = "disabled"; ++ }; ++ ++ usb@7e980000 { /* usb */ ++ compatible = "brcm,bcm2708-usb"; ++ reg = <0x7e980000 0x10000>, ++ <0x7e006000 0x1000>; ++ interrupt-names = "usb", ++ "soft"; ++ interrupts = <1 9>, ++ <2 0>; ++ }; ++ ++#ifndef BCM2711 ++ v3d@7ec00000 { /* vd3 */ ++ compatible = "brcm,vc4-v3d"; ++ power-domains = <&power RPI_POWER_DOMAIN_V3D>; ++ status = "disabled"; ++ }; ++#endif ++ ++ axiperf: axiperf { ++ compatible = "brcm,bcm2835-axiperf"; ++ reg = <0x7e009800 0x100>, ++ <0x7ee08000 0x100>; ++ firmware = <&firmware>; ++ status = "disabled"; ++ }; ++ ++ i2c0mux: i2c0mux { ++ compatible = "i2c-mux-pinctrl"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ i2c-parent = <&i2c0if>; ++ ++ status = "disabled"; ++ ++ i2c0: i2c@0 { ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ ++ i2c_csi_dsi: i2c@1 { ++ reg = <1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ }; ++ }; ++ ++ cam1_reg: cam1_regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "cam1-reg"; ++ enable-active-high; ++ /* Needs to be enabled, as removing a regulator is very unsafe */ ++ status = "okay"; ++ }; ++ ++ cam1_clk: cam1_clk { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ cam0_regulator: cam0_regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "cam0-reg"; ++ enable-active-high; ++ status = "disabled"; ++ }; ++ ++ cam0_clk: cam0_clk { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ cam_dummy_reg: cam_dummy_reg { ++ compatible = "regulator-fixed"; ++ regulator-name = "cam-dummy-reg"; ++ status = "okay"; ++ }; ++ ++ __overrides__ { ++ cam0-pwdn-ctrl; ++ cam0-pwdn; ++ cam0-led-ctrl; ++ cam0-led; ++ }; ++}; ++ ++&gpio { ++ interrupts = <2 17>, <2 18>; ++ ++ dpi_18bit_cpadhi_gpio0: dpi_18bit_cpadhi_gpio0 { ++ brcm,pins = <0 1 2 3 4 5 6 7 8 9 ++ 12 13 14 15 16 17 ++ 20 21 22 23 24 25>; ++ brcm,function = ; ++ brcm,pull = <0>; /* no pull */ ++ }; ++ dpi_18bit_cpadhi_gpio2: dpi_18bit_cpadhi_gpio2 { ++ brcm,pins = <2 3 4 5 6 7 8 9 ++ 12 13 14 15 16 17 ++ 20 21 22 23 24 25>; ++ brcm,function = ; ++ }; ++ dpi_18bit_gpio0: dpi_18bit_gpio0 { ++ brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19 ++ 20 21>; ++ brcm,function = ; ++ }; ++ dpi_18bit_gpio2: dpi_18bit_gpio2 { ++ brcm,pins = <2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19 ++ 20 21>; ++ brcm,function = ; ++ }; ++ dpi_16bit_gpio0: dpi_16bit_gpio0 { ++ brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19>; ++ brcm,function = ; ++ }; ++ dpi_16bit_gpio2: dpi_16bit_gpio2 { ++ brcm,pins = <2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19>; ++ brcm,function = ; ++ }; ++ dpi_16bit_cpadhi_gpio0: dpi_16bit_cpadhi_gpio0 { ++ brcm,pins = <0 1 2 3 4 5 6 7 8 ++ 12 13 14 15 16 17 ++ 20 21 22 23 24>; ++ brcm,function = ; ++ }; ++ dpi_16bit_cpadhi_gpio2: dpi_16bit_cpadhi_gpio2 { ++ brcm,pins = <2 3 4 5 6 7 8 ++ 12 13 14 15 16 17 ++ 20 21 22 23 24>; ++ brcm,function = ; ++ }; ++}; ++ ++&uart0 { ++ /* Enable CTS bug workaround */ ++ cts-event-workaround; ++}; ++ ++&i2s { ++ #sound-dai-cells = <0>; ++ dmas = <&dma 2>, <&dma 3>; ++ dma-names = "tx", "rx"; ++}; ++ ++&sdhost { ++ dmas = <&dma (13|(1<<29))>; ++ dma-names = "rx-tx"; ++ bus-width = <4>; ++ brcm,overclock-50 = <0>; ++ brcm,pio-limit = <1>; ++ firmware = <&firmware>; ++}; ++ ++&spi0 { ++ dmas = <&dma 6>, <&dma 7>; ++ dma-names = "tx", "rx"; ++}; +diff --git a/arch/arm/boot/dts/bcm2710-rpi-2-b.dts b/arch/arm/boot/dts/bcm2710-rpi-2-b.dts +new file mode 100644 +index 000000000000..c77ff30aa738 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2710-rpi-2-b.dts +@@ -0,0 +1,200 @@ ++/dts-v1/; ++ ++#include "bcm2710.dtsi" ++#include "bcm2709-rpi.dtsi" ++#include "bcm283x-rpi-smsc9514.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++ ++/ { ++ compatible = "raspberrypi,2-model-b-rev2", "brcm,bcm2837"; ++ model = "Raspberry Pi 2 Model B rev 1.2"; ++}; ++ ++&gpio { ++ /* ++ * Taken from rpi_SCH_2b_1p2_reduced.pdf and ++ * the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD0", ++ "RXD0", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "SDA0", ++ "SCL0", ++ "NC", /* GPIO30 */ ++ "LAN_RUN", ++ "CAM_GPIO1", ++ "NC", /* GPIO33 */ ++ "NC", /* GPIO34 */ ++ "PWR_LOW_N", ++ "NC", /* GPIO36 */ ++ "NC", /* GPIO37 */ ++ "USB_LIMIT", ++ "NC", /* GPIO39 */ ++ "PWM0_OUT", ++ "CAM_GPIO0", ++ "SMPS_SCL", ++ "SMPS_SDA", ++ "ETH_CLK", ++ "PWM1_OUT", ++ "HDMI_HPD_N", ++ "STATUS_LED", ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <40 45>; ++ brcm,function = <4>; ++ brcm,pull = <0>; ++ }; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&gpio 47 0>; ++ }; ++ ++ pwr_led: led-pwr { ++ label = "led1"; ++ linux,default-trigger = "input"; ++ gpios = <&gpio 35 0>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 41 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_headphones=0 snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ ++ pwr_led_gpio = <&pwr_led>,"gpios:4"; ++ pwr_led_activelow = <&pwr_led>,"gpios:8"; ++ pwr_led_trigger = <&pwr_led>,"linux,default-trigger"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts +new file mode 100644 +index 000000000000..04621bd197c3 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts +@@ -0,0 +1,289 @@ ++/dts-v1/; ++ ++#include "bcm2710.dtsi" ++#include "bcm2709-rpi.dtsi" ++#include "bcm283x-rpi-lan7515.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_44.dtsi" ++#include "bcm271x-rpi-bt.dtsi" ++ ++/ { ++ compatible = "raspberrypi,3-model-b-plus", "brcm,bcm2837"; ++ model = "Raspberry Pi 3 Model B+"; ++ ++ chosen { ++ bootargs = "coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_headphones=0"; ++ }; ++ ++ aliases { ++ serial0 = &uart1; ++ serial1 = &uart0; ++ mmc1 = &mmcnr; ++ }; ++}; ++ ++&gpio { ++ /* ++ * Taken from rpi_SCH_3bplus_1p0_reduced.pdf and ++ * the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD1", ++ "RXD1", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "HDMI_HPD_N", ++ "STATUS_LED_G", ++ /* Used by BT module */ ++ "CTS0", ++ "RTS0", ++ "TXD0", ++ "RXD0", ++ /* Used by Wifi */ ++ "SD1_CLK", ++ "SD1_CMD", ++ "SD1_DATA0", ++ "SD1_DATA1", ++ "SD1_DATA2", ++ "SD1_DATA3", ++ "PWM0_OUT", ++ "PWM1_OUT", ++ "ETH_CLK", ++ "WIFI_CLK", ++ "SDA0", ++ "SCL0", ++ "SMPS_SCL", ++ "SMPS_SDA", ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = <7>; // alt3 = SD1 ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ bt_pins: bt_pins { ++ brcm,pins = <43>; ++ brcm,function = <4>; /* alt0:GPCLK2 */ ++ brcm,pull = <0>; ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins = <32 33>; ++ brcm,function = <7>; /* alt3=UART0 */ ++ brcm,pull = <0 2>; ++ }; ++ ++ uart1_pins: uart1_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <40 41>; ++ brcm,function = <4>; ++ brcm,pull = <0>; ++ }; ++}; ++ ++&mmcnr { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdio_pins>; ++ bus-width = <4>; ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ brcmf: wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ }; ++}; ++ ++&firmware { ++ expgpio: expgpio { ++ compatible = "raspberrypi,firmware-gpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ gpio-line-names = "BT_ON", ++ "WL_ON", ++ "PWR_LED_R", ++ "LAN_RUN", ++ "NC", ++ "CAM_GPIO0", ++ "CAM_GPIO1", ++ "NC"; ++ status = "okay"; ++ }; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_pins &bt_pins>; ++ status = "okay"; ++}; ++ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart1_pins>; ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&gpio 29 0>; ++ }; ++ ++ pwr_led: led-pwr { ++ label = "led1"; ++ linux,default-trigger = "default-on"; ++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 28 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++ð_phy { ++ microchip,eee-enabled; ++ microchip,tx-lpi-timer = <600>; /* non-aggressive*/ ++ microchip,downshift-after = <2>; ++}; ++ ++&cam1_reg { ++ gpio = <&expgpio 5 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_headphones=0 snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ ++ pwr_led_gpio = <&pwr_led>,"gpios:4"; ++ pwr_led_activelow = <&pwr_led>,"gpios:8"; ++ pwr_led_trigger = <&pwr_led>,"linux,default-trigger"; ++ ++ eee = <ð_phy>,"microchip,eee-enabled?"; ++ tx_lpi_timer = <ð_phy>,"microchip,tx-lpi-timer:0"; ++ eth_led0 = <ð_phy>,"microchip,led-modes:0"; ++ eth_led1 = <ð_phy>,"microchip,led-modes:4"; ++ eth_downshift_after = <ð_phy>,"microchip,downshift-after:0"; ++ eth_max_speed = <ð_phy>,"max-speed:0"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts +new file mode 100644 +index 000000000000..e0b233562c03 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts +@@ -0,0 +1,291 @@ ++/dts-v1/; ++ ++#include "bcm2710.dtsi" ++#include "bcm2709-rpi.dtsi" ++#include "bcm283x-rpi-smsc9514.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_44.dtsi" ++#include "bcm271x-rpi-bt.dtsi" ++ ++/ { ++ compatible = "raspberrypi,3-model-b", "brcm,bcm2837"; ++ model = "Raspberry Pi 3 Model B"; ++ ++ chosen { ++ bootargs = "coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_headphones=0"; ++ }; ++ ++ aliases { ++ serial0 = &uart1; ++ serial1 = &uart0; ++ mmc1 = &mmcnr; ++ }; ++}; ++ ++&gpio { ++ /* ++ * Taken from rpi_SCH_3b_1p2_reduced.pdf and ++ * the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD1", ++ "RXD1", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "NC", /* GPIO 28 */ ++ "LAN_RUN_BOOT", ++ /* Used by BT module */ ++ "CTS0", ++ "RTS0", ++ "TXD0", ++ "RXD0", ++ /* Used by Wifi */ ++ "SD1_CLK", ++ "SD1_CMD", ++ "SD1_DATA0", ++ "SD1_DATA1", ++ "SD1_DATA2", ++ "SD1_DATA3", ++ "PWM0_OUT", ++ "PWM1_OUT", ++ "ETH_CLK", ++ "WIFI_CLK", ++ "SDA0", ++ "SCL0", ++ "SMPS_SCL", ++ "SMPS_SDA", ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = <7>; // alt3 = SD1 ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ bt_pins: bt_pins { ++ brcm,pins = <43>; ++ brcm,function = <4>; /* alt0:GPCLK2 */ ++ brcm,pull = <0>; ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins = <32 33>; ++ brcm,function = <7>; /* alt3=UART0 */ ++ brcm,pull = <0 2>; ++ }; ++ ++ uart1_pins: uart1_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <40 41>; ++ brcm,function = <4>; ++ brcm,pull = <0>; ++ }; ++}; ++ ++&mmcnr { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdio_pins>; ++ bus-width = <4>; ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ brcmf: wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ }; ++}; ++ ++&soc { ++ virtgpio: virtgpio { ++ compatible = "brcm,bcm2835-virtgpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++ ++}; ++ ++&firmware { ++ expgpio: expgpio { ++ compatible = "raspberrypi,firmware-gpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ gpio-line-names = "BT_ON", ++ "WL_ON", ++ "STATUS_LED", ++ "LAN_RUN", ++ "HDMI_HPD_N", ++ "CAM_GPIO0", ++ "CAM_GPIO1", ++ "PWR_LOW_N"; ++ status = "okay"; ++ }; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_pins &bt_pins>; ++ status = "okay"; ++}; ++ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart1_pins>; ++ status = "okay"; ++}; ++ ++&bt { ++ max-speed = <921600>; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&virtgpio 0 0>; ++ }; ++ ++ pwr_led: led-pwr { ++ label = "led1"; ++ linux,default-trigger = "input"; ++ gpios = <&expgpio 7 0>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&expgpio 4 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&expgpio 5 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_headphones=0 snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ ++ pwr_led_gpio = <&pwr_led>,"gpios:4"; ++ pwr_led_activelow = <&pwr_led>,"gpios:8"; ++ pwr_led_trigger = <&pwr_led>,"linux,default-trigger"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2710-rpi-cm3.dts b/arch/arm/boot/dts/bcm2710-rpi-cm3.dts +new file mode 100644 +index 000000000000..5b9b44e0f30e +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2710-rpi-cm3.dts +@@ -0,0 +1,220 @@ ++/dts-v1/; ++ ++#include "bcm2710.dtsi" ++#include "bcm2709-rpi.dtsi" ++#include "bcm283x-rpi-csi0-2lane.dtsi" ++#include "bcm283x-rpi-csi1-4lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++/ { ++ compatible = "raspberrypi,3-compute-module", "brcm,bcm2837"; ++ model = "Raspberry Pi Compute Module 3"; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 2 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++}; ++ ++cam0_reg: &cam0_regulator { ++ gpio = <&gpio 30 GPIO_ACTIVE_HIGH>; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&gpio { ++ /* ++ * This is based on the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "GPIO0", ++ "GPIO1", ++ "GPIO2", ++ "GPIO3", ++ "GPIO4", ++ "GPIO5", ++ "GPIO6", ++ "GPIO7", ++ "GPIO8", ++ "GPIO9", ++ "GPIO10", ++ "GPIO11", ++ "GPIO12", ++ "GPIO13", ++ "GPIO14", ++ "GPIO15", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "GPIO28", ++ "GPIO29", ++ "GPIO30", ++ "GPIO31", ++ "GPIO32", ++ "GPIO33", ++ "GPIO34", ++ "GPIO35", ++ "GPIO36", ++ "GPIO37", ++ "GPIO38", ++ "GPIO39", ++ "GPIO40", ++ "GPIO41", ++ "GPIO42", ++ "GPIO43", ++ "GPIO44", ++ "GPIO45", ++ "SMPS_SCL", ++ "SMPS_SDA", ++ /* Used by eMMC */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins; ++ brcm,function; ++ }; ++}; ++ ++&soc { ++ virtgpio: virtgpio { ++ compatible = "brcm,bcm2835-virtgpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++ ++}; ++ ++&firmware { ++ expgpio: expgpio { ++ compatible = "raspberrypi,firmware-gpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ gpio-line-names = "HDMI_HPD_N", ++ "EMMC_EN_N", ++ "NC", ++ "NC", ++ "NC", ++ "NC", ++ "NC", ++ "NC"; ++ status = "okay"; ++ }; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&virtgpio 0 0>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&expgpio 0 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ cam0_reg = <&cam0_reg>,"status"; ++ cam0_reg_gpio = <&cam0_reg>,"gpio:4"; ++ cam1_reg = <&cam1_reg>,"status"; ++ cam1_reg_gpio = <&cam1_reg>,"gpio:4"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2710-rpi-zero-2-w.dts b/arch/arm/boot/dts/bcm2710-rpi-zero-2-w.dts +new file mode 100644 +index 000000000000..6522d2aa3d52 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2710-rpi-zero-2-w.dts +@@ -0,0 +1,267 @@ ++/dts-v1/; ++ ++#include "bcm2710.dtsi" ++#include "bcm2709-rpi.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_44.dtsi" ++#include "bcm2708-rpi-bt.dtsi" ++ ++/ { ++ compatible = "raspberrypi,model-zero-2-w", "brcm,bcm2837"; ++ model = "Raspberry Pi Zero 2 W"; ++ ++ chosen { ++ bootargs = "coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_headphones=0"; ++ }; ++ ++ aliases { ++ serial0 = &uart1; ++ serial1 = &uart0; ++ mmc1 = &mmcnr; ++ }; ++}; ++ ++&gpio { ++ /* ++ * This is based on the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "NC" = not connected (no rail from the SoC) ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD1", ++ "RXD1", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "HDMI_HPD_N", ++ "STATUS_LED_N", ++ /* Used by BT module */ ++ "CTS0", ++ "RTS0", ++ "TXD0", ++ "RXD0", ++ /* Used by Wifi */ ++ "SD1_CLK", ++ "SD1_CMD", ++ "SD1_DATA0", ++ "SD1_DATA1", ++ "SD1_DATA2", ++ "SD1_DATA3", ++ "CAM_GPIO1", /* GPIO40 */ ++ "WL_ON", /* GPIO41 */ ++ "BT_ON", /* GPIO42 */ ++ "WIFI_CLK", /* GPIO43 */ ++ "SDA0", /* GPIO44 */ ++ "SCL0", /* GPIO45 */ ++ "SMPS_SCL", /* GPIO46 */ ++ "SMPS_SDA", /* GPIO47 */ ++ /* Used by SD Card */ ++ "SD_CLK_R", ++ "SD_CMD_R", ++ "SD_DATA0_R", ++ "SD_DATA1_R", ++ "SD_DATA2_R", ++ "SD_DATA3_R"; ++ ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = <1>; /* output */ ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = <4>; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = <4>; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = <4>; /* alt0 */ ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = <7>; // alt3 = SD1 ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ bt_pins: bt_pins { ++ brcm,pins = <43>; ++ brcm,function = <4>; /* alt0:GPCLK2 */ ++ brcm,pull = <0>; ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins = <30 31 32 33>; ++ brcm,function = <7>; /* alt3=UART0 */ ++ brcm,pull = <2 0 0 2>; /* up none none up */ ++ }; ++ ++ uart1_pins: uart1_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <>; ++ brcm,function = <>; ++ }; ++}; ++ ++&mmcnr { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdio_pins>; ++ bus-width = <4>; ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ brcmf: wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ ++ firmwares { ++ fw_43436p { ++ chipid = <43430>; ++ revmask = <4>; ++ fw_base = "brcm/brcmfmac43436-sdio"; ++ }; ++ fw_43436s { ++ chipid = <43430>; ++ revmask = <2>; ++ fw_base = "brcm/brcmfmac43436s-sdio"; ++ }; ++ }; ++ }; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_pins &bt_pins>; ++ status = "okay"; ++}; ++ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart1_pins>; ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2c2 { ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "actpwr"; ++ gpios = <&gpio 29 GPIO_ACTIVE_LOW>; ++ }; ++}; ++ ++&hdmi { ++ hpd-gpios = <&gpio 28 GPIO_ACTIVE_LOW>; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&bt { ++ shutdown-gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++}; ++ ++&minibt { ++ shutdown-gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 40 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2710-rpi-zero-2.dts b/arch/arm/boot/dts/bcm2710-rpi-zero-2.dts +new file mode 100644 +index 000000000000..daa12bd30d6b +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2710-rpi-zero-2.dts +@@ -0,0 +1 @@ ++#include "bcm2710-rpi-zero-2-w.dts" +diff --git a/arch/arm/boot/dts/bcm2710.dtsi b/arch/arm/boot/dts/bcm2710.dtsi +new file mode 100644 +index 000000000000..31b13b24affb +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2710.dtsi +@@ -0,0 +1,27 @@ ++#define i2c0 i2c0if ++#include "bcm2837.dtsi" ++#undef i2c0 ++#include "bcm270x.dtsi" ++ ++/ { ++ compatible = "brcm,bcm2837", "brcm,bcm2836"; ++ ++ arm-pmu { ++ compatible = "arm,cortex-a53-pmu", "arm,cortex-a7-pmu"; ++ }; ++ ++ soc { ++ /delete-node/ timer@7e003000; ++ }; ++ ++ __overrides__ { ++ arm_freq = <&cpu0>, "clock-frequency:0", ++ <&cpu1>, "clock-frequency:0", ++ <&cpu2>, "clock-frequency:0", ++ <&cpu3>, "clock-frequency:0"; ++ }; ++}; ++ ++&vc4 { ++ status = "disabled"; ++}; +diff --git a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +index 4432412044de..43a6cdcb7150 100644 +--- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts ++++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +@@ -1,9 +1,15 @@ + // SPDX-License-Identifier: GPL-2.0 + /dts-v1/; ++#define BCM2711 ++#define i2c0 i2c0if + #include "bcm2711.dtsi" +-#include "bcm2711-rpi.dtsi" +-#include "bcm283x-rpi-usb-peripheral.dtsi" + #include "bcm283x-rpi-wifi-bt.dtsi" ++#undef i2c0 ++#include "bcm270x.dtsi" ++#define i2c0 i2c0mux ++#include "bcm2711-rpi.dtsi" ++#undef i2c0 ++//#include "bcm283x-rpi-usb-peripheral.dtsi" + + / { + compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; +@@ -72,7 +78,7 @@ &expgpio { + "VDD_SD_IO_SEL", + "CAM_GPIO", /* 5 */ + "SD_PWR_ON", +- ""; ++ "SD_OC_N"; + }; + + &gpio { +@@ -240,3 +246,311 @@ &vec { + &wifi_pwrseq { + reset-gpios = <&expgpio 1 GPIO_ACTIVE_LOW>; + }; ++ ++// ============================================= ++// Downstream rpi- changes ++ ++#include "bcm271x-rpi-bt.dtsi" ++ ++/ { ++ soc { ++ /delete-node/ pixelvalve@7e807000; ++ /delete-node/ hdmi@7e902000; ++ }; ++}; ++ ++#include "bcm2711-rpi-ds.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_44.dtsi" ++ ++/ { ++ chosen { ++ bootargs = "coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_headphones=0"; ++ }; ++ ++ aliases { ++ serial0 = &uart1; ++ serial1 = &uart0; ++ mmc0 = &emmc2; ++ mmc1 = &mmcnr; ++ mmc2 = &sdhost; ++ i2c3 = &i2c3; ++ i2c4 = &i2c4; ++ i2c5 = &i2c5; ++ i2c6 = &i2c6; ++ i2c20 = &ddc0; ++ i2c21 = &ddc1; ++ spi3 = &spi3; ++ spi4 = &spi4; ++ spi5 = &spi5; ++ spi6 = &spi6; ++ /delete-property/ intc; ++ }; ++ ++ /delete-node/ wifi-pwrseq; ++}; ++ ++&mmcnr { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdio_pins>; ++ bus-width = <4>; ++ status = "okay"; ++}; ++ ++&uart0 { ++ pinctrl-0 = <&uart0_pins &bt_pins>; ++ status = "okay"; ++}; ++ ++&uart1 { ++ pinctrl-0 = <&uart1_pins>; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&gpio { ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = ; ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = ; ++ }; ++ ++ spi3_pins: spi3_pins { ++ brcm,pins = <1 2 3>; ++ brcm,function = ; ++ }; ++ ++ spi3_cs_pins: spi3_cs_pins { ++ brcm,pins = <0 24>; ++ brcm,function = ; ++ }; ++ ++ spi4_pins: spi4_pins { ++ brcm,pins = <5 6 7>; ++ brcm,function = ; ++ }; ++ ++ spi4_cs_pins: spi4_cs_pins { ++ brcm,pins = <4 25>; ++ brcm,function = ; ++ }; ++ ++ spi5_pins: spi5_pins { ++ brcm,pins = <13 14 15>; ++ brcm,function = ; ++ }; ++ ++ spi5_cs_pins: spi5_cs_pins { ++ brcm,pins = <12 26>; ++ brcm,function = ; ++ }; ++ ++ spi6_pins: spi6_pins { ++ brcm,pins = <19 20 21>; ++ brcm,function = ; ++ }; ++ ++ spi6_cs_pins: spi6_cs_pins { ++ brcm,pins = <18 27>; ++ brcm,function = ; ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c3_pins: i2c3 { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c4_pins: i2c4 { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c5_pins: i2c5 { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c6_pins: i2c6 { ++ brcm,pins = <22 23>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = ; ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = ; // alt3 = SD1 ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ bt_pins: bt_pins { ++ brcm,pins = "-"; // non-empty to keep btuart happy, //4 = 0 ++ // to fool pinctrl ++ brcm,function = <0>; ++ brcm,pull = <2>; ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins = <32 33>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart1_pins: uart1_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ uart2_pins: uart2_pins { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart3_pins: uart3_pins { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart4_pins: uart4_pins { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart5_pins: uart5_pins { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++// ============================================= ++// Board specific stuff here ++ ++&sdhost { ++ status = "disabled"; ++}; ++ ++&phy1 { ++ led-modes = <0x00 0x08>; /* link/activity link */ ++}; ++ ++&gpio { ++ audio_pins: audio_pins { ++ brcm,pins = <40 41>; ++ brcm,function = <4>; ++ brcm,pull = <0>; ++ }; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ pwr_led: led-pwr { ++ label = "led1"; ++ linux,default-trigger = "default-on"; ++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; ++ }; ++}; ++ ++&pwm1 { ++ status = "disabled"; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&expgpio 5 GPIO_ACTIVE_HIGH>; ++}; ++ ++cam0_reg: &cam_dummy_reg { ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_headphones=0 snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ ++ pwr_led_gpio = <&pwr_led>,"gpios:4"; ++ pwr_led_activelow = <&pwr_led>,"gpios:8"; ++ pwr_led_trigger = <&pwr_led>,"linux,default-trigger"; ++ ++ eth_led0 = <&phy1>,"led-modes:0"; ++ eth_led1 = <&phy1>,"led-modes:4"; ++ ++ sd_poll_once = <&emmc2>, "non-removable?"; ++ spi_dma4 = <&spi0>, "dmas:0=", <&dma40>, ++ <&spi0>, "dmas:8=", <&dma40>; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2711-rpi-400.dts b/arch/arm/boot/dts/bcm2711-rpi-400.dts +index c53d9eb0b802..67df994170c7 100644 +--- a/arch/arm/boot/dts/bcm2711-rpi-400.dts ++++ b/arch/arm/boot/dts/bcm2711-rpi-400.dts +@@ -1,6 +1,15 @@ + // SPDX-License-Identifier: GPL-2.0 + /dts-v1/; +-#include "bcm2711-rpi-4-b.dts" ++#define BCM2711 ++#define i2c0 i2c0if ++#include "bcm2711.dtsi" ++#include "bcm283x-rpi-wifi-bt.dtsi" ++#undef i2c0 ++#include "bcm270x.dtsi" ++#define i2c0 i2c0mux ++#include "bcm2711-rpi.dtsi" ++#undef i2c0 ++//#include "bcm283x-rpi-usb-peripheral.dtsi" + + / { + compatible = "raspberrypi,400", "brcm,bcm2711"; +@@ -12,19 +21,55 @@ chosen { + }; + + leds { +- /delete-node/ led-act; ++ led-act { ++ gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++ }; + + led-pwr { +- gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++ label = "PWR"; ++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; ++ default-state = "keep"; ++ linux,default-trigger = "default-on"; + }; + }; + +- gpio-poweroff { +- compatible = "gpio-poweroff"; +- gpios = <&expgpio 5 GPIO_ACTIVE_HIGH>; ++ sd_io_1v8_reg: sd_io_1v8_reg { ++ compatible = "regulator-gpio"; ++ regulator-name = "vdd-sd-io"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-boot-on; ++ regulator-always-on; ++ regulator-settling-time-us = <5000>; ++ gpios = <&expgpio 4 GPIO_ACTIVE_HIGH>; ++ states = <1800000 0x1>, ++ <3300000 0x0>; ++ status = "okay"; ++ }; ++ ++ sd_vcc_reg: sd_vcc_reg { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc-sd"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-boot-on; ++ enable-active-high; ++ gpio = <&expgpio 6 GPIO_ACTIVE_HIGH>; + }; + }; + ++&bt { ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++}; ++ ++&ddc0 { ++ status = "okay"; ++}; ++ ++&ddc1 { ++ status = "okay"; ++}; ++ + &expgpio { + gpio-line-names = "BT_ON", + "WL_ON", +@@ -36,10 +81,481 @@ &expgpio { + "SHUTDOWN_REQUEST"; + }; + ++&gpio { ++ /* ++ * Parts taken from rpi_SCH_4b_4p0_reduced.pdf and ++ * the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD1", ++ "RXD1", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "RGMII_MDIO", ++ "RGMIO_MDC", ++ /* Used by BT module */ ++ "CTS0", ++ "RTS0", ++ "TXD0", ++ "RXD0", ++ /* Used by Wifi */ ++ "SD1_CLK", ++ "SD1_CMD", ++ "SD1_DATA0", ++ "SD1_DATA1", ++ "SD1_DATA2", ++ "SD1_DATA3", ++ /* Shared with SPI flash */ ++ "PWM0_MISO", ++ "PWM1_MOSI", ++ "STATUS_LED_G_CLK", ++ "SPIFLASH_CE_N", ++ "SDA0", ++ "SCL0", ++ "RGMII_RXCLK", ++ "RGMII_RXCTL", ++ "RGMII_RXD0", ++ "RGMII_RXD1", ++ "RGMII_RXD2", ++ "RGMII_RXD3", ++ "RGMII_TXCLK", ++ "RGMII_TXCTL", ++ "RGMII_TXD0", ++ "RGMII_TXD1", ++ "RGMII_TXD2", ++ "RGMII_TXD3"; ++}; ++ ++&hdmi0 { ++ status = "okay"; ++}; ++ ++&hdmi1 { ++ status = "okay"; ++}; ++ ++&pixelvalve0 { ++ status = "okay"; ++}; ++ ++&pixelvalve1 { ++ status = "okay"; ++}; ++ ++&pixelvalve2 { ++ status = "okay"; ++}; ++ ++&pixelvalve4 { ++ status = "okay"; ++}; ++ ++&pwm1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pwm1_0_gpio40 &pwm1_1_gpio41>; ++ status = "okay"; ++}; ++ ++/* EMMC2 is used to drive the SD card */ ++&emmc2 { ++ vqmmc-supply = <&sd_io_1v8_reg>; ++ vmmc-supply = <&sd_vcc_reg>; ++ broken-cd; ++ status = "okay"; ++}; ++ ++&genet { ++ phy-handle = <&phy1>; ++ phy-mode = "rgmii-rxid"; ++ status = "okay"; ++}; ++ ++&genet_mdio { ++ phy1: ethernet-phy@1 { ++ /* No PHY interrupt */ ++ reg = <0x1>; ++ }; ++}; ++ ++&pcie0 { ++ pci@0,0 { ++ device_type = "pci"; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ ranges; ++ ++ reg = <0 0 0 0 0>; ++ ++ usb@0,0 { ++ reg = <0 0 0 0 0>; ++ resets = <&reset RASPBERRYPI_FIRMWARE_RESET_ID_USB>; ++ }; ++ }; ++}; ++ ++/* uart0 communicates with the BT module */ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_ctsrts_gpio30 &uart0_gpio32>; ++ uart-has-rtscts; ++}; ++ ++/* uart1 is mapped to the pin header */ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart1_gpio14>; ++ status = "okay"; ++}; ++ ++&vc4 { ++ status = "okay"; ++}; ++ ++&vec { ++ status = "disabled"; ++}; ++ ++&wifi_pwrseq { ++ reset-gpios = <&expgpio 1 GPIO_ACTIVE_LOW>; ++}; ++ ++// ============================================= ++// Downstream rpi- changes ++ ++#include "bcm271x-rpi-bt.dtsi" ++ ++/ { ++ soc { ++ /delete-node/ pixelvalve@7e807000; ++ /delete-node/ hdmi@7e902000; ++ }; ++}; ++ ++#include "bcm2711-rpi-ds.dtsi" ++#include "bcm283x-rpi-csi1-2lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_44.dtsi" ++ ++/ { ++ chosen { ++ bootargs = "coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_headphones=0"; ++ }; ++ ++ aliases { ++ serial0 = &uart1; ++ serial1 = &uart0; ++ mmc0 = &emmc2; ++ mmc1 = &mmcnr; ++ mmc2 = &sdhost; ++ i2c3 = &i2c3; ++ i2c4 = &i2c4; ++ i2c5 = &i2c5; ++ i2c6 = &i2c6; ++ i2c20 = &ddc0; ++ i2c21 = &ddc1; ++ spi3 = &spi3; ++ spi4 = &spi4; ++ spi5 = &spi5; ++ spi6 = &spi6; ++ /delete-property/ intc; ++ }; ++ ++ /delete-node/ wifi-pwrseq; ++}; ++ ++&mmcnr { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdio_pins>; ++ bus-width = <4>; ++ status = "okay"; ++}; ++ ++&uart0 { ++ pinctrl-0 = <&uart0_pins &bt_pins>; ++ status = "okay"; ++}; ++ ++&uart1 { ++ pinctrl-0 = <&uart1_pins>; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&gpio { ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = ; ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = ; ++ }; ++ ++ spi3_pins: spi3_pins { ++ brcm,pins = <1 2 3>; ++ brcm,function = ; ++ }; ++ ++ spi3_cs_pins: spi3_cs_pins { ++ brcm,pins = <0 24>; ++ brcm,function = ; ++ }; ++ ++ spi4_pins: spi4_pins { ++ brcm,pins = <5 6 7>; ++ brcm,function = ; ++ }; ++ ++ spi4_cs_pins: spi4_cs_pins { ++ brcm,pins = <4 25>; ++ brcm,function = ; ++ }; ++ ++ spi5_pins: spi5_pins { ++ brcm,pins = <13 14 15>; ++ brcm,function = ; ++ }; ++ ++ spi5_cs_pins: spi5_cs_pins { ++ brcm,pins = <12 26>; ++ brcm,function = ; ++ }; ++ ++ spi6_pins: spi6_pins { ++ brcm,pins = <19 20 21>; ++ brcm,function = ; ++ }; ++ ++ spi6_cs_pins: spi6_cs_pins { ++ brcm,pins = <18 27>; ++ brcm,function = ; ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c3_pins: i2c3 { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c4_pins: i2c4 { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c5_pins: i2c5 { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c6_pins: i2c6 { ++ brcm,pins = <22 23>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = ; ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = ; // alt3 = SD1 ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ bt_pins: bt_pins { ++ brcm,pins = "-"; // non-empty to keep btuart happy, //4 = 0 ++ // to fool pinctrl ++ brcm,function = <0>; ++ brcm,pull = <2>; ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins = <32 33>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart1_pins: uart1_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ uart2_pins: uart2_pins { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart3_pins: uart3_pins { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart4_pins: uart4_pins { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart5_pins: uart5_pins { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++// ============================================= ++// Board specific stuff here ++ ++/ { ++ power_ctrl: power_ctrl { ++ compatible = "gpio-poweroff"; ++ gpios = <&expgpio 5 0>; ++ force; ++ }; ++}; ++ ++&sdhost { ++ status = "disabled"; ++}; ++ ++&phy1 { ++ led-modes = <0x00 0x08>; /* link/activity link */ ++}; ++ ++&gpio { ++ audio_pins: audio_pins { ++ brcm,pins = <>; ++ brcm,function = <>; ++ }; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "default-on"; ++ default-state = "on"; ++ gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ pwr_led: led-pwr { ++ label = "led1"; ++ linux,default-trigger = "default-on"; ++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; ++ }; ++}; ++ ++&pwm1 { ++ status = "disabled"; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ + &genet_mdio { + clock-frequency = <1950000>; + }; + +-&pm { +- /delete-property/ system-power-controller; ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ ++ pwr_led_gpio = <&pwr_led>,"gpios:4"; ++ pwr_led_activelow = <&pwr_led>,"gpios:8"; ++ pwr_led_trigger = <&pwr_led>,"linux,default-trigger"; ++ ++ eth_led0 = <&phy1>,"led-modes:0"; ++ eth_led1 = <&phy1>,"led-modes:4"; ++ ++ sd_poll_once = <&emmc2>, "non-removable?"; ++ spi_dma4 = <&spi0>, "dmas:0=", <&dma40>, ++ <&spi0>, "dmas:8=", <&dma40>; ++ }; + }; +diff --git a/arch/arm/boot/dts/bcm2711-rpi-cm4.dts b/arch/arm/boot/dts/bcm2711-rpi-cm4.dts +new file mode 100644 +index 000000000000..5510a1b731c1 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2711-rpi-cm4.dts +@@ -0,0 +1,578 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/dts-v1/; ++#define BCM2711 ++#define i2c0 i2c0if ++#include "bcm2711.dtsi" ++#include "bcm283x-rpi-wifi-bt.dtsi" ++#undef i2c0 ++#include "bcm270x.dtsi" ++#define i2c0 i2c0mux ++#include "bcm2711-rpi.dtsi" ++#undef i2c0 ++//#include "bcm283x-rpi-usb-peripheral.dtsi" ++ ++/ { ++ compatible = "raspberrypi,4-compute-module", "brcm,bcm2711"; ++ model = "Raspberry Pi Compute Module 4"; ++ ++ chosen { ++ /* 8250 auxiliary UART instead of pl011 */ ++ stdout-path = "serial1:115200n8"; ++ }; ++ ++ leds { ++ led-act { ++ gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ led-pwr { ++ label = "PWR"; ++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; ++ default-state = "keep"; ++ linux,default-trigger = "default-on"; ++ }; ++ }; ++ ++ sd_io_1v8_reg: sd_io_1v8_reg { ++ compatible = "regulator-gpio"; ++ regulator-name = "vdd-sd-io"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-boot-on; ++ regulator-always-on; ++ regulator-settling-time-us = <5000>; ++ gpios = <&expgpio 4 GPIO_ACTIVE_HIGH>; ++ states = <1800000 0x1>, ++ <3300000 0x0>; ++ status = "okay"; ++ }; ++ ++ sd_vcc_reg: sd_vcc_reg { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc-sd"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-boot-on; ++ enable-active-high; ++ gpio = <&expgpio 6 GPIO_ACTIVE_HIGH>; ++ }; ++}; ++ ++&bt { ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++}; ++ ++&ddc0 { ++ status = "okay"; ++}; ++ ++&ddc1 { ++ status = "okay"; ++}; ++ ++&expgpio { ++ gpio-line-names = "BT_ON", ++ "WL_ON", ++ "PWR_LED_OFF", ++ "ANT1", ++ "VDD_SD_IO_SEL", ++ "CAM_GPIO", ++ "SD_PWR_ON", ++ "ANT2"; ++ ++ ant1: ant1 { ++ gpio-hog; ++ gpios = <3 GPIO_ACTIVE_HIGH>; ++ output-high; ++ }; ++ ++ ant2: ant2 { ++ gpio-hog; ++ gpios = <7 GPIO_ACTIVE_HIGH>; ++ output-low; ++ }; ++}; ++ ++&gpio { ++ /* ++ * Parts taken from rpi_SCH_4b_4p0_reduced.pdf and ++ * the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD1", ++ "RXD1", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "RGMII_MDIO", ++ "RGMIO_MDC", ++ /* Used by BT module */ ++ "CTS0", ++ "RTS0", ++ "TXD0", ++ "RXD0", ++ /* Used by Wifi */ ++ "SD1_CLK", ++ "SD1_CMD", ++ "SD1_DATA0", ++ "SD1_DATA1", ++ "SD1_DATA2", ++ "SD1_DATA3", ++ /* Shared with SPI flash */ ++ "PWM0_MISO", ++ "PWM1_MOSI", ++ "STATUS_LED_G_CLK", ++ "SPIFLASH_CE_N", ++ "SDA0", ++ "SCL0", ++ "RGMII_RXCLK", ++ "RGMII_RXCTL", ++ "RGMII_RXD0", ++ "RGMII_RXD1", ++ "RGMII_RXD2", ++ "RGMII_RXD3", ++ "RGMII_TXCLK", ++ "RGMII_TXCTL", ++ "RGMII_TXD0", ++ "RGMII_TXD1", ++ "RGMII_TXD2", ++ "RGMII_TXD3"; ++}; ++ ++&hdmi0 { ++ status = "okay"; ++}; ++ ++&hdmi1 { ++ status = "okay"; ++}; ++ ++&pixelvalve0 { ++ status = "okay"; ++}; ++ ++&pixelvalve1 { ++ status = "okay"; ++}; ++ ++&pixelvalve2 { ++ status = "okay"; ++}; ++ ++&pixelvalve4 { ++ status = "okay"; ++}; ++ ++&pwm1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pwm1_0_gpio40 &pwm1_1_gpio41>; ++ status = "okay"; ++}; ++ ++/* EMMC2 is used to drive the EMMC card */ ++&emmc2 { ++ bus-width = <8>; ++ vqmmc-supply = <&sd_io_1v8_reg>; ++ vmmc-supply = <&sd_vcc_reg>; ++ broken-cd; ++ status = "okay"; ++}; ++ ++&genet { ++ phy-handle = <&phy1>; ++ phy-mode = "rgmii-rxid"; ++ status = "okay"; ++}; ++ ++&genet_mdio { ++ phy1: ethernet-phy@0 { ++ /* No PHY interrupt */ ++ reg = <0x0>; ++ }; ++}; ++ ++&pcie0 { ++ pci@0,0 { ++ device_type = "pci"; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ ranges; ++ ++ reg = <0 0 0 0 0>; ++ }; ++}; ++ ++/* uart0 communicates with the BT module */ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_ctsrts_gpio30 &uart0_gpio32>; ++ uart-has-rtscts; ++}; ++ ++/* uart1 is mapped to the pin header */ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart1_gpio14>; ++ status = "okay"; ++}; ++ ++&vc4 { ++ status = "okay"; ++}; ++ ++&vec { ++ status = "disabled"; ++}; ++ ++&wifi_pwrseq { ++ reset-gpios = <&expgpio 1 GPIO_ACTIVE_LOW>; ++}; ++ ++// ============================================= ++// Downstream rpi- changes ++ ++#include "bcm271x-rpi-bt.dtsi" ++ ++/ { ++ soc { ++ /delete-node/ pixelvalve@7e807000; ++ /delete-node/ hdmi@7e902000; ++ }; ++}; ++ ++#include "bcm2711-rpi-ds.dtsi" ++#include "bcm283x-rpi-csi0-2lane.dtsi" ++#include "bcm283x-rpi-csi1-4lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_44.dtsi" ++ ++/ { ++ chosen { ++ bootargs = "coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_headphones=0"; ++ }; ++ ++ aliases { ++ serial0 = &uart1; ++ serial1 = &uart0; ++ mmc0 = &emmc2; ++ mmc1 = &mmcnr; ++ mmc2 = &sdhost; ++ i2c3 = &i2c3; ++ i2c4 = &i2c4; ++ i2c5 = &i2c5; ++ i2c6 = &i2c6; ++ i2c20 = &ddc0; ++ i2c21 = &ddc1; ++ spi3 = &spi3; ++ spi4 = &spi4; ++ spi5 = &spi5; ++ spi6 = &spi6; ++ /delete-property/ intc; ++ }; ++ ++ /delete-node/ wifi-pwrseq; ++}; ++ ++&mmcnr { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdio_pins>; ++ bus-width = <4>; ++ status = "okay"; ++}; ++ ++&uart0 { ++ pinctrl-0 = <&uart0_pins &bt_pins>; ++ status = "okay"; ++}; ++ ++&uart1 { ++ pinctrl-0 = <&uart1_pins>; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&gpio { ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = ; ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = ; ++ }; ++ ++ spi3_pins: spi3_pins { ++ brcm,pins = <1 2 3>; ++ brcm,function = ; ++ }; ++ ++ spi3_cs_pins: spi3_cs_pins { ++ brcm,pins = <0 24>; ++ brcm,function = ; ++ }; ++ ++ spi4_pins: spi4_pins { ++ brcm,pins = <5 6 7>; ++ brcm,function = ; ++ }; ++ ++ spi4_cs_pins: spi4_cs_pins { ++ brcm,pins = <4 25>; ++ brcm,function = ; ++ }; ++ ++ spi5_pins: spi5_pins { ++ brcm,pins = <13 14 15>; ++ brcm,function = ; ++ }; ++ ++ spi5_cs_pins: spi5_cs_pins { ++ brcm,pins = <12 26>; ++ brcm,function = ; ++ }; ++ ++ spi6_pins: spi6_pins { ++ brcm,pins = <19 20 21>; ++ brcm,function = ; ++ }; ++ ++ spi6_cs_pins: spi6_cs_pins { ++ brcm,pins = <18 27>; ++ brcm,function = ; ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c3_pins: i2c3 { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c4_pins: i2c4 { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c5_pins: i2c5 { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c6_pins: i2c6 { ++ brcm,pins = <22 23>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = ; ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = ; // alt3 = SD1 ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ bt_pins: bt_pins { ++ brcm,pins = "-"; // non-empty to keep btuart happy, //4 = 0 ++ // to fool pinctrl ++ brcm,function = <0>; ++ brcm,pull = <2>; ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins = <32 33>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart1_pins: uart1_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ uart2_pins: uart2_pins { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart3_pins: uart3_pins { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart4_pins: uart4_pins { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart5_pins: uart5_pins { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++// ============================================= ++// Board specific stuff here ++ ++&pcie0 { ++ brcm,enable-l1ss; ++}; ++ ++&sdhost { ++ status = "disabled"; ++}; ++ ++&phy1 { ++ led-modes = <0x00 0x08>; /* link/activity link */ ++}; ++ ++&gpio { ++ audio_pins: audio_pins { ++ brcm,pins = <>; ++ brcm,function = <>; ++ }; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ pwr_led: led-pwr { ++ label = "led1"; ++ linux,default-trigger = "default-on"; ++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; ++ }; ++}; ++ ++&pwm1 { ++ status = "disabled"; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++cam0_reg: &cam1_reg { ++ gpio = <&expgpio 5 GPIO_ACTIVE_HIGH>; ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ ++ pwr_led_gpio = <&pwr_led>,"gpios:4"; ++ pwr_led_activelow = <&pwr_led>,"gpios:8"; ++ pwr_led_trigger = <&pwr_led>,"linux,default-trigger"; ++ ++ eth_led0 = <&phy1>,"led-modes:0"; ++ eth_led1 = <&phy1>,"led-modes:4"; ++ ++ ant1 = <&ant1>,"output-high?=on", ++ <&ant1>, "output-low?=off", ++ <&ant2>, "output-high?=off", ++ <&ant2>, "output-low?=on"; ++ ant2 = <&ant1>,"output-high?=off", ++ <&ant1>, "output-low?=on", ++ <&ant2>, "output-high?=on", ++ <&ant2>, "output-low?=off"; ++ noant = <&ant1>,"output-high?=off", ++ <&ant1>, "output-low?=on", ++ <&ant2>, "output-high?=off", ++ <&ant2>, "output-low?=on"; ++ ++ sd_poll_once = <&emmc2>, "non-removable?"; ++ spi_dma4 = <&spi0>, "dmas:0=", <&dma40>, ++ <&spi0>, "dmas:8=", <&dma40>; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2711-rpi-cm4s.dts b/arch/arm/boot/dts/bcm2711-rpi-cm4s.dts +new file mode 100644 +index 000000000000..1a1d7af1d148 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2711-rpi-cm4s.dts +@@ -0,0 +1,427 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/dts-v1/; ++#define BCM2711 ++#define i2c0 i2c0if ++#include "bcm2711.dtsi" ++//#include "bcm283x-rpi-wifi-bt.dtsi" ++#undef i2c0 ++#include "bcm270x.dtsi" ++#define i2c0 i2c0mux ++#include "bcm2711-rpi.dtsi" ++#undef i2c0 ++ ++/ { ++ compatible = "raspberrypi,4-compute-module-s", "brcm,bcm2711"; ++ model = "Raspberry Pi Compute Module 4S"; ++ ++ leds { ++ led-act { ++ gpios = <&virtgpio 0 0>; ++ }; ++ }; ++}; ++ ++&ddc0 { ++ status = "okay"; ++}; ++ ++&gpio { ++ /* ++ * Parts taken from rpi_SCH_4b_4p0_reduced.pdf and ++ * the official GPU firmware DT blob. ++ * ++ * Legend: ++ * "FOO" = GPIO line named "FOO" on the schematic ++ * "FOO_N" = GPIO line named "FOO" on schematic, active low ++ */ ++ gpio-line-names = "ID_SDA", ++ "ID_SCL", ++ "SDA1", ++ "SCL1", ++ "GPIO_GCLK", ++ "GPIO5", ++ "GPIO6", ++ "SPI_CE1_N", ++ "SPI_CE0_N", ++ "SPI_MISO", ++ "SPI_MOSI", ++ "SPI_SCLK", ++ "GPIO12", ++ "GPIO13", ++ /* Serial port */ ++ "TXD1", ++ "RXD1", ++ "GPIO16", ++ "GPIO17", ++ "GPIO18", ++ "GPIO19", ++ "GPIO20", ++ "GPIO21", ++ "GPIO22", ++ "GPIO23", ++ "GPIO24", ++ "GPIO25", ++ "GPIO26", ++ "GPIO27", ++ "GPIO28", ++ "GPIO29", ++ "GPIO30", ++ "GPIO31", ++ "GPIO32", ++ "GPIO33", ++ "GPIO34", ++ "GPIO35", ++ "GPIO36", ++ "GPIO37", ++ "GPIO38", ++ "GPIO39", ++ "PWM0_MISO", ++ "PWM1_MOSI", ++ "GPIO42", ++ "GPIO43", ++ "GPIO44", ++ "GPIO45"; ++}; ++ ++&hdmi0 { ++ status = "okay"; ++}; ++ ++&pixelvalve0 { ++ status = "okay"; ++}; ++ ++&pixelvalve1 { ++ status = "okay"; ++}; ++ ++&pixelvalve2 { ++ status = "okay"; ++}; ++ ++&pixelvalve4 { ++ status = "okay"; ++}; ++ ++&pwm1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pwm1_0_gpio40 &pwm1_1_gpio41>; ++ status = "okay"; ++}; ++ ++/* EMMC2 is used to drive the EMMC card */ ++&emmc2 { ++ bus-width = <8>; ++ broken-cd; ++ status = "okay"; ++}; ++ ++&pcie0 { ++ status = "disabled"; ++}; ++ ++&vchiq { ++ interrupts = ; ++}; ++ ++&vc4 { ++ status = "okay"; ++}; ++ ++&vec { ++ status = "disabled"; ++}; ++ ++// ============================================= ++// Downstream rpi- changes ++ ++#include "bcm2711-rpi-ds.dtsi" ++ ++/ { ++ soc { ++ /delete-node/ pixelvalve@7e807000; ++ /delete-node/ hdmi@7e902000; ++ ++ virtgpio: virtgpio { ++ compatible = "brcm,bcm2835-virtgpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++ }; ++}; ++ ++#include "bcm283x-rpi-csi0-2lane.dtsi" ++#include "bcm283x-rpi-csi1-4lane.dtsi" ++#include "bcm283x-rpi-i2c0mux_0_28.dtsi" ++ ++/ { ++ chosen { ++ bootargs = "coherent_pool=1M snd_bcm2835.enable_headphones=0"; ++ }; ++ ++ aliases { ++ serial0 = &uart0; ++ mmc0 = &emmc2; ++ mmc1 = &mmcnr; ++ mmc2 = &sdhost; ++ i2c3 = &i2c3; ++ i2c4 = &i2c4; ++ i2c5 = &i2c5; ++ i2c6 = &i2c6; ++ spi3 = &spi3; ++ spi4 = &spi4; ++ spi5 = &spi5; ++ spi6 = &spi6; ++ /delete-property/ intc; ++ }; ++ ++ /delete-node/ wifi-pwrseq; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_pins>; ++ status = "okay"; ++}; ++ ++&spi0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&spi0_pins &spi0_cs_pins>; ++ cs-gpios = <&gpio 8 1>, <&gpio 7 1>; ++ ++ spidev0: spidev@0{ ++ compatible = "spidev"; ++ reg = <0>; /* CE0 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++ ++ spidev1: spidev@1{ ++ compatible = "spidev"; ++ reg = <1>; /* CE1 */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ spi-max-frequency = <125000000>; ++ }; ++}; ++ ++&gpio { ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = ; ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = ; ++ }; ++ ++ spi3_pins: spi3_pins { ++ brcm,pins = <1 2 3>; ++ brcm,function = ; ++ }; ++ ++ spi3_cs_pins: spi3_cs_pins { ++ brcm,pins = <0 24>; ++ brcm,function = ; ++ }; ++ ++ spi4_pins: spi4_pins { ++ brcm,pins = <5 6 7>; ++ brcm,function = ; ++ }; ++ ++ spi4_cs_pins: spi4_cs_pins { ++ brcm,pins = <4 25>; ++ brcm,function = ; ++ }; ++ ++ spi5_pins: spi5_pins { ++ brcm,pins = <13 14 15>; ++ brcm,function = ; ++ }; ++ ++ spi5_cs_pins: spi5_cs_pins { ++ brcm,pins = <12 26>; ++ brcm,function = ; ++ }; ++ ++ spi6_pins: spi6_pins { ++ brcm,pins = <19 20 21>; ++ brcm,function = ; ++ }; ++ ++ spi6_cs_pins: spi6_cs_pins { ++ brcm,pins = <18 27>; ++ brcm,function = ; ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c3_pins: i2c3 { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c4_pins: i2c4 { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c5_pins: i2c5 { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c6_pins: i2c6 { ++ brcm,pins = <22 23>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = ; ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = ; // alt3 = SD1 ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ uart2_pins: uart2_pins { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart3_pins: uart3_pins { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart4_pins: uart4_pins { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart5_pins: uart5_pins { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++}; ++ ++&i2c0if { ++ clock-frequency = <100000>; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++}; ++ ++&i2s { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2s_pins>; ++}; ++ ++// ============================================= ++// Board specific stuff here ++ ++/* Enable USB in OTG-aware mode */ ++&usb { ++ compatible = "brcm,bcm2835-usb"; ++ dr_mode = "otg"; ++ g-np-tx-fifo-size = <32>; ++ g-rx-fifo-size = <558>; ++ g-tx-fifo-size = <512 512 512 512 512 256 256>; ++ status = "okay"; ++}; ++ ++&sdhost { ++ status = "disabled"; ++}; ++ ++&gpio { ++ audio_pins: audio_pins { ++ brcm,pins = <>; ++ brcm,function = <>; ++ }; ++}; ++ ++/* Permanently disable HDMI1 */ ++&hdmi1 { ++ compatible = "disabled"; ++}; ++ ++/* Permanently disable DDC1 */ ++&ddc1 { ++ compatible = "disabled"; ++}; ++ ++&leds { ++ act_led: led-act { ++ label = "led0"; ++ linux,default-trigger = "mmc0"; ++ }; ++}; ++ ++&pwm1 { ++ status = "disabled"; ++}; ++ ++&vchiq { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&audio_pins>; ++}; ++ ++&cam1_reg { ++ gpio = <&gpio 2 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++}; ++ ++cam0_reg: &cam0_regulator { ++ gpio = <&gpio 30 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++}; ++ ++/ { ++ __overrides__ { ++ audio = <&chosen>,"bootargs{on='snd_bcm2835.enable_hdmi=1',off='snd_bcm2835.enable_hdmi=0'}"; ++ ++ act_led_gpio = <&act_led>,"gpios:4"; ++ act_led_activelow = <&act_led>,"gpios:8"; ++ act_led_trigger = <&act_led>,"linux,default-trigger"; ++ ++ sd_poll_once = <&emmc2>, "non-removable?"; ++ spi_dma4 = <&spi0>, "dmas:0=", <&dma40>, ++ <&spi0>, "dmas:8=", <&dma40>; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2711-rpi-ds.dtsi b/arch/arm/boot/dts/bcm2711-rpi-ds.dtsi +new file mode 100644 +index 000000000000..5f9a5bad98ad +--- /dev/null ++++ b/arch/arm/boot/dts/bcm2711-rpi-ds.dtsi +@@ -0,0 +1,292 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include "bcm270x-rpi.dtsi" ++ ++/ { ++ __overrides__ { ++ arm_freq; ++ hdmi = <&hdmi0>,"status", ++ <&hdmi1>,"status"; ++ pcie = <&pcie0>,"status"; ++ sd = <&emmc2>,"status"; ++ }; ++ ++ scb: scb { ++ /* Add a label */ ++ }; ++ ++ arm-pmu { ++ compatible = "arm,cortex-a72-pmu", "arm,armv8-pmuv3", "arm,cortex-a7-pmu"; ++ ++ }; ++ ++ chosen { ++ /delete-property/ stdout-path; ++ }; ++}; ++ ++&vc4 { ++ raspberrypi,firmware = <&firmware>; ++}; ++ ++&cma { ++ /* Limit cma to the lower 768MB to allow room for HIGHMEM on 32-bit */ ++ alloc-ranges = <0x0 0x00000000 0x30000000>; ++}; ++ ++&scb { ++ #size-cells = <2>; ++ ++ ranges = <0x0 0x7c000000 0x0 0xfc000000 0x0 0x03800000>, ++ <0x0 0x40000000 0x0 0xff800000 0x0 0x00800000>, ++ <0x6 0x00000000 0x6 0x00000000 0x0 0x40000000>, ++ <0x0 0x00000000 0x0 0x00000000 0x0 0xfc000000>; ++ dma-ranges = <0x0 0x00000000 0x0 0x00000000 0x4 0x00000000>; ++ ++ dma40: dma@7e007b00 { ++ compatible = "brcm,bcm2711-dma"; ++ reg = <0x0 0x7e007b00 0x0 0x400>; ++ interrupts = ++ , /* dma4 11 */ ++ , /* dma4 12 */ ++ , /* dma4 13 */ ++ ; /* dma4 14 */ ++ interrupt-names = "dma11", ++ "dma12", ++ "dma13", ++ "dma14"; ++ #dma-cells = <1>; ++ brcm,dma-channel-mask = <0x7800>; ++ }; ++ ++ xhci: xhci@7e9c0000 { ++ compatible = "generic-xhci"; ++ status = "disabled"; ++ reg = <0x0 0x7e9c0000 0x0 0x100000>; ++ interrupts = ; ++ power-domains = <&power RPI_POWER_DOMAIN_USB>; ++ }; ++ ++ codec@7eb10000 { ++ compatible = "raspberrypi,rpivid-vid-decoder"; ++ reg = <0x0 0x7eb10000 0x0 0x1000>, /* INTC */ ++ <0x0 0x7eb00000 0x0 0x10000>; /* HEVC */ ++ reg-names = "intc", ++ "hevc"; ++ interrupts = ; ++ ++ clocks = <&firmware_clocks 11>; ++ clock-names = "hevc"; ++ }; ++}; ++ ++&pcie0 { ++ reg = <0x0 0x7d500000 0x0 0x9310>; ++ ranges = <0x02000000 0x0 0xc0000000 0x6 0x00000000 ++ 0x0 0x40000000>; ++}; ++ ++&genet { ++ reg = <0x0 0x7d580000 0x0 0x10000>; ++}; ++ ++&dma40 { ++ /* The VPU firmware uses DMA channel 11 for VCHIQ */ ++ brcm,dma-channel-mask = <0x7000>; ++}; ++ ++&vchiq { ++ compatible = "brcm,bcm2711-vchiq"; ++}; ++ ++&firmwarekms { ++ compatible = "raspberrypi,rpi-firmware-kms-2711"; ++ interrupts = ; ++}; ++ ++&smi { ++ interrupts = ; ++}; ++ ++&mmc { ++ interrupts = ; ++}; ++ ++&mmcnr { ++ interrupts = ; ++}; ++ ++&csi0 { ++ interrupts = ; ++}; ++ ++&csi1 { ++ interrupts = ; ++}; ++ ++&random { ++ compatible = "brcm,bcm2711-rng200"; ++ status = "okay"; ++}; ++ ++&usb { ++ /* Enable the FIQ support */ ++ reg = <0x7e980000 0x10000>, ++ <0x7e00b200 0x200>; ++ interrupts = , ++ ; ++ status = "disabled"; ++}; ++ ++&gpio { ++ interrupts = , ++ ; ++}; ++ ++&emmc2 { ++ mmc-ddr-3_3v; ++}; ++ ++&vc4 { ++ status = "disabled"; ++}; ++ ++&pixelvalve0 { ++ status = "disabled"; ++}; ++ ++&pixelvalve1 { ++ status = "disabled"; ++}; ++ ++&pixelvalve2 { ++ status = "disabled"; ++}; ++ ++&pixelvalve3 { ++ status = "disabled"; ++}; ++ ++&pixelvalve4 { ++ status = "disabled"; ++}; ++ ++&hdmi0 { ++ reg = <0x7ef00700 0x300>, ++ <0x7ef00300 0x200>, ++ <0x7ef00f00 0x80>, ++ <0x7ef00f80 0x80>, ++ <0x7ef01b00 0x200>, ++ <0x7ef01f00 0x400>, ++ <0x7ef00200 0x80>, ++ <0x7ef04300 0x100>, ++ <0x7ef20000 0x100>, ++ <0x7ef00100 0x30>; ++ reg-names = "hdmi", ++ "dvp", ++ "phy", ++ "rm", ++ "packet", ++ "metadata", ++ "csc", ++ "cec", ++ "hd", ++ "intr2"; ++ clocks = <&firmware_clocks 13>, ++ <&firmware_clocks 14>, ++ <&dvp 0>, ++ <&clk_27MHz>; ++ dmas = <&dma (10|(1<<27)|(1<<24)|(10<<16)|(15<<20))>; ++ status = "disabled"; ++}; ++ ++&ddc0 { ++ status = "disabled"; ++}; ++ ++&hdmi1 { ++ reg = <0x7ef05700 0x300>, ++ <0x7ef05300 0x200>, ++ <0x7ef05f00 0x80>, ++ <0x7ef05f80 0x80>, ++ <0x7ef06b00 0x200>, ++ <0x7ef06f00 0x400>, ++ <0x7ef00280 0x80>, ++ <0x7ef09300 0x100>, ++ <0x7ef20000 0x100>, ++ <0x7ef00100 0x30>; ++ reg-names = "hdmi", ++ "dvp", ++ "phy", ++ "rm", ++ "packet", ++ "metadata", ++ "csc", ++ "cec", ++ "hd", ++ "intr2"; ++ clocks = <&firmware_clocks 13>, ++ <&firmware_clocks 14>, ++ <&dvp 1>, ++ <&clk_27MHz>; ++ dmas = <&dma (17|(1<<27)|(1<<24)|(10<<16)|(15<<20))>; ++ status = "disabled"; ++}; ++ ++&ddc1 { ++ status = "disabled"; ++}; ++ ++&dvp { ++ status = "disabled"; ++}; ++ ++&vec { ++ clocks = <&firmware_clocks 15>; ++}; ++ ++&aon_intr { ++ interrupts = ; ++ status = "disabled"; ++}; ++ ++&system_timer { ++ status = "disabled"; ++}; ++ ++&i2c0 { ++ /delete-property/ compatible; ++ /delete-property/ interrupts; ++}; ++ ++&i2c0if { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ interrupts = ; ++}; ++ ++/delete-node/ &v3d; ++ ++/ { ++ v3dbus: v3dbus { ++ compatible = "simple-bus"; ++ #address-cells = <1>; ++ #size-cells = <2>; ++ ranges = <0x7c500000 0x0 0xfc500000 0x0 0x03300000>, ++ <0x40000000 0x0 0xff800000 0x0 0x00800000>; ++ dma-ranges = <0x00000000 0x0 0x00000000 0x4 0x00000000>; ++ ++ v3d: v3d@7ec04000 { ++ compatible = "brcm,2711-v3d"; ++ reg = ++ <0x7ec00000 0x0 0x4000>, ++ <0x7ec04000 0x0 0x4000>; ++ reg-names = "hub", "core0"; ++ ++ power-domains = <&pm BCM2835_POWER_DOMAIN_GRAFX_V3D>; ++ resets = <&pm BCM2835_RESET_V3D>; ++ clocks = <&firmware_clocks 5>; ++ clocks-names = "v3d"; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm2711-rpi.dtsi b/arch/arm/boot/dts/bcm2711-rpi.dtsi +index 98817a6675b9..7b9e946db985 100644 +--- a/arch/arm/boot/dts/bcm2711-rpi.dtsi ++++ b/arch/arm/boot/dts/bcm2711-rpi.dtsi +@@ -15,6 +15,7 @@ aliases { + ethernet0 = &genet; + pcie0 = &pcie0; + blconfig = &blconfig; ++ blpubkey = &blpubkey; + }; + }; + +@@ -67,6 +68,18 @@ blconfig: nvram@0 { + no-map; + status = "disabled"; + }; ++ /* ++ * RPi4 will copy the binary public key blob (if present) from the bootloader ++ * into memory for use by the OS. ++ */ ++ blpubkey: nvram@1 { ++ compatible = "raspberrypi,bootloader-public-key", "nvmem-rmem"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ reg = <0x0 0x0 0x0>; ++ no-map; ++ status = "disabled"; ++ }; + }; + + &v3d { +diff --git a/arch/arm/boot/dts/bcm271x-rpi-bt.dtsi b/arch/arm/boot/dts/bcm271x-rpi-bt.dtsi +new file mode 100644 +index 000000000000..6b9b79f74cf3 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm271x-rpi-bt.dtsi +@@ -0,0 +1,26 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++&uart0 { ++ bt: bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <3000000>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++ }; ++}; ++ ++&uart1 { ++ minibt: bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <460800>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++ }; ++}; ++ ++/ { ++ __overrides__ { ++ krnbt = <&bt>,"status"; ++ krnbt_baudrate = <&bt>,"max-speed:0"; ++ }; ++}; +diff --git a/arch/arm/boot/dts/bcm283x-rpi-csi0-2lane.dtsi b/arch/arm/boot/dts/bcm283x-rpi-csi0-2lane.dtsi +new file mode 100644 +index 000000000000..6e4ce8622b47 +--- /dev/null ++++ b/arch/arm/boot/dts/bcm283x-rpi-csi0-2lane.dtsi +@@ -0,0 +1,4 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++&csi0 { ++ brcm,num-data-lanes = <2>; ++}; +diff --git a/arch/arm/boot/dts/bcm283x-rpi-csi1-2lane.dtsi b/arch/arm/boot/dts/bcm283x-rpi-csi1-2lane.dtsi +new file mode 100644 +index 000000000000..6938f4daacdc +--- /dev/null ++++ b/arch/arm/boot/dts/bcm283x-rpi-csi1-2lane.dtsi +@@ -0,0 +1,4 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++&csi1 { ++ brcm,num-data-lanes = <2>; ++}; +diff --git a/arch/arm/boot/dts/bcm283x-rpi-csi1-4lane.dtsi b/arch/arm/boot/dts/bcm283x-rpi-csi1-4lane.dtsi +new file mode 100644 +index 000000000000..b37037437bee +--- /dev/null ++++ b/arch/arm/boot/dts/bcm283x-rpi-csi1-4lane.dtsi +@@ -0,0 +1,4 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++&csi1 { ++ brcm,num-data-lanes = <4>; ++}; +diff --git a/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_28.dtsi b/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_28.dtsi +new file mode 100644 +index 000000000000..38f0074bce3f +--- /dev/null ++++ b/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_28.dtsi +@@ -0,0 +1,4 @@ ++&i2c0mux { ++ pinctrl-0 = <&i2c0_gpio0>; ++ pinctrl-1 = <&i2c0_gpio28>; ++}; +diff --git a/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_44.dtsi b/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_44.dtsi +new file mode 100644 +index 000000000000..119946d878db +--- /dev/null ++++ b/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_44.dtsi +@@ -0,0 +1,4 @@ ++&i2c0mux { ++ pinctrl-0 = <&i2c0_gpio0>; ++ pinctrl-1 = <&i2c0_gpio44>; ++}; +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +new file mode 100644 +index 000000000000..37254235b641 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -0,0 +1,287 @@ ++# Overlays for the Raspberry Pi platform ++ ++dtb-$(CONFIG_ARCH_BCM2835) += overlay_map.dtb ++ ++dtbo-$(CONFIG_ARCH_BCM2835) += \ ++ act-led.dtbo \ ++ adafruit-st7735r.dtbo \ ++ adafruit18.dtbo \ ++ adau1977-adc.dtbo \ ++ adau7002-simple.dtbo \ ++ ads1015.dtbo \ ++ ads1115.dtbo \ ++ ads7846.dtbo \ ++ adv7282m.dtbo \ ++ adv728x-m.dtbo \ ++ akkordion-iqdacplus.dtbo \ ++ allo-boss-dac-pcm512x-audio.dtbo \ ++ allo-boss2-dac-audio.dtbo \ ++ allo-digione.dtbo \ ++ allo-katana-dac-audio.dtbo \ ++ allo-piano-dac-pcm512x-audio.dtbo \ ++ allo-piano-dac-plus-pcm512x-audio.dtbo \ ++ anyspi.dtbo \ ++ apds9960.dtbo \ ++ applepi-dac.dtbo \ ++ arducam-64mp.dtbo \ ++ arducam-pivariety.dtbo \ ++ at86rf233.dtbo \ ++ audioinjector-addons.dtbo \ ++ audioinjector-bare-i2s.dtbo \ ++ audioinjector-isolated-soundcard.dtbo \ ++ audioinjector-ultra.dtbo \ ++ audioinjector-wm8731-audio.dtbo \ ++ audiosense-pi.dtbo \ ++ audremap.dtbo \ ++ balena-fin.dtbo \ ++ camera-mux-2port.dtbo \ ++ camera-mux-4port.dtbo \ ++ cap1106.dtbo \ ++ chipdip-dac.dtbo \ ++ cirrus-wm5102.dtbo \ ++ cma.dtbo \ ++ cutiepi-panel.dtbo \ ++ dacberry400.dtbo \ ++ dht11.dtbo \ ++ dionaudio-kiwi.dtbo \ ++ dionaudio-loco.dtbo \ ++ dionaudio-loco-v2.dtbo \ ++ disable-bt.dtbo \ ++ disable-wifi.dtbo \ ++ dpi18.dtbo \ ++ dpi18cpadhi.dtbo \ ++ dpi24.dtbo \ ++ draws.dtbo \ ++ dwc-otg.dtbo \ ++ dwc2.dtbo \ ++ edt-ft5406.dtbo \ ++ enc28j60.dtbo \ ++ enc28j60-spi2.dtbo \ ++ exc3000.dtbo \ ++ fbtft.dtbo \ ++ fe-pi-audio.dtbo \ ++ fsm-demo.dtbo \ ++ gc9a01.dtbo \ ++ ghost-amp.dtbo \ ++ goodix.dtbo \ ++ googlevoicehat-soundcard.dtbo \ ++ gpio-fan.dtbo \ ++ gpio-hog.dtbo \ ++ gpio-ir.dtbo \ ++ gpio-ir-tx.dtbo \ ++ gpio-key.dtbo \ ++ gpio-led.dtbo \ ++ gpio-no-bank0-irq.dtbo \ ++ gpio-no-irq.dtbo \ ++ gpio-poweroff.dtbo \ ++ gpio-shutdown.dtbo \ ++ hd44780-lcd.dtbo \ ++ hdmi-backlight-hwhack-gpio.dtbo \ ++ hifiberry-amp.dtbo \ ++ hifiberry-amp100.dtbo \ ++ hifiberry-amp3.dtbo \ ++ hifiberry-dac.dtbo \ ++ hifiberry-dacplus.dtbo \ ++ hifiberry-dacplusadc.dtbo \ ++ hifiberry-dacplusadcpro.dtbo \ ++ hifiberry-dacplusdsp.dtbo \ ++ hifiberry-dacplushd.dtbo \ ++ hifiberry-digi.dtbo \ ++ hifiberry-digi-pro.dtbo \ ++ highperi.dtbo \ ++ hy28a.dtbo \ ++ hy28b.dtbo \ ++ hy28b-2017.dtbo \ ++ i-sabre-q2m.dtbo \ ++ i2c-bcm2708.dtbo \ ++ i2c-fan.dtbo \ ++ i2c-gpio.dtbo \ ++ i2c-mux.dtbo \ ++ i2c-pwm-pca9685a.dtbo \ ++ i2c-rtc.dtbo \ ++ i2c-rtc-gpio.dtbo \ ++ i2c-sensor.dtbo \ ++ i2c0.dtbo \ ++ i2c1.dtbo \ ++ i2c3.dtbo \ ++ i2c4.dtbo \ ++ i2c5.dtbo \ ++ i2c6.dtbo \ ++ i2s-dac.dtbo \ ++ i2s-gpio28-31.dtbo \ ++ ilitek251x.dtbo \ ++ imx219.dtbo \ ++ imx258.dtbo \ ++ imx290.dtbo \ ++ imx296.dtbo \ ++ imx327.dtbo \ ++ imx378.dtbo \ ++ imx462.dtbo \ ++ imx477.dtbo \ ++ imx519.dtbo \ ++ iqaudio-codec.dtbo \ ++ iqaudio-dac.dtbo \ ++ iqaudio-dacplus.dtbo \ ++ iqaudio-digi-wm8804-audio.dtbo \ ++ iqs550.dtbo \ ++ irs1125.dtbo \ ++ jedec-spi-nor.dtbo \ ++ justboom-both.dtbo \ ++ justboom-dac.dtbo \ ++ justboom-digi.dtbo \ ++ ltc294x.dtbo \ ++ max98357a.dtbo \ ++ maxtherm.dtbo \ ++ mbed-dac.dtbo \ ++ mcp23017.dtbo \ ++ mcp23s17.dtbo \ ++ mcp2515.dtbo \ ++ mcp2515-can0.dtbo \ ++ mcp2515-can1.dtbo \ ++ mcp251xfd.dtbo \ ++ mcp3008.dtbo \ ++ mcp3202.dtbo \ ++ mcp342x.dtbo \ ++ media-center.dtbo \ ++ merus-amp.dtbo \ ++ midi-uart0.dtbo \ ++ midi-uart1.dtbo \ ++ midi-uart2.dtbo \ ++ midi-uart3.dtbo \ ++ midi-uart4.dtbo \ ++ midi-uart5.dtbo \ ++ minipitft13.dtbo \ ++ miniuart-bt.dtbo \ ++ mipi-dbi-spi.dtbo \ ++ mlx90640.dtbo \ ++ mmc.dtbo \ ++ mpu6050.dtbo \ ++ mz61581.dtbo \ ++ ov2311.dtbo \ ++ ov5647.dtbo \ ++ ov7251.dtbo \ ++ ov9281.dtbo \ ++ papirus.dtbo \ ++ pca953x.dtbo \ ++ pcie-32bit-dma.dtbo \ ++ pibell.dtbo \ ++ pifacedigital.dtbo \ ++ pifi-40.dtbo \ ++ pifi-dac-hd.dtbo \ ++ pifi-dac-zero.dtbo \ ++ pifi-mini-210.dtbo \ ++ piglow.dtbo \ ++ piscreen.dtbo \ ++ piscreen2r.dtbo \ ++ pisound.dtbo \ ++ pitft22.dtbo \ ++ pitft28-capacitive.dtbo \ ++ pitft28-resistive.dtbo \ ++ pitft35-resistive.dtbo \ ++ pps-gpio.dtbo \ ++ proto-codec.dtbo \ ++ pwm.dtbo \ ++ pwm-2chan.dtbo \ ++ pwm-ir-tx.dtbo \ ++ qca7000.dtbo \ ++ qca7000-uart0.dtbo \ ++ ramoops.dtbo \ ++ ramoops-pi4.dtbo \ ++ rotary-encoder.dtbo \ ++ rpi-backlight.dtbo \ ++ rpi-codeczero.dtbo \ ++ rpi-dacplus.dtbo \ ++ rpi-dacpro.dtbo \ ++ rpi-digiampplus.dtbo \ ++ rpi-ft5406.dtbo \ ++ rpi-poe.dtbo \ ++ rpi-poe-plus.dtbo \ ++ rpi-sense.dtbo \ ++ rpi-sense-v2.dtbo \ ++ rpi-tv.dtbo \ ++ rra-digidac1-wm8741-audio.dtbo \ ++ sainsmart18.dtbo \ ++ sc16is750-i2c.dtbo \ ++ sc16is752-i2c.dtbo \ ++ sc16is752-spi0.dtbo \ ++ sc16is752-spi1.dtbo \ ++ sdhost.dtbo \ ++ sdio.dtbo \ ++ seeed-can-fd-hat-v1.dtbo \ ++ seeed-can-fd-hat-v2.dtbo \ ++ sh1106-spi.dtbo \ ++ si446x-spi0.dtbo \ ++ smi.dtbo \ ++ smi-dev.dtbo \ ++ smi-nand.dtbo \ ++ spi-gpio35-39.dtbo \ ++ spi-gpio40-45.dtbo \ ++ spi-rtc.dtbo \ ++ spi0-0cs.dtbo \ ++ spi0-1cs.dtbo \ ++ spi0-2cs.dtbo \ ++ spi1-1cs.dtbo \ ++ spi1-2cs.dtbo \ ++ spi1-3cs.dtbo \ ++ spi2-1cs.dtbo \ ++ spi2-2cs.dtbo \ ++ spi2-3cs.dtbo \ ++ spi3-1cs.dtbo \ ++ spi3-2cs.dtbo \ ++ spi4-1cs.dtbo \ ++ spi4-2cs.dtbo \ ++ spi5-1cs.dtbo \ ++ spi5-2cs.dtbo \ ++ spi6-1cs.dtbo \ ++ spi6-2cs.dtbo \ ++ ssd1306.dtbo \ ++ ssd1306-spi.dtbo \ ++ ssd1331-spi.dtbo \ ++ ssd1351-spi.dtbo \ ++ superaudioboard.dtbo \ ++ sx150x.dtbo \ ++ tc358743.dtbo \ ++ tc358743-audio.dtbo \ ++ tinylcd35.dtbo \ ++ tpm-slb9670.dtbo \ ++ tpm-slb9673.dtbo \ ++ uart0.dtbo \ ++ uart1.dtbo \ ++ uart2.dtbo \ ++ uart3.dtbo \ ++ uart4.dtbo \ ++ uart5.dtbo \ ++ udrc.dtbo \ ++ ugreen-dabboard.dtbo \ ++ upstream.dtbo \ ++ upstream-pi4.dtbo \ ++ vc4-fkms-v3d.dtbo \ ++ vc4-fkms-v3d-pi4.dtbo \ ++ vc4-kms-dpi-generic.dtbo \ ++ vc4-kms-dpi-hyperpixel2r.dtbo \ ++ vc4-kms-dpi-hyperpixel4.dtbo \ ++ vc4-kms-dpi-hyperpixel4sq.dtbo \ ++ vc4-kms-dpi-panel.dtbo \ ++ vc4-kms-dsi-7inch.dtbo \ ++ vc4-kms-dsi-lt070me05000.dtbo \ ++ vc4-kms-dsi-lt070me05000-v2.dtbo \ ++ vc4-kms-kippah-7inch.dtbo \ ++ vc4-kms-v3d.dtbo \ ++ vc4-kms-v3d-pi4.dtbo \ ++ vc4-kms-vga666.dtbo \ ++ vga666.dtbo \ ++ vl805.dtbo \ ++ w1-gpio.dtbo \ ++ w1-gpio-pullup.dtbo \ ++ w5500.dtbo \ ++ watterott-display.dtbo \ ++ waveshare-can-fd-hat-mode-a.dtbo \ ++ waveshare-can-fd-hat-mode-b.dtbo \ ++ wittypi.dtbo \ ++ wm8960-soundcard.dtbo ++ ++targets += dtbs dtbs_install ++targets += $(dtbo-y) ++ ++always-y := $(dtbo-y) ++clean-files := *.dtbo +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +new file mode 100644 +index 000000000000..90d861b85c9e +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/README +@@ -0,0 +1,4513 @@ ++Introduction ++============ ++ ++This directory contains Device Tree overlays. Device Tree makes it possible ++to support many hardware configurations with a single kernel and without the ++need to explicitly load or blacklist kernel modules. Note that this isn't a ++"pure" Device Tree configuration (c.f. MACH_BCM2835) - some on-board devices ++are still configured by the board support code, but the intention is to ++eventually reach that goal. ++ ++On Raspberry Pi, Device Tree usage is controlled from /boot/config.txt. By ++default, the Raspberry Pi kernel boots with device tree enabled. You can ++completely disable DT usage (for now) by adding: ++ ++ device_tree= ++ ++to your config.txt, which should cause your Pi to revert to the old way of ++doing things after a reboot. ++ ++In /boot you will find a .dtb for each base platform. This describes the ++hardware that is part of the Raspberry Pi board. The loader (start.elf and its ++siblings) selects the .dtb file appropriate for the platform by name, and reads ++it into memory. At this point, all of the optional interfaces (i2c, i2s, spi) ++are disabled, but they can be enabled using Device Tree parameters: ++ ++ dtparam=i2c=on,i2s=on,spi=on ++ ++However, this shouldn't be necessary in many use cases because loading an ++overlay that requires one of those interfaces will cause it to be enabled ++automatically, and it is advisable to only enable interfaces if they are ++needed. ++ ++Configuring additional, optional hardware is done using Device Tree overlays ++(see below). ++ ++GPIO numbering uses the hardware pin numbering scheme (aka BCM scheme) and ++not the physical pin numbers. ++ ++raspi-config ++============ ++ ++The Advanced Options section of the raspi-config utility can enable and disable ++Device Tree use, as well as toggling the I2C and SPI interfaces. Note that it ++is possible to both enable an interface and blacklist the driver, if for some ++reason you should want to defer the loading. ++ ++Modules ++======= ++ ++As well as describing the hardware, Device Tree also gives enough information ++to allow suitable driver modules to be located and loaded, with the corollary ++that unneeded modules are not loaded. As a result it should be possible to ++remove lines from /etc/modules, and /etc/modprobe.d/raspi-blacklist.conf can ++have its contents deleted (or commented out). ++ ++Using Overlays ++============== ++ ++Overlays are loaded using the "dtoverlay" config.txt setting. As an example, ++consider I2C Real Time Clock drivers. In the pre-DT world these would be loaded ++by writing a magic string comprising a device identifier and an I2C address to ++a special file in /sys/class/i2c-adapter, having first loaded the driver for ++the I2C interface and the RTC device - something like this: ++ ++ modprobe i2c-bcm2835 ++ modprobe rtc-ds1307 ++ echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device ++ ++With DT enabled, this becomes a line in config.txt: ++ ++ dtoverlay=i2c-rtc,ds1307 ++ ++This causes the file /boot/overlays/i2c-rtc.dtbo to be loaded and a "node" ++describing the DS1307 I2C device to be added to the Device Tree for the Pi. By ++default it usees address 0x68, but this can be modified with an additional DT ++parameter: ++ ++ dtoverlay=i2c-rtc,ds1307,addr=0x68 ++ ++Parameters usually have default values, although certain parameters are ++mandatory. See the list of overlays below for a description of the parameters ++and their defaults. ++ ++Making new Overlays based on existing Overlays ++============================================== ++ ++Recent overlays have been designed in a more general way, so that they can be ++adapted to hardware by changing their parameters. When you have additional ++hardware with more than one device of a kind, you end up using the same overlay ++multiple times with other parameters, e.g. ++ ++ # 2 CAN FD interfaces on spi but with different pins ++ dtoverlay=mcp251xfd,spi0-0,interrupt=25 ++ dtoverlay=mcp251xfd,spi0-1,interrupt=24 ++ ++ # a realtime clock on i2c ++ dtoverlay=i2c-rtc,pcf85063 ++ ++While this approach does work, it requires knowledge about the hardware design. ++It is more feasible to simplify things for the end user by providing a single ++overlay as it is done the traditional way. ++ ++A new overlay can be generated by using ovmerge utility. ++https://github.com/raspberrypi/utils/blob/master/ovmerge/ovmerge ++ ++To generate an overlay for the above configuration we pass the configuration ++to ovmerge and add the -c flag. ++ ++ ovmerge -c mcp251xfd-overlay.dts,spi0-0,interrupt=25 \ ++ mcp251xfd-overlay.dts,spi0-1,interrupt=24 \ ++ i2c-rtc-overlay.dts,pcf85063 \ ++ >> merged-overlay.dts ++ ++The -c option writes the command above as a comment into the overlay as ++a marker that this overlay is generated and how it was generated. ++After compiling the overlay it can be loaded in a single line. ++ ++ dtoverlay=merged ++ ++It does the same as the original configuration but without parameters. ++ ++The Overlay and Parameter Reference ++=================================== ++ ++N.B. When editing this file, please preserve the indentation levels to make it ++simple to parse programmatically. NO HARD TABS. ++ ++ ++Name: ++Info: Configures the base Raspberry Pi hardware ++Load: ++Params: ++ ant1 Select antenna 1 (default). CM4 only. ++ ++ ant2 Select antenna 2. CM4 only. ++ ++ noant Disable both antennas. CM4 only. ++ ++ audio Set to "on" to enable the onboard ALSA audio ++ interface (default "off") ++ ++ axiperf Set to "on" to enable the AXI bus performance ++ monitors. ++ See /sys/kernel/debug/raspberrypi_axi_monitor ++ for the results. ++ ++ cam0_reg Enables CAM 0 regulator. CM1 & 3 only. ++ ++ cam0_reg_gpio Set GPIO for CAM 0 regulator. Default 30. ++ CM1 & 3 only. ++ ++ cam1_reg Enables CAM 1 regulator. CM1 & 3 only. ++ ++ cam1_reg_gpio Set GPIO for CAM 1 regulator. Default 2. ++ CM1 & 3 only. ++ ++ eee Enable Energy Efficient Ethernet support for ++ compatible devices (default "on"). See also ++ "tx_lpi_timer". Pi3B+ only. ++ ++ eth_downshift_after Set the number of auto-negotiation failures ++ after which the 1000Mbps modes are disabled. ++ Legal values are 2, 3, 4, 5 and 0, where ++ 0 means never downshift (default 2). Pi3B+ only. ++ ++ eth_led0 Set mode of LED0 - amber on Pi3B+ (default "1"), ++ green on Pi4 (default "0"). ++ The legal values are: ++ ++ Pi3B+ ++ ++ 0=link/activity 1=link1000/activity ++ 2=link100/activity 3=link10/activity ++ 4=link100/1000/activity 5=link10/1000/activity ++ 6=link10/100/activity 14=off 15=on ++ ++ Pi4 ++ ++ 0=Speed/Activity 1=Speed ++ 2=Flash activity 3=FDX ++ 4=Off 5=On ++ 6=Alt 7=Speed/Flash ++ 8=Link 9=Activity ++ ++ eth_led1 Set mode of LED1 - green on Pi3B+ (default "6"), ++ amber on Pi4 (default "8"). See eth_led0 for ++ legal values. ++ ++ eth_max_speed Set the maximum speed a link is allowed ++ to negotiate. Legal values are 10, 100 and ++ 1000 (default 1000). Pi3B+ only. ++ ++ hdmi Set to "off" to disable the HDMI interface ++ (default "on") ++ ++ i2c_arm Set to "on" to enable the ARM's i2c interface ++ (default "off") ++ ++ i2c_vc Set to "on" to enable the i2c interface ++ usually reserved for the VideoCore processor ++ (default "off") ++ ++ i2c An alias for i2c_arm ++ ++ i2c_arm_baudrate Set the baudrate of the ARM's i2c interface ++ (default "100000") ++ ++ i2c_vc_baudrate Set the baudrate of the VideoCore i2c interface ++ (default "100000") ++ ++ i2c_baudrate An alias for i2c_arm_baudrate ++ ++ i2s Set to "on" to enable the i2s interface ++ (default "off") ++ ++ krnbt Set to "on" to enable autoprobing of Bluetooth ++ driver without need of hciattach/btattach ++ (default "off") ++ ++ krnbt_baudrate Set the baudrate of the PL011 UART when used ++ with krnbt=on ++ ++ pcie Set to "off" to disable the PCIe interface ++ (default "on") ++ (2711 only, but not applicable on CM4S) ++ N.B. USB-A ports on 4B are subsequently disabled ++ ++ spi Set to "on" to enable the spi interfaces ++ (default "off") ++ ++ spi_dma4 Use to enable 40-bit DMA on spi interfaces ++ (the assigned value doesn't matter) ++ (2711 only) ++ ++ random Set to "on" to enable the hardware random ++ number generator (default "on") ++ ++ sd Set to "off" to disable the SD card (or eMMC on ++ non-lite SKU of CM4). ++ (default "on") ++ ++ sd_overclock Clock (in MHz) to use when the MMC framework ++ requests 50MHz ++ ++ sd_poll_once Looks for a card once after booting. Useful ++ for network booting scenarios to avoid the ++ overhead of continuous polling. N.B. Using ++ this option restricts the system to using a ++ single card per boot (or none at all). ++ (default off) ++ ++ sd_force_pio Disable DMA support for SD driver (default off) ++ ++ sd_pio_limit Number of blocks above which to use DMA for ++ SD card (default 1) ++ ++ sd_debug Enable debug output from SD driver (default off) ++ ++ sdio_overclock Clock (in MHz) to use when the MMC framework ++ requests 50MHz for the SDIO/WLAN interface. ++ ++ tx_lpi_timer Set the delay in microseconds between going idle ++ and entering the low power state (default 600). ++ Requires EEE to be enabled - see "eee". ++ ++ uart0 Set to "off" to disable uart0 (default "on") ++ ++ uart1 Set to "on" or "off" to enable or disable uart1 ++ (default varies) ++ ++ watchdog Set to "on" to enable the hardware watchdog ++ (default "off") ++ ++ act_led_trigger Choose which activity the LED tracks. ++ Use "heartbeat" for a nice load indicator. ++ (default "mmc") ++ ++ act_led_activelow Set to "on" to invert the sense of the LED ++ (default "off") ++ N.B. For Pi 3B, 3B+, 3A+ and 4B, use the act-led ++ overlay. ++ ++ act_led_gpio Set which GPIO to use for the activity LED ++ (in case you want to connect it to an external ++ device) ++ (default "16" on a non-Plus board, "47" on a ++ Plus or Pi 2) ++ N.B. For Pi 3B, 3B+, 3A+ and 4B, use the act-led ++ overlay. ++ ++ pwr_led_trigger ++ pwr_led_activelow ++ pwr_led_gpio ++ As for act_led_*, but using the PWR LED. ++ Not available on Model A/B boards. ++ ++ N.B. It is recommended to only enable those interfaces that are needed. ++ Leaving all interfaces enabled can lead to unwanted behaviour (i2c_vc ++ interfering with Pi Camera, I2S and SPI hogging GPIO pins, etc.) ++ Note also that i2c, i2c_arm and i2c_vc are aliases for the physical ++ interfaces i2c0 and i2c1. Use of the numeric variants is still possible ++ but deprecated because the ARM/VC assignments differ between board ++ revisions. The same board-specific mapping applies to i2c_baudrate, ++ and the other i2c baudrate parameters. ++ ++ ++Name: act-led ++Info: Pi 3B, 3B+, 3A+ and 4B use a GPIO expander to drive the LEDs which can ++ only be accessed from the VPU. There is a special driver for this with a ++ separate DT node, which has the unfortunate consequence of breaking the ++ act_led_gpio and act_led_activelow dtparams. ++ This overlay changes the GPIO controller back to the standard one and ++ restores the dtparams. ++Load: dtoverlay=act-led,= ++Params: activelow Set to "on" to invert the sense of the LED ++ (default "off") ++ ++ gpio Set which GPIO to use for the activity LED ++ (in case you want to connect it to an external ++ device) ++ REQUIRED ++ ++ ++Name: adafruit-st7735r ++Info: Overlay for the SPI-connected Adafruit 1.8" 160x128 or 128x128 displays, ++ based on the ST7735R chip. ++ This overlay uses the newer DRM/KMS "Tiny" driver. ++Load: dtoverlay=adafruit-st7735r,= ++Params: 128x128 Select the 128x128 driver (default 160x128) ++ rotate Display rotation {0,90,180,270} (default 90) ++ speed SPI bus speed in Hz (default 4000000) ++ dc_pin GPIO pin for D/C (default 24) ++ reset_pin GPIO pin for RESET (default 25) ++ led_pin GPIO used to control backlight (default 18) ++ ++ ++Name: adafruit18 ++Info: Overlay for the SPI-connected Adafruit 1.8" display (based on the ++ ST7735R chip). It includes support for the "green tab" version. ++ This overlay uses the older fbtft driver. ++Load: dtoverlay=adafruit18,= ++Params: green Use the adafruit18_green variant. ++ rotate Display rotation {0,90,180,270} ++ speed SPI bus speed in Hz (default 4000000) ++ fps Display frame rate in Hz ++ bgr Enable BGR mode (default off) ++ debug Debug output level {0-7} ++ dc_pin GPIO pin for D/C (default 24) ++ reset_pin GPIO pin for RESET (default 25) ++ led_pin GPIO used to control backlight (default 18) ++ ++ ++Name: adau1977-adc ++Info: Overlay for activation of ADAU1977 ADC codec over I2C for control ++ and I2S for data. ++Load: dtoverlay=adau1977-adc ++Params: ++ ++ ++Name: adau7002-simple ++Info: Overlay for the activation of ADAU7002 stereo PDM to I2S converter. ++Load: dtoverlay=adau7002-simple,= ++Params: card-name Override the default, "adau7002", card name. ++ ++ ++Name: ads1015 ++Info: Overlay for activation of Texas Instruments ADS1015 ADC over I2C ++Load: dtoverlay=ads1015,= ++Params: addr I2C bus address of device. Set based on how the ++ addr pin is wired. (default=0x48 assumes addr ++ is pulled to GND) ++ cha_enable Enable virtual channel a. (default=true) ++ cha_cfg Set the configuration for virtual channel a. ++ (default=4 configures this channel for the ++ voltage at A0 with respect to GND) ++ cha_datarate Set the datarate (samples/sec) for this channel. ++ (default=4 sets 1600 sps) ++ cha_gain Set the gain of the Programmable Gain ++ Amplifier for this channel. (default=2 sets the ++ full scale of the channel to 2.048 Volts) ++ ++ Channel (ch) parameters can be set for each enabled channel. ++ A maximum of 4 channels can be enabled (letters a thru d). ++ For more information refer to the device datasheet at: ++ http://www.ti.com/lit/ds/symlink/ads1015.pdf ++ ++ ++Name: ads1115 ++Info: Texas Instruments ADS1115 ADC ++Load: dtoverlay=ads1115,[=] ++Params: addr I2C bus address of device. Set based on how the ++ addr pin is wired. (default=0x48 assumes addr ++ is pulled to GND) ++ cha_enable Enable virtual channel a. ++ cha_cfg Set the configuration for virtual channel a. ++ (default=4 configures this channel for the ++ voltage at A0 with respect to GND) ++ cha_datarate Set the datarate (samples/sec) for this channel. ++ (default=7 sets 860 sps) ++ cha_gain Set the gain of the Programmable Gain ++ Amplifier for this channel. (Default 1 sets the ++ full scale of the channel to 4.096 Volts) ++ ++ Channel parameters can be set for each enabled channel. ++ A maximum of 4 channels can be enabled (letters a thru d). ++ For more information refer to the device datasheet at: ++ http://www.ti.com/lit/ds/symlink/ads1115.pdf ++ ++ ++Name: ads7846 ++Info: ADS7846 Touch controller ++Load: dtoverlay=ads7846,= ++Params: cs SPI bus Chip Select (default 1) ++ speed SPI bus speed (default 2MHz, max 3.25MHz) ++ penirq GPIO used for PENIRQ. REQUIRED ++ penirq_pull Set GPIO pull (default 0=none, 2=pullup) ++ swapxy Swap x and y axis ++ xmin Minimum value on the X axis (default 0) ++ ymin Minimum value on the Y axis (default 0) ++ xmax Maximum value on the X axis (default 4095) ++ ymax Maximum value on the Y axis (default 4095) ++ pmin Minimum reported pressure value (default 0) ++ pmax Maximum reported pressure value (default 65535) ++ xohms Touchpanel sensitivity (X-plate resistance) ++ (default 400) ++ ++ penirq is required and usually xohms (60-100) has to be set as well. ++ Apart from that, pmax (255) and swapxy are also common. ++ The rest of the calibration can be done with xinput-calibrator. ++ See: github.com/notro/fbtft/wiki/FBTFT-on-Raspian ++ Device Tree binding document: ++ www.kernel.org/doc/Documentation/devicetree/bindings/input/ads7846.txt ++ ++ ++Name: adv7282m ++Info: Analog Devices ADV7282M analogue video to CSI2 bridge. ++ Uses Unicam1, which is the standard camera connector on most Pi ++ variants. ++Load: dtoverlay=adv7282m,= ++Params: addr Overrides the I2C address (default 0x21) ++ media-controller Configure use of Media Controller API for ++ configuring the sensor (default off) ++ ++ ++Name: adv728x-m ++Info: Analog Devices ADV728[0|1|2]-M analogue video to CSI2 bridges. ++ This is a wrapper for adv7282m, and defaults to ADV7282M. ++Load: dtoverlay=adv728x-m,= ++Params: addr Overrides the I2C address (default 0x21) ++ adv7280m Select ADV7280-M. ++ adv7281m Select ADV7281-M. ++ adv7281ma Select ADV7281-MA. ++ media-controller Configure use of Media Controller API for ++ configuring the sensor (default off) ++ ++ ++Name: akkordion-iqdacplus ++Info: Configures the Digital Dreamtime Akkordion Music Player (based on the ++ OEM IQAudIO DAC+ or DAC Zero module). ++Load: dtoverlay=akkordion-iqdacplus,= ++Params: 24db_digital_gain Allow gain to be applied via the PCM512x codec ++ Digital volume control. Enable with ++ dtoverlay=akkordion-iqdacplus,24db_digital_gain ++ (The default behaviour is that the Digital ++ volume control is limited to a maximum of ++ 0dB. ie. it can attenuate but not provide ++ gain. For most users, this will be desired ++ as it will prevent clipping. By appending ++ the 24db_digital_gain parameter, the Digital ++ volume control will allow up to 24dB of ++ gain. If this parameter is enabled, it is the ++ responsibility of the user to ensure that ++ the Digital volume control is set to a value ++ that does not result in clipping/distortion!) ++ ++ ++Name: allo-boss-dac-pcm512x-audio ++Info: Configures the Allo Boss DAC audio cards. ++Load: dtoverlay=allo-boss-dac-pcm512x-audio, ++Params: 24db_digital_gain Allow gain to be applied via the PCM512x codec ++ Digital volume control. Enable with ++ "dtoverlay=allo-boss-dac-pcm512x-audio, ++ 24db_digital_gain" ++ (The default behaviour is that the Digital ++ volume control is limited to a maximum of ++ 0dB. ie. it can attenuate but not provide ++ gain. For most users, this will be desired ++ as it will prevent clipping. By appending ++ the 24db_digital_gain parameter, the Digital ++ volume control will allow up to 24dB of ++ gain. If this parameter is enabled, it is the ++ responsibility of the user to ensure that ++ the Digital volume control is set to a value ++ that does not result in clipping/distortion!) ++ slave Force Boss DAC into slave mode, using Pi a ++ master for bit clock and frame clock. Enable ++ with "dtoverlay=allo-boss-dac-pcm512x-audio, ++ slave" ++ ++ ++Name: allo-boss2-dac-audio ++Info: Configures the Allo Boss2 DAC audio card ++Load: dtoverlay=allo-boss2-dac-audio ++Params: ++ ++ ++Name: allo-digione ++Info: Configures the Allo Digione audio card ++Load: dtoverlay=allo-digione ++Params: ++ ++ ++Name: allo-katana-dac-audio ++Info: Configures the Allo Katana DAC audio card ++Load: dtoverlay=allo-katana-dac-audio ++Params: ++ ++ ++Name: allo-piano-dac-pcm512x-audio ++Info: Configures the Allo Piano DAC (2.0/2.1) audio cards. ++ (NB. This initial support is for 2.0 channel audio ONLY! ie. stereo. ++ The subwoofer outputs on the Piano 2.1 are not currently supported!) ++Load: dtoverlay=allo-piano-dac-pcm512x-audio, ++Params: 24db_digital_gain Allow gain to be applied via the PCM512x codec ++ Digital volume control. ++ (The default behaviour is that the Digital ++ volume control is limited to a maximum of ++ 0dB. ie. it can attenuate but not provide ++ gain. For most users, this will be desired ++ as it will prevent clipping. By appending ++ the 24db_digital_gain parameter, the Digital ++ volume control will allow up to 24dB of ++ gain. If this parameter is enabled, it is the ++ responsibility of the user to ensure that ++ the Digital volume control is set to a value ++ that does not result in clipping/distortion!) ++ ++ ++Name: allo-piano-dac-plus-pcm512x-audio ++Info: Configures the Allo Piano DAC (2.1) audio cards. ++Load: dtoverlay=allo-piano-dac-plus-pcm512x-audio, ++Params: 24db_digital_gain Allow gain to be applied via the PCM512x codec ++ Digital volume control. ++ (The default behaviour is that the Digital ++ volume control is limited to a maximum of ++ 0dB. ie. it can attenuate but not provide ++ gain. For most users, this will be desired ++ as it will prevent clipping. By appending ++ the 24db_digital_gain parameter, the Digital ++ volume control will allow up to 24dB of ++ gain. If this parameter is enabled, it is the ++ responsibility of the user to ensure that ++ the Digital volume control is set to a value ++ that does not result in clipping/distortion!) ++ glb_mclk This option is only with Kali board. If enabled, ++ MCLK for Kali is used and PLL is disabled for ++ better voice quality. (default Off) ++ ++ ++Name: anyspi ++Info: Universal device tree overlay for SPI devices ++ ++ Just specify the SPI address and device name ("compatible" property). ++ This overlay lacks any device-specific parameter support! ++ ++ For devices on spi1 or spi2, the interfaces should be enabled ++ with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays. ++ ++ Examples: ++ 1. SPI NOR flash on spi0.1, maximum SPI clock frequency 45MHz: ++ dtoverlay=anyspi:spi0-1,dev="jedec,spi-nor",speed=45000000 ++ 2. MCP3204 ADC on spi1.2, maximum SPI clock frequency 500kHz: ++ dtoverlay=anyspi:spi1-2,dev="microchip,mcp3204" ++Load: dtoverlay=anyspi,= ++Params: spi- Configure device at spi, cs ++ (boolean, required) ++ dev Set device name to search compatible module ++ (string, required) ++ speed Set SPI clock frequency in Hz ++ (integer, optional, default 500000) ++ ++ ++Name: apds9960 ++Info: Configures the AVAGO APDS9960 digital proximity, ambient light, RGB and ++ gesture sensor ++Load: dtoverlay=apds9960,= ++Params: gpiopin GPIO used for INT (default 4) ++ noints Disable the interrupt GPIO line. ++ ++ ++Name: applepi-dac ++Info: Configures the Orchard Audio ApplePi-DAC audio card ++Load: dtoverlay=applepi-dac ++Params: ++ ++ ++Name: arducam-64mp ++Info: Arducam 64MP camera module. ++ Uses Unicam 1, which is the standard camera connector on most Pi ++ variants. ++Load: dtoverlay=arducam-64mp,= ++Params: rotation Mounting rotation of the camera sensor (0 or ++ 180, default 0) ++ orientation Sensor orientation (0 = front, 1 = rear, ++ 2 = external, default external) ++ media-controller Configure use of Media Controller API for ++ configuring the sensor (default on) ++ cam0 Adopt the default configuration for CAM0 on a ++ Compute Module (CSI0, i2c_vc, and cam0_reg). ++ ++ ++Name: arducam-pivariety ++Info: Arducam Pivariety camera module. ++ Uses Unicam 1, which is the standard camera connector on most Pi ++ variants. ++Load: dtoverlay=arducam-pivariety,= ++Params: rotation Mounting rotation of the camera sensor (0 or ++ 180, default 0) ++ orientation Sensor orientation (0 = front, 1 = rear, ++ 2 = external, default external) ++ media-controller Configure use of Media Controller API for ++ configuring the sensor (default on) ++ cam0 Adopt the default configuration for CAM0 on a ++ Compute Module (CSI0, i2c_vc, and cam0_reg). ++ ++ ++Name: at86rf233 ++Info: Configures the Atmel AT86RF233 802.15.4 low-power WPAN transceiver, ++ connected to spi0.0 ++Load: dtoverlay=at86rf233,= ++Params: interrupt GPIO used for INT (default 23) ++ reset GPIO used for Reset (default 24) ++ sleep GPIO used for Sleep (default 25) ++ speed SPI bus speed in Hz (default 3000000) ++ trim Fine tuning of the internal capacitance ++ arrays (0=+0pF, 15=+4.5pF, default 15) ++ ++ ++Name: audioinjector-addons ++Info: Configures the audioinjector.net audio add on soundcards ++Load: dtoverlay=audioinjector-addons,= ++Params: non-stop-clocks Keeps the clocks running even when the stream ++ is paused or stopped (default off) ++ ++ ++Name: audioinjector-bare-i2s ++Info: Configures the audioinjector.net audio bare i2s soundcard ++Load: dtoverlay=audioinjector-bare-i2s ++Params: ++ ++ ++Name: audioinjector-isolated-soundcard ++Info: Configures the audioinjector.net isolated soundcard ++Load: dtoverlay=audioinjector-isolated-soundcard ++Params: ++ ++ ++Name: audioinjector-ultra ++Info: Configures the audioinjector.net ultra soundcard ++Load: dtoverlay=audioinjector-ultra ++Params: ++ ++ ++Name: audioinjector-wm8731-audio ++Info: Configures the audioinjector.net audio add on soundcard ++Load: dtoverlay=audioinjector-wm8731-audio ++Params: ++ ++ ++Name: audiosense-pi ++Info: Configures the audiosense-pi add on soundcard ++ For more information refer to ++ https://gitlab.com/kakar0t/audiosense-pi ++Load: dtoverlay=audiosense-pi ++Params: ++ ++ ++Name: audremap ++Info: Switches PWM sound output to GPIOs on the 40-pin header ++Load: dtoverlay=audremap,= ++Params: swap_lr Reverse the channel allocation, which will also ++ swap the audio jack outputs (default off) ++ enable_jack Don't switch off the audio jack output ++ (default off) ++ pins_12_13 Select GPIOs 12 & 13 (default) ++ pins_18_19 Select GPIOs 18 & 19 ++ ++ ++Name: balena-fin ++Info: Overlay that enables WLAN, Bluetooth and the GPIO expander on the ++ balenaFin carrier board for the Raspberry Pi Compute Module 3/3+ Lite. ++Load: dtoverlay=balena-fin ++Params: ++ ++ ++Name: bmp085_i2c-sensor ++Info: This overlay is now deprecated - see i2c-sensor ++Load: ++ ++ ++Name: camera-mux-2port ++Info: Configures a 2 port camera multiplexer ++ Note that currently ALL IMX290 modules share a common clock, therefore ++ all modules will need to have the same clock frequency. ++Load: dtoverlay=camera-mux-2port,= ++Params: cam0-imx219 Select IMX219 for camera on port 0 ++ cam0-imx258 Select IMX258 for camera on port 0 ++ cam0-imx290 Select IMX290 for camera on port 0 ++ cam0-imx477 Select IMX477 for camera on port 0 ++ cam0-ov2311 Select OV2311 for camera on port 0 ++ cam0-ov5647 Select OV5647 for camera on port 0 ++ cam0-ov7251 Select OV7251 for camera on port 0 ++ cam0-ov9281 Select OV9281 for camera on port 0 ++ cam0-imx290-clk-freq Set clock frequency for an IMX290 on port 0 ++ cam1-imx219 Select IMX219 for camera on port 1 ++ cam1-imx258 Select IMX258 for camera on port 1 ++ cam1-imx290 Select IMX290 for camera on port 1 ++ cam1-imx477 Select IMX477 for camera on port 1 ++ cam1-ov2311 Select OV2311 for camera on port 1 ++ cam1-ov5647 Select OV5647 for camera on port 1 ++ cam1-ov7251 Select OV7251 for camera on port 1 ++ cam1-ov9281 Select OV9281 for camera on port 1 ++ cam1-imx290-clk-freq Set clock frequency for an IMX290 on port 1 ++ ++ ++Name: camera-mux-4port ++Info: Configures a 4 port camera multiplexer ++ Note that currently ALL IMX290 modules share a common clock, therefore ++ all modules will need to have the same clock frequency. ++Load: dtoverlay=camera-mux-4port,= ++Params: cam0-imx219 Select IMX219 for camera on port 0 ++ cam0-imx258 Select IMX258 for camera on port 0 ++ cam0-imx290 Select IMX290 for camera on port 0 ++ cam0-imx477 Select IMX477 for camera on port 0 ++ cam0-ov2311 Select OV2311 for camera on port 0 ++ cam0-ov5647 Select OV5647 for camera on port 0 ++ cam0-ov7251 Select OV7251 for camera on port 0 ++ cam0-ov9281 Select OV9281 for camera on port 0 ++ cam0-imx290-clk-freq Set clock frequency for an IMX290 on port 0 ++ cam1-imx219 Select IMX219 for camera on port 1 ++ cam1-imx258 Select IMX258 for camera on port 1 ++ cam1-imx290 Select IMX290 for camera on port 1 ++ cam1-imx477 Select IMX477 for camera on port 1 ++ cam1-ov2311 Select OV2311 for camera on port 1 ++ cam1-ov5647 Select OV5647 for camera on port 1 ++ cam1-ov7251 Select OV7251 for camera on port 1 ++ cam1-ov9281 Select OV9281 for camera on port 1 ++ cam1-imx290-clk-freq Set clock frequency for an IMX290 on port 1 ++ cam2-imx219 Select IMX219 for camera on port 2 ++ cam2-imx258 Select IMX258 for camera on port 2 ++ cam2-imx290 Select IMX290 for camera on port 2 ++ cam2-imx477 Select IMX477 for camera on port 2 ++ cam2-ov2311 Select OV2311 for camera on port 2 ++ cam2-ov5647 Select OV5647 for camera on port 2 ++ cam2-ov7251 Select OV7251 for camera on port 2 ++ cam2-ov9281 Select OV9281 for camera on port 2 ++ cam2-imx290-clk-freq Set clock frequency for an IMX290 on port 2 ++ cam3-imx219 Select IMX219 for camera on port 3 ++ cam3-imx258 Select IMX258 for camera on port 3 ++ cam3-imx290 Select IMX290 for camera on port 3 ++ cam3-imx477 Select IMX477 for camera on port 3 ++ cam3-ov2311 Select OV2311 for camera on port 3 ++ cam3-ov5647 Select OV5647 for camera on port 3 ++ cam3-ov7251 Select OV7251 for camera on port 3 ++ cam3-ov9281 Select OV9281 for camera on port 3 ++ cam3-imx290-clk-freq Set clock frequency for an IMX290 on port 3 ++ ++ ++Name: cap1106 ++Info: Enables the ability to use the cap1106 touch sensor as a keyboard ++Load: dtoverlay=cap1106,= ++Params: int_pin GPIO pin for interrupt signal (default 23) ++ ++ ++Name: chipdip-dac ++Info: Configures Chip Dip audio cards. ++Load: dtoverlay=chipdip-dac ++Params: ++ ++ ++Name: cirrus-wm5102 ++Info: Configures the Cirrus Logic Audio Card ++Load: dtoverlay=cirrus-wm5102 ++Params: ++ ++ ++Name: cma ++Info: Set custom CMA sizes, only use if you know what you are doing, might ++ clash with other overlays like vc4-fkms-v3d and vc4-kms-v3d. ++Load: dtoverlay=cma,= ++Params: cma-512 CMA is 512MB (needs 1GB) ++ cma-448 CMA is 448MB (needs 1GB) ++ cma-384 CMA is 384MB (needs 1GB) ++ cma-320 CMA is 320MB (needs 1GB) ++ cma-256 CMA is 256MB (needs 1GB) ++ cma-192 CMA is 192MB (needs 1GB) ++ cma-128 CMA is 128MB ++ cma-96 CMA is 96MB ++ cma-64 CMA is 64MB ++ cma-size CMA size in bytes, 4MB aligned ++ cma-default Use upstream's default value ++ ++ ++Name: cutiepi-panel ++Info: 8" TFT LCD display and touch panel used by cutiepi.io ++Load: dtoverlay=cutiepi-panel ++Params: ++ ++ ++Name: dacberry400 ++Info: Configures the dacberry400 add on soundcard ++Load: dtoverlay=dacberry400 ++Params: ++ ++ ++Name: dht11 ++Info: Overlay for the DHT11/DHT21/DHT22 humidity/temperature sensors ++ Also sometimes found with the part number(s) AM230x. ++Load: dtoverlay=dht11,= ++Params: gpiopin GPIO connected to the sensor's DATA output. ++ (default 4) ++ ++ ++Name: dionaudio-kiwi ++Info: Configures the Dion Audio KIWI STREAMER ++Load: dtoverlay=dionaudio-kiwi ++Params: ++ ++ ++Name: dionaudio-loco ++Info: Configures the Dion Audio LOCO DAC-AMP ++Load: dtoverlay=dionaudio-loco ++Params: ++ ++ ++Name: dionaudio-loco-v2 ++Info: Configures the Dion Audio LOCO-V2 DAC-AMP ++Load: dtoverlay=dionaudio-loco-v2,= ++Params: 24db_digital_gain Allow gain to be applied via the PCM512x codec ++ Digital volume control. Enable with ++ "dtoverlay=hifiberry-dacplus,24db_digital_gain" ++ (The default behaviour is that the Digital ++ volume control is limited to a maximum of ++ 0dB. ie. it can attenuate but not provide ++ gain. For most users, this will be desired ++ as it will prevent clipping. By appending ++ the 24dB_digital_gain parameter, the Digital ++ volume control will allow up to 24dB of ++ gain. If this parameter is enabled, it is the ++ responsibility of the user to ensure that ++ the Digital volume control is set to a value ++ that does not result in clipping/distortion!) ++ ++ ++Name: disable-bt ++Info: Disable onboard Bluetooth on Pi 3B, 3B+, 3A+, 4B and Zero W, restoring ++ UART0/ttyAMA0 over GPIOs 14 & 15. ++ N.B. To disable the systemd service that initialises the modem so it ++ doesn't use the UART, use 'sudo systemctl disable hciuart'. ++Load: dtoverlay=disable-bt ++Params: ++ ++ ++Name: disable-wifi ++Info: Disable onboard WLAN on Pi 3B, 3B+, 3A+, 4B and Zero W. ++Load: dtoverlay=disable-wifi ++Params: ++ ++ ++Name: dpi18 ++Info: Overlay for a generic 18-bit DPI display ++ This uses GPIOs 0-21 (so no I2C, uart etc.), and activates the output ++ 2-3 seconds after the kernel has started. ++Load: dtoverlay=dpi18 ++Params: ++ ++ ++Name: dpi18cpadhi ++Info: Overlay for a generic 18-bit DPI display (in 'mode 6' connection scheme) ++ This uses GPIOs 0-9,12-17,20-25 (so no I2C, uart etc.), and activates ++ the output 3-3 seconds after the kernel has started. ++Load: dtoverlay=dpi18cpadhi ++Params: ++ ++ ++Name: dpi24 ++Info: Overlay for a generic 24-bit DPI display ++ This uses GPIOs 0-27 (so no I2C, uart etc.), and activates the output ++ 2-3 seconds after the kernel has started. ++Load: dtoverlay=dpi24 ++Params: ++ ++ ++Name: draws ++Info: Configures the NW Digital Radio DRAWS Hat ++ ++ The board includes an ADC to measure various board values and also ++ provides two analog user inputs on the expansion header. The ADC ++ can be configured for various sample rates and gain values to adjust ++ the input range. Tables describing the two parameters follow. ++ ++ ADC Gain Values: ++ 0 = +/- 6.144V ++ 1 = +/- 4.096V ++ 2 = +/- 2.048V ++ 3 = +/- 1.024V ++ 4 = +/- 0.512V ++ 5 = +/- 0.256V ++ 6 = +/- 0.256V ++ 7 = +/- 0.256V ++ ++ ADC Datarate Values: ++ 0 = 128sps ++ 1 = 250sps ++ 2 = 490sps ++ 3 = 920sps ++ 4 = 1600sps (default) ++ 5 = 2400sps ++ 6 = 3300sps ++ 7 = 3300sps ++Load: dtoverlay=draws,= ++Params: draws_adc_ch4_gain Sets the full scale resolution of the ADCs ++ input voltage sensor (default 1) ++ ++ draws_adc_ch4_datarate Sets the datarate of the ADCs input voltage ++ sensor ++ ++ draws_adc_ch5_gain Sets the full scale resolution of the ADCs ++ 5V rail voltage sensor (default 1) ++ ++ draws_adc_ch5_datarate Sets the datarate of the ADCs 4V rail voltage ++ sensor ++ ++ draws_adc_ch6_gain Sets the full scale resolution of the ADCs ++ AIN2 input (default 2) ++ ++ draws_adc_ch6_datarate Sets the datarate of the ADCs AIN2 input ++ ++ draws_adc_ch7_gain Sets the full scale resolution of the ADCs ++ AIN3 input (default 2) ++ ++ draws_adc_ch7_datarate Sets the datarate of the ADCs AIN3 input ++ ++ alsaname Name of the ALSA audio device (default "draws") ++ ++ ++Name: dwc-otg ++Info: Selects the dwc_otg USB controller driver which has fiq support. This ++ is the default on all except the Pi Zero which defaults to dwc2. ++Load: dtoverlay=dwc-otg ++Params: ++ ++ ++Name: dwc2 ++Info: Selects the dwc2 USB controller driver ++Load: dtoverlay=dwc2,= ++Params: dr_mode Dual role mode: "host", "peripheral" or "otg" ++ ++ g-rx-fifo-size Size of rx fifo size in gadget mode ++ ++ g-np-tx-fifo-size Size of non-periodic tx fifo size in gadget ++ mode ++ ++ ++[ The ds1307-rtc overlay has been deleted. See i2c-rtc. ] ++ ++ ++Name: edt-ft5406 ++Info: Overlay for the EDT FT5406 touchscreen on the CSI/DSI I2C interface. ++ This works with the Raspberry Pi 7" touchscreen when not being polled ++ by the firmware. ++ You MUST use either "disable_touchscreen=1" or "ignore_lcd=1" in ++ config.txt to stop the firmware polling the touchscreen. ++Load: dtoverlay=edt-ft5406,= ++Params: sizex Touchscreen size x (default 800) ++ sizey Touchscreen size y (default 480) ++ invx Touchscreen inverted x axis ++ invy Touchscreen inverted y axis ++ swapxy Touchscreen swapped x y axis ++ ++ ++Name: enc28j60 ++Info: Overlay for the Microchip ENC28J60 Ethernet Controller on SPI0 ++Load: dtoverlay=enc28j60,= ++Params: int_pin GPIO used for INT (default 25) ++ ++ speed SPI bus speed (default 12000000) ++ ++ ++Name: enc28j60-spi2 ++Info: Overlay for the Microchip ENC28J60 Ethernet Controller on SPI2 ++Load: dtoverlay=enc28j60-spi2,= ++Params: int_pin GPIO used for INT (default 39) ++ ++ speed SPI bus speed (default 12000000) ++ ++ ++Name: exc3000 ++Info: Enables I2C connected EETI EXC3000 multiple touch controller using ++ GPIO 4 (pin 7 on GPIO header) for interrupt. ++Load: dtoverlay=exc3000,= ++Params: interrupt GPIO used for interrupt (default 4) ++ sizex Touchscreen size x (default 4096) ++ sizey Touchscreen size y (default 4096) ++ invx Touchscreen inverted x axis ++ invy Touchscreen inverted y axis ++ swapxy Touchscreen swapped x y axis ++ ++ ++Name: fbtft ++Info: Overlay for SPI-connected displays using the fbtft drivers. ++ ++ This overlay seeks to replace the functionality provided by fbtft_device ++ which is now gone from the kernel. ++ ++ Most displays from fbtft_device have been ported over. ++ Example: ++ dtoverlay=fbtft,spi0-0,rpi-display,reset_pin=23,dc_pin=24,led_pin=18,rotate=270 ++ ++ It is also possible to specify the controller (this will use the default ++ init sequence in the driver). ++ Example: ++ dtoverlay=fbtft,spi0-0,ili9341,bgr,reset_pin=23,dc_pin=24,led_pin=18,rotate=270 ++ ++ For devices on spi1 or spi2, the interfaces should be enabled ++ with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays. ++ ++ The following features of fbtft_device have not been ported over: ++ - parallel bus is not supported ++ - the init property which overrides the controller initialization ++ sequence is not supported as a parameter due to memory limitations in ++ the bootloader responsible for applying the overlay. ++ ++ See https://github.com/notro/fbtft/wiki/FBTFT-RPI-overlays for how to ++ create an overlay. ++ ++Load: dtoverlay=fbtft,= ++Params: ++ spi- Configure device at spi, cs ++ (boolean, required) ++ speed SPI bus speed in Hz (default 32000000) ++ cpha Shifted clock phase (CPHA) mode ++ cpol Inverse clock polarity (CPOL) mode ++ ++ adafruit18 Adafruit 1.8 ++ adafruit22 Adafruit 2.2 (old) ++ adafruit22a Adafruit 2.2 ++ adafruit28 Adafruit 2.8 ++ adafruit13m Adafruit 1.3 OLED ++ admatec_c-berry28 C-Berry28 ++ dogs102 EA DOGS102 ++ er_tftm050_2 ER-TFTM070-2 ++ er_tftm070_5 ER-TFTM070-5 ++ ew24ha0 EW24HA0 ++ ew24ha0_9bit EW24HA0 in 9-bit mode ++ freetronicsoled128 Freetronics OLED128 ++ hy28a HY28A ++ hy28b HY28B ++ itdb28_spi ITDB02-2.8 with SPI interface circuit ++ mi0283qt-2 Watterott MI0283QT-2 ++ mi0283qt-9a Watterott MI0283QT-9A ++ nokia3310 Nokia 3310 ++ nokia3310a Nokia 3310a ++ nokia5110 Nokia 5110 ++ piscreen PiScreen ++ pitft Adafruit PiTFT 2.8 ++ pioled ILSoft OLED ++ rpi-display Watterott rpi-display ++ sainsmart18 Sainsmart 1.8 ++ sainsmart32_spi Sainsmart 3.2 with SPI interfce circuit ++ tinylcd35 TinyLCD 3.5 ++ tm022hdh26 Tianma TM022HDH26 ++ tontec35_9481 Tontect 3.5 with ILI9481 controller ++ tontec35_9486 Tontect 3.5 with ILI9486 controller ++ waveshare32b Waveshare 3.2 ++ waveshare22 Waveshare 2.2 ++ ++ bd663474 BD663474 display controller ++ hx8340bn HX8340BN display controller ++ hx8347d HX8347D display controller ++ hx8353d HX8353D display controller ++ hx8357d HX8357D display controller ++ ili9163 ILI9163 display controller ++ ili9320 ILI9320 display controller ++ ili9325 ILI9325 display controller ++ ili9340 ILI9340 display controller ++ ili9341 ILI9341 display controller ++ ili9481 ILI9481 display controller ++ ili9486 ILI9486 display controller ++ pcd8544 PCD8544 display controller ++ ra8875 RA8875 display controller ++ s6d02a1 S6D02A1 display controller ++ s6d1121 S6D1121 display controller ++ seps525 SEPS525 display controller ++ sh1106 SH1106 display controller ++ ssd1289 SSD1289 display controller ++ ssd1305 SSD1305 display controller ++ ssd1306 SSD1306 display controller ++ ssd1325 SSD1325 display controller ++ ssd1331 SSD1331 display controller ++ ssd1351 SSD1351 display controller ++ st7735r ST7735R display controller ++ st7789v ST7789V display controller ++ tls8204 TLS8204 display controller ++ uc1611 UC1611 display controller ++ uc1701 UC1701 display controller ++ upd161704 UPD161704 display controller ++ ++ width Display width in pixels ++ height Display height in pixels ++ regwidth Display controller register width (default is ++ driver specific) ++ buswidth Display bus interface width (default 8) ++ debug Debug output level {0-7} ++ rotate Display rotation {0, 90, 180, 270} (counter ++ clockwise). Not supported by all drivers. ++ bgr Enable BGR mode (default off). Use if Red and ++ Blue are swapped. Not supported by all drivers. ++ fps Frames per second (default 30). In effect this ++ states how long the driver will wait after video ++ memory has been changed until display update ++ transfer is started. ++ txbuflen Length of the FBTFT transmit buffer ++ (default 4096) ++ startbyte Sets the Start byte used by fb_ili9320, ++ fb_ili9325 and fb_hx8347d. Common value is 0x70. ++ gamma String representation of Gamma Curve(s). Driver ++ specific. Not supported by all drivers. ++ reset_pin GPIO pin for RESET ++ dc_pin GPIO pin for D/C ++ led_pin GPIO pin for LED backlight ++ ++ ++Name: fe-pi-audio ++Info: Configures the Fe-Pi Audio Sound Card ++Load: dtoverlay=fe-pi-audio ++Params: ++ ++ ++Name: fsm-demo ++Info: A demonstration of the gpio-fsm driver. The GPIOs are chosen to work ++ nicely with a "traffic-light" display of red, amber and green LEDs on ++ GPIOs 7, 8 and 25 respectively. ++Load: dtoverlay=fsm-demo,= ++Params: fsm_debug Enable debug logging (default off) ++ ++ ++Name: gc9a01 ++Info: Enables GalaxyCore's GC9A01 single chip driver based displays on ++ SPI0 as fb1, using GPIOs DC=25, RST=27 and BL=18 (physical ++ GPIO header pins 22, 13 and 12 respectively) in addition to the ++ SPI0 pins DIN=10, CLK=11 and CS=8 (physical GPIO header pins 19, ++ 23 and 24 respectively). ++Load: dtoverlay=gc9a01,= ++Params: speed Display SPI bus speed ++ ++ rotate Display rotation {0,90,180,270} ++ ++ width Width of the display ++ ++ height Height of the display ++ ++ fps Delay between frame updates ++ ++ debug Debug output level {0-7} ++ ++ ++Name: ghost-amp ++Info: An overlay for the Ghost amplifier. ++Load: dtoverlay=ghost-amp,= ++Params: fsm_debug Enable debug logging of the GPIO FSM (default ++ off) ++ ++ ++Name: goodix ++Info: Enables I2C connected Goodix gt9271 multiple touch controller using ++ GPIOs 4 and 17 (pins 7 and 11 on GPIO header) for interrupt and reset. ++Load: dtoverlay=goodix,= ++Params: interrupt GPIO used for interrupt (default 4) ++ reset GPIO used for reset (default 17) ++ ++ ++Name: googlevoicehat-soundcard ++Info: Configures the Google voiceHAT soundcard ++Load: dtoverlay=googlevoicehat-soundcard ++Params: ++ ++ ++Name: gpio-fan ++Info: Configure a GPIO pin to control a cooling fan. ++Load: dtoverlay=gpio-fan,= ++Params: gpiopin GPIO used to control the fan (default 12) ++ temp Temperature at which the fan switches on, in ++ millicelcius (default 55000) ++ hyst Temperature delta (in millicelcius) below ++ temp at which the fan will drop to minrpm ++ (default 10000) ++ ++ ++Name: gpio-hog ++Info: Activate a "hog" for a GPIO - request that the kernel configures it as ++ an output, driven low or high as indicated by the presence or absence ++ of the active_low parameter. Note that a hogged GPIO is not available ++ to other drivers or for gpioset/gpioget. ++Load: dtoverlay=gpio-hog,= ++Params: gpio GPIO pin to hog (default 26) ++ active_low If set, the hog drives the GPIO low (defaults ++ to off - the GPIO is driven high) ++ ++ ++Name: gpio-ir ++Info: Use GPIO pin as rc-core style infrared receiver input. The rc-core- ++ based gpio_ir_recv driver maps received keys directly to a ++ /dev/input/event* device, all decoding is done by the kernel - LIRC is ++ not required! The key mapping and other decoding parameters can be ++ configured by "ir-keytable" tool. ++Load: dtoverlay=gpio-ir,= ++Params: gpio_pin Input pin number. Default is 18. ++ ++ gpio_pull Desired pull-up/down state (off, down, up) ++ Default is "up". ++ ++ invert "1" = invert the input (active-low signalling). ++ "0" = non-inverted input (active-high ++ signalling). Default is "1". ++ ++ rc-map-name Default rc keymap (can also be changed by ++ ir-keytable), defaults to "rc-rc6-mce" ++ ++ ++Name: gpio-ir-tx ++Info: Use GPIO pin as bit-banged infrared transmitter output. ++ This is an alternative to "pwm-ir-tx". gpio-ir-tx doesn't require ++ a PWM so it can be used together with onboard analog audio. ++Load: dtoverlay=gpio-ir-tx,= ++Params: gpio_pin Output GPIO (default 18) ++ ++ invert "1" = invert the output (make it active-low). ++ Default is "0" (active-high). ++ ++ ++Name: gpio-key ++Info: This is a generic overlay for activating GPIO keypresses using ++ the gpio-keys library and this dtoverlay. Multiple keys can be ++ set up using multiple calls to the overlay for configuring ++ additional buttons or joysticks. You can see available keycodes ++ at https://github.com/torvalds/linux/blob/v4.12/include/uapi/ ++ linux/input-event-codes.h#L64 ++Load: dtoverlay=gpio-key,= ++Params: gpio GPIO pin to trigger on (default 3) ++ active_low When this is 1 (active low), a falling ++ edge generates a key down event and a ++ rising edge generates a key up event. ++ When this is 0 (active high), this is ++ reversed. The default is 1 (active low) ++ gpio_pull Desired pull-up/down state (off, down, up) ++ Default is "up". Note that the default pin ++ (GPIO3) has an external pullup ++ label Set a label for the key ++ keycode Set the key code for the button ++ ++ ++ ++Name: gpio-led ++Info: This is a generic overlay for activating LEDs (or any other component) ++ by a GPIO pin. Multiple LEDs can be set up using multiple calls to the ++ overlay. While there are many existing methods to activate LEDs on the ++ RPi, this method offers some advantages: ++ 1) Does not require any userspace programs. ++ 2) LEDs can be connected to the kernel's led-trigger framework, ++ and drive the LED based on triggers such as cpu load, heartbeat, ++ kernel panic, key input, timers and others. ++ 3) LED can be tied to the input state of another GPIO pin. ++ 4) The LED is setup early during the kernel boot process (useful ++ for cpu/heartbeat/panic triggers). ++ ++ Typical electrical connection is: ++ RPI-GPIO.19 -> LED -> 300ohm resister -> RPI-GND ++ The GPIO pin number can be changed with the 'gpio=' parameter. ++ ++ To control an LED from userspace, write a 0 or 1 value: ++ echo 1 > /sys/class/leds/myled1/brightness ++ The 'myled1' name can be changed with the 'label=' parameter. ++ ++ To connect the LED to a kernel trigger from userspace: ++ echo cpu > /sys/class/leds/myled1/trigger ++ echo heartbeat > /sys/class/leds/myled1/trigger ++ echo none > /sys/class/leds/myled1/trigger ++ To connect the LED to GPIO.26 pin (physical pin 37): ++ echo gpio > /sys/class/leds/myled1/trigger ++ echo 26 > /sys/class/leds/myled1/gpio ++ Available triggers: ++ cat /sys/class/leds/myled1/trigger ++ ++ More information about the Linux kernel LED/Trigger system: ++ https://www.kernel.org/doc/Documentation/leds/leds-class.rst ++ https://www.kernel.org/doc/Documentation/leds/ledtrig-oneshot.rst ++Load: dtoverlay=gpio-led,= ++Params: gpio GPIO pin connected to the LED (default 19) ++ label The label for this LED. It will appear under ++ /sys/class/leds/