diff options
author | Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> | 2024-01-30 11:49:32 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-01-30 11:49:32 +0000 |
commit | 5de992082bdd145349c27a08b9f3cd790b0de472 (patch) | |
tree | 95eca457ce33ef495878f5b0e0ad9b8402aadfca | |
parent | 4348e70ef1627d02b4725969f0396ac4edf40038 (diff) | |
parent | 74cf2d4b4d963b7519a281d358d1453503bd00da (diff) | |
download | common-patches-5de992082bdd145349c27a08b9f3cd790b0de472.tar.gz |
Merge changes I7e8ab57e,I105900f4,I82b71d9c,Iaf936ad1,I6983bf67, ... into main
* changes:
aosp/android-mainline: update series (rebase onto v6.7-rc4)
aosp/android-mainline: update series
aosp/android-mainline: update series (rebase onto v6.7-rc3)
aosp/android-mainline: update series (rebase onto v6.7-rc2)
aosp/android-mainline: update series
aosp/android-mainline: update series (rebase onto v6.6-15119-g7f851936a0ca4)
aosp/android-mainline: update series
aosp/android-mainline: update series (rebase onto v6.6-15100-gc9d01179e185f)
aosp/android-mainline: update series (rebase onto v6.6-15029-gbe3ca57cfb777)
aosp/android-mainline: update series
aosp/android-mainline: update series
aosp/android-mainline: update series (rebase onto v6.6-13985-gd934aef6bb9ec)
aosp/android-mainline: update series (rebase onto v6.6-13255-gb06f58ad8e8c4)
aosp/android-mainline: update series (rebase onto v6.6-13233-gd99b91a99be43)
aosp/android-mainline: update series (rebase onto v6.6-12893-ge392ea4d4d008)
aosp/android-mainline: update series (rebase onto v6.6-12401-g8f6f76a6a29f3)
aosp/android-mainline: update series
aosp/android-mainline: update series
aosp/android-mainline: update series (rebase onto v6.6-11928-gbc3012f4e3a97)
aosp/android-mainline: update series (rebase onto v6.6-11644-g6803bd7956ca8)
aosp/android-mainline: update series (rebase onto v6.6-11432-g43468456c95b9)
aosp/android-mainline: update series (rebase onto v6.6-11379-g6ed92e559a2ea)
aosp/android-mainline: update series (rebase onto v6.6-11236-g90a300dc0553c)
aosp/android-mainline: update series
aosp/android-mainline: update series (rebase onto v6.6-11104-gedd8e84ae9514)
aosp/android-mainline: update series
85 files changed, 1689 insertions, 4281 deletions
diff --git a/android-mainline/ANDROID-Clang-LTO-Only-set-fvisibility-hidden-for-x86.patch b/android-mainline/ANDROID-Clang-LTO-Only-set-fvisibility-hidden-for-x86.patch index 1e922ae3..28671358 100644 --- a/android-mainline/ANDROID-Clang-LTO-Only-set-fvisibility-hidden-for-x86.patch +++ b/android-mainline/ANDROID-Clang-LTO-Only-set-fvisibility-hidden-for-x86.patch @@ -20,7 +20,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile -@@ -955,7 +955,13 @@ KBUILD_LDFLAGS += --thinlto-cache-dir=$(extmod_prefix).thinlto-cache +@@ -943,7 +943,13 @@ KBUILD_LDFLAGS += --thinlto-cache-dir=$(extmod_prefix).thinlto-cache else CC_FLAGS_LTO := -flto endif diff --git a/android-mainline/ANDROID-GKI-Android-KABI-and-Android-Vendor.patch b/android-mainline/ANDROID-GKI-Android-KABI-and-Android-Vendor.patch index 095d47a1..133bb748 100644 --- a/android-mainline/ANDROID-GKI-Android-KABI-and-Android-Vendor.patch +++ b/android-mainline/ANDROID-GKI-Android-KABI-and-Android-Vendor.patch @@ -40,7 +40,7 @@ Signed-off-by: Jaskaran Singh <quic_jasksing@quicinc.com> diff --git a/drivers/android/Kconfig b/drivers/android/Kconfig --- a/drivers/android/Kconfig +++ b/drivers/android/Kconfig -@@ -68,6 +68,41 @@ config ANDROID_DEBUG_KINFO +@@ -67,6 +67,41 @@ config ANDROID_DEBUG_KINFO - UTS_RELEASE - BUILD_INFO(ro.build.fingerprint) @@ -236,7 +236,7 @@ diff --git a/include/linux/android_vendor.h b/include/linux/android_vendor.h diff --git a/init/init_task.c b/init/init_task.c --- a/init/init_task.c +++ b/init/init_task.c -@@ -211,8 +211,10 @@ struct task_struct init_task +@@ -210,8 +210,10 @@ struct task_struct init_task #ifdef CONFIG_SECCOMP_FILTER .seccomp = { .filter_count = ATOMIC_INIT(0) }, #endif diff --git a/android-mainline/ANDROID-GKI-Disable-KUnit-built-in-testing.patch b/android-mainline/ANDROID-GKI-Disable-KUnit-built-in-testing.patch index b4fcf3b9..1e241090 100644 --- a/android-mainline/ANDROID-GKI-Disable-KUnit-built-in-testing.patch +++ b/android-mainline/ANDROID-GKI-Disable-KUnit-built-in-testing.patch @@ -25,7 +25,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt -@@ -2534,7 +2534,7 @@ +@@ -2537,7 +2537,7 @@ CONFIG_KUNIT to be set to be fully enabled. The default value can be overridden via KUNIT_DEFAULT_ENABLED. diff --git a/android-mainline/ANDROID-GKI-scripts-Makefile-update-the-lz4-command.patch b/android-mainline/ANDROID-GKI-scripts-Makefile-update-the-lz4-command.patch index 874fb6a2..a9b5b874 100644 --- a/android-mainline/ANDROID-GKI-scripts-Makefile-update-the-lz4-command.patch +++ b/android-mainline/ANDROID-GKI-scripts-Makefile-update-the-lz4-command.patch @@ -26,7 +26,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile -@@ -518,7 +518,7 @@ KGZIP = gzip +@@ -509,7 +509,7 @@ KGZIP = gzip KBZIP2 = bzip2 KLZOP = lzop LZMA = lzma diff --git a/android-mainline/ANDROID-Initial-commit-of-Incremental-FS.patch b/android-mainline/ANDROID-Initial-commit-of-Incremental-FS.patch index fd999eca..d44190d0 100644 --- a/android-mainline/ANDROID-Initial-commit-of-Incremental-FS.patch +++ b/android-mainline/ANDROID-Initial-commit-of-Incremental-FS.patch @@ -230,7 +230,7 @@ new file mode 100644 diff --git a/MAINTAINERS b/MAINTAINERS --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -10346,6 +10346,13 @@ F: Documentation/hwmon/ina2xx.rst +@@ -10422,6 +10422,13 @@ F: Documentation/hwmon/ina2xx.rst F: drivers/hwmon/ina2xx.c F: include/linux/platform_data/ina2xx.h diff --git a/android-mainline/ANDROID-RISC-V-Support-32_PCREL-relocation-type-in-kernel-module.patch b/android-mainline/ANDROID-RISC-V-Support-32_PCREL-relocation-type-in-kernel-module.patch deleted file mode 100644 index 85f3501c..00000000 --- a/android-mainline/ANDROID-RISC-V-Support-32_PCREL-relocation-type-in-kernel-module.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: nylon chen <nylon.chen@sifive.com> -Date: Fri, 26 May 2023 07:08:42 +0000 -Subject: ANDROID: RISC-V: Support 32_PCREL relocation type in kernel module - -Update the kernel module loader to handle R_RISCV_32_PCREL which LLVM -is generating for some modules now. - -Bug: 286415667 -Link: https://github.com/google/android-riscv64/issues/86 -Change-Id: I396dc13fa9833fa35c4d883fadb116eed76da9d3 -Signed-off-by: nylon chen <nylon.chen@sifive.com> -Signed-off-by: Alistair Delva <adelva@google.com> ---- - arch/riscv/kernel/module.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/arch/riscv/kernel/module.c b/arch/riscv/kernel/module.c ---- a/arch/riscv/kernel/module.c -+++ b/arch/riscv/kernel/module.c -@@ -310,6 +310,15 @@ static int apply_r_riscv_sub64_rela(struct module *me, u32 *location, - return 0; - } - -+static int apply_r_riscv_pcrel_32_rela(struct module *me, u32 *location, -+ Elf_Addr v) -+{ -+ ptrdiff_t offset = (void *)v - (void *)location; -+ -+ *location = (*location & 0xffff0000) | (offset & 0xffff); -+ return 0; -+} -+ - static int (*reloc_handlers_rela[]) (struct module *me, u32 *location, - Elf_Addr v) = { - [R_RISCV_32] = apply_r_riscv_32_rela, -@@ -335,6 +344,7 @@ static int (*reloc_handlers_rela[]) (struct module *me, u32 *location, - [R_RISCV_SUB16] = apply_r_riscv_sub16_rela, - [R_RISCV_SUB32] = apply_r_riscv_sub32_rela, - [R_RISCV_SUB64] = apply_r_riscv_sub64_rela, -+ [R_RISCV_32_PCREL] = apply_r_riscv_pcrel_32_rela, - }; - - int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, diff --git a/android-mainline/ANDROID-Revert-io_uring-rely-solely-on-FMODE_NOWAIT.patch b/android-mainline/ANDROID-Revert-io_uring-rely-solely-on-FMODE_NOWAIT.patch index d7416737..0b015060 100644 --- a/android-mainline/ANDROID-Revert-io_uring-rely-solely-on-FMODE_NOWAIT.patch +++ b/android-mainline/ANDROID-Revert-io_uring-rely-solely-on-FMODE_NOWAIT.patch @@ -27,7 +27,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c -@@ -1760,6 +1760,11 @@ static void io_iopoll_req_issued(struct io_kiocb *req, unsigned int issue_flags) +@@ -1761,6 +1761,11 @@ static void io_iopoll_req_issued(struct io_kiocb *req, unsigned int issue_flags) } } @@ -39,7 +39,7 @@ diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c /* * If we tracked the file through the SCM inflight mechanism, we could support * any file. For now, just ensure that anything potentially problematic is done -@@ -1767,6 +1772,22 @@ static void io_iopoll_req_issued(struct io_kiocb *req, unsigned int issue_flags) +@@ -1768,6 +1773,22 @@ static void io_iopoll_req_issued(struct io_kiocb *req, unsigned int issue_flags) */ static bool __io_file_supports_nowait(struct file *file, umode_t mode) { diff --git a/android-mainline/ANDROID-Revert-io_uring-remove-__io_file_supports_nowait.patch b/android-mainline/ANDROID-Revert-io_uring-remove-__io_file_supports_nowait.patch index bc0b7ddf..59334f32 100644 --- a/android-mainline/ANDROID-Revert-io_uring-remove-__io_file_supports_nowait.patch +++ b/android-mainline/ANDROID-Revert-io_uring-remove-__io_file_supports_nowait.patch @@ -25,7 +25,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c -@@ -1760,6 +1760,19 @@ static void io_iopoll_req_issued(struct io_kiocb *req, unsigned int issue_flags) +@@ -1761,6 +1761,19 @@ static void io_iopoll_req_issued(struct io_kiocb *req, unsigned int issue_flags) } } @@ -45,7 +45,7 @@ diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c unsigned int io_file_get_flags(struct file *file) { umode_t mode = file_inode(file)->i_mode; -@@ -1767,7 +1780,7 @@ unsigned int io_file_get_flags(struct file *file) +@@ -1768,7 +1781,7 @@ unsigned int io_file_get_flags(struct file *file) if (S_ISREG(mode)) res |= REQ_F_ISREG; diff --git a/android-mainline/ANDROID-Revert-io_uring-remove-the-mode-variable-in-io_file_get_flags.patch b/android-mainline/ANDROID-Revert-io_uring-remove-the-mode-variable-in-io_file_get_flags.patch index 04c1a46f..48f4b265 100644 --- a/android-mainline/ANDROID-Revert-io_uring-remove-the-mode-variable-in-io_file_get_flags.patch +++ b/android-mainline/ANDROID-Revert-io_uring-remove-the-mode-variable-in-io_file_get_flags.patch @@ -26,7 +26,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c -@@ -1762,9 +1762,10 @@ static void io_iopoll_req_issued(struct io_kiocb *req, unsigned int issue_flags) +@@ -1763,9 +1763,10 @@ static void io_iopoll_req_issued(struct io_kiocb *req, unsigned int issue_flags) unsigned int io_file_get_flags(struct file *file) { diff --git a/android-mainline/ANDROID-Revert-perf-core-Use-static_call-to-optimize-perf_guest_info_callbacks.patch b/android-mainline/ANDROID-Revert-perf-core-Use-static_call-to-optimize-perf_guest_info_callbacks.patch index 643b7427..514fb646 100644 --- a/android-mainline/ANDROID-Revert-perf-core-Use-static_call-to-optimize-perf_guest_info_callbacks.patch +++ b/android-mainline/ANDROID-Revert-perf-core-Use-static_call-to-optimize-perf_guest_info_callbacks.patch @@ -54,7 +54,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h -@@ -1494,22 +1494,40 @@ extern void perf_event_bpf_event(struct bpf_prog *prog, +@@ -1497,22 +1497,40 @@ extern void perf_event_bpf_event(struct bpf_prog *prog, #ifdef CONFIG_GUEST_PERF_EVENTS extern struct perf_guest_info_callbacks __rcu *perf_guest_cbs; @@ -106,7 +106,7 @@ diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h diff --git a/kernel/events/core.c b/kernel/events/core.c --- a/kernel/events/core.c +++ b/kernel/events/core.c -@@ -6800,23 +6800,12 @@ static void perf_pending_task(struct callback_head *head) +@@ -6805,23 +6805,12 @@ static void perf_pending_task(struct callback_head *head) #ifdef CONFIG_GUEST_PERF_EVENTS struct perf_guest_info_callbacks __rcu *perf_guest_cbs; @@ -130,7 +130,7 @@ diff --git a/kernel/events/core.c b/kernel/events/core.c } EXPORT_SYMBOL_GPL(perf_register_guest_info_callbacks); -@@ -6826,10 +6815,6 @@ void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs) +@@ -6831,10 +6820,6 @@ void perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *cbs) return; rcu_assign_pointer(perf_guest_cbs, NULL); diff --git a/android-mainline/ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch b/android-mainline/ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch deleted file mode 100644 index f337e929..00000000 --- a/android-mainline/ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Andr=C3=A9=20Draszik?= <draszik@google.com> -Date: Wed, 25 Oct 2023 14:26:51 +0100 -Subject: ANDROID: Revert "usb: typec: tcpm: not sink vbus if operational - current is 0mA" -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This reverts commit 803b1c8a0cea58cccde16eba31d285956f4c920c. - -Prevents Pixel from charging. Revert while we investigate the issue. - -Test: adb shell cat /sys/class/power_supply/battery/status -Bug: 307718635 -Change-Id: I9e8c6c62aac25cf41ac37c1d6bda696d8ecaf4aa -Signed-off-by: André Draszik <draszik@google.com> ---- - drivers/usb/typec/tcpm/tcpm.c | 7 ++----- - 1 file changed, 2 insertions(+), 5 deletions(-) - -diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c ---- a/drivers/usb/typec/tcpm/tcpm.c -+++ b/drivers/usb/typec/tcpm/tcpm.c -@@ -4267,9 +4267,7 @@ static void run_state_machine(struct tcpm_port *port) - if (port->slow_charger_loop && (current_lim > PD_P_SNK_STDBY_MW / 5)) - current_lim = PD_P_SNK_STDBY_MW / 5; - tcpm_set_current_limit(port, current_lim, 5000); -- /* Not sink vbus if operational current is 0mA */ -- tcpm_set_charge(port, !!pdo_max_current(port->snk_pdo[0])); -- -+ tcpm_set_charge(port, true); - if (!port->pd_supported) - tcpm_set_state(port, SNK_READY, 0); - else -@@ -4552,8 +4550,7 @@ static void run_state_machine(struct tcpm_port *port) - tcpm_set_current_limit(port, - tcpm_get_current_limit(port), - 5000); -- /* Not sink vbus if operational current is 0mA */ -- tcpm_set_charge(port, !!pdo_max_current(port->snk_pdo[0])); -+ tcpm_set_charge(port, true); - } - if (port->ams == HARD_RESET) - tcpm_ams_finish(port); diff --git a/android-mainline/ANDROID-SoC-core-Introduce-macro-SOC_SINGLE_MULTI_EXT.patch b/android-mainline/ANDROID-SoC-core-Introduce-macro-SOC_SINGLE_MULTI_EXT.patch deleted file mode 100644 index 87b58445..00000000 --- a/android-mainline/ANDROID-SoC-core-Introduce-macro-SOC_SINGLE_MULTI_EXT.patch +++ /dev/null @@ -1,103 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Meng Wang <mwang@codeaurora.org> -Date: Wed, 6 Sep 2017 10:21:14 +0800 -Subject: ANDROID: SoC: core: Introduce macro SOC_SINGLE_MULTI_EXT - -For some of the mixer controls, client would like to register -count as a parameter. Macro adds support to specify the count. - -[CPNOTE: 19/07/21] Lee: Requested status via the bug - -BUG: 144610828 -Change-Id: I26343af2e4a35952d93dc2d5fa0caad2a3e50ffe -Signed-off-by: Banajit Goswami <bgoswami@codeaurora.org> -Signed-off-by: Sudheer Papothi <spapothi@codeaurora.org> -Signed-off-by: Meng Wang <mwang@codeaurora.org> -Signed-off-by: Lee Jones <joneslee@google.com> ---- - include/sound/soc.h | 15 +++++++++++++++ - sound/soc/soc-core.c | 33 +++++++++++++++++++++++++++++++++ - 2 files changed, 48 insertions(+) - -diff --git a/include/sound/soc.h b/include/sound/soc.h ---- a/include/sound/soc.h -+++ b/include/sound/soc.h -@@ -253,6 +253,14 @@ - .get = xhandler_get, .put = xhandler_put, \ - .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \ - xmax, xinvert) } -+#define SOC_SINGLE_MULTI_EXT(xname, xreg, xshift, xmax, xinvert, xcount,\ -+ xhandler_get, xhandler_put) \ -+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ -+ .info = snd_soc_info_multi_ext, \ -+ .get = xhandler_get, .put = xhandler_put, \ -+ .private_value = (unsigned long)&(struct soc_multi_mixer_control) \ -+ {.reg = xreg, .shift = xshift, .rshift = xshift, .max = xmax, \ -+ .count = xcount, .platform_max = xmax, .invert = xinvert} } - #define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\ - xhandler_get, xhandler_put, tlv_array) \ - { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ -@@ -606,6 +614,8 @@ int snd_soc_get_strobe(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); - int snd_soc_put_strobe(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol); -+int snd_soc_info_multi_ext(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_info *uinfo); - - enum snd_soc_trigger_order { - /* start stop */ -@@ -1194,6 +1204,11 @@ struct soc_mreg_control { - unsigned int regbase, regcount, nbits, invert; - }; - -+struct soc_multi_mixer_control { -+ int min, max, platform_max, count; -+ unsigned int reg, rreg, shift, rshift, invert; -+}; -+ - /* enumerated kcontrol */ - struct soc_enum { - int reg; -diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c ---- a/sound/soc/soc-core.c -+++ b/sound/soc/soc-core.c -@@ -3366,6 +3366,39 @@ int snd_soc_get_dai_id(struct device_node *ep) - } - EXPORT_SYMBOL_GPL(snd_soc_get_dai_id); - -+/** -+ * snd_soc_info_multi_ext - external single mixer info callback -+ * @kcontrol: mixer control -+ * @uinfo: control element information -+ * -+ * Callback to provide information about a single external mixer control. -+ * that accepts multiple input. -+ * -+ * Returns 0 for success. -+ */ -+int snd_soc_info_multi_ext(struct snd_kcontrol *kcontrol, -+ struct snd_ctl_elem_info *uinfo) -+{ -+ struct soc_multi_mixer_control *mc = -+ (struct soc_multi_mixer_control *)kcontrol->private_value; -+ int platform_max; -+ -+ if (!mc->platform_max) -+ mc->platform_max = mc->max; -+ platform_max = mc->platform_max; -+ -+ if (platform_max == 1 && !strnstr(kcontrol->id.name, " Volume", 30)) -+ uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; -+ else -+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; -+ -+ uinfo->count = mc->count; -+ uinfo->value.integer.min = 0; -+ uinfo->value.integer.max = platform_max; -+ return 0; -+} -+EXPORT_SYMBOL_GPL(snd_soc_info_multi_ext); -+ - int snd_soc_get_dlc(const struct of_phandle_args *args, struct snd_soc_dai_link_component *dlc) - { - struct snd_soc_component *pos; diff --git a/android-mainline/ANDROID-cpufreq-track-per-task-time-in-state.patch b/android-mainline/ANDROID-cpufreq-track-per-task-time-in-state.patch index a2f9aa51..323df353 100644 --- a/android-mainline/ANDROID-cpufreq-track-per-task-time-in-state.patch +++ b/android-mainline/ANDROID-cpufreq-track-per-task-time-in-state.patch @@ -321,7 +321,7 @@ diff --git a/fs/proc/base.c b/fs/proc/base.c #include <trace/events/oom.h> #include "internal.h" #include "fd.h" -@@ -3339,6 +3340,9 @@ static const struct pid_entry tgid_base_stuff[] = { +@@ -3347,6 +3348,9 @@ static const struct pid_entry tgid_base_stuff[] = { #ifdef CONFIG_LIVEPATCH ONE("patch_state", S_IRUSR, proc_pid_patch_state), #endif @@ -331,7 +331,7 @@ diff --git a/fs/proc/base.c b/fs/proc/base.c #ifdef CONFIG_STACKLEAK_METRICS ONE("stack_depth", S_IRUGO, proc_stack_depth), #endif -@@ -3691,6 +3695,9 @@ static const struct pid_entry tid_base_stuff[] = { +@@ -3699,6 +3703,9 @@ static const struct pid_entry tid_base_stuff[] = { ONE("ksm_merging_pages", S_IRUSR, proc_pid_ksm_merging_pages), ONE("ksm_stat", S_IRUSR, proc_pid_ksm_stat), #endif @@ -391,7 +391,7 @@ new file mode 100644 diff --git a/include/linux/sched.h b/include/linux/sched.h --- a/include/linux/sched.h +++ b/include/linux/sched.h -@@ -1030,6 +1030,10 @@ struct task_struct { +@@ -1029,6 +1029,10 @@ struct task_struct { u64 stimescaled; #endif u64 gtime; @@ -430,7 +430,7 @@ diff --git a/kernel/fork.c b/kernel/fork.c if (args->name) strscpy_pad(p->comm, args->name, sizeof(p->comm)); -@@ -2917,6 +2921,8 @@ pid_t kernel_clone(struct kernel_clone_args *args) +@@ -2910,6 +2914,8 @@ pid_t kernel_clone(struct kernel_clone_args *args) if (IS_ERR(p)) return PTR_ERR(p); diff --git a/android-mainline/ANDROID-default-enable-VHOST_TASK.patch b/android-mainline/ANDROID-default-enable-VHOST_TASK.patch deleted file mode 100644 index 90cddf8c..00000000 --- a/android-mainline/ANDROID-default-enable-VHOST_TASK.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Ram Muthiah <rammuthiah@google.com> -Date: Tue, 15 Aug 2023 07:06:15 -0700 -Subject: ANDROID: default enable VHOST_TASK - -VHOST_TASK cannot be manually enabled from any defconfig. -To workaround this, make it a default builtin. - -Bug: 182417593 -Change-Id: Ia1e5d42dbbcb324c85e89164e6c50eed24b400d9 -Signed-off-by: Ram Muthiah <rammuthiah@google.com> ---- - drivers/vhost/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig ---- a/drivers/vhost/Kconfig -+++ b/drivers/vhost/Kconfig -@@ -15,7 +15,7 @@ config VHOST_RING - - config VHOST_TASK - bool -- default n -+ default y - - config VHOST - tristate diff --git a/android-mainline/ANDROID-dm-add-dm-default-key-target-for-metadata-encryption.patch b/android-mainline/ANDROID-dm-add-dm-default-key-target-for-metadata-encryption.patch index e24b8005..7c4d53e6 100644 --- a/android-mainline/ANDROID-dm-add-dm-default-key-target-for-metadata-encryption.patch +++ b/android-mainline/ANDROID-dm-add-dm-default-key-target-for-metadata-encryption.patch @@ -674,7 +674,7 @@ diff --git a/include/linux/blk-crypto.h b/include/linux/blk-crypto.h diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h -@@ -293,6 +293,9 @@ struct bio { +@@ -295,6 +295,9 @@ struct bio { #ifdef CONFIG_BLK_INLINE_ENCRYPTION struct bio_crypt_ctx *bi_crypt_context; diff --git a/android-mainline/ANDROID-fs-Move-iocb_to_rw_flags-to-fuse-passthrough.patch b/android-mainline/ANDROID-fs-Move-iocb_to_rw_flags-to-fuse-passthrough.patch new file mode 100644 index 00000000..61c4d317 --- /dev/null +++ b/android-mainline/ANDROID-fs-Move-iocb_to_rw_flags-to-fuse-passthrough.patch @@ -0,0 +1,63 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Alessio Balsini <balsini@google.com> +Date: Fri, 5 Jan 2024 14:14:18 +0000 +Subject: ANDROID: fs: Move iocb_to_rw_flags to fuse/passthrough + +Fixup build error in aosp/2896080 by migrating iocb_to_rw_flags() to +FUSE passthrough, which depends on it. +To avoid possible name overlapping, the "fuse_" prefix is added to the +function name. + +This change is meant to be a fixup for aosp/2896080. + +Test: build +Bug: 168023149 +Change-Id: I7696d22a0671cbd457084a17be4e7315109819a3 +Signed-off-by: Alessio Balsini <balsini@google.com> +--- + fs/fuse/passthrough.c | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c +--- a/fs/fuse/passthrough.c ++++ b/fs/fuse/passthrough.c +@@ -15,6 +15,11 @@ struct fuse_aio_req { + struct kiocb *iocb_fuse; + }; + ++static inline rwf_t fuse_iocb_to_rw_flags(int ifl, int iocb_mask) ++{ ++ return ifl & iocb_mask; ++} ++ + static void fuse_file_accessed(struct file *dst_file, struct file *src_file) + { + struct inode *dst_inode; +@@ -95,9 +100,10 @@ ssize_t fuse_passthrough_read_iter(struct kiocb *iocb_fuse, + + old_cred = override_creds(ff->passthrough.cred); + if (is_sync_kiocb(iocb_fuse)) { +- ret = vfs_iter_read(passthrough_filp, iter, &iocb_fuse->ki_pos, +- iocb_to_rw_flags(iocb_fuse->ki_flags, +- PASSTHROUGH_IOCB_MASK)); ++ ret = vfs_iter_read( ++ passthrough_filp, iter, &iocb_fuse->ki_pos, ++ fuse_iocb_to_rw_flags(iocb_fuse->ki_flags, ++ PASSTHROUGH_IOCB_MASK)); + } else { + struct fuse_aio_req *aio_req; + +@@ -139,9 +145,10 @@ ssize_t fuse_passthrough_write_iter(struct kiocb *iocb_fuse, + old_cred = override_creds(ff->passthrough.cred); + if (is_sync_kiocb(iocb_fuse)) { + file_start_write(passthrough_filp); +- ret = vfs_iter_write(passthrough_filp, iter, &iocb_fuse->ki_pos, +- iocb_to_rw_flags(iocb_fuse->ki_flags, +- PASSTHROUGH_IOCB_MASK)); ++ ret = vfs_iter_write( ++ passthrough_filp, iter, &iocb_fuse->ki_pos, ++ fuse_iocb_to_rw_flags(iocb_fuse->ki_flags, ++ PASSTHROUGH_IOCB_MASK)); + file_end_write(passthrough_filp); + if (ret > 0) + fuse_copyattr(fuse_filp, passthrough_filp); diff --git a/android-mainline/ANDROID-fs-fuse-Keep-FUSE-file-times-consistent-with-lower-file.patch b/android-mainline/ANDROID-fs-fuse-Keep-FUSE-file-times-consistent-with-lower-file.patch index eba512a8..09276158 100644 --- a/android-mainline/ANDROID-fs-fuse-Keep-FUSE-file-times-consistent-with-lower-file.patch +++ b/android-mainline/ANDROID-fs-fuse-Keep-FUSE-file-times-consistent-with-lower-file.patch @@ -23,7 +23,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c --- a/fs/fuse/passthrough.c +++ b/fs/fuse/passthrough.c -@@ -117,6 +117,8 @@ ssize_t fuse_passthrough_read_iter(struct kiocb *iocb_fuse, +@@ -123,6 +123,8 @@ ssize_t fuse_passthrough_read_iter(struct kiocb *iocb_fuse, out: revert_creds(old_cred); @@ -32,7 +32,7 @@ diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c return ret; } -@@ -136,6 +138,8 @@ ssize_t fuse_passthrough_write_iter(struct kiocb *iocb_fuse, +@@ -142,6 +144,8 @@ ssize_t fuse_passthrough_write_iter(struct kiocb *iocb_fuse, inode_lock(fuse_inode); @@ -41,7 +41,7 @@ diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c old_cred = override_creds(ff->passthrough.cred); if (is_sync_kiocb(iocb_fuse)) { file_start_write(passthrough_filp); -@@ -176,9 +180,7 @@ ssize_t fuse_passthrough_mmap(struct file *file, struct vm_area_struct *vma) +@@ -183,9 +187,7 @@ ssize_t fuse_passthrough_mmap(struct file *file, struct vm_area_struct *vma) int ret; const struct cred *old_cred; struct fuse_file *ff = file->private_data; @@ -51,7 +51,7 @@ diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c if (!passthrough_filp->f_op->mmap) return -ENODEV; -@@ -197,17 +199,7 @@ ssize_t fuse_passthrough_mmap(struct file *file, struct vm_area_struct *vma) +@@ -204,17 +206,7 @@ ssize_t fuse_passthrough_mmap(struct file *file, struct vm_area_struct *vma) else fput(file); diff --git a/android-mainline/ANDROID-fs-fuse-Use-extended-init-flags-for-FUSE_PASSTHROUGH.patch b/android-mainline/ANDROID-fs-fuse-Use-extended-init-flags-for-FUSE_PASSTHROUGH.patch index be0d0a0e..0698aec7 100644 --- a/android-mainline/ANDROID-fs-fuse-Use-extended-init-flags-for-FUSE_PASSTHROUGH.patch +++ b/android-mainline/ANDROID-fs-fuse-Use-extended-init-flags-for-FUSE_PASSTHROUGH.patch @@ -33,7 +33,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c -@@ -1295,6 +1295,8 @@ void fuse_send_init(struct fuse_mount *fm) +@@ -1296,6 +1296,8 @@ void fuse_send_init(struct fuse_mount *fm) if (fm->fc->auto_submounts) flags |= FUSE_SUBMOUNTS; diff --git a/android-mainline/ANDROID-fuse-Add-support-for-d_canonical_path.patch b/android-mainline/ANDROID-fuse-Add-support-for-d_canonical_path.patch index 49864681..7acf6b16 100644 --- a/android-mainline/ANDROID-fuse-Add-support-for-d_canonical_path.patch +++ b/android-mainline/ANDROID-fuse-Add-support-for-d_canonical_path.patch @@ -134,7 +134,7 @@ diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c --- a/fs/fuse/passthrough.c +++ b/fs/fuse/passthrough.c -@@ -212,8 +212,7 @@ ssize_t fuse_passthrough_mmap(struct file *file, struct vm_area_struct *vma) +@@ -219,8 +219,7 @@ ssize_t fuse_passthrough_mmap(struct file *file, struct vm_area_struct *vma) return ret; } @@ -144,7 +144,7 @@ diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c { int res; struct file *passthrough_filp; -@@ -225,11 +224,7 @@ int fuse_passthrough_open(struct fuse_dev *fud, +@@ -232,11 +231,7 @@ int fuse_passthrough_open(struct fuse_dev *fud, if (!fc->passthrough) return -EPERM; diff --git a/android-mainline/ANDROID-iommu-Add-vendor-hook-for-iova-allocation-and-free-tracking.patch b/android-mainline/ANDROID-iommu-Add-vendor-hook-for-iova-allocation-and-free-tracking.patch index a6843f5a..db10c854 100644 --- a/android-mainline/ANDROID-iommu-Add-vendor-hook-for-iova-allocation-and-free-tracking.patch +++ b/android-mainline/ANDROID-iommu-Add-vendor-hook-for-iova-allocation-and-free-tracking.patch @@ -41,7 +41,7 @@ diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c #include "dma-iommu.h" -@@ -698,6 +699,7 @@ static dma_addr_t iommu_dma_alloc_iova(struct iommu_domain *domain, +@@ -802,6 +803,7 @@ static dma_addr_t iommu_dma_alloc_iova(struct iommu_domain *domain, iova = alloc_iova_fast(iovad, iova_len, dma_limit >> shift, true); done: @@ -49,7 +49,7 @@ diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c return (dma_addr_t)iova << shift; } -@@ -716,6 +718,8 @@ static void iommu_dma_free_iova(struct iommu_dma_cookie *cookie, +@@ -820,6 +822,8 @@ static void iommu_dma_free_iova(struct iommu_dma_cookie *cookie, else free_iova_fast(iovad, iova_pfn(iovad, iova), size >> iova_shift(iovad)); diff --git a/android-mainline/ANDROID-irqchip-Add-IRQChip-related-vendor-hooks.patch b/android-mainline/ANDROID-irqchip-Add-IRQChip-related-vendor-hooks.patch index 91d8eae6..b406fe08 100644 --- a/android-mainline/ANDROID-irqchip-Add-IRQChip-related-vendor-hooks.patch +++ b/android-mainline/ANDROID-irqchip-Add-IRQChip-related-vendor-hooks.patch @@ -53,7 +53,7 @@ diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c #include <linux/irqchip.h> #include <linux/irqchip/arm-gic-common.h> -@@ -969,11 +970,15 @@ static void __init gic_dist_init(void) +@@ -968,11 +969,15 @@ static void __init gic_dist_init(void) * enabled. */ affinity = gic_cpu_to_affinity(smp_processor_id()); @@ -71,7 +71,7 @@ diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c } static int gic_iterate_rdists(int (*fn)(struct redist_region *, void __iomem *)) -@@ -1437,6 +1442,9 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, +@@ -1436,6 +1441,9 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, reg = gic_dist_base(d) + offset + (index * 8); val = gic_cpu_to_affinity(cpu); diff --git a/android-mainline/ANDROID-kbuild-add-support-for-compiling-external-device-trees.patch b/android-mainline/ANDROID-kbuild-add-support-for-compiling-external-device-trees.patch index 1a97b40c..468f29e8 100644 --- a/android-mainline/ANDROID-kbuild-add-support-for-compiling-external-device-trees.patch +++ b/android-mainline/ANDROID-kbuild-add-support-for-compiling-external-device-trees.patch @@ -33,7 +33,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile -@@ -1407,7 +1407,9 @@ kselftest-merge: +@@ -1404,7 +1404,9 @@ kselftest-merge: # Devicetree files ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/boot/dts/),) @@ -44,7 +44,7 @@ diff --git a/Makefile b/Makefile endif ifneq ($(dtstree),) -@@ -1953,7 +1955,9 @@ $(clean-dirs): +@@ -1951,7 +1953,9 @@ $(clean-dirs): clean: $(clean-dirs) $(call cmd,rmfiles) diff --git a/android-mainline/ANDROID-mm-Memory-health-driver.patch b/android-mainline/ANDROID-mm-Memory-health-driver.patch index 249cb03f..dbbdf83a 100644 --- a/android-mainline/ANDROID-mm-Memory-health-driver.patch +++ b/android-mainline/ANDROID-mm-Memory-health-driver.patch @@ -534,7 +534,7 @@ new file mode 100644 diff --git a/mm/oom_kill.c b/mm/oom_kill.c --- a/mm/oom_kill.c +++ b/mm/oom_kill.c -@@ -777,6 +777,12 @@ static void mark_oom_victim(struct task_struct *tsk) +@@ -775,6 +775,12 @@ static void mark_oom_victim(struct task_struct *tsk) trace_mark_victim(tsk->pid); } @@ -550,7 +550,7 @@ diff --git a/mm/oom_kill.c b/mm/oom_kill.c diff --git a/mm/vmscan.c b/mm/vmscan.c --- a/mm/vmscan.c +++ b/mm/vmscan.c -@@ -7081,6 +7081,13 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order, +@@ -6388,6 +6388,13 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order, return nr_reclaimed; } diff --git a/android-mainline/ANDROID-mm-cma-retry-allocations-in-cma_alloc.patch b/android-mainline/ANDROID-mm-cma-retry-allocations-in-cma_alloc.patch index 031ebf8b..b64dfbe6 100644 --- a/android-mainline/ANDROID-mm-cma-retry-allocations-in-cma_alloc.patch +++ b/android-mainline/ANDROID-mm-cma-retry-allocations-in-cma_alloc.patch @@ -173,7 +173,7 @@ diff --git a/mm/cma.c b/mm/cma.c if (ret == 0) { page = pfn_to_page(pfn); @@ -508,7 +537,7 @@ struct page *cma_alloc(struct cma *cma, unsigned long count, - page_kasan_tag_reset(page + i); + page_kasan_tag_reset(nth_page(page, i)); } - if (ret && !no_warn) { @@ -209,7 +209,7 @@ diff --git a/mm/cma.c b/mm/cma.c diff --git a/mm/page_alloc.c b/mm/page_alloc.c --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -6034,12 +6034,16 @@ int __alloc_contig_migrate_range(struct compact_control *cc, +@@ -6228,12 +6228,16 @@ int __alloc_contig_migrate_range(struct compact_control *cc, unsigned int nr_reclaimed; unsigned long pfn = start; unsigned int tries = 0; @@ -226,7 +226,7 @@ diff --git a/mm/page_alloc.c b/mm/page_alloc.c lru_cache_disable(); while (pfn < end || !list_empty(&cc->migratepages)) { -@@ -6055,7 +6059,7 @@ int __alloc_contig_migrate_range(struct compact_control *cc, +@@ -6249,7 +6253,7 @@ int __alloc_contig_migrate_range(struct compact_control *cc, break; pfn = cc->migrate_pfn; tries = 0; @@ -235,7 +235,7 @@ diff --git a/mm/page_alloc.c b/mm/page_alloc.c ret = -EBUSY; break; } -@@ -6117,7 +6121,11 @@ int alloc_contig_range(unsigned long start, unsigned long end, +@@ -6311,7 +6315,11 @@ int alloc_contig_range(unsigned long start, unsigned long end, .nr_migratepages = 0, .order = -1, .zone = page_zone(pfn_to_page(start)), @@ -248,7 +248,7 @@ diff --git a/mm/page_alloc.c b/mm/page_alloc.c .ignore_skip_hint = true, .no_set_skip_hint = true, .gfp_mask = current_gfp_context(gfp_mask), -@@ -6163,7 +6171,7 @@ int alloc_contig_range(unsigned long start, unsigned long end, +@@ -6357,7 +6365,7 @@ int alloc_contig_range(unsigned long start, unsigned long end, * -EBUSY is not accidentally used or returned to caller. */ ret = __alloc_contig_migrate_range(&cc, start, end); diff --git a/android-mainline/ANDROID-modules-re-introduce-the-MODULE_SCMVERSION-config.patch b/android-mainline/ANDROID-modules-re-introduce-the-MODULE_SCMVERSION-config.patch index faf2daa7..c4b7b158 100644 --- a/android-mainline/ANDROID-modules-re-introduce-the-MODULE_SCMVERSION-config.patch +++ b/android-mainline/ANDROID-modules-re-introduce-the-MODULE_SCMVERSION-config.patch @@ -164,7 +164,7 @@ diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c -@@ -31,6 +31,8 @@ static bool modversions; +@@ -30,6 +30,8 @@ static bool modversions; static bool all_versions; /* If we are modposting external module set to 1 */ static bool external_module; @@ -173,7 +173,7 @@ diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c /* Only warn about unresolved symbols */ static bool warn_unresolved; -@@ -1942,6 +1944,9 @@ static void add_header(struct buffer *b, struct module *mod) +@@ -1841,6 +1843,9 @@ static void add_header(struct buffer *b, struct module *mod) if (!external_module) buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n"); @@ -183,7 +183,7 @@ diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c buf_printf(b, "\n" "#ifdef CONFIG_RETPOLINE\n" -@@ -2284,7 +2289,7 @@ int main(int argc, char **argv) +@@ -2183,7 +2188,7 @@ int main(int argc, char **argv) LIST_HEAD(dump_lists); struct dump_list *dl, *dl2; @@ -192,7 +192,7 @@ diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c switch (opt) { case 'e': external_module = true; -@@ -2333,6 +2338,9 @@ int main(int argc, char **argv) +@@ -2232,6 +2237,9 @@ int main(int argc, char **argv) case 'd': missing_namespace_deps = optarg; break; diff --git a/android-mainline/ANDROID-overlayfs-override_creds-off-option-bypass-creator_cred.patch b/android-mainline/ANDROID-overlayfs-override_creds-off-option-bypass-creator_cred.patch index 2277eeea..f4894eb1 100644 --- a/android-mainline/ANDROID-overlayfs-override_creds-off-option-bypass-creator_cred.patch +++ b/android-mainline/ANDROID-overlayfs-override_creds-off-option-bypass-creator_cred.patch @@ -43,18 +43,18 @@ Signed-off-by: Mark Salyzyn <salyzyn@android.com> Signed-off-by: Daniel Rosenberg <drosen@google.com> Test: adb-remount-test.sh --- - Documentation/filesystems/overlayfs.rst | 24 +++++++++++++++++++++ + Documentation/filesystems/overlayfs.rst | 24 ++++++++++++++++++++++ fs/overlayfs/copy_up.c | 2 +- - fs/overlayfs/dir.c | 17 ++++++++------- - fs/overlayfs/file.c | 27 ++++++++++++------------ - fs/overlayfs/inode.c | 28 ++++++++++++------------- - fs/overlayfs/namei.c | 8 +++---- + fs/overlayfs/dir.c | 17 +++++++++------- + fs/overlayfs/file.c | 27 +++++++++++++------------ + fs/overlayfs/inode.c | 20 +++++++++--------- + fs/overlayfs/namei.c | 8 ++++---- fs/overlayfs/overlayfs.h | 1 + fs/overlayfs/ovl_entry.h | 1 + fs/overlayfs/params.c | 10 +++++++++ - fs/overlayfs/readdir.c | 8 +++---- + fs/overlayfs/readdir.c | 8 ++++---- fs/overlayfs/util.c | 13 ++++++++++-- - 11 files changed, 94 insertions(+), 45 deletions(-) + 11 files changed, 90 insertions(+), 41 deletions(-) diff --git a/Documentation/filesystems/overlayfs.rst b/Documentation/filesystems/overlayfs.rst --- a/Documentation/filesystems/overlayfs.rst @@ -93,7 +93,7 @@ diff --git a/Documentation/filesystems/overlayfs.rst b/Documentation/filesystems diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c -@@ -1148,7 +1148,7 @@ static int ovl_copy_up_flags(struct dentry *dentry, int flags) +@@ -1195,7 +1195,7 @@ static int ovl_copy_up_flags(struct dentry *dentry, int flags) dput(parent); dput(next); } @@ -114,7 +114,7 @@ diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c struct cred *override_cred; struct dentry *parent = dentry->d_parent; -@@ -596,13 +596,14 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, +@@ -592,13 +592,14 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, override_cred->fsuid = inode->i_uid; override_cred->fsgid = inode->i_gid; err = security_dentry_create_files_as(dentry, @@ -131,7 +131,7 @@ diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c put_cred(override_cred); } -@@ -612,7 +613,9 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, +@@ -608,7 +609,9 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, err = ovl_create_over_whiteout(dentry, inode, attr); out_revert_creds: @@ -151,7 +151,7 @@ diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c return err; } -@@ -908,7 +911,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) +@@ -899,7 +902,7 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir) err = ovl_remove_upper(dentry, is_dir, &list); else err = ovl_remove_and_whiteout(dentry, &list); @@ -160,7 +160,7 @@ diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c if (!err) { if (is_dir) clear_nlink(dentry->d_inode); -@@ -1283,7 +1286,7 @@ static int ovl_rename(struct mnt_idmap *idmap, struct inode *olddir, +@@ -1275,7 +1278,7 @@ static int ovl_rename(struct mnt_idmap *idmap, struct inode *olddir, out_unlock: unlock_rename(new_upperdir, old_upperdir); out_revert_creds: @@ -168,11 +168,11 @@ diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c + ovl_revert_creds(old->d_sb, old_cred); if (update_nlink) ovl_nlink_end(new); - out_drop_write: + else diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c -@@ -59,13 +59,14 @@ static struct file *ovl_open_realfile(const struct file *file, +@@ -62,13 +62,14 @@ static struct file *ovl_open_realfile(const struct file *file, if (err) { realfile = ERR_PTR(err); } else { @@ -189,7 +189,7 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c pr_debug("open(%p[%pD2/%c], 0%o) -> (%p, 0%o)\n", file, file, ovl_whatisit(inode, realinode), file->f_flags, -@@ -227,7 +228,7 @@ static loff_t ovl_llseek(struct file *file, loff_t offset, int whence) +@@ -230,7 +231,7 @@ static loff_t ovl_llseek(struct file *file, loff_t offset, int whence) old_cred = ovl_override_creds(inode->i_sb); ret = vfs_llseek(real.file, offset, whence); @@ -198,7 +198,7 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c file->f_pos = real.file->f_pos; ovl_inode_unlock(inode); -@@ -341,7 +342,7 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter) +@@ -387,7 +388,7 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter) ovl_aio_cleanup_handler(aio_req); } out: @@ -207,7 +207,7 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c ovl_file_accessed(file); out_fdput: fdput(real); -@@ -414,7 +415,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) +@@ -465,7 +466,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) ovl_aio_cleanup_handler(aio_req); } out: @@ -216,7 +216,7 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c out_fdput: fdput(real); -@@ -438,7 +439,7 @@ static ssize_t ovl_splice_read(struct file *in, loff_t *ppos, +@@ -489,7 +490,7 @@ static ssize_t ovl_splice_read(struct file *in, loff_t *ppos, old_cred = ovl_override_creds(file_inode(in)->i_sb); ret = vfs_splice_read(real.file, ppos, pipe, len, flags); @@ -225,16 +225,16 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c ovl_file_accessed(in); fdput(real); -@@ -480,7 +481,7 @@ static ssize_t ovl_splice_write(struct pipe_inode_info *pipe, struct file *out, +@@ -531,7 +532,7 @@ static ssize_t ovl_splice_write(struct pipe_inode_info *pipe, struct file *out, file_end_write(real.file); /* Update size */ - ovl_copyattr(inode); + ovl_file_modified(out); - revert_creds(old_cred); + ovl_revert_creds(inode->i_sb, old_cred); fdput(real); out_unlock: -@@ -507,7 +508,7 @@ static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync) +@@ -558,7 +559,7 @@ static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync) if (file_inode(real.file) == ovl_inode_upper(file_inode(file))) { old_cred = ovl_override_creds(file_inode(file)->i_sb); ret = vfs_fsync_range(real.file, start, end, datasync); @@ -243,7 +243,7 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c } fdput(real); -@@ -531,7 +532,7 @@ static int ovl_mmap(struct file *file, struct vm_area_struct *vma) +@@ -582,7 +583,7 @@ static int ovl_mmap(struct file *file, struct vm_area_struct *vma) old_cred = ovl_override_creds(file_inode(file)->i_sb); ret = call_mmap(vma->vm_file, vma); @@ -252,7 +252,7 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c ovl_file_accessed(file); return ret; -@@ -557,7 +558,7 @@ static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len +@@ -608,7 +609,7 @@ static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len old_cred = ovl_override_creds(file_inode(file)->i_sb); ret = vfs_fallocate(real.file, mode, offset, len); @@ -260,8 +260,8 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c + ovl_revert_creds(file_inode(file)->i_sb, old_cred); /* Update size */ - ovl_copyattr(inode); -@@ -582,7 +583,7 @@ static int ovl_fadvise(struct file *file, loff_t offset, loff_t len, int advice) + ovl_file_modified(file); +@@ -633,7 +634,7 @@ static int ovl_fadvise(struct file *file, loff_t offset, loff_t len, int advice) old_cred = ovl_override_creds(file_inode(file)->i_sb); ret = vfs_fadvise(real.file, offset, len, advice); @@ -270,7 +270,7 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c fdput(real); -@@ -641,7 +642,7 @@ static loff_t ovl_copyfile(struct file *file_in, loff_t pos_in, +@@ -692,7 +693,7 @@ static loff_t ovl_copyfile(struct file *file_in, loff_t pos_in, flags); break; } @@ -278,8 +278,8 @@ diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c + ovl_revert_creds(file_inode(file_out)->i_sb, old_cred); /* Update size */ - ovl_copyattr(inode_out); -@@ -703,7 +704,7 @@ static int ovl_flush(struct file *file, fl_owner_t id) + ovl_file_modified(file_out); +@@ -754,7 +755,7 @@ static int ovl_flush(struct file *file, fl_owner_t id) if (real.file->f_op->flush) { old_cred = ovl_override_creds(file_inode(file)->i_sb); err = real.file->f_op->flush(real.file, id); @@ -327,43 +327,7 @@ diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c return p; } -@@ -369,7 +369,7 @@ int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, - ovl_path_lower(dentry, &realpath); - old_cred = ovl_override_creds(dentry->d_sb); - err = vfs_getxattr(mnt_idmap(realpath.mnt), realdentry, name, NULL, 0); -- revert_creds(old_cred); -+ ovl_revert_creds(dentry->d_sb, old_cred); - if (err < 0) - goto out_drop_write; - } -@@ -390,7 +390,7 @@ int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name, - WARN_ON(flags != XATTR_REPLACE); - err = ovl_do_removexattr(ofs, realdentry, name); - } -- revert_creds(old_cred); -+ ovl_revert_creds(dentry->d_sb, old_cred); - - /* copy c/mtime */ - ovl_copyattr(inode); -@@ -411,7 +411,7 @@ int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name, - ovl_i_path_real(inode, &realpath); - old_cred = ovl_override_creds(dentry->d_sb); - res = vfs_getxattr(mnt_idmap(realpath.mnt), realpath.dentry, name, value, size); -- revert_creds(old_cred); -+ ovl_revert_creds(dentry->d_sb, old_cred); - return res; - } - -@@ -439,7 +439,7 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) - - old_cred = ovl_override_creds(dentry->d_sb); - res = vfs_listxattr(realdentry, list, size); -- revert_creds(old_cred); -+ ovl_revert_creds(dentry->d_sb, old_cred); - if (res <= 0 || size == 0) - return res; - -@@ -594,7 +594,7 @@ struct posix_acl *do_ovl_get_acl(struct mnt_idmap *idmap, +@@ -470,7 +470,7 @@ struct posix_acl *do_ovl_get_acl(struct mnt_idmap *idmap, old_cred = ovl_override_creds(inode->i_sb); acl = ovl_get_acl_path(&realpath, posix_acl_xattr_name(type), noperm); @@ -372,7 +336,7 @@ diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c } return acl; -@@ -627,7 +627,7 @@ static int ovl_set_or_remove_acl(struct dentry *dentry, struct inode *inode, +@@ -499,7 +499,7 @@ static int ovl_set_or_remove_acl(struct dentry *dentry, struct inode *inode, old_cred = ovl_override_creds(dentry->d_sb); real_acl = vfs_get_acl(mnt_idmap(realpath.mnt), realdentry, acl_name); @@ -380,17 +344,17 @@ diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c + ovl_revert_creds(dentry->d_sb, old_cred); if (IS_ERR(real_acl)) { err = PTR_ERR(real_acl); - goto out_drop_write; -@@ -648,7 +648,7 @@ static int ovl_set_or_remove_acl(struct dentry *dentry, struct inode *inode, + goto out; +@@ -524,7 +524,7 @@ static int ovl_set_or_remove_acl(struct dentry *dentry, struct inode *inode, err = ovl_do_set_acl(ofs, realdentry, acl_name, acl); else err = ovl_do_remove_acl(ofs, realdentry, acl_name); - revert_creds(old_cred); + ovl_revert_creds(dentry->d_sb, old_cred); + ovl_drop_write(dentry); /* copy c/mtime */ - ovl_copyattr(inode); -@@ -726,7 +726,7 @@ static int ovl_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, +@@ -601,7 +601,7 @@ static int ovl_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, old_cred = ovl_override_creds(inode->i_sb); err = realinode->i_op->fiemap(realinode, fieinfo, start, len); @@ -399,16 +363,16 @@ diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c return err; } -@@ -797,7 +797,7 @@ int ovl_fileattr_set(struct mnt_idmap *idmap, +@@ -672,7 +672,7 @@ int ovl_fileattr_set(struct mnt_idmap *idmap, err = ovl_set_protattr(inode, upperpath.dentry, fa); if (!err) err = ovl_real_fileattr_set(&upperpath, fa); - revert_creds(old_cred); + ovl_revert_creds(inode->i_sb, old_cred); + ovl_drop_write(dentry); /* - * Merge real inode flags with inode flags read from -@@ -859,7 +859,7 @@ int ovl_fileattr_get(struct dentry *dentry, struct fileattr *fa) +@@ -734,7 +734,7 @@ int ovl_fileattr_get(struct dentry *dentry, struct fileattr *fa) old_cred = ovl_override_creds(inode->i_sb); err = ovl_real_fileattr_get(&realpath, fa); ovl_fileattr_prot_flags(inode, fa); @@ -420,7 +384,7 @@ diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c -@@ -966,7 +966,7 @@ static int ovl_maybe_lookup_lowerdata(struct dentry *dentry) +@@ -986,7 +986,7 @@ static int ovl_maybe_lookup_lowerdata(struct dentry *dentry) old_cred = ovl_override_creds(dentry->d_sb); err = ovl_lookup_data_layers(dentry, redirect, &datapath); @@ -429,7 +393,7 @@ diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c if (err) goto out_err; -@@ -1311,7 +1311,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, +@@ -1331,7 +1331,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, ovl_dentry_init_reval(dentry, upperdentry, OVL_I_E(inode)); @@ -438,7 +402,7 @@ diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c if (origin_path) { dput(origin_path->dentry); kfree(origin_path); -@@ -1335,7 +1335,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, +@@ -1355,7 +1355,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, kfree(upperredirect); out: kfree(d.redirect); @@ -447,7 +411,7 @@ diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c return ERR_PTR(err); } -@@ -1388,7 +1388,7 @@ bool ovl_lower_positive(struct dentry *dentry) +@@ -1412,7 +1412,7 @@ bool ovl_lower_positive(struct dentry *dentry) dput(this); } } @@ -459,7 +423,7 @@ diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h -@@ -402,6 +402,7 @@ int ovl_want_write(struct dentry *dentry); +@@ -425,6 +425,7 @@ int ovl_want_write(struct dentry *dentry); void ovl_drop_write(struct dentry *dentry); struct dentry *ovl_workdir(struct dentry *dentry); const struct cred *ovl_override_creds(struct super_block *sb); @@ -490,10 +454,10 @@ diff --git a/fs/overlayfs/params.c b/fs/overlayfs/params.c +MODULE_PARM_DESC(ovl_override_creds_def, + "Use mounter's credentials for accesses"); + - enum { + enum ovl_opt { Opt_lowerdir, - Opt_upperdir, -@@ -57,6 +62,7 @@ enum { + Opt_lowerdir_add, +@@ -59,6 +64,7 @@ enum ovl_opt { Opt_metacopy, Opt_verity, Opt_volatile, @@ -501,7 +465,7 @@ diff --git a/fs/overlayfs/params.c b/fs/overlayfs/params.c }; static const struct constant_table ovl_parameter_bool[] = { -@@ -154,6 +160,7 @@ const struct fs_parameter_spec ovl_parameter_spec[] = { +@@ -159,6 +165,7 @@ const struct fs_parameter_spec ovl_parameter_spec[] = { fsparam_enum("metacopy", Opt_metacopy, ovl_parameter_bool), fsparam_enum("verity", Opt_verity, ovl_parameter_verity), fsparam_flag("volatile", Opt_volatile), @@ -509,7 +473,7 @@ diff --git a/fs/overlayfs/params.c b/fs/overlayfs/params.c {} }; -@@ -601,6 +608,9 @@ static int ovl_parse_param(struct fs_context *fc, struct fs_parameter *param) +@@ -619,6 +626,9 @@ static int ovl_parse_param(struct fs_context *fc, struct fs_parameter *param) case Opt_userxattr: config->userxattr = true; break; @@ -522,7 +486,7 @@ diff --git a/fs/overlayfs/params.c b/fs/overlayfs/params.c diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c --- a/fs/overlayfs/readdir.c +++ b/fs/overlayfs/readdir.c -@@ -286,7 +286,7 @@ static int ovl_check_whiteouts(const struct path *path, struct ovl_readdir_data +@@ -290,7 +290,7 @@ static int ovl_check_whiteouts(const struct path *path, struct ovl_readdir_data } inode_unlock(dir->d_inode); } @@ -531,7 +495,7 @@ diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c return err; } -@@ -794,7 +794,7 @@ static int ovl_iterate(struct file *file, struct dir_context *ctx) +@@ -807,7 +807,7 @@ static int ovl_iterate(struct file *file, struct dir_context *ctx) } err = 0; out: @@ -540,7 +504,7 @@ diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c return err; } -@@ -846,7 +846,7 @@ static struct file *ovl_dir_open_realfile(const struct file *file, +@@ -859,7 +859,7 @@ static struct file *ovl_dir_open_realfile(const struct file *file, old_cred = ovl_override_creds(file_inode(file)->i_sb); res = ovl_path_open(realpath, O_RDONLY | (file->f_flags & O_LARGEFILE)); @@ -549,7 +513,7 @@ diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c return res; } -@@ -973,7 +973,7 @@ int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list) +@@ -986,7 +986,7 @@ int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list) old_cred = ovl_override_creds(dentry->d_sb); err = ovl_dir_read_merged(dentry, list, &root); @@ -561,7 +525,7 @@ diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c -@@ -39,9 +39,18 @@ const struct cred *ovl_override_creds(struct super_block *sb) +@@ -65,9 +65,18 @@ const struct cred *ovl_override_creds(struct super_block *sb) { struct ovl_fs *ofs = OVL_FS(sb); @@ -580,16 +544,16 @@ diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c /* * Check if underlying fs supports file handles and try to determine encoding * type, in order to deduce maximum inode number used by fs. -@@ -1073,7 +1082,7 @@ int ovl_nlink_start(struct dentry *dentry) +@@ -1165,7 +1174,7 @@ int ovl_nlink_start(struct dentry *dentry) * value relative to the upper inode nlink in an upper inode xattr. */ err = ovl_set_nlink_upper(dentry); - revert_creds(old_cred); + ovl_revert_creds(dentry->d_sb, old_cred); - - out: if (err) -@@ -1091,7 +1100,7 @@ void ovl_nlink_end(struct dentry *dentry) + goto out_drop_write; + +@@ -1190,7 +1199,7 @@ void ovl_nlink_end(struct dentry *dentry) old_cred = ovl_override_creds(dentry->d_sb); ovl_cleanup_index(dentry); diff --git a/android-mainline/ANDROID-riscv64-Enable-HAVE_EFFICIENT_UNALIGNED_ACCESS.patch b/android-mainline/ANDROID-riscv64-Enable-HAVE_EFFICIENT_UNALIGNED_ACCESS.patch index da261558..0ea380db 100644 --- a/android-mainline/ANDROID-riscv64-Enable-HAVE_EFFICIENT_UNALIGNED_ACCESS.patch +++ b/android-mainline/ANDROID-riscv64-Enable-HAVE_EFFICIENT_UNALIGNED_ACCESS.patch @@ -17,7 +17,7 @@ Change-Id: I2fb83d3e00f914feb4548136ad7fd3224aa674d8 diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig -@@ -117,6 +117,7 @@ config RISCV +@@ -119,6 +119,7 @@ config RISCV select HAVE_FUNCTION_GRAPH_RETVAL if HAVE_FUNCTION_GRAPH_TRACER select HAVE_FUNCTION_TRACER if !XIP_KERNEL && !PREEMPTION select HAVE_EBPF_JIT if MMU diff --git a/android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_BROKEN_CRYPTO_ENABLE.patch b/android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_BROKEN_CRYPTO_ENABLE.patch index b5e12f50..98115ec4 100644 --- a/android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_BROKEN_CRYPTO_ENABLE.patch +++ b/android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_BROKEN_CRYPTO_ENABLE.patch @@ -40,7 +40,7 @@ diff --git a/drivers/ufs/core/ufshcd-crypto.c b/drivers/ufs/core/ufshcd-crypto.c diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h -@@ -657,6 +657,15 @@ enum ufshcd_android_quirks { +@@ -656,6 +656,15 @@ enum ufshcd_android_quirks { * ufs_hba_variant_ops::init() must do it instead. */ UFSHCD_ANDROID_QUIRK_CUSTOM_CRYPTO_PROFILE = 1 << 0, diff --git a/android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_KEYS_IN_PRDT.patch b/android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_KEYS_IN_PRDT.patch index 7a76a161..2c729a25 100644 --- a/android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_KEYS_IN_PRDT.patch +++ b/android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_KEYS_IN_PRDT.patch @@ -59,7 +59,7 @@ diff --git a/drivers/ufs/core/ufshcd-crypto.h b/drivers/ufs/core/ufshcd-crypto.h diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c -@@ -5369,6 +5369,7 @@ void ufshcd_release_scsi_cmd(struct ufs_hba *hba, +@@ -5467,6 +5467,7 @@ void ufshcd_release_scsi_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd = lrbp->cmd; scsi_dma_unmap(cmd); @@ -70,7 +70,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h -@@ -666,6 +666,15 @@ enum ufshcd_android_quirks { +@@ -665,6 +665,15 @@ enum ufshcd_android_quirks { * breaks the HCE sequence if used. */ UFSHCD_ANDROID_QUIRK_BROKEN_CRYPTO_ENABLE = 1 << 1, diff --git a/android-mainline/ANDROID-scsi-ufs-allow-overriding-the-blk_crypto_profile.patch b/android-mainline/ANDROID-scsi-ufs-allow-overriding-the-blk_crypto_profile.patch index 820a70ac..31f01ebd 100644 --- a/android-mainline/ANDROID-scsi-ufs-allow-overriding-the-blk_crypto_profile.patch +++ b/android-mainline/ANDROID-scsi-ufs-allow-overriding-the-blk_crypto_profile.patch @@ -64,7 +64,7 @@ diff --git a/drivers/ufs/core/ufshcd-crypto.c b/drivers/ufs/core/ufshcd-crypto.c diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h -@@ -645,6 +645,20 @@ enum ufshcd_quirks { +@@ -644,6 +644,20 @@ enum ufshcd_quirks { UFSHCD_QUIRK_MCQ_BROKEN_RTC = 1 << 21, }; diff --git a/android-mainline/ANDROID-staging-add-debug-kinfo-driver.patch b/android-mainline/ANDROID-staging-add-debug-kinfo-driver.patch index c08e1c0f..6dd7e826 100644 --- a/android-mainline/ANDROID-staging-add-debug-kinfo-driver.patch +++ b/android-mainline/ANDROID-staging-add-debug-kinfo-driver.patch @@ -22,25 +22,24 @@ Change-Id: Ida76bf90315652b8debc081a010bc5720a5a186e Signed-off-by: Lee Jones <lee.jones@linaro.org> Signed-off-by: Lee Jones <joneslee@google.com> --- - drivers/android/Kconfig | 12 +++ + drivers/android/Kconfig | 11 ++ drivers/android/Makefile | 1 + - drivers/android/debug_kinfo.c | 196 ++++++++++++++++++++++++++++++++++ - drivers/android/debug_kinfo.h | 69 ++++++++++++ - 4 files changed, 278 insertions(+) + drivers/android/debug_kinfo.c | 187 ++++++++++++++++++++++++++++++++++ + drivers/android/debug_kinfo.h | 67 ++++++++++++ + 4 files changed, 266 insertions(+) create mode 100644 drivers/android/debug_kinfo.c create mode 100644 drivers/android/debug_kinfo.h diff --git a/drivers/android/Kconfig b/drivers/android/Kconfig --- a/drivers/android/Kconfig +++ b/drivers/android/Kconfig -@@ -47,6 +47,18 @@ config ANDROID_BINDER_IPC_SELFTEST +@@ -47,6 +47,17 @@ config ANDROID_BINDER_IPC_SELFTEST exhaustively with combinations of various buffer sizes and alignments. +config ANDROID_DEBUG_KINFO + bool "Android Debug Kernel Information Support" + depends on KALLSYMS -+ depends on BROKEN + help + This supports kernel information backup for bootloader usage. + Specifics: @@ -65,7 +64,7 @@ diff --git a/drivers/android/debug_kinfo.c b/drivers/android/debug_kinfo.c new file mode 100644 --- /dev/null +++ b/drivers/android/debug_kinfo.c -@@ -0,0 +1,196 @@ +@@ -0,0 +1,187 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * debug_kinfo.c - backup kernel information for bootloader usage @@ -229,16 +228,7 @@ new file mode 100644 + strlcpy(info->last_uts_release, init_utsname()->release, sizeof(info->last_uts_release)); + info->enabled_modules_tree_lookup = IS_ENABLED(CONFIG_MODULES_TREE_LOOKUP); + info->mod_kallsyms_offset = offsetof(struct module, kallsyms); -+#if defined(CONFIG_RANDOMIZE_BASE) && defined(MODULES_VSIZE) -+ info->module_start_va = module_alloc_base; -+ info->module_end_va = info->module_start_va + MODULES_VSIZE; -+#elif defined(CONFIG_MODULES) && defined(MODULES_VADDR) -+ info->module_start_va = MODULES_VADDR; -+ info->module_end_va = MODULES_END; -+#else -+ info->module_start_va = VMALLOC_START; -+ info->module_end_va = VMALLOC_END; -+#endif ++ + update_kernel_all_info(all_info); + + return 0; @@ -266,7 +256,7 @@ diff --git a/drivers/android/debug_kinfo.h b/drivers/android/debug_kinfo.h new file mode 100644 --- /dev/null +++ b/drivers/android/debug_kinfo.h -@@ -0,0 +1,69 @@ +@@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * debug_kinfo.h - backup kernel information for bootloader usage @@ -325,8 +315,6 @@ new file mode 100644 + /* For module kallsyms */ + __u32 enabled_modules_tree_lookup; + __u32 mod_kallsyms_offset; -+ __u64 module_start_va; -+ __u64 module_end_va; +} __packed; + +struct kernel_all_info { diff --git a/android-mainline/ANDROID-tools-Miscellaneous.patch b/android-mainline/ANDROID-tools-Miscellaneous.patch index 218ee094..1bc583dc 100644 --- a/android-mainline/ANDROID-tools-Miscellaneous.patch +++ b/android-mainline/ANDROID-tools-Miscellaneous.patch @@ -9,14 +9,15 @@ Change-Id: Ic155709fbf07ec0575fa2fa954ee199e63051a97 tools/testing/android/OWNERS | 4 + tools/testing/android/bin/acloudb.sh | 43 +++++++++ tools/testing/android/bin/kselftest.sh | 88 +++++++++++++++++++ - .../selftests/android/config_arm64.xml | 84 ++++++++++++++++++ - .../selftests/android/config_x86_64.xml | 84 ++++++++++++++++++ + .../selftests/android/config_arm64.xml | 82 +++++++++++++++++ + .../selftests/android/config_x86_64.xml | 88 +++++++++++++++++++ .../filesystems/binderfs/binderfs_test.c | 10 +++ .../selftests/futex/functional/futex_wait.c | 6 ++ .../futex/functional/futex_wait_timeout.c | 11 ++- .../futex/functional/futex_wait_wouldblock.c | 13 ++- + tools/testing/selftests/net/psock_tpacket.c | 2 + tools/testing/selftests/rtc/rtctest.c | 2 + - 10 files changed, 338 insertions(+), 7 deletions(-) + 11 files changed, 342 insertions(+), 7 deletions(-) create mode 100644 tools/testing/android/OWNERS create mode 100755 tools/testing/android/bin/acloudb.sh create mode 100755 tools/testing/android/bin/kselftest.sh @@ -177,7 +178,7 @@ diff --git a/tools/testing/selftests/android/config_arm64.xml b/tools/testing/se new file mode 100644 --- /dev/null +++ b/tools/testing/selftests/android/config_arm64.xml -@@ -0,0 +1,84 @@ +@@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2023 The Android Open Source Project +SPDX-License-Identifier: GPL-2.0 OR Apache-2.0 @@ -190,6 +191,10 @@ new file mode 100644 + <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" /> + <target_preparer class="com.android.tradefed.targetprep.StopServicesSetup" /> + ++ <object type="module_controller" class="com.android.tradefed.testtype.suite.module.KernelTestModuleController" > ++ <option name="arch" value="arm64"/> ++ </object> ++ + <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"> + <option name="cleanup" value="true" /> + <option name="push-file" key="selftests" value="/data/selftests" /> @@ -202,6 +207,7 @@ new file mode 100644 + <option name="skip-binary-check" value="true" /> + <option name="test-command-line" key="kselftest_binderfs_binderfs_test" value="cd &ktest_dir;; ./kselftest_binderfs_binderfs_test" /> + <option name="test-command-line" key="kselftest_breakpoints_breakpoint_test" value="cd &ktest_dir;; ./kselftest_breakpoints_breakpoint_test" /> ++ <option name="test-command-line" key="kselftest_capabilities_test_execve" value="cd &ktest_dir;; ./kselftest_capabilities_test_execve" /> + <option name="test-command-line" key="kselftest_futex_requeue" value="cd &ktest_dir;; ./futex_requeue" /> + <option name="test-command-line" key="kselftest_futex_requeue_pi" value="cd &ktest_dir;; ./futex_requeue_pi" /> + <option name="test-command-line" key="kselftest_futex_requeue_pi_b" value="cd &ktest_dir;; ./futex_requeue_pi -b" /> @@ -234,26 +240,19 @@ new file mode 100644 + <option name="test-command-line" key="kselftest_mm_mremap_dontunmap" value="cd &ktest_dir;; ./kselftest_mm_mremap_dontunmap" /> + <option name="test-command-line" key="kselftest_mm_mremap_test" value="cd &ktest_dir;; ./kselftest_mm_mremap_test" /> + <option name="test-command-line" key="kselftest_mm_uffd_unit_tests" value="cd &ktest_dir;; ./kselftest_mm_uffd_unit_tests" /> ++ <option name="test-command-line" key="kselftest_net_socket" value="cd &ktest_dir;; ./kselftest_net_socket" /> ++ <option name="test-command-line" key="kselftest_net_psock_tpacket" value="cd &ktest_dir;; ./kselftest_net_psock_tpacket" /> ++ <option name="test-command-line" key="kselftest_net_reuseaddr_conflict" value="cd &ktest_dir;; ./kselftest_net_reuseaddr_conflict" /> + <option name="test-command-line" key="kselftest_ptrace_peeksiginfo" value="cd &ktest_dir;; ./kselftest_ptrace_peeksiginfo" /> + <option name="test-command-line" key="kselftest_rtc_rtctest" value="cd &ktest_dir;; ./kselftest_rtc_rtctest" /> ++ <option name="test-command-line" key="kselftest_seccomp_seccomp_bpf" value="cd &ktest_dir;; ./kselftest_seccomp_seccomp_bpf" /> + <option name="test-command-line" key="kselftest_size_test_get_size" value="cd &ktest_dir;; ./kselftest_size_test_get_size" /> -+ <option name="test-command-line" key="kselftest_timers_adjtick" value="cd &ktest_dir;; ./kselftest_timers_adjtick" /> -+ <option name="test-command-line" key="kselftest_timers_alarmtimer_suspend" value="cd &ktest_dir;; ./kselftest_timers_alarmtimer_suspend" /> -+ <option name="test-command-line" key="kselftest_timers_change_skew" value="cd &ktest_dir;; ./kselftest_timers_change_skew" /> -+ <option name="test-command-line" key="kselftest_timers_clocksource_switch" value="cd &ktest_dir;; ./kselftest_timers_clocksource_switch" /> -+ <option name="test-command-line" key="kselftest_timers_freq_step" value="cd &ktest_dir;; ./kselftest_timers_freq_step" /> -+ <option name="test-command-line" key="kselftest_timers_inconsistency_check" value="cd &ktest_dir;; ./kselftest_timers_inconsistency_check" /> -+ <option name="test-command-line" key="kselftest_timers_leap_a_day" value="cd &ktest_dir;; ./kselftest_timers_leap_a_day" /> -+ <option name="test-command-line" key="kselftest_timers_leapcrash" value="cd &ktest_dir;; ./kselftest_timers_leapcrash" /> -+ <option name="test-command-line" key="kselftest_timers_nanosleep" value="cd &ktest_dir;; ./kselftest_timers_nanosleep" /> -+ <option name="test-command-line" key="kselftest_timers_nsleep_lat" value="cd &ktest_dir;; ./kselftest_timers_nsleep_lat" /> ++ <option name="test-command-line" key="kselftest_timers_inconsistency_check" value="cd &ktest_dir;; ./inconsistency-check" /> ++ <option name="test-command-line" key="kselftest_timers_nanosleep" value="cd &ktest_dir;; ./nanosleep" /> ++ <option name="test-command-line" key="kselftest_timers_nsleep_lat" value="cd &ktest_dir;; ./nsleep-lat" /> + <option name="test-command-line" key="kselftest_timers_posix_timers" value="cd &ktest_dir;; ./kselftest_timers_posix_timers" /> -+ <option name="test-command-line" key="kselftest_timers_set_2038" value="cd &ktest_dir;; ./kselftest_timers_set_2038" /> -+ <option name="test-command-line" key="kselftest_timers_set_tai" value="cd &ktest_dir;; ./kselftest_timers_set_tai" /> + <option name="test-command-line" key="kselftest_timers_set_timer_lat" value="cd &ktest_dir;; ./kselftest_timers_set_timer_lat" /> -+ <option name="test-command-line" key="kselftest_timers_set_tz" value="cd &ktest_dir;; ./kselftest_timers_set_tz" /> -+ <option name="test-command-line" key="kselftest_timers_skew_consistency" value="cd &ktest_dir;; ./kselftest_timers_skew_consistency" /> -+ <option name="test-command-line" key="kselftest_timers_tests_raw_skew" value="cd &ktest_dir;; ./kselftest_timers_tests_raw_skew" /> ++ <option name="test-command-line" key="kselftest_timers_tests_raw_skew" value="cd &ktest_dir;; ./raw_skew" /> + <option name="test-command-line" key="kselftest_timers_threadtest" value="cd &ktest_dir;; ./kselftest_timers_threadtest" /> + <option name="test-command-line" key="kselftest_timers_valid_adjtimex" value="cd &ktest_dir;; ./kselftest_timers_valid_adjtimex" /> + <option name="test-command-line" key="kselftest_vdso_vdso_test_abi" value="cd &ktest_dir;; ./kselftest_vdso_vdso_test_abi" /> @@ -266,7 +265,7 @@ diff --git a/tools/testing/selftests/android/config_x86_64.xml b/tools/testing/s new file mode 100644 --- /dev/null +++ b/tools/testing/selftests/android/config_x86_64.xml -@@ -0,0 +1,84 @@ +@@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2023 The Android Open Source Project +SPDX-License-Identifier: GPL-2.0 OR Apache-2.0 @@ -279,6 +278,10 @@ new file mode 100644 + <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer" /> + <target_preparer class="com.android.tradefed.targetprep.StopServicesSetup" /> + ++ <object type="module_controller" class="com.android.tradefed.testtype.suite.module.KernelTestModuleController" > ++ <option name="arch" value="x86_64"/> ++ </object> ++ + <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"> + <option name="cleanup" value="true" /> + <option name="push-file" key="selftests" value="/data/selftests" /> @@ -291,6 +294,7 @@ new file mode 100644 + <option name="skip-binary-check" value="true" /> + <option name="test-command-line" key="kselftest_binderfs_binderfs_test" value="cd &ktest_dir;; ./kselftest_binderfs_binderfs_test" /> + <option name="test-command-line" key="kselftest_breakpoints_breakpoint_test" value="cd &ktest_dir;; ./kselftest_breakpoints_breakpoint_test" /> ++ <option name="test-command-line" key="kselftest_capabilities_test_execve" value="cd &ktest_dir;; ./kselftest_capabilities_test_execve" /> + <option name="test-command-line" key="kselftest_futex_requeue" value="cd &ktest_dir;; ./futex_requeue" /> + <option name="test-command-line" key="kselftest_futex_requeue_pi" value="cd &ktest_dir;; ./futex_requeue_pi" /> + <option name="test-command-line" key="kselftest_futex_requeue_pi_b" value="cd &ktest_dir;; ./futex_requeue_pi -b" /> @@ -323,32 +327,31 @@ new file mode 100644 + <option name="test-command-line" key="kselftest_mm_mremap_dontunmap" value="cd &ktest_dir;; ./kselftest_mm_mremap_dontunmap" /> + <option name="test-command-line" key="kselftest_mm_mremap_test" value="cd &ktest_dir;; ./kselftest_mm_mremap_test" /> + <option name="test-command-line" key="kselftest_mm_uffd_unit_tests" value="cd &ktest_dir;; ./kselftest_mm_uffd_unit_tests" /> ++ <option name="test-command-line" key="kselftest_net_socket" value="cd &ktest_dir;; ./kselftest_net_socket" /> ++ <option name="test-command-line" key="kselftest_net_psock_tpacket" value="cd &ktest_dir;; ./kselftest_net_psock_tpacket" /> ++ <option name="test-command-line" key="kselftest_net_reuseaddr_conflict" value="cd &ktest_dir;; ./kselftest_net_reuseaddr_conflict" /> + <option name="test-command-line" key="kselftest_ptrace_peeksiginfo" value="cd &ktest_dir;; ./kselftest_ptrace_peeksiginfo" /> + <option name="test-command-line" key="kselftest_rtc_rtctest" value="cd &ktest_dir;; ./kselftest_rtc_rtctest" /> ++ <option name="test-command-line" key="kselftest_seccomp_seccomp_bpf" value="cd &ktest_dir;; ./kselftest_seccomp_seccomp_bpf" /> + <option name="test-command-line" key="kselftest_size_test_get_size" value="cd &ktest_dir;; ./kselftest_size_test_get_size" /> -+ <option name="test-command-line" key="kselftest_timers_adjtick" value="cd &ktest_dir;; ./kselftest_timers_adjtick" /> -+ <option name="test-command-line" key="kselftest_timers_alarmtimer_suspend" value="cd &ktest_dir;; ./kselftest_timers_alarmtimer_suspend" /> -+ <option name="test-command-line" key="kselftest_timers_change_skew" value="cd &ktest_dir;; ./kselftest_timers_change_skew" /> -+ <option name="test-command-line" key="kselftest_timers_clocksource_switch" value="cd &ktest_dir;; ./kselftest_timers_clocksource_switch" /> -+ <option name="test-command-line" key="kselftest_timers_freq_step" value="cd &ktest_dir;; ./kselftest_timers_freq_step" /> -+ <option name="test-command-line" key="kselftest_timers_inconsistency_check" value="cd &ktest_dir;; ./kselftest_timers_inconsistency_check" /> -+ <option name="test-command-line" key="kselftest_timers_leap_a_day" value="cd &ktest_dir;; ./kselftest_timers_leap_a_day" /> -+ <option name="test-command-line" key="kselftest_timers_leapcrash" value="cd &ktest_dir;; ./kselftest_timers_leapcrash" /> -+ <option name="test-command-line" key="kselftest_timers_nanosleep" value="cd &ktest_dir;; ./kselftest_timers_nanosleep" /> -+ <option name="test-command-line" key="kselftest_timers_nsleep_lat" value="cd &ktest_dir;; ./kselftest_timers_nsleep_lat" /> ++ <option name="test-command-line" key="kselftest_timers_inconsistency_check" value="cd &ktest_dir;; ./inconsistency-check" /> ++ <option name="test-command-line" key="kselftest_timers_nanosleep" value="cd &ktest_dir;; ./nanosleep" /> ++ <option name="test-command-line" key="kselftest_timers_nsleep_lat" value="cd &ktest_dir;; ./nsleep-lat" /> + <option name="test-command-line" key="kselftest_timers_posix_timers" value="cd &ktest_dir;; ./kselftest_timers_posix_timers" /> -+ <option name="test-command-line" key="kselftest_timers_set_2038" value="cd &ktest_dir;; ./kselftest_timers_set_2038" /> -+ <option name="test-command-line" key="kselftest_timers_set_tai" value="cd &ktest_dir;; ./kselftest_timers_set_tai" /> + <option name="test-command-line" key="kselftest_timers_set_timer_lat" value="cd &ktest_dir;; ./kselftest_timers_set_timer_lat" /> -+ <option name="test-command-line" key="kselftest_timers_set_tz" value="cd &ktest_dir;; ./kselftest_timers_set_tz" /> -+ <option name="test-command-line" key="kselftest_timers_skew_consistency" value="cd &ktest_dir;; ./kselftest_timers_skew_consistency" /> -+ <option name="test-command-line" key="kselftest_timers_tests_raw_skew" value="cd &ktest_dir;; ./kselftest_timers_tests_raw_skew" /> ++ <option name="test-command-line" key="kselftest_timers_tests_raw_skew" value="cd &ktest_dir;; ./raw_skew" /> + <option name="test-command-line" key="kselftest_timers_threadtest" value="cd &ktest_dir;; ./kselftest_timers_threadtest" /> + <option name="test-command-line" key="kselftest_timers_valid_adjtimex" value="cd &ktest_dir;; ./kselftest_timers_valid_adjtimex" /> + <option name="test-command-line" key="kselftest_vdso_vdso_test_abi" value="cd &ktest_dir;; ./kselftest_vdso_vdso_test_abi" /> + <option name="test-command-line" key="kselftest_vdso_vdso_test_clock_getres" value="cd &ktest_dir;; ./kselftest_vdso_vdso_test_clock_getres" /> + <option name="test-command-line" key="kselftest_vdso_vdso_test_getcpu" value="cd &ktest_dir;; ./kselftest_vdso_vdso_test_getcpu" /> + <option name="test-command-line" key="kselftest_vdso_vdso_test_gettimeofday" value="cd &ktest_dir;; ./kselftest_vdso_vdso_test_gettimeofday" /> ++ <option name="test-command-line" key="kselftest_x86_check_initial_reg_state" value="cd &ktest_dir;; ./kselftest_x86_check_initial_reg_state" /> ++ <option name="test-command-line" key="kselftest_x86_ldt_gdt" value="cd &ktest_dir;; ./kselftest_x86_ldt_gdt" /> ++ <option name="test-command-line" key="kselftest_x86_ptrace_syscall" value="cd &ktest_dir;; ./kselftest_x86_ptrace_syscall" /> ++ <option name="test-command-line" key="kselftest_x86_single_step_syscall" value="cd &ktest_dir;; ./kselftest_x86_single_step_syscall" /> ++ <option name="test-command-line" key="kselftest_x86_syscall_nt" value="cd &ktest_dir;; ./kselftest_x86_syscall_nt" /> ++ <option name="test-command-line" key="kselftest_x86_test_mremap_vdso" value="cd &ktest_dir;; ./kselftest_x86_test_mremap_vdso" /> + </test> +</configuration> diff --git a/tools/testing/selftests/filesystems/binderfs/binderfs_test.c b/tools/testing/selftests/filesystems/binderfs/binderfs_test.c @@ -452,6 +455,19 @@ diff --git a/tools/testing/selftests/futex/functional/futex_wait_wouldblock.c b/ } else { ksft_test_result_pass("futex_waitv\n"); } +diff --git a/tools/testing/selftests/net/psock_tpacket.c b/tools/testing/selftests/net/psock_tpacket.c +--- a/tools/testing/selftests/net/psock_tpacket.c ++++ b/tools/testing/selftests/net/psock_tpacket.c +@@ -33,7 +33,9 @@ + #include <ctype.h> + #include <fcntl.h> + #include <unistd.h> ++#ifndef __ANDROID__ + #include <bits/wordsize.h> ++#endif + #include <net/ethernet.h> + #include <netinet/ip.h> + #include <arpa/inet.h> diff --git a/tools/testing/selftests/rtc/rtctest.c b/tools/testing/selftests/rtc/rtctest.c --- a/tools/testing/selftests/rtc/rtctest.c +++ b/tools/testing/selftests/rtc/rtctest.c diff --git a/android-mainline/ANDROID-tty-hvc_dcc-Add-parameter-to-enable-DCC.patch b/android-mainline/ANDROID-tty-hvc_dcc-Add-parameter-to-enable-DCC.patch index 7700a01a..a4d6d959 100644 --- a/android-mainline/ANDROID-tty-hvc_dcc-Add-parameter-to-enable-DCC.patch +++ b/android-mainline/ANDROID-tty-hvc_dcc-Add-parameter-to-enable-DCC.patch @@ -21,7 +21,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt -@@ -1834,6 +1834,10 @@ +@@ -1837,6 +1837,10 @@ If specified, z/VM IUCV HVC accepts connections from listed z/VM user IDs only. diff --git a/android-mainline/FIXME-ovl-Leftover-from-Merge-tag-v6.7-into-android-mainline.patch b/android-mainline/FIXME-ovl-Leftover-from-Merge-tag-v6.7-into-android-mainline.patch new file mode 100644 index 00000000..39843b82 --- /dev/null +++ b/android-mainline/FIXME-ovl-Leftover-from-Merge-tag-v6.7-into-android-mainline.patch @@ -0,0 +1,50 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Lee Jones <joneslee@google.com> +Date: Tue, 30 Jan 2024 09:07:40 +0000 +Subject: FIXME: ovl: Leftover from "Merge tag 'v6.7' into android-mainline" + +Signed-off-by: Lee Jones <joneslee@google.com> +Change-Id: Ia1901747e769baa4033d57557b26bd25d3ff121b +--- + fs/overlayfs/xattrs.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/fs/overlayfs/xattrs.c b/fs/overlayfs/xattrs.c +--- a/fs/overlayfs/xattrs.c ++++ b/fs/overlayfs/xattrs.c +@@ -47,7 +47,7 @@ static int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char + ovl_path_lower(dentry, &realpath); + old_cred = ovl_override_creds(dentry->d_sb); + err = vfs_getxattr(mnt_idmap(realpath.mnt), realdentry, name, NULL, 0); +- revert_creds(old_cred); ++ ovl_revert_creds(dentry->d_sb, old_cred); + if (err < 0) + goto out; + } +@@ -72,7 +72,7 @@ static int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char + WARN_ON(flags != XATTR_REPLACE); + err = ovl_do_removexattr(ofs, realdentry, name); + } +- revert_creds(old_cred); ++ ovl_revert_creds(dentry->d_sb, old_cred); + ovl_drop_write(dentry); + + /* copy c/mtime */ +@@ -91,7 +91,7 @@ static int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char + ovl_i_path_real(inode, &realpath); + old_cred = ovl_override_creds(dentry->d_sb); + res = vfs_getxattr(mnt_idmap(realpath.mnt), realpath.dentry, name, value, size); +- revert_creds(old_cred); ++ ovl_revert_creds(dentry->d_sb, old_cred); + return res; + } + +@@ -121,7 +121,7 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size) + + old_cred = ovl_override_creds(dentry->d_sb); + res = vfs_listxattr(realdentry, list, size); +- revert_creds(old_cred); ++ ovl_revert_creds(dentry->d_sb, old_cred); + if (res <= 0 || size == 0) + return res; + diff --git a/android-mainline/FIXME-ufs-Merge-error-relating-to-ufshcd_read_desc_param.patch b/android-mainline/FIXME-ufs-Merge-error-relating-to-ufshcd_read_desc_param.patch index 4257b168..2e7c8cde 100644 --- a/android-mainline/FIXME-ufs-Merge-error-relating-to-ufshcd_read_desc_param.patch +++ b/android-mainline/FIXME-ufs-Merge-error-relating-to-ufshcd_read_desc_param.patch @@ -12,7 +12,7 @@ Change-Id: Id499109fa415cb5a217e4832e7dc0259cee1a5c7 diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h -@@ -1390,6 +1390,12 @@ static inline int ufshcd_disable_host_tx_lcc(struct ufs_hba *hba) +@@ -1394,6 +1394,12 @@ static inline int ufshcd_disable_host_tx_lcc(struct ufs_hba *hba) return ufshcd_dme_set(hba, UIC_ARG_MIB(PA_LOCAL_TX_LCC_ENABLE), 0); } diff --git a/android-mainline/FROMGIT-arch-mm-fault-fix-major-fault-accounting-when-retrying-under-per-VMA-lock.patch b/android-mainline/FROMGIT-arch-mm-fault-fix-major-fault-accounting-when-retrying-under-per-VMA-lock.patch new file mode 100644 index 00000000..f2e6761a --- /dev/null +++ b/android-mainline/FROMGIT-arch-mm-fault-fix-major-fault-accounting-when-retrying-under-per-VMA-lock.patch @@ -0,0 +1,116 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Suren Baghdasaryan <surenb@google.com> +Date: Tue, 26 Dec 2023 13:46:10 -0800 +Subject: FROMGIT: arch/mm/fault: fix major fault accounting when retrying + under per-VMA lock + +A test [1] in Android test suite started failing after [2] was merged. It +turns out that after handling a major fault under per-VMA lock, the +process major fault counter does not register that fault as major. Before +[2] read faults would be done under mmap_lock, in which case +FAULT_FLAG_TRIED flag is set before retrying. That in turn causes +mm_account_fault() to account the fault as major once retry completes. +With per-VMA locks we often retry because a fault can't be handled without +locking the whole mm using mmap_lock. Therefore such retries do not set +FAULT_FLAG_TRIED flag. This logic does not work after [2] because we can +now handle read major faults under per-VMA lock and upon retry the fact +there was a major fault gets lost. Fix this by setting FAULT_FLAG_TRIED +after retrying under per-VMA lock if VM_FAULT_MAJOR was returned. Ideally +we would use an additional VM_FAULT bit to indicate the reason for the +retry (could not handle under per-VMA lock vs other reason) but this +simpler solution seems to work, so keeping it simple. + +[1] https://cs.android.com/android/platform/superproject/+/master:test/vts-testcase/kernel/api/drop_caches_prop/drop_caches_test.cpp +[2] https://lore.kernel.org/all/20231006195318.4087158-6-willy@infradead.org/ + +Link: https://lkml.kernel.org/r/20231226214610.109282-1-surenb@google.com +Fixes: 12214eba1992 ("mm: handle read faults under the VMA lock") +Signed-off-by: Suren Baghdasaryan <surenb@google.com> +Cc: Matthew Wilcox <willy@infradead.org> +Cc: Alexander Gordeev <agordeev@linux.ibm.com> +Cc: Andy Lutomirski <luto@kernel.org> +Cc: Catalin Marinas <catalin.marinas@arm.com> +Cc: Christophe Leroy <christophe.leroy@csgroup.eu> +Cc: Dave Hansen <dave.hansen@linux.intel.com> +Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com> +Cc: Michael Ellerman <mpe@ellerman.id.au> +Cc: Palmer Dabbelt <palmer@dabbelt.com> +Cc: Peter Zijlstra <peterz@infradead.org> +Cc: Will Deacon <will@kernel.org> +Signed-off-by: Andrew Morton <akpm@linux-foundation.org> + +(cherry picked from commit 46e714c729c8d1d8110bc0545d7ffe8a759c9dc0 + https://git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm mm-hotfixes-stable) + +Bug: 317385399 +Change-Id: Ic7e97bf610dcabb7d3ac2306b2f1213be0ddd269 +Signed-off-by: Suren Baghdasaryan <surenb@google.com> +--- + arch/arm64/mm/fault.c | 2 ++ + arch/powerpc/mm/fault.c | 2 ++ + arch/riscv/mm/fault.c | 2 ++ + arch/s390/mm/fault.c | 3 +++ + arch/x86/mm/fault.c | 2 ++ + 5 files changed, 11 insertions(+) + +diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c +--- a/arch/arm64/mm/fault.c ++++ b/arch/arm64/mm/fault.c +@@ -607,6 +607,8 @@ static int __kprobes do_page_fault(unsigned long far, unsigned long esr, + goto done; + } + count_vm_vma_lock_event(VMA_LOCK_RETRY); ++ if (fault & VM_FAULT_MAJOR) ++ mm_flags |= FAULT_FLAG_TRIED; + + /* Quick path to respond to signals */ + if (fault_signal_pending(fault, regs)) { +diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c +--- a/arch/powerpc/mm/fault.c ++++ b/arch/powerpc/mm/fault.c +@@ -497,6 +497,8 @@ static int ___do_page_fault(struct pt_regs *regs, unsigned long address, + goto done; + } + count_vm_vma_lock_event(VMA_LOCK_RETRY); ++ if (fault & VM_FAULT_MAJOR) ++ flags |= FAULT_FLAG_TRIED; + + if (fault_signal_pending(fault, regs)) + return user_mode(regs) ? 0 : SIGBUS; +diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c +--- a/arch/riscv/mm/fault.c ++++ b/arch/riscv/mm/fault.c +@@ -304,6 +304,8 @@ void handle_page_fault(struct pt_regs *regs) + goto done; + } + count_vm_vma_lock_event(VMA_LOCK_RETRY); ++ if (fault & VM_FAULT_MAJOR) ++ flags |= FAULT_FLAG_TRIED; + + if (fault_signal_pending(fault, regs)) { + if (!user_mode(regs)) +diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c +--- a/arch/s390/mm/fault.c ++++ b/arch/s390/mm/fault.c +@@ -337,6 +337,9 @@ static void do_exception(struct pt_regs *regs, int access) + return; + } + count_vm_vma_lock_event(VMA_LOCK_RETRY); ++ if (fault & VM_FAULT_MAJOR) ++ flags |= FAULT_FLAG_TRIED; ++ + /* Quick path to respond to signals */ + if (fault_signal_pending(fault, regs)) { + if (!user_mode(regs)) +diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c +--- a/arch/x86/mm/fault.c ++++ b/arch/x86/mm/fault.c +@@ -1370,6 +1370,8 @@ void do_user_addr_fault(struct pt_regs *regs, + goto done; + } + count_vm_vma_lock_event(VMA_LOCK_RETRY); ++ if (fault & VM_FAULT_MAJOR) ++ flags |= FAULT_FLAG_TRIED; + + /* Quick path to respond to signals */ + if (fault_signal_pending(fault, regs)) { diff --git a/android-mainline/FROMLIST-Revert-fuse-Apply-flags2-only-when-userspace-set-the-FUSE_INIT_EXT.patch b/android-mainline/FROMLIST-Revert-fuse-Apply-flags2-only-when-userspace-set-the-FUSE_INIT_EXT.patch index f721fa6a..91f327e8 100644 --- a/android-mainline/FROMLIST-Revert-fuse-Apply-flags2-only-when-userspace-set-the-FUSE_INIT_EXT.patch +++ b/android-mainline/FROMLIST-Revert-fuse-Apply-flags2-only-when-userspace-set-the-FUSE_INIT_EXT.patch @@ -31,7 +31,7 @@ Signed-off-by: André Draszik <draszik@google.com> diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c -@@ -1153,10 +1153,7 @@ static void process_init_reply(struct fuse_mount *fm, struct fuse_args *args, +@@ -1154,10 +1154,7 @@ static void process_init_reply(struct fuse_mount *fm, struct fuse_args *args, process_init_limits(fc, arg); if (arg->minor >= 6) { diff --git a/android-mainline/FROMLIST-fs-Generic-function-to-convert-iocb-to-rw-flags.patch b/android-mainline/FROMLIST-fs-Generic-function-to-convert-iocb-to-rw-flags.patch deleted file mode 100644 index 0c054148..00000000 --- a/android-mainline/FROMLIST-fs-Generic-function-to-convert-iocb-to-rw-flags.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alessio Balsini <balsini@google.com> -Date: Mon, 25 Jan 2021 16:58:50 +0000 -Subject: FROMLIST: fs: Generic function to convert iocb to rw flags - -OverlayFS implements its own function to translate iocb flags into rw -flags, so that they can be passed into another vfs call. -With commit ce71bfea207b4 ("fs: align IOCB_* flags with RWF_* flags") -Jens created a 1:1 matching between the iocb flags and rw flags, -simplifying the conversion. - -Reduce the OverlayFS code by making the flag conversion function generic -and reusable. - -[CPNOTE: 20/05/21] Lee: Still fresh - hopefully this will land upstream soon - -Bug: 168023149 -Link: https://lore.kernel.org/lkml/20210125153057.3623715-2-balsini@android.com/ -Signed-off-by: Alessio Balsini <balsini@android.com> -Change-Id: I74aefeafd6ebbda2fbabee9024474dfe4cc6c2a7 -Signed-off-by: Alessio Balsini <balsini@google.com> -Signed-off-by: Lee Jones <joneslee@google.com> ---- - fs/overlayfs/file.c | 23 +++++------------------ - include/linux/fs.h | 5 +++++ - 2 files changed, 10 insertions(+), 18 deletions(-) - -diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c ---- a/fs/overlayfs/file.c -+++ b/fs/overlayfs/file.c -@@ -15,6 +15,8 @@ - #include <linux/fs.h> - #include "overlayfs.h" - -+#define OVL_IOCB_MASK (IOCB_DSYNC | IOCB_HIPRI | IOCB_NOWAIT | IOCB_SYNC) -+ - struct ovl_aio_req { - struct kiocb iocb; - refcount_t ref; -@@ -263,22 +265,6 @@ static void ovl_file_accessed(struct file *file) - touch_atime(&file->f_path); - } - --static rwf_t ovl_iocb_to_rwf(int ifl) --{ -- rwf_t flags = 0; -- -- if (ifl & IOCB_NOWAIT) -- flags |= RWF_NOWAIT; -- if (ifl & IOCB_HIPRI) -- flags |= RWF_HIPRI; -- if (ifl & IOCB_DSYNC) -- flags |= RWF_DSYNC; -- if (ifl & IOCB_SYNC) -- flags |= RWF_SYNC; -- -- return flags; --} -- - static inline void ovl_aio_put(struct ovl_aio_req *aio_req) - { - if (refcount_dec_and_test(&aio_req->ref)) { -@@ -335,7 +321,8 @@ static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter) - old_cred = ovl_override_creds(file_inode(file)->i_sb); - if (is_sync_kiocb(iocb)) { - ret = vfs_iter_read(real.file, iter, &iocb->ki_pos, -- ovl_iocb_to_rwf(iocb->ki_flags)); -+ iocb_to_rw_flags(iocb->ki_flags, -+ OVL_IOCB_MASK)); - } else { - struct ovl_aio_req *aio_req; - -@@ -403,7 +390,7 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter) - if (is_sync_kiocb(iocb)) { - file_start_write(real.file); - ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, -- ovl_iocb_to_rwf(ifl)); -+ iocb_to_rw_flags(ifl, OVL_IOCB_MASK)); - file_end_write(real.file); - /* Update size */ - ovl_copyattr(inode); -diff --git a/include/linux/fs.h b/include/linux/fs.h ---- a/include/linux/fs.h -+++ b/include/linux/fs.h -@@ -3270,6 +3270,11 @@ static inline int kiocb_set_rw_flags(struct kiocb *ki, rwf_t flags) - return 0; - } - -+static inline rwf_t iocb_to_rw_flags(int ifl, int iocb_mask) -+{ -+ return ifl & iocb_mask; -+} -+ - static inline ino_t parent_ino(struct dentry *dentry) - { - ino_t res; diff --git a/android-mainline/FROMLIST-fuse-Definitions-and-ioctl-for-passthrough.patch b/android-mainline/FROMLIST-fuse-Definitions-and-ioctl-for-passthrough.patch index 53baf001..3b4b6227 100644 --- a/android-mainline/FROMLIST-fuse-Definitions-and-ioctl-for-passthrough.patch +++ b/android-mainline/FROMLIST-fuse-Definitions-and-ioctl-for-passthrough.patch @@ -169,7 +169,7 @@ diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c atomic_set(&fc->num_waiting, 0); fc->max_background = FUSE_DEFAULT_MAX_BACKGROUND; fc->congestion_threshold = FUSE_DEFAULT_CONGESTION_THRESHOLD; -@@ -1223,6 +1225,12 @@ static void process_init_reply(struct fuse_mount *fm, struct fuse_args *args, +@@ -1224,6 +1226,12 @@ static void process_init_reply(struct fuse_mount *fm, struct fuse_args *args, fc->handle_killpriv_v2 = 1; fm->sb->s_flags |= SB_NOSEC; } @@ -182,7 +182,7 @@ diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c if (flags & FUSE_SETXATTR_EXT) fc->setxattr_ext = 1; if (flags & FUSE_SECURITY_CTX) -@@ -1310,9 +1318,16 @@ void fuse_send_init(struct fuse_mount *fm) +@@ -1311,9 +1319,16 @@ void fuse_send_init(struct fuse_mount *fm) } EXPORT_SYMBOL_GPL(fuse_send_init); diff --git a/android-mainline/FROMLIST-fuse-Passthrough-initialization-and-release.patch b/android-mainline/FROMLIST-fuse-Passthrough-initialization-and-release.patch index 78443562..a3e2e302 100644 --- a/android-mainline/FROMLIST-fuse-Passthrough-initialization-and-release.patch +++ b/android-mainline/FROMLIST-fuse-Passthrough-initialization-and-release.patch @@ -52,7 +52,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c -@@ -1320,6 +1320,11 @@ EXPORT_SYMBOL_GPL(fuse_send_init); +@@ -1321,6 +1321,11 @@ EXPORT_SYMBOL_GPL(fuse_send_init); static int free_fuse_passthrough(int id, void *p, void *data) { diff --git a/android-mainline/FROMLIST-fuse-give-wakeup-hints-to-the-scheduler.patch b/android-mainline/FROMLIST-fuse-give-wakeup-hints-to-the-scheduler.patch index fc59d751..9a5fff98 100644 --- a/android-mainline/FROMLIST-fuse-give-wakeup-hints-to-the-scheduler.patch +++ b/android-mainline/FROMLIST-fuse-give-wakeup-hints-to-the-scheduler.patch @@ -182,7 +182,7 @@ diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c diff --git a/include/linux/wait.h b/include/linux/wait.h --- a/include/linux/wait.h +++ b/include/linux/wait.h -@@ -230,6 +230,7 @@ void __wake_up_pollfree(struct wait_queue_head *wq_head); +@@ -227,6 +227,7 @@ void __wake_up_pollfree(struct wait_queue_head *wq_head); #define wake_up_interruptible_nr(x, nr) __wake_up(x, TASK_INTERRUPTIBLE, nr, NULL) #define wake_up_interruptible_all(x) __wake_up(x, TASK_INTERRUPTIBLE, 0, NULL) #define wake_up_interruptible_sync(x) __wake_up_sync((x), TASK_INTERRUPTIBLE) diff --git a/android-mainline/NOUPSTREAM-ANDROID-Add-vendor-hooks-to-the-scheduler.patch b/android-mainline/NOUPSTREAM-ANDROID-Add-vendor-hooks-to-the-scheduler.patch index 3ae9f941..635a1f3c 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-Add-vendor-hooks-to-the-scheduler.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-Add-vendor-hooks-to-the-scheduler.patch @@ -225,7 +225,7 @@ diff --git a/include/linux/sched.h b/include/linux/sched.h #include <asm/kmap_size.h> /* task_struct member predeclarations (sorted alphabetically): */ -@@ -1516,6 +1517,8 @@ struct task_struct { +@@ -1519,6 +1520,8 @@ struct task_struct { struct callback_head mce_kill_me; int mce_count; #endif @@ -524,7 +524,7 @@ diff --git a/include/trace/hooks/vendor_hooks.h b/include/trace/hooks/vendor_hoo diff --git a/init/init_task.c b/init/init_task.c --- a/init/init_task.c +++ b/init/init_task.c -@@ -211,6 +211,8 @@ struct task_struct init_task +@@ -210,6 +210,8 @@ struct task_struct init_task #ifdef CONFIG_SECCOMP_FILTER .seccomp = { .filter_count = ATOMIC_INIT(0) }, #endif @@ -628,7 +628,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c rb_erase_augmented_cached(&se->run_node, &cfs_rq->tasks_timeline, &min_deadline_cb); avg_vruntime_sub(cfs_rq, se); -@@ -4743,6 +4747,11 @@ static inline void util_est_update(struct cfs_rq *cfs_rq, +@@ -4848,6 +4852,11 @@ static inline void util_est_update(struct cfs_rq *cfs_rq, { long last_ewma_diff, last_enqueued_diff; struct util_est ue; @@ -640,7 +640,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c if (!sched_feat(UTIL_EST)) return; -@@ -5381,6 +5390,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) +@@ -5486,6 +5495,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) hrtimer_active(&rq_of(cfs_rq)->hrtick_timer)) return; #endif @@ -648,7 +648,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c } -@@ -6529,6 +6539,11 @@ static inline bool cpu_overutilized(int cpu) +@@ -6634,6 +6644,11 @@ static inline bool cpu_overutilized(int cpu) { unsigned long rq_util_min = uclamp_rq_get(cpu_rq(cpu), UCLAMP_MIN); unsigned long rq_util_max = uclamp_rq_get(cpu_rq(cpu), UCLAMP_MAX); @@ -660,7 +660,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c /* Return true only if the utilization doesn't fit CPU's capacity */ return !util_fits_cpu(cpu_util_cfs(cpu), rq_util_min, rq_util_max, cpu); -@@ -6607,6 +6622,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) +@@ -6712,6 +6727,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) flags = ENQUEUE_WAKEUP; } @@ -668,7 +668,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c for_each_sched_entity(se) { cfs_rq = cfs_rq_of(se); -@@ -6697,6 +6713,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags) +@@ -6802,6 +6818,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags) flags |= DEQUEUE_SLEEP; } @@ -676,7 +676,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c for_each_sched_entity(se) { cfs_rq = cfs_rq_of(se); -@@ -7800,6 +7817,8 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu, int sy +@@ -7905,6 +7922,8 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu, int sy struct perf_domain *pd; struct energy_env eenv; @@ -685,7 +685,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c rcu_read_lock(); pd = rcu_dereference(rd->pd); if (!pd || READ_ONCE(rd->overutilized)) -@@ -7808,7 +7827,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu, int sy +@@ -7913,7 +7932,7 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu, int sy cpu = smp_processor_id(); if (sync && cpu_rq(cpu)->nr_running == 1 && cpumask_test_cpu(cpu, p->cpus_ptr) && @@ -694,7 +694,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c rcu_read_unlock(); return cpu; } -@@ -7999,9 +8018,18 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int wake_flags) +@@ -8104,9 +8123,18 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int wake_flags) int cpu = smp_processor_id(); int new_cpu = prev_cpu; int want_affine = 0; @@ -713,7 +713,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c /* * required for stable ->cpus_allowed */ -@@ -8128,9 +8156,13 @@ static void check_preempt_wakeup_fair(struct rq *rq, struct task_struct *p, int +@@ -8233,9 +8261,13 @@ static void check_preempt_wakeup_fair(struct rq *rq, struct task_struct *p, int struct cfs_rq *cfs_rq = task_cfs_rq(curr); int next_buddy_marked = 0; int cse_is_idle, pse_is_idle; @@ -727,7 +727,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c /* * This is possible from callers such as attach_tasks(), in which we -@@ -8238,9 +8270,10 @@ struct task_struct * +@@ -8343,9 +8375,10 @@ struct task_struct * pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) { struct cfs_rq *cfs_rq = &rq->cfs; @@ -740,7 +740,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c again: if (!sched_fair_runnable(rq)) -@@ -8294,7 +8327,7 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf +@@ -8399,7 +8432,7 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf } while (cfs_rq); p = task_of(se); @@ -749,7 +749,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c /* * Since we haven't yet done put_prev_entity and if the selected task * is a different task than we started out with, try and touch the -@@ -8327,6 +8360,10 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf +@@ -8432,6 +8465,10 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf if (prev) put_prev_task(rq, prev); @@ -760,7 +760,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c do { se = pick_next_entity(cfs_rq); set_next_entity(cfs_rq, se); -@@ -8650,6 +8687,7 @@ struct lb_env { +@@ -8755,6 +8792,7 @@ struct lb_env { enum fbq_type fbq_type; enum migration_type migration_type; struct list_head tasks; @@ -768,7 +768,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c }; /* -@@ -8763,9 +8801,14 @@ static +@@ -8868,9 +8906,14 @@ static int can_migrate_task(struct task_struct *p, struct lb_env *env) { int tsk_cache_hot; @@ -783,7 +783,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c /* * We do not migrate tasks that are: * 1) throttled_lb_pair, or -@@ -8853,8 +8896,20 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env) +@@ -8958,8 +9001,20 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env) */ static void detach_task(struct task_struct *p, struct lb_env *env) { @@ -804,7 +804,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c deactivate_task(env->src_rq, p, DEQUEUE_NOCLOCK); set_task_cpu(p, env->dst_cpu); } -@@ -10718,8 +10773,12 @@ static struct sched_group *find_busiest_group(struct lb_env *env) +@@ -10823,8 +10878,12 @@ static struct sched_group *find_busiest_group(struct lb_env *env) if (sched_energy_enabled()) { struct root_domain *rd = env->dst_rq->rd; @@ -818,7 +818,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c goto out_balanced; } -@@ -10840,7 +10899,12 @@ static struct rq *find_busiest_queue(struct lb_env *env, +@@ -10945,7 +11004,12 @@ static struct rq *find_busiest_queue(struct lb_env *env, struct rq *busiest = NULL, *rq; unsigned long busiest_util = 0, busiest_load = 0, busiest_capacity = 1; unsigned int busiest_nr = 0; @@ -832,7 +832,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c for_each_cpu_and(i, sched_group_span(group), env->cpus) { unsigned long capacity, load, util; -@@ -11180,6 +11244,7 @@ static int load_balance(int this_cpu, struct rq *this_rq, +@@ -11289,6 +11353,7 @@ static int load_balance(int this_cpu, struct rq *this_rq, more_balance: rq_lock_irqsave(busiest, &rf); @@ -840,7 +840,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c update_rq_clock(busiest); /* -@@ -11477,6 +11542,7 @@ static int active_load_balance_cpu_stop(void *data) +@@ -11586,6 +11651,7 @@ static int active_load_balance_cpu_stop(void *data) .src_rq = busiest_rq, .idle = CPU_IDLE, .flags = LBF_ACTIVE_LB, @@ -848,7 +848,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c }; schedstat_inc(sd->alb_count); -@@ -11558,6 +11624,10 @@ static void rebalance_domains(struct rq *rq, enum cpu_idle_type idle) +@@ -11667,6 +11733,10 @@ static void rebalance_domains(struct rq *rq, enum cpu_idle_type idle) int need_serialize, need_decay = 0; u64 max_cost = 0; @@ -859,7 +859,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c rcu_read_lock(); for_each_domain(cpu, sd) { /* -@@ -11710,6 +11780,7 @@ static void nohz_balancer_kick(struct rq *rq) +@@ -11819,6 +11889,7 @@ static void nohz_balancer_kick(struct rq *rq) struct sched_domain *sd; int nr_busy, i, cpu = rq->cpu; unsigned int flags = 0; @@ -867,7 +867,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c if (unlikely(rq->idle_balance)) return; -@@ -11734,6 +11805,10 @@ static void nohz_balancer_kick(struct rq *rq) +@@ -11843,6 +11914,10 @@ static void nohz_balancer_kick(struct rq *rq) if (time_before(now, nohz.next_balance)) goto out; @@ -878,7 +878,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c if (rq->nr_running >= 2) { flags = NOHZ_STATS_KICK | NOHZ_BALANCE_KICK; goto out; -@@ -12153,6 +12228,11 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf) +@@ -12262,6 +12337,11 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf) u64 t0, t1, curr_cost = 0; struct sched_domain *sd; int pulled_task = 0; @@ -1126,7 +1126,7 @@ diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c void __init_waitqueue_head(struct wait_queue_head *wq_head, const char *name, struct lock_class_key *key) { -@@ -207,10 +208,13 @@ EXPORT_SYMBOL_GPL(__wake_up_locked_key_bookmark); +@@ -167,10 +168,13 @@ EXPORT_SYMBOL_GPL(__wake_up_locked_key); void __wake_up_sync_key(struct wait_queue_head *wq_head, unsigned int mode, void *key) { diff --git a/android-mainline/NOUPSTREAM-ANDROID-GKI-Don-t-compact-data-structures-when-CONFIG_ZSMALLOC-n.patch b/android-mainline/NOUPSTREAM-ANDROID-GKI-Don-t-compact-data-structures-when-CONFIG_ZSMALLOC-n.patch index f21facd7..939a3a95 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-GKI-Don-t-compact-data-structures-when-CONFIG_ZSMALLOC-n.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-GKI-Don-t-compact-data-structures-when-CONFIG_ZSMALLOC-n.patch @@ -36,7 +36,7 @@ diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h diff --git a/mm/vmstat.c b/mm/vmstat.c --- a/mm/vmstat.c +++ b/mm/vmstat.c -@@ -1176,9 +1176,7 @@ const char * const vmstat_text[] = { +@@ -1180,9 +1180,7 @@ const char * const vmstat_text[] = { "nr_zone_write_pending", "nr_mlock", "nr_bounce", diff --git a/android-mainline/NOUPSTREAM-ANDROID-Kbuild-Add-support-for-KBUILD_MIXED_TREE.patch b/android-mainline/NOUPSTREAM-ANDROID-Kbuild-Add-support-for-KBUILD_MIXED_TREE.patch index 52b51dd3..20bb0d66 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-Kbuild-Add-support-for-KBUILD_MIXED_TREE.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-Kbuild-Add-support-for-KBUILD_MIXED_TREE.patch @@ -59,7 +59,7 @@ diff --git a/Makefile b/Makefile # Kbuild will save output files in the current working directory. # This does not need to match to the root of the kernel source tree. # -@@ -748,11 +762,13 @@ drivers-y := +@@ -736,11 +750,13 @@ drivers-y := libs-y := lib/ endif # KBUILD_EXTMOD @@ -73,7 +73,7 @@ diff --git a/Makefile b/Makefile CFLAGS_GCOV := -fprofile-arcs -ftest-coverage ifdef CONFIG_CC_IS_GCC -@@ -1181,6 +1197,7 @@ targets += vmlinux.a +@@ -1170,6 +1186,7 @@ targets += vmlinux.a vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE $(call if_changed,ar_vmlinux.a) @@ -81,7 +81,7 @@ diff --git a/Makefile b/Makefile PHONY += vmlinux_o vmlinux_o: vmlinux.a $(KBUILD_VMLINUX_LIBS) $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_o -@@ -1203,6 +1220,7 @@ vmlinux: private _LDFLAGS_vmlinux := $(LDFLAGS_vmlinux) +@@ -1192,6 +1209,7 @@ vmlinux: private _LDFLAGS_vmlinux := $(LDFLAGS_vmlinux) vmlinux: export LDFLAGS_vmlinux = $(_LDFLAGS_vmlinux) vmlinux: vmlinux.o $(KBUILD_LDS) modpost $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux @@ -89,7 +89,7 @@ diff --git a/Makefile b/Makefile # The actual objects are generated when descending, # make sure no implicit rule kicks in -@@ -1467,7 +1485,7 @@ endif +@@ -1464,7 +1482,7 @@ endif # is an exception. ifdef CONFIG_DEBUG_INFO_BTF_MODULES KBUILD_BUILTIN := 1 @@ -98,7 +98,7 @@ diff --git a/Makefile b/Makefile endif modules: modules_prepare -@@ -1876,7 +1894,7 @@ KBUILD_MODULES := +@@ -1874,7 +1892,7 @@ KBUILD_MODULES := endif # CONFIG_MODULES PHONY += modpost @@ -107,7 +107,7 @@ diff --git a/Makefile b/Makefile $(if $(KBUILD_MODULES), modules_check) $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost -@@ -1926,7 +1944,7 @@ endif +@@ -1924,7 +1942,7 @@ endif # Error messages still appears in the original language PHONY += $(build-dir) $(build-dir): prepare @@ -116,7 +116,7 @@ diff --git a/Makefile b/Makefile clean-dirs := $(addprefix _clean_, $(clean-dirs)) PHONY += $(clean-dirs) clean -@@ -1982,7 +2000,7 @@ quiet_cmd_gen_compile_commands = GEN $@ +@@ -1980,7 +1998,7 @@ quiet_cmd_gen_compile_commands = GEN $@ cmd_gen_compile_commands = $(PYTHON3) $< -a $(AR) -o $@ $(filter-out $<, $(real-prereqs)) $(extmod_prefix)compile_commands.json: scripts/clang-tools/gen_compile_commands.py \ @@ -137,7 +137,7 @@ diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile all: $(notdir $(KBUILD_IMAGE)) +endif - + vmlinuz.efi: Image Image vmlinuz.efi: vmlinux diff --git a/arch/x86/Makefile b/arch/x86/Makefile --- a/arch/x86/Makefile @@ -166,7 +166,7 @@ diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal # find all modules listed in modules.order modules := $(call read-file, $(MODORDER)) -@@ -39,11 +41,11 @@ quiet_cmd_ld_ko_o = LD [M] $@ +@@ -36,11 +38,11 @@ quiet_cmd_ld_ko_o = LD [M] $@ quiet_cmd_btf_ko = BTF [M] $@ cmd_btf_ko = \ @@ -182,7 +182,7 @@ diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal fi; # Same as newer-prereqs, but allows to exclude specified extra dependencies -@@ -55,8 +57,8 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \ +@@ -52,8 +54,8 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \ printf '%s\n' 'savedcmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) # Re-generate module BTFs if either module's .ko or vmlinux changed diff --git a/android-mainline/NOUPSTREAM-ANDROID-Kleaf-Bazel-based-GKI-kernel-build.patch b/android-mainline/NOUPSTREAM-ANDROID-Kleaf-Bazel-based-GKI-kernel-build.patch index cb05ea02..ab37186e 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-Kleaf-Bazel-based-GKI-kernel-build.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-Kleaf-Bazel-based-GKI-kernel-build.patch @@ -22,11 +22,11 @@ Change-Id: I2f06b2b79dbcbf197cb23d68b3c2f6786191e19d Signed-off-by: Matthias Maennich <maennich@google.com> Signed-off-by: Lee Jones <joneslee@google.com> --- - BUILD.bazel | 1911 +++++++++++++++++++++++++++++++++++++++++++++++++++ + BUILD.bazel | 2174 +++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 4 + abi.bzl | 136 ++++ modules.bzl | 132 ++++ - 4 files changed, 2183 insertions(+) + 4 files changed, 2446 insertions(+) create mode 100644 BUILD.bazel create mode 100644 abi.bzl create mode 100644 modules.bzl @@ -35,7 +35,7 @@ diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 --- /dev/null +++ b/BUILD.bazel -@@ -0,0 +1,1911 @@ +@@ -0,0 +1,2174 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2021 The Android Open Source Project + @@ -1546,7 +1546,6 @@ new file mode 100644 + }), + includes = [ + "tools/testing/selftests", -+ "tools/testing/selftests/mm", + ], + linkopts = ["-nostartfiles"], + path_prefix = _KSELFTEST_DIR, @@ -1591,7 +1590,12 @@ new file mode 100644 + path_prefix = _KSELFTEST_DIR, + target_compatible_with = ["@platforms//os:android"], + visibility = ["//visibility:private"], -+ deps = [":kselftest_headers_lib"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ":kselftest_timers_inconsistency_check", ++ ":kselftest_timers_nanosleep", ++ ":kselftest_timers_tests_raw_skew", ++ ], +) + +cc_binary_with_abi( @@ -1604,7 +1608,11 @@ new file mode 100644 + path_prefix = _KSELFTEST_DIR, + target_compatible_with = ["@platforms//os:android"], + visibility = ["//visibility:private"], -+ deps = [":kselftest_headers_lib"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ":kselftest_timers_inconsistency_check", ++ ":kselftest_timers_nanosleep", ++ ], +) + +cc_binary_with_abi( @@ -1623,7 +1631,6 @@ new file mode 100644 +cc_binary_with_abi( + name = "kselftest_timers_inconsistency_check", + srcs = ["tools/testing/selftests/timers/inconsistency-check.c"], -+ # Called by set-2038, skew_consistency, change_skew, clocksource-switch + out = "inconsistency-check", + copts = [ + "-O3", @@ -1664,7 +1671,6 @@ new file mode 100644 +cc_binary_with_abi( + name = "kselftest_timers_nanosleep", + srcs = ["tools/testing/selftests/timers/nanosleep.c"], -+ # Called by clocksource-switch, change_skew, set-2038 + out = "nanosleep", + copts = [ + "-O3", @@ -1679,6 +1685,7 @@ new file mode 100644 +cc_binary_with_abi( + name = "kselftest_timers_nsleep_lat", + srcs = ["tools/testing/selftests/timers/nsleep-lat.c"], ++ out = "nsleep-lat", + copts = [ + "-O3", + "-DKTEST", @@ -1705,7 +1712,6 @@ new file mode 100644 +cc_binary_with_abi( + name = "kselftest_timers_tests_raw_skew", + srcs = ["tools/testing/selftests/timers/raw_skew.c"], -+ # Called by change_skew + out = "raw_skew", + copts = [ + "-O3", @@ -1727,7 +1733,12 @@ new file mode 100644 + path_prefix = _KSELFTEST_DIR, + target_compatible_with = ["@platforms//os:android"], + visibility = ["//visibility:private"], -+ deps = [":kselftest_headers_lib"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ":kselftest_timers_inconsistency_check", ++ ":kselftest_timers_nanosleep", ++ ":kselftest_timers_nsleep_lat", ++ ], +) + +cc_binary_with_abi( @@ -1779,7 +1790,10 @@ new file mode 100644 + path_prefix = _KSELFTEST_DIR, + target_compatible_with = ["@platforms//os:android"], + visibility = ["//visibility:private"], -+ deps = [":kselftest_headers_lib"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ":kselftest_timers_inconsistency_check", ++ ], +) + +cc_binary_with_abi( @@ -1808,6 +1822,223 @@ new file mode 100644 + deps = [":kselftest_headers_lib"], +) + ++cc_binary_with_abi( ++ name = "kselftest_net_socket", ++ srcs = ["tools/testing/selftests/net/socket.c"], ++ copts = ["-Wno-gnu-variable-sized-type-not-at-end"], ++ includes = ["tools/testing/selftests"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [":kselftest_headers_lib"], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_net_reuseaddr_conflict", ++ srcs = ["tools/testing/selftests/net/reuseaddr_conflict.c"], ++ includes = ["tools/testing/selftests"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [":kselftest_headers_lib"], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_net_psock_tpacket", ++ srcs = [ ++ "tools/testing/selftests/net/psock_lib.h", ++ "tools/testing/selftests/net/psock_tpacket.c", ++ ], ++ copts = ["-Wno-gnu-variable-sized-type-not-at-end"], ++ includes = ["tools/testing/selftests"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [":kselftest_headers_lib"], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_capabilities_test_execve", ++ srcs = ["tools/testing/selftests/capabilities/test_execve.c"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ ":kselftest_capabilities_validate_cap", ++ ":kselftest_headers_lib", ++ "@libcap_ng//:libcap-ng", ++ ], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_capabilities_validate_cap", ++ srcs = ["tools/testing/selftests/capabilities/validate_cap.c"], ++ out = "validate_cap", ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ ":kselftest_headers_lib", ++ "@libcap_ng//:libcap-ng", ++ ], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_seccomp_seccomp_bpf", ++ srcs = [ ++ "tools/testing/selftests/clone3/clone3_selftests.h", ++ "tools/testing/selftests/seccomp/seccomp_bpf.c", ++ ], ++ copts = [ ++ "-Wno-unused-function", ++ "-D__GLIBC_PREREQ(a,b)", ++ ], ++ includes = ["tools/testing/selftests"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ ":kselftest_headers_lib", ++ "@libcap", ++ ], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_x86_single_step_syscall", ++ srcs = [ ++ "tools/testing/selftests/x86/helpers.h", ++ "tools/testing/selftests/x86/single_step_syscall.c", ++ ], ++ abis = ["x86_64"], ++ copts = [ ++ "-std=gnu99", ++ "-O2", ++ "-pthread", ++ ], ++ includes = ["tools/testing/selftests"], ++ linkopts = ["-static"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_x86_syscall_nt", ++ srcs = [ ++ "tools/testing/selftests/x86/helpers.h", ++ "tools/testing/selftests/x86/syscall_nt.c", ++ ], ++ abis = ["x86_64"], ++ copts = [ ++ "-std=gnu99", ++ "-O2", ++ "-pthread", ++ ], ++ includes = ["tools/testing/selftests"], ++ linkopts = ["-static"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_x86_ptrace_syscall", ++ srcs = [ ++ "tools/testing/selftests/x86/helpers.h", ++ "tools/testing/selftests/x86/ptrace_syscall.c", ++ ], ++ abis = ["x86_64"], ++ copts = [ ++ "-std=gnu99", ++ "-O2", ++ "-pthread", ++ ], ++ includes = ["tools/testing/selftests"], ++ linkopts = ["-static"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_x86_test_mremap_vdso", ++ srcs = [ ++ "tools/testing/selftests/x86/helpers.h", ++ "tools/testing/selftests/x86/test_mremap_vdso.c", ++ ], ++ abis = ["x86_64"], ++ copts = [ ++ "-std=gnu99", ++ "-O2", ++ "-pthread", ++ ], ++ includes = ["tools/testing/selftests"], ++ linkopts = ["-static"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_x86_check_initial_reg_state", ++ srcs = [ ++ "tools/testing/selftests/x86/check_initial_reg_state.c", ++ "tools/testing/selftests/x86/helpers.h", ++ ], ++ abis = ["x86_64"], ++ copts = [ ++ "-std=gnu99", ++ "-O2", ++ "-pthread", ++ ], ++ includes = ["tools/testing/selftests"], ++ linkopts = [ ++ "-static", ++ "-Wl", ++ "-ereal_start", ++ ], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ], ++) ++ ++cc_binary_with_abi( ++ name = "kselftest_x86_ldt_gdt", ++ srcs = [ ++ "tools/testing/selftests/x86/helpers.h", ++ "tools/testing/selftests/x86/ldt_gdt.c", ++ ], ++ abis = ["x86_64"], ++ copts = [ ++ "-std=gnu99", ++ "-O2", ++ "-pthread", ++ ], ++ includes = ["tools/testing/selftests"], ++ linkopts = ["-static"], ++ path_prefix = _KSELFTEST_DIR, ++ target_compatible_with = ["@platforms//os:android"], ++ visibility = ["//visibility:private"], ++ deps = [ ++ ":kselftest_headers_lib", ++ ], ++) ++ +copy_file( + name = "kselftest_gen_config", + src = select({ @@ -1823,6 +2054,8 @@ new file mode 100644 + srcs = [ + ":kselftest_binderfs_binderfs_test_x86_64", + ":kselftest_breakpoints_breakpoint_test_x86_64", ++ ":kselftest_capabilities_test_execve_x86_64", ++ ":kselftest_capabilities_validate_cap_x86_64", + ":kselftest_futex_futex_requeue_pi_mismatched_ops_x86_64", + ":kselftest_futex_futex_requeue_pi_signal_restart_x86_64", + ":kselftest_futex_futex_requeue_pi_x86_64", @@ -1846,8 +2079,12 @@ new file mode 100644 + ":kselftest_mm_thuge_gen_x86_64", + ":kselftest_mm_transhuge_stress_x86_64", + ":kselftest_mm_uffd_unit_tests_x86_64", ++ ":kselftest_net_psock_tpacket_x86_64", ++ ":kselftest_net_reuseaddr_conflict_x86_64", ++ ":kselftest_net_socket_x86_64", + ":kselftest_ptrace_peeksiginfo_x86_64", + ":kselftest_rtc_rtctest_x86_64", ++ ":kselftest_seccomp_seccomp_bpf_x86_64", + ":kselftest_size_test_get_size_x86_64", + ":kselftest_timers_adjtick_x86_64", + ":kselftest_timers_alarmtimer_suspend_x86_64", @@ -1872,6 +2109,12 @@ new file mode 100644 + ":kselftest_vdso_vdso_test_clock_getres_x86_64", + ":kselftest_vdso_vdso_test_getcpu_x86_64", + ":kselftest_vdso_vdso_test_gettimeofday_x86_64", ++ ":kselftest_x86_check_initial_reg_state_x86_64", ++ ":kselftest_x86_ldt_gdt_x86_64", ++ ":kselftest_x86_ptrace_syscall_x86_64", ++ ":kselftest_x86_single_step_syscall_x86_64", ++ ":kselftest_x86_syscall_nt_x86_64", ++ ":kselftest_x86_test_mremap_vdso_x86_64", + ], + cpu = "x86_64", + visibility = ["//visibility:private"], @@ -1882,6 +2125,8 @@ new file mode 100644 + srcs = [ + ":kselftest_binderfs_binderfs_test_arm64", + ":kselftest_breakpoints_breakpoint_test_arm64", ++ ":kselftest_capabilities_test_execve_arm64", ++ ":kselftest_capabilities_validate_cap_arm64", + ":kselftest_futex_futex_requeue_arm64", + ":kselftest_futex_futex_requeue_pi_arm64", + ":kselftest_futex_futex_requeue_pi_mismatched_ops_arm64", @@ -1905,8 +2150,12 @@ new file mode 100644 + ":kselftest_mm_thuge_gen_arm64", + ":kselftest_mm_transhuge_stress_arm64", + ":kselftest_mm_uffd_unit_tests_arm64", ++ ":kselftest_net_psock_tpacket_arm64", ++ ":kselftest_net_reuseaddr_conflict_arm64", ++ ":kselftest_net_socket_arm64", + ":kselftest_ptrace_peeksiginfo_arm64", + ":kselftest_rtc_rtctest_arm64", ++ ":kselftest_seccomp_seccomp_bpf_arm64", + ":kselftest_size_test_get_size_arm64", + ":kselftest_timers_adjtick_arm64", + ":kselftest_timers_alarmtimer_suspend_arm64", @@ -1947,6 +2196,20 @@ new file mode 100644 + srcs = [":kselftest_tests_arm64"], + out = "tests.zip", +) ++ ++copy_to_dist_dir( ++ name = "tests_zip_x86_64_dist", ++ data = [":tests_zip_x86_64"], ++ dist_dir = "out/tests_x86_64/dist", ++ flat = True, ++) ++ ++copy_to_dist_dir( ++ name = "tests_zip_arm64_dist", ++ data = [":tests_zip_arm64"], ++ dist_dir = "out/tests_arm64/dist", ++ flat = True, ++) diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile diff --git a/android-mainline/NOUPSTREAM-ANDROID-arm64-ARM64-Exports.patch b/android-mainline/NOUPSTREAM-ANDROID-arm64-ARM64-Exports.patch index 1bb2eebd..16847917 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-arm64-ARM64-Exports.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-arm64-ARM64-Exports.patch @@ -48,7 +48,7 @@ diff --git a/arch/arm64/include/asm/smp.h b/arch/arm64/include/asm/smp.h diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c -@@ -1486,6 +1486,7 @@ const struct cpumask *system_32bit_el0_cpumask(void) +@@ -1524,6 +1524,7 @@ const struct cpumask *system_32bit_el0_cpumask(void) return cpu_possible_mask; } @@ -109,7 +109,7 @@ diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c /* * as from 2.5, kernels no longer have an init_tasks structure -@@ -1184,3 +1187,15 @@ bool cpus_are_stuck_in_kernel(void) +@@ -1181,3 +1184,15 @@ bool cpus_are_stuck_in_kernel(void) return !!cpus_stuck_in_kernel || smp_spin_tables || is_protected_kvm_enabled(); } diff --git a/android-mainline/NOUPSTREAM-ANDROID-gki_defconfigs.patch b/android-mainline/NOUPSTREAM-ANDROID-gki_defconfigs.patch index 53d21a84..ab800a41 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-gki_defconfigs.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-gki_defconfigs.patch @@ -24,13 +24,13 @@ Signed-off-by: Lee Jones <joneslee@google.com> arch/arm64/configs/16k_gki.fragment | 3 + arch/arm64/configs/crashdump_defconfig | 81 +++ arch/arm64/configs/db845c_gki.fragment | 14 +- - arch/arm64/configs/gki_defconfig | 709 ++++++++++++++++++++++++ - arch/arm64/configs/microdroid_defconfig | 216 ++++++++ - arch/riscv/configs/gki_defconfig | 651 ++++++++++++++++++++++ + arch/arm64/configs/gki_defconfig | 711 ++++++++++++++++++++++++ + arch/arm64/configs/microdroid_defconfig | 216 +++++++ + arch/riscv/configs/gki_defconfig | 649 +++++++++++++++++++++ arch/x86/configs/crashdump_defconfig | 87 +++ - arch/x86/configs/gki_defconfig | 657 ++++++++++++++++++++++ + arch/x86/configs/gki_defconfig | 659 ++++++++++++++++++++++ arch/x86/configs/microdroid_defconfig | 290 ++++++++++ - 9 files changed, 2705 insertions(+), 3 deletions(-) + 9 files changed, 2707 insertions(+), 3 deletions(-) create mode 100644 arch/arm64/configs/16k_gki.fragment create mode 100644 arch/arm64/configs/crashdump_defconfig create mode 100644 arch/arm64/configs/gki_defconfig @@ -194,7 +194,7 @@ diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig new file mode 100644 --- /dev/null +++ b/arch/arm64/configs/gki_defconfig -@@ -0,0 +1,709 @@ +@@ -0,0 +1,711 @@ +CONFIG_UAPI_HEADER_TEST=y +CONFIG_AUDIT=y +CONFIG_NO_HZ=y @@ -455,6 +455,7 @@ new file mode 100644 +CONFIG_NET_ACT_MIRRED=y +CONFIG_NET_ACT_SKBEDIT=y +CONFIG_NET_ACT_BPF=y ++CONFIG_VSOCKETS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CAN=m +CONFIG_BT=m @@ -498,6 +499,7 @@ new file mode 100644 +CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 ++CONFIG_BLK_DEV_UBLK=y +CONFIG_SRAM=y +CONFIG_SCSI=y +# CONFIG_SCSI_PROC_FS is not set @@ -616,6 +618,7 @@ new file mode 100644 +CONFIG_THERMAL_GOV_USER_SPACE=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_CPU_THERMAL=y ++CONFIG_CPU_IDLE_THERMAL=y +CONFIG_DEVFREQ_THERMAL=y +CONFIG_THERMAL_EMULATION=y +CONFIG_WATCHDOG=y @@ -689,7 +692,6 @@ new file mode 100644 +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_GADGET=y +CONFIG_USB_CONFIGFS=y -+CONFIG_USB_CONFIGFS_UEVENT=y +CONFIG_USB_CONFIGFS_SERIAL=y +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_NCM=y @@ -697,8 +699,6 @@ new file mode 100644 +CONFIG_USB_CONFIGFS_EEM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_FS=y -+CONFIG_USB_CONFIGFS_F_ACC=y -+CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y +CONFIG_USB_CONFIGFS_F_UAC2=y +CONFIG_USB_CONFIGFS_F_MIDI=y +CONFIG_USB_CONFIGFS_F_HID=y @@ -731,6 +731,7 @@ new file mode 100644 +CONFIG_RTC_DRV_PL031=y +CONFIG_DMABUF_HEAPS=y +CONFIG_UIO=y ++CONFIG_VHOST_VSOCK=y +CONFIG_STAGING=y +CONFIG_ASHMEM=y +CONFIG_COMMON_CLK_SCPI=y @@ -752,11 +753,12 @@ new file mode 100644 +CONFIG_IIO_BUFFER=y +CONFIG_IIO_TRIGGER=y +CONFIG_PWM=y -+CONFIG_GENERIC_PHY=y +CONFIG_POWERCAP=y ++CONFIG_IDLE_INJECT=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ANDROID_BINDERFS=y +CONFIG_ANDROID_VENDOR_HOOKS=y ++CONFIG_ANDROID_DEBUG_KINFO=y +CONFIG_ANDROID_MEMHEALTH=m +CONFIG_LIBNVDIMM=y +CONFIG_INTERCONNECT=y @@ -1129,7 +1131,7 @@ diff --git a/arch/riscv/configs/gki_defconfig b/arch/riscv/configs/gki_defconfig new file mode 100644 --- /dev/null +++ b/arch/riscv/configs/gki_defconfig -@@ -0,0 +1,651 @@ +@@ -0,0 +1,649 @@ +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y @@ -1371,6 +1373,7 @@ new file mode 100644 +CONFIG_NET_ACT_MIRRED=y +CONFIG_NET_ACT_SKBEDIT=y +CONFIG_NET_ACT_BPF=y ++CONFIG_VSOCKETS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CAN=m +CONFIG_BT=m @@ -1581,7 +1584,6 @@ new file mode 100644 +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_GADGET=y +CONFIG_USB_CONFIGFS=y -+CONFIG_USB_CONFIGFS_UEVENT=y +CONFIG_USB_CONFIGFS_SERIAL=y +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_NCM=y @@ -1589,8 +1591,6 @@ new file mode 100644 +CONFIG_USB_CONFIGFS_EEM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_FS=y -+CONFIG_USB_CONFIGFS_F_ACC=y -+CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y +CONFIG_USB_CONFIGFS_F_UAC2=y +CONFIG_USB_CONFIGFS_F_MIDI=y +CONFIG_USB_CONFIGFS_F_HID=y @@ -1620,6 +1620,7 @@ new file mode 100644 +CONFIG_RTC_CLASS=y +CONFIG_DMABUF_HEAPS=y +CONFIG_UIO=y ++CONFIG_VHOST_VSOCK=y +CONFIG_STAGING=y +CONFIG_ASHMEM=y +# CONFIG_SUNXI_CCU is not set @@ -1638,7 +1639,6 @@ new file mode 100644 +CONFIG_IIO_TRIGGER=y +CONFIG_PWM=y +CONFIG_RESET_CONTROLLER=y -+CONFIG_GENERIC_PHY=y +CONFIG_POWERCAP=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ANDROID_BINDERFS=y @@ -1877,7 +1877,7 @@ diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig new file mode 100644 --- /dev/null +++ b/arch/x86/configs/gki_defconfig -@@ -0,0 +1,657 @@ +@@ -0,0 +1,659 @@ +CONFIG_UAPI_HEADER_TEST=y +CONFIG_KERNEL_LZ4=y +CONFIG_AUDIT=y @@ -2135,6 +2135,7 @@ new file mode 100644 +CONFIG_NET_ACT_MIRRED=y +CONFIG_NET_ACT_SKBEDIT=y +CONFIG_NET_ACT_BPF=y ++CONFIG_VSOCKETS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CAN=m +CONFIG_BT=m @@ -2169,6 +2170,7 @@ new file mode 100644 +CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 ++CONFIG_BLK_DEV_UBLK=y +CONFIG_SRAM=y +CONFIG_SCSI=y +# CONFIG_SCSI_PROC_FS is not set @@ -2266,6 +2268,7 @@ new file mode 100644 +CONFIG_THERMAL_GOV_BANG_BANG=y +CONFIG_THERMAL_GOV_USER_SPACE=y +CONFIG_CPU_THERMAL=y ++CONFIG_CPU_IDLE_THERMAL=y +CONFIG_DEVFREQ_THERMAL=y +CONFIG_THERMAL_EMULATION=y +# CONFIG_X86_PKG_TEMP_THERMAL is not set @@ -2339,7 +2342,6 @@ new file mode 100644 +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_GADGET=y +CONFIG_USB_CONFIGFS=y -+CONFIG_USB_CONFIGFS_UEVENT=y +CONFIG_USB_CONFIGFS_SERIAL=y +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_NCM=y @@ -2347,8 +2349,6 @@ new file mode 100644 +CONFIG_USB_CONFIGFS_EEM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_FS=y -+CONFIG_USB_CONFIGFS_F_ACC=y -+CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y +CONFIG_USB_CONFIGFS_F_UAC2=y +CONFIG_USB_CONFIGFS_F_MIDI=y +CONFIG_USB_CONFIGFS_F_HID=y @@ -2379,6 +2379,7 @@ new file mode 100644 +# CONFIG_RTC_HCTOSYS is not set +CONFIG_DMABUF_HEAPS=y +CONFIG_UIO=y ++CONFIG_VHOST_VSOCK=y +CONFIG_STAGING=y +CONFIG_ASHMEM=y +CONFIG_REMOTEPROC=y @@ -2389,6 +2390,7 @@ new file mode 100644 +CONFIG_IIO_BUFFER=y +CONFIG_IIO_TRIGGER=y +CONFIG_POWERCAP=y ++CONFIG_IDLE_INJECT=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ANDROID_BINDERFS=y +CONFIG_ANDROID_VENDOR_HOOKS=y diff --git a/android-mainline/NOUPSTREAM-ANDROID-init-GKI-add-GKI_HACKS_TO_FIX.patch b/android-mainline/NOUPSTREAM-ANDROID-init-GKI-add-GKI_HACKS_TO_FIX.patch index cf9bd8a6..637cbc7f 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-init-GKI-add-GKI_HACKS_TO_FIX.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-init-GKI-add-GKI_HACKS_TO_FIX.patch @@ -338,7 +338,7 @@ new file mode 100644 diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c -@@ -237,7 +237,7 @@ static struct xfrm_algo_desc aalg_list[] = { +@@ -238,7 +238,7 @@ static struct xfrm_algo_desc aalg_list[] = { .uinfo = { .auth = { diff --git a/android-mainline/NOUPSTREAM-ANDROID-kbuild-Add-support-for-installing-out-of-tree-kernel-headers.patch b/android-mainline/NOUPSTREAM-ANDROID-kbuild-Add-support-for-installing-out-of-tree-kernel-headers.patch index d0836f79..3c5c6c62 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-kbuild-Add-support-for-installing-out-of-tree-kernel-headers.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-kbuild-Add-support-for-installing-out-of-tree-kernel-headers.patch @@ -63,7 +63,7 @@ diff --git a/Documentation/kbuild/modules.rst b/Documentation/kbuild/modules.rst diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile -@@ -1101,6 +1101,40 @@ export extmod_prefix = $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/) +@@ -1090,6 +1090,40 @@ export extmod_prefix = $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/) export MODORDER := $(extmod_prefix)modules.order export MODULES_NSDEPS := $(extmod_prefix)modules.nsdeps @@ -104,7 +104,7 @@ diff --git a/Makefile b/Makefile ifeq ($(KBUILD_EXTMOD),) build-dir := . -@@ -1272,32 +1306,6 @@ headerdep: +@@ -1261,32 +1295,6 @@ headerdep: $(Q)find $(srctree)/include/ -name '*.h' | xargs --max-args 1 \ $(srctree)/scripts/headerdep.pl -I$(srctree)/include @@ -137,7 +137,7 @@ diff --git a/Makefile b/Makefile ifdef CONFIG_HEADERS_INSTALL prepare: headers endif -@@ -1796,6 +1804,8 @@ help: +@@ -1794,6 +1802,8 @@ help: @echo '' @echo ' modules - default target, build the module(s)' @echo ' modules_install - install the module' diff --git a/android-mainline/NOUPSTREAM-ANDROID-kbuild-Copy-out-of-tree-kernel-headers-to-INSTALL_HDR_PATH.patch b/android-mainline/NOUPSTREAM-ANDROID-kbuild-Copy-out-of-tree-kernel-headers-to-INSTALL_HDR_PATH.patch index 4ef771a9..438bb163 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-kbuild-Copy-out-of-tree-kernel-headers-to-INSTALL_HDR_PATH.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-kbuild-Copy-out-of-tree-kernel-headers-to-INSTALL_HDR_PATH.patch @@ -26,7 +26,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile -@@ -1144,7 +1144,7 @@ quiet_cmd_headers_install = INSTALL $(INSTALL_HDR_PATH)/include +@@ -1133,7 +1133,7 @@ quiet_cmd_headers_install = INSTALL $(INSTALL_HDR_PATH)/include cmd_headers_install = \ mkdir -p $(INSTALL_HDR_PATH); \ rsync -mrl --include='*/' --include='*\.h' --exclude='*' \ diff --git a/android-mainline/NOUPSTREAM-ANDROID-kernel-Core-Kernel-Exports.patch b/android-mainline/NOUPSTREAM-ANDROID-kernel-Core-Kernel-Exports.patch index 6a645f05..a122aa5d 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-kernel-Core-Kernel-Exports.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-kernel-Core-Kernel-Exports.patch @@ -90,7 +90,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> kernel/pid.c | 1 + kernel/printk/printk.c | 1 + kernel/reboot.c | 1 + - kernel/sched/cpufreq.c | 1 + + kernel/sched/cpufreq.c | 2 ++ kernel/sched/cpupri.c | 1 + kernel/sched/cputime.c | 4 ++++ kernel/sched/debug.c | 4 +++- @@ -104,12 +104,12 @@ Signed-off-by: Lee Jones <joneslee@google.com> kernel/time/tick-sched.c | 2 ++ kernel/time/time.c | 1 + kernel/trace/power-traces.c | 4 +++- - 24 files changed, 65 insertions(+), 9 deletions(-) + 24 files changed, 66 insertions(+), 9 deletions(-) diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c -@@ -2458,6 +2458,7 @@ struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset, +@@ -2470,6 +2470,7 @@ struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset, return cgroup_taskset_next(tset, dst_cssp); } @@ -117,7 +117,7 @@ diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c /** * cgroup_taskset_next - iterate to the next task in taskset -@@ -2504,6 +2505,7 @@ struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset, +@@ -2516,6 +2517,7 @@ struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset, return NULL; } @@ -125,7 +125,7 @@ diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c /** * cgroup_migrate_execute - migrate a taskset -@@ -4576,6 +4578,7 @@ struct cgroup_subsys_state *css_next_child(struct cgroup_subsys_state *pos, +@@ -4580,6 +4582,7 @@ struct cgroup_subsys_state *css_next_child(struct cgroup_subsys_state *pos, return next; return NULL; } @@ -237,7 +237,7 @@ diff --git a/kernel/pid.c b/kernel/pid.c diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c -@@ -3933,6 +3933,7 @@ int _printk_deferred(const char *fmt, ...) +@@ -3964,6 +3964,7 @@ int _printk_deferred(const char *fmt, ...) return r; } @@ -259,7 +259,15 @@ diff --git a/kernel/reboot.c b/kernel/reboot.c diff --git a/kernel/sched/cpufreq.c b/kernel/sched/cpufreq.c --- a/kernel/sched/cpufreq.c +++ b/kernel/sched/cpufreq.c -@@ -72,3 +72,4 @@ bool cpufreq_this_cpu_can_update(struct cpufreq_policy *policy) +@@ -7,6 +7,7 @@ + */ + + DEFINE_PER_CPU(struct update_util_data __rcu *, cpufreq_update_util_data); ++EXPORT_PER_CPU_SYMBOL_GPL(cpufreq_update_util_data); + + /** + * cpufreq_add_update_util_hook - Populate the CPU's update_util_data pointer. +@@ -72,3 +73,4 @@ bool cpufreq_this_cpu_can_update(struct cpufreq_policy *policy) (policy->dvfs_possible_from_any_cpu && rcu_dereference_sched(*this_cpu_ptr(&cpufreq_update_util_data))); } @@ -352,7 +360,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c /* * The initial- and re-scaling of tunables is configurable * -@@ -5273,8 +5289,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags) +@@ -5378,8 +5394,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags) update_idle_cfs_rq_clock_pelt(cfs_rq); } @@ -362,7 +370,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c { clear_buddies(cfs_rq, se); -@@ -5315,6 +5330,7 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) +@@ -5420,6 +5435,7 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) se->prev_sum_exec_runtime = se->sum_exec_runtime; } @@ -370,7 +378,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c /* * Pick the next process, keeping these things in mind, in this order: -@@ -8602,7 +8618,8 @@ static bool yield_to_task_fair(struct rq *rq, struct task_struct *p) +@@ -8707,7 +8723,8 @@ static bool yield_to_task_fair(struct rq *rq, struct task_struct *p) * rewrite all of this once again.] */ diff --git a/android-mainline/NOUPSTREAM-ANDROID-kernel-Core-kernel-related-vendor-hooks.patch b/android-mainline/NOUPSTREAM-ANDROID-kernel-Core-kernel-related-vendor-hooks.patch index 09b6d38e..535a2a75 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-kernel-Core-kernel-related-vendor-hooks.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-kernel-Core-kernel-related-vendor-hooks.patch @@ -414,7 +414,7 @@ diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c #define CGROUP_FILE_NAME_MAX (MAX_CGROUP_TYPE_NAMELEN + \ MAX_CFTYPE_NAME + 2) -@@ -2571,6 +2574,7 @@ static int cgroup_migrate_execute(struct cgroup_mgctx *mgctx) +@@ -2583,6 +2586,7 @@ static int cgroup_migrate_execute(struct cgroup_mgctx *mgctx) do_each_subsys_mask(ss, ssid, mgctx->ss_mask) { if (ss->attach) { tset->ssid = ssid; @@ -434,7 +434,7 @@ diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c #include "printk_ringbuffer.h" #include "console_cmdline.h" -@@ -2605,6 +2607,12 @@ void resume_console(void) +@@ -2593,6 +2595,12 @@ void resume_console(void) */ static int console_cpu_notify(unsigned int cpu) { @@ -470,7 +470,7 @@ diff --git a/kernel/sys.c b/kernel/sys.c #ifndef SET_UNALIGN_CTL # define SET_UNALIGN_CTL(a, b) (-EINVAL) #endif -@@ -2724,6 +2726,7 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, +@@ -2747,6 +2749,7 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, error = -EINVAL; break; } diff --git a/android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Management-Exports.patch b/android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Management-Exports.patch index f631fdad..44d88e90 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Management-Exports.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Management-Exports.patch @@ -25,8 +25,9 @@ Signed-off-by: Lee Jones <joneslee@google.com> mm/memblock.c | 1 + mm/memory.c | 1 + mm/mmap.c | 1 + + mm/oom_kill.c | 3 ++- mm/percpu.c | 1 + - 5 files changed, 9 insertions(+) + 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/mm/cma.c b/mm/cma.c --- a/mm/cma.c @@ -71,7 +72,7 @@ diff --git a/mm/cma.c b/mm/cma.c diff --git a/mm/memblock.c b/mm/memblock.c --- a/mm/memblock.c +++ b/mm/memblock.c -@@ -1698,6 +1698,7 @@ phys_addr_t __init_memblock memblock_end_of_DRAM(void) +@@ -1716,6 +1716,7 @@ phys_addr_t __init_memblock memblock_end_of_DRAM(void) return (memblock.memory.regions[idx].base + memblock.memory.regions[idx].size); } @@ -82,7 +83,7 @@ diff --git a/mm/memblock.c b/mm/memblock.c diff --git a/mm/memory.c b/mm/memory.c --- a/mm/memory.c +++ b/mm/memory.c -@@ -180,6 +180,7 @@ void mm_trace_rss_stat(struct mm_struct *mm, int member) +@@ -181,6 +181,7 @@ void mm_trace_rss_stat(struct mm_struct *mm, int member) { trace_rss_stat(mm, member); } @@ -93,7 +94,7 @@ diff --git a/mm/memory.c b/mm/memory.c diff --git a/mm/mmap.c b/mm/mmap.c --- a/mm/mmap.c +++ b/mm/mmap.c -@@ -1675,6 +1675,7 @@ unsigned long vm_unmapped_area(struct vm_unmapped_area_info *info) +@@ -1680,6 +1680,7 @@ unsigned long vm_unmapped_area(struct vm_unmapped_area_info *info) trace_vm_unmapped_area(addr, info); return addr; } @@ -101,10 +102,30 @@ diff --git a/mm/mmap.c b/mm/mmap.c /* Get an address range which is currently unmapped. * For shmat() with addr=0. +diff --git a/mm/oom_kill.c b/mm/oom_kill.c +--- a/mm/oom_kill.c ++++ b/mm/oom_kill.c +@@ -420,7 +420,7 @@ static int dump_task(struct task_struct *p, void *arg) + * State information includes task's pid, uid, tgid, vm size, rss, + * pgtables_bytes, swapents, oom_score_adj value, and name. + */ +-static void dump_tasks(struct oom_control *oc) ++void dump_tasks(struct oom_control *oc) + { + pr_info("Tasks state (memory values in pages):\n"); + pr_info("[ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name\n"); +@@ -436,6 +436,7 @@ static void dump_tasks(struct oom_control *oc) + rcu_read_unlock(); + } + } ++EXPORT_SYMBOL_GPL(dump_tasks); + + static void dump_oom_victim(struct oom_control *oc, struct task_struct *victim) + { diff --git a/mm/percpu.c b/mm/percpu.c --- a/mm/percpu.c +++ b/mm/percpu.c -@@ -2440,6 +2440,7 @@ phys_addr_t per_cpu_ptr_to_phys(void *addr) +@@ -2438,6 +2438,7 @@ phys_addr_t per_cpu_ptr_to_phys(void *addr) return page_to_phys(pcpu_addr_to_page(addr)) + offset_in_page(addr); } diff --git a/android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Managment-related-vendor-hooks.patch b/android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Managment-related-vendor-hooks.patch index 242416b4..10d671e1 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Managment-related-vendor-hooks.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Managment-related-vendor-hooks.patch @@ -159,7 +159,7 @@ diff --git a/mm/util.c b/mm/util.c /** * kfree_const - conditionally free memory * @x: pointer to the memory -@@ -550,6 +554,7 @@ unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr, +@@ -560,6 +564,7 @@ unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr, if (populate) mm_populate(ret, populate); } @@ -170,7 +170,7 @@ diff --git a/mm/util.c b/mm/util.c diff --git a/mm/vmscan.c b/mm/vmscan.c --- a/mm/vmscan.c +++ b/mm/vmscan.c -@@ -71,6 +71,9 @@ +@@ -70,6 +70,9 @@ #define CREATE_TRACE_POINTS #include <trace/events/vmscan.h> @@ -180,7 +180,7 @@ diff --git a/mm/vmscan.c b/mm/vmscan.c struct scan_control { /* How many pages shrink_list() should reclaim */ unsigned long nr_to_reclaim; -@@ -3034,6 +3037,7 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc, +@@ -2333,6 +2336,7 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc, enum scan_balance scan_balance; unsigned long ap, fp; enum lru_list lru; @@ -188,7 +188,7 @@ diff --git a/mm/vmscan.c b/mm/vmscan.c /* If we have no swap space, do not bother scanning anon folios. */ if (!sc->may_swap || !can_reclaim_anon_pages(memcg, pgdat->node_id, sc)) { -@@ -3071,11 +3075,15 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc, +@@ -2370,11 +2374,15 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc, goto out; } diff --git a/android-mainline/NOUPSTREAM-ANDROID-net-xfrm-make-PF_KEY-SHA256-use-RFC-compliant-truncation.patch b/android-mainline/NOUPSTREAM-ANDROID-net-xfrm-make-PF_KEY-SHA256-use-RFC-compliant-truncation.patch index bcdf641f..f768b08f 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-net-xfrm-make-PF_KEY-SHA256-use-RFC-compliant-truncation.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-net-xfrm-make-PF_KEY-SHA256-use-RFC-compliant-truncation.patch @@ -35,7 +35,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c -@@ -237,7 +237,7 @@ static struct xfrm_algo_desc aalg_list[] = { +@@ -238,7 +238,7 @@ static struct xfrm_algo_desc aalg_list[] = { .uinfo = { .auth = { diff --git a/android-mainline/NOUPSTREAM-ANDROID-sched-Track-wake_q-length.patch b/android-mainline/NOUPSTREAM-ANDROID-sched-Track-wake_q-length.patch index bf2cab67..3346c057 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-sched-Track-wake_q-length.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-sched-Track-wake_q-length.patch @@ -31,7 +31,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/include/linux/sched.h b/include/linux/sched.h --- a/include/linux/sched.h +++ b/include/linux/sched.h -@@ -1140,6 +1140,7 @@ struct task_struct { +@@ -1139,6 +1139,7 @@ struct task_struct { raw_spinlock_t pi_lock; struct wake_q_node wake_q; diff --git a/android-mainline/NOUPSTREAM-ANDROID-sched-Unconditionally-honor-sync-flag-for-energy-aware-wakeups.patch b/android-mainline/NOUPSTREAM-ANDROID-sched-Unconditionally-honor-sync-flag-for-energy-aware-wakeups.patch index 62bd2612..288af276 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-sched-Unconditionally-honor-sync-flag-for-energy-aware-wakeups.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-sched-Unconditionally-honor-sync-flag-for-energy-aware-wakeups.patch @@ -31,7 +31,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c -@@ -7785,7 +7785,7 @@ compute_energy(struct energy_env *eenv, struct perf_domain *pd, +@@ -7890,7 +7890,7 @@ compute_energy(struct energy_env *eenv, struct perf_domain *pd, * other use-cases too. So, until someone finds a better way to solve this, * let's keep things simple by re-using the existing slow path. */ @@ -40,7 +40,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c { struct cpumask *cpus = this_cpu_cpumask_var_ptr(select_rq_mask); unsigned long prev_delta = ULONG_MAX, best_delta = ULONG_MAX; -@@ -7805,6 +7805,14 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) +@@ -7910,6 +7910,14 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) if (!pd || READ_ONCE(rd->overutilized)) goto unlock; @@ -55,7 +55,7 @@ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c /* * Energy-aware wake-up happens on the lowest sched_domain starting * from sd_asym_cpucapacity spanning over this_cpu and prev_cpu. -@@ -8006,7 +8014,7 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int wake_flags) +@@ -8111,7 +8119,7 @@ select_task_rq_fair(struct task_struct *p, int prev_cpu, int wake_flags) return cpu; if (sched_energy_enabled()) { diff --git a/android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-UFS-Exports.patch b/android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-UFS-Exports.patch index 0c02b275..1a3cbb31 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-UFS-Exports.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-UFS-Exports.patch @@ -28,7 +28,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c -@@ -3205,7 +3205,7 @@ static inline void ufshcd_init_query(struct ufs_hba *hba, +@@ -3301,7 +3301,7 @@ static inline void ufshcd_init_query(struct ufs_hba *hba, (*request)->upiu_req.selector = selector; } @@ -37,7 +37,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c enum query_opcode opcode, enum flag_idn idn, u8 index, bool *flag_res) { int ret; -@@ -3227,6 +3227,7 @@ static int ufshcd_query_flag_retry(struct ufs_hba *hba, +@@ -3323,6 +3323,7 @@ static int ufshcd_query_flag_retry(struct ufs_hba *hba, __func__, opcode, idn, ret, retries); return ret; } @@ -45,7 +45,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c /** * ufshcd_query_flag() - API function for sending flag query requests -@@ -3295,6 +3296,7 @@ int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, +@@ -3391,6 +3392,7 @@ int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, ufshcd_release(hba); return err; } @@ -53,7 +53,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c /** * ufshcd_query_attr - API function for sending attribute requests -@@ -3358,6 +3360,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode, +@@ -3454,6 +3456,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode, ufshcd_release(hba); return err; } @@ -61,7 +61,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c /** * ufshcd_query_attr_retry() - API function for sending query -@@ -3395,6 +3398,7 @@ int ufshcd_query_attr_retry(struct ufs_hba *hba, +@@ -3491,6 +3494,7 @@ int ufshcd_query_attr_retry(struct ufs_hba *hba, __func__, idn, ret, QUERY_REQ_RETRIES); return ret; } @@ -69,7 +69,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c static int __ufshcd_query_descriptor(struct ufs_hba *hba, enum query_opcode opcode, enum desc_idn idn, u8 index, -@@ -3491,6 +3495,7 @@ int ufshcd_query_descriptor_retry(struct ufs_hba *hba, +@@ -3587,6 +3591,7 @@ int ufshcd_query_descriptor_retry(struct ufs_hba *hba, return err; } @@ -77,7 +77,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c /** * ufshcd_read_desc_param - read the specified descriptor parameter -@@ -3570,6 +3575,7 @@ int ufshcd_read_desc_param(struct ufs_hba *hba, +@@ -3666,6 +3671,7 @@ int ufshcd_read_desc_param(struct ufs_hba *hba, kfree(desc_buf); return ret; } @@ -85,7 +85,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c /** * struct uc_string_id - unicode string -@@ -5786,7 +5792,7 @@ static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status) +@@ -5883,7 +5889,7 @@ static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status) * to know whether auto bkops is enabled or disabled after this function * returns control to it. */ @@ -94,7 +94,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c enum bkops_status status) { int err; -@@ -5811,6 +5817,7 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba, +@@ -5908,6 +5914,7 @@ static int ufshcd_bkops_ctrl(struct ufs_hba *hba, out: return err; } @@ -105,7 +105,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h -@@ -1396,6 +1396,14 @@ int ufshcd_read_desc_param(struct ufs_hba *hba, +@@ -1400,6 +1400,14 @@ int ufshcd_read_desc_param(struct ufs_hba *hba, u8 param_offset, u8 *param_read_buf, u8 param_size); diff --git a/android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-related-vendor-hooks.patch b/android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-related-vendor-hooks.patch index 19a2e5a3..4314bb8b 100644 --- a/android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-related-vendor-hooks.patch +++ b/android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-related-vendor-hooks.patch @@ -49,7 +49,7 @@ diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c -@@ -40,6 +40,9 @@ +@@ -41,6 +41,9 @@ #define CREATE_TRACE_POINTS #include <trace/events/ufs.h> @@ -59,7 +59,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c #define UFSHCD_ENABLE_INTRS (UTP_TRANSFER_REQ_COMPL |\ UTP_TASK_REQ_COMPL |\ UFSHCD_ERROR_MASK) -@@ -363,6 +366,8 @@ static void ufshcd_add_tm_upiu_trace(struct ufs_hba *hba, unsigned int tag, +@@ -364,6 +367,8 @@ static void ufshcd_add_tm_upiu_trace(struct ufs_hba *hba, unsigned int tag, { struct utp_task_req_desc *descp = &hba->utmrdl_base_addr[tag]; @@ -68,7 +68,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c if (!trace_ufshcd_upiu_enabled()) return; -@@ -384,6 +389,8 @@ static void ufshcd_add_uic_command_trace(struct ufs_hba *hba, +@@ -385,6 +390,8 @@ static void ufshcd_add_uic_command_trace(struct ufs_hba *hba, { u32 cmd; @@ -77,15 +77,15 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c if (!trace_ufshcd_uic_command_enabled()) return; -@@ -2164,6 +2171,7 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag, +@@ -2265,6 +2272,7 @@ void ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag, lrbp->issue_time_stamp_local_clock = local_clock(); lrbp->compl_time_stamp = ktime_set(0, 0); lrbp->compl_time_stamp_local_clock = 0; + trace_android_vh_ufs_send_command(hba, lrbp); ufshcd_add_command_trace(hba, task_tag, UFS_CMD_SEND); - ufshcd_clk_scaling_start_busy(hba); - if (unlikely(ufshcd_should_inform_monitor(hba, lrbp))) -@@ -2498,13 +2506,16 @@ static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) + if (lrbp->cmd) + ufshcd_clk_scaling_start_busy(hba); +@@ -2600,13 +2608,16 @@ static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) { struct scsi_cmnd *cmd = lrbp->cmd; int sg_segments = scsi_dma_map(cmd); @@ -103,7 +103,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c } /** -@@ -2880,6 +2891,14 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) +@@ -2976,6 +2987,14 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) ufshcd_prepare_lrbp_crypto(scsi_cmd_to_rq(cmd), lrbp); @@ -118,7 +118,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c lrbp->req_abort_skip = false; ufshcd_comp_scsi_upiu(hba, lrbp); -@@ -5391,6 +5410,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, +@@ -5489,6 +5508,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, lrbp->compl_time_stamp = ktime_get(); cmd = lrbp->cmd; if (cmd) { @@ -126,7 +126,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c if (unlikely(ufshcd_should_inform_monitor(hba, lrbp))) ufshcd_update_monitor(hba, lrbp); ufshcd_add_command_trace(hba, task_tag, UFS_CMD_COMP); -@@ -5401,6 +5421,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, +@@ -5499,6 +5519,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag, } else if (lrbp->command_type == UTP_CMD_TYPE_DEV_MANAGE || lrbp->command_type == UTP_CMD_TYPE_UFS_STORAGE) { if (hba->dev_cmd.complete) { @@ -134,7 +134,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c if (cqe) { ocs = le32_to_cpu(cqe->status) & MASK_OCS; lrbp->utr_descriptor_ptr->header.ocs = ocs; -@@ -6698,6 +6719,8 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba, u32 intr_status) +@@ -6808,6 +6829,8 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba, u32 intr_status) queue_eh_work = true; } @@ -143,7 +143,7 @@ diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c if (queue_eh_work) { /* * update the transfer error masks to sticky bits, let's do this -@@ -10440,7 +10463,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) +@@ -10571,7 +10594,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) ufshcd_set_ufs_dev_active(hba); async_schedule(ufshcd_async_scan, hba); diff --git a/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-configfs-Add-Uevent-to-notify-userspace.patch b/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-configfs-Add-Uevent-to-notify-userspace.patch deleted file mode 100644 index d55b3400..00000000 --- a/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-configfs-Add-Uevent-to-notify-userspace.patch +++ /dev/null @@ -1,424 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Badhri Jagan Sridharan <Badhri@google.com> -Date: Mon, 15 Dec 2014 10:44:47 -0800 -Subject: NOUPSTREAM: ANDROID: usb: gadget: configfs: Add Uevent to notify - userspace - -Android userspace UsbDeviceManager relies on the -uevents generated by the composition driver to -generate user notifications. This CL adds uevents -to be generated whenever USB changes its state -i.e. connected, disconnected, configured. - -This CL also intercepts the setup requests from -the usb_core anb routes it to the specific -usb function if required. - -[CPNOTE: 19/07/21] Lee: Should be re-written to use upstream APIs - pinged Badhri - -Bug: 68755607 -Bug: 120441124 -Change-Id: Ib3d3a78255a532f7449dac286f776c2966caf8c1 -[badhri: Migrate to using udc uevents from upstream sysfs.] -Signed-off-by: Badhri Jagan Sridharan <badhri@google.com> -[AmitP: Folded following android-4.9 commit changes into this patch - 9214c899f730 ("ANDROID: usb: gadget: configfs: handle gadget reset request for android")] -Signed-off-by: Amit Pundir <amit.pundir@linaro.org> -[adelva: Folded change 5c899c9fd75d ("ANDROID: usb: gadget: configfs: - fix null ptr in android_disconnect") into this patch] -Signed-off-by: Alistair Delva <adelva@google.com> -[maennich: Folded change 43e98b082f9e ("ANDROID: usb: gadget: configfs: - fix compiler warning") into this patch] -Signed-off-by: Matthias Maennich <maennich@google.com> -Signed-off-by: Lee Jones <joneslee@google.com> ---- - drivers/usb/gadget/Kconfig | 8 ++ - drivers/usb/gadget/configfs.c | 252 +++++++++++++++++++++++++++++++++- - include/linux/usb/composite.h | 1 + - 3 files changed, 259 insertions(+), 2 deletions(-) - -diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig ---- a/drivers/usb/gadget/Kconfig -+++ b/drivers/usb/gadget/Kconfig -@@ -234,6 +234,14 @@ config USB_CONFIGFS - appropriate symbolic links. - For more information see Documentation/usb/gadget_configfs.rst. - -+config USB_CONFIGFS_UEVENT -+ bool "Uevent notification of Gadget state" -+ depends on USB_CONFIGFS -+ help -+ Enable uevent notifications to userspace when the gadget -+ state changes. The gadget can be in any of the following -+ three states: "CONNECTED/DISCONNECTED/CONFIGURED" -+ - config USB_CONFIGFS_SERIAL - bool "Generic serial bulk in/out" - depends on USB_CONFIGFS -diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c ---- a/drivers/usb/gadget/configfs.c -+++ b/drivers/usb/gadget/configfs.c -@@ -12,6 +12,32 @@ - #include "u_f.h" - #include "u_os_desc.h" - -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+#include <linux/platform_device.h> -+#include <linux/kdev_t.h> -+#include <linux/usb/ch9.h> -+ -+#ifdef CONFIG_USB_CONFIGFS_F_ACC -+extern int acc_ctrlrequest(struct usb_composite_dev *cdev, -+ const struct usb_ctrlrequest *ctrl); -+void acc_disconnect(void); -+#endif -+static struct class *android_class; -+static struct device *android_device; -+static int index; -+static int gadget_index; -+ -+struct device *create_function_device(char *name) -+{ -+ if (android_device && !IS_ERR(android_device)) -+ return device_create(android_class, android_device, -+ MKDEV(0, index++), NULL, name); -+ else -+ return ERR_PTR(-EINVAL); -+} -+EXPORT_SYMBOL_GPL(create_function_device); -+#endif -+ - int check_user_usb_string(const char *name, - struct usb_gadget_strings *stringtab_dev) - { -@@ -59,6 +85,12 @@ struct gadget_info { - - spinlock_t spinlock; - bool unbind; -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+ bool connected; -+ bool sw_connected; -+ struct work_struct work; -+ struct device *dev; -+#endif - }; - - static inline struct gadget_info *to_gadget_info(struct config_item *item) -@@ -283,7 +315,7 @@ static ssize_t gadget_dev_desc_UDC_store(struct config_item *item, - - mutex_lock(&gi->lock); - -- if (!strlen(name)) { -+ if (!strlen(name) || strcmp(name, "none") == 0) { - ret = unregister_gadget(gi); - if (ret) - goto err; -@@ -1812,6 +1844,57 @@ static int configfs_composite_bind(struct usb_gadget *gadget, - return ret; - } - -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+static void android_work(struct work_struct *data) -+{ -+ struct gadget_info *gi = container_of(data, struct gadget_info, work); -+ struct usb_composite_dev *cdev = &gi->cdev; -+ char *disconnected[2] = { "USB_STATE=DISCONNECTED", NULL }; -+ char *connected[2] = { "USB_STATE=CONNECTED", NULL }; -+ char *configured[2] = { "USB_STATE=CONFIGURED", NULL }; -+ /* 0-connected 1-configured 2-disconnected*/ -+ bool status[3] = { false, false, false }; -+ unsigned long flags; -+ bool uevent_sent = false; -+ -+ spin_lock_irqsave(&cdev->lock, flags); -+ if (cdev->config) -+ status[1] = true; -+ -+ if (gi->connected != gi->sw_connected) { -+ if (gi->connected) -+ status[0] = true; -+ else -+ status[2] = true; -+ gi->sw_connected = gi->connected; -+ } -+ spin_unlock_irqrestore(&cdev->lock, flags); -+ -+ if (status[0]) { -+ kobject_uevent_env(&gi->dev->kobj, KOBJ_CHANGE, connected); -+ pr_info("%s: sent uevent %s\n", __func__, connected[0]); -+ uevent_sent = true; -+ } -+ -+ if (status[1]) { -+ kobject_uevent_env(&gi->dev->kobj, KOBJ_CHANGE, configured); -+ pr_info("%s: sent uevent %s\n", __func__, configured[0]); -+ uevent_sent = true; -+ } -+ -+ if (status[2]) { -+ kobject_uevent_env(&gi->dev->kobj, KOBJ_CHANGE, disconnected); -+ pr_info("%s: sent uevent %s\n", __func__, disconnected[0]); -+ uevent_sent = true; -+ } -+ -+ if (!uevent_sent) { -+ pr_info("%s: did not send uevent (%d %d %p)\n", __func__, -+ gi->connected, gi->sw_connected, cdev->config); -+ } -+} -+#endif -+ - static void configfs_composite_unbind(struct usb_gadget *gadget) - { - struct usb_composite_dev *cdev; -@@ -1839,6 +1922,50 @@ static void configfs_composite_unbind(struct usb_gadget *gadget) - spin_unlock_irqrestore(&gi->spinlock, flags); - } - -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+static int android_setup(struct usb_gadget *gadget, -+ const struct usb_ctrlrequest *c) -+{ -+ struct usb_composite_dev *cdev = get_gadget_data(gadget); -+ unsigned long flags; -+ struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev); -+ int value = -EOPNOTSUPP; -+ struct usb_function_instance *fi; -+ -+ spin_lock_irqsave(&cdev->lock, flags); -+ if (!gi->connected) { -+ gi->connected = 1; -+ schedule_work(&gi->work); -+ } -+ spin_unlock_irqrestore(&cdev->lock, flags); -+ list_for_each_entry(fi, &gi->available_func, cfs_list) { -+ if (fi != NULL && fi->f != NULL && fi->f->setup != NULL) { -+ value = fi->f->setup(fi->f, c); -+ if (value >= 0) -+ break; -+ } -+ } -+ -+#ifdef CONFIG_USB_CONFIGFS_F_ACC -+ if (value < 0) -+ value = acc_ctrlrequest(cdev, c); -+#endif -+ -+ if (value < 0) -+ value = composite_setup(gadget, c); -+ -+ spin_lock_irqsave(&cdev->lock, flags); -+ if (c->bRequest == USB_REQ_SET_CONFIGURATION && -+ cdev->config) { -+ schedule_work(&gi->work); -+ } -+ spin_unlock_irqrestore(&cdev->lock, flags); -+ -+ return value; -+} -+ -+#else // CONFIG_USB_CONFIGFS_UEVENT -+ - static int configfs_composite_setup(struct usb_gadget *gadget, - const struct usb_ctrlrequest *ctrl) - { -@@ -1864,6 +1991,8 @@ static int configfs_composite_setup(struct usb_gadget *gadget, - return ret; - } - -+#endif // CONFIG_USB_CONFIGFS_UEVENT -+ - static void configfs_composite_disconnect(struct usb_gadget *gadget) - { - struct usb_composite_dev *cdev; -@@ -1874,6 +2003,14 @@ static void configfs_composite_disconnect(struct usb_gadget *gadget) - if (!cdev) - return; - -+#ifdef CONFIG_USB_CONFIGFS_F_ACC -+ /* -+ * accessory HID support can be active while the -+ * accessory function is not actually enabled, -+ * so we need to inform it when we are disconnected. -+ */ -+ acc_disconnect(); -+#endif - gi = container_of(cdev, struct gadget_info, cdev); - spin_lock_irqsave(&gi->spinlock, flags); - cdev = get_gadget_data(gadget); -@@ -1882,6 +2019,10 @@ static void configfs_composite_disconnect(struct usb_gadget *gadget) - return; - } - -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+ gi->connected = 0; -+ schedule_work(&gi->work); -+#endif - composite_disconnect(gadget); - spin_unlock_irqrestore(&gi->spinlock, flags); - } -@@ -1956,10 +2097,13 @@ static const struct usb_gadget_driver configfs_driver_template = { - .bind = configfs_composite_bind, - .unbind = configfs_composite_unbind, - -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+ .setup = android_setup, -+#else - .setup = configfs_composite_setup, -+#endif - .reset = configfs_composite_reset, - .disconnect = configfs_composite_disconnect, -- - .suspend = configfs_composite_suspend, - .resume = configfs_composite_resume, - -@@ -1970,6 +2114,91 @@ static const struct usb_gadget_driver configfs_driver_template = { - .match_existing_only = 1, - }; - -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+static ssize_t state_show(struct device *pdev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct gadget_info *dev = dev_get_drvdata(pdev); -+ struct usb_composite_dev *cdev; -+ char *state = "DISCONNECTED"; -+ unsigned long flags; -+ -+ if (!dev) -+ goto out; -+ -+ cdev = &dev->cdev; -+ -+ if (!cdev) -+ goto out; -+ -+ spin_lock_irqsave(&cdev->lock, flags); -+ if (cdev->config) -+ state = "CONFIGURED"; -+ else if (dev->connected) -+ state = "CONNECTED"; -+ spin_unlock_irqrestore(&cdev->lock, flags); -+out: -+ return sprintf(buf, "%s\n", state); -+} -+ -+static DEVICE_ATTR(state, S_IRUGO, state_show, NULL); -+ -+static struct device_attribute *android_usb_attributes[] = { -+ &dev_attr_state, -+ NULL -+}; -+ -+static int android_device_create(struct gadget_info *gi) -+{ -+ struct device_attribute **attrs; -+ struct device_attribute *attr; -+ -+ INIT_WORK(&gi->work, android_work); -+ gi->dev = device_create(android_class, NULL, -+ MKDEV(0, 0), NULL, "android%d", gadget_index++); -+ if (IS_ERR(gi->dev)) -+ return PTR_ERR(gi->dev); -+ -+ dev_set_drvdata(gi->dev, gi); -+ if (!android_device) -+ android_device = gi->dev; -+ -+ attrs = android_usb_attributes; -+ while ((attr = *attrs++)) { -+ int err; -+ -+ err = device_create_file(gi->dev, attr); -+ if (err) { -+ device_destroy(gi->dev->class, -+ gi->dev->devt); -+ return err; -+ } -+ } -+ -+ return 0; -+} -+ -+static void android_device_destroy(struct gadget_info *gi) -+{ -+ struct device_attribute **attrs; -+ struct device_attribute *attr; -+ -+ attrs = android_usb_attributes; -+ while ((attr = *attrs++)) -+ device_remove_file(gi->dev, attr); -+ device_destroy(gi->dev->class, gi->dev->devt); -+} -+#else -+static inline int android_device_create(struct gadget_info *gi) -+{ -+ return 0; -+} -+ -+static inline void android_device_destroy(struct gadget_info *gi) -+{ -+} -+#endif -+ - static struct config_group *gadgets_make( - struct config_group *group, - const char *name) -@@ -2031,6 +2260,9 @@ static struct config_group *gadgets_make( - if (!gi->composite.gadget_driver.function) - goto out_free_driver_name; - -+ if (android_device_create(gi) < 0) -+ goto out_free_driver_name; -+ - return &gi->group; - - out_free_driver_name: -@@ -2042,7 +2274,11 @@ static struct config_group *gadgets_make( - - static void gadgets_drop(struct config_group *group, struct config_item *item) - { -+ struct gadget_info *gi; -+ -+ gi = container_of(to_config_group(item), struct gadget_info, group); - config_item_put(item); -+ android_device_destroy(gi); - } - - static struct configfs_group_operations gadgets_ops = { -@@ -2082,6 +2318,13 @@ static int __init gadget_cfs_init(void) - config_group_init(&gadget_subsys.su_group); - - ret = configfs_register_subsystem(&gadget_subsys); -+ -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+ android_class = class_create("android_usb"); -+ if (IS_ERR(android_class)) -+ return PTR_ERR(android_class); -+#endif -+ - return ret; - } - module_init(gadget_cfs_init); -@@ -2089,5 +2332,10 @@ module_init(gadget_cfs_init); - static void __exit gadget_cfs_exit(void) - { - configfs_unregister_subsystem(&gadget_subsys); -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+ if (!IS_ERR(android_class)) -+ class_destroy(android_class); -+#endif -+ - } - module_exit(gadget_cfs_exit); -diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h ---- a/include/linux/usb/composite.h -+++ b/include/linux/usb/composite.h -@@ -575,6 +575,7 @@ struct usb_function_instance { - struct config_group group; - struct list_head cfs_list; - struct usb_function_driver *fd; -+ struct usb_function *f; - int (*set_inst_name)(struct usb_function_instance *inst, - const char *name); - void (*free_func_inst)(struct usb_function_instance *inst); diff --git a/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_accessory-Add-Android-Accessory-function.patch b/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_accessory-Add-Android-Accessory-function.patch deleted file mode 100644 index 7fa8b603..00000000 --- a/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_accessory-Add-Android-Accessory-function.patch +++ /dev/null @@ -1,1877 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Benoit Goby <benoit@android.com> -Date: Mon, 19 Dec 2011 14:39:37 -0800 -Subject: NOUPSTREAM: ANDROID: usb: gadget: f_accessory: Add Android Accessory - function - -USB accessory mode allows users to connect USB host hardware -specifically designed for Android-powered devices. The accessories -must adhere to the Android accessory protocol outlined in the -http://accessories.android.com documentation. This allows -Android devices that cannot act as a USB host to still interact with -USB hardware. When an Android device is in USB accessory mode, the -attached Android USB accessory acts as the host, provides power -to the USB bus, and enumerates connected devices. - -[CPNOTE: 19/07/21] Lee: Should be re-written to use upstream APIs - pinged Badhri - -Bug: 63740241 -Bug: 120441124 -Bug: 223101878 -Change-Id: I67964b50d278f3c0471d47efbb7b0973a3502681 -[badhri: f_accessory is being migrated to userspace.] -Signed-off-by: Mike Lockwood <lockwood@android.com> -[AmitP: Folded following android-4.9 commit changes into this patch - ceb2f0aac624 ("ANDROID: usb: gadget: accessory: Fix section mismatch") - Parts of e27543931009 ("ANDROID: usb: gadget: Fixes and hacks to make android usb gadget compile on 3.8") - 1b07ec751563 ("ANDROID: drivers: usb: gadget: 64-bit related type fixes")] -Signed-off-by: Amit Pundir <amit.pundir@linaro.org> -[adelva: Folded the following changes into this patch: - 9d5891d516e2 ("ANDROID: usb: gadget: f_accessory: Add ACCESSORY_SET_AUDIO_MODE control request and ioctl") - dc66cfce9622 ("ANDROID: usb: gadget: f_accessory: Add support for HID input devices") - 5f1ac9c2871b ("ANDROID: usb: gadget: f_accessory: move userspace interface to uapi") - 9a6241722cd8 ("ANDROID: usb: gadget: f_accessory: Enabled Zero Length Packet (ZLP) for acc_write") - 31a0ecd5a825 ("ANDROID: usb: gadget: f_accessory: check for accessory device before disconnecting HIDs") - 580721fa6cbc ("ANDROID: usb: gadget: f_accessory: Migrate to USB_FUNCTION API") - 7f407172fb28 ("ANDROID: usb: gadget: f_accessory: Fix for UsbAccessory clean unbind.") - ebc98ac5a22f ("ANDROID: usb: gadget: f_accessory: fix false disconnect due to a signal sent to the reading process") - 71c6dc5ffdab ("ANDROID: usb: gadget: f_accessory: assign no-op request complete callbacks") - 675047ee68e9 ("ANDROID: usb: gadget: f_accessory: Move gadget functions code") - b2bedaa5c7df ("CHROMIUM: usb: gadget: f_accessory: add .raw_request callback")] -Signed-off-by: Alistair Delva <adelva@google.com> -[maennich: Folded the following patch in this patch: - f4f6f40ebc62 ("ANDROID: usb: gadget: Fix dependency for f_accessory")] -Signed-off-by: Matthias Maennich <maennich@google.com> -[ebiggers: Folded in the following commit: - fd734b5e295a ("ANDROID: USB: f_accessory: Check dev pointer before decoding ctrl request")] -Signed-off-by: Eric Biggers <ebiggers@google.com> - ANDROID: usb: gadget: f_accessory: add compat_ioctl support -Signed-off-by: Lee Jones <joneslee@google.com> ---- - drivers/usb/gadget/Kconfig | 11 + - drivers/usb/gadget/configfs.c | 4 +- - drivers/usb/gadget/function/Makefile | 2 + - drivers/usb/gadget/function/f_accessory.c | 1574 +++++++++++++++++++++ - include/linux/usb/f_accessory.h | 23 + - include/uapi/linux/usb/f_accessory.h | 146 ++ - 6 files changed, 1758 insertions(+), 2 deletions(-) - create mode 100644 drivers/usb/gadget/function/f_accessory.c - create mode 100644 include/linux/usb/f_accessory.h - create mode 100644 include/uapi/linux/usb/f_accessory.h - -diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig ---- a/drivers/usb/gadget/Kconfig -+++ b/drivers/usb/gadget/Kconfig -@@ -220,6 +220,9 @@ config USB_F_PRINTER - config USB_F_TCM - tristate - -+config USB_F_ACC -+ tristate -+ - # this first set of drivers all depend on bulk-capable hardware. - - config USB_CONFIGFS -@@ -383,6 +386,14 @@ config USB_CONFIGFS_F_FS - implemented in kernel space (for instance Ethernet, serial or - mass storage) and other are implemented in user space. - -+config USB_CONFIGFS_F_ACC -+ bool "Accessory gadget" -+ depends on USB_CONFIGFS -+ depends on HID=y -+ select USB_F_ACC -+ help -+ USB gadget Accessory support -+ - config USB_CONFIGFS_F_UAC1 - bool "Audio Class 1.0" - depends on USB_CONFIGFS -diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c ---- a/drivers/usb/gadget/configfs.c -+++ b/drivers/usb/gadget/configfs.c -@@ -18,7 +18,7 @@ - #include <linux/usb/ch9.h> - - #ifdef CONFIG_USB_CONFIGFS_F_ACC --extern int acc_ctrlrequest(struct usb_composite_dev *cdev, -+extern int acc_ctrlrequest_composite(struct usb_composite_dev *cdev, - const struct usb_ctrlrequest *ctrl); - void acc_disconnect(void); - #endif -@@ -1948,7 +1948,7 @@ static int android_setup(struct usb_gadget *gadget, - - #ifdef CONFIG_USB_CONFIGFS_F_ACC - if (value < 0) -- value = acc_ctrlrequest(cdev, c); -+ value = acc_ctrlrequest_composite(cdev, c); - #endif - - if (value < 0) -diff --git a/drivers/usb/gadget/function/Makefile b/drivers/usb/gadget/function/Makefile ---- a/drivers/usb/gadget/function/Makefile -+++ b/drivers/usb/gadget/function/Makefile -@@ -52,3 +52,5 @@ usb_f_printer-y := f_printer.o - obj-$(CONFIG_USB_F_PRINTER) += usb_f_printer.o - usb_f_tcm-y := f_tcm.o - obj-$(CONFIG_USB_F_TCM) += usb_f_tcm.o -+usb_f_accessory-y := f_accessory.o -+obj-$(CONFIG_USB_F_ACC) += usb_f_accessory.o -diff --git a/drivers/usb/gadget/function/f_accessory.c b/drivers/usb/gadget/function/f_accessory.c -new file mode 100644 ---- /dev/null -+++ b/drivers/usb/gadget/function/f_accessory.c -@@ -0,0 +1,1574 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Gadget Function Driver for Android USB accessories -+ * -+ * Copyright (C) 2011 Google, Inc. -+ * Author: Mike Lockwood <lockwood@android.com> -+ * -+ * This software is licensed under the terms of the GNU General Public -+ * License version 2, as published by the Free Software Foundation, and -+ * may be copied, distributed, and modified under those terms. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+/* #define DEBUG */ -+/* #define VERBOSE_DEBUG */ -+ -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/poll.h> -+#include <linux/delay.h> -+#include <linux/wait.h> -+#include <linux/err.h> -+#include <linux/interrupt.h> -+#include <linux/kthread.h> -+#include <linux/freezer.h> -+#include <linux/kref.h> -+#include <linux/kernel.h> -+ -+#include <linux/types.h> -+#include <linux/file.h> -+#include <linux/device.h> -+#include <linux/miscdevice.h> -+ -+#include <linux/hid.h> -+#include <linux/hiddev.h> -+#include <linux/usb.h> -+#include <linux/usb/ch9.h> -+#include <linux/usb/f_accessory.h> -+ -+#include <linux/configfs.h> -+#include <linux/usb/composite.h> -+ -+#define MAX_INST_NAME_LEN 40 -+#define BULK_BUFFER_SIZE 16384 -+#define ACC_STRING_SIZE 256 -+ -+#define PROTOCOL_VERSION 2 -+ -+/* String IDs */ -+#define INTERFACE_STRING_INDEX 0 -+ -+/* number of tx and rx requests to allocate */ -+#define TX_REQ_MAX 4 -+#define RX_REQ_MAX 2 -+ -+struct acc_hid_dev { -+ struct list_head list; -+ struct hid_device *hid; -+ struct acc_dev *dev; -+ /* accessory defined ID */ -+ int id; -+ /* HID report descriptor */ -+ u8 *report_desc; -+ /* length of HID report descriptor */ -+ int report_desc_len; -+ /* number of bytes of report_desc we have received so far */ -+ int report_desc_offset; -+}; -+ -+struct acc_dev { -+ struct usb_function function; -+ struct usb_composite_dev *cdev; -+ spinlock_t lock; -+ struct acc_dev_ref *ref; -+ -+ struct usb_ep *ep_in; -+ struct usb_ep *ep_out; -+ -+ /* online indicates state of function_set_alt & function_unbind -+ * set to 1 when we connect -+ */ -+ int online; -+ -+ /* disconnected indicates state of open & release -+ * Set to 1 when we disconnect. -+ * Not cleared until our file is closed. -+ */ -+ int disconnected; -+ -+ /* strings sent by the host */ -+ char manufacturer[ACC_STRING_SIZE]; -+ char model[ACC_STRING_SIZE]; -+ char description[ACC_STRING_SIZE]; -+ char version[ACC_STRING_SIZE]; -+ char uri[ACC_STRING_SIZE]; -+ char serial[ACC_STRING_SIZE]; -+ -+ /* for acc_complete_set_string */ -+ int string_index; -+ -+ /* set to 1 if we have a pending start request */ -+ int start_requested; -+ -+ int audio_mode; -+ -+ /* synchronize access to our device file */ -+ atomic_t open_excl; -+ -+ struct list_head tx_idle; -+ -+ wait_queue_head_t read_wq; -+ wait_queue_head_t write_wq; -+ struct usb_request *rx_req[RX_REQ_MAX]; -+ int rx_done; -+ -+ /* delayed work for handling ACCESSORY_START */ -+ struct delayed_work start_work; -+ -+ /* work for handling ACCESSORY GET PROTOCOL */ -+ struct work_struct getprotocol_work; -+ -+ /* work for handling ACCESSORY SEND STRING */ -+ struct work_struct sendstring_work; -+ -+ /* worker for registering and unregistering hid devices */ -+ struct work_struct hid_work; -+ -+ /* list of active HID devices */ -+ struct list_head hid_list; -+ -+ /* list of new HID devices to register */ -+ struct list_head new_hid_list; -+ -+ /* list of dead HID devices to unregister */ -+ struct list_head dead_hid_list; -+}; -+ -+static struct usb_interface_descriptor acc_interface_desc = { -+ .bLength = USB_DT_INTERFACE_SIZE, -+ .bDescriptorType = USB_DT_INTERFACE, -+ .bInterfaceNumber = 0, -+ .bNumEndpoints = 2, -+ .bInterfaceClass = USB_CLASS_VENDOR_SPEC, -+ .bInterfaceSubClass = USB_SUBCLASS_VENDOR_SPEC, -+ .bInterfaceProtocol = 0, -+}; -+ -+static struct usb_endpoint_descriptor acc_superspeedplus_in_desc = { -+ .bLength = USB_DT_ENDPOINT_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_IN, -+ .bmAttributes = USB_ENDPOINT_XFER_BULK, -+ .wMaxPacketSize = cpu_to_le16(1024), -+}; -+ -+static struct usb_endpoint_descriptor acc_superspeedplus_out_desc = { -+ .bLength = USB_DT_ENDPOINT_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_OUT, -+ .bmAttributes = USB_ENDPOINT_XFER_BULK, -+ .wMaxPacketSize = cpu_to_le16(1024), -+}; -+ -+static struct usb_ss_ep_comp_descriptor acc_superspeedplus_comp_desc = { -+ .bLength = sizeof(acc_superspeedplus_comp_desc), -+ .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, -+ -+ /* the following 2 values can be tweaked if necessary */ -+ /* .bMaxBurst = 0, */ -+ /* .bmAttributes = 0, */ -+}; -+ -+static struct usb_endpoint_descriptor acc_superspeed_in_desc = { -+ .bLength = USB_DT_ENDPOINT_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_IN, -+ .bmAttributes = USB_ENDPOINT_XFER_BULK, -+ .wMaxPacketSize = cpu_to_le16(1024), -+}; -+ -+static struct usb_endpoint_descriptor acc_superspeed_out_desc = { -+ .bLength = USB_DT_ENDPOINT_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_OUT, -+ .bmAttributes = USB_ENDPOINT_XFER_BULK, -+ .wMaxPacketSize = cpu_to_le16(1024), -+}; -+ -+static struct usb_ss_ep_comp_descriptor acc_superspeed_comp_desc = { -+ .bLength = sizeof(acc_superspeed_comp_desc), -+ .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, -+ -+ /* the following 2 values can be tweaked if necessary */ -+ /* .bMaxBurst = 0, */ -+ /* .bmAttributes = 0, */ -+}; -+ -+static struct usb_endpoint_descriptor acc_highspeed_in_desc = { -+ .bLength = USB_DT_ENDPOINT_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_IN, -+ .bmAttributes = USB_ENDPOINT_XFER_BULK, -+ .wMaxPacketSize = cpu_to_le16(512), -+}; -+ -+static struct usb_endpoint_descriptor acc_highspeed_out_desc = { -+ .bLength = USB_DT_ENDPOINT_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_OUT, -+ .bmAttributes = USB_ENDPOINT_XFER_BULK, -+ .wMaxPacketSize = cpu_to_le16(512), -+}; -+ -+static struct usb_endpoint_descriptor acc_fullspeed_in_desc = { -+ .bLength = USB_DT_ENDPOINT_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_IN, -+ .bmAttributes = USB_ENDPOINT_XFER_BULK, -+}; -+ -+static struct usb_endpoint_descriptor acc_fullspeed_out_desc = { -+ .bLength = USB_DT_ENDPOINT_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_OUT, -+ .bmAttributes = USB_ENDPOINT_XFER_BULK, -+}; -+ -+static struct usb_descriptor_header *fs_acc_descs[] = { -+ (struct usb_descriptor_header *) &acc_interface_desc, -+ (struct usb_descriptor_header *) &acc_fullspeed_in_desc, -+ (struct usb_descriptor_header *) &acc_fullspeed_out_desc, -+ NULL, -+}; -+ -+static struct usb_descriptor_header *hs_acc_descs[] = { -+ (struct usb_descriptor_header *) &acc_interface_desc, -+ (struct usb_descriptor_header *) &acc_highspeed_in_desc, -+ (struct usb_descriptor_header *) &acc_highspeed_out_desc, -+ NULL, -+}; -+ -+static struct usb_descriptor_header *ss_acc_descs[] = { -+ (struct usb_descriptor_header *) &acc_interface_desc, -+ (struct usb_descriptor_header *) &acc_superspeed_in_desc, -+ (struct usb_descriptor_header *) &acc_superspeed_comp_desc, -+ (struct usb_descriptor_header *) &acc_superspeed_out_desc, -+ (struct usb_descriptor_header *) &acc_superspeed_comp_desc, -+ NULL, -+}; -+ -+static struct usb_descriptor_header *ssp_acc_descs[] = { -+ (struct usb_descriptor_header *) &acc_interface_desc, -+ (struct usb_descriptor_header *) &acc_superspeedplus_in_desc, -+ (struct usb_descriptor_header *) &acc_superspeedplus_comp_desc, -+ (struct usb_descriptor_header *) &acc_superspeedplus_out_desc, -+ (struct usb_descriptor_header *) &acc_superspeedplus_comp_desc, -+ NULL, -+}; -+ -+static struct usb_string acc_string_defs[] = { -+ [INTERFACE_STRING_INDEX].s = "Android Accessory Interface", -+ { }, /* end of list */ -+}; -+ -+static struct usb_gadget_strings acc_string_table = { -+ .language = 0x0409, /* en-US */ -+ .strings = acc_string_defs, -+}; -+ -+static struct usb_gadget_strings *acc_strings[] = { -+ &acc_string_table, -+ NULL, -+}; -+ -+struct acc_dev_ref { -+ struct kref kref; -+ struct acc_dev *acc_dev; -+}; -+ -+static struct acc_dev_ref _acc_dev_ref = { -+ .kref = KREF_INIT(0), -+}; -+ -+struct acc_instance { -+ struct usb_function_instance func_inst; -+ const char *name; -+}; -+ -+static struct acc_dev *get_acc_dev(void) -+{ -+ struct acc_dev_ref *ref = &_acc_dev_ref; -+ -+ return kref_get_unless_zero(&ref->kref) ? ref->acc_dev : NULL; -+} -+ -+static void __put_acc_dev(struct kref *kref) -+{ -+ struct acc_dev_ref *ref = container_of(kref, struct acc_dev_ref, kref); -+ struct acc_dev *dev = ref->acc_dev; -+ -+ /* Cancel any async work */ -+ cancel_delayed_work_sync(&dev->start_work); -+ cancel_work_sync(&dev->getprotocol_work); -+ cancel_work_sync(&dev->sendstring_work); -+ cancel_work_sync(&dev->hid_work); -+ -+ ref->acc_dev = NULL; -+ kfree(dev); -+} -+ -+static void put_acc_dev(struct acc_dev *dev) -+{ -+ struct acc_dev_ref *ref = dev->ref; -+ -+ WARN_ON(ref->acc_dev != dev); -+ kref_put(&ref->kref, __put_acc_dev); -+} -+ -+static inline struct acc_dev *func_to_dev(struct usb_function *f) -+{ -+ return container_of(f, struct acc_dev, function); -+} -+ -+static struct usb_request *acc_request_new(struct usb_ep *ep, int buffer_size) -+{ -+ struct usb_request *req = usb_ep_alloc_request(ep, GFP_KERNEL); -+ -+ if (!req) -+ return NULL; -+ -+ /* now allocate buffers for the requests */ -+ req->buf = kmalloc(buffer_size, GFP_KERNEL); -+ if (!req->buf) { -+ usb_ep_free_request(ep, req); -+ return NULL; -+ } -+ -+ return req; -+} -+ -+static void acc_request_free(struct usb_request *req, struct usb_ep *ep) -+{ -+ if (req) { -+ kfree(req->buf); -+ usb_ep_free_request(ep, req); -+ } -+} -+ -+/* add a request to the tail of a list */ -+static void req_put(struct acc_dev *dev, struct list_head *head, -+ struct usb_request *req) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&dev->lock, flags); -+ list_add_tail(&req->list, head); -+ spin_unlock_irqrestore(&dev->lock, flags); -+} -+ -+/* remove a request from the head of a list */ -+static struct usb_request *req_get(struct acc_dev *dev, struct list_head *head) -+{ -+ unsigned long flags; -+ struct usb_request *req; -+ -+ spin_lock_irqsave(&dev->lock, flags); -+ if (list_empty(head)) { -+ req = 0; -+ } else { -+ req = list_first_entry(head, struct usb_request, list); -+ list_del(&req->list); -+ } -+ spin_unlock_irqrestore(&dev->lock, flags); -+ return req; -+} -+ -+static void acc_set_disconnected(struct acc_dev *dev) -+{ -+ dev->disconnected = 1; -+} -+ -+static void acc_complete_in(struct usb_ep *ep, struct usb_request *req) -+{ -+ struct acc_dev *dev = get_acc_dev(); -+ -+ if (!dev) -+ return; -+ -+ if (req->status == -ESHUTDOWN) { -+ pr_debug("acc_complete_in set disconnected"); -+ acc_set_disconnected(dev); -+ } -+ -+ req_put(dev, &dev->tx_idle, req); -+ -+ wake_up(&dev->write_wq); -+ put_acc_dev(dev); -+} -+ -+static void acc_complete_out(struct usb_ep *ep, struct usb_request *req) -+{ -+ struct acc_dev *dev = get_acc_dev(); -+ -+ if (!dev) -+ return; -+ -+ dev->rx_done = 1; -+ if (req->status == -ESHUTDOWN) { -+ pr_debug("acc_complete_out set disconnected"); -+ acc_set_disconnected(dev); -+ } -+ -+ wake_up(&dev->read_wq); -+ put_acc_dev(dev); -+} -+ -+static void acc_complete_set_string(struct usb_ep *ep, struct usb_request *req) -+{ -+ struct acc_dev *dev = ep->driver_data; -+ char *string_dest = NULL; -+ int length = req->actual; -+ -+ if (req->status != 0) { -+ pr_err("acc_complete_set_string, err %d\n", req->status); -+ return; -+ } -+ -+ switch (dev->string_index) { -+ case ACCESSORY_STRING_MANUFACTURER: -+ string_dest = dev->manufacturer; -+ break; -+ case ACCESSORY_STRING_MODEL: -+ string_dest = dev->model; -+ break; -+ case ACCESSORY_STRING_DESCRIPTION: -+ string_dest = dev->description; -+ break; -+ case ACCESSORY_STRING_VERSION: -+ string_dest = dev->version; -+ break; -+ case ACCESSORY_STRING_URI: -+ string_dest = dev->uri; -+ break; -+ case ACCESSORY_STRING_SERIAL: -+ string_dest = dev->serial; -+ break; -+ } -+ if (string_dest) { -+ unsigned long flags; -+ -+ if (length >= ACC_STRING_SIZE) -+ length = ACC_STRING_SIZE - 1; -+ -+ spin_lock_irqsave(&dev->lock, flags); -+ memcpy(string_dest, req->buf, length); -+ /* ensure zero termination */ -+ string_dest[length] = 0; -+ spin_unlock_irqrestore(&dev->lock, flags); -+ } else { -+ pr_err("unknown accessory string index %d\n", -+ dev->string_index); -+ } -+} -+ -+static void acc_complete_set_hid_report_desc(struct usb_ep *ep, -+ struct usb_request *req) -+{ -+ struct acc_hid_dev *hid = req->context; -+ struct acc_dev *dev = hid->dev; -+ int length = req->actual; -+ -+ if (req->status != 0) { -+ pr_err("acc_complete_set_hid_report_desc, err %d\n", -+ req->status); -+ return; -+ } -+ -+ memcpy(hid->report_desc + hid->report_desc_offset, req->buf, length); -+ hid->report_desc_offset += length; -+ if (hid->report_desc_offset == hid->report_desc_len) { -+ /* After we have received the entire report descriptor -+ * we schedule work to initialize the HID device -+ */ -+ schedule_work(&dev->hid_work); -+ } -+} -+ -+static void acc_complete_send_hid_event(struct usb_ep *ep, -+ struct usb_request *req) -+{ -+ struct acc_hid_dev *hid = req->context; -+ int length = req->actual; -+ -+ if (req->status != 0) { -+ pr_err("acc_complete_send_hid_event, err %d\n", req->status); -+ return; -+ } -+ -+ hid_report_raw_event(hid->hid, HID_INPUT_REPORT, req->buf, length, 1); -+} -+ -+static int acc_hid_parse(struct hid_device *hid) -+{ -+ struct acc_hid_dev *hdev = hid->driver_data; -+ -+ hid_parse_report(hid, hdev->report_desc, hdev->report_desc_len); -+ return 0; -+} -+ -+static int acc_hid_start(struct hid_device *hid) -+{ -+ return 0; -+} -+ -+static void acc_hid_stop(struct hid_device *hid) -+{ -+} -+ -+static int acc_hid_open(struct hid_device *hid) -+{ -+ return 0; -+} -+ -+static void acc_hid_close(struct hid_device *hid) -+{ -+} -+ -+static int acc_hid_raw_request(struct hid_device *hid, unsigned char reportnum, -+ __u8 *buf, size_t len, unsigned char rtype, int reqtype) -+{ -+ return 0; -+} -+ -+static struct hid_ll_driver acc_hid_ll_driver = { -+ .parse = acc_hid_parse, -+ .start = acc_hid_start, -+ .stop = acc_hid_stop, -+ .open = acc_hid_open, -+ .close = acc_hid_close, -+ .raw_request = acc_hid_raw_request, -+}; -+ -+static struct acc_hid_dev *acc_hid_new(struct acc_dev *dev, -+ int id, int desc_len) -+{ -+ struct acc_hid_dev *hdev; -+ -+ hdev = kzalloc(sizeof(*hdev), GFP_ATOMIC); -+ if (!hdev) -+ return NULL; -+ hdev->report_desc = kzalloc(desc_len, GFP_ATOMIC); -+ if (!hdev->report_desc) { -+ kfree(hdev); -+ return NULL; -+ } -+ hdev->dev = dev; -+ hdev->id = id; -+ hdev->report_desc_len = desc_len; -+ -+ return hdev; -+} -+ -+static struct acc_hid_dev *acc_hid_get(struct list_head *list, int id) -+{ -+ struct acc_hid_dev *hid; -+ -+ list_for_each_entry(hid, list, list) { -+ if (hid->id == id) -+ return hid; -+ } -+ return NULL; -+} -+ -+static int acc_register_hid(struct acc_dev *dev, int id, int desc_length) -+{ -+ struct acc_hid_dev *hid; -+ unsigned long flags; -+ -+ /* report descriptor length must be > 0 */ -+ if (desc_length <= 0) -+ return -EINVAL; -+ -+ spin_lock_irqsave(&dev->lock, flags); -+ /* replace HID if one already exists with this ID */ -+ hid = acc_hid_get(&dev->hid_list, id); -+ if (!hid) -+ hid = acc_hid_get(&dev->new_hid_list, id); -+ if (hid) -+ list_move(&hid->list, &dev->dead_hid_list); -+ -+ hid = acc_hid_new(dev, id, desc_length); -+ if (!hid) { -+ spin_unlock_irqrestore(&dev->lock, flags); -+ return -ENOMEM; -+ } -+ -+ list_add(&hid->list, &dev->new_hid_list); -+ spin_unlock_irqrestore(&dev->lock, flags); -+ -+ /* schedule work to register the HID device */ -+ schedule_work(&dev->hid_work); -+ return 0; -+} -+ -+static int acc_unregister_hid(struct acc_dev *dev, int id) -+{ -+ struct acc_hid_dev *hid; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&dev->lock, flags); -+ hid = acc_hid_get(&dev->hid_list, id); -+ if (!hid) -+ hid = acc_hid_get(&dev->new_hid_list, id); -+ if (!hid) { -+ spin_unlock_irqrestore(&dev->lock, flags); -+ return -EINVAL; -+ } -+ -+ list_move(&hid->list, &dev->dead_hid_list); -+ spin_unlock_irqrestore(&dev->lock, flags); -+ -+ schedule_work(&dev->hid_work); -+ return 0; -+} -+ -+static int create_bulk_endpoints(struct acc_dev *dev, -+ struct usb_endpoint_descriptor *in_desc, -+ struct usb_endpoint_descriptor *out_desc) -+{ -+ struct usb_composite_dev *cdev = dev->cdev; -+ struct usb_request *req; -+ struct usb_ep *ep; -+ int i; -+ -+ DBG(cdev, "create_bulk_endpoints dev: %p\n", dev); -+ -+ ep = usb_ep_autoconfig(cdev->gadget, in_desc); -+ if (!ep) { -+ DBG(cdev, "usb_ep_autoconfig for ep_in failed\n"); -+ return -ENODEV; -+ } -+ DBG(cdev, "usb_ep_autoconfig for ep_in got %s\n", ep->name); -+ ep->driver_data = dev; /* claim the endpoint */ -+ dev->ep_in = ep; -+ -+ ep = usb_ep_autoconfig(cdev->gadget, out_desc); -+ if (!ep) { -+ DBG(cdev, "usb_ep_autoconfig for ep_out failed\n"); -+ return -ENODEV; -+ } -+ DBG(cdev, "usb_ep_autoconfig for ep_out got %s\n", ep->name); -+ ep->driver_data = dev; /* claim the endpoint */ -+ dev->ep_out = ep; -+ -+ /* now allocate requests for our endpoints */ -+ for (i = 0; i < TX_REQ_MAX; i++) { -+ req = acc_request_new(dev->ep_in, BULK_BUFFER_SIZE); -+ if (!req) -+ goto fail; -+ req->complete = acc_complete_in; -+ req_put(dev, &dev->tx_idle, req); -+ } -+ for (i = 0; i < RX_REQ_MAX; i++) { -+ req = acc_request_new(dev->ep_out, BULK_BUFFER_SIZE); -+ if (!req) -+ goto fail; -+ req->complete = acc_complete_out; -+ dev->rx_req[i] = req; -+ } -+ -+ return 0; -+ -+fail: -+ pr_err("acc_bind() could not allocate requests\n"); -+ while ((req = req_get(dev, &dev->tx_idle))) -+ acc_request_free(req, dev->ep_in); -+ for (i = 0; i < RX_REQ_MAX; i++) { -+ acc_request_free(dev->rx_req[i], dev->ep_out); -+ dev->rx_req[i] = NULL; -+ } -+ -+ return -1; -+} -+ -+static ssize_t acc_read(struct file *fp, char __user *buf, -+ size_t count, loff_t *pos) -+{ -+ struct acc_dev *dev = fp->private_data; -+ struct usb_request *req; -+ ssize_t r = count; -+ ssize_t data_length; -+ unsigned xfer; -+ int ret = 0; -+ -+ pr_debug("acc_read(%zu)\n", count); -+ -+ if (dev->disconnected) { -+ pr_debug("acc_read disconnected"); -+ return -ENODEV; -+ } -+ -+ if (count > BULK_BUFFER_SIZE) -+ count = BULK_BUFFER_SIZE; -+ -+ /* we will block until we're online */ -+ pr_debug("acc_read: waiting for online\n"); -+ ret = wait_event_interruptible(dev->read_wq, dev->online); -+ if (ret < 0) { -+ r = ret; -+ goto done; -+ } -+ -+ if (!dev->rx_req[0]) { -+ pr_warn("acc_read: USB request already handled/freed"); -+ r = -EINVAL; -+ goto done; -+ } -+ -+ /* -+ * Calculate the data length by considering termination character. -+ * Then compansite the difference of rounding up to -+ * integer multiple of maxpacket size. -+ */ -+ data_length = count; -+ data_length += dev->ep_out->maxpacket - 1; -+ data_length -= data_length % dev->ep_out->maxpacket; -+ -+ if (dev->rx_done) { -+ // last req cancelled. try to get it. -+ req = dev->rx_req[0]; -+ goto copy_data; -+ } -+ -+requeue_req: -+ /* queue a request */ -+ req = dev->rx_req[0]; -+ req->length = data_length; -+ dev->rx_done = 0; -+ ret = usb_ep_queue(dev->ep_out, req, GFP_KERNEL); -+ if (ret < 0) { -+ r = -EIO; -+ goto done; -+ } else { -+ pr_debug("rx %p queue\n", req); -+ } -+ -+ /* wait for a request to complete */ -+ ret = wait_event_interruptible(dev->read_wq, dev->rx_done); -+ if (ret < 0) { -+ r = ret; -+ ret = usb_ep_dequeue(dev->ep_out, req); -+ if (ret != 0) { -+ // cancel failed. There can be a data already received. -+ // it will be retrieved in the next read. -+ pr_debug("acc_read: cancelling failed %d", ret); -+ } -+ goto done; -+ } -+ -+copy_data: -+ dev->rx_done = 0; -+ if (dev->online) { -+ /* If we got a 0-len packet, throw it back and try again. */ -+ if (req->actual == 0) -+ goto requeue_req; -+ -+ pr_debug("rx %p %u\n", req, req->actual); -+ xfer = (req->actual < count) ? req->actual : count; -+ r = xfer; -+ if (copy_to_user(buf, req->buf, xfer)) -+ r = -EFAULT; -+ } else -+ r = -EIO; -+ -+done: -+ pr_debug("acc_read returning %zd\n", r); -+ return r; -+} -+ -+static ssize_t acc_write(struct file *fp, const char __user *buf, -+ size_t count, loff_t *pos) -+{ -+ struct acc_dev *dev = fp->private_data; -+ struct usb_request *req = 0; -+ ssize_t r = count; -+ unsigned xfer; -+ int ret; -+ -+ pr_debug("acc_write(%zu)\n", count); -+ -+ if (!dev->online || dev->disconnected) { -+ pr_debug("acc_write disconnected or not online"); -+ return -ENODEV; -+ } -+ -+ while (count > 0) { -+ /* get an idle tx request to use */ -+ req = 0; -+ ret = wait_event_interruptible(dev->write_wq, -+ ((req = req_get(dev, &dev->tx_idle)) || !dev->online)); -+ if (!dev->online || dev->disconnected) { -+ pr_debug("acc_write dev->error\n"); -+ r = -EIO; -+ break; -+ } -+ -+ if (!req) { -+ r = ret; -+ break; -+ } -+ -+ if (count > BULK_BUFFER_SIZE) { -+ xfer = BULK_BUFFER_SIZE; -+ /* ZLP, They will be more TX requests so not yet. */ -+ req->zero = 0; -+ } else { -+ xfer = count; -+ /* If the data length is a multple of the -+ * maxpacket size then send a zero length packet(ZLP). -+ */ -+ req->zero = ((xfer % dev->ep_in->maxpacket) == 0); -+ } -+ if (copy_from_user(req->buf, buf, xfer)) { -+ r = -EFAULT; -+ break; -+ } -+ -+ req->length = xfer; -+ ret = usb_ep_queue(dev->ep_in, req, GFP_KERNEL); -+ if (ret < 0) { -+ pr_debug("acc_write: xfer error %d\n", ret); -+ r = -EIO; -+ break; -+ } -+ -+ buf += xfer; -+ count -= xfer; -+ -+ /* zero this so we don't try to free it on error exit */ -+ req = 0; -+ } -+ -+ if (req) -+ req_put(dev, &dev->tx_idle, req); -+ -+ pr_debug("acc_write returning %zd\n", r); -+ return r; -+} -+ -+static long acc_ioctl(struct file *fp, unsigned code, unsigned long value) -+{ -+ struct acc_dev *dev = fp->private_data; -+ char *src = NULL; -+ int ret; -+ -+ switch (code) { -+ case ACCESSORY_GET_STRING_MANUFACTURER: -+ src = dev->manufacturer; -+ break; -+ case ACCESSORY_GET_STRING_MODEL: -+ src = dev->model; -+ break; -+ case ACCESSORY_GET_STRING_DESCRIPTION: -+ src = dev->description; -+ break; -+ case ACCESSORY_GET_STRING_VERSION: -+ src = dev->version; -+ break; -+ case ACCESSORY_GET_STRING_URI: -+ src = dev->uri; -+ break; -+ case ACCESSORY_GET_STRING_SERIAL: -+ src = dev->serial; -+ break; -+ case ACCESSORY_IS_START_REQUESTED: -+ return dev->start_requested; -+ case ACCESSORY_GET_AUDIO_MODE: -+ return dev->audio_mode; -+ } -+ if (!src) -+ return -EINVAL; -+ -+ ret = strlen(src) + 1; -+ if (copy_to_user((void __user *)value, src, ret)) -+ ret = -EFAULT; -+ return ret; -+} -+ -+static int acc_open(struct inode *ip, struct file *fp) -+{ -+ struct acc_dev *dev = get_acc_dev(); -+ -+ if (!dev) -+ return -ENODEV; -+ -+ if (atomic_xchg(&dev->open_excl, 1)) { -+ put_acc_dev(dev); -+ return -EBUSY; -+ } -+ -+ dev->disconnected = 0; -+ fp->private_data = dev; -+ return 0; -+} -+ -+static int acc_release(struct inode *ip, struct file *fp) -+{ -+ struct acc_dev *dev = fp->private_data; -+ -+ if (!dev) -+ return -ENOENT; -+ -+ /* indicate that we are disconnected -+ * still could be online so don't touch online flag -+ */ -+ dev->disconnected = 1; -+ -+ fp->private_data = NULL; -+ WARN_ON(!atomic_xchg(&dev->open_excl, 0)); -+ put_acc_dev(dev); -+ return 0; -+} -+ -+/* file operations for /dev/usb_accessory */ -+static const struct file_operations acc_fops = { -+ .owner = THIS_MODULE, -+ .read = acc_read, -+ .write = acc_write, -+ .unlocked_ioctl = acc_ioctl, -+ .compat_ioctl = acc_ioctl, -+ .open = acc_open, -+ .release = acc_release, -+}; -+ -+static int acc_hid_probe(struct hid_device *hdev, -+ const struct hid_device_id *id) -+{ -+ int ret; -+ -+ ret = hid_parse(hdev); -+ if (ret) -+ return ret; -+ return hid_hw_start(hdev, HID_CONNECT_DEFAULT); -+} -+ -+static struct miscdevice acc_device = { -+ .minor = MISC_DYNAMIC_MINOR, -+ .name = "usb_accessory", -+ .fops = &acc_fops, -+}; -+ -+static const struct hid_device_id acc_hid_table[] = { -+ { HID_USB_DEVICE(HID_ANY_ID, HID_ANY_ID) }, -+ { } -+}; -+ -+static struct hid_driver acc_hid_driver = { -+ .name = "USB accessory", -+ .id_table = acc_hid_table, -+ .probe = acc_hid_probe, -+}; -+ -+static void acc_complete_setup_noop(struct usb_ep *ep, struct usb_request *req) -+{ -+ /* -+ * Default no-op function when nothing needs to be done for the -+ * setup request -+ */ -+} -+ -+int acc_ctrlrequest(struct usb_composite_dev *cdev, -+ const struct usb_ctrlrequest *ctrl) -+{ -+ struct acc_dev *dev = get_acc_dev(); -+ int value = -EOPNOTSUPP; -+ struct acc_hid_dev *hid; -+ int offset; -+ u8 b_requestType = ctrl->bRequestType; -+ u8 b_request = ctrl->bRequest; -+ u16 w_index = le16_to_cpu(ctrl->wIndex); -+ u16 w_value = le16_to_cpu(ctrl->wValue); -+ u16 w_length = le16_to_cpu(ctrl->wLength); -+ unsigned long flags; -+ -+ /* -+ * If instance is not created which is the case in power off charging -+ * mode, dev will be NULL. Hence return error if it is the case. -+ */ -+ if (!dev) -+ return -ENODEV; -+ -+ if (b_requestType == (USB_DIR_OUT | USB_TYPE_VENDOR)) { -+ if (b_request == ACCESSORY_START) { -+ dev->start_requested = 1; -+ schedule_delayed_work( -+ &dev->start_work, msecs_to_jiffies(10)); -+ value = 0; -+ cdev->req->complete = acc_complete_setup_noop; -+ } else if (b_request == ACCESSORY_SEND_STRING) { -+ schedule_work(&dev->sendstring_work); -+ dev->string_index = w_index; -+ cdev->gadget->ep0->driver_data = dev; -+ cdev->req->complete = acc_complete_set_string; -+ value = w_length; -+ } else if (b_request == ACCESSORY_SET_AUDIO_MODE && -+ w_index == 0 && w_length == 0) { -+ dev->audio_mode = w_value; -+ cdev->req->complete = acc_complete_setup_noop; -+ value = 0; -+ } else if (b_request == ACCESSORY_REGISTER_HID) { -+ cdev->req->complete = acc_complete_setup_noop; -+ value = acc_register_hid(dev, w_value, w_index); -+ } else if (b_request == ACCESSORY_UNREGISTER_HID) { -+ cdev->req->complete = acc_complete_setup_noop; -+ value = acc_unregister_hid(dev, w_value); -+ } else if (b_request == ACCESSORY_SET_HID_REPORT_DESC) { -+ spin_lock_irqsave(&dev->lock, flags); -+ hid = acc_hid_get(&dev->new_hid_list, w_value); -+ spin_unlock_irqrestore(&dev->lock, flags); -+ if (!hid) { -+ value = -EINVAL; -+ goto err; -+ } -+ offset = w_index; -+ if (offset != hid->report_desc_offset -+ || offset + w_length > hid->report_desc_len) { -+ value = -EINVAL; -+ goto err; -+ } -+ cdev->req->context = hid; -+ cdev->req->complete = acc_complete_set_hid_report_desc; -+ value = w_length; -+ } else if (b_request == ACCESSORY_SEND_HID_EVENT) { -+ spin_lock_irqsave(&dev->lock, flags); -+ hid = acc_hid_get(&dev->hid_list, w_value); -+ spin_unlock_irqrestore(&dev->lock, flags); -+ if (!hid) { -+ value = -EINVAL; -+ goto err; -+ } -+ cdev->req->context = hid; -+ cdev->req->complete = acc_complete_send_hid_event; -+ value = w_length; -+ } -+ } else if (b_requestType == (USB_DIR_IN | USB_TYPE_VENDOR)) { -+ if (b_request == ACCESSORY_GET_PROTOCOL) { -+ schedule_work(&dev->getprotocol_work); -+ *((u16 *)cdev->req->buf) = PROTOCOL_VERSION; -+ value = sizeof(u16); -+ cdev->req->complete = acc_complete_setup_noop; -+ /* clear any string left over from a previous session */ -+ memset(dev->manufacturer, 0, sizeof(dev->manufacturer)); -+ memset(dev->model, 0, sizeof(dev->model)); -+ memset(dev->description, 0, sizeof(dev->description)); -+ memset(dev->version, 0, sizeof(dev->version)); -+ memset(dev->uri, 0, sizeof(dev->uri)); -+ memset(dev->serial, 0, sizeof(dev->serial)); -+ dev->start_requested = 0; -+ dev->audio_mode = 0; -+ } -+ } -+ -+ if (value >= 0) { -+ cdev->req->zero = 0; -+ cdev->req->length = value; -+ value = usb_ep_queue(cdev->gadget->ep0, cdev->req, GFP_ATOMIC); -+ if (value < 0) -+ ERROR(cdev, "%s setup response queue error\n", -+ __func__); -+ } -+ -+err: -+ if (value == -EOPNOTSUPP) -+ VDBG(cdev, -+ "unknown class-specific control req " -+ "%02x.%02x v%04x i%04x l%u\n", -+ ctrl->bRequestType, ctrl->bRequest, -+ w_value, w_index, w_length); -+ put_acc_dev(dev); -+ return value; -+} -+EXPORT_SYMBOL_GPL(acc_ctrlrequest); -+ -+int acc_ctrlrequest_composite(struct usb_composite_dev *cdev, -+ const struct usb_ctrlrequest *ctrl) -+{ -+ u16 w_length = le16_to_cpu(ctrl->wLength); -+ -+ if (w_length > USB_COMP_EP0_BUFSIZ) { -+ if (ctrl->bRequestType & USB_DIR_IN) { -+ /* Cast away the const, we are going to overwrite on purpose. */ -+ __le16 *temp = (__le16 *)&ctrl->wLength; -+ -+ *temp = cpu_to_le16(USB_COMP_EP0_BUFSIZ); -+ w_length = USB_COMP_EP0_BUFSIZ; -+ } else { -+ return -EINVAL; -+ } -+ } -+ return acc_ctrlrequest(cdev, ctrl); -+} -+EXPORT_SYMBOL_GPL(acc_ctrlrequest_composite); -+ -+static int -+__acc_function_bind(struct usb_configuration *c, -+ struct usb_function *f, bool configfs) -+{ -+ struct usb_composite_dev *cdev = c->cdev; -+ struct usb_string *us; -+ struct acc_dev *dev = func_to_dev(f); -+ int id; -+ int ret; -+ -+ DBG(cdev, "acc_function_bind dev: %p\n", dev); -+ -+ if (configfs) { -+ us = usb_gstrings_attach(cdev, acc_strings, ARRAY_SIZE(acc_string_defs)); -+ if (IS_ERR(us)) -+ return PTR_ERR(us); -+ ret = us[INTERFACE_STRING_INDEX].id; -+ acc_interface_desc.iInterface = ret; -+ dev->cdev = c->cdev; -+ } -+ ret = hid_register_driver(&acc_hid_driver); -+ if (ret) -+ return ret; -+ -+ dev->start_requested = 0; -+ -+ /* allocate interface ID(s) */ -+ id = usb_interface_id(c, f); -+ if (id < 0) -+ return id; -+ acc_interface_desc.bInterfaceNumber = id; -+ -+ /* allocate endpoints */ -+ ret = create_bulk_endpoints(dev, &acc_fullspeed_in_desc, -+ &acc_fullspeed_out_desc); -+ if (ret) -+ return ret; -+ -+ /* support high speed hardware */ -+ acc_highspeed_in_desc.bEndpointAddress = -+ acc_fullspeed_in_desc.bEndpointAddress; -+ acc_highspeed_out_desc.bEndpointAddress = -+ acc_fullspeed_out_desc.bEndpointAddress; -+ -+ /* support super speed hardware */ -+ acc_superspeed_in_desc.bEndpointAddress = -+ acc_fullspeed_in_desc.bEndpointAddress; -+ acc_superspeed_out_desc.bEndpointAddress = -+ acc_fullspeed_out_desc.bEndpointAddress; -+ -+ /* support super speed plus hardware */ -+ acc_superspeedplus_in_desc.bEndpointAddress = -+ acc_fullspeed_in_desc.bEndpointAddress; -+ acc_superspeedplus_out_desc.bEndpointAddress = -+ acc_fullspeed_out_desc.bEndpointAddress; -+ -+ DBG(cdev, "%s speed %s: IN/%s, OUT/%s\n", -+ gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full", -+ f->name, dev->ep_in->name, dev->ep_out->name); -+ return 0; -+} -+ -+static int -+acc_function_bind_configfs(struct usb_configuration *c, -+ struct usb_function *f) { -+ return __acc_function_bind(c, f, true); -+} -+ -+static void -+kill_all_hid_devices(struct acc_dev *dev) -+{ -+ struct acc_hid_dev *hid; -+ struct list_head *entry, *temp; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&dev->lock, flags); -+ list_for_each_safe(entry, temp, &dev->hid_list) { -+ hid = list_entry(entry, struct acc_hid_dev, list); -+ list_del(&hid->list); -+ list_add(&hid->list, &dev->dead_hid_list); -+ } -+ list_for_each_safe(entry, temp, &dev->new_hid_list) { -+ hid = list_entry(entry, struct acc_hid_dev, list); -+ list_del(&hid->list); -+ list_add(&hid->list, &dev->dead_hid_list); -+ } -+ spin_unlock_irqrestore(&dev->lock, flags); -+ -+ schedule_work(&dev->hid_work); -+} -+ -+static void -+acc_hid_unbind(struct acc_dev *dev) -+{ -+ hid_unregister_driver(&acc_hid_driver); -+ kill_all_hid_devices(dev); -+} -+ -+static void -+acc_function_unbind(struct usb_configuration *c, struct usb_function *f) -+{ -+ struct acc_dev *dev = func_to_dev(f); -+ struct usb_request *req; -+ int i; -+ -+ dev->online = 0; /* clear online flag */ -+ wake_up(&dev->read_wq); /* unblock reads on closure */ -+ wake_up(&dev->write_wq); /* likewise for writes */ -+ -+ while ((req = req_get(dev, &dev->tx_idle))) -+ acc_request_free(req, dev->ep_in); -+ for (i = 0; i < RX_REQ_MAX; i++) { -+ acc_request_free(dev->rx_req[i], dev->ep_out); -+ dev->rx_req[i] = NULL; -+ } -+ -+ acc_hid_unbind(dev); -+} -+ -+static void acc_getprotocol_work(struct work_struct *data) -+{ -+ char *envp[2] = { "ACCESSORY=GETPROTOCOL", NULL }; -+ -+ kobject_uevent_env(&acc_device.this_device->kobj, KOBJ_CHANGE, envp); -+} -+ -+static void acc_sendstring_work(struct work_struct *data) -+{ -+ char *envp[2] = { "ACCESSORY=SENDSTRING", NULL }; -+ -+ kobject_uevent_env(&acc_device.this_device->kobj, KOBJ_CHANGE, envp); -+} -+ -+static void acc_start_work(struct work_struct *data) -+{ -+ char *envp[2] = { "ACCESSORY=START", NULL }; -+ -+ kobject_uevent_env(&acc_device.this_device->kobj, KOBJ_CHANGE, envp); -+} -+ -+static int acc_hid_init(struct acc_hid_dev *hdev) -+{ -+ struct hid_device *hid; -+ int ret; -+ -+ hid = hid_allocate_device(); -+ if (IS_ERR(hid)) -+ return PTR_ERR(hid); -+ -+ hid->ll_driver = &acc_hid_ll_driver; -+ hid->dev.parent = acc_device.this_device; -+ -+ hid->bus = BUS_USB; -+ hid->vendor = HID_ANY_ID; -+ hid->product = HID_ANY_ID; -+ hid->driver_data = hdev; -+ ret = hid_add_device(hid); -+ if (ret) { -+ pr_err("can't add hid device: %d\n", ret); -+ hid_destroy_device(hid); -+ return ret; -+ } -+ -+ hdev->hid = hid; -+ return 0; -+} -+ -+static void acc_hid_delete(struct acc_hid_dev *hid) -+{ -+ kfree(hid->report_desc); -+ kfree(hid); -+} -+ -+static void acc_hid_work(struct work_struct *data) -+{ -+ struct acc_dev *dev = get_acc_dev(); -+ struct list_head *entry, *temp; -+ struct acc_hid_dev *hid; -+ struct list_head new_list, dead_list; -+ unsigned long flags; -+ -+ if (!dev) -+ return; -+ -+ INIT_LIST_HEAD(&new_list); -+ -+ spin_lock_irqsave(&dev->lock, flags); -+ -+ /* copy hids that are ready for initialization to new_list */ -+ list_for_each_safe(entry, temp, &dev->new_hid_list) { -+ hid = list_entry(entry, struct acc_hid_dev, list); -+ if (hid->report_desc_offset == hid->report_desc_len) -+ list_move(&hid->list, &new_list); -+ } -+ -+ if (list_empty(&dev->dead_hid_list)) { -+ INIT_LIST_HEAD(&dead_list); -+ } else { -+ /* move all of dev->dead_hid_list to dead_list */ -+ dead_list.prev = dev->dead_hid_list.prev; -+ dead_list.next = dev->dead_hid_list.next; -+ dead_list.next->prev = &dead_list; -+ dead_list.prev->next = &dead_list; -+ INIT_LIST_HEAD(&dev->dead_hid_list); -+ } -+ -+ spin_unlock_irqrestore(&dev->lock, flags); -+ -+ /* register new HID devices */ -+ list_for_each_safe(entry, temp, &new_list) { -+ hid = list_entry(entry, struct acc_hid_dev, list); -+ if (acc_hid_init(hid)) { -+ pr_err("can't add HID device %p\n", hid); -+ acc_hid_delete(hid); -+ } else { -+ spin_lock_irqsave(&dev->lock, flags); -+ list_move(&hid->list, &dev->hid_list); -+ spin_unlock_irqrestore(&dev->lock, flags); -+ } -+ } -+ -+ /* remove dead HID devices */ -+ list_for_each_safe(entry, temp, &dead_list) { -+ hid = list_entry(entry, struct acc_hid_dev, list); -+ list_del(&hid->list); -+ if (hid->hid) -+ hid_destroy_device(hid->hid); -+ acc_hid_delete(hid); -+ } -+ -+ put_acc_dev(dev); -+} -+ -+static int acc_function_set_alt(struct usb_function *f, -+ unsigned intf, unsigned alt) -+{ -+ struct acc_dev *dev = func_to_dev(f); -+ struct usb_composite_dev *cdev = f->config->cdev; -+ int ret; -+ -+ DBG(cdev, "acc_function_set_alt intf: %d alt: %d\n", intf, alt); -+ -+ ret = config_ep_by_speed(cdev->gadget, f, dev->ep_in); -+ if (ret) -+ return ret; -+ -+ ret = usb_ep_enable(dev->ep_in); -+ if (ret) -+ return ret; -+ -+ ret = config_ep_by_speed(cdev->gadget, f, dev->ep_out); -+ if (ret) -+ return ret; -+ -+ ret = usb_ep_enable(dev->ep_out); -+ if (ret) { -+ usb_ep_disable(dev->ep_in); -+ return ret; -+ } -+ -+ dev->online = 1; -+ dev->disconnected = 0; /* if online then not disconnected */ -+ -+ /* readers may be blocked waiting for us to go online */ -+ wake_up(&dev->read_wq); -+ return 0; -+} -+ -+static void acc_function_disable(struct usb_function *f) -+{ -+ struct acc_dev *dev = func_to_dev(f); -+ struct usb_composite_dev *cdev = dev->cdev; -+ -+ DBG(cdev, "acc_function_disable\n"); -+ acc_set_disconnected(dev); /* this now only sets disconnected */ -+ dev->online = 0; /* so now need to clear online flag here too */ -+ usb_ep_disable(dev->ep_in); -+ usb_ep_disable(dev->ep_out); -+ -+ /* readers may be blocked waiting for us to go online */ -+ wake_up(&dev->read_wq); -+ -+ VDBG(cdev, "%s disabled\n", dev->function.name); -+} -+ -+static int acc_setup(void) -+{ -+ struct acc_dev_ref *ref = &_acc_dev_ref; -+ struct acc_dev *dev; -+ int ret; -+ -+ if (kref_read(&ref->kref)) -+ return -EBUSY; -+ -+ dev = kzalloc(sizeof(*dev), GFP_KERNEL); -+ if (!dev) -+ return -ENOMEM; -+ -+ spin_lock_init(&dev->lock); -+ init_waitqueue_head(&dev->read_wq); -+ init_waitqueue_head(&dev->write_wq); -+ atomic_set(&dev->open_excl, 0); -+ INIT_LIST_HEAD(&dev->tx_idle); -+ INIT_LIST_HEAD(&dev->hid_list); -+ INIT_LIST_HEAD(&dev->new_hid_list); -+ INIT_LIST_HEAD(&dev->dead_hid_list); -+ INIT_DELAYED_WORK(&dev->start_work, acc_start_work); -+ INIT_WORK(&dev->hid_work, acc_hid_work); -+ INIT_WORK(&dev->getprotocol_work, acc_getprotocol_work); -+ INIT_WORK(&dev->sendstring_work, acc_sendstring_work); -+ -+ dev->ref = ref; -+ if (cmpxchg_relaxed(&ref->acc_dev, NULL, dev)) { -+ ret = -EBUSY; -+ goto err_free_dev; -+ } -+ -+ ret = misc_register(&acc_device); -+ if (ret) -+ goto err_zap_ptr; -+ -+ kref_init(&ref->kref); -+ return 0; -+ -+err_zap_ptr: -+ ref->acc_dev = NULL; -+err_free_dev: -+ kfree(dev); -+ pr_err("USB accessory gadget driver failed to initialize\n"); -+ return ret; -+} -+ -+void acc_disconnect(void) -+{ -+ struct acc_dev *dev = get_acc_dev(); -+ -+ if (!dev) -+ return; -+ -+ /* unregister all HID devices if USB is disconnected */ -+ kill_all_hid_devices(dev); -+ put_acc_dev(dev); -+} -+EXPORT_SYMBOL_GPL(acc_disconnect); -+ -+static void acc_cleanup(void) -+{ -+ struct acc_dev *dev = get_acc_dev(); -+ -+ misc_deregister(&acc_device); -+ put_acc_dev(dev); -+ put_acc_dev(dev); /* Pairs with kref_init() in acc_setup() */ -+} -+static struct acc_instance *to_acc_instance(struct config_item *item) -+{ -+ return container_of(to_config_group(item), struct acc_instance, -+ func_inst.group); -+} -+ -+static void acc_attr_release(struct config_item *item) -+{ -+ struct acc_instance *fi_acc = to_acc_instance(item); -+ -+ usb_put_function_instance(&fi_acc->func_inst); -+} -+ -+static struct configfs_item_operations acc_item_ops = { -+ .release = acc_attr_release, -+}; -+ -+static struct config_item_type acc_func_type = { -+ .ct_item_ops = &acc_item_ops, -+ .ct_owner = THIS_MODULE, -+}; -+ -+static struct acc_instance *to_fi_acc(struct usb_function_instance *fi) -+{ -+ return container_of(fi, struct acc_instance, func_inst); -+} -+ -+static int acc_set_inst_name(struct usb_function_instance *fi, const char *name) -+{ -+ struct acc_instance *fi_acc; -+ char *ptr; -+ int name_len; -+ -+ name_len = strlen(name) + 1; -+ if (name_len > MAX_INST_NAME_LEN) -+ return -ENAMETOOLONG; -+ -+ ptr = kstrndup(name, name_len, GFP_KERNEL); -+ if (!ptr) -+ return -ENOMEM; -+ -+ fi_acc = to_fi_acc(fi); -+ fi_acc->name = ptr; -+ return 0; -+} -+ -+static void acc_free_inst(struct usb_function_instance *fi) -+{ -+ struct acc_instance *fi_acc; -+ -+ fi_acc = to_fi_acc(fi); -+ kfree(fi_acc->name); -+ acc_cleanup(); -+} -+ -+static struct usb_function_instance *acc_alloc_inst(void) -+{ -+ struct acc_instance *fi_acc; -+ int err; -+ -+ fi_acc = kzalloc(sizeof(*fi_acc), GFP_KERNEL); -+ if (!fi_acc) -+ return ERR_PTR(-ENOMEM); -+ fi_acc->func_inst.set_inst_name = acc_set_inst_name; -+ fi_acc->func_inst.free_func_inst = acc_free_inst; -+ -+ err = acc_setup(); -+ if (err) { -+ kfree(fi_acc); -+ return ERR_PTR(err); -+ } -+ -+ config_group_init_type_name(&fi_acc->func_inst.group, -+ "", &acc_func_type); -+ return &fi_acc->func_inst; -+} -+ -+static void acc_free(struct usb_function *f) -+{ -+ struct acc_dev *dev = func_to_dev(f); -+ -+ put_acc_dev(dev); -+} -+ -+int acc_ctrlrequest_configfs(struct usb_function *f, -+ const struct usb_ctrlrequest *ctrl) { -+ if (f->config != NULL && f->config->cdev != NULL) -+ return acc_ctrlrequest(f->config->cdev, ctrl); -+ else -+ return -1; -+} -+ -+static struct usb_function *acc_alloc(struct usb_function_instance *fi) -+{ -+ struct acc_dev *dev = get_acc_dev(); -+ -+ dev->function.name = "accessory"; -+ dev->function.strings = acc_strings, -+ dev->function.fs_descriptors = fs_acc_descs; -+ dev->function.hs_descriptors = hs_acc_descs; -+ dev->function.ss_descriptors = ss_acc_descs; -+ dev->function.ssp_descriptors = ssp_acc_descs; -+ dev->function.bind = acc_function_bind_configfs; -+ dev->function.unbind = acc_function_unbind; -+ dev->function.set_alt = acc_function_set_alt; -+ dev->function.disable = acc_function_disable; -+ dev->function.free_func = acc_free; -+ dev->function.setup = acc_ctrlrequest_configfs; -+ -+ return &dev->function; -+} -+DECLARE_USB_FUNCTION_INIT(accessory, acc_alloc_inst, acc_alloc); -+MODULE_LICENSE("GPL"); -diff --git a/include/linux/usb/f_accessory.h b/include/linux/usb/f_accessory.h -new file mode 100644 ---- /dev/null -+++ b/include/linux/usb/f_accessory.h -@@ -0,0 +1,23 @@ -+/* -+ * Gadget Function Driver for Android USB accessories -+ * -+ * Copyright (C) 2011 Google, Inc. -+ * Author: Mike Lockwood <lockwood@android.com> -+ * -+ * This software is licensed under the terms of the GNU General Public -+ * License version 2, as published by the Free Software Foundation, and -+ * may be copied, distributed, and modified under those terms. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef __LINUX_USB_F_ACCESSORY_H -+#define __LINUX_USB_F_ACCESSORY_H -+ -+#include <uapi/linux/usb/f_accessory.h> -+ -+#endif /* __LINUX_USB_F_ACCESSORY_H */ -diff --git a/include/uapi/linux/usb/f_accessory.h b/include/uapi/linux/usb/f_accessory.h -new file mode 100644 ---- /dev/null -+++ b/include/uapi/linux/usb/f_accessory.h -@@ -0,0 +1,146 @@ -+/* -+ * Gadget Function Driver for Android USB accessories -+ * -+ * Copyright (C) 2011 Google, Inc. -+ * Author: Mike Lockwood <lockwood@android.com> -+ * -+ * This software is licensed under the terms of the GNU General Public -+ * License version 2, as published by the Free Software Foundation, and -+ * may be copied, distributed, and modified under those terms. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#ifndef _UAPI_LINUX_USB_F_ACCESSORY_H -+#define _UAPI_LINUX_USB_F_ACCESSORY_H -+ -+/* Use Google Vendor ID when in accessory mode */ -+#define USB_ACCESSORY_VENDOR_ID 0x18D1 -+ -+ -+/* Product ID to use when in accessory mode */ -+#define USB_ACCESSORY_PRODUCT_ID 0x2D00 -+ -+/* Product ID to use when in accessory mode and adb is enabled */ -+#define USB_ACCESSORY_ADB_PRODUCT_ID 0x2D01 -+ -+/* Indexes for strings sent by the host via ACCESSORY_SEND_STRING */ -+#define ACCESSORY_STRING_MANUFACTURER 0 -+#define ACCESSORY_STRING_MODEL 1 -+#define ACCESSORY_STRING_DESCRIPTION 2 -+#define ACCESSORY_STRING_VERSION 3 -+#define ACCESSORY_STRING_URI 4 -+#define ACCESSORY_STRING_SERIAL 5 -+ -+/* Control request for retrieving device's protocol version -+ * -+ * requestType: USB_DIR_IN | USB_TYPE_VENDOR -+ * request: ACCESSORY_GET_PROTOCOL -+ * value: 0 -+ * index: 0 -+ * data version number (16 bits little endian) -+ * 1 for original accessory support -+ * 2 adds HID and device to host audio support -+ */ -+#define ACCESSORY_GET_PROTOCOL 51 -+ -+/* Control request for host to send a string to the device -+ * -+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR -+ * request: ACCESSORY_SEND_STRING -+ * value: 0 -+ * index: string ID -+ * data zero terminated UTF8 string -+ * -+ * The device can later retrieve these strings via the -+ * ACCESSORY_GET_STRING_* ioctls -+ */ -+#define ACCESSORY_SEND_STRING 52 -+ -+/* Control request for starting device in accessory mode. -+ * The host sends this after setting all its strings to the device. -+ * -+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR -+ * request: ACCESSORY_START -+ * value: 0 -+ * index: 0 -+ * data none -+ */ -+#define ACCESSORY_START 53 -+ -+/* Control request for registering a HID device. -+ * Upon registering, a unique ID is sent by the accessory in the -+ * value parameter. This ID will be used for future commands for -+ * the device -+ * -+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR -+ * request: ACCESSORY_REGISTER_HID_DEVICE -+ * value: Accessory assigned ID for the HID device -+ * index: total length of the HID report descriptor -+ * data none -+ */ -+#define ACCESSORY_REGISTER_HID 54 -+ -+/* Control request for unregistering a HID device. -+ * -+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR -+ * request: ACCESSORY_REGISTER_HID -+ * value: Accessory assigned ID for the HID device -+ * index: 0 -+ * data none -+ */ -+#define ACCESSORY_UNREGISTER_HID 55 -+ -+/* Control request for sending the HID report descriptor. -+ * If the HID descriptor is longer than the endpoint zero max packet size, -+ * the descriptor will be sent in multiple ACCESSORY_SET_HID_REPORT_DESC -+ * commands. The data for the descriptor must be sent sequentially -+ * if multiple packets are needed. -+ * -+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR -+ * request: ACCESSORY_SET_HID_REPORT_DESC -+ * value: Accessory assigned ID for the HID device -+ * index: offset of data in descriptor -+ * (needed when HID descriptor is too big for one packet) -+ * data the HID report descriptor -+ */ -+#define ACCESSORY_SET_HID_REPORT_DESC 56 -+ -+/* Control request for sending HID events. -+ * -+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR -+ * request: ACCESSORY_SEND_HID_EVENT -+ * value: Accessory assigned ID for the HID device -+ * index: 0 -+ * data the HID report for the event -+ */ -+#define ACCESSORY_SEND_HID_EVENT 57 -+ -+/* Control request for setting the audio mode. -+ * -+ * requestType: USB_DIR_OUT | USB_TYPE_VENDOR -+ * request: ACCESSORY_SET_AUDIO_MODE -+ * value: 0 - no audio -+ * 1 - device to host, 44100 16-bit stereo PCM -+ * index: 0 -+ * data none -+ */ -+#define ACCESSORY_SET_AUDIO_MODE 58 -+ -+/* ioctls for retrieving strings set by the host */ -+#define ACCESSORY_GET_STRING_MANUFACTURER _IOW('M', 1, char[256]) -+#define ACCESSORY_GET_STRING_MODEL _IOW('M', 2, char[256]) -+#define ACCESSORY_GET_STRING_DESCRIPTION _IOW('M', 3, char[256]) -+#define ACCESSORY_GET_STRING_VERSION _IOW('M', 4, char[256]) -+#define ACCESSORY_GET_STRING_URI _IOW('M', 5, char[256]) -+#define ACCESSORY_GET_STRING_SERIAL _IOW('M', 6, char[256]) -+/* returns 1 if there is a start request pending */ -+#define ACCESSORY_IS_START_REQUESTED _IO('M', 7) -+/* returns audio mode (set via the ACCESSORY_SET_AUDIO_MODE control request) */ -+#define ACCESSORY_GET_AUDIO_MODE _IO('M', 8) -+ -+#endif /* _UAPI_LINUX_USB_F_ACCESSORY_H */ diff --git a/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_audio_source-New-gadget-driver-for-audio-output.patch b/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_audio_source-New-gadget-driver-for-audio-output.patch deleted file mode 100644 index 89c35d8d..00000000 --- a/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_audio_source-New-gadget-driver-for-audio-output.patch +++ /dev/null @@ -1,1150 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mike Lockwood <lockwood@google.com> -Date: Fri, 11 May 2012 09:01:08 -0700 -Subject: NOUPSTREAM: ANDROID: usb: gadget: f_audio_source: New gadget driver - for audio output - -This driver presents a standard USB audio class interface to the host -and an ALSA PCM device to userspace - -[CPNOTE: 19/07/21] Lee: Should be re-written to use upstream APIs - pinged Badhri - -Bug: 78114713 -Bug: 120441124 -[badhri: f_audio_source is being migrated to userspace.] -Change-Id: If16b14a5ff27045f9cb2daaf1ae9195c5eeab7d0 -Signed-off-by: Mike Lockwood <lockwood@google.com> -[AmitP: Folded following android-4.9 commit changes into this patch - Parts of e27543931009 ("ANDROID: usb: gadget: Fixes and hacks to make android usb gadget compile on 3.8") - i6d9285e2574a ("ANDROID: usb: gadget: f_audio_source:replace deprecated API")] -Signed-off-by: Amit Pundir <amit.pundir@linaro.org> -[adelva: Folded the following changes into this patch: - ddfd0c4070c1 ("ANDROID: usb: gadget: f_audio_source: Move to USB_FUNCTION API") - a3ab81aaa19e ("ANDROID: usb: gadget: f_audio_source: Move gadget functions code") - 2095c953d894 ("ANDROID: usb: gadget: f_audio_source: change max ISO packet size") - 8671b3e53638 ("ANDROID: usb: gadget: f_audio_source: Fixed USB Audio Class Interface Descriptor") - af98f36edbe2 ("ANDROID: usb: gadget: f_audio_source: disable the CPU C-states upon playback") - a830751a338e ("CHROMIUM: usb: gadget: f_audio_source: add .free_func callback")] -Signed-off-by: Alistair Delva <adelva@google.com> -Signed-off-by: Lee Jones <joneslee@google.com> ---- - drivers/usb/gadget/Kconfig | 12 + - drivers/usb/gadget/function/Makefile | 2 + - drivers/usb/gadget/function/f_audio_source.c | 1071 ++++++++++++++++++ - 3 files changed, 1085 insertions(+) - create mode 100644 drivers/usb/gadget/function/f_audio_source.c - -diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig ---- a/drivers/usb/gadget/Kconfig -+++ b/drivers/usb/gadget/Kconfig -@@ -223,6 +223,9 @@ config USB_F_TCM - config USB_F_ACC - tristate - -+config USB_F_AUDIO_SRC -+ tristate -+ - # this first set of drivers all depend on bulk-capable hardware. - - config USB_CONFIGFS -@@ -394,6 +397,15 @@ config USB_CONFIGFS_F_ACC - help - USB gadget Accessory support - -+config USB_CONFIGFS_F_AUDIO_SRC -+ bool "Audio Source gadget" -+ depends on USB_CONFIGFS -+ depends on SND -+ select SND_PCM -+ select USB_F_AUDIO_SRC -+ help -+ USB gadget Audio Source support -+ - config USB_CONFIGFS_F_UAC1 - bool "Audio Class 1.0" - depends on USB_CONFIGFS -diff --git a/drivers/usb/gadget/function/Makefile b/drivers/usb/gadget/function/Makefile ---- a/drivers/usb/gadget/function/Makefile -+++ b/drivers/usb/gadget/function/Makefile -@@ -54,3 +54,5 @@ usb_f_tcm-y := f_tcm.o - obj-$(CONFIG_USB_F_TCM) += usb_f_tcm.o - usb_f_accessory-y := f_accessory.o - obj-$(CONFIG_USB_F_ACC) += usb_f_accessory.o -+usb_f_audio_source-y := f_audio_source.o -+obj-$(CONFIG_USB_F_AUDIO_SRC) += usb_f_audio_source.o -diff --git a/drivers/usb/gadget/function/f_audio_source.c b/drivers/usb/gadget/function/f_audio_source.c -new file mode 100644 ---- /dev/null -+++ b/drivers/usb/gadget/function/f_audio_source.c -@@ -0,0 +1,1071 @@ -+/* -+ * Gadget Function Driver for USB audio source device -+ * -+ * Copyright (C) 2012 Google, Inc. -+ * -+ * This software is licensed under the terms of the GNU General Public -+ * License version 2, as published by the Free Software Foundation, and -+ * may be copied, distributed, and modified under those terms. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ */ -+ -+#include <linux/device.h> -+#include <linux/usb/audio.h> -+#include <linux/wait.h> -+#include <linux/pm_qos.h> -+#include <sound/core.h> -+#include <sound/initval.h> -+#include <sound/pcm.h> -+ -+#include <linux/usb.h> -+#include <linux/usb_usual.h> -+#include <linux/usb/ch9.h> -+#include <linux/configfs.h> -+#include <linux/usb/composite.h> -+#include <linux/module.h> -+#include <linux/moduleparam.h> -+#define SAMPLE_RATE 44100 -+#define FRAMES_PER_MSEC (SAMPLE_RATE / 1000) -+ -+#define IN_EP_MAX_PACKET_SIZE 256 -+ -+/* Number of requests to allocate */ -+#define IN_EP_REQ_COUNT 4 -+ -+#define AUDIO_AC_INTERFACE 0 -+#define AUDIO_AS_INTERFACE 1 -+#define AUDIO_NUM_INTERFACES 2 -+#define MAX_INST_NAME_LEN 40 -+ -+/* B.3.1 Standard AC Interface Descriptor */ -+static struct usb_interface_descriptor ac_interface_desc = { -+ .bLength = USB_DT_INTERFACE_SIZE, -+ .bDescriptorType = USB_DT_INTERFACE, -+ .bNumEndpoints = 0, -+ .bInterfaceClass = USB_CLASS_AUDIO, -+ .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, -+}; -+ -+DECLARE_UAC_AC_HEADER_DESCRIPTOR(2); -+ -+#define UAC_DT_AC_HEADER_LENGTH UAC_DT_AC_HEADER_SIZE(AUDIO_NUM_INTERFACES) -+/* 1 input terminal, 1 output terminal and 1 feature unit */ -+#define UAC_DT_TOTAL_LENGTH (UAC_DT_AC_HEADER_LENGTH \ -+ + UAC_DT_INPUT_TERMINAL_SIZE + UAC_DT_OUTPUT_TERMINAL_SIZE \ -+ + UAC_DT_FEATURE_UNIT_SIZE(0)) -+/* B.3.2 Class-Specific AC Interface Descriptor */ -+static struct uac1_ac_header_descriptor_2 ac_header_desc = { -+ .bLength = UAC_DT_AC_HEADER_LENGTH, -+ .bDescriptorType = USB_DT_CS_INTERFACE, -+ .bDescriptorSubtype = UAC_HEADER, -+ .bcdADC = __constant_cpu_to_le16(0x0100), -+ .wTotalLength = __constant_cpu_to_le16(UAC_DT_TOTAL_LENGTH), -+ .bInCollection = AUDIO_NUM_INTERFACES, -+ .baInterfaceNr = { -+ [0] = AUDIO_AC_INTERFACE, -+ [1] = AUDIO_AS_INTERFACE, -+ } -+}; -+ -+#define INPUT_TERMINAL_ID 1 -+static struct uac_input_terminal_descriptor input_terminal_desc = { -+ .bLength = UAC_DT_INPUT_TERMINAL_SIZE, -+ .bDescriptorType = USB_DT_CS_INTERFACE, -+ .bDescriptorSubtype = UAC_INPUT_TERMINAL, -+ .bTerminalID = INPUT_TERMINAL_ID, -+ .wTerminalType = UAC_INPUT_TERMINAL_MICROPHONE, -+ .bAssocTerminal = 0, -+ .wChannelConfig = 0x3, -+}; -+ -+DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(0); -+ -+#define FEATURE_UNIT_ID 2 -+static struct uac_feature_unit_descriptor_0 feature_unit_desc = { -+ .bLength = UAC_DT_FEATURE_UNIT_SIZE(0), -+ .bDescriptorType = USB_DT_CS_INTERFACE, -+ .bDescriptorSubtype = UAC_FEATURE_UNIT, -+ .bUnitID = FEATURE_UNIT_ID, -+ .bSourceID = INPUT_TERMINAL_ID, -+ .bControlSize = 2, -+}; -+ -+#define OUTPUT_TERMINAL_ID 3 -+static struct uac1_output_terminal_descriptor output_terminal_desc = { -+ .bLength = UAC_DT_OUTPUT_TERMINAL_SIZE, -+ .bDescriptorType = USB_DT_CS_INTERFACE, -+ .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, -+ .bTerminalID = OUTPUT_TERMINAL_ID, -+ .wTerminalType = UAC_TERMINAL_STREAMING, -+ .bAssocTerminal = FEATURE_UNIT_ID, -+ .bSourceID = FEATURE_UNIT_ID, -+}; -+ -+/* B.4.1 Standard AS Interface Descriptor */ -+static struct usb_interface_descriptor as_interface_alt_0_desc = { -+ .bLength = USB_DT_INTERFACE_SIZE, -+ .bDescriptorType = USB_DT_INTERFACE, -+ .bAlternateSetting = 0, -+ .bNumEndpoints = 0, -+ .bInterfaceClass = USB_CLASS_AUDIO, -+ .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, -+}; -+ -+static struct usb_interface_descriptor as_interface_alt_1_desc = { -+ .bLength = USB_DT_INTERFACE_SIZE, -+ .bDescriptorType = USB_DT_INTERFACE, -+ .bAlternateSetting = 1, -+ .bNumEndpoints = 1, -+ .bInterfaceClass = USB_CLASS_AUDIO, -+ .bInterfaceSubClass = USB_SUBCLASS_AUDIOSTREAMING, -+}; -+ -+/* B.4.2 Class-Specific AS Interface Descriptor */ -+static struct uac1_as_header_descriptor as_header_desc = { -+ .bLength = UAC_DT_AS_HEADER_SIZE, -+ .bDescriptorType = USB_DT_CS_INTERFACE, -+ .bDescriptorSubtype = UAC_AS_GENERAL, -+ .bTerminalLink = INPUT_TERMINAL_ID, -+ .bDelay = 1, -+ .wFormatTag = UAC_FORMAT_TYPE_I_PCM, -+}; -+ -+DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1); -+ -+static struct uac_format_type_i_discrete_descriptor_1 as_type_i_desc = { -+ .bLength = UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1), -+ .bDescriptorType = USB_DT_CS_INTERFACE, -+ .bDescriptorSubtype = UAC_FORMAT_TYPE, -+ .bFormatType = UAC_FORMAT_TYPE_I, -+ .bSubframeSize = 2, -+ .bBitResolution = 16, -+ .bSamFreqType = 1, -+}; -+ -+/* Standard ISO IN Endpoint Descriptor for highspeed */ -+static struct usb_endpoint_descriptor hs_as_in_ep_desc = { -+ .bLength = USB_DT_ENDPOINT_AUDIO_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_IN, -+ .bmAttributes = USB_ENDPOINT_SYNC_SYNC -+ | USB_ENDPOINT_XFER_ISOC, -+ .wMaxPacketSize = __constant_cpu_to_le16(IN_EP_MAX_PACKET_SIZE), -+ .bInterval = 4, /* poll 1 per millisecond */ -+}; -+ -+/* Standard ISO IN Endpoint Descriptor for highspeed */ -+static struct usb_endpoint_descriptor fs_as_in_ep_desc = { -+ .bLength = USB_DT_ENDPOINT_AUDIO_SIZE, -+ .bDescriptorType = USB_DT_ENDPOINT, -+ .bEndpointAddress = USB_DIR_IN, -+ .bmAttributes = USB_ENDPOINT_SYNC_SYNC -+ | USB_ENDPOINT_XFER_ISOC, -+ .wMaxPacketSize = __constant_cpu_to_le16(IN_EP_MAX_PACKET_SIZE), -+ .bInterval = 1, /* poll 1 per millisecond */ -+}; -+ -+/* Class-specific AS ISO OUT Endpoint Descriptor */ -+static struct uac_iso_endpoint_descriptor as_iso_in_desc = { -+ .bLength = UAC_ISO_ENDPOINT_DESC_SIZE, -+ .bDescriptorType = USB_DT_CS_ENDPOINT, -+ .bDescriptorSubtype = UAC_EP_GENERAL, -+ .bmAttributes = 1, -+ .bLockDelayUnits = 1, -+ .wLockDelay = __constant_cpu_to_le16(1), -+}; -+ -+static struct usb_descriptor_header *hs_audio_desc[] = { -+ (struct usb_descriptor_header *)&ac_interface_desc, -+ (struct usb_descriptor_header *)&ac_header_desc, -+ -+ (struct usb_descriptor_header *)&input_terminal_desc, -+ (struct usb_descriptor_header *)&output_terminal_desc, -+ (struct usb_descriptor_header *)&feature_unit_desc, -+ -+ (struct usb_descriptor_header *)&as_interface_alt_0_desc, -+ (struct usb_descriptor_header *)&as_interface_alt_1_desc, -+ (struct usb_descriptor_header *)&as_header_desc, -+ -+ (struct usb_descriptor_header *)&as_type_i_desc, -+ -+ (struct usb_descriptor_header *)&hs_as_in_ep_desc, -+ (struct usb_descriptor_header *)&as_iso_in_desc, -+ NULL, -+}; -+ -+static struct usb_descriptor_header *fs_audio_desc[] = { -+ (struct usb_descriptor_header *)&ac_interface_desc, -+ (struct usb_descriptor_header *)&ac_header_desc, -+ -+ (struct usb_descriptor_header *)&input_terminal_desc, -+ (struct usb_descriptor_header *)&output_terminal_desc, -+ (struct usb_descriptor_header *)&feature_unit_desc, -+ -+ (struct usb_descriptor_header *)&as_interface_alt_0_desc, -+ (struct usb_descriptor_header *)&as_interface_alt_1_desc, -+ (struct usb_descriptor_header *)&as_header_desc, -+ -+ (struct usb_descriptor_header *)&as_type_i_desc, -+ -+ (struct usb_descriptor_header *)&fs_as_in_ep_desc, -+ (struct usb_descriptor_header *)&as_iso_in_desc, -+ NULL, -+}; -+ -+static struct snd_pcm_hardware audio_hw_info = { -+ .info = SNDRV_PCM_INFO_MMAP | -+ SNDRV_PCM_INFO_MMAP_VALID | -+ SNDRV_PCM_INFO_BATCH | -+ SNDRV_PCM_INFO_INTERLEAVED | -+ SNDRV_PCM_INFO_BLOCK_TRANSFER, -+ -+ .formats = SNDRV_PCM_FMTBIT_S16_LE, -+ .channels_min = 2, -+ .channels_max = 2, -+ .rate_min = SAMPLE_RATE, -+ .rate_max = SAMPLE_RATE, -+ -+ .buffer_bytes_max = 1024 * 1024, -+ .period_bytes_min = 64, -+ .period_bytes_max = 512 * 1024, -+ .periods_min = 2, -+ .periods_max = 1024, -+}; -+ -+/*-------------------------------------------------------------------------*/ -+ -+struct audio_source_config { -+ int card; -+ int device; -+}; -+ -+struct audio_dev { -+ struct usb_function func; -+ struct snd_card *card; -+ struct snd_pcm *pcm; -+ struct snd_pcm_substream *substream; -+ -+ struct list_head idle_reqs; -+ struct usb_ep *in_ep; -+ -+ spinlock_t lock; -+ -+ /* beginning, end and current position in our buffer */ -+ void *buffer_start; -+ void *buffer_end; -+ void *buffer_pos; -+ -+ /* byte size of a "period" */ -+ unsigned int period; -+ /* bytes sent since last call to snd_pcm_period_elapsed */ -+ unsigned int period_offset; -+ /* time we started playing */ -+ ktime_t start_time; -+ /* number of frames sent since start_time */ -+ s64 frames_sent; -+ struct audio_source_config *config; -+ /* for creating and issuing QoS requests */ -+ struct pm_qos_request pm_qos; -+}; -+ -+static inline struct audio_dev *func_to_audio(struct usb_function *f) -+{ -+ return container_of(f, struct audio_dev, func); -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+struct audio_source_instance { -+ struct usb_function_instance func_inst; -+ const char *name; -+ struct audio_source_config *config; -+ struct device *audio_device; -+}; -+ -+static void audio_source_attr_release(struct config_item *item); -+ -+static struct configfs_item_operations audio_source_item_ops = { -+ .release = audio_source_attr_release, -+}; -+ -+static struct config_item_type audio_source_func_type = { -+ .ct_item_ops = &audio_source_item_ops, -+ .ct_owner = THIS_MODULE, -+}; -+ -+static ssize_t audio_source_pcm_show(struct device *dev, -+ struct device_attribute *attr, char *buf); -+ -+static DEVICE_ATTR(pcm, S_IRUGO, audio_source_pcm_show, NULL); -+ -+static struct device_attribute *audio_source_function_attributes[] = { -+ &dev_attr_pcm, -+ NULL -+}; -+ -+/*--------------------------------------------------------------------------*/ -+ -+static struct usb_request *audio_request_new(struct usb_ep *ep, int buffer_size) -+{ -+ struct usb_request *req = usb_ep_alloc_request(ep, GFP_KERNEL); -+ -+ if (!req) -+ return NULL; -+ -+ req->buf = kmalloc(buffer_size, GFP_KERNEL); -+ if (!req->buf) { -+ usb_ep_free_request(ep, req); -+ return NULL; -+ } -+ req->length = buffer_size; -+ return req; -+} -+ -+static void audio_request_free(struct usb_request *req, struct usb_ep *ep) -+{ -+ if (req) { -+ kfree(req->buf); -+ usb_ep_free_request(ep, req); -+ } -+} -+ -+static void audio_req_put(struct audio_dev *audio, struct usb_request *req) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&audio->lock, flags); -+ list_add_tail(&req->list, &audio->idle_reqs); -+ spin_unlock_irqrestore(&audio->lock, flags); -+} -+ -+static struct usb_request *audio_req_get(struct audio_dev *audio) -+{ -+ unsigned long flags; -+ struct usb_request *req; -+ -+ spin_lock_irqsave(&audio->lock, flags); -+ if (list_empty(&audio->idle_reqs)) { -+ req = 0; -+ } else { -+ req = list_first_entry(&audio->idle_reqs, struct usb_request, -+ list); -+ list_del(&req->list); -+ } -+ spin_unlock_irqrestore(&audio->lock, flags); -+ return req; -+} -+ -+/* send the appropriate number of packets to match our bitrate */ -+static void audio_send(struct audio_dev *audio) -+{ -+ struct snd_pcm_runtime *runtime; -+ struct usb_request *req; -+ int length, length1, length2, ret; -+ s64 msecs; -+ s64 frames; -+ ktime_t now; -+ -+ /* audio->substream will be null if we have been closed */ -+ if (!audio->substream) -+ return; -+ /* audio->buffer_pos will be null if we have been stopped */ -+ if (!audio->buffer_pos) -+ return; -+ -+ runtime = audio->substream->runtime; -+ -+ /* compute number of frames to send */ -+ now = ktime_get(); -+ msecs = div_s64((ktime_to_ns(now) - ktime_to_ns(audio->start_time)), -+ 1000000); -+ frames = div_s64((msecs * SAMPLE_RATE), 1000); -+ -+ /* Readjust our frames_sent if we fall too far behind. -+ * If we get too far behind it is better to drop some frames than -+ * to keep sending data too fast in an attempt to catch up. -+ */ -+ if (frames - audio->frames_sent > 10 * FRAMES_PER_MSEC) -+ audio->frames_sent = frames - FRAMES_PER_MSEC; -+ -+ frames -= audio->frames_sent; -+ -+ /* We need to send something to keep the pipeline going */ -+ if (frames <= 0) -+ frames = FRAMES_PER_MSEC; -+ -+ while (frames > 0) { -+ req = audio_req_get(audio); -+ if (!req) -+ break; -+ -+ length = frames_to_bytes(runtime, frames); -+ if (length > IN_EP_MAX_PACKET_SIZE) -+ length = IN_EP_MAX_PACKET_SIZE; -+ -+ if (audio->buffer_pos + length > audio->buffer_end) -+ length1 = audio->buffer_end - audio->buffer_pos; -+ else -+ length1 = length; -+ memcpy(req->buf, audio->buffer_pos, length1); -+ if (length1 < length) { -+ /* Wrap around and copy remaining length -+ * at beginning of buffer. -+ */ -+ length2 = length - length1; -+ memcpy(req->buf + length1, audio->buffer_start, -+ length2); -+ audio->buffer_pos = audio->buffer_start + length2; -+ } else { -+ audio->buffer_pos += length1; -+ if (audio->buffer_pos >= audio->buffer_end) -+ audio->buffer_pos = audio->buffer_start; -+ } -+ -+ req->length = length; -+ ret = usb_ep_queue(audio->in_ep, req, GFP_ATOMIC); -+ if (ret < 0) { -+ pr_err("usb_ep_queue failed ret: %d\n", ret); -+ audio_req_put(audio, req); -+ break; -+ } -+ -+ frames -= bytes_to_frames(runtime, length); -+ audio->frames_sent += bytes_to_frames(runtime, length); -+ } -+} -+ -+static void audio_control_complete(struct usb_ep *ep, struct usb_request *req) -+{ -+ /* nothing to do here */ -+} -+ -+static void audio_data_complete(struct usb_ep *ep, struct usb_request *req) -+{ -+ struct audio_dev *audio = req->context; -+ -+ pr_debug("audio_data_complete req->status %d req->actual %d\n", -+ req->status, req->actual); -+ -+ audio_req_put(audio, req); -+ -+ if (!audio->buffer_start || req->status) -+ return; -+ -+ audio->period_offset += req->actual; -+ if (audio->period_offset >= audio->period) { -+ snd_pcm_period_elapsed(audio->substream); -+ audio->period_offset = 0; -+ } -+ audio_send(audio); -+} -+ -+static int audio_set_endpoint_req(struct usb_function *f, -+ const struct usb_ctrlrequest *ctrl) -+{ -+ int value = -EOPNOTSUPP; -+ u16 ep = le16_to_cpu(ctrl->wIndex); -+ u16 len = le16_to_cpu(ctrl->wLength); -+ u16 w_value = le16_to_cpu(ctrl->wValue); -+ -+ pr_debug("bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n", -+ ctrl->bRequest, w_value, len, ep); -+ -+ switch (ctrl->bRequest) { -+ case UAC_SET_CUR: -+ case UAC_SET_MIN: -+ case UAC_SET_MAX: -+ case UAC_SET_RES: -+ value = len; -+ break; -+ default: -+ break; -+ } -+ -+ return value; -+} -+ -+static int audio_get_endpoint_req(struct usb_function *f, -+ const struct usb_ctrlrequest *ctrl) -+{ -+ struct usb_composite_dev *cdev = f->config->cdev; -+ int value = -EOPNOTSUPP; -+ u8 ep = ((le16_to_cpu(ctrl->wIndex) >> 8) & 0xFF); -+ u16 len = le16_to_cpu(ctrl->wLength); -+ u16 w_value = le16_to_cpu(ctrl->wValue); -+ u8 *buf = cdev->req->buf; -+ -+ pr_debug("bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n", -+ ctrl->bRequest, w_value, len, ep); -+ -+ if (w_value == UAC_EP_CS_ATTR_SAMPLE_RATE << 8) { -+ switch (ctrl->bRequest) { -+ case UAC_GET_CUR: -+ case UAC_GET_MIN: -+ case UAC_GET_MAX: -+ case UAC_GET_RES: -+ /* return our sample rate */ -+ buf[0] = (u8)SAMPLE_RATE; -+ buf[1] = (u8)(SAMPLE_RATE >> 8); -+ buf[2] = (u8)(SAMPLE_RATE >> 16); -+ value = 3; -+ break; -+ default: -+ break; -+ } -+ } -+ -+ return value; -+} -+ -+static int -+audio_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) -+{ -+ struct usb_composite_dev *cdev = f->config->cdev; -+ struct usb_request *req = cdev->req; -+ int value = -EOPNOTSUPP; -+ u16 w_index = le16_to_cpu(ctrl->wIndex); -+ u16 w_value = le16_to_cpu(ctrl->wValue); -+ u16 w_length = le16_to_cpu(ctrl->wLength); -+ -+ /* composite driver infrastructure handles everything; interface -+ * activation uses set_alt(). -+ */ -+ switch (ctrl->bRequestType) { -+ case USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT: -+ value = audio_set_endpoint_req(f, ctrl); -+ break; -+ -+ case USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT: -+ value = audio_get_endpoint_req(f, ctrl); -+ break; -+ } -+ -+ /* respond with data transfer or status phase? */ -+ if (value >= 0) { -+ pr_debug("audio req%02x.%02x v%04x i%04x l%d\n", -+ ctrl->bRequestType, ctrl->bRequest, -+ w_value, w_index, w_length); -+ req->zero = 0; -+ req->length = value; -+ req->complete = audio_control_complete; -+ value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); -+ if (value < 0) -+ pr_err("audio response on err %d\n", value); -+ } -+ -+ /* device either stalls (value < 0) or reports success */ -+ return value; -+} -+ -+static int audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt) -+{ -+ struct audio_dev *audio = func_to_audio(f); -+ struct usb_composite_dev *cdev = f->config->cdev; -+ int ret; -+ -+ pr_debug("audio_set_alt intf %d, alt %d\n", intf, alt); -+ -+ ret = config_ep_by_speed(cdev->gadget, f, audio->in_ep); -+ if (ret) -+ return ret; -+ -+ usb_ep_enable(audio->in_ep); -+ return 0; -+} -+ -+static void audio_disable(struct usb_function *f) -+{ -+ struct audio_dev *audio = func_to_audio(f); -+ -+ pr_debug("audio_disable\n"); -+ usb_ep_disable(audio->in_ep); -+} -+ -+static void audio_free_func(struct usb_function *f) -+{ -+ /* no-op */ -+} -+ -+/*-------------------------------------------------------------------------*/ -+ -+static void audio_build_desc(struct audio_dev *audio) -+{ -+ u8 *sam_freq; -+ int rate; -+ -+ /* Set channel numbers */ -+ input_terminal_desc.bNrChannels = 2; -+ as_type_i_desc.bNrChannels = 2; -+ -+ /* Set sample rates */ -+ rate = SAMPLE_RATE; -+ sam_freq = as_type_i_desc.tSamFreq[0]; -+ memcpy(sam_freq, &rate, 3); -+} -+ -+ -+static int snd_card_setup(struct usb_configuration *c, -+ struct audio_source_config *config); -+static struct audio_source_instance *to_fi_audio_source( -+ const struct usb_function_instance *fi); -+ -+ -+/* audio function driver setup/binding */ -+static int -+audio_bind(struct usb_configuration *c, struct usb_function *f) -+{ -+ struct usb_composite_dev *cdev = c->cdev; -+ struct audio_dev *audio = func_to_audio(f); -+ int status; -+ struct usb_ep *ep; -+ struct usb_request *req; -+ int i; -+ int err; -+ -+ if (IS_ENABLED(CONFIG_USB_CONFIGFS)) { -+ struct audio_source_instance *fi_audio = -+ to_fi_audio_source(f->fi); -+ struct audio_source_config *config = -+ fi_audio->config; -+ -+ err = snd_card_setup(c, config); -+ if (err) -+ return err; -+ } -+ -+ audio_build_desc(audio); -+ -+ /* allocate instance-specific interface IDs, and patch descriptors */ -+ status = usb_interface_id(c, f); -+ if (status < 0) -+ goto fail; -+ ac_interface_desc.bInterfaceNumber = status; -+ -+ /* AUDIO_AC_INTERFACE */ -+ ac_header_desc.baInterfaceNr[0] = status; -+ -+ status = usb_interface_id(c, f); -+ if (status < 0) -+ goto fail; -+ as_interface_alt_0_desc.bInterfaceNumber = status; -+ as_interface_alt_1_desc.bInterfaceNumber = status; -+ -+ /* AUDIO_AS_INTERFACE */ -+ ac_header_desc.baInterfaceNr[1] = status; -+ -+ status = -ENODEV; -+ -+ /* allocate our endpoint */ -+ ep = usb_ep_autoconfig(cdev->gadget, &fs_as_in_ep_desc); -+ if (!ep) -+ goto fail; -+ audio->in_ep = ep; -+ ep->driver_data = audio; /* claim */ -+ -+ if (gadget_is_dualspeed(c->cdev->gadget)) -+ hs_as_in_ep_desc.bEndpointAddress = -+ fs_as_in_ep_desc.bEndpointAddress; -+ -+ f->fs_descriptors = fs_audio_desc; -+ f->hs_descriptors = hs_audio_desc; -+ -+ for (i = 0, status = 0; i < IN_EP_REQ_COUNT && status == 0; i++) { -+ req = audio_request_new(ep, IN_EP_MAX_PACKET_SIZE); -+ if (req) { -+ req->context = audio; -+ req->complete = audio_data_complete; -+ audio_req_put(audio, req); -+ } else -+ status = -ENOMEM; -+ } -+ -+fail: -+ return status; -+} -+ -+static void -+audio_unbind(struct usb_configuration *c, struct usb_function *f) -+{ -+ struct audio_dev *audio = func_to_audio(f); -+ struct usb_request *req; -+ -+ while ((req = audio_req_get(audio))) -+ audio_request_free(req, audio->in_ep); -+ -+ snd_card_free_when_closed(audio->card); -+ audio->card = NULL; -+ audio->pcm = NULL; -+ audio->substream = NULL; -+ audio->in_ep = NULL; -+ -+ if (IS_ENABLED(CONFIG_USB_CONFIGFS)) { -+ struct audio_source_instance *fi_audio = -+ to_fi_audio_source(f->fi); -+ struct audio_source_config *config = -+ fi_audio->config; -+ -+ config->card = -1; -+ config->device = -1; -+ } -+} -+ -+static void audio_pcm_playback_start(struct audio_dev *audio) -+{ -+ audio->start_time = ktime_get(); -+ audio->frames_sent = 0; -+ audio_send(audio); -+} -+ -+static void audio_pcm_playback_stop(struct audio_dev *audio) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&audio->lock, flags); -+ audio->buffer_start = 0; -+ audio->buffer_end = 0; -+ audio->buffer_pos = 0; -+ spin_unlock_irqrestore(&audio->lock, flags); -+} -+ -+static int audio_pcm_open(struct snd_pcm_substream *substream) -+{ -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ struct audio_dev *audio = substream->private_data; -+ -+ runtime->private_data = audio; -+ runtime->hw = audio_hw_info; -+ snd_pcm_limit_hw_rates(runtime); -+ runtime->hw.channels_max = 2; -+ -+ audio->substream = substream; -+ -+ /* Add the QoS request and set the latency to 0 */ -+ cpu_latency_qos_add_request(&audio->pm_qos, 0); -+ -+ return 0; -+} -+ -+static int audio_pcm_close(struct snd_pcm_substream *substream) -+{ -+ struct audio_dev *audio = substream->private_data; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&audio->lock, flags); -+ -+ /* Remove the QoS request */ -+ cpu_latency_qos_remove_request(&audio->pm_qos); -+ -+ audio->substream = NULL; -+ spin_unlock_irqrestore(&audio->lock, flags); -+ -+ return 0; -+} -+ -+static int audio_pcm_hw_params(struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *params) -+{ -+ unsigned int channels = params_channels(params); -+ unsigned int rate = params_rate(params); -+ -+ if (rate != SAMPLE_RATE) -+ return -EINVAL; -+ if (channels != 2) -+ return -EINVAL; -+ -+ return snd_pcm_lib_alloc_vmalloc_buffer(substream, -+ params_buffer_bytes(params)); -+} -+ -+static int audio_pcm_hw_free(struct snd_pcm_substream *substream) -+{ -+ return snd_pcm_lib_free_vmalloc_buffer(substream); -+} -+ -+static int audio_pcm_prepare(struct snd_pcm_substream *substream) -+{ -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ struct audio_dev *audio = runtime->private_data; -+ -+ audio->period = snd_pcm_lib_period_bytes(substream); -+ audio->period_offset = 0; -+ audio->buffer_start = runtime->dma_area; -+ audio->buffer_end = audio->buffer_start -+ + snd_pcm_lib_buffer_bytes(substream); -+ audio->buffer_pos = audio->buffer_start; -+ -+ return 0; -+} -+ -+static snd_pcm_uframes_t audio_pcm_pointer(struct snd_pcm_substream *substream) -+{ -+ struct snd_pcm_runtime *runtime = substream->runtime; -+ struct audio_dev *audio = runtime->private_data; -+ ssize_t bytes = audio->buffer_pos - audio->buffer_start; -+ -+ /* return offset of next frame to fill in our buffer */ -+ return bytes_to_frames(runtime, bytes); -+} -+ -+static int audio_pcm_playback_trigger(struct snd_pcm_substream *substream, -+ int cmd) -+{ -+ struct audio_dev *audio = substream->runtime->private_data; -+ int ret = 0; -+ -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ case SNDRV_PCM_TRIGGER_RESUME: -+ audio_pcm_playback_start(audio); -+ break; -+ -+ case SNDRV_PCM_TRIGGER_STOP: -+ case SNDRV_PCM_TRIGGER_SUSPEND: -+ audio_pcm_playback_stop(audio); -+ break; -+ -+ default: -+ ret = -EINVAL; -+ } -+ -+ return ret; -+} -+ -+static struct audio_dev _audio_dev = { -+ .func = { -+ .name = "audio_source", -+ .bind = audio_bind, -+ .unbind = audio_unbind, -+ .set_alt = audio_set_alt, -+ .setup = audio_setup, -+ .disable = audio_disable, -+ .free_func = audio_free_func, -+ }, -+ .lock = __SPIN_LOCK_UNLOCKED(_audio_dev.lock), -+ .idle_reqs = LIST_HEAD_INIT(_audio_dev.idle_reqs), -+}; -+ -+static struct snd_pcm_ops audio_playback_ops = { -+ .open = audio_pcm_open, -+ .close = audio_pcm_close, -+ .ioctl = snd_pcm_lib_ioctl, -+ .hw_params = audio_pcm_hw_params, -+ .hw_free = audio_pcm_hw_free, -+ .prepare = audio_pcm_prepare, -+ .trigger = audio_pcm_playback_trigger, -+ .pointer = audio_pcm_pointer, -+}; -+ -+int audio_source_bind_config(struct usb_configuration *c, -+ struct audio_source_config *config) -+{ -+ struct audio_dev *audio; -+ int err; -+ -+ config->card = -1; -+ config->device = -1; -+ -+ audio = &_audio_dev; -+ -+ err = snd_card_setup(c, config); -+ if (err) -+ return err; -+ -+ err = usb_add_function(c, &audio->func); -+ if (err) -+ goto add_fail; -+ -+ return 0; -+ -+add_fail: -+ snd_card_free(audio->card); -+ return err; -+} -+ -+static int snd_card_setup(struct usb_configuration *c, -+ struct audio_source_config *config) -+{ -+ struct audio_dev *audio; -+ struct snd_card *card; -+ struct snd_pcm *pcm; -+ int err; -+ -+ audio = &_audio_dev; -+ -+ err = snd_card_new(&c->cdev->gadget->dev, -+ SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, -+ THIS_MODULE, 0, &card); -+ if (err) -+ return err; -+ -+ err = snd_pcm_new(card, "USB audio source", 0, 1, 0, &pcm); -+ if (err) -+ goto pcm_fail; -+ -+ pcm->private_data = audio; -+ pcm->info_flags = 0; -+ audio->pcm = pcm; -+ -+ strlcpy(pcm->name, "USB gadget audio", sizeof(pcm->name)); -+ -+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &audio_playback_ops); -+ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, -+ NULL, 0, 64 * 1024); -+ -+ strlcpy(card->driver, "audio_source", sizeof(card->driver)); -+ strlcpy(card->shortname, card->driver, sizeof(card->shortname)); -+ strlcpy(card->longname, "USB accessory audio source", -+ sizeof(card->longname)); -+ -+ err = snd_card_register(card); -+ if (err) -+ goto register_fail; -+ -+ config->card = pcm->card->number; -+ config->device = pcm->device; -+ audio->card = card; -+ return 0; -+ -+register_fail: -+pcm_fail: -+ snd_card_free(audio->card); -+ return err; -+} -+ -+static struct audio_source_instance *to_audio_source_instance( -+ struct config_item *item) -+{ -+ return container_of(to_config_group(item), struct audio_source_instance, -+ func_inst.group); -+} -+ -+static struct audio_source_instance *to_fi_audio_source( -+ const struct usb_function_instance *fi) -+{ -+ return container_of(fi, struct audio_source_instance, func_inst); -+} -+ -+static void audio_source_attr_release(struct config_item *item) -+{ -+ struct audio_source_instance *fi_audio = to_audio_source_instance(item); -+ -+ usb_put_function_instance(&fi_audio->func_inst); -+} -+ -+static int audio_source_set_inst_name(struct usb_function_instance *fi, -+ const char *name) -+{ -+ struct audio_source_instance *fi_audio; -+ char *ptr; -+ int name_len; -+ -+ name_len = strlen(name) + 1; -+ if (name_len > MAX_INST_NAME_LEN) -+ return -ENAMETOOLONG; -+ -+ ptr = kstrndup(name, name_len, GFP_KERNEL); -+ if (!ptr) -+ return -ENOMEM; -+ -+ fi_audio = to_fi_audio_source(fi); -+ fi_audio->name = ptr; -+ -+ return 0; -+} -+ -+static void audio_source_free_inst(struct usb_function_instance *fi) -+{ -+ struct audio_source_instance *fi_audio; -+ -+ fi_audio = to_fi_audio_source(fi); -+ device_destroy(fi_audio->audio_device->class, -+ fi_audio->audio_device->devt); -+ kfree(fi_audio->name); -+ kfree(fi_audio->config); -+} -+ -+static ssize_t audio_source_pcm_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct audio_source_instance *fi_audio = dev_get_drvdata(dev); -+ struct audio_source_config *config = fi_audio->config; -+ -+ /* print PCM card and device numbers */ -+ return sprintf(buf, "%d %d\n", config->card, config->device); -+} -+ -+struct device *create_function_device(char *name); -+ -+static struct usb_function_instance *audio_source_alloc_inst(void) -+{ -+ struct audio_source_instance *fi_audio; -+ struct device_attribute **attrs; -+ struct device_attribute *attr; -+ struct device *dev; -+ void *err_ptr; -+ int err = 0; -+ -+ fi_audio = kzalloc(sizeof(*fi_audio), GFP_KERNEL); -+ if (!fi_audio) -+ return ERR_PTR(-ENOMEM); -+ -+ fi_audio->func_inst.set_inst_name = audio_source_set_inst_name; -+ fi_audio->func_inst.free_func_inst = audio_source_free_inst; -+ -+ fi_audio->config = kzalloc(sizeof(struct audio_source_config), -+ GFP_KERNEL); -+ if (!fi_audio->config) { -+ err_ptr = ERR_PTR(-ENOMEM); -+ goto fail_audio; -+ } -+ -+ config_group_init_type_name(&fi_audio->func_inst.group, "", -+ &audio_source_func_type); -+ dev = create_function_device("f_audio_source"); -+ -+ if (IS_ERR(dev)) { -+ err_ptr = dev; -+ goto fail_audio_config; -+ } -+ -+ fi_audio->config->card = -1; -+ fi_audio->config->device = -1; -+ fi_audio->audio_device = dev; -+ -+ attrs = audio_source_function_attributes; -+ if (attrs) { -+ while ((attr = *attrs++) && !err) -+ err = device_create_file(dev, attr); -+ if (err) { -+ err_ptr = ERR_PTR(-EINVAL); -+ goto fail_device; -+ } -+ } -+ -+ dev_set_drvdata(dev, fi_audio); -+ _audio_dev.config = fi_audio->config; -+ -+ return &fi_audio->func_inst; -+ -+fail_device: -+ device_destroy(dev->class, dev->devt); -+fail_audio_config: -+ kfree(fi_audio->config); -+fail_audio: -+ kfree(fi_audio); -+ return err_ptr; -+ -+} -+ -+static struct usb_function *audio_source_alloc(struct usb_function_instance *fi) -+{ -+ return &_audio_dev.func; -+} -+ -+DECLARE_USB_FUNCTION_INIT(audio_source, audio_source_alloc_inst, -+ audio_source_alloc); -+MODULE_LICENSE("GPL"); diff --git a/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_midi-create-F_midi-device.patch b/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_midi-create-F_midi-device.patch deleted file mode 100644 index ae8af3c0..00000000 --- a/android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_midi-create-F_midi-device.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Badhri Jagan Sridharan <Badhri@google.com> -Date: Wed, 2 Sep 2015 22:49:10 -0700 -Subject: NOUPSTREAM: ANDROID: usb: gadget: f_midi: create F_midi device - -Android frameworks relies on the alsa -config reported by the f_midi device. - -[CPNOTE: 19/07/21] Lee: Should be re-written to use upstream APIs - pinged Badhri - -Bug: 111003288 -Bug: 120441124 -Change-Id: I0695e00b166fd953f50acea93802245b0d5a5240 -[badhri: The framework should be moved away from this] -Signed-off-by: Badhri Jagan Sridharan <badhri@google.com> -Signed-off-by: Lee Jones <joneslee@google.com> ---- - drivers/usb/gadget/function/f_midi.c | 66 ++++++++++++++++++++++++++++ - 1 file changed, 66 insertions(+) - -diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c ---- a/drivers/usb/gadget/function/f_midi.c -+++ b/drivers/usb/gadget/function/f_midi.c -@@ -1258,6 +1258,65 @@ static void f_midi_free_inst(struct usb_function_instance *f) - } - } - -+#ifdef CONFIG_USB_CONFIGFS_UEVENT -+extern struct device *create_function_device(char *name); -+static ssize_t alsa_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct usb_function_instance *fi_midi = dev_get_drvdata(dev); -+ struct f_midi *midi; -+ -+ if (!fi_midi->f) -+ dev_warn(dev, "f_midi: function not set\n"); -+ -+ if (fi_midi && fi_midi->f) { -+ midi = func_to_midi(fi_midi->f); -+ if (midi->rmidi && midi->card && midi->rmidi->card) -+ return sprintf(buf, "%d %d\n", -+ midi->rmidi->card->number, midi->rmidi->device); -+ } -+ -+ /* print PCM card and device numbers */ -+ return sprintf(buf, "%d %d\n", -1, -1); -+} -+ -+static DEVICE_ATTR(alsa, S_IRUGO, alsa_show, NULL); -+ -+static struct device_attribute *alsa_function_attributes[] = { -+ &dev_attr_alsa, -+ NULL -+}; -+ -+static int create_alsa_device(struct usb_function_instance *fi) -+{ -+ struct device *dev; -+ struct device_attribute **attrs; -+ struct device_attribute *attr; -+ int err = 0; -+ -+ dev = create_function_device("f_midi"); -+ if (IS_ERR(dev)) -+ return PTR_ERR(dev); -+ -+ attrs = alsa_function_attributes; -+ if (attrs) { -+ while ((attr = *attrs++) && !err) -+ err = device_create_file(dev, attr); -+ if (err) { -+ device_destroy(dev->class, dev->devt); -+ return -EINVAL; -+ } -+ } -+ dev_set_drvdata(dev, fi); -+ return 0; -+} -+#else -+static int create_alsa_device(struct usb_function_instance *fi) -+{ -+ return 0; -+} -+#endif -+ - static struct usb_function_instance *f_midi_alloc_inst(void) - { - struct f_midi_opts *opts; -@@ -1276,6 +1335,11 @@ static struct usb_function_instance *f_midi_alloc_inst(void) - opts->out_ports = 1; - opts->refcnt = 1; - -+ if (create_alsa_device(&opts->func_inst)) { -+ kfree(opts); -+ return ERR_PTR(-ENODEV); -+ } -+ - config_group_init_type_name(&opts->func_inst.group, "", - &midi_func_type); - -@@ -1296,6 +1360,7 @@ static void f_midi_free(struct usb_function *f) - kfifo_free(&midi->in_req_fifo); - kfree(midi); - free = true; -+ opts->func_inst.f = NULL; - } - mutex_unlock(&opts->lock); - -@@ -1383,6 +1448,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) - midi->func.disable = f_midi_disable; - midi->func.free_func = f_midi_free; - -+ fi->f = &midi->func; - return &midi->func; - - midi_free: diff --git a/android-mainline/Revert-ALSA-hda-cirrus_scodec-Add-KUnit-test.patch b/android-mainline/Revert-ALSA-hda-cirrus_scodec-Add-KUnit-test.patch new file mode 100644 index 00000000..04fdd15c --- /dev/null +++ b/android-mainline/Revert-ALSA-hda-cirrus_scodec-Add-KUnit-test.patch @@ -0,0 +1,459 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman <gregkh@google.com> +Date: Thu, 14 Dec 2023 11:29:55 +0000 +Subject: Revert "ALSA: hda: cirrus_scodec: Add KUnit test" + +This reverts commit 2144833e7b41459fa2d52bb0676f0ab4920cf32c. + +It breaks the Android build under clang, and there does not seem to be +any upstream reports about this. As it's only showing up in +'allmodconfig' builds, it's not relevant for Android systems at this +point in time. + +Change-Id: I49b26b30d2ae467a9f950030bf7c04fafa18dde0 +Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> +--- + sound/pci/hda/Kconfig | 13 - + sound/pci/hda/Makefile | 2 - + sound/pci/hda/cirrus_scodec_test.c | 370 ----------------------------- + sound/pci/hda/cs35l56_hda.c | 10 - + 4 files changed, 395 deletions(-) + delete mode 100644 sound/pci/hda/cirrus_scodec_test.c + +diff --git a/sound/pci/hda/Kconfig b/sound/pci/hda/Kconfig +--- a/sound/pci/hda/Kconfig ++++ b/sound/pci/hda/Kconfig +@@ -94,19 +94,6 @@ config SND_HDA_PATCH_LOADER + config SND_HDA_CIRRUS_SCODEC + tristate + +-config SND_HDA_CIRRUS_SCODEC_KUNIT_TEST +- tristate "KUnit test for Cirrus side-codec library" if !KUNIT_ALL_TESTS +- select SND_HDA_CIRRUS_SCODEC +- select GPIOLIB +- depends on KUNIT +- default KUNIT_ALL_TESTS +- help +- This builds KUnit tests for the cirrus side-codec library. +- For more information on KUnit and unit tests in general, +- please refer to the KUnit documentation in +- Documentation/dev-tools/kunit/. +- If in doubt, say "N". +- + config SND_HDA_SCODEC_CS35L41 + tristate + select SND_HDA_GENERIC +diff --git a/sound/pci/hda/Makefile b/sound/pci/hda/Makefile +--- a/sound/pci/hda/Makefile ++++ b/sound/pci/hda/Makefile +@@ -29,7 +29,6 @@ snd-hda-codec-hdmi-objs := patch_hdmi.o hda_eld.o + + # side codecs + snd-hda-cirrus-scodec-objs := cirrus_scodec.o +-snd-hda-cirrus-scodec-test-objs := cirrus_scodec_test.o + snd-hda-scodec-cs35l41-objs := cs35l41_hda.o cs35l41_hda_property.o + snd-hda-scodec-cs35l41-i2c-objs := cs35l41_hda_i2c.o + snd-hda-scodec-cs35l41-spi-objs := cs35l41_hda_spi.o +@@ -59,7 +58,6 @@ obj-$(CONFIG_SND_HDA_CODEC_HDMI) += snd-hda-codec-hdmi.o + + # side codecs + obj-$(CONFIG_SND_HDA_CIRRUS_SCODEC) += snd-hda-cirrus-scodec.o +-obj-$(CONFIG_SND_HDA_CIRRUS_SCODEC_KUNIT_TEST) += snd-hda-cirrus-scodec-test.o + obj-$(CONFIG_SND_HDA_SCODEC_CS35L41) += snd-hda-scodec-cs35l41.o + obj-$(CONFIG_SND_HDA_SCODEC_CS35L41_I2C) += snd-hda-scodec-cs35l41-i2c.o + obj-$(CONFIG_SND_HDA_SCODEC_CS35L41_SPI) += snd-hda-scodec-cs35l41-spi.o +diff --git a/sound/pci/hda/cirrus_scodec_test.c b/sound/pci/hda/cirrus_scodec_test.c +deleted file mode 100644 +--- a/sound/pci/hda/cirrus_scodec_test.c ++++ /dev/null +@@ -1,370 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0-only +-// +-// KUnit test for the Cirrus side-codec library. +-// +-// Copyright (C) 2023 Cirrus Logic, Inc. and +-// Cirrus Logic International Semiconductor Ltd. +- +-#include <kunit/test.h> +-#include <linux/gpio/driver.h> +-#include <linux/module.h> +-#include <linux/platform_device.h> +- +-#include "cirrus_scodec.h" +- +-struct cirrus_scodec_test_gpio { +- unsigned int pin_state; +- struct gpio_chip chip; +-}; +- +-struct cirrus_scodec_test_priv { +- struct platform_device amp_pdev; +- struct platform_device *gpio_pdev; +- struct cirrus_scodec_test_gpio *gpio_priv; +-}; +- +-static int cirrus_scodec_test_gpio_get_direction(struct gpio_chip *chip, +- unsigned int offset) +-{ +- return GPIO_LINE_DIRECTION_IN; +-} +- +-static int cirrus_scodec_test_gpio_direction_in(struct gpio_chip *chip, +- unsigned int offset) +-{ +- return 0; +-} +- +-static int cirrus_scodec_test_gpio_get(struct gpio_chip *chip, unsigned int offset) +-{ +- struct cirrus_scodec_test_gpio *gpio_priv = gpiochip_get_data(chip); +- +- return !!(gpio_priv->pin_state & BIT(offset)); +-} +- +-static int cirrus_scodec_test_gpio_direction_out(struct gpio_chip *chip, +- unsigned int offset, int value) +-{ +- return -EOPNOTSUPP; +-} +- +-static void cirrus_scodec_test_gpio_set(struct gpio_chip *chip, unsigned int offset, +- int value) +-{ +-} +- +-static int cirrus_scodec_test_gpio_set_config(struct gpio_chip *gc, +- unsigned int offset, +- unsigned long config) +-{ +- switch (pinconf_to_config_param(config)) { +- case PIN_CONFIG_OUTPUT: +- case PIN_CONFIG_OUTPUT_ENABLE: +- return -EOPNOTSUPP; +- default: +- return 0; +- } +-} +- +-static const struct gpio_chip cirrus_scodec_test_gpio_chip = { +- .label = "cirrus_scodec_test_gpio", +- .owner = THIS_MODULE, +- .request = gpiochip_generic_request, +- .free = gpiochip_generic_free, +- .get_direction = cirrus_scodec_test_gpio_get_direction, +- .direction_input = cirrus_scodec_test_gpio_direction_in, +- .get = cirrus_scodec_test_gpio_get, +- .direction_output = cirrus_scodec_test_gpio_direction_out, +- .set = cirrus_scodec_test_gpio_set, +- .set_config = cirrus_scodec_test_gpio_set_config, +- .base = -1, +- .ngpio = 32, +-}; +- +-static int cirrus_scodec_test_gpio_probe(struct platform_device *pdev) +-{ +- struct cirrus_scodec_test_gpio *gpio_priv; +- int ret; +- +- gpio_priv = devm_kzalloc(&pdev->dev, sizeof(*gpio_priv), GFP_KERNEL); +- if (!gpio_priv) +- return -ENOMEM; +- +- /* GPIO core modifies our struct gpio_chip so use a copy */ +- gpio_priv->chip = cirrus_scodec_test_gpio_chip; +- ret = devm_gpiochip_add_data(&pdev->dev, &gpio_priv->chip, gpio_priv); +- if (ret) +- return dev_err_probe(&pdev->dev, ret, "Failed to add gpiochip\n"); +- +- dev_set_drvdata(&pdev->dev, gpio_priv); +- +- return 0; +-} +- +-static struct platform_driver cirrus_scodec_test_gpio_driver = { +- .driver.name = "cirrus_scodec_test_gpio_drv", +- .probe = cirrus_scodec_test_gpio_probe, +-}; +- +-/* software_node referencing the gpio driver */ +-static const struct software_node cirrus_scodec_test_gpio_swnode = { +- .name = "cirrus_scodec_test_gpio", +-}; +- +-static int cirrus_scodec_test_create_gpio(struct kunit *test) +-{ +- struct cirrus_scodec_test_priv *priv = test->priv; +- int ret; +- +- priv->gpio_pdev = platform_device_alloc(cirrus_scodec_test_gpio_driver.driver.name, -1); +- if (!priv->gpio_pdev) +- return -ENOMEM; +- +- ret = device_add_software_node(&priv->gpio_pdev->dev, &cirrus_scodec_test_gpio_swnode); +- if (ret) { +- platform_device_put(priv->gpio_pdev); +- KUNIT_FAIL(test, "Failed to add swnode to gpio: %d\n", ret); +- return ret; +- } +- +- ret = platform_device_add(priv->gpio_pdev); +- if (ret) { +- platform_device_put(priv->gpio_pdev); +- KUNIT_FAIL(test, "Failed to add gpio platform device: %d\n", ret); +- return ret; +- } +- +- priv->gpio_priv = dev_get_drvdata(&priv->gpio_pdev->dev); +- if (!priv->gpio_priv) { +- platform_device_put(priv->gpio_pdev); +- KUNIT_FAIL(test, "Failed to get gpio private data\n"); +- return -EINVAL; +- } +- +- return 0; +-} +- +-static void cirrus_scodec_test_set_gpio_ref_arg(struct software_node_ref_args *arg, +- int gpio_num) +-{ +- struct software_node_ref_args template = +- SOFTWARE_NODE_REFERENCE(&cirrus_scodec_test_gpio_swnode, gpio_num, 0); +- +- *arg = template; +-} +- +-static int cirrus_scodec_test_set_spkid_swnode(struct kunit *test, +- struct device *dev, +- struct software_node_ref_args *args, +- int num_args) +-{ +- const struct property_entry props_template[] = { +- PROPERTY_ENTRY_REF_ARRAY_LEN("spk-id-gpios", args, num_args), +- { } +- }; +- struct property_entry *props; +- struct software_node *node; +- +- node = kunit_kzalloc(test, sizeof(*node), GFP_KERNEL); +- if (!node) +- return -ENOMEM; +- +- props = kunit_kzalloc(test, sizeof(props_template), GFP_KERNEL); +- if (!props) +- return -ENOMEM; +- +- memcpy(props, props_template, sizeof(props_template)); +- node->properties = props; +- +- return device_add_software_node(dev, node); +-} +- +-struct cirrus_scodec_test_spkid_param { +- int num_amps; +- int gpios_per_amp; +- int num_amps_sharing; +-}; +- +-static void cirrus_scodec_test_spkid_parse(struct kunit *test) +-{ +- struct cirrus_scodec_test_priv *priv = test->priv; +- const struct cirrus_scodec_test_spkid_param *param = test->param_value; +- int num_spk_id_refs = param->num_amps * param->gpios_per_amp; +- struct software_node_ref_args *refs; +- struct device *dev = &priv->amp_pdev.dev; +- unsigned int v; +- int i, ret; +- +- refs = kunit_kcalloc(test, num_spk_id_refs, sizeof(*refs), GFP_KERNEL); +- KUNIT_ASSERT_NOT_NULL(test, refs); +- +- for (i = 0, v = 0; i < num_spk_id_refs; ) { +- cirrus_scodec_test_set_gpio_ref_arg(&refs[i++], v++); +- +- /* +- * If amps are sharing GPIOs repeat the last set of +- * GPIOs until we've done that number of amps. +- * We have done all GPIOs for an amp when i is a multiple +- * of gpios_per_amp. +- * We have done all amps sharing the same GPIOs when i is +- * a multiple of (gpios_per_amp * num_amps_sharing). +- */ +- if (!(i % param->gpios_per_amp) && +- (i % (param->gpios_per_amp * param->num_amps_sharing))) +- v -= param->gpios_per_amp; +- } +- +- ret = cirrus_scodec_test_set_spkid_swnode(test, dev, refs, num_spk_id_refs); +- KUNIT_EXPECT_EQ_MSG(test, ret, 0, "Failed to add swnode\n"); +- +- for (i = 0; i < param->num_amps; ++i) { +- for (v = 0; v < (1 << param->gpios_per_amp); ++v) { +- /* Set only the GPIO bits used by this amp */ +- priv->gpio_priv->pin_state = +- v << (param->gpios_per_amp * (i / param->num_amps_sharing)); +- +- ret = cirrus_scodec_get_speaker_id(dev, i, param->num_amps, -1); +- KUNIT_EXPECT_EQ_MSG(test, ret, v, +- "get_speaker_id failed amp:%d pin_state:%#x\n", +- i, priv->gpio_priv->pin_state); +- } +- } +-} +- +-static void cirrus_scodec_test_no_spkid(struct kunit *test) +-{ +- struct cirrus_scodec_test_priv *priv = test->priv; +- struct device *dev = &priv->amp_pdev.dev; +- int ret; +- +- ret = cirrus_scodec_get_speaker_id(dev, 0, 4, -1); +- KUNIT_EXPECT_EQ(test, ret, -ENOENT); +-} +- +-static void cirrus_scodec_test_dev_release(struct device *dev) +-{ +-} +- +-static int cirrus_scodec_test_case_init(struct kunit *test) +-{ +- struct cirrus_scodec_test_priv *priv; +- int ret; +- +- priv = kunit_kzalloc(test, sizeof(*priv), GFP_KERNEL); +- if (!priv) +- return -ENOMEM; +- +- test->priv = priv; +- +- /* Create dummy GPIO */ +- ret = cirrus_scodec_test_create_gpio(test); +- if (ret < 0) +- return ret; +- +- /* Create dummy amp driver dev */ +- priv->amp_pdev.name = "cirrus_scodec_test_amp_drv"; +- priv->amp_pdev.id = -1; +- priv->amp_pdev.dev.release = cirrus_scodec_test_dev_release; +- ret = platform_device_register(&priv->amp_pdev); +- KUNIT_ASSERT_GE_MSG(test, ret, 0, "Failed to register amp platform device\n"); +- +- return 0; +-} +- +-static void cirrus_scodec_test_case_exit(struct kunit *test) +-{ +- struct cirrus_scodec_test_priv *priv = test->priv; +- +- if (priv->amp_pdev.name) +- platform_device_unregister(&priv->amp_pdev); +- +- if (priv->gpio_pdev) { +- device_remove_software_node(&priv->gpio_pdev->dev); +- platform_device_unregister(priv->gpio_pdev); +- } +-} +- +-static int cirrus_scodec_test_suite_init(struct kunit_suite *suite) +-{ +- int ret; +- +- /* Register mock GPIO driver */ +- ret = platform_driver_register(&cirrus_scodec_test_gpio_driver); +- if (ret < 0) { +- kunit_err(suite, "Failed to register gpio platform driver, %d\n", ret); +- return ret; +- } +- +- return 0; +-} +- +-static void cirrus_scodec_test_suite_exit(struct kunit_suite *suite) +-{ +- platform_driver_unregister(&cirrus_scodec_test_gpio_driver); +-} +- +-static const struct cirrus_scodec_test_spkid_param cirrus_scodec_test_spkid_param_cases[] = { +- { .num_amps = 2, .gpios_per_amp = 1, .num_amps_sharing = 1 }, +- { .num_amps = 2, .gpios_per_amp = 2, .num_amps_sharing = 1 }, +- { .num_amps = 2, .gpios_per_amp = 3, .num_amps_sharing = 1 }, +- { .num_amps = 2, .gpios_per_amp = 4, .num_amps_sharing = 1 }, +- { .num_amps = 3, .gpios_per_amp = 1, .num_amps_sharing = 1 }, +- { .num_amps = 3, .gpios_per_amp = 2, .num_amps_sharing = 1 }, +- { .num_amps = 3, .gpios_per_amp = 3, .num_amps_sharing = 1 }, +- { .num_amps = 3, .gpios_per_amp = 4, .num_amps_sharing = 1 }, +- { .num_amps = 4, .gpios_per_amp = 1, .num_amps_sharing = 1 }, +- { .num_amps = 4, .gpios_per_amp = 2, .num_amps_sharing = 1 }, +- { .num_amps = 4, .gpios_per_amp = 3, .num_amps_sharing = 1 }, +- { .num_amps = 4, .gpios_per_amp = 4, .num_amps_sharing = 1 }, +- +- /* Same GPIO shared by all amps */ +- { .num_amps = 2, .gpios_per_amp = 1, .num_amps_sharing = 2 }, +- { .num_amps = 2, .gpios_per_amp = 2, .num_amps_sharing = 2 }, +- { .num_amps = 2, .gpios_per_amp = 3, .num_amps_sharing = 2 }, +- { .num_amps = 2, .gpios_per_amp = 4, .num_amps_sharing = 2 }, +- { .num_amps = 3, .gpios_per_amp = 1, .num_amps_sharing = 3 }, +- { .num_amps = 3, .gpios_per_amp = 2, .num_amps_sharing = 3 }, +- { .num_amps = 3, .gpios_per_amp = 3, .num_amps_sharing = 3 }, +- { .num_amps = 3, .gpios_per_amp = 4, .num_amps_sharing = 3 }, +- { .num_amps = 4, .gpios_per_amp = 1, .num_amps_sharing = 4 }, +- { .num_amps = 4, .gpios_per_amp = 2, .num_amps_sharing = 4 }, +- { .num_amps = 4, .gpios_per_amp = 3, .num_amps_sharing = 4 }, +- { .num_amps = 4, .gpios_per_amp = 4, .num_amps_sharing = 4 }, +- +- /* Two sets of shared GPIOs */ +- { .num_amps = 4, .gpios_per_amp = 1, .num_amps_sharing = 2 }, +- { .num_amps = 4, .gpios_per_amp = 2, .num_amps_sharing = 2 }, +- { .num_amps = 4, .gpios_per_amp = 3, .num_amps_sharing = 2 }, +- { .num_amps = 4, .gpios_per_amp = 4, .num_amps_sharing = 2 }, +-}; +- +-static void cirrus_scodec_test_spkid_param_desc(const struct cirrus_scodec_test_spkid_param *param, +- char *desc) +-{ +- snprintf(desc, KUNIT_PARAM_DESC_SIZE, "amps:%d gpios_per_amp:%d num_amps_sharing:%d", +- param->num_amps, param->gpios_per_amp, param->num_amps_sharing); +-} +- +-KUNIT_ARRAY_PARAM(cirrus_scodec_test_spkid, cirrus_scodec_test_spkid_param_cases, +- cirrus_scodec_test_spkid_param_desc); +- +-static struct kunit_case cirrus_scodec_test_cases[] = { +- KUNIT_CASE_PARAM(cirrus_scodec_test_spkid_parse, cirrus_scodec_test_spkid_gen_params), +- KUNIT_CASE(cirrus_scodec_test_no_spkid), +- { } /* terminator */ +-}; +- +-static struct kunit_suite cirrus_scodec_test_suite = { +- .name = "snd-hda-scodec-cs35l56-test", +- .suite_init = cirrus_scodec_test_suite_init, +- .suite_exit = cirrus_scodec_test_suite_exit, +- .init = cirrus_scodec_test_case_init, +- .exit = cirrus_scodec_test_case_exit, +- .test_cases = cirrus_scodec_test_cases, +-}; +- +-kunit_test_suite(cirrus_scodec_test_suite); +- +-MODULE_IMPORT_NS(SND_HDA_CIRRUS_SCODEC); +-MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.cirrus.com>"); +-MODULE_LICENSE("GPL"); +diff --git a/sound/pci/hda/cs35l56_hda.c b/sound/pci/hda/cs35l56_hda.c +--- a/sound/pci/hda/cs35l56_hda.c ++++ b/sound/pci/hda/cs35l56_hda.c +@@ -1035,16 +1035,6 @@ const struct dev_pm_ops cs35l56_hda_pm_ops = { + }; + EXPORT_SYMBOL_NS_GPL(cs35l56_hda_pm_ops, SND_HDA_SCODEC_CS35L56); + +-#if IS_ENABLED(CONFIG_SND_HDA_SCODEC_CS35L56_KUNIT_TEST) +-/* Hooks to export static function to KUnit test */ +- +-int cs35l56_hda_test_hook_get_speaker_id(struct device *dev, int amp_index, int num_amps) +-{ +- return cs35l56_hda_get_speaker_id(dev, amp_index, num_amps); +-} +-EXPORT_SYMBOL_NS_GPL(cs35l56_hda_test_hook_get_speaker_id, SND_HDA_SCODEC_CS35L56); +-#endif +- + MODULE_DESCRIPTION("CS35L56 HDA Driver"); + MODULE_IMPORT_NS(SND_HDA_CIRRUS_SCODEC); + MODULE_IMPORT_NS(SND_HDA_CS_DSP_CONTROLS); diff --git a/android-mainline/Revert-crypto-pkcs7-remove-sha1-support.patch b/android-mainline/Revert-crypto-pkcs7-remove-sha1-support.patch new file mode 100644 index 00000000..7b5735ce --- /dev/null +++ b/android-mainline/Revert-crypto-pkcs7-remove-sha1-support.patch @@ -0,0 +1,267 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman <gregkh@google.com> +Date: Fri, 15 Dec 2023 16:57:17 +0000 +Subject: Revert "crypto: pkcs7 - remove sha1 support" + +This reverts commit 16ab7cb5825fc3425c16ad2c6e53d827f382d7c6. + +The original commit breaks the build as BoringSSL still only supports +SHA1, which the commit removed support for when signing kernel modules. +Until BoringSSL is fixed, this needs to be reverted :( + +Bug: 316589225 +Change-Id: I6a3de48b549779a26280f4e30a487dd6437d8a73 +Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> +--- + crypto/asymmetric_keys/mscode_parser.c | 3 + + crypto/asymmetric_keys/pkcs7_parser.c | 4 ++ + crypto/asymmetric_keys/public_key.c | 3 +- + crypto/asymmetric_keys/signature.c | 2 +- + crypto/asymmetric_keys/x509_cert_parser.c | 8 +++ + crypto/testmgr.h | 80 +++++++++++++++++++++++ + include/linux/oid_registry.h | 4 ++ + kernel/module/Kconfig | 5 ++ + 8 files changed, 107 insertions(+), 2 deletions(-) + +diff --git a/crypto/asymmetric_keys/mscode_parser.c b/crypto/asymmetric_keys/mscode_parser.c +--- a/crypto/asymmetric_keys/mscode_parser.c ++++ b/crypto/asymmetric_keys/mscode_parser.c +@@ -75,6 +75,9 @@ int mscode_note_digest_algo(void *context, size_t hdrlen, + + oid = look_up_OID(value, vlen); + switch (oid) { ++ case OID_sha1: ++ ctx->digest_algo = "sha1"; ++ break; + case OID_sha256: + ctx->digest_algo = "sha256"; + break; +diff --git a/crypto/asymmetric_keys/pkcs7_parser.c b/crypto/asymmetric_keys/pkcs7_parser.c +--- a/crypto/asymmetric_keys/pkcs7_parser.c ++++ b/crypto/asymmetric_keys/pkcs7_parser.c +@@ -227,6 +227,9 @@ int pkcs7_sig_note_digest_algo(void *context, size_t hdrlen, + struct pkcs7_parse_context *ctx = context; + + switch (ctx->last_oid) { ++ case OID_sha1: ++ ctx->sinfo->sig->hash_algo = "sha1"; ++ break; + case OID_sha256: + ctx->sinfo->sig->hash_algo = "sha256"; + break; +@@ -278,6 +281,7 @@ int pkcs7_sig_note_pkey_algo(void *context, size_t hdrlen, + ctx->sinfo->sig->pkey_algo = "rsa"; + ctx->sinfo->sig->encoding = "pkcs1"; + break; ++ case OID_id_ecdsa_with_sha1: + case OID_id_ecdsa_with_sha224: + case OID_id_ecdsa_with_sha256: + case OID_id_ecdsa_with_sha384: +diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c +--- a/crypto/asymmetric_keys/public_key.c ++++ b/crypto/asymmetric_keys/public_key.c +@@ -115,7 +115,8 @@ software_key_determine_akcipher(const struct public_key *pkey, + */ + if (!hash_algo) + return -EINVAL; +- if (strcmp(hash_algo, "sha224") != 0 && ++ if (strcmp(hash_algo, "sha1") != 0 && ++ strcmp(hash_algo, "sha224") != 0 && + strcmp(hash_algo, "sha256") != 0 && + strcmp(hash_algo, "sha384") != 0 && + strcmp(hash_algo, "sha512") != 0 && +diff --git a/crypto/asymmetric_keys/signature.c b/crypto/asymmetric_keys/signature.c +--- a/crypto/asymmetric_keys/signature.c ++++ b/crypto/asymmetric_keys/signature.c +@@ -115,7 +115,7 @@ EXPORT_SYMBOL_GPL(decrypt_blob); + * Sign the specified data blob using the private key specified by params->key. + * The signature is wrapped in an encoding if params->encoding is specified + * (eg. "pkcs1"). If the encoding needs to know the digest type, this can be +- * passed through params->hash_algo (eg. "sha512"). ++ * passed through params->hash_algo (eg. "sha1"). + * + * Returns the length of the data placed in the signature buffer or an error. + */ +diff --git a/crypto/asymmetric_keys/x509_cert_parser.c b/crypto/asymmetric_keys/x509_cert_parser.c +--- a/crypto/asymmetric_keys/x509_cert_parser.c ++++ b/crypto/asymmetric_keys/x509_cert_parser.c +@@ -198,6 +198,10 @@ int x509_note_sig_algo(void *context, size_t hdrlen, unsigned char tag, + default: + return -ENOPKG; /* Unsupported combination */ + ++ case OID_sha1WithRSAEncryption: ++ ctx->cert->sig->hash_algo = "sha1"; ++ goto rsa_pkcs1; ++ + case OID_sha256WithRSAEncryption: + ctx->cert->sig->hash_algo = "sha256"; + goto rsa_pkcs1; +@@ -226,6 +230,10 @@ int x509_note_sig_algo(void *context, size_t hdrlen, unsigned char tag, + ctx->cert->sig->hash_algo = "sha3-512"; + goto rsa_pkcs1; + ++ case OID_id_ecdsa_with_sha1: ++ ctx->cert->sig->hash_algo = "sha1"; ++ goto ecdsa; ++ + case OID_id_ecdsa_with_sha224: + ctx->cert->sig->hash_algo = "sha224"; + goto ecdsa; +diff --git a/crypto/testmgr.h b/crypto/testmgr.h +--- a/crypto/testmgr.h ++++ b/crypto/testmgr.h +@@ -653,6 +653,30 @@ static const struct akcipher_testvec rsa_tv_template[] = { + static const struct akcipher_testvec ecdsa_nist_p192_tv_template[] = { + { + .key = ++ "\x04\xf7\x46\xf8\x2f\x15\xf6\x22\x8e\xd7\x57\x4f\xcc\xe7\xbb\xc1" ++ "\xd4\x09\x73\xcf\xea\xd0\x15\x07\x3d\xa5\x8a\x8a\x95\x43\xe4\x68" ++ "\xea\xc6\x25\xc1\xc1\x01\x25\x4c\x7e\xc3\x3c\xa6\x04\x0a\xe7\x08" ++ "\x98", ++ .key_len = 49, ++ .params = ++ "\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" ++ "\xce\x3d\x03\x01\x01", ++ .param_len = 21, ++ .m = ++ "\xcd\xb9\xd2\x1c\xb7\x6f\xcd\x44\xb3\xfd\x63\xea\xa3\x66\x7f\xae" ++ "\x63\x85\xe7\x82", ++ .m_size = 20, ++ .algo = OID_id_ecdsa_with_sha1, ++ .c = ++ "\x30\x35\x02\x19\x00\xba\xe5\x93\x83\x6e\xb6\x3b\x63\xa0\x27\x91" ++ "\xc6\xf6\x7f\xc3\x09\xad\x59\xad\x88\x27\xd6\x92\x6b\x02\x18\x10" ++ "\x68\x01\x9d\xba\xce\x83\x08\xef\x95\x52\x7b\xa0\x0f\xe4\x18\x86" ++ "\x80\x6f\xa5\x79\x77\xda\xd0", ++ .c_size = 55, ++ .public_key_vec = true, ++ .siggen_sigver_test = true, ++ }, { ++ .key = + "\x04\xb6\x4b\xb1\xd1\xac\xba\x24\x8f\x65\xb2\x60\x00\x90\xbf\xbd" + "\x78\x05\x73\xe9\x79\x1d\x6f\x7c\x0b\xd2\xc3\x93\xa7\x28\xe1\x75" + "\xf7\xd5\x95\x1d\x28\x10\xc0\x75\x50\x5c\x1a\x4f\x3f\x8f\xa5\xee" +@@ -756,6 +780,32 @@ static const struct akcipher_testvec ecdsa_nist_p192_tv_template[] = { + static const struct akcipher_testvec ecdsa_nist_p256_tv_template[] = { + { + .key = ++ "\x04\xb9\x7b\xbb\xd7\x17\x64\xd2\x7e\xfc\x81\x5d\x87\x06\x83\x41" ++ "\x22\xd6\x9a\xaa\x87\x17\xec\x4f\x63\x55\x2f\x94\xba\xdd\x83\xe9" ++ "\x34\x4b\xf3\xe9\x91\x13\x50\xb6\xcb\xca\x62\x08\xe7\x3b\x09\xdc" ++ "\xc3\x63\x4b\x2d\xb9\x73\x53\xe4\x45\xe6\x7c\xad\xe7\x6b\xb0\xe8" ++ "\xaf", ++ .key_len = 65, ++ .params = ++ "\x30\x13\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x08\x2a\x86\x48" ++ "\xce\x3d\x03\x01\x07", ++ .param_len = 21, ++ .m = ++ "\xc2\x2b\x5f\x91\x78\x34\x26\x09\x42\x8d\x6f\x51\xb2\xc5\xaf\x4c" ++ "\x0b\xde\x6a\x42", ++ .m_size = 20, ++ .algo = OID_id_ecdsa_with_sha1, ++ .c = ++ "\x30\x46\x02\x21\x00\xf9\x25\xce\x9f\x3a\xa6\x35\x81\xcf\xd4\xe7" ++ "\xb7\xf0\x82\x56\x41\xf7\xd4\xad\x8d\x94\x5a\x69\x89\xee\xca\x6a" ++ "\x52\x0e\x48\x4d\xcc\x02\x21\x00\xd7\xe4\xef\x52\x66\xd3\x5b\x9d" ++ "\x8a\xfa\x54\x93\x29\xa7\x70\x86\xf1\x03\x03\xf3\x3b\xe2\x73\xf7" ++ "\xfb\x9d\x8b\xde\xd4\x8d\x6f\xad", ++ .c_size = 72, ++ .public_key_vec = true, ++ .siggen_sigver_test = true, ++ }, { ++ .key = + "\x04\x8b\x6d\xc0\x33\x8e\x2d\x8b\x67\xf5\xeb\xc4\x7f\xa0\xf5\xd9" + "\x7b\x03\xa5\x78\x9a\xb5\xea\x14\xe4\x23\xd0\xaf\xd7\x0e\x2e\xa0" + "\xc9\x8b\xdb\x95\xf8\xb3\xaf\xac\x00\x2c\x2c\x1f\x7a\xfd\x95\x88" +@@ -866,6 +916,36 @@ static const struct akcipher_testvec ecdsa_nist_p256_tv_template[] = { + + static const struct akcipher_testvec ecdsa_nist_p384_tv_template[] = { + { ++ .key = /* secp384r1(sha1) */ ++ "\x04\x89\x25\xf3\x97\x88\xcb\xb0\x78\xc5\x72\x9a\x14\x6e\x7a\xb1" ++ "\x5a\xa5\x24\xf1\x95\x06\x9e\x28\xfb\xc4\xb9\xbe\x5a\x0d\xd9\x9f" ++ "\xf3\xd1\x4d\x2d\x07\x99\xbd\xda\xa7\x66\xec\xbb\xea\xba\x79\x42" ++ "\xc9\x34\x89\x6a\xe7\x0b\xc3\xf2\xfe\x32\x30\xbe\xba\xf9\xdf\x7e" ++ "\x4b\x6a\x07\x8e\x26\x66\x3f\x1d\xec\xa2\x57\x91\x51\xdd\x17\x0e" ++ "\x0b\x25\xd6\x80\x5c\x3b\xe6\x1a\x98\x48\x91\x45\x7a\x73\xb0\xc3" ++ "\xf1", ++ .key_len = 97, ++ .params = ++ "\x30\x10\x06\x07\x2a\x86\x48\xce\x3d\x02\x01\x06\x05\x2b\x81\x04" ++ "\x00\x22", ++ .param_len = 18, ++ .m = ++ "\x12\x55\x28\xf0\x77\xd5\xb6\x21\x71\x32\x48\xcd\x28\xa8\x25\x22" ++ "\x3a\x69\xc1\x93", ++ .m_size = 20, ++ .algo = OID_id_ecdsa_with_sha1, ++ .c = ++ "\x30\x66\x02\x31\x00\xf5\x0f\x24\x4c\x07\x93\x6f\x21\x57\x55\x07" ++ "\x20\x43\x30\xde\xa0\x8d\x26\x8e\xae\x63\x3f\xbc\x20\x3a\xc6\xf1" ++ "\x32\x3c\xce\x70\x2b\x78\xf1\x4c\x26\xe6\x5b\x86\xcf\xec\x7c\x7e" ++ "\xd0\x87\xd7\xd7\x6e\x02\x31\x00\xcd\xbb\x7e\x81\x5d\x8f\x63\xc0" ++ "\x5f\x63\xb1\xbe\x5e\x4c\x0e\xa1\xdf\x28\x8c\x1b\xfa\xf9\x95\x88" ++ "\x74\xa0\x0f\xbf\xaf\xc3\x36\x76\x4a\xa1\x59\xf1\x1c\xa4\x58\x26" ++ "\x79\x12\x2a\xb7\xc5\x15\x92\xc5", ++ .c_size = 104, ++ .public_key_vec = true, ++ .siggen_sigver_test = true, ++ }, { + .key = /* secp384r1(sha224) */ + "\x04\x69\x6c\xcf\x62\xee\xd0\x0d\xe5\xb5\x2f\x70\x54\xcf\x26\xa0" + "\xd9\x98\x8d\x92\x2a\xab\x9b\x11\xcb\x48\x18\xa1\xa9\x0d\xd5\x18" +diff --git a/include/linux/oid_registry.h b/include/linux/oid_registry.h +--- a/include/linux/oid_registry.h ++++ b/include/linux/oid_registry.h +@@ -17,10 +17,12 @@ + * build_OID_registry.pl to generate the data for look_up_OID(). + */ + enum OID { ++ OID_id_dsa_with_sha1, /* 1.2.840.10030.4.3 */ + OID_id_dsa, /* 1.2.840.10040.4.1 */ + OID_id_ecPublicKey, /* 1.2.840.10045.2.1 */ + OID_id_prime192v1, /* 1.2.840.10045.3.1.1 */ + OID_id_prime256v1, /* 1.2.840.10045.3.1.7 */ ++ OID_id_ecdsa_with_sha1, /* 1.2.840.10045.4.1 */ + OID_id_ecdsa_with_sha224, /* 1.2.840.10045.4.3.1 */ + OID_id_ecdsa_with_sha256, /* 1.2.840.10045.4.3.2 */ + OID_id_ecdsa_with_sha384, /* 1.2.840.10045.4.3.3 */ +@@ -28,6 +30,7 @@ enum OID { + + /* PKCS#1 {iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1)} */ + OID_rsaEncryption, /* 1.2.840.113549.1.1.1 */ ++ OID_sha1WithRSAEncryption, /* 1.2.840.113549.1.1.5 */ + OID_sha256WithRSAEncryption, /* 1.2.840.113549.1.1.11 */ + OID_sha384WithRSAEncryption, /* 1.2.840.113549.1.1.12 */ + OID_sha512WithRSAEncryption, /* 1.2.840.113549.1.1.13 */ +@@ -64,6 +67,7 @@ enum OID { + OID_PKU2U, /* 1.3.5.1.5.2.7 */ + OID_Scram, /* 1.3.6.1.5.5.14 */ + OID_certAuthInfoAccess, /* 1.3.6.1.5.5.7.1.1 */ ++ OID_sha1, /* 1.3.14.3.2.26 */ + OID_id_ansip384r1, /* 1.3.132.0.34 */ + OID_sha256, /* 2.16.840.1.101.3.4.2.1 */ + OID_sha384, /* 2.16.840.1.101.3.4.2.2 */ +diff --git a/kernel/module/Kconfig b/kernel/module/Kconfig +--- a/kernel/module/Kconfig ++++ b/kernel/module/Kconfig +@@ -236,6 +236,10 @@ choice + possible to load a signed module containing the algorithm to check + the signature on that module. + ++config MODULE_SIG_SHA1 ++ bool "Sign modules with SHA-1" ++ select CRYPTO_SHA1 ++ + config MODULE_SIG_SHA256 + bool "Sign modules with SHA-256" + select CRYPTO_SHA256 +@@ -265,6 +269,7 @@ endchoice + config MODULE_SIG_HASH + string + depends on MODULE_SIG || IMA_APPRAISE_MODSIG ++ default "sha1" if MODULE_SIG_SHA1 + default "sha256" if MODULE_SIG_SHA256 + default "sha384" if MODULE_SIG_SHA384 + default "sha512" if MODULE_SIG_SHA512 diff --git a/android-mainline/Revert-sched-core-Prevent-race-condition-between-cpuset-and-__sched_setscheduler.patch b/android-mainline/Revert-sched-core-Prevent-race-condition-between-cpuset-and-__sched_setscheduler.patch index 2856ea31..37e25de6 100644 --- a/android-mainline/Revert-sched-core-Prevent-race-condition-between-cpuset-and-__sched_setscheduler.patch +++ b/android-mainline/Revert-sched-core-Prevent-race-condition-between-cpuset-and-__sched_setscheduler.patch @@ -605,7 +605,7 @@ diff --git a/kernel/sched/core.c b/kernel/sched/core.c +EXPORT_SYMBOL_GPL(task_groups); /* Cacheline aligned slab cache for task_group */ - static struct kmem_cache *task_group_cache __read_mostly; + static struct kmem_cache *task_group_cache __ro_after_init; @@ -10148,6 +10267,8 @@ void __might_resched(const char *file, int line, unsigned int offsets) print_preempt_disable_ip(offsets & MIGHT_RESCHED_PREEMPT_MASK, preempt_disable_ip); diff --git a/android-mainline/Revert-staging-remove-ashmem.patch b/android-mainline/Revert-staging-remove-ashmem.patch index c6ee47c0..105b31b1 100644 --- a/android-mainline/Revert-staging-remove-ashmem.patch +++ b/android-mainline/Revert-staging-remove-ashmem.patch @@ -11,15 +11,15 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ie0a443d55e6e72df97c3d3eabb7358ae3a12548a Signed-off-by: Lee Jones <joneslee@google.com> --- - drivers/staging/Kconfig | 2 + - drivers/staging/Makefile | 1 + - drivers/staging/android/Kconfig | 15 + - drivers/staging/android/Makefile | 4 + - drivers/staging/android/TODO | 8 + - drivers/staging/android/ashmem.c | 991 ++++++++++++++++++++++++++ - drivers/staging/android/ashmem.h | 24 + - drivers/staging/android/uapi/ashmem.h | 44 ++ - 8 files changed, 1089 insertions(+) + drivers/staging/Kconfig | 2 + + drivers/staging/Makefile | 1 + + drivers/staging/android/Kconfig | 15 + + drivers/staging/android/Makefile | 4 + + drivers/staging/android/TODO | 8 + + drivers/staging/android/ashmem.c | 1002 +++++++++++++++++++++++++ + drivers/staging/android/ashmem.h | 24 + + drivers/staging/android/uapi/ashmem.h | 44 ++ + 8 files changed, 1100 insertions(+) create mode 100644 drivers/staging/android/Kconfig create mode 100644 drivers/staging/android/Makefile create mode 100644 drivers/staging/android/TODO @@ -30,7 +30,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig -@@ -54,6 +54,8 @@ source "drivers/staging/nvec/Kconfig" +@@ -52,6 +52,8 @@ source "drivers/staging/nvec/Kconfig" source "drivers/staging/media/Kconfig" @@ -42,7 +42,7 @@ diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile -@@ -17,6 +17,7 @@ obj-$(CONFIG_IIO) += iio/ +@@ -16,6 +16,7 @@ obj-$(CONFIG_IIO) += iio/ obj-$(CONFIG_FB_SM750) += sm750fb/ obj-$(CONFIG_USB_EMXX) += emxx_udc/ obj-$(CONFIG_MFD_NVEC) += nvec/ @@ -96,7 +96,7 @@ diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c new file mode 100644 --- /dev/null +++ b/drivers/staging/android/ashmem.c -@@ -0,0 +1,991 @@ +@@ -0,0 +1,1002 @@ +// SPDX-License-Identifier: GPL-2.0 +/* mm/ashmem.c + * @@ -626,15 +626,26 @@ new file mode 100644 + return lru_count; +} + -+static struct shrinker ashmem_shrinker = { -+ .count_objects = ashmem_shrink_count, -+ .scan_objects = ashmem_shrink_scan, ++static struct shrinker *ashmem_shrinker; ++ ++static int __init ashmem_init_shrinker(void) ++{ ++ ashmem_shrinker = shrinker_alloc(0, "android-ashmem"); ++ if (!ashmem_shrinker) ++ return -ENOMEM; ++ ++ ashmem_shrinker->count_objects = ashmem_shrink_count; ++ ashmem_shrinker->scan_objects = ashmem_shrink_scan; + /* + * XXX (dchinner): I wish people would comment on why they need on + * significant changes to the default value here + */ -+ .seeks = DEFAULT_SEEKS * 4, -+}; ++ ashmem_shrinker->seeks = DEFAULT_SEEKS * 4; ++ ++ shrinker_register(ashmem_shrinker); ++ ++ return 0; ++} + +static int set_prot_mask(struct ashmem_area *asma, unsigned long prot) +{ @@ -959,8 +970,8 @@ new file mode 100644 + .gfp_mask = GFP_KERNEL, + .nr_to_scan = LONG_MAX, + }; -+ ret = ashmem_shrink_count(&ashmem_shrinker, &sc); -+ ashmem_shrink_scan(&ashmem_shrinker, &sc); ++ ret = ashmem_shrink_count(ashmem_shrinker, &sc); ++ ashmem_shrink_scan(ashmem_shrinker, &sc); + } + break; + case ASHMEM_GET_FILE_ID: @@ -1068,7 +1079,7 @@ new file mode 100644 + goto out_free2; + } + -+ ret = register_shrinker(&ashmem_shrinker, "android-ashmem"); ++ ret = ashmem_init_shrinker(); + if (ret) { + pr_err("failed to register shrinker!\n"); + goto out_demisc; diff --git a/android-mainline/Revert-usb-typec-tcpm-fix-cc-role-at-port-reset-2.patch b/android-mainline/Revert-usb-typec-tcpm-fix-cc-role-at-port-reset-2.patch new file mode 100644 index 00000000..585525f0 --- /dev/null +++ b/android-mainline/Revert-usb-typec-tcpm-fix-cc-role-at-port-reset-2.patch @@ -0,0 +1,38 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman <gregkh@google.com> +Date: Wed, 3 Jan 2024 16:03:29 +0000 +Subject: Revert "usb: typec: tcpm: fix cc role at port reset" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 1e35f074399dece73d5df11847d4a0d7a6f49434. + +Seems to break Pixel 6 testing so revert for now. Will need to come +back later. + +Bug: 298207935 +Reported-by: André Draszik <draszik@google.com> +Change-Id: I8fec8b7ae1b508b963c3bc78ae9308e791a2ef66 +Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> +(cherry picked from commit 49836fa33188dd4cdabe1df3dfb1ff589c0a3d9b) +[ta: the change was removed in commit 5032efbbcf31 ("ANDROID: bring back +typec charger changes."), add it again.] +Signed-off-by: Tudor Ambarus <tudordana@google.com> +--- + drivers/usb/typec/tcpm/tcpm.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c +--- a/drivers/usb/typec/tcpm/tcpm.c ++++ b/drivers/usb/typec/tcpm/tcpm.c +@@ -4862,8 +4862,7 @@ static void run_state_machine(struct tcpm_port *port) + break; + case PORT_RESET: + tcpm_reset_port(port); +- tcpm_set_cc(port, tcpm_default_state(port) == SNK_UNATTACHED ? +- TYPEC_CC_RD : tcpm_rp_cc(port)); ++ tcpm_set_cc(port, TYPEC_CC_OPEN); + tcpm_set_state(port, PORT_RESET_WAIT_OFF, + PD_T_ERROR_RECOVERY); + break; diff --git a/android-mainline/Revert-usb-typec-tcpm-fix-cc-role-at-port-reset.patch b/android-mainline/Revert-usb-typec-tcpm-fix-cc-role-at-port-reset.patch index b2e30146..34d9b04e 100644 --- a/android-mainline/Revert-usb-typec-tcpm-fix-cc-role-at-port-reset.patch +++ b/android-mainline/Revert-usb-typec-tcpm-fix-cc-role-at-port-reset.patch @@ -22,7 +22,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c -@@ -4856,8 +4856,7 @@ static void run_state_machine(struct tcpm_port *port) +@@ -4862,8 +4862,7 @@ static void run_state_machine(struct tcpm_port *port) break; case PORT_RESET: tcpm_reset_port(port); diff --git a/android-mainline/TODO-LEE-ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch b/android-mainline/TODO-LEE-ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch new file mode 100644 index 00000000..834a85ae --- /dev/null +++ b/android-mainline/TODO-LEE-ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch @@ -0,0 +1,49 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Andr=C3=A9=20Draszik?= <draszik@google.com> +Date: Wed, 25 Oct 2023 14:26:51 +0100 +Subject: TODO: LEE: ANDROID: Revert "usb: typec: tcpm: not sink vbus if + operational current is 0mA" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 803b1c8a0cea58cccde16eba31d285956f4c920c. + +Prevents Pixel from charging. Revert while we investigate the issue. + +[CPNOTE: 24/01/29] Lee: Greg reverted some of this, but leaves some diff + +Test: adb shell cat /sys/class/power_supply/battery/status +Bug: 307718635 +Change-Id: I9e8c6c62aac25cf41ac37c1d6bda696d8ecaf4aa +Signed-off-by: André Draszik <draszik@google.com> + +ANDROID: bring back typec charger changes. + +This file was originally touched to revert an upstream change that broke +the Pixel from charging, but it has now been resolved properly upstream +and the real fix will come in through the USB tree correctly. Revert +the out-of-tree changes to allow the merge to happen properly. + +Bug: 307718635 +Bug: 298207935 +Cc: André Draszik <draszik@google.com> +Change-Id: Icaba3965ad54d2eecf5a851520613b35770dccee +Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> +--- + drivers/usb/typec/tcpm/tcpm.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c +--- a/drivers/usb/typec/tcpm/tcpm.c ++++ b/drivers/usb/typec/tcpm/tcpm.c +@@ -4862,7 +4862,8 @@ static void run_state_machine(struct tcpm_port *port) + break; + case PORT_RESET: + tcpm_reset_port(port); +- tcpm_set_cc(port, TYPEC_CC_OPEN); ++ tcpm_set_cc(port, tcpm_default_state(port) == SNK_UNATTACHED ? ++ TYPEC_CC_RD : tcpm_rp_cc(port)); + tcpm_set_state(port, PORT_RESET_WAIT_OFF, + PD_T_ERROR_RECOVERY); + break; diff --git a/android-mainline/_____ANNOTATION-Android-exports_____.patch b/android-mainline/_____ANNOTATION-Android-exports_____.patch index 37cb5569..04cf132d 100644 --- a/android-mainline/_____ANNOTATION-Android-exports_____.patch +++ b/android-mainline/_____ANNOTATION-Android-exports_____.patch @@ -13,7 +13,7 @@ Signed-off-by: Lee Jones <joneslee@google.com> diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -23,3 +23,4 @@ Incremental filesystem +@@ -22,3 +22,4 @@ Incremental filesystem networking changes hardware-wrapped key support Android vendor hooks diff --git a/android-mainline/_____ANNOTATION-Android-kconfigs-and-build-scripts_____.patch b/android-mainline/_____ANNOTATION-Android-kconfigs-and-build-scripts_____.patch index 9d32409a..159ab542 100644 --- a/android-mainline/_____ANNOTATION-Android-kconfigs-and-build-scripts_____.patch +++ b/android-mainline/_____ANNOTATION-Android-kconfigs-and-build-scripts_____.patch @@ -17,7 +17,7 @@ Change-Id: I088def2072fa0e3e1c579610bc7c9d97d52fb06e diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -24,3 +24,4 @@ networking changes +@@ -23,3 +23,4 @@ networking changes hardware-wrapped key support Android vendor hooks Android exports diff --git a/android-mainline/_____ANNOTATION-Android-vendor-hooks_____.patch b/android-mainline/_____ANNOTATION-Android-vendor-hooks_____.patch index a07162d5..472731f5 100644 --- a/android-mainline/_____ANNOTATION-Android-vendor-hooks_____.patch +++ b/android-mainline/_____ANNOTATION-Android-vendor-hooks_____.patch @@ -13,7 +13,7 @@ Change-Id: I8ffacc5d3e8b7181bb78b0c10ecd0a7baf4d4e33 diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -22,3 +22,4 @@ filesystem changes +@@ -21,3 +21,4 @@ filesystem changes Incremental filesystem networking changes hardware-wrapped key support diff --git a/android-mainline/_____ANNOTATION-Incremental-filesystem_____.patch b/android-mainline/_____ANNOTATION-Incremental-filesystem_____.patch index a491d313..c8096dbf 100644 --- a/android-mainline/_____ANNOTATION-Incremental-filesystem_____.patch +++ b/android-mainline/_____ANNOTATION-Incremental-filesystem_____.patch @@ -13,7 +13,7 @@ Change-Id: I7d0fa7bc25a9fa37fe7f5f7d201f4af2c5028db8 diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -19,3 +19,4 @@ UFS driver changes +@@ -18,3 +18,4 @@ UFS driver changes block changes device-mapper changes filesystem changes diff --git a/android-mainline/_____ANNOTATION-UFS-driver-changes_____.patch b/android-mainline/_____ANNOTATION-UFS-driver-changes_____.patch index 74df2b14..5e3ebd7c 100644 --- a/android-mainline/_____ANNOTATION-UFS-driver-changes_____.patch +++ b/android-mainline/_____ANNOTATION-UFS-driver-changes_____.patch @@ -13,8 +13,8 @@ Change-Id: I1fc1f4ff872e675ffff63e0936577e128b7c43cd diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -15,3 +15,4 @@ tty changes - USB changes +@@ -14,3 +14,4 @@ driver framework and misc driver changes + tty changes graphics changes sound changes +UFS driver changes diff --git a/android-mainline/_____ANNOTATION-USB-changes_____.patch b/android-mainline/_____ANNOTATION-USB-changes_____.patch deleted file mode 100644 index 4c8beedb..00000000 --- a/android-mainline/_____ANNOTATION-USB-changes_____.patch +++ /dev/null @@ -1,20 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Eric Biggers <ebiggers@google.com> -Date: Wed, 12 Aug 2020 14:01:11 -0700 -Subject: _____ANNOTATION: USB changes_____ - -Signed-off-by: Eric Biggers <ebiggers@google.com> -Signed-off-by: Lee Jones <joneslee@google.com> -Change-Id: I06aaa4d0ca2e908de0bb039c1db4c7ef9781bd17 ---- - ANNOTATIONS | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/ANNOTATIONS b/ANNOTATIONS ---- a/ANNOTATIONS -+++ b/ANNOTATIONS -@@ -12,3 +12,4 @@ security changes - dma-buf changes - driver framework and misc driver changes - tty changes -+USB changes diff --git a/android-mainline/_____ANNOTATION-block-changes_____.patch b/android-mainline/_____ANNOTATION-block-changes_____.patch index 2ca19aa2..ec7470e0 100644 --- a/android-mainline/_____ANNOTATION-block-changes_____.patch +++ b/android-mainline/_____ANNOTATION-block-changes_____.patch @@ -13,7 +13,7 @@ Change-Id: I45c6df281e977b9024a9281933a30f1797104acf diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -16,3 +16,4 @@ USB changes +@@ -15,3 +15,4 @@ tty changes graphics changes sound changes UFS driver changes diff --git a/android-mainline/_____ANNOTATION-device-mapper-changes_____.patch b/android-mainline/_____ANNOTATION-device-mapper-changes_____.patch index 3deb8e6e..eb1a900a 100644 --- a/android-mainline/_____ANNOTATION-device-mapper-changes_____.patch +++ b/android-mainline/_____ANNOTATION-device-mapper-changes_____.patch @@ -13,7 +13,7 @@ Change-Id: Id05f5bf633ffbf96ae501fc1e9e39fb4dc9254cc diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -17,3 +17,4 @@ graphics changes +@@ -16,3 +16,4 @@ graphics changes sound changes UFS driver changes block changes diff --git a/android-mainline/_____ANNOTATION-filesystem-changes_____.patch b/android-mainline/_____ANNOTATION-filesystem-changes_____.patch index 40e60bc8..3989de79 100644 --- a/android-mainline/_____ANNOTATION-filesystem-changes_____.patch +++ b/android-mainline/_____ANNOTATION-filesystem-changes_____.patch @@ -13,7 +13,7 @@ Change-Id: If92180a090a8dac2e15ac12dc5e9f4ef466e01da diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -18,3 +18,4 @@ sound changes +@@ -17,3 +17,4 @@ sound changes UFS driver changes block changes device-mapper changes diff --git a/android-mainline/_____ANNOTATION-graphics-changes_____.patch b/android-mainline/_____ANNOTATION-graphics-changes_____.patch index f9951c88..29b91f97 100644 --- a/android-mainline/_____ANNOTATION-graphics-changes_____.patch +++ b/android-mainline/_____ANNOTATION-graphics-changes_____.patch @@ -13,8 +13,8 @@ Change-Id: I48fefd7a2268f5db497468dae6b5e40ad43cf4f8 diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -13,3 +13,4 @@ dma-buf changes +@@ -12,3 +12,4 @@ security changes + dma-buf changes driver framework and misc driver changes tty changes - USB changes +graphics changes diff --git a/android-mainline/_____ANNOTATION-hardware-wrapped-key-support_____.patch b/android-mainline/_____ANNOTATION-hardware-wrapped-key-support_____.patch index b9d51d00..bd4307d7 100644 --- a/android-mainline/_____ANNOTATION-hardware-wrapped-key-support_____.patch +++ b/android-mainline/_____ANNOTATION-hardware-wrapped-key-support_____.patch @@ -13,7 +13,7 @@ Change-Id: I51b2d343fdf0352248c6dc10274210ab5eb48469 diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -21,3 +21,4 @@ device-mapper changes +@@ -20,3 +20,4 @@ device-mapper changes filesystem changes Incremental filesystem networking changes diff --git a/android-mainline/_____ANNOTATION-networking-changes_____.patch b/android-mainline/_____ANNOTATION-networking-changes_____.patch index 9eec63fc..eece369c 100644 --- a/android-mainline/_____ANNOTATION-networking-changes_____.patch +++ b/android-mainline/_____ANNOTATION-networking-changes_____.patch @@ -13,7 +13,7 @@ Change-Id: Ia2dbb0cebc79534362c205acb21f29bc47132c6f diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -20,3 +20,4 @@ block changes +@@ -19,3 +19,4 @@ block changes device-mapper changes filesystem changes Incremental filesystem diff --git a/android-mainline/_____ANNOTATION-remove-ANNOTATIONS-file_____.patch b/android-mainline/_____ANNOTATION-remove-ANNOTATIONS-file_____.patch index 599de97a..3a6eda71 100644 --- a/android-mainline/_____ANNOTATION-remove-ANNOTATIONS-file_____.patch +++ b/android-mainline/_____ANNOTATION-remove-ANNOTATIONS-file_____.patch @@ -10,15 +10,15 @@ Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Lee Jones <joneslee@google.com> Change-Id: Ifdec5a1ff60dd7280e1a997a750b1b82d5981c19 --- - ANNOTATIONS | 27 --------------------------- - 1 file changed, 27 deletions(-) + ANNOTATIONS | 26 -------------------------- + 1 file changed, 26 deletions(-) delete mode 100644 ANNOTATIONS diff --git a/ANNOTATIONS b/ANNOTATIONS deleted file mode 100644 --- a/ANNOTATIONS +++ /dev/null -@@ -1,27 +0,0 @@ +@@ -1,26 +0,0 @@ -pending upstream -binder changes -kbuild changes @@ -33,7 +33,6 @@ deleted file mode 100644 -dma-buf changes -driver framework and misc driver changes -tty changes --USB changes -graphics changes -sound changes -UFS driver changes diff --git a/android-mainline/_____ANNOTATION-sound-changes_____.patch b/android-mainline/_____ANNOTATION-sound-changes_____.patch index e516b5ff..fac1a6fe 100644 --- a/android-mainline/_____ANNOTATION-sound-changes_____.patch +++ b/android-mainline/_____ANNOTATION-sound-changes_____.patch @@ -13,8 +13,8 @@ Change-Id: I2839c2cff2f4bc618219c98009624102b5a1e2f1 diff --git a/ANNOTATIONS b/ANNOTATIONS --- a/ANNOTATIONS +++ b/ANNOTATIONS -@@ -14,3 +14,4 @@ driver framework and misc driver changes +@@ -13,3 +13,4 @@ dma-buf changes + driver framework and misc driver changes tty changes - USB changes graphics changes +sound changes diff --git a/android-mainline/series b/android-mainline/series index 6060f64a..83b0baa6 100644 --- a/android-mainline/series +++ b/android-mainline/series @@ -1,8 +1,8 @@ # # android-mainline patches # -# Applies onto upstream e9806ff8a0f9e Linux v6.6-10372-ge9806ff8a0f9e -# Matches android-mainline 3851c83bf23ba ("ANDROID: timers: Use original names for outputs of some timer binaries") +# Applies onto upstream 33cc938e65a98 Linux v6.7-rc4 +# Matches android-mainline c16f17d26433a ("Merge tag 'v6.7-rc4' into android-mainline") # Status: Tested # Revert-sched-core-Prevent-race-condition-between-cpuset-and-__sched_setscheduler.patch @@ -10,15 +10,17 @@ Revert-drm-virtio-fix-DRM_FORMAT_-handling.patch Revert-of-unittest-Disable-new-dtc-node_name_vs_property_name-and-interrupt_map-warnings.patch Revert-staging-remove-ashmem.patch Revert-usb-typec-tcpm-fix-cc-role-at-port-reset.patch +Revert-ALSA-hda-cirrus_scodec-Add-KUnit-test.patch ANDROID-Revert-perf-core-Use-static_call-to-optimize-perf_guest_info_callbacks.patch ANDROID-Revert-io_uring-remove-the-mode-variable-in-io_file_get_flags.patch ANDROID-Revert-io_uring-remove-__io_file_supports_nowait.patch ANDROID-Revert-io_uring-rely-solely-on-FMODE_NOWAIT.patch ANDROID-Revert-cpuidle-dt-Push-RCU-idle-into-driver.patch -ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch +TODO-LEE-ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch Revert-sched-debug-Remove-the-proc-sys-kernel-sched_child_runs_first-sysctl.patch +Revert-crypto-pkcs7-remove-sha1-support.patch +Revert-usb-typec-tcpm-fix-cc-role-at-port-reset-2.patch _____ANNOTATION-pending-upstream_____.patch -FROMLIST-fs-Generic-function-to-convert-iocb-to-rw-flags.patch UPSTREAM-fuse-fix-matching-of-FUSE_DEV_IOC_CLONE-command.patch FROMLIST-fuse-Definitions-and-ioctl-for-passthrough.patch FROMLIST-fuse-Passthrough-initialization-and-release.patch @@ -38,6 +40,8 @@ FROMLIST-fs-select-mark-do_select-noinline_for_stack.patch UPSTREAM-cpuidle-dt-Push-RCU-idle-into-driver.patch FROMLIST-kheaders-dereferences-the-source-tree.patch FROMLIST-Revert-fuse-Apply-flags2-only-when-userspace-set-the-FUSE_INIT_EXT.patch +ANDROID-fs-Move-iocb_to_rw_flags-to-fuse-passthrough.patch +FROMGIT-arch-mm-fault-fix-major-fault-accounting-when-retrying-under-per-VMA-lock.patch _____ANNOTATION-binder-changes_____.patch ONHOLD-ANDROID-binder-add-support-for-RT-prio-inheritance.patch ANDROID-binder-fold-common-setup-of-node_prio.patch @@ -53,7 +57,6 @@ ANDROID-modules-re-introduce-the-MODULE_SCMVERSION-config.patch NOUPSTREAM-ANDROID-Kbuild-Add-support-for-KBUILD_MIXED_TREE.patch ANDROID-GKI-Add-script-to-generate-symbol-protection-headers.patch _____ANNOTATION-riscv-changes_____.patch -ANDROID-RISC-V-Support-32_PCREL-relocation-type-in-kernel-module.patch _____ANNOTATION-core-kernel-changes_____.patch CHROMIUM-cgroups-relax-permissions-on-moving-tasks-between-cgroups.patch ANDROID-unconditionally-compile-sig_ok-in-struct-module.patch @@ -108,16 +111,10 @@ ANDROID-gpiolib-of-add-a-quirk-for-legacy-names-in-max77759_charger.patch _____ANNOTATION-tty-changes_____.patch ANDROID-tty-hvc_dcc-Add-parameter-to-enable-DCC.patch ANDROID-Add-more-hvc-devices-for-virtio-console.patch -_____ANNOTATION-USB-changes_____.patch -NOUPSTREAM-ANDROID-usb-gadget-configfs-Add-Uevent-to-notify-userspace.patch -NOUPSTREAM-ANDROID-usb-gadget-f_accessory-Add-Android-Accessory-function.patch -NOUPSTREAM-ANDROID-usb-gadget-f_midi-create-F_midi-device.patch -NOUPSTREAM-ANDROID-usb-gadget-f_audio_source-New-gadget-driver-for-audio-output.patch _____ANNOTATION-graphics-changes_____.patch ANDROID-Allow-DRM_IOCTL_MODE_-_DUMB-for-render-clients.patch NOUPSTREAM-ANDROID-include-drm-increase-DRM-max-property-count-to-64.patch _____ANNOTATION-sound-changes_____.patch -ANDROID-SoC-core-Introduce-macro-SOC_SINGLE_MULTI_EXT.patch _____ANNOTATION-UFS-driver-changes_____.patch ANDROID-scsi-ufs-allow-overriding-the-blk_crypto_profile.patch ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_BROKEN_CRYPTO_ENABLE.patch @@ -195,7 +192,6 @@ ANDROID-GKI-Android-KABI-and-Android-Vendor.patch ANDROID-GKI-enable-CONFIG_SUN4I_TIMER.patch ANDROID-GKI-Unhide-VIRTIO_DMA_SHARED_BUFFER.patch ANDROID-disble-the-UID_SYS_STATS-driver.patch -ANDROID-default-enable-VHOST_TASK.patch REVISIT-ANDROID-Revert-Revert-tty-serial-samsung_tty-build-it-for-any-platform.patch NOUPSTREAM-ANDROID-Re-enable-menus-hidden-by-disabling-MEDIA_SUPPORT_FILTER.patch NOUPSTREAM-ANDROID-init-GKI-add-GKI_HACKS_TO_FIX.patch @@ -217,3 +213,4 @@ NOUPSTREAM-ANDROID-gki_defconfigs.patch ANDROID-tools-Miscellaneous.patch _____ANNOTATION-remove-ANNOTATIONS-file_____.patch FIXME-dma-buf-Revert-this-diff-from-android-mainline.patch +FIXME-ovl-Leftover-from-Merge-tag-v6.7-into-android-mainline.patch |