summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com>2024-01-30 11:49:32 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-01-30 11:49:32 +0000
commit5de992082bdd145349c27a08b9f3cd790b0de472 (patch)
tree95eca457ce33ef495878f5b0e0ad9b8402aadfca
parent4348e70ef1627d02b4725969f0396ac4edf40038 (diff)
parent74cf2d4b4d963b7519a281d358d1453503bd00da (diff)
downloadcommon-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
-rw-r--r--android-mainline/ANDROID-Clang-LTO-Only-set-fvisibility-hidden-for-x86.patch2
-rw-r--r--android-mainline/ANDROID-GKI-Android-KABI-and-Android-Vendor.patch4
-rw-r--r--android-mainline/ANDROID-GKI-Disable-KUnit-built-in-testing.patch2
-rw-r--r--android-mainline/ANDROID-GKI-scripts-Makefile-update-the-lz4-command.patch2
-rw-r--r--android-mainline/ANDROID-Initial-commit-of-Incremental-FS.patch2
-rw-r--r--android-mainline/ANDROID-RISC-V-Support-32_PCREL-relocation-type-in-kernel-module.patch44
-rw-r--r--android-mainline/ANDROID-Revert-io_uring-rely-solely-on-FMODE_NOWAIT.patch4
-rw-r--r--android-mainline/ANDROID-Revert-io_uring-remove-__io_file_supports_nowait.patch4
-rw-r--r--android-mainline/ANDROID-Revert-io_uring-remove-the-mode-variable-in-io_file_get_flags.patch2
-rw-r--r--android-mainline/ANDROID-Revert-perf-core-Use-static_call-to-optimize-perf_guest_info_callbacks.patch6
-rw-r--r--android-mainline/ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch45
-rw-r--r--android-mainline/ANDROID-SoC-core-Introduce-macro-SOC_SINGLE_MULTI_EXT.patch103
-rw-r--r--android-mainline/ANDROID-cpufreq-track-per-task-time-in-state.patch8
-rw-r--r--android-mainline/ANDROID-default-enable-VHOST_TASK.patch27
-rw-r--r--android-mainline/ANDROID-dm-add-dm-default-key-target-for-metadata-encryption.patch2
-rw-r--r--android-mainline/ANDROID-fs-Move-iocb_to_rw_flags-to-fuse-passthrough.patch63
-rw-r--r--android-mainline/ANDROID-fs-fuse-Keep-FUSE-file-times-consistent-with-lower-file.patch8
-rw-r--r--android-mainline/ANDROID-fs-fuse-Use-extended-init-flags-for-FUSE_PASSTHROUGH.patch2
-rw-r--r--android-mainline/ANDROID-fuse-Add-support-for-d_canonical_path.patch4
-rw-r--r--android-mainline/ANDROID-iommu-Add-vendor-hook-for-iova-allocation-and-free-tracking.patch4
-rw-r--r--android-mainline/ANDROID-irqchip-Add-IRQChip-related-vendor-hooks.patch4
-rw-r--r--android-mainline/ANDROID-kbuild-add-support-for-compiling-external-device-trees.patch4
-rw-r--r--android-mainline/ANDROID-mm-Memory-health-driver.patch4
-rw-r--r--android-mainline/ANDROID-mm-cma-retry-allocations-in-cma_alloc.patch10
-rw-r--r--android-mainline/ANDROID-modules-re-introduce-the-MODULE_SCMVERSION-config.patch8
-rw-r--r--android-mainline/ANDROID-overlayfs-override_creds-off-option-bypass-creator_cred.patch148
-rw-r--r--android-mainline/ANDROID-riscv64-Enable-HAVE_EFFICIENT_UNALIGNED_ACCESS.patch2
-rw-r--r--android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_BROKEN_CRYPTO_ENABLE.patch2
-rw-r--r--android-mainline/ANDROID-scsi-ufs-add-UFSHCD_ANDROID_QUIRK_KEYS_IN_PRDT.patch4
-rw-r--r--android-mainline/ANDROID-scsi-ufs-allow-overriding-the-blk_crypto_profile.patch2
-rw-r--r--android-mainline/ANDROID-staging-add-debug-kinfo-driver.patch28
-rw-r--r--android-mainline/ANDROID-tools-Miscellaneous.patch86
-rw-r--r--android-mainline/ANDROID-tty-hvc_dcc-Add-parameter-to-enable-DCC.patch2
-rw-r--r--android-mainline/FIXME-ovl-Leftover-from-Merge-tag-v6.7-into-android-mainline.patch50
-rw-r--r--android-mainline/FIXME-ufs-Merge-error-relating-to-ufshcd_read_desc_param.patch2
-rw-r--r--android-mainline/FROMGIT-arch-mm-fault-fix-major-fault-accounting-when-retrying-under-per-VMA-lock.patch116
-rw-r--r--android-mainline/FROMLIST-Revert-fuse-Apply-flags2-only-when-userspace-set-the-FUSE_INIT_EXT.patch2
-rw-r--r--android-mainline/FROMLIST-fs-Generic-function-to-convert-iocb-to-rw-flags.patch96
-rw-r--r--android-mainline/FROMLIST-fuse-Definitions-and-ioctl-for-passthrough.patch4
-rw-r--r--android-mainline/FROMLIST-fuse-Passthrough-initialization-and-release.patch2
-rw-r--r--android-mainline/FROMLIST-fuse-give-wakeup-hints-to-the-scheduler.patch2
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-Add-vendor-hooks-to-the-scheduler.patch52
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-GKI-Don-t-compact-data-structures-when-CONFIG_ZSMALLOC-n.patch2
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-Kbuild-Add-support-for-KBUILD_MIXED_TREE.patch20
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-Kleaf-Bazel-based-GKI-kernel-build.patch285
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-arm64-ARM64-Exports.patch4
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-gki_defconfigs.patch40
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-init-GKI-add-GKI_HACKS_TO_FIX.patch2
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-kbuild-Add-support-for-installing-out-of-tree-kernel-headers.patch6
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-kbuild-Copy-out-of-tree-kernel-headers-to-INSTALL_HDR_PATH.patch2
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-kernel-Core-Kernel-Exports.patch28
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-kernel-Core-kernel-related-vendor-hooks.patch6
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Management-Exports.patch31
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-mm-Memory-Managment-related-vendor-hooks.patch8
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-net-xfrm-make-PF_KEY-SHA256-use-RFC-compliant-truncation.patch2
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-sched-Track-wake_q-length.patch2
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-sched-Unconditionally-honor-sync-flag-for-energy-aware-wakeups.patch6
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-UFS-Exports.patch20
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-scsi-SCSI-related-vendor-hooks.patch24
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-usb-gadget-configfs-Add-Uevent-to-notify-userspace.patch424
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_accessory-Add-Android-Accessory-function.patch1877
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_audio_source-New-gadget-driver-for-audio-output.patch1150
-rw-r--r--android-mainline/NOUPSTREAM-ANDROID-usb-gadget-f_midi-create-F_midi-device.patch117
-rw-r--r--android-mainline/Revert-ALSA-hda-cirrus_scodec-Add-KUnit-test.patch459
-rw-r--r--android-mainline/Revert-crypto-pkcs7-remove-sha1-support.patch267
-rw-r--r--android-mainline/Revert-sched-core-Prevent-race-condition-between-cpuset-and-__sched_setscheduler.patch2
-rw-r--r--android-mainline/Revert-staging-remove-ashmem.patch51
-rw-r--r--android-mainline/Revert-usb-typec-tcpm-fix-cc-role-at-port-reset-2.patch38
-rw-r--r--android-mainline/Revert-usb-typec-tcpm-fix-cc-role-at-port-reset.patch2
-rw-r--r--android-mainline/TODO-LEE-ANDROID-Revert-usb-typec-tcpm-not-sink-vbus-if-operational-current-is-0mA.patch49
-rw-r--r--android-mainline/_____ANNOTATION-Android-exports_____.patch2
-rw-r--r--android-mainline/_____ANNOTATION-Android-kconfigs-and-build-scripts_____.patch2
-rw-r--r--android-mainline/_____ANNOTATION-Android-vendor-hooks_____.patch2
-rw-r--r--android-mainline/_____ANNOTATION-Incremental-filesystem_____.patch2
-rw-r--r--android-mainline/_____ANNOTATION-UFS-driver-changes_____.patch4
-rw-r--r--android-mainline/_____ANNOTATION-USB-changes_____.patch20
-rw-r--r--android-mainline/_____ANNOTATION-block-changes_____.patch2
-rw-r--r--android-mainline/_____ANNOTATION-device-mapper-changes_____.patch2
-rw-r--r--android-mainline/_____ANNOTATION-filesystem-changes_____.patch2
-rw-r--r--android-mainline/_____ANNOTATION-graphics-changes_____.patch4
-rw-r--r--android-mainline/_____ANNOTATION-hardware-wrapped-key-support_____.patch2
-rw-r--r--android-mainline/_____ANNOTATION-networking-changes_____.patch2
-rw-r--r--android-mainline/_____ANNOTATION-remove-ANNOTATIONS-file_____.patch7
-rw-r--r--android-mainline/_____ANNOTATION-sound-changes_____.patch4
-rw-r--r--android-mainline/series21
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